@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
|
+
name: version
|
|
3
|
+
description: "Show the installed Soleur plugin version and whether a newer release exists"
|
|
4
|
+
argument-hint: ""
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Soleur Version
|
|
9
|
+
|
|
10
|
+
Report which Soleur plugin version is installed, what the latest release is, and how to update. Run the shared resolver; never guess or infer a version yourself. This command is Claude Code only and is started by the user; it is not run automatically.
|
|
11
|
+
|
|
12
|
+
This explicit run contacts github.com regardless of `SOLEUR_UPDATE_CHECK`, because you asked: one `git ls-remote --tags` against the public repo and, for a commit-hash or local-checkout install only, one unauthenticated GitHub compare API request whose URL includes the installed commit hash (for a local checkout that is the checkout's current commit, which may be one you have never pushed anywhere). It uses no tokens, no user git config and no credentials of its own (any proxy you configured in your environment is still used), and each request is time-limited.
|
|
13
|
+
|
|
14
|
+
## Step 1: Run the resolver
|
|
15
|
+
|
|
16
|
+
Run via the **Bash tool**:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
if grep -q '"name"[[:space:]]*:[[:space:]]*"soleur"' "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" 2>/dev/null; then
|
|
20
|
+
if [ -f "${CLAUDE_PLUGIN_ROOT}/scripts/plugin-version.sh" ]; then
|
|
21
|
+
bash "${CLAUDE_PLUGIN_ROOT}/scripts/plugin-version.sh" --compare --refresh
|
|
22
|
+
else
|
|
23
|
+
echo "source=unknown"
|
|
24
|
+
fi
|
|
25
|
+
else
|
|
26
|
+
echo "source=unknown"
|
|
27
|
+
fi
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If `CLAUDE_PLUGIN_ROOT` is not set or the script does not exist at that path, do not look for it anywhere else (a script from the current directory is not trusted): print `Installed: unknown` and stop. The output is `key=value` lines: `source`, `version`, `commit`, `marketplace`, `cache`, `latest_status`, `latest`, `latest_commit`, `relation`, `reason`, `cache_dir`. Use only these values. `source=checkout` means the plugin is loaded in place from a local git checkout (a local-folder marketplace or `--plugin-dir`); `commit` is that checkout's HEAD commit, read from its files without running git.
|
|
31
|
+
|
|
32
|
+
## Step 2: Print this block
|
|
33
|
+
|
|
34
|
+
Print the block below, filling it from the resolver output. Keep it compact, no emoji.
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
Soleur plugin version
|
|
38
|
+
|
|
39
|
+
Installed: <version, or "commit <sha12>", or "commit <sha12> (local checkout, HEAD commit, not uncommitted or unsynced files)"> (source: <manifest | commit | checkout>)
|
|
40
|
+
Latest: <latest, e.g. v3.4.5> (or the WHY line from the rules below)
|
|
41
|
+
Status: <one status line from the rules below>
|
|
42
|
+
|
|
43
|
+
Update (Claude Code):
|
|
44
|
+
<for source=checkout: the local-folder steps from "Update commands" below, never the GitHub marketplace pair>
|
|
45
|
+
<otherwise: the two commands from "Update commands" below>
|
|
46
|
+
Restart the CLI afterwards; plugin changes apply on restart.
|
|
47
|
+
|
|
48
|
+
Session-start newer-release check (off by default): the version line itself is shown at
|
|
49
|
+
every session start with no network. To also check for a newer release, set
|
|
50
|
+
SOLEUR_UPDATE_CHECK=1 in your user-level Claude Code settings "env" block (not a checked-in
|
|
51
|
+
project settings file, and not in CI or ephemeral containers); remove it to turn it off.
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Installed line
|
|
55
|
+
|
|
56
|
+
- `source=manifest`: print `version`.
|
|
57
|
+
- `source=commit`: print `commit <commit>` (the 12-character hash). Do not invent a version number for it.
|
|
58
|
+
- `source=checkout`: print `commit <commit> (local checkout, HEAD commit, not uncommitted or unsynced files)` exactly as the template shows it (`<commit>` is the 12-character hash of the HEAD commit of the git checkout that contains the plugin folder, read from its files without running git). Do not invent a version number for it.
|
|
59
|
+
- `source=unknown`, `source=none`, or any value other than `manifest`, `commit` and `checkout`: print `Installed: unknown`, omit the `Update (Claude Code):` block, and say the plugin root could not be identified (not running from an installed plugin, a recognizable cache directory, or a local git checkout whose HEAD could be read: an unborn branch, a reftable or sha-256 repository or an unusual layout reads as unknown); tell the user they can compare with `claude plugin list` (you do not run it). Do not print a version.
|
|
60
|
+
|
|
61
|
+
### Latest line (explain WHY when missing)
|
|
62
|
+
|
|
63
|
+
When `latest=` is present, print it. Label it "(cached, may be out of date)" whenever `cache=stale` or `latest_status` is `offline` or `timeout`. When `latest=` is absent, print the first matching reason, never a blank:
|
|
64
|
+
|
|
65
|
+
1. `latest_status=offline`: "Could not reach github.com (offline or blocked)."
|
|
66
|
+
2. `latest_status=timeout`: "The lookup timed out."
|
|
67
|
+
3. `latest_status=no-git`: "`git` is not installed, so the release lookup was skipped."
|
|
68
|
+
4. `latest_status=no-tags`: "github.com answered but returned no release tags."
|
|
69
|
+
5. `cache=corrupt`: "The version cache is unreadable; it is rewritten on the next successful lookup." (the file is `latest-release.<install id>` under `cache_dir`, or `latest-release.checkout` for a local checkout).
|
|
70
|
+
6. Anything else: "The latest release could not be determined."
|
|
71
|
+
|
|
72
|
+
### Status line (compare result)
|
|
73
|
+
|
|
74
|
+
Read `relation` and `reason`:
|
|
75
|
+
|
|
76
|
+
- `relation=older`: "A newer release exists."
|
|
77
|
+
- `relation=current`: "No release newer than yours (latest tag vX.Y.Z)", with the `latest` value. This means only that no release tag newer than the installed commit or version was found. Never say "up to date" or "you are on the latest release".
|
|
78
|
+
- `relation=unknown`: "Cannot compare" plus the reason: `installed-unknown` (the installed version could not be read), `diverged` (the installed commit is not on the release line), `compare-failed` or `compare-unparseable` (the GitHub compare call failed; a local checkout may also be on a commit that was never published), `no-curl` (curl is missing), `stale-cache` (the answer came from a cached or failed lookup, so it is not trusted; run this command again when online), `cache-invalid` (the cached answer was unusable; run this command again).
|
|
79
|
+
- `relation` absent (no latest release is known): "Cannot compare: the latest release is not known", followed by the `latest_status` reason from the Latest line rules.
|
|
80
|
+
|
|
81
|
+
Never say "up to date" when the relation is unknown or absent, and never infer a relation by comparing strings yourself.
|
|
82
|
+
|
|
83
|
+
### Update commands
|
|
84
|
+
|
|
85
|
+
Choose by `source` first, then (for `manifest` and `commit` only) by the `marketplace` value:
|
|
86
|
+
|
|
87
|
+
- `source=checkout` (in place from a local git checkout; use this arm whatever `marketplace` says, and never print the GitHub marketplace pair for it, which would replace the in-place install with a published copy). **Print these steps for the user to run; never run any of them yourself** (no `git`, no `claude`, no `gh`). The marketplace is the local folder and is named `soleur`. Tell the user how to tell the two layouts apart: `git -C <folder> rev-parse --is-bare-repository` prints `true` for a bare layout (`<folder>` is the Source path in `claude plugin marketplace list`, or the `--plugin-dir` path).
|
|
88
|
+
1. Update the folder. Bare layout (`true`, files mirrored on disk): in the repository root run `git fetch --no-tags origin main:main`; if git refuses because `main` is checked out in a worktree, commit or stash there and run `git pull --ff-only origin main` inside that worktree instead (never force-move `main`: that can orphan unpushed commits). Then run `plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh sync`, which mirrors the repository's HEAD to the files on disk (it overwrites tracked files there and does not fetch). Normal clone (`false`): update the branch you run from, for example `git pull --ff-only`.
|
|
89
|
+
2. If the plugin was added as a local-folder marketplace (the usual case): `claude plugin marketplace update soleur` then `claude plugin update soleur@soleur`, then restart. If it was started with `--plugin-dir <path>`, skip this step (no marketplace command applies) and just restart.
|
|
90
|
+
The resolver cannot tell those two launch modes apart, so print both lines, each labelled. If the plugin folder is vendored inside another project's repository, the identity shown is that project's HEAD and these steps do not update the vendored copy.
|
|
91
|
+
- `source=manifest` or `source=commit`, with `marketplace` absent or `soleur-marketplace`:
|
|
92
|
+
`claude plugin marketplace update soleur-marketplace` then `claude plugin update soleur@soleur-marketplace`
|
|
93
|
+
- `soleur`:
|
|
94
|
+
`claude plugin marketplace update soleur` then `claude plugin update soleur@soleur`
|
|
95
|
+
- any other value: print the same pair with that marketplace name substituted.
|
|
96
|
+
|
|
97
|
+
If the install is project-scoped (`claude plugin list` shows Scope), add `--scope project` to the update command. See `knowledge-base/engineering/operations/runbooks/plugin-delivery-recovery.md` if an update says "already at the latest version" but nothing changes.
|
|
98
|
+
|
|
99
|
+
## Output Rules
|
|
100
|
+
|
|
101
|
+
- Print only values the resolver returned or the fixed text above; never report a version you did not read.
|
|
102
|
+
- Do not run `gh`, `curl`, `git` or `claude` yourself; the resolver owns every network call.
|
|
103
|
+
- If the Bash tool is unavailable, say so and print only `Installed:` from the plugin root directory name if it is a 12-character hex commit hash; otherwise print `unknown`.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Soleur plugin hooks for Antigravity CLI",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "^(run_command|Bash|exec)$",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/browser-snapshot-credential-guard.sh\""
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"matcher": "^(run_command|write_to_file|replace_file_content|Bash|Monitor|Write|Edit|MultiEdit|NotebookEdit)$",
|
|
16
|
+
"hooks": [
|
|
17
|
+
{
|
|
18
|
+
"type": "command",
|
|
19
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/operator-stage-approval.sh\"",
|
|
20
|
+
"timeout": 10
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"matcher": "^(run_command|Bash)$",
|
|
26
|
+
"hooks": [
|
|
27
|
+
{
|
|
28
|
+
"type": "command",
|
|
29
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/destructive-command-guard.sh\"",
|
|
30
|
+
"timeout": 10
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"SessionStart": [
|
|
36
|
+
{
|
|
37
|
+
"matcher": "startup|resume|clear|compact",
|
|
38
|
+
"hooks": [
|
|
39
|
+
{
|
|
40
|
+
"type": "command",
|
|
41
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/antigravity-session-start.sh\""
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"matcher": "startup",
|
|
47
|
+
"hooks": [
|
|
48
|
+
{
|
|
49
|
+
"type": "command",
|
|
50
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/welcome-hook.sh\""
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"matcher": "startup",
|
|
56
|
+
"hooks": [
|
|
57
|
+
{
|
|
58
|
+
"type": "command",
|
|
59
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/version-banner.sh\"",
|
|
60
|
+
"timeout": 10
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"Stop": [
|
|
66
|
+
{
|
|
67
|
+
"hooks": [
|
|
68
|
+
{
|
|
69
|
+
"type": "command",
|
|
70
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/stop-hook.sh\""
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"hooks": [
|
|
76
|
+
{
|
|
77
|
+
"type": "command",
|
|
78
|
+
"command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/unkept-promise-hook.sh\""
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
[[ -n "${ANTIGRAVITY_CLI:-}" || -n "${AGY_VERSION:-}" || -n "${GEMINI_CLI:-}" || -n "${PLUGIN_ROOT:-}" ]] || exit 0
|
|
5
|
+
SOLEUR_PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
|
|
7
|
+
# Run session start worktree cleanup if available
|
|
8
|
+
if [[ -f "$SOLEUR_PLUGIN_ROOT/skills/git-worktree/scripts/worktree-manager.sh" ]]; then
|
|
9
|
+
bash "$SOLEUR_PLUGIN_ROOT/skills/git-worktree/scripts/worktree-manager.sh" cleanup-merged 2>/dev/null || true
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
jq -n --arg root "$SOLEUR_PLUGIN_ROOT" \
|
|
13
|
+
--rawfile instructions "$SOLEUR_PLUGIN_ROOT/antigravity/INSTRUCTIONS.md" \
|
|
14
|
+
'{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext:
|
|
15
|
+
("Soleur plugin root: " + $root + "\n" + $instructions)}}'
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# bare-root-cwd-guard.sh — PLUGIN-level SessionStart arm for the row-3 bare-repo-root
|
|
3
|
+
# misanchor (#10392). Same basename as .claude/hooks/bare-root-cwd-guard.sh on purpose:
|
|
4
|
+
# the dual-home naming convention lets the tree disambiguate the two arms (CTO ruling
|
|
5
|
+
# 2026-10-20). The repo arm reaches only this repo's sessions; THIS arm ships in the
|
|
6
|
+
# plugin payload and so reaches every other repository on a machine that installs it.
|
|
7
|
+
#
|
|
8
|
+
# Contract: always exits 0. On detection it emits exactly one SessionStart envelope
|
|
9
|
+
# {"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext": …}}
|
|
10
|
+
# whose additionalContext carries one `SOLEUR_BARE_ROOT_CWD source=plugin-session-start`
|
|
11
|
+
# marker line followed by a bounded [bare-root-cwd] redirect block. Every other path —
|
|
12
|
+
# no jq, no .cwd, non-bare cwd, deduped repo — prints NOTHING: a SessionStart hook that
|
|
13
|
+
# cannot emit valid JSON must emit nothing.
|
|
14
|
+
#
|
|
15
|
+
# cwd resolution: the envelope's `.cwd` first (jq-gated; some harnesses omit it), then
|
|
16
|
+
# DEVIN_PROJECT_DIR → CLAUDE_PROJECT_DIR → $PWD.
|
|
17
|
+
#
|
|
18
|
+
# Detection is the SAME three-term config-FILE predicate as the repo arm, the
|
|
19
|
+
# bare-head-self-heal copy, and the copy inlined in
|
|
20
|
+
# plugins/soleur/skills/git-worktree/scripts/git-repo-readiness-diag.sh —
|
|
21
|
+
# plugins/soleur/test/git-repo-readiness-diag.test.sh D5 pins the three-way parity:
|
|
22
|
+
# 1. `root` is a repo ROOT in the ADR-099 row-3 layout: `<root>/.git` is a real
|
|
23
|
+
# directory (not a file or symlink — a `gitdir:` redirect, a linked worktree, and
|
|
24
|
+
# a symlinked .git all fail here), `core.bare` reads `true` from its config FILE
|
|
25
|
+
# (never `--is-bare-repository`: ADR-173 records that a masked config reports true
|
|
26
|
+
# for any normal clone — the exact false-positive #10392 forbids), and
|
|
27
|
+
# 2. `--absolute-git-dir` resolves to exactly that directory.
|
|
28
|
+
# A `git init --bare` repo (mirror, server repo) fails term 1 — its git dir IS the
|
|
29
|
+
# root, there is no `<root>/.git` — so a genuinely bare customer repo never gets a
|
|
30
|
+
# misapplied redirect (P2). A session in a real worktree exits earlier on
|
|
31
|
+
# `--show-toplevel`, which also keeps a bare-root SUBDIRECTORY silent: that narrowing
|
|
32
|
+
# is deliberate (go.md's --is-bare-repository routing guard is the in-bare-subdir
|
|
33
|
+
# backstop).
|
|
34
|
+
#
|
|
35
|
+
# Dedup (CTO ruling 2026-10-20): when the target repo already carries its own arm —
|
|
36
|
+
# BOTH a `SOLEUR_BARE_ROOT_CWD` marker under `.claude/hooks/*.sh` AND a settings/devin
|
|
37
|
+
# registry referencing `session-rules-loader.sh` — the repo arm reports the session and
|
|
38
|
+
# this arm stays silent. A vendored-but-unwired tree hits term 1 only, so this arm still
|
|
39
|
+
# fires there; over-suppression is the worse failure direction.
|
|
40
|
+
#
|
|
41
|
+
# Redirect text is topology-generic (`git worktree add`) — a customer repo does not
|
|
42
|
+
# carry this repo's .worktrees/ machinery. A soleur `worktree-manager.sh` hint line is
|
|
43
|
+
# appended ONLY when the plugin-side script exists.
|
|
44
|
+
#
|
|
45
|
+
# No `set -e`, by design: every step is an explicit `|| exit 0`.
|
|
46
|
+
set -uo pipefail
|
|
47
|
+
|
|
48
|
+
# jq gates everything: it parses the incoming envelope AND emits the outgoing one, so
|
|
49
|
+
# without it the only correct behavior is silence.
|
|
50
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
51
|
+
|
|
52
|
+
# An inherited git-location variable overrides `cd` and `git -C` alike, and would aim
|
|
53
|
+
# every probe below at a different repository than the one named (same unset list as
|
|
54
|
+
# the repo arm and the readiness-diag copy — the parity suite pins the GIT_DIR arm).
|
|
55
|
+
unset GIT_DIR GIT_WORK_TREE GIT_COMMON_DIR GIT_INDEX_FILE GIT_OBJECT_DIRECTORY \
|
|
56
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE
|
|
57
|
+
|
|
58
|
+
# Shared context sanitizer (#10395): the emitted path enters agent context, so the
|
|
59
|
+
# strip runs through the lib when it is readable. Plugin-side copy lives under
|
|
60
|
+
# scripts/lib/ (the plugin ships only plugins/soleur/**); the repo-side copy lives at
|
|
61
|
+
# .claude/hooks/lib/ and is byte-equal (context-sanitize.test.sh pins `cmp`).
|
|
62
|
+
_plugin_hooks_dir=$(cd -P "${BASH_SOURCE[0]%/*}" 2>/dev/null && pwd -P) || exit 0
|
|
63
|
+
_ctx_lib="$_plugin_hooks_dir/../scripts/lib/context-sanitize.sh"
|
|
64
|
+
# shellcheck source=/dev/null
|
|
65
|
+
[[ -r "$_ctx_lib" ]] && . "$_ctx_lib" || true
|
|
66
|
+
unset _ctx_lib _plugin_hooks_dir
|
|
67
|
+
if ! declare -F soleur_ctx_sanitize >/dev/null 2>&1; then
|
|
68
|
+
# Fallback — identical byte contract to the lib (C0 + DEL + NEL/LS/PS) so an
|
|
69
|
+
# unreadable lib degrades to the same strip, never to zero protection. Octal
|
|
70
|
+
# \177 for DEL: tr does not interpret \xHH. $'…' ANSI-C quoting is REQUIRED on
|
|
71
|
+
# the sed patterns: BSD sed does not interpret bare '\xHH' and would silently
|
|
72
|
+
# strip nothing.
|
|
73
|
+
soleur_ctx_sanitize() {
|
|
74
|
+
LC_ALL=C tr -d '\000-\037\177' \
|
|
75
|
+
| LC_ALL=C sed -e $'s/\xc2\x85//g' -e $'s/\xe2\x80\xa8//g' -e $'s/\xe2\x80\xa9//g'
|
|
76
|
+
}
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
input=$(cat 2>/dev/null || true)
|
|
80
|
+
cwd=$(printf '%s' "$input" | jq -r '.cwd // empty' 2>/dev/null || true)
|
|
81
|
+
if [[ -z "$cwd" ]]; then
|
|
82
|
+
cwd="${DEVIN_PROJECT_DIR:-${CLAUDE_PROJECT_DIR:-$PWD}}"
|
|
83
|
+
fi
|
|
84
|
+
[[ -n "$cwd" ]] || exit 0
|
|
85
|
+
cd -- "$cwd" 2>/dev/null || exit 0
|
|
86
|
+
root=$(pwd -P) || exit 0
|
|
87
|
+
|
|
88
|
+
# A worktree answers --show-toplevel; only a bare shape falls through to the
|
|
89
|
+
# predicate. This is a worktree test, never a bareness test (Sharp Edges).
|
|
90
|
+
[[ -n "$(git rev-parse --show-toplevel 2>/dev/null)" ]] && exit 0
|
|
91
|
+
|
|
92
|
+
# Three-term ADR-099 row-3 predicate — fourth inline copy, parity-pinned.
|
|
93
|
+
[[ -d "$root/.git" && ! -L "$root/.git" ]] || exit 0
|
|
94
|
+
[[ "$(git config --file "$root/.git/config" --type=bool --get core.bare 2>/dev/null)" == "true" ]] || exit 0
|
|
95
|
+
git_dir=$(git rev-parse --absolute-git-dir 2>/dev/null) || exit 0
|
|
96
|
+
[[ "$git_dir" == "$root/.git" ]] || exit 0
|
|
97
|
+
|
|
98
|
+
# Dedup: the repo's own arm reports when it is BOTH present and wired. `grep -l` on
|
|
99
|
+
# the glob is the bounded, read-only probe; an unmatched glob or an absent registry
|
|
100
|
+
# file simply fails the term and this arm still fires.
|
|
101
|
+
if grep -lF 'SOLEUR_BARE_ROOT_CWD' "$root"/.claude/hooks/*.sh >/dev/null 2>&1 \
|
|
102
|
+
&& { grep -qs 'session-rules-loader\.sh' "$root/.claude/settings.json" 2>/dev/null \
|
|
103
|
+
|| grep -qs 'session-rules-loader\.sh' "$root/.devin/config.json" 2>/dev/null; }; then
|
|
104
|
+
exit 0
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Sanitize the path for context: envelope-supplied, so strip control characters
|
|
108
|
+
# (incl. DEL, NEL, and the U+2028/U+2029 line-break class — #10395) and cap it.
|
|
109
|
+
safe_root=$(printf '%s' "$root" | soleur_ctx_sanitize | cut -c1-200)
|
|
110
|
+
|
|
111
|
+
block="SOLEUR_BARE_ROOT_CWD source=plugin-session-start
|
|
112
|
+
[bare-root-cwd] ${safe_root} is a bare repository root with a synced overlay of HEAD, not a worktree.
|
|
113
|
+
[bare-root-cwd] Route file-touching work through a linked worktree:
|
|
114
|
+
[bare-root-cwd] git worktree add <path> <branch>
|
|
115
|
+
[bare-root-cwd] then cd into the new worktree path before editing.
|
|
116
|
+
[bare-root-cwd] A .env at this root is NOT project configuration — do not read it as one."
|
|
117
|
+
|
|
118
|
+
# Soleur-hint line — gated on the plugin-side script existing on this machine
|
|
119
|
+
# (CTO ruling: the manager ships in the plugin payload, but the text is only
|
|
120
|
+
# emitted where it can actually run).
|
|
121
|
+
if [[ -n "${CLAUDE_PLUGIN_ROOT:-}" \
|
|
122
|
+
&& -f "${CLAUDE_PLUGIN_ROOT}/skills/git-worktree/scripts/worktree-manager.sh" ]]; then
|
|
123
|
+
safe_wm=$(printf '%s' "${CLAUDE_PLUGIN_ROOT}/skills/git-worktree/scripts/worktree-manager.sh" \
|
|
124
|
+
| soleur_ctx_sanitize | cut -c1-300)
|
|
125
|
+
block+=$'\n'"[bare-root-cwd] Soleur worktree manager present: bash \"${safe_wm}\" --yes create <name>"
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
jq -n --arg ctx "$block" \
|
|
129
|
+
'{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:$ctx}}' 2>/dev/null \
|
|
130
|
+
|| exit 0
|
|
131
|
+
exit 0
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse hook on Bash.
|
|
3
|
+
# Denies an `agent-browser ... snapshot` that is not routed through the
|
|
4
|
+
# accessibility-snapshot redactor.
|
|
5
|
+
#
|
|
6
|
+
# WHY (#7947, measured -- see
|
|
7
|
+
# knowledge-base/project/specs/feat-one-shot-7946-7947-sentry-org-token-and-snapshot-redaction/phase-0-measurement.md):
|
|
8
|
+
# an accessibility snapshot serializes the VALUE of input fields. A value the
|
|
9
|
+
# agent never supplied -- a password manager's autofill, a static value=, a JS
|
|
10
|
+
# assignment, or a generated-credential panel -- is rendered into the transcript
|
|
11
|
+
# and into any snapshot file written to disk. Nothing about the call looks
|
|
12
|
+
# credential-adjacent: the natural reason to snapshot a login page is to find
|
|
13
|
+
# out whether the flow advanced.
|
|
14
|
+
#
|
|
15
|
+
# Measured, and this is why the hook exists rather than a prose rule:
|
|
16
|
+
# * agent-browser 0.22.3 masks type=password (bullets) but renders a readonly
|
|
17
|
+
# type=text credential panel -- the "Token" class -- in CLEAR. That class
|
|
18
|
+
# has already fired in this repo (2026-05-19 Sentry token scope probe).
|
|
19
|
+
# * The Playwright MCP renders BOTH in clear.
|
|
20
|
+
#
|
|
21
|
+
# This hook covers the Bash path only. Property P7 ("the guards hold without the
|
|
22
|
+
# acting agent having to remember them") holds on the Bash path via this
|
|
23
|
+
# interceptor AND on a Playwright-MCP registration routed through
|
|
24
|
+
# skills/agent-browser/scripts/playwright-mcp-redact-proxy.py (#7980), which
|
|
25
|
+
# rewrites every tool result through the same redactor at the stdio boundary.
|
|
26
|
+
# An unwrapped Playwright-MCP registration remains uncovered — #8156 shipped
|
|
27
|
+
# the plugin's own wrapped registration (mcp__plugin_soleur_playwright__*), but
|
|
28
|
+
# a customer's OWN playwright entry is still exactly as wrapped as they
|
|
29
|
+
# configured it; the transcript-sink closer for that surface is Option C,
|
|
30
|
+
# deferred at #8286. That gap is stated rather than implied.
|
|
31
|
+
#
|
|
32
|
+
# Disposition is DENY, not rewrite: ADR-162 permits exactly one PreToolUse
|
|
33
|
+
# rewriter and grep-rewrite.sh holds it. Two hooks emitting updatedInput for the
|
|
34
|
+
# same call have undefined precedence and one rewrite is silently discarded.
|
|
35
|
+
#
|
|
36
|
+
# Fail-open by construction: any parse failure exits 0 with no decision. A hook
|
|
37
|
+
# that hard-fails on a malformed envelope would block every Bash call.
|
|
38
|
+
set -uo pipefail
|
|
39
|
+
|
|
40
|
+
# Operator kill-switch, matching the convention of the other PreToolUse hooks
|
|
41
|
+
# (grep-rewrite.sh carries SOLEUR_DISABLE_GREP_REWRITE). A false deny must not
|
|
42
|
+
# require editing the installed plugin to work around.
|
|
43
|
+
[[ -n "${SOLEUR_DISABLE_SNAPSHOT_GUARD:-}" ]] && exit 0
|
|
44
|
+
|
|
45
|
+
INPUT="$(cat 2>/dev/null || true)"
|
|
46
|
+
[[ -z "$INPUT" ]] && exit 0
|
|
47
|
+
|
|
48
|
+
# Fast path, before any subprocess. The deny predicate requires the literal
|
|
49
|
+
# `agent-browser`, and JSON escaping cannot alter it, so it survives verbatim in
|
|
50
|
+
# the envelope. This short-circuits ~every Bash call in a session without
|
|
51
|
+
# spawning jq -- which matters because this hook is registered on the Bash
|
|
52
|
+
# matcher and also loads on the hosted platform surface, so it runs on EVERY
|
|
53
|
+
# Bash tool call, not only on browser ones.
|
|
54
|
+
[[ "$INPUT" == *agent-browser* ]] || exit 0
|
|
55
|
+
|
|
56
|
+
# The redactor is anchored on its FILENAME, not on a bare word like "python3" or
|
|
57
|
+
# "redact". The assertion is on the anchor: a look-alike command name that does
|
|
58
|
+
# not redact must not satisfy the allow-predicate.
|
|
59
|
+
REDACTOR_ANCHOR='redact-a11y-snapshot'
|
|
60
|
+
|
|
61
|
+
# Portable remedy path. `${CLAUDE_PLUGIN_ROOT}` resolves to the installed plugin
|
|
62
|
+
# on a customer machine, where a repo-relative path does not exist at all -- the
|
|
63
|
+
# operator would get `python3: can't open file`, and the natural next move is the
|
|
64
|
+
# screenshot escape, which this very message says is unsafe for the one class
|
|
65
|
+
# with a recorded incident.
|
|
66
|
+
# The remedy this hook PRINTS is the form the operator will paste, so it must be
|
|
67
|
+
# the canonical one: bare `${CLAUDE_PLUGIN_ROOT}`, quoted. ADR-179 rejects the
|
|
68
|
+
# `:-default` variant precisely because the fallback resolves to a repo-relative
|
|
69
|
+
# path that exists on no customer machine -- it turns a loud failure into a
|
|
70
|
+
# silent one, which is the defect class this whole guard exists to remove.
|
|
71
|
+
REDACTOR_CMD='python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"'
|
|
72
|
+
|
|
73
|
+
# `jq` unusable is NOT the same condition as a malformed envelope, and must not
|
|
74
|
+
# get the same silent pass. Without this branch a machine whose jq is missing OR
|
|
75
|
+
# BROKEN runs with the guard entirely off, forever, with no signal -- while
|
|
76
|
+
# SKILL.md tells the agent the gate exists, so its own reasoning defers to a
|
|
77
|
+
# control that is not there.
|
|
78
|
+
#
|
|
79
|
+
# Detected by RESULT, not by `command -v`: a jq that is present and exits
|
|
80
|
+
# non-zero (wrong build, missing shared library, exec-format error) passes a
|
|
81
|
+
# presence check and then fails exactly like an absent one. The first revision
|
|
82
|
+
# of this branch used `command -v` and the suite caught it.
|
|
83
|
+
# Canonical kind map (#8205): Devin wire names → Claude kinds. Absent lib
|
|
84
|
+
# degrades to passthrough, preserving this hook's fail-open invariant.
|
|
85
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib/hook-tool-kind.sh" 2>/dev/null || true
|
|
86
|
+
if ! type hook_tool_kind >/dev/null 2>&1; then
|
|
87
|
+
hook_tool_kind() { printf '%s\n' "${1-}"; }
|
|
88
|
+
echo "WARN: hook-tool-kind.sh missing — kind gates degrade to raw-name passthrough (silent-off under Devin)" >&2
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
jq_rc=0
|
|
92
|
+
TOOL="$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)" || jq_rc=$?
|
|
93
|
+
if [[ $jq_rc -ne 0 ]]; then
|
|
94
|
+
if grep -qE 'agent-browser([[:space:]]+[^|;&]*)?[[:space:]]snapshot\b' <<<"$INPUT" 2>/dev/null \
|
|
95
|
+
&& ! grep -qF "$REDACTOR_ANCHOR" <<<"$INPUT" 2>/dev/null; then
|
|
96
|
+
printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"BLOCKED (degraded mode): jq is unusable on this machine (exit %s), so this hook cannot parse the tool envelope and fell back to a raw scan of stdin. That scan sees an unrouted `agent-browser snapshot`. Install a working jq, or route the snapshot through the redactor: %s"}}\n' "$jq_rc" "$REDACTOR_CMD"
|
|
97
|
+
fi
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# Both names reach this check: hooks.json binds `^(Bash|exec)$` — Claude Code's
|
|
102
|
+
# tool is `Bash`, Devin's is `exec`, and either envelope may arrive. The kind
|
|
103
|
+
# map normalizes `exec` → `Bash`; dropping it here would silently no-op the
|
|
104
|
+
# guard on exactly the surface the matcher was widened for.
|
|
105
|
+
[[ "$(hook_tool_kind "$TOOL")" == "Bash" ]] || exit 0
|
|
106
|
+
|
|
107
|
+
CMD="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null || true)"
|
|
108
|
+
[[ -z "$CMD" ]] && exit 0
|
|
109
|
+
|
|
110
|
+
# Split into sequential segments. A pipe is NOT a separator -- it is what carries
|
|
111
|
+
# a snapshot into the redactor, so it must stay inside the segment being judged.
|
|
112
|
+
#
|
|
113
|
+
# A bare `&` IS a separator, and omitting it was a live bypass: the whole command
|
|
114
|
+
# stayed one segment, the segment contained the anchor, and an unrouted second
|
|
115
|
+
# invocation rode through. ADR-213 and the Article 30 register both assert this
|
|
116
|
+
# guard is judged per shell segment, so that claim was false as written.
|
|
117
|
+
#
|
|
118
|
+
# `2>&1` is protected first -- its `&` is a redirect, not a separator, and the
|
|
119
|
+
# approved form depends on it.
|
|
120
|
+
# awk, not sed: `\n` in a sed REPLACEMENT and `\x01` in a sed pattern are GNU
|
|
121
|
+
# extensions. On BSD sed (the macOS default) the replacement emits a literal
|
|
122
|
+
# `n` and `\x01` matches a literal `x01`, so NOTHING SPLITS -- the whole command
|
|
123
|
+
# stays one segment, the anchor is found somewhere in it, and every chained
|
|
124
|
+
# bypass this splitter exists to catch is ALLOWED. The guard would have been
|
|
125
|
+
# silently inert on macOS while its suite passed on Linux, which is the same
|
|
126
|
+
# portability class as the `mapfile` defect already fixed here and the one the
|
|
127
|
+
# repo's own 2026-09-07 learning records for `\x1b`.
|
|
128
|
+
#
|
|
129
|
+
# In awk's gsub REPLACEMENT an unescaped `&` means "the matched text", so
|
|
130
|
+
# restoring the literal `>&` requires `\\&`. Getting that wrong silently
|
|
131
|
+
# doubles the redirect and was caught by the round-trip row in the suite.
|
|
132
|
+
SPLIT="$(printf '%s' "$CMD" | awk '
|
|
133
|
+
{ gsub(/>&/, "\001"); gsub(/&&|\|\||;|&/, "\n"); gsub(/\001/, ">\\&"); print }
|
|
134
|
+
')"
|
|
135
|
+
|
|
136
|
+
offending=0
|
|
137
|
+
reason_detail=''
|
|
138
|
+
while IFS= read -r seg; do
|
|
139
|
+
# HERESTRING throughout (#6992/#7024): `grep -q` on a PIPE can die of SIGPIPE
|
|
140
|
+
# under pipefail and read as "no match", which in a policy gate is fail-OPEN.
|
|
141
|
+
#
|
|
142
|
+
# `snapshot` is word-anchored, so `screenshot` is never caught here.
|
|
143
|
+
grep -qE 'agent-browser([[:space:]]+[^|;&]*)?[[:space:]]snapshot\b' <<<"$seg" 2>/dev/null || continue
|
|
144
|
+
|
|
145
|
+
# The allow-predicate is NOT "the anchor appears somewhere". Substring
|
|
146
|
+
# presence was satisfied by a trailing COMMENT, and by a `tee` that writes the
|
|
147
|
+
# unredacted tree to disk on its way to the redactor -- which is precisely the
|
|
148
|
+
# sink this hook's own deny text names.
|
|
149
|
+
if ! grep -qE '\|[^|]*'"$REDACTOR_ANCHOR" <<<"$seg" 2>/dev/null; then
|
|
150
|
+
offending=1
|
|
151
|
+
reason_detail='the redactor is not downstream of a pipe in this command'
|
|
152
|
+
break
|
|
153
|
+
fi
|
|
154
|
+
# Judge sinks on the segment UPSTREAM of the redactor only. A `tee` or a
|
|
155
|
+
# redirect AFTER the redactor writes redacted bytes and is harmless; one
|
|
156
|
+
# BEFORE it writes the raw tree, which is the sink this hook's deny text
|
|
157
|
+
# names. Scoping to the prefix is what makes the difference decidable --
|
|
158
|
+
# without it the legitimate `... | redactor > snap.txt` is denied while the
|
|
159
|
+
# question the check means to ask goes unasked.
|
|
160
|
+
pre="${seg%%"$REDACTOR_ANCHOR"*}"
|
|
161
|
+
|
|
162
|
+
if grep -qE '(^|[|[:space:]])tee([[:space:]]|$)' <<<"$pre" 2>/dev/null; then
|
|
163
|
+
offending=1
|
|
164
|
+
reason_detail='`tee` writes the UNREDACTED snapshot to disk before the redactor sees it'
|
|
165
|
+
break
|
|
166
|
+
fi
|
|
167
|
+
# A file redirect of the snapshot itself, e.g. `snapshot -i > raw.txt`.
|
|
168
|
+
#
|
|
169
|
+
# Match a `>` (optionally `>>`, optionally with a leading fd digit) that is
|
|
170
|
+
# NOT followed by `&`, so an fd duplication such as `2>&1` -- the approved
|
|
171
|
+
# form -- is allowed while a file sink is not. The previous
|
|
172
|
+
# `[^0-9<>]>[^&|]` form excluded a digit BEFORE the `>` and a `|` AFTER it,
|
|
173
|
+
# so `1>/tmp/leak.txt` and `>|/tmp/leak.txt` were both measured ALLOWED.
|
|
174
|
+
if grep -qE '[0-9]?>>?([^&>]|$)' <<<"$pre" 2>/dev/null; then
|
|
175
|
+
offending=1
|
|
176
|
+
reason_detail='this command redirects the snapshot to a file, which bypasses the redactor'
|
|
177
|
+
break
|
|
178
|
+
fi
|
|
179
|
+
done <<<"$SPLIT"
|
|
180
|
+
|
|
181
|
+
[[ $offending -eq 1 ]] || exit 0
|
|
182
|
+
|
|
183
|
+
reason="BLOCKED: this \`agent-browser snapshot\` is not routed through the credential redactor — ${reason_detail}.
|
|
184
|
+
|
|
185
|
+
An accessibility snapshot serializes the VALUE of input fields. A value you never typed — a password manager's autofill, a static \`value=\`, or a generated-credential panel — is rendered into the transcript and into any snapshot file written to disk. Nothing about the call looks credential-adjacent, which is why this is a gate and not a guideline (#7947).
|
|
186
|
+
|
|
187
|
+
Route it through the redactor:
|
|
188
|
+
|
|
189
|
+
agent-browser snapshot -i 2>&1 | ${REDACTOR_CMD}
|
|
190
|
+
|
|
191
|
+
Or take a screenshot instead, which is safe for a \`type=password\` field — the browser renders it as dots.
|
|
192
|
+
|
|
193
|
+
MEASURED CAVEAT, because the obvious advice is wrong here: a screenshot is NOT safe for a generated-credential panel (a readonly \`type=text\` box named \"Token\", \"API key\", …). The browser renders those in clear, so the screenshot leaks exactly as the snapshot does. On a page showing a freshly-minted credential, capture neither — read the value with \`agent-browser get value <sel>\` into a file and shred it.
|
|
194
|
+
|
|
195
|
+
The redactor is defense-in-depth on one sink. It does not make snapshotting a credential page safe: it cannot see a localised field name, a credential outside a text-input role, or a value split across segmented inputs."
|
|
196
|
+
|
|
197
|
+
jq -nc --arg r "$reason" \
|
|
198
|
+
'{hookSpecificOutput: {hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: $r}}' 2>/dev/null
|
|
199
|
+
|
|
200
|
+
exit 0
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
[[ -n "${CODEX_THREAD_ID:-}" || -n "${PLUGIN_ROOT:-}" ]] || exit 0
|
|
5
|
+
SOLEUR_PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
jq -n --arg root "$SOLEUR_PLUGIN_ROOT" \
|
|
7
|
+
--rawfile instructions "$SOLEUR_PLUGIN_ROOT/codex/INSTRUCTIONS.md" \
|
|
8
|
+
'{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext:
|
|
9
|
+
("Soleur plugin root: " + $root + "\n" + $instructions)}}'
|