@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,403 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Decide whether `/ship` Phase 4 still owes a local `test-all.sh` run.
|
|
3
|
+
#
|
|
4
|
+
# EXIT CONTRACT (the caller branches on this, never on the prose):
|
|
5
|
+
# 42 SKIPPABLE — CI already verified this exact tree; running it again buys nothing
|
|
6
|
+
# 0 OWED — run the gate. Since #8322 that means `--affected` by
|
|
7
|
+
# default; the FULL local battery is opt-in via
|
|
8
|
+
# `/ship --full` (operator) → `test-all.sh --full`
|
|
9
|
+
# 2 UNDECIDABLE — could not determine; the caller MUST treat this as OWED
|
|
10
|
+
# anything else — an error; the caller MUST treat it as OWED
|
|
11
|
+
#
|
|
12
|
+
# ONLY 42 SKIPS, and the oddness of that number is the point. This script runs
|
|
13
|
+
# under `set -u`, and a reference to an unset variable aborts a non-interactive
|
|
14
|
+
# bash script with **exit status 1** (measured, bash 5.3.15). An earlier revision
|
|
15
|
+
# used 1 for SKIPPABLE and asserted in this very comment that "every failure path
|
|
16
|
+
# reaches 0 or 2, never 1" — so a single typo'd variable name in a future edit
|
|
17
|
+
# would have exited 1, the caller would have read SKIPPABLE, and a 35-minute
|
|
18
|
+
# safety run would have been deleted by a shell abort. `set -u` exists to catch
|
|
19
|
+
# that typo; routing it into the skip branch inverted it.
|
|
20
|
+
#
|
|
21
|
+
# 42 is outside every status bash produces by accident: 1 (set -u / generic
|
|
22
|
+
# failure), 2 (syntax), 126 (not executable), 127 (not found), 128+N (signal).
|
|
23
|
+
# Exit 2 remains a DISTINCT value so "the check could not run" is never silently
|
|
24
|
+
# folded into "the check says skip" — but the caller's rule is simply
|
|
25
|
+
# "not 42 ⇒ run", which is safe no matter how the script dies.
|
|
26
|
+
#
|
|
27
|
+
# WHY THIS EXISTS (#8247). CI's required `test` context aggregates
|
|
28
|
+
# test-webplat + test-bun + test-scripts + test-scripts-heavy + web-platform-build,
|
|
29
|
+
# of which the first four are the same `test-all.sh` shards this battery runs —
|
|
30
|
+
# on the pushed head. The skill also mandates re-running the battery after any post-Phase-4
|
|
31
|
+
# change (a review fix, a main sync, an advisor fix), and on that re-run path the
|
|
32
|
+
# work is frequently a pure duplicate. Measured on PR #8233: two full batteries, ~70 min, the second
|
|
33
|
+
# finishing against a head whose 26/26 required checks were already green on the
|
|
34
|
+
# identical SHA. It could not have changed the merge decision.
|
|
35
|
+
#
|
|
36
|
+
# WHAT THIS IS NOT. It does not make CI the local fail-fast checkpoint and it
|
|
37
|
+
# weakens no merge gate. At FIRST run Phase 4 precedes the Phase 6 push, so
|
|
38
|
+
# there is usually no CI for HEAD and this returns OWED — by design. The saving
|
|
39
|
+
# is concentrated on the re-run path, which is where the duplicate cost lives.
|
|
40
|
+
set -uo pipefail
|
|
41
|
+
|
|
42
|
+
VERDICT_OWED=0
|
|
43
|
+
VERDICT_SKIPPABLE=42 # see the exit contract above: NOT 1, deliberately
|
|
44
|
+
VERDICT_UNDECIDABLE=2
|
|
45
|
+
|
|
46
|
+
# Strip C0 controls, DEL and the Unicode line separators before printing.
|
|
47
|
+
# Check-run names come from workflow YAML — which, on a PR, arrives IN THE DIFF
|
|
48
|
+
# UNDER REVIEW — and ruleset context strings come from repo admin config. Neither
|
|
49
|
+
# is trusted to be single-line: a newline inside one forges a second
|
|
50
|
+
# `battery-owed: …` line in the transcript, and the obvious thing to forge is a
|
|
51
|
+
# SKIPPABLE verdict. The exit code is unaffected (and SKILL.md branches on it),
|
|
52
|
+
# but a forged line sitting beside the caller's own echo is worth denying.
|
|
53
|
+
#
|
|
54
|
+
# Shared context-sanitize lib (#10395), three levels up at scripts/lib/. When it
|
|
55
|
+
# is unreadable the same-name fallback carries this site's pre-change strip set
|
|
56
|
+
# (C0+DEL plus the LS/PS sed) — never weaker than today.
|
|
57
|
+
_ctx_lib="$(cd "${BASH_SOURCE[0]%/*}/../../../scripts/lib" 2>/dev/null && pwd -P)/context-sanitize.sh"
|
|
58
|
+
_ctx_lib="${_ctx_lib:-/nonexistent/context-sanitize.sh}"
|
|
59
|
+
# shellcheck source=/dev/null
|
|
60
|
+
[[ -r "$_ctx_lib" ]] && . "$_ctx_lib" || true
|
|
61
|
+
declare -F soleur_ctx_sanitize >/dev/null 2>&1 \
|
|
62
|
+
|| soleur_ctx_sanitize() { LC_ALL=C tr -d '\000-\037\177' | LC_ALL=C sed $'s/\xe2\x80\xa8//g; s/\xe2\x80\xa9//g'; }
|
|
63
|
+
_sanitize() { printf '%s' "$*" | soleur_ctx_sanitize; }
|
|
64
|
+
say() { printf 'battery-owed: %s\n' "$(_sanitize "$*")"; }
|
|
65
|
+
|
|
66
|
+
owed() { say "OWED — $1"; exit "$VERDICT_OWED"; }
|
|
67
|
+
skippable() { say "SKIPPABLE — $1"; exit "$VERDICT_SKIPPABLE"; }
|
|
68
|
+
undecidable() { say "UNDECIDABLE — $1 (caller must treat as OWED)"; exit "$VERDICT_UNDECIDABLE"; }
|
|
69
|
+
|
|
70
|
+
command -v git >/dev/null 2>&1 || undecidable "git not on PATH"
|
|
71
|
+
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || undecidable "not inside a work tree"
|
|
72
|
+
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
# NO GROK-SPECIFIC ARM, and the reason is measured rather than argued.
|
|
75
|
+
#
|
|
76
|
+
# An earlier revision skipped unconditionally on the Grok harness, on the claim
|
|
77
|
+
# that `plugins/soleur/scripts/grok-pre-push-gate.sh` "re-runs test-all.sh at
|
|
78
|
+
# push time and ABORTS THE PUSH on failure", making Phase 4's run a duplicate.
|
|
79
|
+
# The second half of that claim is FALSE: the gate is not wired as a git hook.
|
|
80
|
+
# `lefthook.yml` has a `pre-push:` section and it carries zero references to that
|
|
81
|
+
# script (it is the client-pii-grep mirror); ship/SKILL.md's grok block is an
|
|
82
|
+
# INSTRUCTION TO AN AGENT, not an enforcement surface. So the arm traded a
|
|
83
|
+
# mechanism for a convention.
|
|
84
|
+
#
|
|
85
|
+
# Worse, it was evaluated BEFORE the conditions below and the script it looked
|
|
86
|
+
# for is always present in this repo — so on that harness it returned SKIPPABLE
|
|
87
|
+
# for every invocation, including a dirty tree and an infra diff. The suite's own
|
|
88
|
+
# Grok row pinned exactly that behaviour.
|
|
89
|
+
#
|
|
90
|
+
# The framing was also inverted: Phase 4 is the FIRST local run and the push-time
|
|
91
|
+
# gate is the second, so skipping Phase 4 does not remove a duplicate — it moves
|
|
92
|
+
# the only local checkpoint PAST Phase 5's checklist and Phase 5.5's
|
|
93
|
+
# code-mutating gates, so a red at push time invalidates all of that work.
|
|
94
|
+
#
|
|
95
|
+
# The CI-based conditions below already cover the Grok re-run path once the
|
|
96
|
+
# branch is pushed, and they cover it with EVIDENCE (a green required set on this
|
|
97
|
+
# exact sha) rather than a prediction about what a later phase will do.
|
|
98
|
+
|
|
99
|
+
# ---------------------------------------------------------------------------
|
|
100
|
+
# Condition 1 — the working tree must BE the HEAD commit.
|
|
101
|
+
#
|
|
102
|
+
# This is the sharpest of the four. A green run on an ancestor SHA is not
|
|
103
|
+
# evidence about your working tree, and nothing downstream can recover from
|
|
104
|
+
# getting it wrong: every later condition would be measuring a different tree
|
|
105
|
+
# than the one about to be shipped.
|
|
106
|
+
# ---------------------------------------------------------------------------
|
|
107
|
+
DIRTY="$(git status --porcelain 2>/dev/null)"
|
|
108
|
+
rc=$?
|
|
109
|
+
(( rc == 0 )) || undecidable "git status failed (rc=$rc)"
|
|
110
|
+
[[ -n "$DIRTY" ]] && owed "working tree is dirty; CI verified a different tree"
|
|
111
|
+
|
|
112
|
+
HEAD_SHA="$(git rev-parse HEAD 2>/dev/null)"
|
|
113
|
+
[[ "$HEAD_SHA" =~ ^[0-9a-f]{40}$ ]] || undecidable "could not resolve a full HEAD sha"
|
|
114
|
+
|
|
115
|
+
# NO SEPARATE "IS IT PUSHED?" CONDITION, deliberately.
|
|
116
|
+
#
|
|
117
|
+
# An earlier revision fetched origin/<branch> and refused on a non-zero unpushed
|
|
118
|
+
# count. That is SUBSUMED by condition 3: an unpushed commit has no check-runs
|
|
119
|
+
# for its sha, so every required context reads ABSENT and the gate already
|
|
120
|
+
# returns OWED. There is no tree the unpushed check refused that condition 3
|
|
121
|
+
# admits — and its two test rows passed only because the `gh` stub ignored the
|
|
122
|
+
# sha it was asked about, so it pinned nothing.
|
|
123
|
+
#
|
|
124
|
+
# Where the two DISAGREE, the unpushed check was wrong: a commit pushed under a
|
|
125
|
+
# different ref name, or a locally stale origin/<branch>, is a tree CI genuinely
|
|
126
|
+
# verified, and refusing it bought a needless 35-minute run. It also made a
|
|
127
|
+
# network write (`git fetch`) inside a read-only-looking gate, whose failure
|
|
128
|
+
# returned UNDECIDABLE — so a flaky link cost a battery.
|
|
129
|
+
|
|
130
|
+
# ---------------------------------------------------------------------------
|
|
131
|
+
# Condition 2 — THE BRANCH MUST BE UP TO DATE WITH origin/main.
|
|
132
|
+
#
|
|
133
|
+
# This is what makes the gate's headline claim TRUE, and without it the claim is
|
|
134
|
+
# false on this repo. `.github/workflows/ci.yml` triggers on `push` for **main
|
|
135
|
+
# only**, plus `pull_request` — so a feature branch gets no push-event CI at all,
|
|
136
|
+
# and the `test` check-run on its head comes from a pull_request run, which
|
|
137
|
+
# GitHub builds against `refs/pull/N/merge`. CI therefore verified
|
|
138
|
+
# merge(HEAD, base-at-run-time), NOT the HEAD tree the local battery would run.
|
|
139
|
+
#
|
|
140
|
+
# Those two trees are identical exactly when origin/main is already an ancestor of
|
|
141
|
+
# HEAD: the merge is then a fast-forward and its tree IS HEAD's tree. When main
|
|
142
|
+
# has advanced they differ, and "CI verified this exact tree" stops being true —
|
|
143
|
+
# which is ordinary rather than exotic: the CI Required ruleset is `strict: true`
|
|
144
|
+
# (measured 2026-09-18; it read `false` when this was first written), so a branch
|
|
145
|
+
# cannot MERGE while behind — but it is routinely behind while its CI runs and
|
|
146
|
+
# while this gate is consulted, which is exactly when the two trees differ.
|
|
147
|
+
#
|
|
148
|
+
# Refusing here rather than reasoning about whether the merge tree is "close
|
|
149
|
+
# enough" keeps the gate's claim and its evidence the same sentence. The cost is
|
|
150
|
+
# that a behind branch runs the battery — which is the status quo, not a
|
|
151
|
+
# regression.
|
|
152
|
+
# ---------------------------------------------------------------------------
|
|
153
|
+
if ! git merge-base --is-ancestor refs/remotes/origin/main HEAD 2>/dev/null; then
|
|
154
|
+
owed "origin/main is not an ancestor of HEAD; CI's pull_request run verified merge(HEAD, base), not this tree"
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
# ---------------------------------------------------------------------------
|
|
158
|
+
# Condition 3 — the infra shard, where this battery is the ONLY BLOCKING gate.
|
|
159
|
+
#
|
|
160
|
+
# `apps/web-platform/infra/`'s registered suites are run by
|
|
161
|
+
# .github/workflows/infra-validation.yml on every PR touching the path, but that
|
|
162
|
+
# workflow is NOT in the required set (#6480) — so nothing stops
|
|
163
|
+
# `gh pr merge --auto` on a red one. "Only BLOCKING gate", not "only gate": the
|
|
164
|
+
# overstated version is what gets a condition deleted by the next person to check
|
|
165
|
+
# it, and the narrower claim is still enough to justify refusing here.
|
|
166
|
+
#
|
|
167
|
+
# TWO PREFIXES, because test-all.sh matches two (scripts/test-all.sh, the
|
|
168
|
+
# `_infra_in_diff` block). The second is not decoration: apex-single-node-replace
|
|
169
|
+
# reads apply-web-platform-infra.yml's `-target=` allow-list, so a diff dropping
|
|
170
|
+
# an entry from that workflow ALONE is an infra regression. An earlier revision
|
|
171
|
+
# re-derived the predicate with one prefix and drifted on its first write; the
|
|
172
|
+
# parity row in the suite now fails if test-all.sh grows a third.
|
|
173
|
+
#
|
|
174
|
+
# SELF-RETIRING: evaluated only while `infra-validate-required` is absent from
|
|
175
|
+
# the LIVE required set. When #6480 lands and that context becomes required,
|
|
176
|
+
# condition 3 demands it present-and-green on this sha and this condition becomes
|
|
177
|
+
# a no-op automatically — no stale pointer, no dead branch, and nobody has to
|
|
178
|
+
# remember to come back. That is the same reasoning as reading the live ruleset
|
|
179
|
+
# rather than scripts/required-checks.txt, applied one level up.
|
|
180
|
+
# ---------------------------------------------------------------------------
|
|
181
|
+
if ! git rev-parse --verify --quiet refs/remotes/origin/main >/dev/null 2>&1; then
|
|
182
|
+
undecidable "origin/main is unresolvable; cannot scope the diff"
|
|
183
|
+
fi
|
|
184
|
+
# `--name-status -M` and BOTH path columns, not `--name-only`: a file renamed OUT
|
|
185
|
+
# of the infra surface prints only its new path under --name-only, so the gate
|
|
186
|
+
# would miss it while test-all.sh's own predicate catches it. Measured on a probe
|
|
187
|
+
# repo: --name-only gave `moved.tf`; --name-status -M gave
|
|
188
|
+
# `R100 apps/web-platform/infra/a.tf moved.tf`.
|
|
189
|
+
#
|
|
190
|
+
# `tr '\t' '\n'` IS THE FIX, NOT FORMATTING. A rename emits both paths on ONE
|
|
191
|
+
# tab-joined line, and INFRA_RE is `^`-anchored, so `cut -f2-` alone tests only
|
|
192
|
+
# the OLD path — the gate saw renames OUT of the surface and was blind to renames
|
|
193
|
+
# IN. Measured on a probe repo: `R100 src/x.tf apps/web-platform/infra/x.tf`
|
|
194
|
+
# did NOT match, so a 100%-similarity rename of a .tf file INTO the module
|
|
195
|
+
# directory returned SKIPPABLE. Terraform loads every *.tf in the directory, so
|
|
196
|
+
# that is a real infra change with no content diff, on the one shard no required
|
|
197
|
+
# check covers. The `$`-anchored workflow alternative had the mirror bug: a
|
|
198
|
+
# rename of apply-web-platform-infra.yml OUT of .github/workflows/ left the
|
|
199
|
+
# literal in column 1 and never matched. Splitting the columns onto separate
|
|
200
|
+
# lines tests each path independently.
|
|
201
|
+
#
|
|
202
|
+
# A COPY is not affected and needs no handling: without `-C` git reports the new
|
|
203
|
+
# file as `A` with a single column, which already matches. Do not add `-C` in the
|
|
204
|
+
# belief that it closes a gap — measured, it does not exist.
|
|
205
|
+
CHANGED="$(git diff --name-status -M origin/main...HEAD 2>/dev/null | cut -f2- | tr '\t' '\n')"
|
|
206
|
+
rc=$?
|
|
207
|
+
(( rc == 0 )) || undecidable "could not compute the branch diff (rc=$rc)"
|
|
208
|
+
# An EMPTY diff is not "no infra paths" — it is "HEAD is an ancestor of
|
|
209
|
+
# origin/main" (already merged, or origin/main fetched past the branch point), in
|
|
210
|
+
# which case condition 2 is a no-op regardless of what the branch touched.
|
|
211
|
+
if [[ -z "${CHANGED//[[:space:]]/}" ]] && ! git merge-base --is-ancestor HEAD origin/main 2>/dev/null; then
|
|
212
|
+
undecidable "the branch diff is empty but HEAD is not an ancestor of origin/main; cannot scope the infra check"
|
|
213
|
+
fi
|
|
214
|
+
INFRA_RE='^(apps/web-platform/infra/|\.github/workflows/apply-web-platform-infra\.yml$)'
|
|
215
|
+
|
|
216
|
+
# ---------------------------------------------------------------------------
|
|
217
|
+
# Condition 4 — every required context PRESENT and green on this exact SHA.
|
|
218
|
+
#
|
|
219
|
+
# PRESENCE IS ASSERTED, never inferred from "nothing is failing". An empty
|
|
220
|
+
# rollup on a just-pushed head satisfies "no failures" vacuously, so a
|
|
221
|
+
# failure-only scan would report a clean sweep having examined nothing. This is
|
|
222
|
+
# the same non-vacuity trap `/ship` Phase 6.5 documents for `gh pr checks`.
|
|
223
|
+
#
|
|
224
|
+
# The LIVE ruleset is authoritative, not scripts/required-checks.txt: the file
|
|
225
|
+
# is a mirror and can drift, and a drifted mirror under-requires, which fails
|
|
226
|
+
# in the unsafe direction. If the ruleset cannot be read we return UNDECIDABLE
|
|
227
|
+
# rather than falling back to the file.
|
|
228
|
+
# ---------------------------------------------------------------------------
|
|
229
|
+
command -v gh >/dev/null 2>&1 || undecidable "gh not on PATH; cannot read CI state"
|
|
230
|
+
command -v jq >/dev/null 2>&1 || undecidable "jq not on PATH; cannot read CI state"
|
|
231
|
+
# `timeout` is coreutils and is NOT present on a stock macOS. Without this guard
|
|
232
|
+
# the calls below exit 127 and land in the ruleset branch, which then blames
|
|
233
|
+
# GitHub for a missing binary — and on that host the gate is permanently
|
|
234
|
+
# UNDECIDABLE, so the feature silently never works. This ships to customers'
|
|
235
|
+
# machines, where macOS-without-coreutils is the common case.
|
|
236
|
+
command -v timeout >/dev/null 2>&1 || undecidable "timeout (coreutils) not on PATH; cannot bound the API calls"
|
|
237
|
+
|
|
238
|
+
# EVERY NETWORK CALL IS BOUNDED. `gh` imposes no timeout of its own: measured
|
|
239
|
+
# against a blackholed endpoint, `gh api --hostname 10.255.255.1 …` was still
|
|
240
|
+
# running at 25 s. Three unbounded calls in a gate that runs before a 35-minute
|
|
241
|
+
# battery is the "never throws AND always returns" rule with only the first half
|
|
242
|
+
# satisfied — try/catch bounds exceptions, not time. rc 124 from `timeout` needs
|
|
243
|
+
# no special handling: it is non-zero, so each call falls into the branch it
|
|
244
|
+
# already has (undecidable for the first two, an empty set for statuses).
|
|
245
|
+
# {context, integration_id} — NOT the context alone. GitHub only counts a
|
|
246
|
+
# check-run toward a required context when it comes from the app that context
|
|
247
|
+
# pins, so matching on name alone made this gate strictly MORE PERMISSIVE than
|
|
248
|
+
# the ruleset it calls authoritative — the unsafe direction: any installed app
|
|
249
|
+
# with `checks: write` could satisfy a required context by naming a check-run
|
|
250
|
+
# after it.
|
|
251
|
+
#
|
|
252
|
+
# Carry each context's OWN integration_id; do NOT collapse this to a constant.
|
|
253
|
+
# The app id is NOT uniform across the required set. Measured 2026-09-17 against
|
|
254
|
+
# the live ruleset. Today (post-#9454, merge queue adopted, CodeQL advisory) every
|
|
255
|
+
# required context is pinned to 15368 (GitHub Actions) — 23 CI Required + 2 CLA
|
|
256
|
+
# Required — but that is a property of the current rulesets, not of this gate. While
|
|
257
|
+
# CodeQL WAS required (until #9454) the split was 25 x 15368 + `CodeQL` x 57789
|
|
258
|
+
# (github-advanced-security), and a CodeQL re-tighten (codeql-1537-revisit-watch.yml)
|
|
259
|
+
# would restore a non-uniform set. The code is deliberately per-context so it stays
|
|
260
|
+
# right either way; an earlier revision of this comment asserted a uniform 15368 set
|
|
261
|
+
# and was wrong at the time. Hardcoding 15368 would leave any differently-bound
|
|
262
|
+
# context permanently unmatched → ABSENT → OWED.
|
|
263
|
+
# --paginate here too. Without it a rules array exceeding one page truncates and
|
|
264
|
+
# the gate requires FEWER contexts than the ruleset does — under-requiring, the
|
|
265
|
+
# unsafe direction, and the same failure this file rejects required-checks.txt
|
|
266
|
+
# for. The union across every ruleset on the branch is deliberate: the CLA and CI
|
|
267
|
+
# rulesets each contribute contexts.
|
|
268
|
+
REQUIRED_JSON="$(timeout 15 gh api --paginate 'repos/{owner}/{repo}/rules/branches/main' \
|
|
269
|
+
--jq '.[] | select(.type == "required_status_checks") | .parameters.required_status_checks[] | {context: .context, integration_id: .integration_id}' 2>/dev/null | jq -s '.')"
|
|
270
|
+
rc=$?
|
|
271
|
+
(( rc == 0 )) || undecidable "could not read the branch ruleset (rc=$rc)"
|
|
272
|
+
|
|
273
|
+
REQUIRED_COUNT="$(jq 'length' <<<"$REQUIRED_JSON" 2>/dev/null)"
|
|
274
|
+
[[ "$REQUIRED_COUNT" =~ ^[0-9]+$ ]] || undecidable "could not parse the required-context list"
|
|
275
|
+
(( REQUIRED_COUNT > 0 )) || undecidable "the ruleset declares zero required contexts; refusing to skip on an empty requirement set"
|
|
276
|
+
|
|
277
|
+
# --paginate is load-bearing, and NOT for the reason first written here. The API
|
|
278
|
+
# defaults to 30 per page but `gh` injects `per_page=100` automatically (measured
|
|
279
|
+
# via GH_DEBUG=api, gh 2.101.0), so the page count is total/100. That still
|
|
280
|
+
# paginates on this repo: measured over six recent origin/main commits, check-run
|
|
281
|
+
# rows ranged 73–227 (a57cdb772 = 227 rows / 97 distinct names / 3 pages /
|
|
282
|
+
# 3.3–4.4 s).
|
|
283
|
+
#
|
|
284
|
+
# DO NOT cap the pagination. The `sort_by(.started_at) | last` evaluation below
|
|
285
|
+
# genuinely needs every attempt per name — truncating at page 1 on a 227-row sha
|
|
286
|
+
# hands it an arbitrary subset and it could pick a stale "newest". The bound is
|
|
287
|
+
# the `timeout`, not a page cap. The set is self-limiting anyway (the API
|
|
288
|
+
# defaults to filter=latest, so rows scale with distinct checks × re-runs).
|
|
289
|
+
CHECKS="$(timeout 30 gh api --paginate "repos/{owner}/{repo}/commits/${HEAD_SHA}/check-runs" \
|
|
290
|
+
--jq '.check_runs[] | {name: .name, status: .status, conclusion: .conclusion, started_at: .started_at, app_id: (.app.id // null)}' 2>/dev/null | jq -s '.')"
|
|
291
|
+
rc=$?
|
|
292
|
+
(( rc == 0 )) || undecidable "could not read check-runs for ${HEAD_SHA:0:9} (rc=$rc)"
|
|
293
|
+
|
|
294
|
+
# Legacy commit STATUSES are a separate surface from check-runs, and some
|
|
295
|
+
# required contexts can arrive as statuses. But measured over six recent
|
|
296
|
+
# origin/main commits this endpoint returned ZERO rows every time — all 26
|
|
297
|
+
# required contexts on this repo are check-runs — while costing ~629 ms per
|
|
298
|
+
# invocation. So it is fetched LAZILY: only when the check-runs surface alone
|
|
299
|
+
# leaves a context unaccounted for.
|
|
300
|
+
#
|
|
301
|
+
# That removes a round trip from the SKIPPABLE path specifically, which is the
|
|
302
|
+
# one path where this gate's latency is pure overhead (no battery follows it to
|
|
303
|
+
# amortize against). On the OWED path the call still runs and still does real
|
|
304
|
+
# work — distinguishing ABSENT from present-as-a-status — where 0.6 s sits
|
|
305
|
+
# against 35 minutes.
|
|
306
|
+
eval_missing() {
|
|
307
|
+
jq -r --argjson req "$REQUIRED_JSON" '
|
|
308
|
+
[ $req[] as $r
|
|
309
|
+
| { name: $r.context,
|
|
310
|
+
state: ( [ .[]
|
|
311
|
+
| select(.name == $r.context)
|
|
312
|
+
# App identity: a required context pinned to an integration
|
|
313
|
+
# is satisfiable ONLY by that app. A row with no app id (a
|
|
314
|
+
# legacy commit status) can satisfy an UNPINNED context only.
|
|
315
|
+
| select($r.integration_id == null or .app_id == $r.integration_id) ] as $rows
|
|
316
|
+
# ORDER-INDEPENDENT REFUSALS FIRST. `sort_by(.started_at // "")`
|
|
317
|
+
# gives a null/absent started_at the key "", which sorts BEFORE
|
|
318
|
+
# every ISO timestamp — so `last` picks an OLDER completed row
|
|
319
|
+
# and an in-flight attempt becomes invisible. Measured: one
|
|
320
|
+
# completed+success row plus one in_progress row with
|
|
321
|
+
# started_at null returned "ok". That is a wrong SKIP, and it
|
|
322
|
+
# is the same newest-wins inversion this file already fixed
|
|
323
|
+
# once, arriving through the sort KEY instead of the sort.
|
|
324
|
+
#
|
|
325
|
+
# So neither refusal below consults ordering at all. Any
|
|
326
|
+
# non-completed attempt means CI is not finished on this sha,
|
|
327
|
+
# whatever its timestamp. And when two or more rows exist with
|
|
328
|
+
# a missing key, "newest" is not decidable — fail toward OWED
|
|
329
|
+
# rather than pick one. A single completed row needs no order.
|
|
330
|
+
| if ($rows | length) == 0 then "ABSENT"
|
|
331
|
+
elif ($rows | any(.status != "completed")) then "NOT-GREEN"
|
|
332
|
+
elif (($rows | length) > 1
|
|
333
|
+
and ($rows | any((.started_at // "") == ""))) then "NOT-GREEN"
|
|
334
|
+
else ($rows
|
|
335
|
+
| sort_by(.started_at)
|
|
336
|
+
| last
|
|
337
|
+
| if .conclusion == "success" then "ok" else "NOT-GREEN" end)
|
|
338
|
+
end ) }
|
|
339
|
+
| select(.state != "ok") | "\(.name)=\(.state)" ]
|
|
340
|
+
| join(", ")' <<<"$1" 2>/dev/null
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
MISSING="$(eval_missing "$CHECKS")"
|
|
344
|
+
rc=$?
|
|
345
|
+
(( rc == 0 )) || undecidable "could not evaluate required contexts against the check surfaces"
|
|
346
|
+
|
|
347
|
+
if [[ -n "$MISSING" ]]; then
|
|
348
|
+
STATUSES="$(timeout 15 gh api --paginate "repos/{owner}/{repo}/commits/${HEAD_SHA}/statuses" \
|
|
349
|
+
--jq '.[] | {name: .context, status: "completed", conclusion: (if .state == "success" then "success" else .state end), started_at: .created_at, app_id: null}' 2>/dev/null | jq -s '.')"
|
|
350
|
+
rc=$?
|
|
351
|
+
(( rc == 0 )) || STATUSES='[]'
|
|
352
|
+
ALL="$(jq -s 'add' <<<"$CHECKS"$'\n'"$STATUSES" 2>/dev/null)"
|
|
353
|
+
[[ -n "$ALL" ]] || undecidable "could not merge the check surfaces"
|
|
354
|
+
MISSING="$(eval_missing "$ALL")"
|
|
355
|
+
rc=$?
|
|
356
|
+
(( rc == 0 )) || undecidable "could not evaluate required contexts against the check surfaces"
|
|
357
|
+
fi
|
|
358
|
+
|
|
359
|
+
# NEWEST RUN PER NAME, never "any run with this name was green".
|
|
360
|
+
#
|
|
361
|
+
# GitHub keeps every attempt, and a re-run adds a row rather than replacing one:
|
|
362
|
+
# measured on merge commit 72fdff382 of this repo, 121 check-runs carried only 63
|
|
363
|
+
# distinct names (`probe` x14, `connector_census` x13). So an `any(...succeeded)`
|
|
364
|
+
# test reports `ok` for a context that passed, was RE-RUN, and FAILED — which is
|
|
365
|
+
# the exact state a human would look at and call red. Sort by started_at and
|
|
366
|
+
# judge only the last one; GitHub's own rule is latest-run-wins.
|
|
367
|
+
#
|
|
368
|
+
# `completed`+`success` is still required, so a name whose newest attempt is
|
|
369
|
+
# still running reads NOT-GREEN rather than inheriting an older green.
|
|
370
|
+
|
|
371
|
+
if [[ -n "$MISSING" ]]; then
|
|
372
|
+
owed "required context(s) not present-and-green on ${HEAD_SHA:0:9}: ${MISSING}"
|
|
373
|
+
fi
|
|
374
|
+
|
|
375
|
+
# Condition 2, evaluated here because it is predicated on the LIVE required set.
|
|
376
|
+
# `any(.[]; .context == $c)`, not `index($c)`: REQUIRED_JSON is an array of
|
|
377
|
+
# {context, integration_id} OBJECTS, so a bare-string index never matches and the
|
|
378
|
+
# condition would never retire.
|
|
379
|
+
if ! jq -e --arg c "infra-validate-required" 'any(.[]; .context == $c)' <<<"$REQUIRED_JSON" >/dev/null 2>&1; then
|
|
380
|
+
if grep -qE "$INFRA_RE" <<<"$CHANGED"; then
|
|
381
|
+
owed "diff touches the infra surface and infra-validate-required is NOT in the live required set (#6480) — the battery is its only BLOCKING gate"
|
|
382
|
+
fi
|
|
383
|
+
fi
|
|
384
|
+
|
|
385
|
+
# ---------------------------------------------------------------------------
|
|
386
|
+
# Every condition held.
|
|
387
|
+
# ---------------------------------------------------------------------------
|
|
388
|
+
# No "and these suites go unrun" note here, deliberately: it would be FALSE.
|
|
389
|
+
# test-all.sh registers every suite inside one of want_scripts /
|
|
390
|
+
# want_scripts_heavy / want_bun / want_webplat / want_infra, and CI's required
|
|
391
|
+
# `test` context runs the first four plus web-platform-build. The only
|
|
392
|
+
# local-only residue is the infra group,
|
|
393
|
+
# which condition 2 refuses on. An earlier revision claimed a residue that does
|
|
394
|
+
# not exist, which both overstated the risk and contradicted this file's own
|
|
395
|
+
# containment argument.
|
|
396
|
+
# STATE ONLY WHAT WAS MEASURED. An earlier revision of this line claimed
|
|
397
|
+
# "nothing unpushed" — a predicate this script no longer evaluates at all — and
|
|
398
|
+
# "no apps/*/infra/** in the diff", which is FALSE on the self-retire path, where
|
|
399
|
+
# the infra block is skipped precisely because the context became required and
|
|
400
|
+
# the diff may well touch infra. A verdict line naming a cause the run did not
|
|
401
|
+
# measure is the AP-021 class, and it is worse here than elsewhere because this
|
|
402
|
+
# line is the operator's only record of why 35 minutes were skipped.
|
|
403
|
+
skippable "all ${REQUIRED_COUNT} required contexts present and green on ${HEAD_SHA:0:9}; working tree clean; origin/main is an ancestor of HEAD"
|