@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,93 @@
|
|
|
1
|
+
// Shared label parser for the eval-harness asserts.
|
|
2
|
+
//
|
|
3
|
+
// extractLabel(output, allowed): given a raw model output string and the closed
|
|
4
|
+
// set of allowed labels (the target's enum), return the canonical enum member the
|
|
5
|
+
// output denotes, or — when no enum member is present — the raw first non-empty
|
|
6
|
+
// line (so the gate assert can reject a malformed / hallucinated label).
|
|
7
|
+
//
|
|
8
|
+
// Classifier-agnostic: works for /go routes (lowercase, hyphenated) and
|
|
9
|
+
// ticket-triage P-levels (P1/P2/P3) alike. Matching is case-insensitive; a
|
|
10
|
+
// hyphen counts as part of a label token so "clo-attestation" is not split.
|
|
11
|
+
"use strict";
|
|
12
|
+
|
|
13
|
+
const fs = require("node:fs");
|
|
14
|
+
const path = require("node:path");
|
|
15
|
+
|
|
16
|
+
// loadEnum(vars): resolve the target's closed label set to a real array.
|
|
17
|
+
//
|
|
18
|
+
// promptfoo's handling of a `defaultTest.vars` `file://*.json` value passed to a
|
|
19
|
+
// custom JS assert is version-dependent — confirmed empirically that it may send
|
|
20
|
+
// EITHER the RESOLVED FILE CONTENTS (the JSON array text as a string) OR the literal
|
|
21
|
+
// unresolved ref `"file://enums/...json"`. The assert must handle both, plus a direct
|
|
22
|
+
// array (unit tests). Returns [] on any failure so the gate fails closed (out-of-enum)
|
|
23
|
+
// rather than throwing. (An earlier change dropped the JSON-array-text branch as
|
|
24
|
+
// "speculative"; that silently broke the gate — promptfoo's resolved-contents shape IS
|
|
25
|
+
// that branch's input. The regression guard lives in test/parse-label.test.sh.)
|
|
26
|
+
function loadEnum(vars) {
|
|
27
|
+
const raw = vars && vars.enum;
|
|
28
|
+
if (Array.isArray(raw)) return raw;
|
|
29
|
+
if (typeof raw !== "string" || raw.trim() === "") return [];
|
|
30
|
+
const s = raw.trim();
|
|
31
|
+
// (a) JSON array literal / resolved file contents — starts with `[`, JSON.parse.
|
|
32
|
+
// (b) a `file://`/relative/absolute path — strip `file://`, read the file.
|
|
33
|
+
if (s.startsWith("[")) {
|
|
34
|
+
try {
|
|
35
|
+
const a = JSON.parse(s);
|
|
36
|
+
if (Array.isArray(a)) return a;
|
|
37
|
+
} catch {
|
|
38
|
+
/* not valid JSON — fall through to file resolution */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const ref = s.replace(/^file:\/\//, "");
|
|
42
|
+
const p = path.isAbsolute(ref) ? ref : path.resolve(__dirname, "..", ref);
|
|
43
|
+
try {
|
|
44
|
+
const a = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
45
|
+
if (Array.isArray(a)) return a;
|
|
46
|
+
} catch {
|
|
47
|
+
/* unreadable / not an array — fall through */
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function extractLabel(output, allowed) {
|
|
53
|
+
const text = String(output == null ? "" : output).trim();
|
|
54
|
+
const set = Array.isArray(allowed) ? allowed : [];
|
|
55
|
+
|
|
56
|
+
// 1. Exact (case-insensitive) match against the whole trimmed output.
|
|
57
|
+
for (const a of set) {
|
|
58
|
+
if (text.toLowerCase() === String(a).toLowerCase()) return a;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 2. Word-boundary search: return the allowed label that appears EARLIEST in
|
|
62
|
+
// the text (lowest character position), NOT the first member in enum order.
|
|
63
|
+
// Enum-order would bias the result toward whichever label is declared first
|
|
64
|
+
// in the type, independent of what the model actually said. Tie-break =
|
|
65
|
+
// earliest mention. Hedged / negated outputs ("not P1, use P2") are
|
|
66
|
+
// inherently ambiguous and resolve to the first-mentioned label — the
|
|
67
|
+
// harness's validity rests on the prompt's "respond with ONLY the token"
|
|
68
|
+
// instruction (handled by the exact-match tier above); this tier is a
|
|
69
|
+
// lenient fallback for disobedient prose. The hyphen is treated as an
|
|
70
|
+
// in-token character so "clo-attestation" is not split.
|
|
71
|
+
let best = null;
|
|
72
|
+
let bestIdx = Infinity;
|
|
73
|
+
for (const a of set) {
|
|
74
|
+
const esc = String(a).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
75
|
+
const re = new RegExp(`(^|[^A-Za-z0-9-])(${esc})([^A-Za-z0-9-]|$)`, "i");
|
|
76
|
+
const m = re.exec(text);
|
|
77
|
+
if (m) {
|
|
78
|
+
const idx = m.index + m[1].length; // position of the label token itself
|
|
79
|
+
if (idx < bestIdx) {
|
|
80
|
+
bestIdx = idx;
|
|
81
|
+
best = a;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (best !== null) return best;
|
|
86
|
+
|
|
87
|
+
// 3. No enum member found — return the raw first non-empty line so a gate
|
|
88
|
+
// assert can reject it as out-of-enum.
|
|
89
|
+
const firstLine = text.split(/\r?\n/).map((s) => s.trim()).filter(Boolean)[0];
|
|
90
|
+
return firstLine == null ? text : firstLine;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
module.exports = { extractLabel, loadEnum };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// verdict.cjs — PURE accept/reject computation for a gated classifier-skill edit.
|
|
2
|
+
//
|
|
3
|
+
// NO I/O, NO shell-out, NO LLM. The only deterministic seam in the gate: it consumes
|
|
4
|
+
// already-scored promptfoo results and decides whether a candidate block edit is safe
|
|
5
|
+
// to apply. The orchestrator (eval-gate.cjs) runs promptfoo and normalizes its JSON
|
|
6
|
+
// into the shape below; the verdict math lives here so it is unit-testable with zero
|
|
7
|
+
// API spend (AC2).
|
|
8
|
+
//
|
|
9
|
+
// Normalized results shape
|
|
10
|
+
// ------------------------
|
|
11
|
+
// currentResults, candidateResults : Array<{ task_id: string, correct: boolean }>
|
|
12
|
+
// One entry per model×repeat sample per corpus task. "current" = the block on disk
|
|
13
|
+
// today; "candidate" = the edited block. The target task's samples are included in
|
|
14
|
+
// these arrays (tagged with targetTask.task_id) and are SEPARATED OUT internally:
|
|
15
|
+
// - corpus rate excludes the target task_id (avoids double-counting the row whose
|
|
16
|
+
// pass we test independently);
|
|
17
|
+
// - target_task_passes uses ONLY the candidate samples for targetTask.task_id.
|
|
18
|
+
// targetTask : { task_id } — the row whose candidate samples must pass.
|
|
19
|
+
// opts : { epsilon?, targetThreshold? }
|
|
20
|
+
// epsilon default = 1 / (number of distinct corpus task_ids) [one-task-equivalent].
|
|
21
|
+
// targetThreshold default = 0.5.
|
|
22
|
+
//
|
|
23
|
+
// Decision
|
|
24
|
+
// --------
|
|
25
|
+
// current_rate = pooled mean correctness over current corpus samples (ex-target)
|
|
26
|
+
// candidate_rate = pooled mean correctness over candidate corpus samples (ex-target)
|
|
27
|
+
// corpus_regressed = candidate_rate < current_rate - epsilon (strict < ; boundary
|
|
28
|
+
// equality is NOT a regression — inclusive)
|
|
29
|
+
// target_task_passes = pooled mean correctness of candidate target samples >= targetThreshold
|
|
30
|
+
// corpus_untrustworthy = current_rate < MIN_TRUSTED_CORPUS_RATE (absolute floor: below
|
|
31
|
+
// this the baseline eval is too degraded to trust a RELATIVE
|
|
32
|
+
// comparison — a "no regression" verdict off a broken baseline is
|
|
33
|
+
// meaningless)
|
|
34
|
+
// accept = !corpus_regressed && target_task_passes && !corpus_untrustworthy
|
|
35
|
+
//
|
|
36
|
+
// Fail-closed: malformed input throws (the orchestrator treats a throw as NOT accept).
|
|
37
|
+
"use strict";
|
|
38
|
+
|
|
39
|
+
// Absolute corpus trust floor: below this current_rate the baseline eval is too degraded
|
|
40
|
+
// to trust a relative current-vs-candidate comparison, so accept is forced false.
|
|
41
|
+
const MIN_TRUSTED_CORPUS_RATE = 0.5;
|
|
42
|
+
|
|
43
|
+
function assertResults(results, name) {
|
|
44
|
+
if (!Array.isArray(results)) {
|
|
45
|
+
throw new TypeError(`computeVerdict: ${name} must be an array`);
|
|
46
|
+
}
|
|
47
|
+
for (const r of results) {
|
|
48
|
+
if (!r || typeof r !== "object") {
|
|
49
|
+
throw new TypeError(`computeVerdict: ${name} entry must be an object`);
|
|
50
|
+
}
|
|
51
|
+
if (typeof r.task_id !== "string" || r.task_id === "") {
|
|
52
|
+
throw new TypeError(`computeVerdict: ${name} entry missing string task_id`);
|
|
53
|
+
}
|
|
54
|
+
if (typeof r.correct !== "boolean") {
|
|
55
|
+
throw new TypeError(`computeVerdict: ${name} entry .correct must be a boolean`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// poolRate(samples): mean correctness (1.0/0.0 per sample). null when empty.
|
|
61
|
+
function poolRate(samples) {
|
|
62
|
+
if (samples.length === 0) return null;
|
|
63
|
+
const correct = samples.reduce((acc, s) => acc + (s.correct ? 1 : 0), 0);
|
|
64
|
+
return correct / samples.length;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function distinctTaskIds(results) {
|
|
68
|
+
return [...new Set(results.map((r) => r.task_id))];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function computeVerdict(currentResults, candidateResults, targetTask, opts) {
|
|
72
|
+
assertResults(currentResults, "currentResults");
|
|
73
|
+
assertResults(candidateResults, "candidateResults");
|
|
74
|
+
if (!targetTask || typeof targetTask.task_id !== "string" || targetTask.task_id === "") {
|
|
75
|
+
throw new TypeError("computeVerdict: targetTask must have a string task_id");
|
|
76
|
+
}
|
|
77
|
+
const targetId = targetTask.task_id;
|
|
78
|
+
const targetThreshold =
|
|
79
|
+
opts && typeof opts.targetThreshold === "number" ? opts.targetThreshold : 0.5;
|
|
80
|
+
|
|
81
|
+
const curCorpus = currentResults.filter((r) => r.task_id !== targetId);
|
|
82
|
+
const candCorpus = candidateResults.filter((r) => r.task_id !== targetId);
|
|
83
|
+
const candTarget = candidateResults.filter((r) => r.task_id === targetId);
|
|
84
|
+
|
|
85
|
+
if (curCorpus.length === 0 || candCorpus.length === 0) {
|
|
86
|
+
throw new Error("computeVerdict: no corpus samples (excluding the target task) to compare");
|
|
87
|
+
}
|
|
88
|
+
if (candTarget.length === 0) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`computeVerdict: no candidate samples for target task ${JSON.stringify(targetId)}`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// epsilon default = one-task-equivalent over the distinct corpus tasks.
|
|
95
|
+
const corpusTaskCount = distinctTaskIds(curCorpus).length;
|
|
96
|
+
const epsilon =
|
|
97
|
+
opts && typeof opts.epsilon === "number" ? opts.epsilon : 1 / corpusTaskCount;
|
|
98
|
+
|
|
99
|
+
const current_rate = poolRate(curCorpus);
|
|
100
|
+
const candidate_rate = poolRate(candCorpus);
|
|
101
|
+
const target_rate = poolRate(candTarget);
|
|
102
|
+
|
|
103
|
+
const corpus_regressed = candidate_rate < current_rate - epsilon;
|
|
104
|
+
const target_task_passes = target_rate >= targetThreshold;
|
|
105
|
+
const corpus_untrustworthy = current_rate < MIN_TRUSTED_CORPUS_RATE;
|
|
106
|
+
const accept = !corpus_regressed && target_task_passes && !corpus_untrustworthy;
|
|
107
|
+
|
|
108
|
+
// per_task breakdown over the union of corpus + target task ids.
|
|
109
|
+
const allIds = [...new Set([...distinctTaskIds(currentResults), ...distinctTaskIds(candidateResults)])];
|
|
110
|
+
const per_task = allIds.map((task_id) => ({
|
|
111
|
+
task_id,
|
|
112
|
+
is_target: task_id === targetId,
|
|
113
|
+
current_rate: poolRate(currentResults.filter((r) => r.task_id === task_id)),
|
|
114
|
+
candidate_rate: poolRate(candidateResults.filter((r) => r.task_id === task_id)),
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
accept,
|
|
119
|
+
corpus_regressed,
|
|
120
|
+
target_task_passes,
|
|
121
|
+
corpus_untrustworthy,
|
|
122
|
+
current_rate,
|
|
123
|
+
candidate_rate,
|
|
124
|
+
target_rate,
|
|
125
|
+
epsilon,
|
|
126
|
+
target_threshold: targetThreshold,
|
|
127
|
+
min_trusted_corpus_rate: MIN_TRUSTED_CORPUS_RATE,
|
|
128
|
+
per_task,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = { computeVerdict };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{"vars": {"input": "The dashboard throws a 500 when I click Export. It worked yesterday — can you fix it?", "golden_label": "fix"}}
|
|
2
|
+
{"vars": {"input": "The checkout API has been returning 500s to every user for the last 20 minutes. Production is down right now and customers are stuck.", "golden_label": "incident"}}
|
|
3
|
+
{"vars": {"input": "Go through every issue labeled stale-flaky and close them all out — clean up that whole backlog.", "golden_label": "drain"}}
|
|
4
|
+
{"vars": {"input": "A customer emailed asking us to delete all of their personal data and send them a copy of everything we hold on them.", "golden_label": "legal-threshold"}}
|
|
5
|
+
{"vars": {"input": "Before we vendor this dependency — is its AGPL license going to be a problem for our closed-source product?", "golden_label": "legal-threshold"}}
|
|
6
|
+
{"vars": {"input": "Can you review PR #4502 and check whether the auth changes are sound?", "golden_label": "review"}}
|
|
7
|
+
{"vars": {"input": "I'd like to add a dark-mode toggle to the settings page — where should we start?", "golden_label": "default"}}
|
|
8
|
+
{"vars": {"input": "#6325 implement Phase F", "golden_label": "implement"}}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{"vars": {"input": "A typo in an internal CI log message; no user-facing surface and no data touched.", "golden_label": "none"}}
|
|
2
|
+
{"vars": {"input": "Updated a developer-only runbook page; no credential, billing, or user surface affected.", "golden_label": "none"}}
|
|
3
|
+
{"vars": {"input": "One customer's API key was accidentally written to an application log for several hours.", "golden_label": "single-user incident"}}
|
|
4
|
+
{"vars": {"input": "A single user's stored payment card failed to save, blocking their subscription for an hour.", "golden_label": "single-user incident"}}
|
|
5
|
+
{"vars": {"input": "A misconfigured query exposed many users' email addresses across multiple tenants for a day.", "golden_label": "aggregate pattern"}}
|
|
6
|
+
{"vars": {"input": "A webhook retry bug double-charged every active subscriber in one billing run.", "golden_label": "aggregate pattern"}}
|
|
7
|
+
{"vars": {"input": "A bad deploy logged out all users across three enterprise tenants and lost their unsaved work.", "golden_label": "aggregate pattern"}}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{"vars": {"input": "Bump the lockfile and run a format-only pass across the repo; no logic changes.", "golden_label": "procedural"}}
|
|
2
|
+
{"vars": {"input": "Scaffold a new empty docs page directory and do a rename-only cleanup of one file.", "golden_label": "procedural"}}
|
|
3
|
+
{"vars": {"input": "Adjust the pricing tier labels shown on the public marketing site.", "golden_label": "single-domain"}}
|
|
4
|
+
{"vars": {"input": "Refine the onboarding welcome email copy for clarity.", "golden_label": "single-domain"}}
|
|
5
|
+
{"vars": {"input": "Add an audit log capturing every auth event that touches regulated user data.", "golden_label": "cross-domain"}}
|
|
6
|
+
{"vars": {"input": "Migrate billing records to a new payment processor via a schema migration.", "golden_label": "cross-domain"}}
|
|
7
|
+
{"vars": {"input": "Run a security audit, then a lint-fix formatting pass across the infra configs.", "golden_label": "cross-domain"}}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{"vars": {"input": "Title: Checkout completely broken in production\n\nEvery payment attempt returns 'card declined', even with known-good test cards. No customer can complete a purchase right now. Started ~15 minutes ago.", "golden_label": "P1"}}
|
|
2
|
+
{"vars": {"input": "Title: New signups cannot activate\n\nLogin works for existing users, but every new signup's email-verification link returns a 404. No new user has been able to activate their account since this morning. No error is thrown — it just dead-ends.", "golden_label": "P1"}}
|
|
3
|
+
{"vars": {"input": "Title: CSV export drops the last row on large workspaces\n\nWorkspaces with more than 100 items lose the final row in the exported CSV. Affects many users. Workaround: export twice and diff. Not urgent but should be fixed soon.", "golden_label": "P2"}}
|
|
4
|
+
{"vars": {"input": "Title: Search is slow on large histories\n\nSearch results take 8-10 seconds to load for workspaces with large conversation histories. Still usable, just sluggish; no data is wrong.", "golden_label": "P2"}}
|
|
5
|
+
{"vars": {"input": "Title: URGENT!! Help tooltip typo\n\nThe footer 'Help' link tooltip reads 'Helpp'. Purely cosmetic — flagging as urgent because it's on every page.", "golden_label": "P3"}}
|
|
6
|
+
{"vars": {"input": "Title: Footer copyright year is stale\n\nThe site footer still shows '2024'. Purely cosmetic, no functional impact.", "golden_label": "P3"}}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{"vars": {"phase": "brainstorm", "input": "Approaches explored and key decisions captured in the brainstorm doc; the worktree and spec.md are written. The design is settled and we're ready to produce the file-by-file implementation plan with an ordered task list.", "golden_label": "plan"}}
|
|
2
|
+
{"vars": {"phase": "brainstorm", "input": "We chose approach B and documented the rationale and non-goals. The exploration is done; the next move is to convert these settled decisions into an ordered implementation plan with tasks.", "golden_label": "plan"}}
|
|
3
|
+
{"vars": {"phase": "plan", "input": "plan.md and tasks.md are committed. Before any code is written we want to spawn parallel research agents that enrich each plan section with codebase patterns, prior art, and learnings.", "golden_label": "deepen-plan"}}
|
|
4
|
+
{"vars": {"phase": "plan", "input": "The implementation plan is drafted and committed. Before writing code we want independent reviewers (DHH, Kieran, simplicity) to critique the plan's approach and flag over-engineering.", "golden_label": "plan-review"}}
|
|
5
|
+
{"vars": {"phase": "plan", "input": "plan.md and tasks.md are reviewed and approved. There is nothing left to research or critique; it is time to start executing the first task with incremental commits.", "golden_label": "work"}}
|
|
6
|
+
{"vars": {"phase": "work", "input": "Implementation is complete, every task in tasks.md is checked off, and the unit tests pass green. Before opening a PR we want a multi-agent pass to catch bugs and convention issues.", "golden_label": "review"}}
|
|
7
|
+
{"vars": {"phase": "work", "input": "We just finished the GREEN implementation for a UI change under app/(dashboard). jsdom can't catch CSS-layout or nav-state regressions, so we need the auth-seeded headless browser gate before review.", "golden_label": "qa"}}
|
|
8
|
+
{"vars": {"phase": "work", "input": "The implementation is written but the test suite has six failing specs. We want to autonomously iterate diagnosis-and-fix with checkpoint commits until the whole suite is green.", "golden_label": "test-fix-loop"}}
|
|
9
|
+
{"vars": {"phase": "review", "input": "All review findings are resolved and the full suite is green. The feature is verified and ready to commit, push, open the PR, and merge.", "golden_label": "ship"}}
|
|
10
|
+
{"vars": {"phase": "review", "input": "The draft PR has fourteen unresolved reviewer comments spread across several files. We want to address every thread in parallel and mark them resolved.", "golden_label": "resolve-pr-parallel"}}
|
|
11
|
+
{"vars": {"phase": "review", "input": "The review pass is otherwise clean, but it flagged that a dashboard layout change was never visually verified. Before shipping we need the auth-seeded headless browser gate on the affected route.", "golden_label": "qa"}}
|
|
12
|
+
{"vars": {"phase": "ship", "input": "We're about to ship. First we need the pre-flight checks on database migrations, security headers, and lockfile integrity before merging.", "golden_label": "preflight"}}
|
|
13
|
+
{"vars": {"phase": "ship", "input": "The PR is approved, CI is green, and preflight passed. We're ready to merge the feature branch into main with automatic conflict resolution and worktree cleanup.", "golden_label": "merge-pr"}}
|
|
14
|
+
{"vars": {"phase": "ship", "input": "The PR just merged to main. We need to verify the deploy succeeded and that production is healthy before moving on.", "golden_label": "postmerge"}}
|
|
15
|
+
{"vars": {"phase": "ship", "input": "Several PRs merged this week. We want to generate a formatted release summary from their labels, linked issues, and descriptions.", "golden_label": "changelog"}}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Deterministic unit test for the eval-gate.cjs orchestrator — NO API.
|
|
3
|
+
# Covers the three code paths that never call promptfoo:
|
|
4
|
+
# --check gated-source lookup (true/false)
|
|
5
|
+
# --dry-run skill-arm-only API-cost disclosure (no API call)
|
|
6
|
+
# no-op candidate block == current block => {accept:true, "no gated-block change"}
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
SKILL_DIR="$(cd "$HERE/.." && pwd)"
|
|
11
|
+
REPO_ROOT="$(cd "$SKILL_DIR/../../../.." && pwd)"
|
|
12
|
+
GATE="$SKILL_DIR/scripts/eval-gate.cjs"
|
|
13
|
+
fails=0
|
|
14
|
+
|
|
15
|
+
pass() { echo "ok [$1]"; }
|
|
16
|
+
fail() { echo "FAIL [$1]: $2"; fails=$((fails + 1)); }
|
|
17
|
+
|
|
18
|
+
jqget() { node -e 'const o=JSON.parse(require("fs").readFileSync(0,"utf8"));process.stdout.write(String(o[process.argv[1]]))' "$1"; }
|
|
19
|
+
|
|
20
|
+
cd "$REPO_ROOT"
|
|
21
|
+
|
|
22
|
+
# --- --check: a gated source returns gated:true + its target/block_id ---
|
|
23
|
+
out=$(node "$GATE" --check plugins/soleur/commands/go.md)
|
|
24
|
+
if [[ "$(echo "$out" | jqget gated)" == "true" && "$(echo "$out" | jqget target)" == "go-routing" && "$(echo "$out" | jqget block_id)" == "go-routing" ]]; then
|
|
25
|
+
pass "--check gated source (go.md)"
|
|
26
|
+
else
|
|
27
|
+
fail "--check gated source (go.md)" "got: $out"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
out=$(node "$GATE" --check plugins/soleur/agents/support/ticket-triage.md)
|
|
31
|
+
if [[ "$(echo "$out" | jqget gated)" == "true" && "$(echo "$out" | jqget target)" == "ticket-triage" ]]; then
|
|
32
|
+
pass "--check gated source (ticket-triage.md)"
|
|
33
|
+
else
|
|
34
|
+
fail "--check gated source (ticket-triage.md)" "got: $out"
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# --- --check: a non-gated file returns gated:false ---
|
|
38
|
+
out=$(node "$GATE" --check plugins/soleur/skills/eval-harness/README.md)
|
|
39
|
+
if [[ "$(echo "$out" | jqget gated)" == "false" ]]; then
|
|
40
|
+
pass "--check non-gated file"
|
|
41
|
+
else
|
|
42
|
+
fail "--check non-gated file" "got: $out"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# --- --dry-run: prints estimate, dry_run:true, no API ---
|
|
46
|
+
out=$(node "$GATE" --dry-run --target go-routing --repeat 5)
|
|
47
|
+
if [[ "$(echo "$out" | jqget dry_run)" == "true" ]]; then
|
|
48
|
+
calls=$(echo "$out" | jqget estimated_api_calls)
|
|
49
|
+
# 2 (current+candidate) x 3 models x (8 corpus + 1 target) x 5 repeat = 270
|
|
50
|
+
if [[ "$calls" == "270" ]]; then
|
|
51
|
+
pass "--dry-run estimate (go-routing, repeat 5) = $calls"
|
|
52
|
+
else
|
|
53
|
+
fail "--dry-run estimate" "estimated_api_calls=$calls (want 270)"
|
|
54
|
+
fi
|
|
55
|
+
else
|
|
56
|
+
fail "--dry-run" "got: $out"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# --- no-op: candidate-file is a DISTINCT copy with an unchanged block => accept, no API ---
|
|
60
|
+
# (must be a temp copy, not the live source — Fix 4 refuses an in-place candidate-file).
|
|
61
|
+
tmpcopy="$(mktemp --suffix=.md)"
|
|
62
|
+
trap 'rm -f "$tmpcopy"' EXIT
|
|
63
|
+
cp "$REPO_ROOT/plugins/soleur/commands/go.md" "$tmpcopy"
|
|
64
|
+
out=$(node "$GATE" --target go-routing --candidate-file "$tmpcopy")
|
|
65
|
+
if [[ "$(echo "$out" | jqget accept)" == "true" && "$(echo "$out" | jqget reason)" == "no gated-block change" ]]; then
|
|
66
|
+
pass "no-op (unchanged block) accepts without API"
|
|
67
|
+
else
|
|
68
|
+
fail "no-op (unchanged block)" "got: $out"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# --- Fix 4: candidate-file == the live source file is refused (fail-closed) ---
|
|
72
|
+
out=$(node "$GATE" --target go-routing --candidate-file plugins/soleur/commands/go.md || true)
|
|
73
|
+
if [[ "$(echo "$out" | jqget accept)" == "false" && "$(echo "$out" | jqget error)" == *"must differ from the live source file"* ]]; then
|
|
74
|
+
pass "candidate-file == live source is refused"
|
|
75
|
+
else
|
|
76
|
+
fail "candidate-file == live source is refused" "got: $out"
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# --- --check: the two added gated sources resolve to their targets ---
|
|
80
|
+
out=$(node "$GATE" --check plugins/soleur/skills/brainstorm/references/brainstorm-domain-config.md)
|
|
81
|
+
if [[ "$(echo "$out" | jqget gated)" == "true" && "$(echo "$out" | jqget target)" == "lane-inference" && "$(echo "$out" | jqget block_id)" == "lane-inference" ]]; then
|
|
82
|
+
pass "--check gated source (brainstorm-domain-config.md -> lane-inference)"
|
|
83
|
+
else
|
|
84
|
+
fail "--check gated source (lane-inference)" "got: $out"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
out=$(node "$GATE" --check plugins/soleur/skills/incident/SKILL.md)
|
|
88
|
+
if [[ "$(echo "$out" | jqget gated)" == "true" && "$(echo "$out" | jqget target)" == "incident-threshold" ]]; then
|
|
89
|
+
pass "--check gated source (incident/SKILL.md -> incident-threshold)"
|
|
90
|
+
else
|
|
91
|
+
fail "--check gated source (incident-threshold)" "got: $out"
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# --- gate path: --dry-run resolves TARGET_RESOURCES for the new targets (no API). ---
|
|
95
|
+
# A missing TARGET_RESOURCES entry would die() here — so this is the load-bearing proof
|
|
96
|
+
# that the GATE (not just the measurement config) is actually wired for the new surfaces.
|
|
97
|
+
for t in lane-inference incident-threshold; do
|
|
98
|
+
out=$(node "$GATE" --dry-run --target "$t" --repeat 5)
|
|
99
|
+
calls=$(echo "$out" | jqget estimated_api_calls)
|
|
100
|
+
# 2 (current+candidate) x 3 models x (7 corpus + 1 target) x 5 repeat = 240
|
|
101
|
+
if [[ "$(echo "$out" | jqget dry_run)" == "true" && "$calls" == "240" ]]; then
|
|
102
|
+
pass "--dry-run estimate ($t, repeat 5) = $calls"
|
|
103
|
+
else
|
|
104
|
+
fail "--dry-run ($t)" "got: $out"
|
|
105
|
+
fi
|
|
106
|
+
done
|
|
107
|
+
|
|
108
|
+
# --- registry-coverage: every gated target is wired in BOTH per-target maps ---
|
|
109
|
+
# A target present in gated-skills.json but missing from TARGET_RESOURCES ships the gate
|
|
110
|
+
# DORMANT (--check says gated:true while --target/--dry-run die fail-closed). This guard
|
|
111
|
+
# makes that drift fail CI for any future target, not just these two.
|
|
112
|
+
if node -e '
|
|
113
|
+
const reg = require(process.argv[1]);
|
|
114
|
+
const { TARGET_CONFIG } = require(process.argv[2]);
|
|
115
|
+
const { TARGET_RESOURCES } = require(process.argv[3]);
|
|
116
|
+
const missing = [];
|
|
117
|
+
for (const e of reg) {
|
|
118
|
+
if (!TARGET_CONFIG[e.target]) missing.push(e.target + " (gen-skill-prompt TARGET_CONFIG)");
|
|
119
|
+
if (!TARGET_RESOURCES[e.target]) missing.push(e.target + " (eval-gate TARGET_RESOURCES)");
|
|
120
|
+
}
|
|
121
|
+
if (missing.length) { process.stderr.write("uncovered targets: " + missing.join(", ") + "\n"); process.exit(1); }
|
|
122
|
+
' "$SKILL_DIR/gated-skills.json" "$SKILL_DIR/scripts/gen-skill-prompt.cjs" "$SKILL_DIR/scripts/eval-gate.cjs" 2>/tmp/eval-gate-coverage.err; then
|
|
123
|
+
pass "registry-coverage: every target in TARGET_CONFIG and TARGET_RESOURCES"
|
|
124
|
+
else
|
|
125
|
+
fail "registry-coverage" "$(cat /tmp/eval-gate-coverage.err)"
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
if [[ "$fails" -gt 0 ]]; then
|
|
129
|
+
echo "eval-gate: $fails assertion(s) failed"
|
|
130
|
+
exit 1
|
|
131
|
+
fi
|
|
132
|
+
echo "eval-gate: all assertions passed"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Deterministic unit test for extract-block.cjs + gen-skill-prompt.cjs (no live LLM).
|
|
3
|
+
# Asserts:
|
|
4
|
+
# AC4 round-trip — regenerating each target's projected prompt from the source
|
|
5
|
+
# block equals the committed projection byte-for-byte.
|
|
6
|
+
# extractBlock throws loudly when a marker is missing (fail-closed).
|
|
7
|
+
# extractBlock returns the trimmed text strictly between the markers.
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
SUITE_TMP=$(mktemp -d)
|
|
10
|
+
[[ "$SUITE_TMP" == /* ]] || { echo "FATAL: SUITE_TMP is not absolute: $SUITE_TMP" >&2; exit 2; }
|
|
11
|
+
trap 'rm -rf "$SUITE_TMP"' EXIT
|
|
12
|
+
|
|
13
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
SKILL_DIR="$(cd "$HERE/.." && pwd)"
|
|
15
|
+
REPO_ROOT="$(cd "$SKILL_DIR/../../../.." && pwd)"
|
|
16
|
+
EXTRACT="$SKILL_DIR/scripts/extract-block.cjs"
|
|
17
|
+
GEN="$SKILL_DIR/scripts/gen-skill-prompt.cjs"
|
|
18
|
+
REGISTRY="$SKILL_DIR/gated-skills.json"
|
|
19
|
+
fails=0
|
|
20
|
+
|
|
21
|
+
pass() { echo "ok [$1]"; }
|
|
22
|
+
fail() { echo "FAIL [$1]: $2"; fails=$((fails + 1)); }
|
|
23
|
+
|
|
24
|
+
# --- AC4 round-trip: generated projection == committed projection (per registry target) ---
|
|
25
|
+
# Target loop is derived from gated-skills.json (target + projected_prompt_path) rather than
|
|
26
|
+
# a hardcoded list, so a newly-registered gated classifier is round-trip-covered automatically.
|
|
27
|
+
# projected_prompt_path is repo-root-relative (e.g. plugins/soleur/skills/eval-harness/prompts/go-skill.txt).
|
|
28
|
+
roundtrips=0
|
|
29
|
+
while IFS=$'\t' read -r target projected; do
|
|
30
|
+
[[ -z "$target" ]] && continue
|
|
31
|
+
committed="$REPO_ROOT/$projected"
|
|
32
|
+
if diff -u <(node "$GEN" "$target" --stdout) "$committed" > "$SUITE_TMP/eval-gate-roundtrip.diff" 2>&1; then
|
|
33
|
+
pass "round-trip $target == committed projection"
|
|
34
|
+
else
|
|
35
|
+
fail "round-trip $target" "generated projection differs from committed $committed (run: node scripts/gen-skill-prompt.cjs $target)"
|
|
36
|
+
cat "$SUITE_TMP/eval-gate-roundtrip.diff"
|
|
37
|
+
fi
|
|
38
|
+
roundtrips=$((roundtrips + 1))
|
|
39
|
+
done < <(node -e 'JSON.parse(require("fs").readFileSync(process.argv[1],"utf8")).forEach(e=>process.stdout.write(e.target+"\t"+e.projected_prompt_path+"\n"))' "$REGISTRY")
|
|
40
|
+
|
|
41
|
+
# Minimum-cardinality guard: a registry-derived loop silently exits 0 with ZERO coverage if the
|
|
42
|
+
# registry is empty / unreadable / the node one-liner emits nothing. Fail loud instead.
|
|
43
|
+
if [[ "$roundtrips" -lt 1 ]]; then
|
|
44
|
+
fail "registry round-trip coverage" "0 round-trip targets executed — empty/unreadable $REGISTRY would otherwise pass with no coverage"
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
# --- extractBlock returns trimmed text between markers ---
|
|
48
|
+
got=$(node -e '
|
|
49
|
+
const { extractBlock } = require(process.argv[1]);
|
|
50
|
+
const src = "pre\n<!-- eval-gate:block:x:start -->\n HELLO \n<!-- eval-gate:block:x:end -->\npost";
|
|
51
|
+
process.stdout.write(extractBlock(src, "<!-- eval-gate:block:x:start -->", "<!-- eval-gate:block:x:end -->"));
|
|
52
|
+
' "$EXTRACT")
|
|
53
|
+
if [[ "$got" == "HELLO" ]]; then
|
|
54
|
+
pass "extractBlock trims block text"
|
|
55
|
+
else
|
|
56
|
+
fail "extractBlock trims block text" "got '$got' (want 'HELLO')"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# --- extractBlock throws loudly on a missing marker (fail-closed) ---
|
|
60
|
+
if node -e '
|
|
61
|
+
const { extractBlock } = require(process.argv[1]);
|
|
62
|
+
extractBlock("no markers here", "<!-- eval-gate:block:x:start -->", "<!-- eval-gate:block:x:end -->");
|
|
63
|
+
' "$EXTRACT" 2>/dev/null; then
|
|
64
|
+
fail "extractBlock missing-marker throws" "did not throw on a missing start marker"
|
|
65
|
+
else
|
|
66
|
+
pass "extractBlock missing-marker throws (fail-closed)"
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
# --- CLI exits non-zero with stderr when a marker is missing ---
|
|
70
|
+
tmp="$(mktemp -p "$SUITE_TMP")"
|
|
71
|
+
printf 'this file has no sentinels\n' > "$tmp"
|
|
72
|
+
if node "$EXTRACT" "$tmp" go-routing 2>"$SUITE_TMP/eval-gate-cli.err"; then
|
|
73
|
+
fail "extract-block CLI missing-marker exit" "CLI exited 0 on a file without markers"
|
|
74
|
+
else
|
|
75
|
+
if grep -q "marker not found" "$SUITE_TMP/eval-gate-cli.err"; then
|
|
76
|
+
pass "extract-block CLI missing-marker exits non-zero with clear stderr"
|
|
77
|
+
else
|
|
78
|
+
fail "extract-block CLI missing-marker stderr" "stderr lacked a clear message: $(cat "$SUITE_TMP/eval-gate-cli.err")"
|
|
79
|
+
fi
|
|
80
|
+
fi
|
|
81
|
+
rm -f "$tmp"
|
|
82
|
+
|
|
83
|
+
if [[ "$fails" -gt 0 ]]; then
|
|
84
|
+
echo "extract-block: $fails assertion(s) failed"
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
echo "extract-block: all assertions passed"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Deterministic unit test for the GATE assert (scripts/gate-classification.cjs).
|
|
3
|
+
# No live LLM: every "model output" is a stubbed string. Asserts the contract:
|
|
4
|
+
# - pass: true when the parsed label IS a member of the target's enum
|
|
5
|
+
# - pass: false when the parsed label is NOT in the enum (malformed/hallucinated)
|
|
6
|
+
# - exercised for BOTH the 7-route enum AND the P1/P2/P3 enum
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
SKILL_DIR="$(cd "$HERE/.." && pwd)"
|
|
11
|
+
ASSERT="$SKILL_DIR/scripts/gate-classification.cjs"
|
|
12
|
+
fails=0
|
|
13
|
+
|
|
14
|
+
# run <output> <enum-json> <expect-pass> <label>
|
|
15
|
+
run() {
|
|
16
|
+
local output="$1" enumjson="$2" want_pass="$3" label="$4"
|
|
17
|
+
local got_pass
|
|
18
|
+
got_pass=$(node -e '
|
|
19
|
+
const fn = require(process.argv[1]);
|
|
20
|
+
const r = fn(process.argv[2], { vars: { enum: JSON.parse(process.argv[3]) } });
|
|
21
|
+
process.stdout.write(String(r.pass));
|
|
22
|
+
' "$ASSERT" "$output" "$enumjson" )
|
|
23
|
+
if [[ "$got_pass" != "$want_pass" ]]; then
|
|
24
|
+
echo "FAIL [$label]: output='$output' -> pass=$got_pass (want $want_pass)"
|
|
25
|
+
fails=$((fails + 1))
|
|
26
|
+
else
|
|
27
|
+
echo "ok [$label]: pass=$got_pass"
|
|
28
|
+
fi
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
GO='["fix","drain","clo-attestation","review","legal-threshold","incident","default"]'
|
|
32
|
+
TR='["P1","P2","P3"]'
|
|
33
|
+
|
|
34
|
+
# --- /go route enum ---
|
|
35
|
+
run "fix" "$GO" "true" "in-enum route passes"
|
|
36
|
+
run "clo-attestation" "$GO" "true" "in-enum hyphenated route passes"
|
|
37
|
+
run "The route is review." "$GO" "true" "in-enum route in prose passes"
|
|
38
|
+
run "banana" "$GO" "false" "out-of-enum route fails"
|
|
39
|
+
run "P1" "$GO" "false" "wrong-namespace label fails"
|
|
40
|
+
|
|
41
|
+
# --- ticket-triage P-level enum ---
|
|
42
|
+
run "P1" "$TR" "true" "in-enum P-level passes"
|
|
43
|
+
run "p2" "$TR" "true" "in-enum P-level case-insensitive passes"
|
|
44
|
+
run "P9" "$TR" "false" "out-of-enum P-level fails"
|
|
45
|
+
run "fix" "$TR" "false" "wrong-namespace label fails"
|
|
46
|
+
|
|
47
|
+
# --- file:// enum shape (promptfoo passes defaultTest.vars file:// refs verbatim;
|
|
48
|
+
# the #5358 live-run bug). enum arrives as a RAW STRING, not a parsed array. ---
|
|
49
|
+
fileref() {
|
|
50
|
+
local output="$1" enumref="$2" want_pass="$3" label="$4"
|
|
51
|
+
local got
|
|
52
|
+
got=$(node -e '
|
|
53
|
+
const fn = require(process.argv[1]);
|
|
54
|
+
const r = fn(process.argv[2], { vars: { enum: process.argv[3] } });
|
|
55
|
+
process.stdout.write(String(r.pass));
|
|
56
|
+
' "$ASSERT" "$output" "$enumref")
|
|
57
|
+
if [[ "$got" != "$want_pass" ]]; then
|
|
58
|
+
echo "FAIL [$label]: output='$output' enum='$enumref' -> pass=$got (want $want_pass)"
|
|
59
|
+
fails=$((fails + 1))
|
|
60
|
+
else
|
|
61
|
+
echo "ok [$label]: pass=$got"
|
|
62
|
+
fi
|
|
63
|
+
}
|
|
64
|
+
fileref "fix" "file://enums/go-routes.json" "true" "file:// enum + in-enum route passes"
|
|
65
|
+
fileref "banana" "file://enums/go-routes.json" "false" "file:// enum + out-of-enum route fails"
|
|
66
|
+
fileref "P1" "file://enums/triage-levels.json" "true" "file:// enum + in-enum P-level passes"
|
|
67
|
+
# Resolved-contents shape (JSON array text) — what promptfoo actually passes when it
|
|
68
|
+
# resolves a defaultTest.vars file:// ref to file CONTENTS. Regression guard for the
|
|
69
|
+
# gate-vacuous bug (the enum arrived as JSON-array-text, not a path/literal-ref).
|
|
70
|
+
fileref "fix" '["fix","drain","clo-attestation","review","legal-threshold","incident","default"]' "true" "contents-string enum + in-enum passes"
|
|
71
|
+
fileref "banana" '["fix","drain","clo-attestation","review","legal-threshold","incident","default"]' "false" "contents-string enum + out-of-enum fails"
|
|
72
|
+
|
|
73
|
+
if [[ "$fails" -gt 0 ]]; then
|
|
74
|
+
echo "gate-classification: $fails assertion(s) failed"
|
|
75
|
+
exit 1
|
|
76
|
+
fi
|
|
77
|
+
echo "gate-classification: all assertions passed"
|