@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,391 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse hook: turn the HARNESS approval prompt into the human acknowledgement
|
|
3
|
+
# of a generated operator script's production write (ADR-264).
|
|
4
|
+
#
|
|
5
|
+
# WHAT IT DOES. A staged operator script write is
|
|
6
|
+
# bash <script> --stage <name> --apply --plan-digest <d> [--rotate-token]
|
|
7
|
+
# When the agent issues exactly that, this hook (1) recognises the script by its
|
|
8
|
+
# CONTENT (the `SOLEUR-GENERATED-OPERATOR-SCRIPT v2` header line, never a
|
|
9
|
+
# basename), (2) mints a one-time receipt bound to the digest of THAT command on
|
|
10
|
+
# the human's machine, (3) rewrites the command to carry the receipt's nonce as an
|
|
11
|
+
# environment prefix immediately before `bash`, and (4) answers `ask`, so the
|
|
12
|
+
# harness shows the human the rewritten command plus the stage's plain-language
|
|
13
|
+
# impact and rollback and waits for their decision. The script recomputes the
|
|
14
|
+
# digest, finds the record, consumes it before its first write, and unsets the
|
|
15
|
+
# nonce before any child runs. See the "Approval receipts" section of plugins/soleur/scripts/lib/operator-script.sh for the record format.
|
|
16
|
+
#
|
|
17
|
+
# WHAT IT NEVER DOES (each is a mutation row of the hook suite):
|
|
18
|
+
# - execute the script it fingerprints. The v2 header is agent-writable, so
|
|
19
|
+
# running `--list` from here would hand the agent code execution outside its
|
|
20
|
+
# sandbox; the stage lines are read statically with grep.
|
|
21
|
+
# - mint for anything but ONE simple command: `[cd <dir> &&] bash <script> ...`
|
|
22
|
+
# with no pipe, `;`, trailing `&&`, redirect, substitution or glob. The human
|
|
23
|
+
# approves one exact string; a compound one would approve more than they read.
|
|
24
|
+
# - mint under bypassPermissions / dontAsk / auto, or when the permission mode is
|
|
25
|
+
# unknown. Interactive-vs-headless is decided by CLAUDE_CODE_ENTRYPOINT: `cli`,
|
|
26
|
+
# `claude-vscode`, `claude-desktop` and `claude-desktop-3p` are interactive
|
|
27
|
+
# (they show a prompt a person answers); `sdk-cli` and anything else is
|
|
28
|
+
# headless. ONLY `cli` and `sdk-cli` were measured (Claude Code 2.1.287,
|
|
29
|
+
# .claude/hooks/DEFER-DECISION-PAYLOAD-SHAPE.md "Operator stage approval"); the
|
|
30
|
+
# other three names are an allowlist taken on trust and recorded as unmeasured
|
|
31
|
+
# in ADR-264. An undeterminable mode emits `defer`, never allow.
|
|
32
|
+
# - mint on a headless invocation. It answers `defer` and the run waits; a person
|
|
33
|
+
# resumes the session interactively (`claude --resume`), the hook runs again
|
|
34
|
+
# under an interactive entrypoint, and the person is asked at the prompt. There
|
|
35
|
+
# is no environment variable, settings key or file that stands in for that
|
|
36
|
+
# answer (an earlier draft had a resume marker in the resumed process's
|
|
37
|
+
# environment; a settings-level `env` block can set it without a person, so it
|
|
38
|
+
# was removed).
|
|
39
|
+
# - let an input that already carries the nonce variable name through (deny), or
|
|
40
|
+
# let a Bash/Monitor command or a Write/Edit path touch the receipt
|
|
41
|
+
# directory (deny; reliable only for the path tools — string matching on a shell
|
|
42
|
+
# command is a speed bump, not a wall).
|
|
43
|
+
# - break an unrelated call. A call that is not a candidate returns at once with
|
|
44
|
+
# no jq dependency; only a candidate fails closed (a deny envelope) when jq is
|
|
45
|
+
# missing, so a missing jq on a founder machine cannot deny every Bash call.
|
|
46
|
+
#
|
|
47
|
+
# HONEST THRESHOLD: the receipt is a same-user file; this resists an agent that
|
|
48
|
+
# follows instructions, not one that deliberately forges a record (ADR-264).
|
|
49
|
+
#
|
|
50
|
+
# DECISION PRECEDENCE across hooks (measured on 2.1.287, ADR-264): deny > defer > ask
|
|
51
|
+
# > allow. This hook answers deny, defer or ask and never allow, so another hook's
|
|
52
|
+
# allow cannot turn a prompt into a silent run.
|
|
53
|
+
#
|
|
54
|
+
# ADR-162 AMENDMENT: this hook is the second named PreToolUse rewriter and, unlike
|
|
55
|
+
# the grep rewriter, emits a permission decision alongside updatedInput (`ask`) and
|
|
56
|
+
# FAILS CLOSED for a candidate. It never
|
|
57
|
+
# composes with another rewriter on the same call: the accepted command form is a
|
|
58
|
+
# single simple command, so grep-rewrite.sh's predicate does not match it.
|
|
59
|
+
|
|
60
|
+
set -uo pipefail
|
|
61
|
+
# No pathname expansion: the command text is split into words below and must never glob.
|
|
62
|
+
set -f
|
|
63
|
+
# Byte semantics: `${s:i:1}` is O(1) per character in the C locale and the tokenizer
|
|
64
|
+
# offsets (used to splice the nonce) are then byte offsets in both directions.
|
|
65
|
+
export LC_ALL=C
|
|
66
|
+
|
|
67
|
+
[[ "${SOLEUR_DISABLE_OPERATOR_STAGE_APPROVAL_HOOK:-0}" == "1" ]] && exit 0
|
|
68
|
+
|
|
69
|
+
HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
70
|
+
INPUT="$(cat)"
|
|
71
|
+
|
|
72
|
+
trace() {
|
|
73
|
+
[[ -n "${SOLEUR_OPERATOR_STAGE_APPROVAL_TRACE:-}" ]] || return 0
|
|
74
|
+
printf '%s\n' "$1" >> "$SOLEUR_OPERATOR_STAGE_APPROVAL_TRACE" 2>/dev/null || true
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# --- prefilter (R4): no jq, no parsing, nothing that can fail for a normal call ----
|
|
78
|
+
# The receipt directory, spelled exactly as soleur_approval_dir spells it (a test pins
|
|
79
|
+
# the two together): the path arm below must work without the library.
|
|
80
|
+
approvals_fragment="state/soleur/approvals"
|
|
81
|
+
APPROVALS_DIR="${XDG_STATE_HOME:-${HOME:-/nonexistent}/.local/state}/soleur/approvals"
|
|
82
|
+
candidate=0
|
|
83
|
+
case "$INPUT" in
|
|
84
|
+
*--apply*|*SOLEUR_APPROVAL_NONCE*|*"$approvals_fragment"*) candidate=1 ;;
|
|
85
|
+
esac
|
|
86
|
+
# The write path tools are checked on their CANONICALIZED path (a traversal or a symlink can
|
|
87
|
+
# spell the receipt directory without the fragment), so they are candidates whenever jq can
|
|
88
|
+
# parse them. A missing jq makes them a no-op here, never a deny: denying every Write on a
|
|
89
|
+
# machine without jq would brick the session, and the path arm is the lesser of the two risks.
|
|
90
|
+
# Read is not a candidate: a record is named sha256(nonce) and holds only a digest, a
|
|
91
|
+
# timestamp and a session id, so reading one yields nothing a forger needs.
|
|
92
|
+
if [[ "$INPUT" =~ \"tool_name\"[[:space:]]*:[[:space:]]*\"(Write|Edit|MultiEdit|NotebookEdit)\" ]]; then
|
|
93
|
+
if command -v jq >/dev/null 2>&1; then candidate=1; fi
|
|
94
|
+
fi
|
|
95
|
+
if [[ "$candidate" -eq 0 ]]; then
|
|
96
|
+
trace "ran verdict=noop reason=not-candidate"
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
emit_deny() { # <fixed reason> — no jq, no interpolation of agent-controlled text
|
|
101
|
+
trace "ran verdict=deny reason=$2"
|
|
102
|
+
printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"%s"}}\n' "$1"
|
|
103
|
+
exit 0
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
command -v jq >/dev/null 2>&1 || emit_deny "Soleur's operator-stage approval check needs jq and it is not installed, so this command was refused. Install jq and ask again." "no-jq"
|
|
107
|
+
|
|
108
|
+
# ONE jq call for the four scalar fields (none can hold a newline once sanitised).
|
|
109
|
+
JQ_OUT="$(printf '%s' "$INPUT" | jq -r '(.tool_name // ""), (.permission_mode // ""), (.session_id // "unknown"), (.cwd // "") | gsub("[\\n\\r]"; " ")' 2>/dev/null)" || JQ_OUT=""
|
|
110
|
+
# Split on newlines with parameter expansion (no fork, and no `read`: the prompt census
|
|
111
|
+
# in operator-script.test.sh Guard 4 treats every `read` under plugins/soleur as a prompt).
|
|
112
|
+
TOOL="${JQ_OUT%%$'\n'*}"; JQ_REST="${JQ_OUT#*$'\n'}"
|
|
113
|
+
MODE="${JQ_REST%%$'\n'*}"; JQ_REST="${JQ_REST#*$'\n'}"
|
|
114
|
+
SESSION="${JQ_REST%%$'\n'*}"; CWD_IN="${JQ_REST#*$'\n'}"
|
|
115
|
+
MODE="${MODE//[^A-Za-z]/}"
|
|
116
|
+
[[ -n "$SESSION" ]] || SESSION="unknown"
|
|
117
|
+
|
|
118
|
+
# canonical_path <path> — absolute, `..` and `.` collapsed, symlinks resolved when
|
|
119
|
+
# the target exists (the parent when it does not), so a traversal spelling of the
|
|
120
|
+
# receipt directory is still recognised.
|
|
121
|
+
canonical_path() {
|
|
122
|
+
local p="$1" d b
|
|
123
|
+
[[ "$p" == /* ]] || p="${CWD_IN:-$PWD}/${p}"
|
|
124
|
+
if readlink -m -- "$p" 2>/dev/null; then return 0; fi
|
|
125
|
+
d="$(cd "$(dirname "$p")" 2>/dev/null && pwd -P)" || { printf '%s' "$p"; return 0; }
|
|
126
|
+
b="$(basename "$p")"
|
|
127
|
+
printf '%s/%s' "$d" "$b"
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
under_approvals_dir() {
|
|
131
|
+
local c; c="$(canonical_path "$1")"
|
|
132
|
+
local root; root="$(canonical_path "$APPROVALS_DIR")"
|
|
133
|
+
[[ "$c" == "$root" || "$c" == "$root"/* ]]
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
case "$TOOL" in
|
|
137
|
+
Write|Edit|MultiEdit|NotebookEdit)
|
|
138
|
+
P="$(printf '%s' "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // .tool_input.notebook_path // ""' 2>/dev/null)" || P=""
|
|
139
|
+
if [[ -n "$P" ]] && under_approvals_dir "$P"; then
|
|
140
|
+
emit_deny "That path holds Soleur approval receipts, which only the approval prompt may create. Nothing was changed." "receipt-dir-path"
|
|
141
|
+
fi
|
|
142
|
+
trace "ran verdict=noop reason=path-not-receipt-dir"
|
|
143
|
+
exit 0
|
|
144
|
+
;;
|
|
145
|
+
Bash|Monitor) ;;
|
|
146
|
+
*) trace "ran verdict=noop reason=tool-not-handled"; exit 0 ;;
|
|
147
|
+
esac
|
|
148
|
+
|
|
149
|
+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null)" || COMMAND=""
|
|
150
|
+
|
|
151
|
+
# A nonce already present in what the agent submitted is never honoured: the nonce
|
|
152
|
+
# is bearer-only and enters a command through this hook and nowhere else.
|
|
153
|
+
case "$COMMAND" in
|
|
154
|
+
*SOLEUR_APPROVAL_NONCE*)
|
|
155
|
+
emit_deny "That command carries an approval token. Approval tokens are added by Soleur's approval prompt, never typed into a command. Nothing was changed." "nonce-in-input" ;;
|
|
156
|
+
esac
|
|
157
|
+
case "$COMMAND" in
|
|
158
|
+
*"$approvals_fragment"*|*"$APPROVALS_DIR"*)
|
|
159
|
+
emit_deny "That command touches Soleur's approval receipts, which only the approval prompt may create or read. Nothing was changed." "receipt-dir-command" ;;
|
|
160
|
+
esac
|
|
161
|
+
if [[ "$TOOL" == "Monitor" ]]; then
|
|
162
|
+
trace "ran verdict=noop reason=monitor-clean"
|
|
163
|
+
exit 0
|
|
164
|
+
fi
|
|
165
|
+
case "$COMMAND" in
|
|
166
|
+
*--apply*) ;;
|
|
167
|
+
*) trace "ran verdict=noop reason=no-apply"; exit 0 ;;
|
|
168
|
+
esac
|
|
169
|
+
|
|
170
|
+
# --- tokenizer for ONE simple command ---------------------------------------------
|
|
171
|
+
# Fills TOK[] (the words, quotes removed), TOKOFF[] (each word's byte offset in the
|
|
172
|
+
# original string) and TOKOP[] (1 for an unquoted `&&`). Returns 1 on any shell
|
|
173
|
+
# syntax beyond words, quotes and a standalone `&&`.
|
|
174
|
+
tokenize() {
|
|
175
|
+
local s="$1" i=0 n c cur="" intok=0 q="" start=0 prev
|
|
176
|
+
n=${#s}
|
|
177
|
+
TOK=(); TOKOFF=(); TOKOP=()
|
|
178
|
+
while (( i < n )); do
|
|
179
|
+
c="${s:i:1}"
|
|
180
|
+
if [[ -n "$q" ]]; then
|
|
181
|
+
if [[ "$c" == "$q" ]]; then
|
|
182
|
+
q=""
|
|
183
|
+
elif [[ "$q" == '"' && ( "$c" == '$' || "$c" == '`' || "$c" == '\' ) ]]; then
|
|
184
|
+
return 1
|
|
185
|
+
else
|
|
186
|
+
cur+="$c"
|
|
187
|
+
fi
|
|
188
|
+
else
|
|
189
|
+
case "$c" in
|
|
190
|
+
"'"|'"')
|
|
191
|
+
q="$c"
|
|
192
|
+
if (( ! intok )); then intok=1; start=$i; fi ;;
|
|
193
|
+
' '|$'\t')
|
|
194
|
+
if (( intok )); then
|
|
195
|
+
TOK[${#TOK[@]}]="$cur"; TOKOFF[${#TOKOFF[@]}]="$start"; TOKOP[${#TOKOP[@]}]=0
|
|
196
|
+
cur=""; intok=0
|
|
197
|
+
fi ;;
|
|
198
|
+
'&')
|
|
199
|
+
prev=""; (( i > 0 )) && prev="${s:i-1:1}"
|
|
200
|
+
[[ "${s:i+1:1}" == "&" && ( "${s:i+2:1}" == " " || -z "${s:i+2:1}" ) && ( $i -eq 0 || "$prev" == " " ) && $intok -eq 0 ]] || return 1
|
|
201
|
+
TOK[${#TOK[@]}]="&&"; TOKOFF[${#TOKOFF[@]}]="$i"; TOKOP[${#TOKOP[@]}]=1
|
|
202
|
+
i=$((i + 1)) ;;
|
|
203
|
+
';'|'|'|'<'|'>'|'('|')'|'$'|'`'|'\'|$'\n'|$'\r'|'!'|'*'|'?'|'['|']'|'{'|'}'|'~'|'#')
|
|
204
|
+
return 1 ;;
|
|
205
|
+
*)
|
|
206
|
+
if (( ! intok )); then intok=1; start=$i; fi
|
|
207
|
+
cur+="$c" ;;
|
|
208
|
+
esac
|
|
209
|
+
fi
|
|
210
|
+
i=$((i + 1))
|
|
211
|
+
done
|
|
212
|
+
[[ -z "$q" ]] || return 1
|
|
213
|
+
if (( intok )); then
|
|
214
|
+
TOK[${#TOK[@]}]="$cur"; TOKOFF[${#TOKOFF[@]}]="$start"; TOKOP[${#TOKOP[@]}]=0
|
|
215
|
+
fi
|
|
216
|
+
return 0
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
ACCEPTED_FORM="bash <script> --stage <name> --apply --plan-digest <digest> [--rotate-token], as ONE simple command (optionally preceded by cd <dir> &&), with no pipe, semicolon, redirect, substitution or other command"
|
|
220
|
+
|
|
221
|
+
is_v2_script() { # <file>
|
|
222
|
+
[[ -f "$1" ]] || return 1
|
|
223
|
+
[[ "$(sed -n '2p' "$1" 2>/dev/null)" == "# SOLEUR-GENERATED-OPERATOR-SCRIPT v2" ]]
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
# loose_v2_mention: does the command text name an existing v2 generated script at
|
|
227
|
+
# all (for a command that did NOT parse as one simple command)?
|
|
228
|
+
loose_v2_mention() {
|
|
229
|
+
local w base
|
|
230
|
+
for w in $COMMAND; do
|
|
231
|
+
w="${w//\'/}"; w="${w//\"/}"
|
|
232
|
+
[[ "$w" == *.sh ]] || continue
|
|
233
|
+
[[ "$w" == /* ]] || w="${CWD_IN:-$PWD}/${w}"
|
|
234
|
+
if is_v2_script "$w"; then return 0; fi
|
|
235
|
+
done
|
|
236
|
+
return 1
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
# A command this long is not one the person could read and approve as a single exact
|
|
240
|
+
# line, and the tokenizer is character-at-a-time. Treat it as not-simple.
|
|
241
|
+
TOKENIZED=1
|
|
242
|
+
if (( ${#COMMAND} > 4096 )); then TOKENIZED=0; else tokenize "$COMMAND" || TOKENIZED=0; fi
|
|
243
|
+
if (( ! TOKENIZED )); then
|
|
244
|
+
if loose_v2_mention; then
|
|
245
|
+
emit_deny "That is a staged Soleur operator-script apply in a form Soleur cannot ask the person about. Issue it as ${ACCEPTED_FORM}. Nothing was changed." "compound-command"
|
|
246
|
+
fi
|
|
247
|
+
trace "ran verdict=noop reason=not-simple-and-no-v2-script"
|
|
248
|
+
exit 0
|
|
249
|
+
fi
|
|
250
|
+
|
|
251
|
+
# Strip an optional leading `cd <dir> &&`.
|
|
252
|
+
base=0
|
|
253
|
+
CD_DIR=""
|
|
254
|
+
if (( ${#TOK[@]} >= 3 )) && [[ "${TOK[0]}" == "cd" && "${TOKOP[2]}" == "1" ]]; then
|
|
255
|
+
CD_DIR="${TOK[1]}"; base=3
|
|
256
|
+
fi
|
|
257
|
+
for ((k = 0; k < ${#TOK[@]}; k++)); do
|
|
258
|
+
if [[ "${TOKOP[k]}" == "1" ]] && (( k != 2 || base != 3 )); then
|
|
259
|
+
if loose_v2_mention; then
|
|
260
|
+
emit_deny "That is a staged Soleur operator-script apply in a form Soleur cannot ask the person about. Issue it as ${ACCEPTED_FORM}. Nothing was changed." "compound-command"
|
|
261
|
+
fi
|
|
262
|
+
trace "ran verdict=noop reason=extra-and-no-v2-script"
|
|
263
|
+
exit 0
|
|
264
|
+
fi
|
|
265
|
+
done
|
|
266
|
+
|
|
267
|
+
if (( ${#TOK[@]} - base < 2 )) || [[ "${TOK[base]}" != "bash" ]]; then
|
|
268
|
+
if loose_v2_mention; then
|
|
269
|
+
emit_deny "That is a staged Soleur operator-script apply in a form Soleur cannot ask the person about. Issue it as ${ACCEPTED_FORM}. Nothing was changed." "not-bash-form"
|
|
270
|
+
fi
|
|
271
|
+
trace "ran verdict=noop reason=not-bash-form"
|
|
272
|
+
exit 0
|
|
273
|
+
fi
|
|
274
|
+
|
|
275
|
+
SCRIPT_ARG="${TOK[base+1]}"
|
|
276
|
+
BASH_OFFSET="${TOKOFF[base]}"
|
|
277
|
+
BASE_DIR="${CWD_IN:-$PWD}"
|
|
278
|
+
if [[ -n "$CD_DIR" ]]; then
|
|
279
|
+
[[ "$CD_DIR" == /* ]] && BASE_DIR="$CD_DIR" || BASE_DIR="${BASE_DIR}/${CD_DIR}"
|
|
280
|
+
fi
|
|
281
|
+
SCRIPT_PATH="$SCRIPT_ARG"
|
|
282
|
+
[[ "$SCRIPT_PATH" == /* ]] || SCRIPT_PATH="${BASE_DIR}/${SCRIPT_PATH}"
|
|
283
|
+
|
|
284
|
+
if ! is_v2_script "$SCRIPT_PATH"; then
|
|
285
|
+
trace "ran verdict=noop reason=not-v2-script"
|
|
286
|
+
exit 0
|
|
287
|
+
fi
|
|
288
|
+
|
|
289
|
+
# The library is the ONE home of the receipt algorithm (mint here, verify there). It is
|
|
290
|
+
# sourced only now, for a real v2 apply: every other call (the path arm above, a
|
|
291
|
+
# non-script command) must work when the library is absent.
|
|
292
|
+
# shellcheck source=../scripts/lib/operator-script.sh disable=SC1091
|
|
293
|
+
if ! source "${HOOK_DIR}/../scripts/lib/operator-script.sh" >/dev/null 2>&1; then
|
|
294
|
+
emit_deny "Soleur's operator-stage approval library is missing, so this command was refused. Update the Soleur plugin." "lib-missing"
|
|
295
|
+
fi
|
|
296
|
+
REAL="$(soleur_approval_realpath "$SCRIPT_PATH")"
|
|
297
|
+
|
|
298
|
+
ARGS=()
|
|
299
|
+
for ((k = base + 2; k < ${#TOK[@]}; k++)); do ARGS[${#ARGS[@]}]="${TOK[k]}"; done
|
|
300
|
+
|
|
301
|
+
STAGE=""; DIGEST=""; APPLY=0
|
|
302
|
+
k=0
|
|
303
|
+
while (( k < ${#ARGS[@]} )); do
|
|
304
|
+
case "${ARGS[k]}" in
|
|
305
|
+
--stage) STAGE="${ARGS[k+1]:-}"; k=$((k + 2)) ;;
|
|
306
|
+
--plan-digest) DIGEST="${ARGS[k+1]:-}"; k=$((k + 2)) ;;
|
|
307
|
+
--apply) APPLY=1; k=$((k + 1)) ;;
|
|
308
|
+
--rotate-token) k=$((k + 1)) ;;
|
|
309
|
+
*) emit_deny "That staged Soleur operator-script command has an argument Soleur will not ask about (${#ARGS[@]} arguments, one not recognised). Issue it as ${ACCEPTED_FORM}. Nothing was changed." "unknown-arg" ;;
|
|
310
|
+
esac
|
|
311
|
+
done
|
|
312
|
+
if (( APPLY == 0 )); then
|
|
313
|
+
trace "ran verdict=noop reason=no-apply-flag-after-parse"
|
|
314
|
+
exit 0
|
|
315
|
+
fi
|
|
316
|
+
[[ "$DIGEST" =~ ^[0-9a-f]{64}$ ]] || emit_deny "A staged Soleur operator-script apply needs the plan digest the plan printed. Run the stage without --apply first, then issue the apply command exactly as printed. Nothing was changed." "no-digest"
|
|
317
|
+
|
|
318
|
+
# Exact first-field match (never a regex built from the agent's stage name: a `.` in it
|
|
319
|
+
# would select a different stage's line). First declaration wins, as in the library.
|
|
320
|
+
STAGE_LINE=""
|
|
321
|
+
if [[ -n "$STAGE" ]]; then
|
|
322
|
+
STAGE_LINE="$(grep -a '^# SOLEUR-STAGE ' "$REAL" 2>/dev/null | sed 's/^# SOLEUR-STAGE //' | awk -F'|' -v s="$STAGE" '$1 == s { print; exit }')" || STAGE_LINE=""
|
|
323
|
+
fi
|
|
324
|
+
[[ -n "$STAGE_LINE" ]] || emit_deny "That stage is not declared by the script, so Soleur will not ask about it. Run --list to see the stages. Nothing was changed." "unknown-stage"
|
|
325
|
+
STAGE_CLASS="$(printf '%s' "$STAGE_LINE" | cut -d'|' -f2)"
|
|
326
|
+
IMPACT="$(printf '%s' "$STAGE_LINE" | cut -d'|' -f3)"
|
|
327
|
+
ROLLBACK="$(printf '%s' "$STAGE_LINE" | cut -d'|' -f4)"
|
|
328
|
+
if [[ "$STAGE_CLASS" != "write" ]]; then
|
|
329
|
+
# A read stage takes no --apply. Refusing it here (instead of letting the call
|
|
330
|
+
# through unasked) keeps `--apply` meaning one thing: a write the person approved.
|
|
331
|
+
emit_deny "That stage is declared read-only, so it takes no --apply. Run it without --apply. Nothing was changed." "apply-on-read-stage"
|
|
332
|
+
fi
|
|
333
|
+
|
|
334
|
+
BINDING="$(soleur_approval_binding_digest "$REAL" "$STAGE" "${ARGS[@]}")"
|
|
335
|
+
|
|
336
|
+
# --- mode ---------------------------------------------------------------------------
|
|
337
|
+
case "$MODE" in
|
|
338
|
+
default|acceptEdits|plan) ;;
|
|
339
|
+
*) emit_deny "Approvals are switched off or cannot be asked in this session (permission mode '${MODE:-unknown}'), so Soleur will not make this production change. Switch to the normal permission mode and ask again. Nothing was changed." "mode-${MODE:-unknown}" ;;
|
|
340
|
+
esac
|
|
341
|
+
|
|
342
|
+
# The impact and rollback sentences are read from the SCRIPT FILE, which the agent can
|
|
343
|
+
# edit, so the prompt says so. Control characters are dropped and each sentence is
|
|
344
|
+
# capped: the text can mislead a person, it cannot spoof the prompt's own framing.
|
|
345
|
+
#
|
|
346
|
+
# Shared context-sanitize lib (#10395), one tree up at scripts/lib/. When it is
|
|
347
|
+
# unreadable the same-name fallback carries this site's pre-change strip set
|
|
348
|
+
# (C0+DEL) — never weaker than today.
|
|
349
|
+
_ctx_lib="$HOOK_DIR/../scripts/lib/context-sanitize.sh"
|
|
350
|
+
# shellcheck source=/dev/null
|
|
351
|
+
[[ -r "$_ctx_lib" ]] && . "$_ctx_lib" || true
|
|
352
|
+
declare -F soleur_ctx_sanitize >/dev/null 2>&1 \
|
|
353
|
+
|| soleur_ctx_sanitize() { LC_ALL=C tr -d '\000-\037\177'; }
|
|
354
|
+
clean() { printf '%s' "$1" | soleur_ctx_sanitize | cut -c1-500; }
|
|
355
|
+
IMPACT="$(clean "$IMPACT")"; ROLLBACK="$(clean "$ROLLBACK")"
|
|
356
|
+
REASON="Soleur is about to run stage '${STAGE}' of a generated operator script and change production. The script describes what it does as: ${IMPACT} It describes how to undo it as: ${ROLLBACK} (Both sentences come from the script file and are not verified by Soleur.) Approving runs exactly the command shown."
|
|
357
|
+
# The Bash tool shows a `description` the AGENT wrote next to the command in the
|
|
358
|
+
# prompt. It is replaced, so the person reads Soleur's words and not the agent's.
|
|
359
|
+
DESC="Soleur approval: production change, stage '${STAGE}' of a generated operator script"
|
|
360
|
+
emit_envelope() { # <decision> <reason> [with-update <nonce>]
|
|
361
|
+
local nonce="${4:-}" new
|
|
362
|
+
if [[ -n "$nonce" ]]; then
|
|
363
|
+
# The nonce goes immediately BEFORE `bash`, not before the whole string, so the
|
|
364
|
+
# `cd <dir> && bash ...` form hands it to the script and not to `cd`.
|
|
365
|
+
new="${COMMAND:0:BASH_OFFSET}SOLEUR_APPROVAL_NONCE=${nonce} ${COMMAND:BASH_OFFSET}"
|
|
366
|
+
printf '%s' "$INPUT" | jq -c --arg d "$1" --arg r "$2" --arg n "$new" --arg desc "$DESC" \
|
|
367
|
+
'{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:$d,permissionDecisionReason:$r,updatedInput:(.tool_input|.command=$n|.description=$desc)}}'
|
|
368
|
+
else
|
|
369
|
+
printf '%s' "$INPUT" | jq -c --arg d "$1" --arg r "$2" \
|
|
370
|
+
'{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:$d,permissionDecisionReason:$r}}'
|
|
371
|
+
fi
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
INTERACTIVE=0
|
|
375
|
+
case "${CLAUDE_CODE_ENTRYPOINT:-}" in
|
|
376
|
+
cli|claude-vscode|claude-desktop|claude-desktop-3p) INTERACTIVE=1 ;;
|
|
377
|
+
esac
|
|
378
|
+
|
|
379
|
+
if (( INTERACTIVE )); then
|
|
380
|
+
NONCE="$(soleur_approval_mint "$BINDING" "$SESSION")" || NONCE=""
|
|
381
|
+
[[ -n "$NONCE" ]] || emit_deny "Soleur could not set up a safe place for the approval receipt on this machine, so it will not make this production change. Nothing was changed." "mint-failed"
|
|
382
|
+
trace "ran verdict=ask reason=interactive-mint stage=${STAGE}"
|
|
383
|
+
emit_envelope ask "$REASON" with-update "$NONCE"
|
|
384
|
+
exit 0
|
|
385
|
+
fi
|
|
386
|
+
|
|
387
|
+
# Headless: never mint. The run waits (`defer`) and a person resumes the session
|
|
388
|
+
# interactively, where this hook runs again and asks.
|
|
389
|
+
trace "ran verdict=defer reason=headless stage=${STAGE}"
|
|
390
|
+
emit_envelope defer "A production change is waiting for a person's approval: stage '${STAGE}' of a generated operator script. The script describes what it does as: ${IMPACT} It describes how to undo it as: ${ROLLBACK} Resume this session interactively (claude --resume) and the person will be asked at the prompt to approve exactly this command. Nothing has been changed."
|
|
391
|
+
exit 0
|