@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,192 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Enumerates open remote GitHub PRs and classifies each into one of seven drain
|
|
3
|
+
# tiers (ready-green, ready-unarmed, needs-lockfile-fix, needs-conflict-resolution,
|
|
4
|
+
# needs-review, drafts, broken), emitting a tier-grouped report.
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# triage-prs.sh [--format text|json] [--fixture <path>]
|
|
8
|
+
#
|
|
9
|
+
# --fixture is test-only: reads the PR-list JSON from a file instead of `gh`.
|
|
10
|
+
# The fixture must be the exact shape of
|
|
11
|
+
# `gh pr list --state open --json number,title,headRefName,isDraft,mergeable,reviewDecision,labels,author,createdAt,statusCheckRollup`.
|
|
12
|
+
#
|
|
13
|
+
# Classification is first-match-wins in this priority order:
|
|
14
|
+
# 1. drafts isDraft == true (author-owned WIP)
|
|
15
|
+
# 2. broken CONFLICTING AND >=3 failing checks
|
|
16
|
+
# 3. needs-conflict-resolution CONFLICTING
|
|
17
|
+
# 4. needs-lockfile-fix has `dependencies` label AND >0 failing checks
|
|
18
|
+
# 5. ready-unarmed ready (non-draft) PR whose head verdict is no-run or
|
|
19
|
+
# stalled and nothing else is failing: it was readied but
|
|
20
|
+
# no full CI run exists (ADR-276 S3, #9728). Recovery:
|
|
21
|
+
# `gh pr ready --undo <N>` then `gh pr ready <N>` (user token)
|
|
22
|
+
# 6. needs-review has `bot-fix/review-required` label
|
|
23
|
+
# OR reviewDecision == REVIEW_REQUIRED
|
|
24
|
+
# 7. ready-green MERGEABLE AND 0 failing checks (not awaiting-approval)
|
|
25
|
+
# 8. needs-review (fallback: UNKNOWN-mergeable / un-reviewed)
|
|
26
|
+
#
|
|
27
|
+
# Failing checks are counted from the NEWEST row per check name (a ready PR carries the
|
|
28
|
+
# draft run's rows AND the ready run's rows; counting both reads a decided PR as red). For a
|
|
29
|
+
# ready PR whose newest `test` row is red, plugins/soleur/scripts/ci-head-verdict.sh decides
|
|
30
|
+
# whether that row is the draft-era one: pending-full, no-run, stalled and awaiting-approval
|
|
31
|
+
# never count it failing; full-decided and n/a keep today's reading. A resolver that errors
|
|
32
|
+
# keeps today's reading too. Live mode calls the resolver for each non-draft PR with a failing
|
|
33
|
+
# `test` row; --fixture mode never does unless CI_HEAD_VERDICT_BIN is set (a test seam). A resolver that cannot read prints
|
|
34
|
+
# state=error (exit 3), outside the six whitelisted states, so it is ignored: a real red `test` is never softened by an outage.
|
|
35
|
+
# `no-run` goes to ready-unarmed too, with a recovery that first asks whether another session is still inside wait-ready-run.
|
|
36
|
+
|
|
37
|
+
set -euo pipefail
|
|
38
|
+
|
|
39
|
+
FORMAT="text"
|
|
40
|
+
FIXTURE=""
|
|
41
|
+
|
|
42
|
+
usage() {
|
|
43
|
+
cat <<'EOF'
|
|
44
|
+
Usage: triage-prs.sh [--format text|json] [--fixture <path>]
|
|
45
|
+
EOF
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
while [[ $# -gt 0 ]]; do
|
|
49
|
+
case "$1" in
|
|
50
|
+
--format) FORMAT="$2"; shift 2 ;;
|
|
51
|
+
--fixture) FIXTURE="$2"; shift 2 ;;
|
|
52
|
+
-h|--help) usage; exit 0 ;;
|
|
53
|
+
*) echo "Unknown argument: $1" >&2; usage >&2; exit 2 ;;
|
|
54
|
+
esac
|
|
55
|
+
done
|
|
56
|
+
|
|
57
|
+
command -v jq >/dev/null 2>&1 || { echo "ERROR: jq not found on PATH." >&2; exit 1; }
|
|
58
|
+
|
|
59
|
+
# --- Acquire the PR-list JSON ------------------------------------------------
|
|
60
|
+
if [[ -n "$FIXTURE" ]]; then
|
|
61
|
+
[[ -f "$FIXTURE" ]] || { echo "ERROR: fixture not found: $FIXTURE" >&2; exit 1; }
|
|
62
|
+
PR_JSON="$(cat "$FIXTURE")"
|
|
63
|
+
else
|
|
64
|
+
command -v gh >/dev/null 2>&1 || { echo "ERROR: gh not found on PATH." >&2; exit 1; }
|
|
65
|
+
gh auth status >/dev/null 2>&1 || { echo "ERROR: gh is not authenticated (run 'gh auth login')." >&2; exit 1; }
|
|
66
|
+
# Two-stage gh --json | jq (never `gh --jq` with --arg — learning
|
|
67
|
+
# 2026-04-15-gh-jq-does-not-forward-arg-to-jq).
|
|
68
|
+
#
|
|
69
|
+
# `--limit 200` is a LOAD-BEARING BOUND (#6736), not just a paging preference. It is
|
|
70
|
+
# the only cap on $PR_JSON, and $PR_JSON is by far the largest payload in this script:
|
|
71
|
+
# `statusCheckRollup` alone carries one object per check run per PR. Measured on this
|
|
72
|
+
# repo: 392,170 B at 20 open PRs, i.e. ~19.6 KB per PR.
|
|
73
|
+
PR_JSON="$(gh pr list --state open --limit 200 \
|
|
74
|
+
--json number,title,headRefName,isDraft,mergeable,reviewDecision,labels,author,createdAt,statusCheckRollup)"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# --- Head verdicts (ADR-276 S3) ------------------------------------------------
|
|
78
|
+
# Candidates: non-draft PRs whose newest `test` row is failing. One resolver call each.
|
|
79
|
+
VERDICT_BIN="${CI_HEAD_VERDICT_BIN:-}"
|
|
80
|
+
if [[ -z "$VERDICT_BIN" && -z "$FIXTURE" ]]; then
|
|
81
|
+
VERDICT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../scripts" 2>/dev/null && pwd -P)" || VERDICT_DIR=""
|
|
82
|
+
[[ -z "$VERDICT_DIR" ]] || VERDICT_BIN="$VERDICT_DIR/ci-head-verdict.sh"
|
|
83
|
+
fi
|
|
84
|
+
VERDICTS='{}'
|
|
85
|
+
if [[ -n "$VERDICT_BIN" && -r "$VERDICT_BIN" ]]; then
|
|
86
|
+
CANDIDATES="$(jq -r '
|
|
87
|
+
[ .[] | select(.isDraft != true) | . as $pr
|
|
88
|
+
| ([ .statusCheckRollup[]? | select((.name // .context) == "test") ]
|
|
89
|
+
| sort_by(.startedAt // "9999") | last // null) as $t
|
|
90
|
+
| select($t != null and (($t.conclusion // $t.state) as $c
|
|
91
|
+
| $c == "FAILURE" or $c == "ERROR" or $c == "CANCELLED" or $c == "TIMED_OUT"))
|
|
92
|
+
| $pr.number ] | .[]' <<<"$PR_JSON")"
|
|
93
|
+
for n in $CANDIDATES; do
|
|
94
|
+
marker="$(bash "$VERDICT_BIN" verdict "$n" 2>/dev/null)" || true
|
|
95
|
+
marker="$(grep -m1 '^SOLEUR_CI_HEAD_VERDICT ' <<<"$marker")" || continue
|
|
96
|
+
st="${marker#*state=}"; st="${st%% *}"
|
|
97
|
+
case "$st" in n/a|full-decided|pending-full|no-run|stalled|awaiting-approval) VERDICTS="$(jq -c --arg n "$n" --arg s "$st" '. + {($n): $s}' <<<"$VERDICTS")" ;; esac
|
|
98
|
+
done
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# --- Classify ---------------------------------------------------------------
|
|
102
|
+
# Emits a flat array of {number,title,author,mergeable,tier}. Failing/pending
|
|
103
|
+
# check counts are derived from statusCheckRollup (conclusion for check-runs,
|
|
104
|
+
# state for legacy statuses).
|
|
105
|
+
#
|
|
106
|
+
# ══ THE `<<<"$PR_JSON"` HERESTRING IS A LOAD-BEARING INVARIANT (#6736) ══
|
|
107
|
+
#
|
|
108
|
+
# $PR_JSON MUST reach jq via this herestring (or a pipe / file), and MUST NEVER be
|
|
109
|
+
# bound as `--argjson pr_json "$PR_JSON"`. A herestring is delivered on jq's STDIN
|
|
110
|
+
# through a pipe/tempfile and has no size limit; an --argjson binding makes it ONE argv
|
|
111
|
+
# argument, and the kernel caps a SINGLE argv argument at MAX_ARG_STRLEN = 131,072 B —
|
|
112
|
+
# verified by bisect on this host: 131,071 B passes, 131,072 B fails E2BIG. That is NOT
|
|
113
|
+
# `getconf ARG_MAX` (2,097,152 B here); a payload at 6% of ARG_MAX still dies.
|
|
114
|
+
#
|
|
115
|
+
# This is NOT a bound that is eroding toward a future failure — it is ALREADY 3× over.
|
|
116
|
+
# Measured on this repo: $PR_JSON is 392,170 B at 20 open PRs, 2.99 × MAX_ARG_STRLEN.
|
|
117
|
+
# Converting this herestring to --argjson does not degrade drain-prs at some later PR
|
|
118
|
+
# count; it breaks it on the next run, today, with `Argument list too long`. Even a
|
|
119
|
+
# single mid-size PR would exceed the ceiling on its own at ~19.6 KB/PR by PR #7.
|
|
120
|
+
#
|
|
121
|
+
# The `--argjson prs "$CLASSIFIED"` binding further down is SAFE and deliberately left
|
|
122
|
+
# alone: the projection above discards statusCheckRollup and keeps ~174 B/PR, measured
|
|
123
|
+
# 3,484 B at 20 PRs (2.7% of the ceiling). $CLASSIFIED is the collapse; $PR_JSON is the
|
|
124
|
+
# raw fan-out. Do not generalize from one to the other.
|
|
125
|
+
#
|
|
126
|
+
# Guarded by the argv-ceiling regression test in ../test/ — it drives this script with a
|
|
127
|
+
# synthesized >MAX_ARG_STRLEN fixture and asserts the fixture really exceeds the ceiling,
|
|
128
|
+
# so the test cannot silently degrade to vacuous.
|
|
129
|
+
CLASSIFIED="$(jq --argjson verdicts "$VERDICTS" '
|
|
130
|
+
# The NEWEST row per check name: a ready PR lists the draft run rows and the ready run rows.
|
|
131
|
+
# A queued re-run has no startedAt yet, so a null sorts as the newest.
|
|
132
|
+
# Keyed on workflow AND name: two workflows may each carry a check called `detect` or `build`, and a newer green in one
|
|
133
|
+
# must not hide an older red in the other.
|
|
134
|
+
def newest: [ .statusCheckRollup[]? ] | group_by([.workflowName // "", .name // .context // ""]) | map(sort_by(.startedAt // "9999") | last);
|
|
135
|
+
# The draft-era `test` row is not a failure while the head verdict says a ready run is coming or missing.
|
|
136
|
+
def softened($v): ($v == "pending-full" or $v == "no-run" or $v == "stalled" or $v == "awaiting-approval");
|
|
137
|
+
def counted($v): [ newest[] | select(((.name // .context) == "test" and softened($v)) | not) ];
|
|
138
|
+
def fails($v): [ counted($v)[] | (.conclusion // .state)
|
|
139
|
+
| select(. == "FAILURE" or . == "ERROR" or . == "CANCELLED" or . == "TIMED_OUT") ] | length;
|
|
140
|
+
def pending($v): [ counted($v)[] | (.status // .state)
|
|
141
|
+
| select(. == "IN_PROGRESS" or . == "QUEUED" or . == "PENDING" or . == "WAITING") ] | length;
|
|
142
|
+
def haslabel($n): any(.labels[]?; .name == $n);
|
|
143
|
+
[ .[] | . as $pr | ($verdicts[(.number | tostring)] // "") as $v
|
|
144
|
+
| ($pr | fails($v)) as $f | ($pr | pending($v)) as $p |
|
|
145
|
+
{
|
|
146
|
+
number: .number,
|
|
147
|
+
title: .title,
|
|
148
|
+
author: (.author.login // "unknown"),
|
|
149
|
+
mergeable: (.mergeable // "UNKNOWN"),
|
|
150
|
+
failing: $f,
|
|
151
|
+
pending: $p,
|
|
152
|
+
ci: $v,
|
|
153
|
+
tier: (
|
|
154
|
+
if .isDraft == true then "drafts"
|
|
155
|
+
elif .mergeable == "CONFLICTING" and $f >= 3 then "broken"
|
|
156
|
+
elif .mergeable == "CONFLICTING" then "needs-conflict-resolution"
|
|
157
|
+
elif ($pr | haslabel("dependencies")) and $f > 0 then "needs-lockfile-fix"
|
|
158
|
+
elif ($v == "no-run" or $v == "stalled") and $f == 0 then "ready-unarmed"
|
|
159
|
+
elif ($pr | haslabel("bot-fix/review-required")) or .reviewDecision == "REVIEW_REQUIRED" then "needs-review"
|
|
160
|
+
elif .mergeable == "MERGEABLE" and $f == 0 and $v != "awaiting-approval" then "ready-green"
|
|
161
|
+
else "needs-review"
|
|
162
|
+
end
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
| if .tier == "ready-unarmed" then . + { recovery: "if no session is still inside wait-ready-run for it: gh pr ready --undo \(.number) && gh pr ready \(.number) (user token, never GITHUB_TOKEN), then re-run the whole ship step 6 block (read ready-count first, arm only after wait-ready-run exits 0)" } else . end
|
|
166
|
+
]' <<<"$PR_JSON")"
|
|
167
|
+
|
|
168
|
+
# --- Emit -------------------------------------------------------------------
|
|
169
|
+
# Stable tier order for the grouped output.
|
|
170
|
+
TIER_ORDER='["ready-green","ready-unarmed","needs-lockfile-fix","needs-conflict-resolution","needs-review","broken","drafts"]'
|
|
171
|
+
|
|
172
|
+
if [[ "$FORMAT" == "json" ]]; then
|
|
173
|
+
jq -n --argjson prs "$CLASSIFIED" --argjson order "$TIER_ORDER" '
|
|
174
|
+
reduce $order[] as $t ({}; . + { ($t): [ $prs[] | select(.tier == $t) ] })
|
|
175
|
+
'
|
|
176
|
+
exit 0
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
# text format
|
|
180
|
+
echo "=== Open PR triage ==="
|
|
181
|
+
total="$(jq 'length' <<<"$CLASSIFIED")"
|
|
182
|
+
echo "Open PRs: $total"
|
|
183
|
+
echo ""
|
|
184
|
+
jq -r --argjson order "$TIER_ORDER" '
|
|
185
|
+
. as $prs
|
|
186
|
+
| $order[] as $t
|
|
187
|
+
| ([ $prs[] | select(.tier == $t) ]) as $g
|
|
188
|
+
| "## \($t) (\($g | length))",
|
|
189
|
+
( $g[] | " #\(.number) \(.title) [@\(.author), mergeable=\(.mergeable), fail=\(.failing), pending=\(.pending)\(if .ci != "" then ", ci=\(.ci)" else "" end)]",
|
|
190
|
+
(if .recovery then " recovery: \(.recovery)" else empty end) ),
|
|
191
|
+
""
|
|
192
|
+
' <<<"$CLASSIFIED"
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Argv-ceiling regression for plugins/soleur/skills/drain-prs/scripts/triage-prs.sh (#6736).
|
|
3
|
+
#
|
|
4
|
+
# WHAT THIS GUARDS. $PR_JSON reaches jq via a `<<<"$PR_JSON"` herestring. A herestring is
|
|
5
|
+
# delivered on stdin through a pipe/tempfile and has no size limit. If it is ever converted
|
|
6
|
+
# to `--argjson pr_json "$PR_JSON"` the payload becomes ONE argv argument, and the kernel
|
|
7
|
+
# caps a SINGLE argv argument at MAX_ARG_STRLEN = 131,072 B -- bisected on this host:
|
|
8
|
+
# 131,071 B passes, 131,072 B fails E2BIG. That is NOT `getconf ARG_MAX` (2,097,152 B here);
|
|
9
|
+
# a payload at 6% of ARG_MAX still dies.
|
|
10
|
+
#
|
|
11
|
+
# WHY THIS SITE GETS THE ONLY PHASE-2.3 ASSERTION. Every other bounded site in this sweep is
|
|
12
|
+
# comment-only: proving a bound nobody proposed removing means synthesizing ~30x the real
|
|
13
|
+
# fixture to fire for one imagined mutation. This site is different -- it is not an eroding
|
|
14
|
+
# bound, it is ALREADY over. Measured on this repo: $PR_JSON is 392,170 B at 20 open PRs,
|
|
15
|
+
# 2.99 x MAX_ARG_STRLEN, today. The herestring is the only reason drain-prs runs at all.
|
|
16
|
+
#
|
|
17
|
+
# FIXTURE ADEQUACY. The fixture is SYNTHESIZED (cq-test-fixtures-synthesized-only) and
|
|
18
|
+
# PRODUCTION-SHAPED: each PR carries a statusCheckRollup of realistic check-run objects,
|
|
19
|
+
# which is where the real bytes live. Row count is NOT the load-bearing parameter, BYTES PER
|
|
20
|
+
# ROW is -- 200 *minimal* PRs would measure well under the ceiling and would therefore pass
|
|
21
|
+
# against an --argjson mutation, i.e. vacuously. The suite asserts the fixture's byte size
|
|
22
|
+
# exceeds MAX_ARG_STRLEN in-suite so it cannot silently degrade as jq's encoding or the
|
|
23
|
+
# script's --json field list changes.
|
|
24
|
+
|
|
25
|
+
set -uo pipefail
|
|
26
|
+
|
|
27
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
28
|
+
TARGET="$SCRIPT_DIR/../scripts/triage-prs.sh"
|
|
29
|
+
|
|
30
|
+
# Named at every use, never bare (the whole point of the sweep is that this is a per-argument
|
|
31
|
+
# kernel constant, not ARG_MAX and not a byte count anyone should re-derive from memory).
|
|
32
|
+
MAX_ARG_STRLEN=131072
|
|
33
|
+
|
|
34
|
+
PASS=0
|
|
35
|
+
FAIL=0
|
|
36
|
+
|
|
37
|
+
pass() { echo " PASS: $1"; PASS=$((PASS + 1)); }
|
|
38
|
+
fail() { echo " FAIL: $1"; FAIL=$((FAIL + 1)); }
|
|
39
|
+
|
|
40
|
+
command -v jq >/dev/null 2>&1 || { echo "SKIP: jq missing"; exit 0; }
|
|
41
|
+
[[ -f "$TARGET" ]] || { echo "ERROR: target not found: $TARGET" >&2; exit 1; }
|
|
42
|
+
|
|
43
|
+
WORK="$(mktemp -d)"
|
|
44
|
+
trap 'rm -rf "$WORK"' EXIT
|
|
45
|
+
|
|
46
|
+
# --- Synthesized, production-shaped fixture ---------------------------------------------
|
|
47
|
+
# 40 PRs x ~25 check runs. Nothing here is copied from a real PR: numbers, titles, branch
|
|
48
|
+
# names, authors and check names are all generated.
|
|
49
|
+
FIXTURE="$WORK/prs.json"
|
|
50
|
+
PR_ROWS=40
|
|
51
|
+
CHECKS_PER_PR=25
|
|
52
|
+
|
|
53
|
+
jq -nc --argjson prs "$PR_ROWS" --argjson checks "$CHECKS_PER_PR" '
|
|
54
|
+
[ range(0; $prs) as $i
|
|
55
|
+
| { number: (4000 + $i),
|
|
56
|
+
title: ("synthesized fixture pull request for argv ceiling coverage number \($i) with a realistically long subject line"),
|
|
57
|
+
headRefName: ("synth/argv-ceiling-fixture-branch-with-a-long-name-\($i)"),
|
|
58
|
+
isDraft: (($i % 7) == 0),
|
|
59
|
+
mergeable: (if ($i % 5) == 0 then "CONFLICTING" else "MERGEABLE" end),
|
|
60
|
+
reviewDecision: (if ($i % 3) == 0 then "REVIEW_REQUIRED" else "APPROVED" end),
|
|
61
|
+
labels: [ {name: "synthesized-fixture"}, {name: "dependencies"} ],
|
|
62
|
+
author: { login: ("synth-author-\($i % 4)") },
|
|
63
|
+
createdAt: "2026-07-01T00:00:00Z",
|
|
64
|
+
statusCheckRollup:
|
|
65
|
+
[ range(0; $checks) as $c
|
|
66
|
+
| { __typename: "CheckRun",
|
|
67
|
+
name: ("synthesized-workflow-job-with-a-long-descriptive-name / matrix-shard-\($c)"),
|
|
68
|
+
status: "COMPLETED",
|
|
69
|
+
conclusion: (if ($c % 11) == 0 then "FAILURE" else "SUCCESS" end),
|
|
70
|
+
detailsUrl: ("https://example.invalid/synth/checks/\($i)/\($c)/a-long-details-path-segment"),
|
|
71
|
+
startedAt: "2026-07-01T00:00:00Z",
|
|
72
|
+
completedAt: "2026-07-01T00:05:00Z" } ] } ]' > "$FIXTURE"
|
|
73
|
+
|
|
74
|
+
echo "TEST: triage-prs argv ceiling (#6736)"
|
|
75
|
+
|
|
76
|
+
# --- Generator cardinality: an under-filled generator makes everything below vacuous -----
|
|
77
|
+
gen_rows="$(jq 'length' "$FIXTURE")"
|
|
78
|
+
if [[ "$gen_rows" -eq "$PR_ROWS" ]]; then
|
|
79
|
+
pass "fixture generator emitted $gen_rows PR rows (want $PR_ROWS)"
|
|
80
|
+
else
|
|
81
|
+
fail "fixture generator emitted $gen_rows PR rows (want $PR_ROWS) -- asserts below would be vacuous"
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
gen_checks="$(jq '[.[].statusCheckRollup | length] | unique | .[0]' "$FIXTURE")"
|
|
85
|
+
if [[ "$gen_checks" -eq "$CHECKS_PER_PR" ]]; then
|
|
86
|
+
pass "every PR row carries $gen_checks check runs (want $CHECKS_PER_PR)"
|
|
87
|
+
else
|
|
88
|
+
fail "check-run cardinality is $gen_checks (want $CHECKS_PER_PR) -- fixture is not production-shaped"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# --- FIXTURE ADEQUACY: the payload must actually exceed the ceiling ----------------------
|
|
92
|
+
# Asserted IN-SUITE, not demonstrated in a PR body: a PR-body demonstration is unrunnable
|
|
93
|
+
# after merge, because there is no pre-fix code left to run it against.
|
|
94
|
+
fixture_bytes="$(wc -c < "$FIXTURE")"
|
|
95
|
+
if [[ "$fixture_bytes" -gt "$MAX_ARG_STRLEN" ]]; then
|
|
96
|
+
pass "fixture is ${fixture_bytes} B > MAX_ARG_STRLEN (${MAX_ARG_STRLEN})"
|
|
97
|
+
else
|
|
98
|
+
fail "fixture is only ${fixture_bytes} B -- below MAX_ARG_STRLEN (${MAX_ARG_STRLEN}), this test proves nothing"
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# The collapse must stay FAR under the ceiling: this is what makes `--argjson prs
|
|
102
|
+
# "$CLASSIFIED"` safe, and it is the reason that binding is deliberately NOT converted.
|
|
103
|
+
# If the projection ever starts carrying statusCheckRollup through, this catches it.
|
|
104
|
+
#
|
|
105
|
+
# TWO-SIDED on purpose. `-lt MAX_ARG_STRLEN` alone passes when the collapse is 0 B --
|
|
106
|
+
# which is exactly what a crashed script produces, so a one-sided bound would report
|
|
107
|
+
# PASS on the very mutation this suite exists to catch. The lower bound makes "the
|
|
108
|
+
# script produced nothing" a FAILURE rather than a suspiciously good result.
|
|
109
|
+
classified_bytes="$(bash "$TARGET" --fixture "$FIXTURE" --format json 2>/dev/null | jq -c '[.[][]]' | wc -c)"
|
|
110
|
+
if [[ "$classified_bytes" -gt 1000 && "$classified_bytes" -lt "$MAX_ARG_STRLEN" ]]; then
|
|
111
|
+
pass "\$CLASSIFIED collapse is ${classified_bytes} B (>1000, < MAX_ARG_STRLEN ${MAX_ARG_STRLEN})"
|
|
112
|
+
elif [[ "$classified_bytes" -le 1000 ]]; then
|
|
113
|
+
fail "\$CLASSIFIED is only ${classified_bytes} B for $PR_ROWS PRs -- the script produced (almost) nothing; this bound is vacuous"
|
|
114
|
+
else
|
|
115
|
+
fail "\$CLASSIFIED is ${classified_bytes} B -- the projection no longer collapses; --argjson prs is now unsafe"
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
# --- Behavioural: the script survives a >ceiling PR_JSON --------------------------------
|
|
119
|
+
# This is the assertion that goes RED when the herestring becomes --argjson: jq dies with
|
|
120
|
+
# E2BIG ("Argument list too long") and the command substitution yields a non-zero exit.
|
|
121
|
+
out="$(bash "$TARGET" --fixture "$FIXTURE" --format json 2>"$WORK/err.txt")"
|
|
122
|
+
rc=$?
|
|
123
|
+
if [[ "$rc" -eq 0 ]]; then
|
|
124
|
+
pass ">MAX_ARG_STRLEN fixture exits 0 (pre-fix this dies 'Argument list too long')"
|
|
125
|
+
else
|
|
126
|
+
fail ">MAX_ARG_STRLEN fixture exit=$rc -- stderr: $(head -c 200 "$WORK/err.txt")"
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
# E2BIG must not be reachable even as a swallowed diagnostic.
|
|
130
|
+
if grep -qiE 'argument list too long' "$WORK/err.txt"; then
|
|
131
|
+
fail "stderr carries an E2BIG diagnostic -- argv ceiling was hit"
|
|
132
|
+
else
|
|
133
|
+
pass "no 'Argument list too long' diagnostic on stderr"
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# --- Completeness: every synthesized PR must survive classification ----------------------
|
|
137
|
+
# Guards the silent-truncation failure mode, which an exit-code-only assertion misses: a
|
|
138
|
+
# partial read that classified 12 of 40 PRs would still exit 0.
|
|
139
|
+
classified_count="$(printf '%s' "$out" | jq '[.[][]] | length')"
|
|
140
|
+
if [[ "$classified_count" -eq "$gen_rows" ]]; then
|
|
141
|
+
pass "all $classified_count PRs classified (== $gen_rows source rows, no truncation)"
|
|
142
|
+
else
|
|
143
|
+
fail "classified $classified_count PRs but fixture had $gen_rows -- truncation/undercount"
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
# The tier field must be really populated, not empty shells at >ceiling size.
|
|
147
|
+
tiered="$(printf '%s' "$out" | jq '[.[][] | select(.tier != null and .number != null)] | length')"
|
|
148
|
+
if [[ "$tiered" -eq "$gen_rows" ]]; then
|
|
149
|
+
pass "all $tiered rows carry a tier + number at >ceiling size"
|
|
150
|
+
else
|
|
151
|
+
fail "only $tiered of $gen_rows rows carry tier+number"
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
# --- Structural: the herestring must not have become an --argjson binding ----------------
|
|
155
|
+
# Anchored on the ASSIGNMENT LINE, not a bare token. `--argjson` legitimately appears in
|
|
156
|
+
# this script (`--argjson prs`, `--argjson order`) and `PR_JSON` now appears in the
|
|
157
|
+
# load-bearing comment block, so a bare grep for either would false-pass on prose.
|
|
158
|
+
if grep -qE '^CLASSIFIED="\$\(jq ' "$TARGET"; then
|
|
159
|
+
pass "CLASSIFIED is still assigned from a jq invocation"
|
|
160
|
+
else
|
|
161
|
+
fail "CLASSIFIED assignment shape changed -- re-verify the herestring invariant by hand"
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
# Comments start with '#', so a match on a line that both ENDS the jq program and applies
|
|
165
|
+
# the herestring cannot be produced by the comment block above it.
|
|
166
|
+
if grep -qE "^[[:space:]]*\]'[[:space:]]*<<<\"\\\$PR_JSON\"\\)\"$" "$TARGET"; then
|
|
167
|
+
pass "PR_JSON is applied via a <<< herestring (no argv binding)"
|
|
168
|
+
else
|
|
169
|
+
fail "the <<<\"\$PR_JSON\" herestring is gone -- if it became --argjson, PR_JSON (392,170 B at 20 PRs) now exceeds MAX_ARG_STRLEN ($MAX_ARG_STRLEN)"
|
|
170
|
+
fi
|
|
171
|
+
|
|
172
|
+
# Directly forbid the mutation this suite exists to catch, on a CODE line only.
|
|
173
|
+
# `grep -c` (not `producer | grep -q`): under `set -o pipefail` an early match closes the
|
|
174
|
+
# pipe, the producer takes SIGPIPE (141) and the pipeline fails even though grep MATCHED.
|
|
175
|
+
argjson_prjson="$(grep -cE '^[^#]*--argjson[[:space:]]+[a-z_]+[[:space:]]+"\$PR_JSON"' "$TARGET")"
|
|
176
|
+
if [[ "$argjson_prjson" -eq 0 ]]; then
|
|
177
|
+
pass "no --argjson binding of \$PR_JSON on any code line"
|
|
178
|
+
else
|
|
179
|
+
fail "\$PR_JSON is bound via --argjson on $argjson_prjson code line(s) -- exceeds MAX_ARG_STRLEN ($MAX_ARG_STRLEN) on every real run"
|
|
180
|
+
fi
|
|
181
|
+
|
|
182
|
+
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
183
|
+
[[ "$FAIL" -eq 0 ]]
|