@soleur/opencode 0.0.0-stage → 1.0.0
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 +659 -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 +108 -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 +342 -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 +152 -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 +493 -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 +363 -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 +520 -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 +113 -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 +178 -0
- package/scripts/sync-opencode-adapter.ts +479 -0
- package/scripts/sync-pr-behind.sh +534 -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 +65 -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 +142 -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 +118 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -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 +668 -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 +325 -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 +138 -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 +1621 -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-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +95 -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 +3022 -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/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/detached-battery-verdict.md +13 -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 +149 -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/work/SKILL.md +1479 -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,287 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: operator-digest
|
|
3
|
+
description: "This skill should be used when generating the operator's weekly private comprehension digest: reading merged PRs, expenses, resolved incidents, and open action-required issues, then writing a plain-language digest.md without posting."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- soleur-cloud-mode:start -->
|
|
7
|
+
**Cloud Mode (Devin):** before pipeline work run `bash "${CLAUDE_PLUGIN_ROOT}/scripts/cloud-detect.sh"`. If `CLAUDE_PLUGIN_ROOT` is unset (cloud exec shells do not export it), resolve the root by IDENTITY, never by script basename: for `d` in `"$HOME/.local/share/devin/cli/plugins/cache"` and `/opt/.devin/plugins`, skip unless `[ -d "$d" ]`, then `MANIFEST="$(find "$d" -path '*/.claude-plugin/plugin.json' -exec grep -l '"name"[[:space:]]*:[[:space:]]*"soleur"' {} + 2>/dev/null | head -1)"`, `ROOT="${MANIFEST%/.claude-plugin/plugin.json}"` — one resolution, two consumers: `$ROOT/scripts/cloud-detect.sh` and `$ROOT/scripts/precommit-guard.sh`. (Shape check, not authentication: a planted `{"name":"soleur"}` dir passes — ADR-179 A11.) `local` or `not-local:no-devin-env` proceeds normally; any other `not-local:<reason>` applies `<plugin-root>/devin/INSTRUCTIONS.md` §Cloud Mode: emit the `--banner`, fan out sequentially with `Reviewed-Coverage: sequential-fallback` disclosure (never claim an independent review ran), `message_user` ack before any secrets read or production mutation, and run `precommit-guard.sh` before any `git commit` — hooks do not fire in cloud.
|
|
8
|
+
<!-- soleur-cloud-mode:end -->
|
|
9
|
+
|
|
10
|
+
<!-- grok-harness-invoke:start -->
|
|
11
|
+
**Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
|
|
12
|
+
<!-- grok-harness-invoke:end -->
|
|
13
|
+
|
|
14
|
+
# Operator Weekly Comprehension Digest
|
|
15
|
+
|
|
16
|
+
Write a calm, plain-language weekly digest that tells the non-technical operator **what their
|
|
17
|
+
company actually did this week** — what got built, what it cost, what broke (and whether it is
|
|
18
|
+
fixed), and what now needs their attention. Autonomous loops ship features, move money, and resolve
|
|
19
|
+
incidents faster than a solo owner can track; this digest is the antidote to that comprehension debt.
|
|
20
|
+
|
|
21
|
+
This skill runs **headless inside `claude-code-action`** in the private `jikig-ai/operator-digest`
|
|
22
|
+
repo, with the **public** `jikig-ai/soleur` repo checked out at `$GITHUB_WORKSPACE`. It reads five
|
|
23
|
+
sources, synthesizes five sections of prose, and writes `$GITHUB_WORKSPACE/digest.md`. It then
|
|
24
|
+
**STOPS**. A deterministic workflow post-step scrubs that file (fail-closed) and is the only thing
|
|
25
|
+
that posts the issue — this skill itself must never post the digest (it writes the file and STOPS).
|
|
26
|
+
|
|
27
|
+
## Register (how to write)
|
|
28
|
+
|
|
29
|
+
Write as a trusted chief of staff briefing a busy owner — calm, candid, concrete. **Every line states
|
|
30
|
+
a business consequence or an action the owner can take, or it is cut.** No vanity metrics, no PR
|
|
31
|
+
numbers, no file paths, no jargon, no hype. Prefer "We made checkout faster" over "Merged #1234
|
|
32
|
+
refactoring the Stripe webhook handler." Money in plain figures. Incidents in plain "what broke / is
|
|
33
|
+
it fixed" terms.
|
|
34
|
+
|
|
35
|
+
**In-the-moment sibling.** `soleur:operator-rephrase` applies this same register to a **single
|
|
36
|
+
message, synchronously**, when something just said did not land. It is not bound by the
|
|
37
|
+
business-consequence rule above — that rule is a digest rule. Use the digest weekly; use
|
|
38
|
+
`soleur:operator-rephrase` in the turn.
|
|
39
|
+
|
|
40
|
+
**Vocabulary (stop-list).** `knowledge-base/project/glossary.md` lists the internal words that must NOT reach the founder; each entry — or each sense of a multi-sense one — opens with the plain clause to translate into, and its path is for the agent only. The instruction is stated once in [glossary-format.md](../kb-glossary/references/glossary-format.md) §The consumer pointer.
|
|
41
|
+
|
|
42
|
+
## Date window
|
|
43
|
+
|
|
44
|
+
The digest covers the **last 7 days**. Anchor to the checkout root and compute the window once at the start:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cd "$GITHUB_WORKSPACE" # the filesystem sources below (§2 git log, §3 ls) are relative to the soleur checkout
|
|
48
|
+
SINCE="$(date -u -d '7 days ago' +%Y-%m-%d)"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Use `$SINCE` for every source below.
|
|
52
|
+
|
|
53
|
+
## Read-failure handling (never render a failure as a quiet week)
|
|
54
|
+
|
|
55
|
+
Each source command can FAIL — a cross-repo auth denial, a missing checkout, a transient error —
|
|
56
|
+
returning a non-zero exit and/or empty output. **A failed read is NOT a quiet week.** This is the
|
|
57
|
+
most important comprehension guardrail: the operator must never read "Nothing shipped" and believe a
|
|
58
|
+
busy week was quiet because a `gh` call silently 403'd.
|
|
59
|
+
|
|
60
|
+
For each section: if its source command exits **non-zero**, do NOT emit the section's "Nothing …"
|
|
61
|
+
fallback. Instead emit a clearly-labelled warning line for that section:
|
|
62
|
+
|
|
63
|
+
> ⚠️ Could not read \<source\> this week — a read FAILED (this is NOT a quiet week). See the run log.
|
|
64
|
+
|
|
65
|
+
Only emit the "Nothing …" fallback when the command **succeeded** and genuinely returned no rows.
|
|
66
|
+
|
|
67
|
+
## Scope guardrails (load-bearing — do not weaken)
|
|
68
|
+
|
|
69
|
+
- **L1 — path scope.** Read ONLY the five named sources below. Any other file path is out of scope.
|
|
70
|
+
Do not wander the repository.
|
|
71
|
+
- **L2 — summaries only (the named-PII + customer-email control).** A regex cannot catch "Jane Doe".
|
|
72
|
+
- Incidents: build the section from each post-mortem's **frontmatter, title, and status ONLY —
|
|
73
|
+
never the post-mortem body.** The body contains customer names, raw logs, and trace detail that
|
|
74
|
+
must never reach the digest. If a **title or frontmatter** itself names a person, customer, or
|
|
75
|
+
company, summarize it generically ("an incident affecting a customer") rather than echoing the
|
|
76
|
+
name — title/frontmatter is author-controlled, so the named-PII control applies to it too.
|
|
77
|
+
- Money: emit **amounts and vendor names only.** Never echo the ledger's Notes column (it carries
|
|
78
|
+
contact emails, IPs, and account detail).
|
|
79
|
+
- Never copy a raw record, email address, IP, token, or log line into the digest. Summarize.
|
|
80
|
+
- **L3 — velocity metrics are aggregate-only (the shipping-cadence and cost-trend metrics below).**
|
|
81
|
+
Report **company-aggregate** figures only — one merge-pace band, one rounded run-rate figure. One
|
|
82
|
+
operator plus autonomous agents means a per-contributor or per-author breakdown is meaningless noise,
|
|
83
|
+
so **never add an `author` field to the §1 `gh pr list --json` list.** Both metrics suppress to a
|
|
84
|
+
neutral hedge on any read doubt, and both are stated as a business consequence — never a raw count, a
|
|
85
|
+
percentage, or an up/down arrow as the signal.
|
|
86
|
+
|
|
87
|
+
## The five sections
|
|
88
|
+
|
|
89
|
+
### 1. What your company built
|
|
90
|
+
|
|
91
|
+
Source: merged pull requests in the window.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Use the List API (NOT --search): --search routes to GitHub's Search API, which returns
|
|
95
|
+
# EMPTY for a cross-repo query under the in-action App-installation token (#3403 class) — it
|
|
96
|
+
# would silently render "Nothing shipped" every week. The List API works cross-repo (same path
|
|
97
|
+
# as the action-required read below). Filter by mergedAt >= $SINCE in your synthesis.
|
|
98
|
+
gh pr list -R jikig-ai/soleur --state merged --limit 300 \
|
|
99
|
+
--json title,labels,mergedAt,number,url
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
(`number,url` are used ONLY by §5's substantiation links — never surface a PR
|
|
103
|
+
number in §1's prose; still no `author` field per L3.)
|
|
104
|
+
|
|
105
|
+
Keep only PRs whose `mergedAt` is on or after `$SINCE`. Rewrite each meaningful change into its
|
|
106
|
+
**business consequence** in plain language. Group related work. Drop pure chores/dependency bumps
|
|
107
|
+
unless they matter to the owner. No PR numbers, no paths.
|
|
108
|
+
|
|
109
|
+
**Shipping cadence (aggregate, comparison-framed).** Alongside the summary, judge how much your
|
|
110
|
+
company shipped **this week** against **recent weeks (roughly the last month)** using the same
|
|
111
|
+
`mergedAt` data — count only the *meaningful* merges (the same set you kept above; still drop pure
|
|
112
|
+
chore/dependency bumps), a merge count and never a code-size measure. Fold one qualitative band into
|
|
113
|
+
the prose — *clearly quieter than usual* / *about as much as a normal week* / *clearly busier than
|
|
114
|
+
usual* — stated as a consequence ("Your company shipped about as much as a normal week."). **When in
|
|
115
|
+
doubt, say "about the same."** Judge the band; never pin an exact ratio, a percentage, or an up/down
|
|
116
|
+
arrow, and never use the words "velocity", "throughput", or "cadence" in the output.
|
|
117
|
+
|
|
118
|
+
Degrade gracefully, and never alarm off a bad read:
|
|
119
|
+
|
|
120
|
+
- With fewer than a few weeks of history, default to "about the same" (or a plain "still getting
|
|
121
|
+
started" line) — never a confident band.
|
|
122
|
+
- If the §1 read FAILED (the ⚠️ warning above fired), OR the PR list hit the `--limit 300` cap across
|
|
123
|
+
the comparison window (a truncated read undercounts the prior weeks), OR this week reads suspiciously
|
|
124
|
+
empty, do **not** emit a definite band, and **never** emit the downward "quieter" band off a doubtful
|
|
125
|
+
read — render "about the same" or a one-line hedge instead. A silent undercount must never surface as
|
|
126
|
+
a confident "quieter than usual".
|
|
127
|
+
|
|
128
|
+
### 2. Money & vendors
|
|
129
|
+
|
|
130
|
+
Source: changes to the expense ledger in the window.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
git log --since="$SINCE" -p -- knowledge-base/operations/expenses.md
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Report **new costs, cost changes, and vendor changes** as amounts + vendor names only. "Sentry went
|
|
137
|
+
from $29 to ~$40/mo." "No new vendors this week." Never reproduce the Notes column.
|
|
138
|
+
|
|
139
|
+
**Cost trend (this week's direction + a coarse run-rate).** After the raw changes above, add framing:
|
|
140
|
+
|
|
141
|
+
- **Direction (the primary, always-honest signal)** from the `git log -p` diff window: the real added
|
|
142
|
+
or changed *active* costs this week ("up ~$Y a month — added Resend Pro") or "no cost changes — spend
|
|
143
|
+
is holding steady." A row merely **recorded** in the diff at a non-active status (`deferred`,
|
|
144
|
+
`approved-not-billing`) is **not** a cost increase — do not report it as "cost up."
|
|
145
|
+
- **Coarse run-rate anchor (only when the ledger reads cleanly).** `Read` the current
|
|
146
|
+
`knowledge-base/operations/expenses.md` and sum the **Recurring** table's Amount,
|
|
147
|
+
counting **only** rows whose `status` is `active` (and `accruing` only when it carries a real
|
|
148
|
+
actual). This is a **fail-safe allowlist, not a denylist** — the rule is the catch-all, not a list
|
|
149
|
+
to maintain: any status that is not `active`/`accruing`-with-actual (`deferred` and
|
|
150
|
+
`approved-not-billing` are the common ones, but a future/unknown status counts too) is invisible to
|
|
151
|
+
the run-rate; an unrecognized status is excluded, never summed. Normalize known non-monthly rows (a
|
|
152
|
+
2-year `.ai` registration, annual-billed rows) to a monthly figure. **Suppress the anchor entirely**
|
|
153
|
+
if any counted row's billing cadence is ambiguous — a mis-read annual row is a 12–24× error, the
|
|
154
|
+
exact false alarm this digest exists to prevent. When clean, hard-round to one coarse aggregate
|
|
155
|
+
figure: "recurring spend is roughly $X a month, mostly hosting and tooling." Emit **one aggregate
|
|
156
|
+
figure only** — never a per-row Notes value; read the **Recurring** table only (the One-Time table's
|
|
157
|
+
registration and credit rows must never enter the run-rate).
|
|
158
|
+
- If the `Read` of `expenses.md` **errors** (distinct from an empty ledger), suppress the anchor behind
|
|
159
|
+
the ⚠️ warning line — a failed read is NOT "spend holding steady."
|
|
160
|
+
- **First run:** an empty ledger read → "first reading — no cost trend yet," mirroring the
|
|
161
|
+
first-digest continuity pattern.
|
|
162
|
+
|
|
163
|
+
### 3. What broke & whether it's fixed
|
|
164
|
+
|
|
165
|
+
Source: post-mortems (incident reports) dated in the window.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
ls knowledge-base/engineering/operations/post-mortems/*.md
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
For each post-mortem whose **filename date** falls in the window, read **only its frontmatter +
|
|
172
|
+
title** (`title`, `date`, `status`). Emit one plain line per incident: what broke, and whether
|
|
173
|
+
`status` says it is `resolved`/`closed` or still open. **Never read or quote the post-mortem body.**
|
|
174
|
+
|
|
175
|
+
### 4. Action needed from you
|
|
176
|
+
|
|
177
|
+
Source: open issues labelled `action-required` — but **triaged and de-polluted**, not a flat dump.
|
|
178
|
+
A flat list makes a 131-day chore look identical to a P0, and buries the genuine asks under
|
|
179
|
+
informational noise (#6836). Fetch age + labels so both become signals:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
gh issue list -R jikig-ai/soleur --label action-required --state open \
|
|
183
|
+
--json number,title,url,createdAt,labels --limit 100
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Build the action list (de-pollute).** From the result, **EXCLUDE** any issue whose `labels`
|
|
187
|
+
include `decision-challenge`, `content-publisher`, or (`meta/machinery` **without** `action-required`) — the first two are
|
|
188
|
+
informational or structurally-dead per-piece chores that drown the genuine asks, and
|
|
189
|
+
`meta/machinery` is a finding about Soleur's own verification machinery rather than about
|
|
190
|
+
anything you receive. Excluding it is what makes the genuine product asks visible at all:
|
|
191
|
+
a 1,000-issue sample carried 626 `domain/engineering` against 39 `domain/product`.
|
|
192
|
+
**The `action-required` carve-out is load-bearing and matches the sweeper's precedence.**
|
|
193
|
+
`cron-stale-deferred-scope-outs.ts` treats `action-required` as never-auto-close, so an issue
|
|
194
|
+
carrying BOTH labels is preserved forever; excluding it here unconditionally would make it
|
|
195
|
+
preserved *and* invisible on your only comprehension surface — a permanent silent open issue.
|
|
196
|
+
The two consumers of one label must order it the same way. **Do NOT exclude the bare `content` label** — a human
|
|
197
|
+
(or another workflow) can attach `content` to a genuine ops emergency (e.g. a content-*pipeline*
|
|
198
|
+
outage), and excluding it would hide that emergency from your only comprehension surface while the
|
|
199
|
+
SLA cron correctly keeps it open and escalates it (it classifies bare `content` as an ops ask, never
|
|
200
|
+
a dead chore). **KEEP** `content-starvation` (a real standing "distribution pipeline empty" signal).
|
|
201
|
+
The survivors are the true "only you can do this" asks (expiring tokens, saturating disks, TLS/cert
|
|
202
|
+
state, infra capacity, stale CLA).
|
|
203
|
+
|
|
204
|
+
**Sort and surface age.** Sort survivors by priority (`priority/p0-critical` > `priority/p1-high` >
|
|
205
|
+
`priority/p2-medium` > `priority/p3-low` > none), then oldest-first. Compute each issue's **age in
|
|
206
|
+
days** from `createdAt`. Lead with a bold "🔴 Open longest / needs your attention" line naming the
|
|
207
|
+
1–3 oldest survivors with their age (e.g. "#4375 — 58 days"). Then recap each remaining survivor as
|
|
208
|
+
a plain "what needs you to act" line with its age and link. **Cap the action list at 8**; if more
|
|
209
|
+
remain, end with "+N more open — see the `action-required` label." Read-only recap — do **not**
|
|
210
|
+
mutate, close, or comment on any issue.
|
|
211
|
+
|
|
212
|
+
**Decisions flagged for your awareness (separate block, not the action list).** SEPARATELY, list
|
|
213
|
+
open issues labelled `decision-challenge` under a distinct sub-heading **"Decisions flagged for
|
|
214
|
+
your awareness (informational, not blocking)"** — capped at 5 with "+N more" — so they stay visible
|
|
215
|
+
without diluting the action list above.
|
|
216
|
+
|
|
217
|
+
**Automatic recoveries (same separate block).** Also list open issues labelled
|
|
218
|
+
`infra-config-recovery-notice` there. These record a production write the system made on its own
|
|
219
|
+
and then verified — no action is needed, which is exactly why they must NOT carry
|
|
220
|
+
`action-required`: labelling a self-heal as an ask spends the P1 channel's credibility on a
|
|
221
|
+
success. But an unattended write to the server's sole remote-repair channel is worth the founder
|
|
222
|
+
knowing about, and without this line the digest — their only comprehension surface — never
|
|
223
|
+
mentions it at all. One line each, naming how many times it has recurred.
|
|
224
|
+
|
|
225
|
+
### 5. What got smarter this week
|
|
226
|
+
|
|
227
|
+
Source: the self-improvements Soleur's compounding loop **completed** in the window — the promotion
|
|
228
|
+
PRs it merged into how your agents work. **Reuse §1's already-fetched merged-PR list — do NOT run
|
|
229
|
+
another `gh` call, and NEVER `--search`** (the Search API returns empty cross-repo under the
|
|
230
|
+
in-action App token, exactly as noted in §1; a `--search` here would silently render "nothing got
|
|
231
|
+
smarter" every week). From §1's list, keep only PRs whose `labels` contains `self-healing/auto`
|
|
232
|
+
**and** whose `mergedAt` is on or after `$SINCE`. Production shape: title
|
|
233
|
+
`self-healing(auto): promote cluster <hash> <date>`, label `self-healing/auto`.
|
|
234
|
+
|
|
235
|
+
Render as a **platform-level outcome, framed for the operator** — the improvement is to the shared
|
|
236
|
+
Soleur harness (the rules and skills every workspace runs on), not to any one workspace's data:
|
|
237
|
+
"Soleur got sharper this week — N improvements shipped to the shared brain your agents run on."
|
|
238
|
+
Add a compact `Details:` line linking each kept PR (its `url`) as substantiation. Do **not** invent
|
|
239
|
+
a per-item description from the cluster-hash title — it carries no human summary, and reading a PR
|
|
240
|
+
body to synthesize one would violate L2 (summaries only). The count plus the links is the honest
|
|
241
|
+
claim; the link is the drill-in path.
|
|
242
|
+
|
|
243
|
+
**Never write "your workspace got smarter"** — that phrasing implies a per-tenant benefit the loop
|
|
244
|
+
does not produce (improvements are global harness edits). Because §5 reuses §1's read, a §1 read
|
|
245
|
+
FAILURE (the ⚠️ warning) suppresses §5 too — do not render a "nothing" line off a failed read.
|
|
246
|
+
|
|
247
|
+
## Deterministic fallback (never blank)
|
|
248
|
+
|
|
249
|
+
A quiet week is itself information. **Even an all-empty week still posts.** If a source yields nothing
|
|
250
|
+
in the window, write the section's labelled fallback line — **never leave a section blank**:
|
|
251
|
+
|
|
252
|
+
- Section 1 → "Nothing shipped this week."
|
|
253
|
+
- Section 2 → "No money or vendor changes this week."
|
|
254
|
+
- Section 3 → "Nothing broke this week."
|
|
255
|
+
- Section 4 → "Nothing needs your attention this week."
|
|
256
|
+
- Section 5 → "Nothing was promoted to the shared harness this week."
|
|
257
|
+
|
|
258
|
+
Every section must contain at least one full sentence. A blank or byte-for-byte command-dump section
|
|
259
|
+
is a failure.
|
|
260
|
+
|
|
261
|
+
## Prior-week continuity
|
|
262
|
+
|
|
263
|
+
Find the most recent prior digest issue and reference it so a skipped week is visible:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# List API, NOT --search (same Search-API-empty-under-App-token reason as section 1): list this
|
|
267
|
+
# repo's recent issues and pick the most recent whose title starts with "Digest:". A false-empty
|
|
268
|
+
# from --search would break the liveness loop — every week would falsely read "first digest".
|
|
269
|
+
gh issue list -R jikig-ai/operator-digest --state all \
|
|
270
|
+
--json number,title --limit 20
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
From that list, take the highest-numbered issue whose title begins with `Digest:` (ignore the
|
|
274
|
+
withheld-notice issues) and add a final line to the digest: **"Last week: #N"**. If no prior digest
|
|
275
|
+
issue exists, write "Last week: (this is the first digest)." A missing prior-week back-reference is
|
|
276
|
+
the operator-visible signal that a week was skipped.
|
|
277
|
+
|
|
278
|
+
## Output
|
|
279
|
+
|
|
280
|
+
Write the assembled digest to `$GITHUB_WORKSPACE/digest.md`:
|
|
281
|
+
|
|
282
|
+
- A short title line: `# Weekly digest: <ISO week or date range>`.
|
|
283
|
+
- The five `##` sections above, in order, each with prose (or its fallback line).
|
|
284
|
+
- The final `Last week: #N` continuity line.
|
|
285
|
+
|
|
286
|
+
Then **STOP**. Do not open, post, or create any issue — the gated workflow post-step owns publishing.
|
|
287
|
+
Writing `digest.md` and stopping is the entire job of this skill.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Operator weekly comprehension digest — workflow asset (#5085).
|
|
2
|
+
#
|
|
3
|
+
# THIS FILE IS INERT IN soleur. It is committed here (in the PUBLIC repo) so the
|
|
4
|
+
# brand-critical workflow gets multi-agent review, but it MUST NOT be placed under
|
|
5
|
+
# soleur's own .github/workflows/ — that would run it in PUBLIC Actions logs and leak
|
|
6
|
+
# the operator's private data. The provisioning script installs it into the PRIVATE
|
|
7
|
+
# jikig-ai/operator-digest repo, where both the logs and the digest issues stay private.
|
|
8
|
+
#
|
|
9
|
+
# Containment boundary (do not weaken — see plan §User-Brand Impact L1-L4):
|
|
10
|
+
# - The agent reads public soleur, synthesizes prose, writes $GITHUB_WORKSPACE/digest.md, STOPS.
|
|
11
|
+
# - The agent's allowlist has NO `gh issue create` — a prompt-injection in any read source
|
|
12
|
+
# cannot make the model post. Only the deterministic post-step posts.
|
|
13
|
+
# - The scrub gate (digest-scrub.sh) runs as a GHA run: step OUTSIDE the action — an in-prompt
|
|
14
|
+
# `exit 1` is swallowed (conclusion still reads success), so the gate must live here.
|
|
15
|
+
# - On a scrub abort the post-step posts a CONTENT-FREE withheld notice (a withhold is visible,
|
|
16
|
+
# not a silent absence), then removes the plaintext digest.
|
|
17
|
+
|
|
18
|
+
name: "Operator weekly digest"
|
|
19
|
+
|
|
20
|
+
on:
|
|
21
|
+
schedule:
|
|
22
|
+
# Fridays 13:00 UTC. GitHub Actions cron has ~15-minute variance.
|
|
23
|
+
- cron: '0 13 * * 5'
|
|
24
|
+
workflow_dispatch: {}
|
|
25
|
+
|
|
26
|
+
concurrency:
|
|
27
|
+
group: operator-digest
|
|
28
|
+
cancel-in-progress: false
|
|
29
|
+
|
|
30
|
+
# Least-privilege: the data source (public soleur) needs no grant; we only write issues
|
|
31
|
+
# to this private repo. id-token: write is required by claude-code-action's OIDC handshake.
|
|
32
|
+
permissions:
|
|
33
|
+
contents: read
|
|
34
|
+
issues: write
|
|
35
|
+
id-token: write
|
|
36
|
+
|
|
37
|
+
jobs:
|
|
38
|
+
digest:
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
timeout-minutes: 20
|
|
41
|
+
steps:
|
|
42
|
+
- name: Checkout public soleur (data source)
|
|
43
|
+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
|
|
44
|
+
with:
|
|
45
|
+
repository: jikig-ai/soleur
|
|
46
|
+
fetch-depth: 0
|
|
47
|
+
# The data source is PUBLIC — no token needed. Do not persist the workflow's
|
|
48
|
+
# own credentials into the checkout (it is not soleur's repo).
|
|
49
|
+
persist-credentials: false
|
|
50
|
+
|
|
51
|
+
# show_full_output is deliberately OFF (absent). The flag leaks ALL tool execution
|
|
52
|
+
# results — which here include private financial/incident data — into the run logs.
|
|
53
|
+
- name: Synthesize digest
|
|
54
|
+
uses: anthropics/claude-code-action@ab8b1e6471c519c585ba17e8ecaccc9d83043541 # v1.0.101
|
|
55
|
+
env:
|
|
56
|
+
# Align both token contexts so the in-action cross-repo `gh` read does not
|
|
57
|
+
# silently 403/return-empty under the App-installation token (#3403).
|
|
58
|
+
GH_TOKEN: ${{ github.token }}
|
|
59
|
+
with:
|
|
60
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
61
|
+
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
62
|
+
plugin_marketplaces: 'https://github.com/jikig-ai/soleur-marketplace.git'
|
|
63
|
+
plugins: 'soleur@soleur-marketplace'
|
|
64
|
+
# The allowlist deliberately OMITS `gh issue create`: the agent CANNOT post.
|
|
65
|
+
# It may read PRs/issues and git log, and write files (digest.md) only.
|
|
66
|
+
claude_args: >-
|
|
67
|
+
--max-turns 30
|
|
68
|
+
--allowedTools Write,Read,Glob,Grep,Bash(date:*),Bash(ls:*),Bash(gh pr list:*),Bash(gh issue list:*),Bash(git log:*)
|
|
69
|
+
prompt: |
|
|
70
|
+
Run /soleur:operator-digest on the checked-out jikig-ai/soleur repository.
|
|
71
|
+
Read the five sources, synthesize the five plain-language sections, and write the
|
|
72
|
+
digest to $GITHUB_WORKSPACE/digest.md. STOP after writing the file — do not post,
|
|
73
|
+
open, or create any issue. The workflow's post-step owns publishing.
|
|
74
|
+
|
|
75
|
+
- name: Scrub gate (fail-closed) then post
|
|
76
|
+
env:
|
|
77
|
+
GH_TOKEN: ${{ github.token }}
|
|
78
|
+
GH_RUN_ID: ${{ github.run_id }}
|
|
79
|
+
OPERATOR_GH_LOGIN: ${{ vars.OPERATOR_GH_LOGIN }}
|
|
80
|
+
run: |
|
|
81
|
+
set -uo pipefail
|
|
82
|
+
DIGEST="$GITHUB_WORKSPACE/digest.md"
|
|
83
|
+
SCRUB="$GITHUB_WORKSPACE/plugins/soleur/skills/operator-digest/scripts/digest-scrub.sh"
|
|
84
|
+
ISO_WEEK="$(date -u +%G-W%V)"
|
|
85
|
+
|
|
86
|
+
if [[ ! -f "$DIGEST" ]]; then
|
|
87
|
+
echo "the digest file was not produced by the synthesis step — failing the run" >&2
|
|
88
|
+
exit 1
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# Delivery, not production, was the failure mode. This workflow ran
|
|
92
|
+
# correctly for months (active cron, 7/8 successful runs, correct
|
|
93
|
+
# query, the action-required backlog surfaced >=5 consecutive weeks)
|
|
94
|
+
# and nobody saw it: the digest posts to a PRIVATE repo with ZERO
|
|
95
|
+
# subscribers, so an issue create notifies no one. That is why 130
|
|
96
|
+
# days of action-required accumulation never surfaced through the
|
|
97
|
+
# very section built to surface it.
|
|
98
|
+
#
|
|
99
|
+
# --assignee is the fix: assignment notifies unconditionally and does
|
|
100
|
+
# not depend on watch state. The repo-subscription API is NOT used —
|
|
101
|
+
# this token lacks the `notifications` scope (measured, not assumed).
|
|
102
|
+
#
|
|
103
|
+
# Fail LOUD if the variable is unset. A digest that silently posts to
|
|
104
|
+
# nobody is the exact defect being repaired; degrading quietly back
|
|
105
|
+
# into it would make this change a no-op that looks like a fix.
|
|
106
|
+
if [[ -z "${OPERATOR_GH_LOGIN:-}" ]]; then
|
|
107
|
+
echo "OPERATOR_GH_LOGIN repo variable is unset — the digest would post to nobody." >&2
|
|
108
|
+
echo "Set it with: gh variable set OPERATOR_GH_LOGIN -R jikig-ai/operator-digest --body '<login>'" >&2
|
|
109
|
+
exit 1
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# The scrub is a deterministic post-step OUTSIDE the action. A non-zero exit means a
|
|
113
|
+
# secret / foreign email / grep error was found: post a CONTENT-FREE withheld notice
|
|
114
|
+
# (zero source-derived content) so the withhold is operator-visible, not silent.
|
|
115
|
+
if bash "$SCRUB" "$DIGEST"; then
|
|
116
|
+
gh issue create -R jikig-ai/operator-digest \
|
|
117
|
+
--assignee "${OPERATOR_GH_LOGIN}" \
|
|
118
|
+
--title "Digest: ${ISO_WEEK}" \
|
|
119
|
+
--body-file "$DIGEST"
|
|
120
|
+
else
|
|
121
|
+
gh issue create -R jikig-ai/operator-digest \
|
|
122
|
+
--assignee "${OPERATOR_GH_LOGIN}" \
|
|
123
|
+
--title "Digest withheld: ${ISO_WEEK}" \
|
|
124
|
+
--body "This week's digest was withheld by the safety scrub; a value matched a safety pattern (a secret, a foreign email, or a scan error). No data is shown. See run ${GH_RUN_ID}."
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# No durable plaintext copy: remove the file regardless of which branch posted.
|
|
128
|
+
rm -f "$DIGEST"
|
|
129
|
+
|
|
130
|
+
# A SUCCESSFUL run auto-resolves any standing "digest FAILED" self-report (below),
|
|
131
|
+
# mirroring the content-starvation auto-file/auto-close pattern.
|
|
132
|
+
- name: Resolve prior failure self-report on success
|
|
133
|
+
if: success()
|
|
134
|
+
env:
|
|
135
|
+
GH_TOKEN: ${{ github.token }}
|
|
136
|
+
run: |
|
|
137
|
+
set -uo pipefail
|
|
138
|
+
FAIL_TITLE="⚠️ Weekly digest run FAILED — you did not get a digest this week"
|
|
139
|
+
EXISTING="$(gh issue list -R jikig-ai/operator-digest --state open \
|
|
140
|
+
--json number,title --limit 30 \
|
|
141
|
+
--jq "[.[] | select(.title == \"${FAIL_TITLE}\")][0].number // empty")"
|
|
142
|
+
if [[ -n "$EXISTING" ]]; then
|
|
143
|
+
gh issue close "$EXISTING" -R jikig-ai/operator-digest \
|
|
144
|
+
--comment "The weekly digest ran successfully again — auto-resolving this failure notice."
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
# A FAILED run is itself a SILENT ABSENCE: the operator simply gets no digest that week
|
|
148
|
+
# and never learns the pipeline broke (the 2026-06-26 and 2026-07-20 runs failed with
|
|
149
|
+
# nobody notified). Self-report — loud, assigned — so a broken digest is visible, exactly
|
|
150
|
+
# like the delivery fix above. Idempotent: one standing open issue, commented on re-fail.
|
|
151
|
+
- name: Self-report on digest failure
|
|
152
|
+
if: failure()
|
|
153
|
+
env:
|
|
154
|
+
GH_TOKEN: ${{ github.token }}
|
|
155
|
+
GH_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
156
|
+
OPERATOR_GH_LOGIN: ${{ vars.OPERATOR_GH_LOGIN }}
|
|
157
|
+
run: |
|
|
158
|
+
set -uo pipefail
|
|
159
|
+
FAIL_TITLE="⚠️ Weekly digest run FAILED — you did not get a digest this week"
|
|
160
|
+
EXISTING="$(gh issue list -R jikig-ai/operator-digest --state open \
|
|
161
|
+
--json number,title --limit 30 \
|
|
162
|
+
--jq "[.[] | select(.title == \"${FAIL_TITLE}\")][0].number // empty")"
|
|
163
|
+
if [[ -n "$EXISTING" ]]; then
|
|
164
|
+
gh issue comment "$EXISTING" -R jikig-ai/operator-digest \
|
|
165
|
+
--body "The weekly digest run FAILED again — still no digest this week. Run: ${GH_RUN_URL}"
|
|
166
|
+
else
|
|
167
|
+
# Tolerate an unset OPERATOR_GH_LOGIN here: filing UNASSIGNED still beats a silent
|
|
168
|
+
# absence (the whole point of this step). Assign when the variable is present.
|
|
169
|
+
ASSIGN=()
|
|
170
|
+
[[ -n "${OPERATOR_GH_LOGIN:-}" ]] && ASSIGN=(--assignee "${OPERATOR_GH_LOGIN}")
|
|
171
|
+
gh issue create -R jikig-ai/operator-digest \
|
|
172
|
+
"${ASSIGN[@]}" \
|
|
173
|
+
--title "$FAIL_TITLE" \
|
|
174
|
+
--body "The Operator weekly digest workflow FAILED — no digest was produced or posted this week. This is a self-report so the failure is not a silent absence. See run ${GH_RUN_URL}. Auto-resolves on the next successful run."
|
|
175
|
+
fi
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Tuned fail-closed scrub gate for the operator weekly digest (#5085, plan §L3).
|
|
3
|
+
#
|
|
4
|
+
# Runs as a deterministic GitHub Actions post-step on the rendered digest.md,
|
|
5
|
+
# BEFORE the issue is posted. It is DISTINCT from incident/redact-sentinel.sh:
|
|
6
|
+
# that gate is tuned for human-reviewed PIRs and aborts on email/UUID/IPv4 — which
|
|
7
|
+
# would silently kill a business digest on benign first-party content (ops@jikigai.com
|
|
8
|
+
# is in the ledger) while still missing named PII. This gate is tuned for the
|
|
9
|
+
# digest's content profile: abort on true secrets, abort on a FOREIGN email
|
|
10
|
+
# (the customer-email leak class), but only WARN on UUID/IPv4 (legitimate in prose).
|
|
11
|
+
# Named PII ("Jane Doe") cannot be caught by a regex — that control is upstream
|
|
12
|
+
# (the skill emits incident SUMMARIES from PIR frontmatter/title only, never bodies).
|
|
13
|
+
#
|
|
14
|
+
# Exit codes:
|
|
15
|
+
# 0 = clean — no abort-class match (UUID/IPv4/first-party-email warns are allowed)
|
|
16
|
+
# 1 = abort — a secret, a foreign email, OR a grep error (real fail-closed)
|
|
17
|
+
# 2 = invalid arguments — missing or unreadable file
|
|
18
|
+
#
|
|
19
|
+
# Output is meta-redacted (never the full token), mirroring redact-sentinel.sh.
|
|
20
|
+
set -uo pipefail
|
|
21
|
+
|
|
22
|
+
if [[ $# -ne 1 ]]; then
|
|
23
|
+
echo "usage: digest-scrub.sh <path-to-digest.md>" >&2
|
|
24
|
+
exit 2
|
|
25
|
+
fi
|
|
26
|
+
FILE="$1"
|
|
27
|
+
if [[ ! -r "${FILE}" ]]; then
|
|
28
|
+
echo "digest-scrub: file not readable: ${FILE}" >&2
|
|
29
|
+
exit 2
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# First-party email domains: a digest summarizing the operator's own ledger legitimately
|
|
33
|
+
# names the operator's own contact address. A foreign domain in the digest is the
|
|
34
|
+
# customer-email leak class and MUST abort.
|
|
35
|
+
FIRST_PARTY_DOMAINS=(jikigai.com soleur.ai)
|
|
36
|
+
|
|
37
|
+
# Secret classes — any match ABORTS. Class-name set + bodies synced with redact-engine.py
|
|
38
|
+
# 2026-07-06 (#6045); NAME-level parity is CI-enforced by plugins/soleur/test/redact-class-parity.test.sh.
|
|
39
|
+
# Regex-BODY parity is a named non-goal (ERE here vs Python `re` in the engine — not cheaply
|
|
40
|
+
# comparable); bodies below are a superset of the engine's shared classes as of the sync date and
|
|
41
|
+
# pattern edits get manual cross-review. The engine's email/UUID/IPv4 classes are handled OUTSIDE
|
|
42
|
+
# this map (email via first-party domain logic below; UUID/IPv4 as WARN-only), so the parity guard
|
|
43
|
+
# allowlists them.
|
|
44
|
+
declare -A SECRET=(
|
|
45
|
+
[JWT]='eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}'
|
|
46
|
+
[stripe_key]='\b(sk|pk|rk)_(live|test)_[A-Za-z0-9]{16,}\b'
|
|
47
|
+
[stripe_whsec]='\bwhsec_[A-Za-z0-9]{16,}\b'
|
|
48
|
+
[stripe_acct]='\bacct_[A-Za-z0-9]{16,}\b'
|
|
49
|
+
[stripe_cust_pi_seti_sub_in]='\b(cus|pi|seti|sub|in)_[A-Za-z0-9]{14,}\b'
|
|
50
|
+
[env_var]='\b(DOPPLER|SENTRY|STRIPE|SUPABASE|OPENAI|ANTHROPIC|GITHUB|VERCEL|CLOUDFLARE|HETZNER|FLAGSMITH|RESEND|TAILSCALE)_[A-Z_]+=[^[:space:]]+'
|
|
51
|
+
[github_token]='\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9._~+/=-]{30,}|\bgithub_pat_[A-Za-z0-9._~+/=-]{20,}'
|
|
52
|
+
[anthropic_key]='\bsk-ant-[A-Za-z0-9_-]{32,}\b'
|
|
53
|
+
[openai_key]='\bsk-(proj-)?[A-Za-z0-9_-]{20,}\b'
|
|
54
|
+
[supabase_pat]='\bsbp_[a-z0-9]{20,}\b|\b(sb_secret|sb_publishable)_[A-Za-z0-9]{20,}\b'
|
|
55
|
+
[pem_private_key]='-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----'
|
|
56
|
+
[doppler_token]='\bdp\.(st|pt|ct|sa|scim|audit)\.[A-Za-z0-9._-]{16,}'
|
|
57
|
+
[slack_token]='\bxox[baprsce]-[A-Za-z0-9-]{10,}'
|
|
58
|
+
)
|
|
59
|
+
SECRET_ORDER=(JWT stripe_key stripe_whsec stripe_acct stripe_cust_pi_seti_sub_in env_var github_token anthropic_key openai_key supabase_pat pem_private_key doppler_token slack_token)
|
|
60
|
+
|
|
61
|
+
EMAIL_RE='\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'
|
|
62
|
+
UUID_RE='\b[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\b'
|
|
63
|
+
IPV4_RE='\b(([0-9]{1,3})\.){3}[0-9]{1,3}\b'
|
|
64
|
+
|
|
65
|
+
abort=0
|
|
66
|
+
|
|
67
|
+
emit() { printf 'digest-scrub %s: %s\n' "$1" "$2" >&2; }
|
|
68
|
+
|
|
69
|
+
# scan_secret <class> <pattern> — abort on any match; abort on grep error (fail-closed).
|
|
70
|
+
scan_secret() {
|
|
71
|
+
local class="$1" pattern="$2" out
|
|
72
|
+
# INVARIANT: `local rc=$?` MUST be the statement immediately after the grep assignment.
|
|
73
|
+
# Anything between them (even another `local`) resets $? to that statement's exit (0) and
|
|
74
|
+
# silently defeats the grep-error fail-closed path. Do not insert code here.
|
|
75
|
+
out="$(grep -oE -e "$pattern" "$FILE")"
|
|
76
|
+
local rc=$?
|
|
77
|
+
if (( rc >= 2 )); then
|
|
78
|
+
emit ABORT "grep error (rc=$rc) scanning ${class} — fail-closed"
|
|
79
|
+
abort=1
|
|
80
|
+
return
|
|
81
|
+
fi
|
|
82
|
+
if (( rc == 0 )) && [[ -n "$out" ]]; then
|
|
83
|
+
emit ABORT "secret-class ${class} matched (post withheld)"
|
|
84
|
+
abort=1
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
for class in "${SECRET_ORDER[@]}"; do
|
|
89
|
+
scan_secret "$class" "${SECRET[$class]}"
|
|
90
|
+
done
|
|
91
|
+
|
|
92
|
+
# Email: abort on a FOREIGN domain; warn (allow) on first-party.
|
|
93
|
+
emails="$(grep -oE -e "$EMAIL_RE" "$FILE")"; erc=$?
|
|
94
|
+
if (( erc >= 2 )); then
|
|
95
|
+
emit ABORT "grep error (rc=$erc) scanning email — fail-closed"; abort=1
|
|
96
|
+
elif (( erc == 0 )); then
|
|
97
|
+
while IFS= read -r addr; do
|
|
98
|
+
[[ -z "$addr" ]] && continue
|
|
99
|
+
domain="${addr##*@}"; domain="${domain,,}"
|
|
100
|
+
first_party=0
|
|
101
|
+
for d in "${FIRST_PARTY_DOMAINS[@]}"; do [[ "$domain" == "$d" ]] && first_party=1 && break; done
|
|
102
|
+
if (( first_party )); then
|
|
103
|
+
emit WARN "first-party email (${domain}) — allowed"
|
|
104
|
+
else
|
|
105
|
+
emit ABORT "foreign email domain (${domain}) — possible customer PII"
|
|
106
|
+
abort=1
|
|
107
|
+
fi
|
|
108
|
+
done <<< "$emails"
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# UUID / IPv4: WARN only (legitimate in incident/build prose). grep error still aborts.
|
|
112
|
+
for pair in "UUID:${UUID_RE}" "IPv4:${IPV4_RE}"; do
|
|
113
|
+
cls="${pair%%:*}"; pat="${pair#*:}"
|
|
114
|
+
out="$(grep -oE -e "$pat" "$FILE")"; rc=$?
|
|
115
|
+
if (( rc >= 2 )); then emit ABORT "grep error (rc=$rc) scanning ${cls} — fail-closed"; abort=1
|
|
116
|
+
elif (( rc == 0 )) && [[ -n "$out" ]]; then emit WARN "${cls} present in prose — allowed (not a secret)"; fi
|
|
117
|
+
done
|
|
118
|
+
|
|
119
|
+
exit "$abort"
|