@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,90 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# DEVIN_DIR is in the gate deliberately: it is the measured cloud-only marker
|
|
5
|
+
# (cloud-probe.md), so if a repo-level SessionStart registration ever fires on a
|
|
6
|
+
# cloud VM this hook must still write — the `hook_source=repo` sentinel is what
|
|
7
|
+
# makes the classifier's non-plugin-source arm discriminate.
|
|
8
|
+
[[ -n "${DEVIN:-}" || -n "${DEVIN_HOME:-}" || -n "${DEVIN_PROJECT_DIR:-}" || -n "${DEVIN_PLUGIN_ROOT:-}" || -n "${DEVIN_DIR:-}" ]] || exit 0
|
|
9
|
+
SOLEUR_PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
10
|
+
|
|
11
|
+
# --- Local-session sentinel (Soleur Cloud Mode, FR1) ---
|
|
12
|
+
# Content-bearing proof-of-local for scripts/cloud-detect.sh: SessionStart is the
|
|
13
|
+
# one plugin hook event documented absent in Devin Cloud, so a plugin-sourced
|
|
14
|
+
# sentinel on this host is what distinguishes a local Devin session. The write is
|
|
15
|
+
# UNCONDITIONAL under the Devin-env guard above — no plugins/soleur dir check:
|
|
16
|
+
# user repos consuming via requiredPlugins don't vendor the plugin dir, and a
|
|
17
|
+
# scope guard there would invert detection into permanent false-cloud.
|
|
18
|
+
#
|
|
19
|
+
# hook_source records which registration fired, because a repo-level SessionStart
|
|
20
|
+
# firing on a cloud VM writes a matching-host sentinel that must NOT classify
|
|
21
|
+
# local. Resolution order:
|
|
22
|
+
# 1. SOLEUR_HOOK_SOURCE env override (a registration may inject it explicitly)
|
|
23
|
+
# 2. CLAUDE_PLUGIN_ROOT set and resolving to this script's plugin root → plugin
|
|
24
|
+
# 3. otherwise → repo (the fail-safe direction for detection)
|
|
25
|
+
#
|
|
26
|
+
# The sentinel write runs BEFORE the jq emit: a jq-less minimal host must not
|
|
27
|
+
# lose proof-of-local because the context emit died first (the write block is
|
|
28
|
+
# already `|| true`-isolated; a jq failure below still exits non-zero but the
|
|
29
|
+
# sentinel survives).
|
|
30
|
+
#
|
|
31
|
+
# Canonical copy of test-helpers.sh's assert_fixture_dir — P1a requires every
|
|
32
|
+
# tracked copy be byte-equal, and the P1b scanner recognises ONLY this name.
|
|
33
|
+
assert_fixture_dir() {
|
|
34
|
+
case "${1-}" in
|
|
35
|
+
"") printf 'FATAL: fixture dir is EMPTY; git -C "" would operate on %s\n' "$PWD" >&2; exit 2 ;;
|
|
36
|
+
*/../*|*/..) printf 'FATAL: fixture dir %s contains ..; refusing\n' "$1" >&2; exit 2 ;;
|
|
37
|
+
/proc/*|/sys/*|/dev/*) printf 'FATAL: fixture dir %s is a synthetic-fs path; refusing\n' "$1" >&2; exit 2 ;;
|
|
38
|
+
/|//|/.) printf 'FATAL: fixture dir resolves to the filesystem root; refusing\n' >&2; exit 2 ;;
|
|
39
|
+
/*) : ;;
|
|
40
|
+
*) printf 'FATAL: fixture dir %s is RELATIVE; refusing\n' "$1" >&2; exit 2 ;;
|
|
41
|
+
esac
|
|
42
|
+
}
|
|
43
|
+
{
|
|
44
|
+
# An inherited GIT_DIR would aim rev-parse at a foreign repo and print the
|
|
45
|
+
# cwd-derived toplevel (e.g. `/` — which passes the absolute check below and
|
|
46
|
+
# would mint `/.devin` on a uid-0 host). Same scrub list as the bare-root arms.
|
|
47
|
+
unset GIT_DIR GIT_WORK_TREE GIT_COMMON_DIR GIT_INDEX_FILE GIT_OBJECT_DIRECTORY \
|
|
48
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE
|
|
49
|
+
_sentinel_root="$(git rev-parse --show-toplevel 2>/dev/null)" && \
|
|
50
|
+
# Guard: a non-empty ABSOLUTE path is required before any write — a relative or
|
|
51
|
+
# pathological toplevel (or a scrubbed-env empty) degrades to context-only;
|
|
52
|
+
# a bare-root session emits context only (#10392 audit).
|
|
53
|
+
[[ -n "$_sentinel_root" && "$_sentinel_root" == /* ]] && \
|
|
54
|
+
_sentinel_source="${SOLEUR_HOOK_SOURCE:-}" && \
|
|
55
|
+
if [[ -z "$_sentinel_source" ]]; then
|
|
56
|
+
_sentinel_source="repo"
|
|
57
|
+
if [[ -n "${CLAUDE_PLUGIN_ROOT:-}" ]] && \
|
|
58
|
+
[[ "$(cd "${CLAUDE_PLUGIN_ROOT}" 2>/dev/null && pwd)" == "$SOLEUR_PLUGIN_ROOT" ]]; then
|
|
59
|
+
_sentinel_source="plugin"
|
|
60
|
+
fi
|
|
61
|
+
fi && \
|
|
62
|
+
mkdir -p "$_sentinel_root/.devin" && \
|
|
63
|
+
_sentinel="$_sentinel_root/.devin/soleur-local-session" && \
|
|
64
|
+
# Single live registration (plugin hooks.json `""` — source matchers are
|
|
65
|
+
# dead under Devin, measured envelope-capture §3). The repo-source arm still
|
|
66
|
+
# matters: if a repo-level SessionStart registration ever fires on a cloud
|
|
67
|
+
# VM, its `repo` write must not mask an existing plugin-sourced sentinel on
|
|
68
|
+
# this host — that sentinel is proof-of-local, and masking it reads as
|
|
69
|
+
# permanent false-cloud.
|
|
70
|
+
if [[ "$_sentinel_source" == "repo" && -f "$_sentinel" ]] && \
|
|
71
|
+
grep -q '"hook_source"[[:space:]]*:[[:space:]]*"plugin"' "$_sentinel" 2>/dev/null; then
|
|
72
|
+
:
|
|
73
|
+
else
|
|
74
|
+
# ts is forensic-only (written for debugging; the classifier does not
|
|
75
|
+
# enforce freshness — a stale same-host sentinel is a documented limit).
|
|
76
|
+
# SOLEUR_HOOK_SOURCE is self-reported under the trusted-agent threat model —
|
|
77
|
+
# an env-forged `plugin` on a cloud VM still fails closed at the
|
|
78
|
+
# classifier's conflicting-evidence arm (DEVIN_DIR is set there).
|
|
79
|
+
assert_fixture_dir "$_sentinel" && \
|
|
80
|
+
printf '{"host":"%s","ts":"%s","hook_source":"%s"}\n' \
|
|
81
|
+
"$(hostname)" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$_sentinel_source" \
|
|
82
|
+
> "$_sentinel.tmp" && \
|
|
83
|
+
mv "$_sentinel.tmp" "$_sentinel"
|
|
84
|
+
fi
|
|
85
|
+
} || true
|
|
86
|
+
|
|
87
|
+
jq -n --arg root "$SOLEUR_PLUGIN_ROOT" \
|
|
88
|
+
--rawfile instructions "$SOLEUR_PLUGIN_ROOT/devin/INSTRUCTIONS.md" \
|
|
89
|
+
'{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext:
|
|
90
|
+
("Soleur plugin root: " + $root + "\n" + $instructions)}}'
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ext-filter-detect.sh — SessionStart (matcher: startup|resume|clear|compact) external
|
|
3
|
+
# output-filter detector (#10230). Emits ONE JSON object on stdout — detected tools
|
|
4
|
+
# become newline-joined marker lines inside it (single-document stdout; sibling hooks
|
|
5
|
+
# all emit exactly one object):
|
|
6
|
+
# {"systemMessage": "SOLEUR_EXT_FILTER tool=<t> version=<v> posture=<p>
|
|
7
|
+
# via=on-path|settings-hook|proxy-env measured_at=<date|-> [path=<settings>] ref=soleur.ai/known-external-tools"}
|
|
8
|
+
# and `SOLEUR_EXT_FILTER tool=none` when nothing is detected — so "hook dead" is
|
|
9
|
+
# distinguishable from "no filter" (the same liveness argument compaction-state.sh
|
|
10
|
+
# makes for SOLEUR_COMPACTION_SKIPPED). systemMessage costs zero model tokens; this is
|
|
11
|
+
# an operator-facing line, never additionalContext.
|
|
12
|
+
#
|
|
13
|
+
# Marker semantics (the marker is a per-session public claim — key=value only, never
|
|
14
|
+
# editorial prose; severity lives in docs/pages/known-external-tools.md):
|
|
15
|
+
# posture=unmeasured the divergence harness has NOT run against this tool
|
|
16
|
+
# — explicitly not an assurance
|
|
17
|
+
# posture=literal-clean gate literals survived the divergence corpus (rtk, only
|
|
18
|
+
# after the Phase-3 measurement lands — see POSTURE_RTK below)
|
|
19
|
+
# posture=measured-incompatible gate-literal divergence measured (headroom; only when the
|
|
20
|
+
# detected version is <= the evaluated version and identity
|
|
21
|
+
# is corroborated — never on a bare basename PATH hit, which
|
|
22
|
+
# could be an unrelated `headroom`)
|
|
23
|
+
# tool=proxy posture=unknown ANTHROPIC_BASE_URL points at a non-default endpoint; a
|
|
24
|
+
# generic proxy (LiteLLM/Helicone/corporate) must NEVER be
|
|
25
|
+
# emitted under a vendor name
|
|
26
|
+
# version=unknown version probe failed -> posture floors at unmeasured
|
|
27
|
+
#
|
|
28
|
+
# Skips silently (exit 0, no output) when CLAUDE_PLUGIN_ROOT is unset, on the non-Claude
|
|
29
|
+
# harness markers version-banner.sh uses (CODEX_THREAD_ID, PLUGIN_ROOT), and when
|
|
30
|
+
# SOLEUR_DISABLE_EXT_FILTER_DETECT=1. The marker is Claude-Code-only by design — a Devin
|
|
31
|
+
# or other-harness session has no marker and that does NOT mean "no filter" (the doc's
|
|
32
|
+
# three-rung diagnostic has a manual path for those).
|
|
33
|
+
#
|
|
34
|
+
# Fails open: every path exits 0 and any error prints nothing. Plugin hooks are GLOBAL
|
|
35
|
+
# (they fire in every project), so a hook that errors or hangs would hit every session;
|
|
36
|
+
# the stdin read and every version probe are bounded.
|
|
37
|
+
|
|
38
|
+
[[ "${SOLEUR_DISABLE_EXT_FILTER_DETECT-}" == "1" ]] && exit 0
|
|
39
|
+
set -uo pipefail
|
|
40
|
+
case "$-" in
|
|
41
|
+
*x*) printf '[FATAL] refusing to run under xtrace: this script emits marker text and -x would echo it (see #7797)\n' >&2; exit 78 ;;
|
|
42
|
+
esac
|
|
43
|
+
trap 'exit 0' EXIT
|
|
44
|
+
|
|
45
|
+
# --- posture constants (the Phase-3 conjunctive evidence gate flips POSTURE_RTK in the
|
|
46
|
+
# same commit that lands ext-filter-divergence-report.md; a failed or un-run gate keeps
|
|
47
|
+
# `unmeasured` — the marker never asserts an unmeasured claim) ---------------------------
|
|
48
|
+
POSTURE_RTK="unmeasured" # -> "literal-clean" only after ext-filter-divergence.sh proves zero gate-literal divergence on an rtk-present host
|
|
49
|
+
POSTURE_HEADROOM="measured-incompatible"
|
|
50
|
+
HEADROOM_EVAL_VERSION="0.37.0" # the measured ceiling: claims apply at or below this version
|
|
51
|
+
HEADROOM_MEASURED_AT="2026-09-07" # archived eval date (specs/archive/…headroom-token-compression-eval)
|
|
52
|
+
RTK_MEASURED_AT="-" # the Phase-3 report's date once measured
|
|
53
|
+
|
|
54
|
+
trace() { [[ "${SOLEUR_HOOK_TRACE-}" == "1" ]] && printf 'ext-filter-detect: %s\n' "$*" >&2; return 0; }
|
|
55
|
+
|
|
56
|
+
json_escape() {
|
|
57
|
+
local s="$1"
|
|
58
|
+
s="${s//\\/\\\\}"
|
|
59
|
+
s="${s//\"/\\\"}"
|
|
60
|
+
s="${s//$'\n'/ }"
|
|
61
|
+
s="${s//$'\r'/ }"
|
|
62
|
+
s="${s//$'\t'/ }"
|
|
63
|
+
printf '%s' "$s"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
MARKERS=()
|
|
67
|
+
emit() { # <marker fields...> -> append a marker line; flushed as ONE systemMessage object
|
|
68
|
+
# (every sibling SessionStart hook emits a single JSON document; N top-level objects
|
|
69
|
+
# risks first-object-only parsing dropping co-detection markers, or a plain-text
|
|
70
|
+
# fallback landing them in model context — one object, newline-joined markers)
|
|
71
|
+
MARKERS+=("SOLEUR_EXT_FILTER $*")
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
flush_markers() {
|
|
75
|
+
((${#MARKERS[@]})) || return 0
|
|
76
|
+
local joined
|
|
77
|
+
joined="$(printf '%s\n' "${MARKERS[@]}")"
|
|
78
|
+
printf '{"systemMessage": "%s"}\n' "$(json_escape "$joined")"
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# version_probe <tool> -> last field of `<tool> --version`'s first line, "unknown" on any failure.
|
|
82
|
+
version_probe() {
|
|
83
|
+
local out
|
|
84
|
+
out="$(timeout 2 "$1" --version 2>/dev/null | head -1 | awk '{print $NF}')"
|
|
85
|
+
if [[ "$out" =~ ^v?[0-9]+\.[0-9]+ ]]; then printf '%s' "${out#v}"; else printf 'unknown'; fi
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# ver_le a b -> 0 iff version a <= version b (dotted numerics). Pure bash — `sort -V`
|
|
89
|
+
# is GNU-only and its absence silently withholds a measured-incompatible warning.
|
|
90
|
+
ver_le() {
|
|
91
|
+
[[ "$1" =~ ^[0-9]+\.[0-9]+ ]] || return 1
|
|
92
|
+
local a1 a2 a3 b1 b2 b3
|
|
93
|
+
IFS=. read -r a1 a2 a3 <<<"$1"; IFS=. read -r b1 b2 b3 <<<"$2"
|
|
94
|
+
a3="${a3%%[^0-9]*}"; b3="${b3%%[^0-9]*}"
|
|
95
|
+
(( 10#${a1:-0} != 10#${b1:-0} )) && { (( 10#${a1:-0} < 10#${b1:-0} )); return; }
|
|
96
|
+
(( 10#${a2:-0} != 10#${b2:-0} )) && { (( 10#${a2:-0} < 10#${b2:-0} )); return; }
|
|
97
|
+
(( 10#${a3:-0} <= 10#${b3:-0} ))
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
# settings_hit <tool> -> prints the tilde-collapsed settings file that wires <tool> into
|
|
101
|
+
# Claude hooks (a "command" entry naming it — a bare mention is not wiring), or nothing.
|
|
102
|
+
# HOME- and cwd-level files; cwd arrives via CWD_CLAUDE dynamic scope.
|
|
103
|
+
settings_hit() {
|
|
104
|
+
local tool="$1" f
|
|
105
|
+
for f in ${HOME:+"$HOME/.claude/settings.json" "$HOME/.claude/settings.local.json"} \
|
|
106
|
+
${CWD_CLAUDE:+"$CWD_CLAUDE/settings.json" "$CWD_CLAUDE/settings.local.json"}; do
|
|
107
|
+
[[ -r "$f" ]] || continue
|
|
108
|
+
if grep -l '"hooks"' "$f" >/dev/null 2>&1 && grep -lE '"command"[^,}]*'"$tool" "$f" >/dev/null 2>&1; then
|
|
109
|
+
case "$f" in "${HOME:-}"/*) printf '~%s' "${f#"$HOME"}" ;; *) printf '%s' "${f// /%20}" ;; esac
|
|
110
|
+
return 0
|
|
111
|
+
fi
|
|
112
|
+
done
|
|
113
|
+
return 1
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
CWD_CLAUDE=""
|
|
117
|
+
main() {
|
|
118
|
+
# --self-test bypasses the env gates: it exists for operator/agent discoverability
|
|
119
|
+
# ("run the hook, see the marker"), which is exactly when CLAUDE_PLUGIN_ROOT is absent.
|
|
120
|
+
local selftest=0
|
|
121
|
+
if [[ "${1:-}" == "--self-test" ]]; then selftest=1; shift; fi
|
|
122
|
+
(( selftest )) || [[ -n "${CLAUDE_PLUGIN_ROOT:-}" ]] || return 0
|
|
123
|
+
(( selftest )) || { [[ -n "${CODEX_THREAD_ID:-}" || -n "${PLUGIN_ROOT:-}" ]] && return 0; }
|
|
124
|
+
|
|
125
|
+
# Bounded stdin read for the envelope's cwd (a hook that hangs at SessionStart is worse
|
|
126
|
+
# than a crashed one — compaction-state.sh:123-129). Absent or malformed: no cwd arm.
|
|
127
|
+
local envelope=""
|
|
128
|
+
envelope="$(timeout 5 cat 2>/dev/null || true)"
|
|
129
|
+
local cwd
|
|
130
|
+
cwd="$(printf '%s' "$envelope" | grep -o '"cwd"[^,}]*' | head -1 | cut -d'"' -f4)"
|
|
131
|
+
[[ -n "$cwd" && -d "$cwd/.claude" ]] && CWD_CLAUDE="$cwd/.claude"
|
|
132
|
+
trace "cwd=$cwd CWD_CLAUDE=$CWD_CLAUDE"
|
|
133
|
+
|
|
134
|
+
local found=0 tool ver via posture m_at s_hit
|
|
135
|
+
|
|
136
|
+
# --- proxy arm: a non-default ANTHROPIC_BASE_URL emits the NEUTRAL marker, never a
|
|
137
|
+
# named vendor claim — a LiteLLM/Helicone/corporate proxy is the user's own infra.
|
|
138
|
+
case "${ANTHROPIC_BASE_URL:-}" in
|
|
139
|
+
""|https://api.anthropic.com|https://api.anthropic.com/) : ;;
|
|
140
|
+
*) emit "tool=proxy posture=unknown via=proxy-env measured_at=- ref=soleur.ai/known-external-tools"; found=1 ;;
|
|
141
|
+
esac
|
|
142
|
+
|
|
143
|
+
for tool in rtk headroom; do
|
|
144
|
+
via=""; s_hit=""
|
|
145
|
+
command -v "$tool" >/dev/null 2>&1 && via="on-path"
|
|
146
|
+
s_hit="$(settings_hit "$tool")" && via="${via:+$via,}settings-hook"
|
|
147
|
+
[[ -n "$via" ]] || continue
|
|
148
|
+
found=1
|
|
149
|
+
ver="$(version_probe "$tool")"
|
|
150
|
+
case "$tool" in
|
|
151
|
+
rtk)
|
|
152
|
+
# a named posture requires corroboration AND a resolved version; a bare PATH
|
|
153
|
+
# basename hit is unmeasured by construction.
|
|
154
|
+
if [[ "$via" == *settings-hook* && "$ver" != unknown ]]; then posture="$POSTURE_RTK"; else posture="unmeasured"; fi
|
|
155
|
+
m_at="$RTK_MEASURED_AT" ;;
|
|
156
|
+
headroom)
|
|
157
|
+
if [[ "$via" == *settings-hook* && "$ver" != unknown ]] && ver_le "$ver" "$HEADROOM_EVAL_VERSION"; then
|
|
158
|
+
posture="$POSTURE_HEADROOM"; m_at="$HEADROOM_MEASURED_AT"
|
|
159
|
+
else
|
|
160
|
+
posture="unmeasured"; m_at="-"
|
|
161
|
+
fi ;;
|
|
162
|
+
esac
|
|
163
|
+
emit "tool=$tool version=$ver posture=$posture via=$via measured_at=$m_at${s_hit:+ path=${s_hit// /%20}} ref=soleur.ai/known-external-tools"
|
|
164
|
+
done
|
|
165
|
+
|
|
166
|
+
(( found )) || emit "tool=none ref=soleur.ai/known-external-tools"
|
|
167
|
+
flush_markers
|
|
168
|
+
return 0
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
main "$@"
|
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Soleur plugin hooks",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "^(Bash|exec)$",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/browser-snapshot-credential-guard.sh"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"matcher": "^(Bash|Monitor|Write|Edit|MultiEdit|NotebookEdit)$",
|
|
16
|
+
"hooks": [
|
|
17
|
+
{
|
|
18
|
+
"type": "command",
|
|
19
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/operator-stage-approval.sh",
|
|
20
|
+
"timeout": 10
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"matcher": "^Bash$",
|
|
26
|
+
"hooks": [
|
|
27
|
+
{
|
|
28
|
+
"type": "command",
|
|
29
|
+
"command": "bash \"${CLAUDE_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 \"${CLAUDE_PLUGIN_ROOT}/hooks/codex-session-start.sh\""
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"matcher": "",
|
|
47
|
+
"hooks": [
|
|
48
|
+
{
|
|
49
|
+
"type": "command",
|
|
50
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/devin-session-start.sh\""
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"matcher": "",
|
|
56
|
+
"hooks": [
|
|
57
|
+
{
|
|
58
|
+
"type": "command",
|
|
59
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/bare-root-cwd-guard.sh\"",
|
|
60
|
+
"timeout": 10
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"matcher": "startup",
|
|
66
|
+
"hooks": [
|
|
67
|
+
{
|
|
68
|
+
"type": "command",
|
|
69
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/welcome-hook.sh"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"matcher": "startup",
|
|
75
|
+
"hooks": [
|
|
76
|
+
{
|
|
77
|
+
"type": "command",
|
|
78
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/version-banner.sh\"",
|
|
79
|
+
"timeout": 10
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"matcher": "startup|resume|clear|compact",
|
|
85
|
+
"hooks": [
|
|
86
|
+
{
|
|
87
|
+
"type": "command",
|
|
88
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/compaction-state.sh\""
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"matcher": "startup|resume|clear|compact",
|
|
94
|
+
"hooks": [
|
|
95
|
+
{
|
|
96
|
+
"type": "command",
|
|
97
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/ext-filter-detect.sh\"",
|
|
98
|
+
"timeout": 10
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"Stop": [
|
|
104
|
+
{
|
|
105
|
+
"hooks": [
|
|
106
|
+
{
|
|
107
|
+
"type": "command",
|
|
108
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh"
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"hooks": [
|
|
114
|
+
{
|
|
115
|
+
"type": "command",
|
|
116
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/unkept-promise-hook.sh"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"PreCompact": [
|
|
122
|
+
{
|
|
123
|
+
"matcher": "manual|auto",
|
|
124
|
+
"hooks": [
|
|
125
|
+
{
|
|
126
|
+
"type": "command",
|
|
127
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/compaction-state.sh\""
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Canonical Devin→Claude tool-kind map (issue #8205) — PLUGIN COPY.
|
|
3
|
+
#
|
|
4
|
+
# Plugin hooks run in projects that may not carry this repo's
|
|
5
|
+
# .claude/hooks/lib/, so the map is duplicated here. Pinned against the
|
|
6
|
+
# canonical map by .claude/hooks/hook-tool-kind.test.sh — update both or
|
|
7
|
+
# neither. multi_edit/notebook_edit/apply_patch are probed-absent from Devin's
|
|
8
|
+
# vocabulary (envelope-capture §7) — speculative passthroughs; re-probe before
|
|
9
|
+
# relying on them.
|
|
10
|
+
|
|
11
|
+
hook_tool_kind() {
|
|
12
|
+
case "${1-}" in
|
|
13
|
+
exec) printf '%s\n' "Bash" ;;
|
|
14
|
+
write) printf '%s\n' "Write" ;;
|
|
15
|
+
edit) printf '%s\n' "Edit" ;;
|
|
16
|
+
multi_edit) printf '%s\n' "MultiEdit" ;;
|
|
17
|
+
notebook_edit) printf '%s\n' "NotebookEdit" ;;
|
|
18
|
+
apply_patch) printf '%s\n' "Write" ;;
|
|
19
|
+
ask_user_question) printf '%s\n' "AskUserQuestion" ;;
|
|
20
|
+
run_subagent) printf '%s\n' "Agent" ;;
|
|
21
|
+
skill) printf '%s\n' "Skill" ;;
|
|
22
|
+
*) printf '%s\n' "${1-}" ;;
|
|
23
|
+
esac
|
|
24
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# log-rotation.sh — sourced helper for .claude/.*.jsonl rotation.
|
|
3
|
+
#
|
|
4
|
+
# Single source of truth for rotating telemetry sinks under .claude/. Called
|
|
5
|
+
# at write time from each emitter (incidents.sh::emit_incident,
|
|
6
|
+
# skill-invocation-logger.sh, agent-token-tee.sh) so growth is bounded on
|
|
7
|
+
# every operator's machine — not only when the weekly aggregator runs.
|
|
8
|
+
#
|
|
9
|
+
# Source from a hook via:
|
|
10
|
+
# source "$(dirname "${BASH_SOURCE[0]}")/lib/log-rotation.sh"
|
|
11
|
+
#
|
|
12
|
+
# Strategy: copy-then-truncate-in-place (NOT atomic-rename). Mirrors the
|
|
13
|
+
# pattern at scripts/rule-metrics-aggregate.sh:291-295. The rationale is
|
|
14
|
+
# concurrency-correctness: writers identify the file by PATH and use `>>$file`
|
|
15
|
+
# (open for append). flock advisories are inode-bound. A `mv $active →
|
|
16
|
+
# $archive.tmp; : > $active` inside the flock would let a writer that opens
|
|
17
|
+
# `>>$file` between the mv and its own flock acquire end up locking a DIFFERENT
|
|
18
|
+
# inode (the freshly-created post-truncate file) than the rotator's open fd.
|
|
19
|
+
# Two writers, two inodes, two flocks — torn writes return.
|
|
20
|
+
#
|
|
21
|
+
# Copy-then-truncate keeps the same inode throughout; readers/writers always
|
|
22
|
+
# converge on the same inode and the lock semantics hold.
|
|
23
|
+
#
|
|
24
|
+
# Public API:
|
|
25
|
+
# rotate_if_needed <jsonl-path> [size-bytes] [age-days]
|
|
26
|
+
#
|
|
27
|
+
# The caller MUST pass a canonicalized absolute path (cd -P / pwd -P resolved)
|
|
28
|
+
# so flock targets the same inode as concurrent writers on the same logical
|
|
29
|
+
# file. All three production callers (incidents.sh, skill-invocation-logger.sh,
|
|
30
|
+
# agent-token-tee.sh) canonicalize their repo-root via `cd -P + pwd -P` —
|
|
31
|
+
# follow that pattern in any new caller. `stat` and the cat redirect both use
|
|
32
|
+
# `-L`/path-following semantics so a symlinked sink rotates on the target's
|
|
33
|
+
# size/mtime rather than the link's metadata.
|
|
34
|
+
#
|
|
35
|
+
# Defaults:
|
|
36
|
+
# size-bytes = $LOG_ROTATION_SIZE_BYTES (or 5 MB)
|
|
37
|
+
# age-days = $LOG_ROTATION_AGE_DAYS (or 30)
|
|
38
|
+
# timeout = $LOG_ROTATION_FLOCK_TIMEOUT_S (or 5)
|
|
39
|
+
#
|
|
40
|
+
# Kill-switch: LOG_ROTATION_DISABLE=1 short-circuits before any work.
|
|
41
|
+
# Test override: LOG_ROTATION_UNIQ_SUFFIX overrides the collision suffix.
|
|
42
|
+
#
|
|
43
|
+
# Exit codes:
|
|
44
|
+
# 0 — no-op (below threshold, missing file, kill-switch, lock-acquire
|
|
45
|
+
# timeout) OR a successful rotation. Existing fire-and-forget callers
|
|
46
|
+
# using `|| true` swallow this either way.
|
|
47
|
+
# 1 — archive-write failure (disk-full, permission-denied). The active file
|
|
48
|
+
# is preserved intact (truncate gated on cat success), the partial
|
|
49
|
+
# archive is removed, and ONE stderr warning is emitted per process
|
|
50
|
+
# (rate-limited via /tmp/log-rotation-warned-$$ — mirrors the pattern
|
|
51
|
+
# at incidents.sh:130-138).
|
|
52
|
+
#
|
|
53
|
+
# Sentinel-aware callers (issue #3509) branch on the non-zero return to emit
|
|
54
|
+
# a `rotation_fail` drop sentinel before falling through to the data write:
|
|
55
|
+
# if ! rotate_if_needed "$file"; then
|
|
56
|
+
# _emit_drop_sentinel "$file" "$HOOK_EVENT_LITERAL" rotation_fail
|
|
57
|
+
# fi
|
|
58
|
+
|
|
59
|
+
# Source session-state.sh (idempotent guard inside it). Used for
|
|
60
|
+
# headless_or_stderr — routes warns to a log file under `claude --bg` and to
|
|
61
|
+
# stderr foreground. Fallback to plain stderr echo when missing (legacy
|
|
62
|
+
# worktrees).
|
|
63
|
+
# shellcheck source=../../../plugins/soleur/scripts/lib/session-state.sh
|
|
64
|
+
source "$(dirname "${BASH_SOURCE[0]}")/../../../plugins/soleur/scripts/lib/session-state.sh" 2>/dev/null || true
|
|
65
|
+
if ! declare -f headless_or_stderr >/dev/null; then
|
|
66
|
+
headless_or_stderr() { echo "[$1] $2" >&2; }
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
LOG_ROTATION_SIZE_BYTES_DEFAULT=$((5 * 1024 * 1024)) # 5 MB
|
|
70
|
+
LOG_ROTATION_AGE_DAYS_DEFAULT=30
|
|
71
|
+
LOG_ROTATION_FLOCK_TIMEOUT_S_DEFAULT=5
|
|
72
|
+
|
|
73
|
+
rotate_if_needed() {
|
|
74
|
+
[[ "${LOG_ROTATION_DISABLE:-}" == "1" ]] && return 0
|
|
75
|
+
|
|
76
|
+
local active="${1:-}"
|
|
77
|
+
[[ -z "$active" ]] && return 0
|
|
78
|
+
[[ -f "$active" ]] || return 0
|
|
79
|
+
[[ -s "$active" ]] || return 0 # empty — no rotation regardless of mtime
|
|
80
|
+
|
|
81
|
+
local size_threshold="${2:-${LOG_ROTATION_SIZE_BYTES:-$LOG_ROTATION_SIZE_BYTES_DEFAULT}}"
|
|
82
|
+
local age_threshold_days="${3:-${LOG_ROTATION_AGE_DAYS:-$LOG_ROTATION_AGE_DAYS_DEFAULT}}"
|
|
83
|
+
local timeout_s="${LOG_ROTATION_FLOCK_TIMEOUT_S:-$LOG_ROTATION_FLOCK_TIMEOUT_S_DEFAULT}"
|
|
84
|
+
|
|
85
|
+
# Pre-check (cheap, no lock): >99% of calls exit here.
|
|
86
|
+
# `stat -L` dereferences symlinks so a relocated sink (operator-symlinked to
|
|
87
|
+
# tmpfs / larger volume) rotates on the target's size/mtime, not the link's.
|
|
88
|
+
local size mtime now age_seconds age_threshold_seconds
|
|
89
|
+
read -r size mtime < <(stat -L -c "%s %Y" "$active" 2>/dev/null) || return 0
|
|
90
|
+
now=$(date -u +%s 2>/dev/null) || return 0
|
|
91
|
+
age_seconds=$(( now - mtime ))
|
|
92
|
+
age_threshold_seconds=$(( age_threshold_days * 86400 ))
|
|
93
|
+
if (( size <= size_threshold )) && (( age_seconds <= age_threshold_seconds )); then
|
|
94
|
+
return 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# Compute archive path BEFORE entering flock subshell. Subshell variable
|
|
98
|
+
# reassignments do not propagate back (precedent at
|
|
99
|
+
# rule-metrics-aggregate.sh:288 — same hazard). An already-rotated `.gz`
|
|
100
|
+
# or a lingering uncompressed file from a mid-run crash both count as
|
|
101
|
+
# "already exists"; we append a uniquify suffix rather than clobbering.
|
|
102
|
+
local dir base ts archive suffix
|
|
103
|
+
dir=$(dirname "$active")
|
|
104
|
+
base=$(basename "$active" .jsonl)
|
|
105
|
+
ts=$(date -u +%Y-%m 2>/dev/null) || return 0
|
|
106
|
+
archive="$dir/${base}-${ts}.jsonl"
|
|
107
|
+
if [[ -f "${archive}.gz" || -f "$archive" ]]; then
|
|
108
|
+
suffix="${LOG_ROTATION_UNIQ_SUFFIX:-$(date -u +%H%M%S%N)}"
|
|
109
|
+
archive="$dir/${base}-${ts}-${suffix}.jsonl"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# Acquire flock + re-check + copy-then-truncate. flock fd 9 against $active
|
|
113
|
+
# — same inode the writers use for their own flock. -w timeout matches the
|
|
114
|
+
# agent-token-tee.sh / aggregator precedent. On timeout: skip this round;
|
|
115
|
+
# the next call will rotate. We use exit-code 10 as a 1-bit signal channel
|
|
116
|
+
# ("rotated successfully") since subshell variable reassignments cannot
|
|
117
|
+
# propagate to the outer scope.
|
|
118
|
+
# The subshell exits 0 (no-op) or 10 (rotated). The non-zero exit-10 is a
|
|
119
|
+
# signal channel — caller-side `set -e` would otherwise treat it as an
|
|
120
|
+
# error, so we capture via `|| rotated=$?` (conditional context — set -e
|
|
121
|
+
# does not trigger on the LHS).
|
|
122
|
+
local rotated=0
|
|
123
|
+
# SC2094 disable: the flock-against-self pattern (`9>>"$active"`) opens fd 9
|
|
124
|
+
# against the file the body reads via `cat "$active"`. This is intentional —
|
|
125
|
+
# flock advisories are inode-bound, so the writer's flock and the rotator's
|
|
126
|
+
# flock must target the same inode for them to interlock. Same pattern as
|
|
127
|
+
# scripts/rule-metrics-aggregate.sh:291-295.
|
|
128
|
+
# shellcheck disable=SC2094
|
|
129
|
+
(
|
|
130
|
+
if ! flock -w "$timeout_s" -x 9; then
|
|
131
|
+
exit 0
|
|
132
|
+
fi
|
|
133
|
+
# Re-check inside lock (TOCTOU defense — a peer writer may have rotated
|
|
134
|
+
# between our pre-check and our acquire). `stat -L` parity with the
|
|
135
|
+
# outer pre-check.
|
|
136
|
+
local s2 m2 now2 age2
|
|
137
|
+
read -r s2 m2 < <(stat -L -c "%s %Y" "$active" 2>/dev/null) || exit 0
|
|
138
|
+
now2=$(date -u +%s 2>/dev/null) || exit 0
|
|
139
|
+
age2=$(( now2 - m2 ))
|
|
140
|
+
if (( s2 <= size_threshold )) && (( age2 <= age_threshold_seconds )); then
|
|
141
|
+
exit 0
|
|
142
|
+
fi
|
|
143
|
+
# Copy first, truncate only on success. Preserves data on disk-full / OOM:
|
|
144
|
+
# if cat fails, $active stays intact and the next call retries. We exit 11
|
|
145
|
+
# to signal "rotation attempted but archive write failed" so the outer
|
|
146
|
+
# scope can emit a one-shot warn AND clean up any partial archive bytes.
|
|
147
|
+
if cat "$active" >> "$archive" 2>/dev/null; then
|
|
148
|
+
: > "$active"
|
|
149
|
+
exit 10
|
|
150
|
+
fi
|
|
151
|
+
exit 11
|
|
152
|
+
) 9>>"$active" 2>/dev/null || rotated=$?
|
|
153
|
+
|
|
154
|
+
case "$rotated" in
|
|
155
|
+
10)
|
|
156
|
+
# gzip outside the lock — concurrent writers don't wait on compression.
|
|
157
|
+
# Failure leaves the .jsonl archive intact, readable by aggregators.
|
|
158
|
+
gzip -f "$archive" 2>/dev/null || true
|
|
159
|
+
;;
|
|
160
|
+
11)
|
|
161
|
+
# Archive write failed mid-copy. Clean up the partial archive so the
|
|
162
|
+
# next attempt starts clean (otherwise the collision-suffix branch fires
|
|
163
|
+
# and orphans the partial forever). Then warn ONCE per process via the
|
|
164
|
+
# marker pattern at incidents.sh:130-138, and signal the failure to
|
|
165
|
+
# sentinel-aware callers via a non-zero return (issue #3509).
|
|
166
|
+
rm -f "$archive" 2>/dev/null || true
|
|
167
|
+
local _log_rotation_warned_marker="/tmp/log-rotation-warned-$$"
|
|
168
|
+
if [[ ! -f "$_log_rotation_warned_marker" ]]; then
|
|
169
|
+
SOLEUR_HOOK_NAME="log-rotation" headless_or_stderr warn "failed to archive $active (disk full? permissions?)"
|
|
170
|
+
: > "$_log_rotation_warned_marker" 2>/dev/null || true
|
|
171
|
+
fi
|
|
172
|
+
return 1
|
|
173
|
+
;;
|
|
174
|
+
esac
|
|
175
|
+
return 0
|
|
176
|
+
}
|