@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,365 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# common.sh — shared helpers for plugins/soleur/scripts/affected-tests.sh (#9307 PR2).
|
|
3
|
+
#
|
|
4
|
+
# Sourced by the gate and by the stack adapters in this directory. Declarations
|
|
5
|
+
# only: no `exit`, no top-level side effects — the ONE exit site is finish().
|
|
6
|
+
#
|
|
7
|
+
# External binaries invoked here: bash, ps, awk, grep, getconf, sysctl, nproc,
|
|
8
|
+
# sleep, kill, date, command (builtin), printf (builtin). NO bare `timeout` —
|
|
9
|
+
# affected_timeout resolves timeout -> gtimeout -> bounded watchdog.
|
|
10
|
+
|
|
11
|
+
if [[ "${_SOLEUR_AFFECTED_COMMON_LOADED:-}" == "1" ]]; then
|
|
12
|
+
return 0 2>/dev/null || true
|
|
13
|
+
fi
|
|
14
|
+
_SOLEUR_AFFECTED_COMMON_LOADED=1
|
|
15
|
+
|
|
16
|
+
# --- epoch ------------------------------------------------------------------
|
|
17
|
+
# `date +%s` is POSIX and present on BSD/macOS. `date -d` is banned (GNU-only).
|
|
18
|
+
affected_now() { date +%s; }
|
|
19
|
+
|
|
20
|
+
# --- cpu count --------------------------------------------------------------
|
|
21
|
+
# getconf -> sysctl -> nproc. Prints an integer >= 1, always.
|
|
22
|
+
affected_ncpu() {
|
|
23
|
+
local n=""
|
|
24
|
+
n="$(getconf _NPROCESSORS_ONLN 2>/dev/null || true)"
|
|
25
|
+
[[ "$n" =~ ^[0-9]+$ ]] && (( n >= 1 )) || n=""
|
|
26
|
+
if [[ -z "$n" ]]; then
|
|
27
|
+
n="$(sysctl -n hw.ncpu 2>/dev/null || true)"
|
|
28
|
+
[[ "$n" =~ ^[0-9]+$ ]] && (( n >= 1 )) || n=""
|
|
29
|
+
fi
|
|
30
|
+
if [[ -z "$n" ]]; then
|
|
31
|
+
n="$(nproc 2>/dev/null || true)"
|
|
32
|
+
[[ "$n" =~ ^[0-9]+$ ]] && (( n >= 1 )) || n=""
|
|
33
|
+
fi
|
|
34
|
+
printf '%s\n' "${n:-1}"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# --- running-gate count ------------------------------------------------------
|
|
38
|
+
# Counts OTHER running affected-tests.sh processes, anchored on an argv SLOT —
|
|
39
|
+
# never pgrep -f and never a `ps | grep` substring over the joined command line
|
|
40
|
+
# (the #8231 class: the pattern self-matches the poller's own `bash -c` argv and
|
|
41
|
+
# the count can never reach zero). ps + word-splitting is used with ONE further
|
|
42
|
+
# restriction: the script name is matched only at (a) argv[0] — a direct/shebang
|
|
43
|
+
# exec — or (b) the first operand of a resolved shell word — `bash
|
|
44
|
+
# <path>/affected-tests.sh`. A `bash -c '…affected-tests.sh…'` payload starts
|
|
45
|
+
# with `-c` at that slot and never counts, so a watcher can never self-match;
|
|
46
|
+
# the accepted gap is that a bare `-c` payload whose whole body is the script
|
|
47
|
+
# path also does not count (it undercounts siblings, which biases the divisor
|
|
48
|
+
# UP for nobody and merely widens width — documented, not corrected).
|
|
49
|
+
#
|
|
50
|
+
# Leading wrapper commands (timeout/gtimeout/env/nohup/nice/setsid/flock/…) are
|
|
51
|
+
# stepped over together with their option-ish operands, per the proc.sh wrapper
|
|
52
|
+
# walk — without it `timeout 600 bash affected-tests.sh` is invisible.
|
|
53
|
+
affected_running_gates() {
|
|
54
|
+
local line pid b n=0
|
|
55
|
+
local -a w=()
|
|
56
|
+
while IFS= read -r line; do
|
|
57
|
+
# ps pads the pid column; capture pid and argv separately by regex rather
|
|
58
|
+
# than field-splitting a column whose width varies.
|
|
59
|
+
[[ "$line" =~ ^[[:space:]]*([0-9]+)[[:space:]]+(.*)$ ]] || continue
|
|
60
|
+
pid="${BASH_REMATCH[1]}"
|
|
61
|
+
# Self and (when bash >= 4 exposes it) the command-substitution subshell
|
|
62
|
+
# this loop runs in — the subshell INHERITS this script's argv and would
|
|
63
|
+
# otherwise self-count. bash 3.2 has no BASHPID: the substitution then
|
|
64
|
+
# counts as one extra gate, biasing width DOWN — the safe direction (an
|
|
65
|
+
# undercount would bias width UP, toward oversubscription).
|
|
66
|
+
[[ "$pid" == "$$" ]] && continue
|
|
67
|
+
[[ -n "${BASHPID:-}" && "$pid" == "$BASHPID" ]] && continue
|
|
68
|
+
w=()
|
|
69
|
+
read -ra w <<<"${BASH_REMATCH[2]}"
|
|
70
|
+
((${#w[@]} > 0)) || continue
|
|
71
|
+
# Wrapper walk: consume a wrapper word plus its own operands
|
|
72
|
+
# (options, VAR=value assignments, bare durations).
|
|
73
|
+
while ((${#w[@]} > 0)); do
|
|
74
|
+
case "${w[0]##*/}" in
|
|
75
|
+
timeout|gtimeout|env|nohup|nice|ionice|setsid|flock|stdbuf|time|taskset|command)
|
|
76
|
+
w=("${w[@]:1}")
|
|
77
|
+
while ((${#w[@]} > 0)) && [[ "${w[0]}" == -* || "${w[0]}" == *=* || "${w[0]}" =~ ^[0-9]+$ ]]; do
|
|
78
|
+
w=("${w[@]:1}")
|
|
79
|
+
done
|
|
80
|
+
continue
|
|
81
|
+
;;
|
|
82
|
+
esac
|
|
83
|
+
break
|
|
84
|
+
done
|
|
85
|
+
((${#w[@]} > 0)) || continue
|
|
86
|
+
b="${w[0]##*/}"
|
|
87
|
+
if [[ "$b" == "affected-tests.sh" ]]; then
|
|
88
|
+
n=$((n + 1))
|
|
89
|
+
continue
|
|
90
|
+
fi
|
|
91
|
+
case " bash sh dash zsh ksh mksh ash " in
|
|
92
|
+
*" $b "*)
|
|
93
|
+
if ((${#w[@]} > 1)) && [[ "${w[1]}" != -* && "${w[1]##*/}" == "affected-tests.sh" ]]; then
|
|
94
|
+
n=$((n + 1))
|
|
95
|
+
fi
|
|
96
|
+
;;
|
|
97
|
+
esac
|
|
98
|
+
done < <(ps -eo pid=,args= 2>/dev/null)
|
|
99
|
+
printf '%s\n' "$n"
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# --- file census ---------------------------------------------------------------
|
|
103
|
+
# affected_find_files <count|any> <basename-glob>… — the ONE census walker every
|
|
104
|
+
# adapter shares (consolidates four near-identical find blocks). Prints matching
|
|
105
|
+
# paths; `any` adds -quit so callers can pipe to `grep -q .` without a SIGPIPE
|
|
106
|
+
# short-read. The prune list is the UNION of what any adapter skips — build and
|
|
107
|
+
# vendor output is never a test source.
|
|
108
|
+
affected_find_files() {
|
|
109
|
+
local mode="$1"; shift
|
|
110
|
+
local -a expr=()
|
|
111
|
+
local g first=1
|
|
112
|
+
for g in "$@"; do
|
|
113
|
+
(( first )) || expr+=(-o)
|
|
114
|
+
expr+=(-name "$g")
|
|
115
|
+
first=0
|
|
116
|
+
done
|
|
117
|
+
local -a tail=(-print)
|
|
118
|
+
[[ "$mode" == any ]] && tail=(-print -quit)
|
|
119
|
+
find . \( -name .git -o -name node_modules -o -name vendor -o -name .venv \
|
|
120
|
+
-o -name venv -o -name .tox -o -name __pycache__ -o -name dist \
|
|
121
|
+
-o -name build -o -name coverage -o -name .next \) -prune \
|
|
122
|
+
-o -type f \( "${expr[@]}" \) "${tail[@]}" 2>/dev/null
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# --- worker width ------------------------------------------------------------
|
|
126
|
+
# max(1, ncpu/2) / (1 + running gate processes); $1 (config max_workers) wins.
|
|
127
|
+
# Unmeasured heuristic — labelled as such in the gate header.
|
|
128
|
+
affected_workers() {
|
|
129
|
+
local override="${1:-}" ncpu gates w
|
|
130
|
+
if [[ "$override" =~ ^[0-9]+$ ]] && (( override >= 1 )); then
|
|
131
|
+
printf '%s\n' "$override"
|
|
132
|
+
return 0
|
|
133
|
+
fi
|
|
134
|
+
ncpu="$(affected_ncpu)"
|
|
135
|
+
gates="$(affected_running_gates)"
|
|
136
|
+
[[ "$gates" =~ ^[0-9]+$ ]] || gates=0
|
|
137
|
+
w=$(( (ncpu / 2) / (1 + gates) ))
|
|
138
|
+
(( w >= 1 )) || w=1
|
|
139
|
+
printf '%s\n' "$w"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# --- portable bound ------------------------------------------------------------
|
|
143
|
+
# affected_timeout <seconds> <cmd...> — timeout -> gtimeout -> bounded watchdog.
|
|
144
|
+
# Returns the command's rc, or 124 on expiry (timeout's own spelling, so callers
|
|
145
|
+
# can treat the three backends uniformly; the watchdog prints 124 the same way).
|
|
146
|
+
# 137 is also an expiry signal when the bound had to escalate to SIGKILL.
|
|
147
|
+
# Both coreutils backends carry `-k <grace>` so a TERM-ignoring child is KILLed
|
|
148
|
+
# 10 s after expiry rather than running unbounded (BSD gtimeout supports -k too);
|
|
149
|
+
# the watchdog arm already escalates on its own schedule.
|
|
150
|
+
affected_timeout() {
|
|
151
|
+
local secs="$1"
|
|
152
|
+
shift
|
|
153
|
+
if command -v timeout >/dev/null 2>&1; then
|
|
154
|
+
timeout -k 10 "$secs" "$@"
|
|
155
|
+
return $?
|
|
156
|
+
fi
|
|
157
|
+
if command -v gtimeout >/dev/null 2>&1; then
|
|
158
|
+
gtimeout -k 10 "$secs" "$@"
|
|
159
|
+
return $?
|
|
160
|
+
fi
|
|
161
|
+
# Bounded watchdog: no coreutils on this host (stock macOS). 1 s granularity.
|
|
162
|
+
local pid rc=0 waited=0
|
|
163
|
+
"$@" &
|
|
164
|
+
pid=$!
|
|
165
|
+
while kill -0 "$pid" 2>/dev/null; do
|
|
166
|
+
if (( waited >= secs )); then
|
|
167
|
+
# Process-group kill first — a bounded command's own children outlive a
|
|
168
|
+
# direct-kill of the leader. GUARDED: under non-job-control `&` the child
|
|
169
|
+
# shares OUR process group, and group-killing that would suicide the
|
|
170
|
+
# gate; the direct kill below is the fallback that always applies.
|
|
171
|
+
local pgid="" ownpg=""
|
|
172
|
+
pgid="$(ps -o pgid= -p "$pid" 2>/dev/null | tr -d ' ')"
|
|
173
|
+
ownpg="$(ps -o pgid= -p "$$" 2>/dev/null | tr -d ' ')"
|
|
174
|
+
if [[ -n "$pgid" && "$pgid" != "$ownpg" ]]; then
|
|
175
|
+
kill -TERM -- "-$pgid" 2>/dev/null || true
|
|
176
|
+
fi
|
|
177
|
+
kill -TERM "$pid" 2>/dev/null || true
|
|
178
|
+
sleep 1
|
|
179
|
+
if [[ -n "$pgid" && "$pgid" != "$ownpg" ]]; then
|
|
180
|
+
kill -KILL -- "-$pgid" 2>/dev/null || true
|
|
181
|
+
fi
|
|
182
|
+
kill -KILL "$pid" 2>/dev/null || true
|
|
183
|
+
wait "$pid" 2>/dev/null || true
|
|
184
|
+
return 124
|
|
185
|
+
fi
|
|
186
|
+
sleep 1
|
|
187
|
+
waited=$((waited + 1))
|
|
188
|
+
done
|
|
189
|
+
wait "$pid" || rc=$?
|
|
190
|
+
return "$rc"
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
# affected_bound <cmd...> — run the command under the REMAINING wall-clock
|
|
194
|
+
# budget when enforcement is armed (AFFECTED_BUDGET_ACTIVE=1 and
|
|
195
|
+
# AFFECTED_DEADLINE is an epoch). Unarmed: a plain run. Expired or expired
|
|
196
|
+
# mid-run: 124. A failure observed before expiry returns the command's own rc —
|
|
197
|
+
# that ordering (failure wins over deferral) is the contract's rc-1-over-rc-6
|
|
198
|
+
# rule and is why the bound is applied per runner invocation rather than once
|
|
199
|
+
# around the whole gate.
|
|
200
|
+
# INITIALISED UNCONDITIONALLY — these are NEVER inherited from the caller's
|
|
201
|
+
# environment. A forged AFFECTED_BUDGET_ACTIVE=1 + a past AFFECTED_DEADLINE
|
|
202
|
+
# would let every bound expire on its first check and launder a deferral
|
|
203
|
+
# (rc 6 pass-with-note) without a detected CI. The gate arms them itself,
|
|
204
|
+
# only when a CI test workflow was detected.
|
|
205
|
+
AFFECTED_BUDGET_ACTIVE=0
|
|
206
|
+
AFFECTED_DEADLINE=0
|
|
207
|
+
affected_bound() {
|
|
208
|
+
if [[ "$AFFECTED_BUDGET_ACTIVE" == "1" ]]; then
|
|
209
|
+
local rem
|
|
210
|
+
rem=$(( AFFECTED_DEADLINE - $(affected_now) ))
|
|
211
|
+
(( rem > 0 )) || return 124
|
|
212
|
+
affected_timeout "$rem" "$@"
|
|
213
|
+
return $?
|
|
214
|
+
fi
|
|
215
|
+
"$@"
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
# --- scratch files ---------------------------------------------------------------
|
|
219
|
+
# Every mktemp in the gate and its adapters funnels here so an EXIT/INT/TERM
|
|
220
|
+
# trap in affected-tests.sh can remove them all — including on the early-exit
|
|
221
|
+
# refusal paths that never reach the caller's own rm.
|
|
222
|
+
AFFECTED_SCRATCH=()
|
|
223
|
+
affected_mktemp() { # <tag> — sets AFFECTED_TMP to a fresh registered scratch path
|
|
224
|
+
AFFECTED_TMP="$(mktemp "${TMPDIR:-/tmp}/affected-$1.XXXXXX")" || return 1 # lint-trap-ownership: ok — owning `trap affected_scratch_clean EXIT INT TERM` is installed by the sourcing gate (affected-tests.sh); a sourced lib cannot own an EXIT trap without clobbering the importer's
|
|
225
|
+
AFFECTED_SCRATCH+=("$AFFECTED_TMP")
|
|
226
|
+
}
|
|
227
|
+
affected_scratch_clean() {
|
|
228
|
+
((${#AFFECTED_SCRATCH[@]} > 0)) && rm -f "${AFFECTED_SCRATCH[@]}"
|
|
229
|
+
return 0
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
# --- marker field hygiene -----------------------------------------------------------
|
|
233
|
+
# Config-derived strings (key names, workflow filenames, inert/global patterns)
|
|
234
|
+
# reach marker fields verbatim; a newline or space in one breaks the field
|
|
235
|
+
# shape. Collapse anything outside a printable, whitespace-free set to `_`.
|
|
236
|
+
affected_marker_field() {
|
|
237
|
+
printf '%s' "$1" | LC_ALL=C tr -c 'A-Za-z0-9_.:/=+-' '_'
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
# --- vacuous test_command denylist -----------------------------------------------------
|
|
241
|
+
# A DENYLIST, not a proof: it refuses the shapes that certify nothing — bare
|
|
242
|
+
# `true`/`:`/`exit`/`echo`, every segment vacuous (`echo ok; true`), a
|
|
243
|
+
# true-swallower at the tail (`cmd || true`, `cmd ; exit 0`, `cmd && true`),
|
|
244
|
+
# and exit-inside-subcommand (`bash -c 'exit 0'`, `sh -c '...; exit 0'`).
|
|
245
|
+
# Anything not on the list still runs verbatim and unverified.
|
|
246
|
+
_affected_vacuous_seg() { # <trimmed segment> → rc 0 when it certifies nothing
|
|
247
|
+
local s="$1"
|
|
248
|
+
s="$(printf '%s' "$s" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')"
|
|
249
|
+
[[ -n "$s" ]] || return 0
|
|
250
|
+
case "$s" in
|
|
251
|
+
true|:|exit|"exit "*|echo|"echo "*) return 0 ;;
|
|
252
|
+
esac
|
|
253
|
+
# `sh -c '…'` / `bash -c "…"` (optionally env-wrapped): the inner command is
|
|
254
|
+
# what's vacuous or not — recurse on it.
|
|
255
|
+
local inner=""
|
|
256
|
+
case "$s" in
|
|
257
|
+
env\ *-c\ *|bash\ -c\ *|sh\ -c\ *|dash\ -c\ *|zsh\ -c\ *|ksh\ -c\ *|eval\ *)
|
|
258
|
+
inner="${s#* -c }"
|
|
259
|
+
# `eval\ ` (escaped space) is deliberate: hook-input-contract's A1 idiom ban
|
|
260
|
+
# greps this lib for an `eval` followed by a bare space — a prefix-strip
|
|
261
|
+
# pattern is not an invocation, but the guard keys on the token, so the
|
|
262
|
+
# pattern is spelled to stay outside its match.
|
|
263
|
+
[[ "$inner" == "$s" ]] && inner="${s#eval\ }"
|
|
264
|
+
inner="${inner#[\"\']}"; inner="${inner%[\"\']}"
|
|
265
|
+
_affected_cmd_vacuous "$inner" && return 0 ;;
|
|
266
|
+
esac
|
|
267
|
+
return 1
|
|
268
|
+
}
|
|
269
|
+
_affected_cmd_vacuous() { # <command string> → rc 0 when it certifies nothing
|
|
270
|
+
local norm split seg last=""
|
|
271
|
+
# Strip comments (`true # ok` is still just `true`), normalise whitespace,
|
|
272
|
+
# then split on the shell's list operators. The LAST segment decides the
|
|
273
|
+
# whole command's rc: a vacuous tail is either an all-vacuous command
|
|
274
|
+
# (`true`, `echo ok; :`) or a true-swallower (`cmd || true`, `cmd ; exit 0`,
|
|
275
|
+
# `cmd && true`, `cmd | true`) — both refuse.
|
|
276
|
+
norm="$(printf '%s' "$1" | sed 's/#.*$//' | tr '\n\t' ' ' | tr -s ' ' \
|
|
277
|
+
| sed 's/^ //; s/ *;*$//; s/ $//')"
|
|
278
|
+
[[ -n "$norm" ]] || return 0
|
|
279
|
+
split="${norm//&&/$'\n'}"
|
|
280
|
+
split="${split//\|\|/$'\n'}"
|
|
281
|
+
split="${split//|/$'\n'}"
|
|
282
|
+
split="${split//;/$'\n'}"
|
|
283
|
+
while IFS= read -r seg; do
|
|
284
|
+
seg="${seg#"${seg%%[![:space:]]*}"}"
|
|
285
|
+
[[ -n "$seg" ]] && last="$seg"
|
|
286
|
+
done <<<"$split"
|
|
287
|
+
_affected_vacuous_seg "$last"
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
# Marker + human lines are emitted ONLY from finish(); the guard property is
|
|
291
|
+
# that there is one place a verdict can be written and one place a run can end.
|
|
292
|
+
#
|
|
293
|
+
# finish <rc> <mode> <reason> <stack> <ci> [ran of skipped]
|
|
294
|
+
# rc: 0 pass-or-inert | 1 failure/signal | 4 refused | 6 budget-deferred | 7 no suite
|
|
295
|
+
# mode: selected | full | custom | explain | none
|
|
296
|
+
# reason: ok | inert | empty-selection | empty-diff | census-degraded |
|
|
297
|
+
# global-paths | full-requested |
|
|
298
|
+
# custom-command | delegated | runner-refused | runner-signal | foreign-runner |
|
|
299
|
+
# no-stack | bad-config key=<k> | vacuous-test-command | no-base-ref |
|
|
300
|
+
# toolchain-missing | no-tests | budget-deferred | bad-usage | help
|
|
301
|
+
# Counts are decimal, or `-` when the path does not produce a count
|
|
302
|
+
# (delegated runner, opaque test_command, refused runs).
|
|
303
|
+
finish() {
|
|
304
|
+
local rc="$1" mode="${2:--}" reason="${3:--}" stack="${4:--}" ci="${5:-none}"
|
|
305
|
+
local ran="${6:--}" of="${7:--}" skipped="${8:--}"
|
|
306
|
+
case "$rc" in
|
|
307
|
+
0)
|
|
308
|
+
if [[ "$reason" == inert ]]; then
|
|
309
|
+
echo "NO_TESTS_AFFECTED inert_rule=$(affected_marker_field "${INERT_RULE:--}")"
|
|
310
|
+
echo "No tests ran: docs-only change."
|
|
311
|
+
elif [[ "$ran" == "-" || "$of" == "-" ]]; then
|
|
312
|
+
# `-` counts mark both real runs whose tallies are opaque (delegated
|
|
313
|
+
# runner, custom-command — these still owe the verdict line) and paths
|
|
314
|
+
# where nothing ran (help, explain, self-check — a `Ran - of -` line or
|
|
315
|
+
# a pass claim would read as a test result that never happened). A run
|
|
316
|
+
# where EITHER count is unknown also suppresses the sentence — a
|
|
317
|
+
# half-known tally (`Ran 3 of -`) reads as a real count with a broken
|
|
318
|
+
# denominator.
|
|
319
|
+
# Verdict line still prints for a real run whose tallies are opaque:
|
|
320
|
+
# delegated runner, custom command, or a count-units case like
|
|
321
|
+
# testmon — anything in selected/full/custom mode DID run tests.
|
|
322
|
+
# Suppressed only on paths where nothing ran (explain/none/help).
|
|
323
|
+
case "$mode" in
|
|
324
|
+
selected|full|custom) echo "affected-suite gate passed." ;;
|
|
325
|
+
esac
|
|
326
|
+
else
|
|
327
|
+
# `of` is the repo-wide test-file census, not the affected subset —
|
|
328
|
+
# `ran` counts files actually executed.
|
|
329
|
+
printf 'Ran %s of the repo'"'"'s %s test files affected by this change: passed.\n' "$ran" "$of"
|
|
330
|
+
echo "affected-suite gate passed."
|
|
331
|
+
fi
|
|
332
|
+
;;
|
|
333
|
+
4)
|
|
334
|
+
# A refusal is a marker line with the reason and a remedy pointer, plus a
|
|
335
|
+
# human-readable name for the cause — never a bare rc.
|
|
336
|
+
local remedy="see plugins/soleur/skills/ship/references/affected-gate-contract.md"
|
|
337
|
+
case "$reason" in
|
|
338
|
+
vacuous-test-command|bad-config*)
|
|
339
|
+
remedy="fix .soleur-test-gate.json (the named key)" ;;
|
|
340
|
+
no-base-ref)
|
|
341
|
+
remedy="git fetch to unshallow, or pass --base <ref>" ;;
|
|
342
|
+
toolchain-missing)
|
|
343
|
+
remedy="install the detected stack's test tool, or set test_command in .soleur-test-gate.json" ;;
|
|
344
|
+
no-stack|foreign-runner)
|
|
345
|
+
remedy="set test_command in .soleur-test-gate.json" ;;
|
|
346
|
+
esac
|
|
347
|
+
echo "AFFECTED_GATE_REFUSED reason=$reason"
|
|
348
|
+
echo " remedy: $remedy"
|
|
349
|
+
;;
|
|
350
|
+
6)
|
|
351
|
+
echo "AFFECTED_GATE_BUDGET_DEFERRED ran=$ran of=$of"
|
|
352
|
+
if [[ "$ci" == config:* ]]; then
|
|
353
|
+
# budget_ci forced eligibility — no workflow was detected to name.
|
|
354
|
+
echo "Budget expired before the run completed; CI deferral was forced by ${ci} — the CI gate is authoritative."
|
|
355
|
+
else
|
|
356
|
+
echo "Budget expired before the run completed; the detected CI test workflow ($ci) is the authoritative gate."
|
|
357
|
+
fi
|
|
358
|
+
;;
|
|
359
|
+
7)
|
|
360
|
+
echo "No test suite detected in this repository; the affected-suite gate had nothing to run."
|
|
361
|
+
;;
|
|
362
|
+
esac
|
|
363
|
+
echo "AFFECTED_GATE ran=$ran of=$of skipped=$skipped mode=$mode reason=$reason stack=$stack ci=$ci"
|
|
364
|
+
exit "$rc"
|
|
365
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# go.sh — Go adapter for affected-tests.sh (#9307 PR2). Sourced, not executed.
|
|
3
|
+
#
|
|
4
|
+
# Detection: go.mod. Selection: the changed packages PLUS the reverse-dependency
|
|
5
|
+
# closure — a leaf package alone is the false-narrow shape Guard 1 row 9 names —
|
|
6
|
+
# computed from `go list` import edges (Imports + TestImports + XTestImports).
|
|
7
|
+
# Run: `go test -p <width>` on the selected set; `./...` when full. A run whose
|
|
8
|
+
# every package reports `[no test files]` is vacuous — never a pass.
|
|
9
|
+
#
|
|
10
|
+
# External binaries: find, grep, sort, comm, go.
|
|
11
|
+
|
|
12
|
+
if [[ "${_SOLEUR_AFFECTED_GO_LOADED:-}" == "1" ]]; then
|
|
13
|
+
return 0 2>/dev/null || true
|
|
14
|
+
fi
|
|
15
|
+
_SOLEUR_AFFECTED_GO_LOADED=1
|
|
16
|
+
|
|
17
|
+
affected_go_detect() {
|
|
18
|
+
[[ -f go.mod ]]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
affected_go_tool() {
|
|
22
|
+
if command -v go >/dev/null 2>&1 \
|
|
23
|
+
&& affected_timeout 15 go version >/dev/null 2>&1; then
|
|
24
|
+
ADP_TOOL=(go)
|
|
25
|
+
return 0
|
|
26
|
+
fi
|
|
27
|
+
ADP_TOOL=()
|
|
28
|
+
return 4
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
affected_go_total() {
|
|
32
|
+
affected_find_files count '*_test.go' | grep -c . || true
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Print the selected package set: changed packages plus their reverse-dependency
|
|
36
|
+
# closure. Output via stdout (one ImportPath per line); rc 1 when the module
|
|
37
|
+
# graph cannot be listed at all (caller then falls back to ./...).
|
|
38
|
+
affected_go_closure() {
|
|
39
|
+
local -a changed_dirs=() changed_pkgs=()
|
|
40
|
+
local f d p
|
|
41
|
+
for f in ${AFFECTED_CHANGED[@]+"${AFFECTED_CHANGED[@]}"}; do
|
|
42
|
+
case "$f" in
|
|
43
|
+
*.go) [[ -f "$f" ]] || continue
|
|
44
|
+
d="${f%/*}"; [[ "$d" == "$f" ]] && d="."
|
|
45
|
+
changed_dirs+=("./$d") ;;
|
|
46
|
+
esac
|
|
47
|
+
done
|
|
48
|
+
if (( ${#changed_dirs[@]} == 0 )); then
|
|
49
|
+
return 1
|
|
50
|
+
fi
|
|
51
|
+
# while-read, never `for d in $(…)`: a directory whose name contains a space
|
|
52
|
+
# must not be split into two bogus operands.
|
|
53
|
+
while IFS= read -r d; do
|
|
54
|
+
[[ -n "$d" ]] || continue
|
|
55
|
+
# Bounded like every other probe — a `go list` that blocks on module
|
|
56
|
+
# resolution must not park the gate (affected_timeout: timeout→gtimeout→
|
|
57
|
+
# watchdog). The same bound covers the ./... graph walk below.
|
|
58
|
+
p="$(affected_timeout 60 "${ADP_TOOL[@]}" list -e -f '{{.ImportPath}}' "$d" 2>/dev/null || true)"
|
|
59
|
+
[[ -n "$p" && "$p" != -* ]] && changed_pkgs+=("$p")
|
|
60
|
+
done < <(printf '%s\n' "${changed_dirs[@]}" | sort -u)
|
|
61
|
+
if (( ${#changed_pkgs[@]} == 0 )); then
|
|
62
|
+
return 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# Forward edges: pkg -> packages it imports (test imports included — a test
|
|
66
|
+
# file importing the changed package is how the change is observed).
|
|
67
|
+
local graph
|
|
68
|
+
graph="$(affected_timeout 60 "${ADP_TOOL[@]}" list -e -f '{{.ImportPath}}|{{join .Imports " "}}|{{join .TestImports " "}}|{{join .XTestImports " "}}' ./... 2>/dev/null)" \
|
|
69
|
+
|| return 1
|
|
70
|
+
[[ -n "$graph" ]] || return 1
|
|
71
|
+
|
|
72
|
+
# BFS over the reverse edges. Bash 3.2 (no assoc arrays): the selected set is
|
|
73
|
+
# a space-delimited string; each pass adds every package that imports a
|
|
74
|
+
# selected one. Termination is guaranteed by a bound of total packages.
|
|
75
|
+
local sel=" $(printf '%s ' "${changed_pkgs[@]}")" grew=1 guard=0
|
|
76
|
+
local line pkg deps dep
|
|
77
|
+
while (( grew && guard < 10000 )); do
|
|
78
|
+
grew=0
|
|
79
|
+
guard=$((guard + 1))
|
|
80
|
+
while IFS= read -r line; do
|
|
81
|
+
pkg="${line%%|*}"
|
|
82
|
+
[[ "$sel" == *" $pkg "* ]] && continue
|
|
83
|
+
deps="${line#*|}"
|
|
84
|
+
local found=0
|
|
85
|
+
for dep in ${deps//|/ }; do
|
|
86
|
+
if [[ "$sel" == *" $dep "* ]]; then found=1; break; fi
|
|
87
|
+
done
|
|
88
|
+
if (( found )); then
|
|
89
|
+
sel+="$pkg "
|
|
90
|
+
grew=1
|
|
91
|
+
fi
|
|
92
|
+
done <<<"$graph"
|
|
93
|
+
done
|
|
94
|
+
# A guard-trip means the closure was still growing at the bound — returning
|
|
95
|
+
# the TRUNCATED set would be a silent false-narrow. Refuse the selection;
|
|
96
|
+
# the caller treats rc 1 as unlistable and falls back to ./... (coverage-
|
|
97
|
+
# favoring).
|
|
98
|
+
if (( grew && guard >= 10000 )); then
|
|
99
|
+
return 1
|
|
100
|
+
fi
|
|
101
|
+
printf '%s' "$sel" | tr ' ' '\n' | grep -v '^$' | sort -u
|
|
102
|
+
return 0
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# affected_go_run <selected|full> <width>. Sets ADP_RAN/ADP_OF/ADP_VACUOUS.
|
|
106
|
+
affected_go_run() {
|
|
107
|
+
local mode="$1" width="$2"
|
|
108
|
+
ADP_VACUOUS=0
|
|
109
|
+
ADP_OF="$(affected_go_total)"
|
|
110
|
+
local -a cmd=("${ADP_TOOL[@]}" test -p "$width")
|
|
111
|
+
local log rc=0
|
|
112
|
+
affected_mktemp go || return 4; log="$AFFECTED_TMP"
|
|
113
|
+
|
|
114
|
+
if [[ "$mode" == selected ]]; then
|
|
115
|
+
local pkgs
|
|
116
|
+
pkgs="$(affected_go_closure)" || pkgs=""
|
|
117
|
+
if [[ -z "$pkgs" ]]; then
|
|
118
|
+
rm -f "$log"
|
|
119
|
+
ADP_VACUOUS=1
|
|
120
|
+
ADP_RAN=0
|
|
121
|
+
return 5
|
|
122
|
+
fi
|
|
123
|
+
local -a plist=()
|
|
124
|
+
local p
|
|
125
|
+
while IFS= read -r p; do [[ -n "$p" ]] && plist+=("$p"); done <<<"$pkgs"
|
|
126
|
+
cmd+=("${plist[@]}")
|
|
127
|
+
else
|
|
128
|
+
cmd+=(./...)
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
affected_bound "${cmd[@]}" >"$log" 2>&1 || rc=$?
|
|
132
|
+
cat "$log"
|
|
133
|
+
|
|
134
|
+
# Every package answering `[no test files]` is a vacuous run: the diff was
|
|
135
|
+
# real code and go executed nothing that could fail on it.
|
|
136
|
+
if ! grep -qE '^(ok|FAIL|--- )' "$log"; then
|
|
137
|
+
ADP_VACUOUS=1
|
|
138
|
+
rm -f "$log"
|
|
139
|
+
ADP_RAN=0
|
|
140
|
+
return 5
|
|
141
|
+
fi
|
|
142
|
+
# ran must be in the same units as of= — test FILES, not packages: count the
|
|
143
|
+
# *_test.go files under each reported package's directory. Packages outside
|
|
144
|
+
# the module prefix are skipped; an under-count biases ran DOWN (honest).
|
|
145
|
+
local modpfx="" pkg dir cnt=0
|
|
146
|
+
modpfx="$(sed -n 's/^module[[:space:]]\{1,\}\([^[:space:]]*\).*/\1/p' go.mod 2>/dev/null | head -n 1 || true)"
|
|
147
|
+
while IFS= read -r pkg; do
|
|
148
|
+
[[ -n "$modpfx" && "$pkg" == "$modpfx"* ]] || continue
|
|
149
|
+
dir="${pkg#"$modpfx"}"; dir="${dir#/}"
|
|
150
|
+
[[ -z "$dir" ]] && dir="."
|
|
151
|
+
[[ -d "$dir" ]] || continue
|
|
152
|
+
cnt=$((cnt + $(find "$dir" -maxdepth 1 -type f -name '*_test.go' 2>/dev/null | wc -l || true)))
|
|
153
|
+
done < <(grep -oE '^(ok|FAIL)[[:space:]]+[^[:space:]]+' "$log" | awk '{print $2}' | sort -u || true)
|
|
154
|
+
ADP_RAN="$cnt"
|
|
155
|
+
rm -f "$log"
|
|
156
|
+
return "$rc"
|
|
157
|
+
}
|