@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,501 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# audit-models.sh — deterministic auditor for the per-Anthropic-model-release checklist.
|
|
3
|
+
#
|
|
4
|
+
# Modes:
|
|
5
|
+
# (default) full audit report to stdout; every check group is named (no silent green).
|
|
6
|
+
# --detect cron signal: exit 10 if config-class model-ID drift is found, 0 if clean.
|
|
7
|
+
# One-line summary to stdout. Used by the rule-audit.yml detection step.
|
|
8
|
+
# --fix apply MECHANICAL model-ID swaps to config-class files only (auto-fix surface).
|
|
9
|
+
# pin / pricing / tier-map / dormant are FLAG-ONLY and never mutated here.
|
|
10
|
+
#
|
|
11
|
+
# Options:
|
|
12
|
+
# --root DIR scan DIR instead of the git repo root (test harness uses this).
|
|
13
|
+
#
|
|
14
|
+
# Auto-fix surface = stale model IDs in config. Excluded from auto-fix (never mutated):
|
|
15
|
+
# test fixtures (*/test/*, *.test.*), archives (**/archive/**), spikes (*/spike/*),
|
|
16
|
+
# all of knowledge-base/** (docs/plans/specs/brainstorms/learnings — archival prose
|
|
17
|
+
# that never selects a model at runtime), community digests.
|
|
18
|
+
# Source of truth for current IDs: the claude-api skill table + official docs.
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
ROOT=""
|
|
22
|
+
MODE="audit"
|
|
23
|
+
while [[ $# -gt 0 ]]; do
|
|
24
|
+
case "$1" in
|
|
25
|
+
--root) ROOT="$2"; shift 2 ;;
|
|
26
|
+
--detect) MODE="detect"; shift ;;
|
|
27
|
+
--fix) MODE="fix"; shift ;;
|
|
28
|
+
*) echo "unknown arg: $1" >&2; exit 64 ;;
|
|
29
|
+
esac
|
|
30
|
+
done
|
|
31
|
+
if [[ -z "$ROOT" ]]; then
|
|
32
|
+
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
33
|
+
fi
|
|
34
|
+
ROOT="${ROOT%/}" # normalize: trailing slash breaks rel() prefix-strip
|
|
35
|
+
# A newline in ROOT would split the SDK-carve-out pattern built from it below: grep -E then
|
|
36
|
+
# fails ("Unmatched (") and every `grep -vE "$EXCLUDE_RE" || true` swallows the error, so
|
|
37
|
+
# --detect would print a clean verdict over a scan that excluded nothing. Refuse it up front.
|
|
38
|
+
case "$ROOT" in
|
|
39
|
+
*$'\n'*)
|
|
40
|
+
echo "audit-models: refusing a --root containing a newline (it would corrupt the exclusion pattern)" >&2
|
|
41
|
+
exit 64
|
|
42
|
+
;;
|
|
43
|
+
esac
|
|
44
|
+
|
|
45
|
+
# --- current landscape — update at each model launch ---
|
|
46
|
+
# Each superseded id maps to the CURRENT same-tier id as "<stale>=<current>".
|
|
47
|
+
# At each launch: (1) ADD a pair for the newly-superseded id, AND (2) RETARGET
|
|
48
|
+
# every existing same-tier pair's RHS to the new current id. Step 2 is not
|
|
49
|
+
# optional — `--fix` applies pairs sequentially, so a CHAINED map
|
|
50
|
+
# (4-7=4-8 alongside 4-8=5) is order-dependent and lands on a stale id.
|
|
51
|
+
# The SINGLE-HOP INVARIANT below enforces this mechanically: no target may
|
|
52
|
+
# also appear as a source. Source of truth for current ids: the claude-api
|
|
53
|
+
# skill table + https://platform.claude.com/docs/en/about-claude/models/overview.md
|
|
54
|
+
# (pricing: https://platform.claude.com/docs/en/about-claude/pricing.md).
|
|
55
|
+
AUTOFIX_PAIRS=(
|
|
56
|
+
"claude-opus-5=claude-opus-5-5"
|
|
57
|
+
"claude-opus-4-8=claude-opus-5-5"
|
|
58
|
+
"claude-opus-4-7=claude-opus-5-5"
|
|
59
|
+
"claude-opus-4-6=claude-opus-5-5"
|
|
60
|
+
"claude-sonnet-5=claude-sonnet-5-5"
|
|
61
|
+
"claude-sonnet-4-6=claude-sonnet-5-5"
|
|
62
|
+
"claude-sonnet-4-5=claude-sonnet-5-5"
|
|
63
|
+
"claude-fable-5=claude-fable-5-1"
|
|
64
|
+
# Haiku 5.5 launch, 2026-10-08. BOTH Haiku 4.5 spellings: the id boundary defined
|
|
65
|
+
# below makes the undated id a different token from the dated one, so one pair alone
|
|
66
|
+
# leaves the other spelling stale forever. Both RHS are the current id, so the
|
|
67
|
+
# single-hop invariant holds. No closing paren in comments here: the test parser
|
|
68
|
+
# reads this array up to the first one.
|
|
69
|
+
"claude-haiku-4-5-20251001=claude-haiku-5-5"
|
|
70
|
+
"claude-haiku-4-5=claude-haiku-5-5"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# SINGLE-HOP INVARIANT (fail-fast). A convergent map rewrites every stale id
|
|
74
|
+
# in ONE pass; if any RHS is also an LHS, `--fix` leaves files on an
|
|
75
|
+
# intermediate id and `--detect` re-flags them forever (a permanently-red
|
|
76
|
+
# drift cron that auto-files issues it cannot fix). Cheap to assert, so assert
|
|
77
|
+
# it on every invocation rather than trusting the editor to have retargeted.
|
|
78
|
+
assert_single_hop() {
|
|
79
|
+
local p from to q other
|
|
80
|
+
for p in "${AUTOFIX_PAIRS[@]}"; do
|
|
81
|
+
to="${p#*=}"
|
|
82
|
+
for q in "${AUTOFIX_PAIRS[@]}"; do
|
|
83
|
+
other="${q%%=*}"
|
|
84
|
+
if [[ "$to" == "$other" ]]; then
|
|
85
|
+
from="${p%%=*}"
|
|
86
|
+
echo "audit-models: NON-CONVERGENT AUTOFIX_PAIRS — '${from}' maps to '${to}', which is itself a source id." >&2
|
|
87
|
+
echo " Retarget every same-tier pair directly to the current id (no chaining)." >&2
|
|
88
|
+
exit 78
|
|
89
|
+
fi
|
|
90
|
+
done
|
|
91
|
+
done
|
|
92
|
+
}
|
|
93
|
+
assert_single_hop
|
|
94
|
+
# The stale ids (LHS of each pair), '|'-joined for grep.
|
|
95
|
+
autofix_from_re() {
|
|
96
|
+
local p out=""
|
|
97
|
+
for p in "${AUTOFIX_PAIRS[@]}"; do out="${out:+$out|}${p%%=*}"; done
|
|
98
|
+
printf '%s' "$out"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# RIGHT-BOUNDARY of a model id: the next char must not extend the id. Model ids
|
|
102
|
+
# are [0-9A-Za-z-], so a bare alternation would match a PREFIX of a longer id.
|
|
103
|
+
#
|
|
104
|
+
# The `--fix` sed has been anchored since the script was created; SELECTION was
|
|
105
|
+
# not. That asymmetry was ALREADY producing a permanently-red drift cron before
|
|
106
|
+
# Fable 5.1 existed — measured on origin/main, a config file carrying the DATED
|
|
107
|
+
# variant `claude-opus-4-7-20260101` reports `--detect` rc=10, `--fix` prints
|
|
108
|
+
# "fixed" while changing nothing (the sed's boundary correctly declines), and
|
|
109
|
+
# `--detect` re-flags it forever. Same input on this version: rc=0.
|
|
110
|
+
#
|
|
111
|
+
# So the general invariant is the one stated at the bottom of this comment
|
|
112
|
+
# (selection and rewriting must share one boundary), and dated ids were its
|
|
113
|
+
# standing violation. `claude-fable-5` is what made it unavoidable rather than
|
|
114
|
+
# what created it: it was the first pair whose stale id is a strict PREFIX of
|
|
115
|
+
# its own target (`claude-sonnet-5` and `claude-opus-5` now share that shape),
|
|
116
|
+
# so the mismatch fires on the id that is CURRENT rather than only
|
|
117
|
+
# on a longer variant nobody had written yet. `assert_single_hop` does NOT catch
|
|
118
|
+
# either shape ('claude-fable-5-1' is not itself a source id).
|
|
119
|
+
#
|
|
120
|
+
# Selection and rewriting MUST use this one boundary, or they can disagree
|
|
121
|
+
# again: the sed cannot fix what only the grep considers stale.
|
|
122
|
+
ID_BOUNDARY='([^0-9A-Za-z-]|$)'
|
|
123
|
+
|
|
124
|
+
# Anchored matcher — the ONLY pattern that may decide "this file is stale".
|
|
125
|
+
autofix_match_re() { printf '%s%s' "($(autofix_from_re))" "$ID_BOUNDARY"; }
|
|
126
|
+
|
|
127
|
+
FLAG_ONLY_STALE_RE='claude-3[._-]|claude-(opus|sonnet|haiku)-[0-9.]+-20250[0-9]+'
|
|
128
|
+
|
|
129
|
+
DELETION_GUARD=20 # abort --fix if any file would lose more than this many lines
|
|
130
|
+
|
|
131
|
+
# Path classes excluded from the config (auto-fix) surface. knowledge-base/** is
|
|
132
|
+
# archival/historical prose (learnings, plans, brainstorms) — it never selects a
|
|
133
|
+
# model at runtime, so a stale id there is not operational drift.
|
|
134
|
+
# `\.generated\.` keeps the sweeper out of generated artifacts: those have a
|
|
135
|
+
# generator that reads the TS registry (eval-harness/scripts/gen-models.sh), and
|
|
136
|
+
# a blind sed here would make the generator no longer the sole writer — exactly
|
|
137
|
+
# the second-SSOT the generator's own header promises does not exist.
|
|
138
|
+
# SDK-PATH CARVE-OUT (Haiku 5.5 launch, 2026-10-08; #8643). These two scripts drive the
|
|
139
|
+
# Agent SDK `query()`, whose model resolution lives in the SDK's BUNDLED CLI — pinned at
|
|
140
|
+
# @anthropic-ai/claude-agent-sdk 0.3.284, which does not know `claude-haiku-5-5` (an
|
|
141
|
+
# unknown id silently halves max_tokens, #6934). Auto-fixing them to the new id would
|
|
142
|
+
# break two paid scripts, and leaving them selectable would make `--detect` exit 10
|
|
143
|
+
# forever. They stay on `claude-haiku-4-5` until the SDK pin reaches 0.3.293, the first
|
|
144
|
+
# release whose bundle carries the id. EXACT paths, never a directory: widening this to
|
|
145
|
+
# apps/web-platform/scripts/ would hide a genuinely stale sibling. The exemption is per FILE
|
|
146
|
+
# (every stale id, not only Haiku): these scripts run on the SDK-bundled CLI. It is SELF-EXPIRING:
|
|
147
|
+
# model-launch-review.test.ts fails once the SDK pin reaches 0.3.293 and says to delete
|
|
148
|
+
# this array and swap the two scripts.
|
|
149
|
+
SDK_PATH_CARVEOUT=(
|
|
150
|
+
"apps/web-platform/scripts/sandbox-canary.mjs"
|
|
151
|
+
"apps/web-platform/scripts/plugin-root-sandbox-propagation-probe.mjs"
|
|
152
|
+
)
|
|
153
|
+
sdk_carveout_re() {
|
|
154
|
+
# ANCHORED at both ends: `^<root>/<path>$`. The left anchor matters because candidate
|
|
155
|
+
# paths are absolute under $ROOT, so an unanchored `/apps/…/x.mjs$` also exempts the same
|
|
156
|
+
# relative path nested under another prefix (vendor/…, .worktrees/…). $ROOT is escaped so
|
|
157
|
+
# a root containing regex metacharacters cannot alter the pattern.
|
|
158
|
+
local p out="" root_re
|
|
159
|
+
root_re="$(printf '%s' "$ROOT" | sed 's/[][\\.*^$+?(){}|]/\\&/g')"
|
|
160
|
+
for p in "${SDK_PATH_CARVEOUT[@]}"; do
|
|
161
|
+
p="${p//./\\.}"
|
|
162
|
+
out="${out:+$out|}^${root_re}/${p}\$"
|
|
163
|
+
done
|
|
164
|
+
printf '%s' "$out"
|
|
165
|
+
}
|
|
166
|
+
EXCLUDE_RE='(/node_modules/|/\.git/|/\.next/|/test/|/__tests__/|/spike/|/archive/|knowledge-base/|/community/|\.test\.|\.spec\.|\.generated\.|/model-launch-review/|'"$(sdk_carveout_re)"')'
|
|
167
|
+
|
|
168
|
+
# Collect config-class files containing any auto-fixable stale ID.
|
|
169
|
+
# Returns 2 (and prints to stderr) if the scan itself failed. That distinction
|
|
170
|
+
# is load-bearing: `|| true` alone swallows grep's error exit (>=2: unreadable
|
|
171
|
+
# dir, bad regex) as indistinguishable from its no-match exit (1), so --detect
|
|
172
|
+
# would report a confident "none — config model IDs are current" from a scan
|
|
173
|
+
# that never ran. A detector that cannot tell "clean" from "could not look" is
|
|
174
|
+
# the failure mode #5100 exists to prevent.
|
|
175
|
+
collect_config_hits() {
|
|
176
|
+
local re out rc
|
|
177
|
+
re="$(autofix_match_re)"
|
|
178
|
+
# -I (skip binary) is a CORRECTNESS flag, not an optimisation. Without it a
|
|
179
|
+
# compiled artifact under $ROOT is selectable: measured, a blob containing
|
|
180
|
+
# `claude-opus-4-7` between NULs was reported as a stale config file, the
|
|
181
|
+
# `[1]` re-scan could not read it back (`grep -o` on binary prints
|
|
182
|
+
# "binary file matches" to stderr and yields no stdout), and `--fix` would
|
|
183
|
+
# then `sed -i` the binary in place — a byte-patched artifact reported as
|
|
184
|
+
# `fixed:`. That path is now reachable by following this skill's own SKILL.md,
|
|
185
|
+
# which tells the operator to unpack `claude-code-linux-x64` and grep it.
|
|
186
|
+
# The auto-fix surface is config-class TEXT by definition, so a binary is
|
|
187
|
+
# never a legitimate hit and excluding it closes selection, display and
|
|
188
|
+
# rewrite in one place.
|
|
189
|
+
# `if out=$(cmd); then` rather than a bare capture: the exit code here is
|
|
190
|
+
# load-bearing (rc 1 = no match, rc >= 2 = the scan itself failed), so the
|
|
191
|
+
# `|| true` form lint-shell-capture-exit also accepts would flatten rc to 0
|
|
192
|
+
# and re-open the #5100 conflation this function exists to prevent. This form
|
|
193
|
+
# satisfies the lint AND keeps the discrimination.
|
|
194
|
+
if out="$(grep -rIEl "$re" "$ROOT" \
|
|
195
|
+
--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=.next \
|
|
196
|
+
--exclude-dir=test --exclude-dir=__tests__ --exclude-dir=spike --exclude-dir=archive \
|
|
197
|
+
--exclude-dir=community \
|
|
198
|
+
--exclude='*.test.*' --exclude='*.spec.*' 2>/dev/null)"; then
|
|
199
|
+
rc=0
|
|
200
|
+
else
|
|
201
|
+
rc=$?
|
|
202
|
+
fi
|
|
203
|
+
if (( rc >= 2 )); then
|
|
204
|
+
echo "audit-models: scan FAILED (grep rc=$rc) under '$ROOT' — refusing to report clean." >&2
|
|
205
|
+
return 2
|
|
206
|
+
fi
|
|
207
|
+
[[ -n "$out" ]] || return 0
|
|
208
|
+
printf '%s\n' "$out" | grep -vE "$EXCLUDE_RE" || true
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
rel() { echo "${1#"$ROOT"/}"; }
|
|
212
|
+
|
|
213
|
+
# #8392 census: readers that index a FIXED content position of an Anthropic
|
|
214
|
+
# response. A model swap that turns thinking on by default moves the text block
|
|
215
|
+
# off position 0, and such a reader then returns empty forever with no error.
|
|
216
|
+
#
|
|
217
|
+
# Anchored on "$ROOT" and rc-discriminating for the same reason as
|
|
218
|
+
# collect_config_hits: a cwd-relative grep under `--root DIR` would scan nothing,
|
|
219
|
+
# exit 1, and print a clean verdict meaning "the scan ran nowhere" — the exact
|
|
220
|
+
# vacuity class this census exists to catch.
|
|
221
|
+
#
|
|
222
|
+
# The pattern is carried ESCAPED (content\[0\]) so this script is not itself a
|
|
223
|
+
# hit of the plan's AC2 census, which matches the plain text. Keep the escapes.
|
|
224
|
+
collect_content_position_readers() {
|
|
225
|
+
local out rc
|
|
226
|
+
if out="$(grep -rIEn 'content\[0\]|content\?\.\[0\]' "$ROOT" \
|
|
227
|
+
--include='*.ts' --include='*.sh' --include='*.mjs' --include='*.js' \
|
|
228
|
+
--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=.next \
|
|
229
|
+
--exclude-dir=test --exclude-dir=__tests__ --exclude-dir=spike --exclude-dir=archive \
|
|
230
|
+
--exclude-dir=community \
|
|
231
|
+
--exclude='*.test.*' --exclude='*.spec.*' 2>/dev/null)"; then
|
|
232
|
+
rc=0
|
|
233
|
+
else
|
|
234
|
+
rc=$?
|
|
235
|
+
fi
|
|
236
|
+
if (( rc >= 2 )); then
|
|
237
|
+
echo " UNKNOWN — census scan FAILED (grep rc=$rc) under '$ROOT'; NOT a pass."
|
|
238
|
+
return 0
|
|
239
|
+
fi
|
|
240
|
+
out="$(printf '%s\n' "$out" | grep -vE "$EXCLUDE_RE" || true)"
|
|
241
|
+
if [[ -z "${out//[[:space:]]/}" ]]; then
|
|
242
|
+
echo " none — no fixed-position readers."
|
|
243
|
+
else
|
|
244
|
+
# NOT `sed "s|^$ROOT/|…|"`: $ROOT is a filesystem path that may legally contain
|
|
245
|
+
# `|` or `[`. Measured — a `|` makes sed exit "unknown option to 's'", the
|
|
246
|
+
# pipeline dies under pipefail and the census prints NEITHER a hit nor `none`
|
|
247
|
+
# (reads as empty); a `[` silently fails to strip and emits a bare absolute path
|
|
248
|
+
# with no HIT marker. Quoted-expansion strip, the technique rel() already uses.
|
|
249
|
+
while IFS= read -r line; do
|
|
250
|
+
[[ -n "$line" ]] && printf ' HIT: %s\n' "${line#"$ROOT"/}"
|
|
251
|
+
done <<< "$out"
|
|
252
|
+
fi
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
# Shared hits capture. `mapfile -t hits < <(collect_config_hits)` DISCARDS the
|
|
256
|
+
# function's exit code, so a failed scan would fall straight through to the
|
|
257
|
+
# "clean" branch in every mode — the exact absent-vs-could-not-look conflation
|
|
258
|
+
# this script was fixed for. Route the capture through a file so the rc
|
|
259
|
+
# survives, and give EVERY mode the same abort. One owning trap (ADR-129).
|
|
260
|
+
_HITS_TMP="$(mktemp)"
|
|
261
|
+
trap 'rm -f "$_HITS_TMP"' EXIT
|
|
262
|
+
|
|
263
|
+
# Populates the global `hits` array, or aborts naming the mode that failed.
|
|
264
|
+
load_hits() { # $1 = label for the failure line
|
|
265
|
+
if ! collect_config_hits > "$_HITS_TMP"; then
|
|
266
|
+
echo "$1: UNKNOWN — scan failed; treat as un-run, not clean."
|
|
267
|
+
exit 1
|
|
268
|
+
fi
|
|
269
|
+
mapfile -t hits < "$_HITS_TMP"
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
# ---------------- detect mode (cron) ----------------
|
|
273
|
+
if [[ "$MODE" == "detect" ]]; then
|
|
274
|
+
load_hits "model-drift"
|
|
275
|
+
if [[ ${#hits[@]} -gt 0 ]]; then
|
|
276
|
+
echo "model-drift: ${#hits[@]} config file(s) carry a stale model ID (auto-fixable via /soleur:model-launch-review)."
|
|
277
|
+
for f in "${hits[@]}"; do echo " - $(rel "$f")"; done
|
|
278
|
+
exit 10
|
|
279
|
+
fi
|
|
280
|
+
echo "model-drift: none (config model IDs current)."
|
|
281
|
+
exit 0
|
|
282
|
+
fi
|
|
283
|
+
|
|
284
|
+
# ---------------- fix mode (mechanical model-ID swaps only) ----------------
|
|
285
|
+
if [[ "$MODE" == "fix" ]]; then
|
|
286
|
+
load_hits "model-fix"
|
|
287
|
+
for f in "${hits[@]}"; do
|
|
288
|
+
before=$(wc -l < "$f")
|
|
289
|
+
tmp="$(mktemp)"
|
|
290
|
+
cp "$f" "$tmp"
|
|
291
|
+
for pair in "${AUTOFIX_PAIRS[@]}"; do
|
|
292
|
+
from="${pair%%=*}"; to="${pair#*=}"
|
|
293
|
+
# anchored on the SAME boundary as selection (ID_BOUNDARY): preserve the
|
|
294
|
+
# trailing char so a longer/dated variant (claude-opus-4-7-20260101) or a
|
|
295
|
+
# successor that extends the stale id (claude-fable-5-1) is NOT corrupted
|
|
296
|
+
# by a prefix swap.
|
|
297
|
+
sed -i -E "s/${from}${ID_BOUNDARY}/${to}\1/g" "$f"
|
|
298
|
+
done
|
|
299
|
+
after=$(wc -l < "$f")
|
|
300
|
+
# deletion guard: a 1-for-1 ID swap must not change line count materially.
|
|
301
|
+
if (( before - after > DELETION_GUARD )); then
|
|
302
|
+
cp "$tmp" "$f" # revert
|
|
303
|
+
rm -f "$tmp"
|
|
304
|
+
echo "ABORT: $(rel "$f") would lose $((before - after)) lines (> DELETION_GUARD=$DELETION_GUARD); reverted." >&2
|
|
305
|
+
exit 1
|
|
306
|
+
fi
|
|
307
|
+
rm -f "$tmp"
|
|
308
|
+
echo "fixed: $(rel "$f")"
|
|
309
|
+
done
|
|
310
|
+
exit 0
|
|
311
|
+
fi
|
|
312
|
+
|
|
313
|
+
# ---------------- audit mode (report; no silent green) ----------------
|
|
314
|
+
echo "== model-launch-review audit =="
|
|
315
|
+
echo "root: $ROOT"
|
|
316
|
+
echo
|
|
317
|
+
|
|
318
|
+
echo "[1] model-ID inventory (AUTO-FIX)"
|
|
319
|
+
load_hits " model-ID inventory"
|
|
320
|
+
if [[ ${#hits[@]} -gt 0 ]]; then
|
|
321
|
+
echo " stale config model IDs found (mechanical same-tier swap):"
|
|
322
|
+
for f in "${hits[@]}"; do
|
|
323
|
+
# Same anchored matcher as selection, then drop the boundary char the
|
|
324
|
+
# pattern had to capture (an end-of-line match captures nothing to drop),
|
|
325
|
+
# so the report names the id and not `claude-fable-5"`.
|
|
326
|
+
# `set -o pipefail` is in force, so a no-match here kills the script with no
|
|
327
|
+
# message. That silence is the wrong failure: the file is in `hits` BECAUSE
|
|
328
|
+
# the selector matched it, so an empty re-scan means selection and display
|
|
329
|
+
# have diverged — the exact class ID_BOUNDARY exists to prevent — and it
|
|
330
|
+
# must be named rather than mistaken for an ordinary abort.
|
|
331
|
+
# Trigger on EMPTINESS, not just on a non-zero rc. `grep -o` on a file it
|
|
332
|
+
# considers binary prints "binary file matches" to stderr, yields no stdout
|
|
333
|
+
# and exits 0 — so an rc-only guard stayed silent on the one realistic
|
|
334
|
+
# divergence and the report printed a bare `[]` while the audit exited 0
|
|
335
|
+
# (measured). Selection now skips binaries (-I), so this is a true internal
|
|
336
|
+
# invariant; keep both conditions so neither half can go quiet alone.
|
|
337
|
+
ids="$(grep -oE "$(autofix_match_re)" "$f" 2>/dev/null | sed -E 's/[^0-9A-Za-z-]+$//' | sort -u | tr '\n' ' ')" || true
|
|
338
|
+
if [[ -z "${ids// /}" ]]; then
|
|
339
|
+
echo "audit-models: INTERNAL — selector matched $(rel "$f") but the display re-scan found no id." >&2
|
|
340
|
+
echo " selection and display disagree; they must share autofix_match_re." >&2
|
|
341
|
+
exit 70
|
|
342
|
+
fi
|
|
343
|
+
echo " - $(rel "$f") [${ids}]"
|
|
344
|
+
done
|
|
345
|
+
echo " → run with --fix (each stale id → its current same-tier id), then open a CI-gated PR."
|
|
346
|
+
else
|
|
347
|
+
echo " none — config model IDs are current."
|
|
348
|
+
fi
|
|
349
|
+
# flag-only: very old families
|
|
350
|
+
mapfile -t old < <(grep -rEl "$FLAG_ONLY_STALE_RE" "$ROOT" \
|
|
351
|
+
--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=.next 2>/dev/null \
|
|
352
|
+
| grep -vE "$EXCLUDE_RE" || true)
|
|
353
|
+
if [[ ${#old[@]} -gt 0 ]]; then
|
|
354
|
+
echo " FLAG (manual, too old for blind swap):"
|
|
355
|
+
for f in "${old[@]}"; do echo " - $(rel "$f")"; done
|
|
356
|
+
fi
|
|
357
|
+
echo
|
|
358
|
+
|
|
359
|
+
echo "[2] claude-code-action pin freshness (FLAG-ONLY)"
|
|
360
|
+
mapfile -t pins < <(grep -rl 'anthropics/claude-code-action@' "$ROOT/.github" 2>/dev/null || true)
|
|
361
|
+
if [[ ${#pins[@]} -gt 0 ]]; then
|
|
362
|
+
echo " workflows pinning claude-code-action:"
|
|
363
|
+
for f in "${pins[@]}"; do
|
|
364
|
+
echo " - $(rel "$f"): $(grep -oE 'claude-code-action@[a-f0-9]+ # v[0-9.]+' "$f" | head -1)"
|
|
365
|
+
done
|
|
366
|
+
# Compute the drift rather than telling a human to run a command
|
|
367
|
+
# (hr-no-dashboard-eyeball-pull-data-yourself). Best-effort: `gh` may be
|
|
368
|
+
# absent or unauthenticated in a cron sandbox, and that MUST read as
|
|
369
|
+
# UNKNOWN — never as "the pin is fresh".
|
|
370
|
+
if command -v gh >/dev/null 2>&1; then
|
|
371
|
+
_tip="$(gh api repos/anthropics/claude-code-action/releases --jq '.[0].tag_name' 2>/dev/null || true)"
|
|
372
|
+
_pin_sha="$(grep -ohE 'claude-code-action@[a-f0-9]{40}' "${pins[@]}" 2>/dev/null | head -1 | cut -d@ -f2)"
|
|
373
|
+
# These pins are annotated TAG objects, so git/tags resolves them. A pin
|
|
374
|
+
# produced by pin-github-action/Dependabot is a plain COMMIT sha, where
|
|
375
|
+
# git/tags 404s and commits/<sha> is the correct call — try both.
|
|
376
|
+
_pin_desc=""
|
|
377
|
+
if [[ -n "$_pin_sha" ]]; then
|
|
378
|
+
_pin_desc="$(gh api "repos/anthropics/claude-code-action/git/tags/$_pin_sha" --jq '"\(.tag) \(.tagger.date)"' 2>/dev/null \
|
|
379
|
+
|| gh api "repos/anthropics/claude-code-action/commits/$_pin_sha" --jq '"(commit) \(.commit.committer.date)"' 2>/dev/null \
|
|
380
|
+
|| true)"
|
|
381
|
+
fi
|
|
382
|
+
if [[ -n "$_tip" && -n "$_pin_desc" ]]; then
|
|
383
|
+
echo " pinned: $_pin_desc tip: $_tip"
|
|
384
|
+
else
|
|
385
|
+
echo " pin freshness: UNKNOWN (GitHub API unreachable) — NOT a freshness pass."
|
|
386
|
+
fi
|
|
387
|
+
else
|
|
388
|
+
echo " pin freshness: UNKNOWN (gh not on PATH) — NOT a freshness pass."
|
|
389
|
+
fi
|
|
390
|
+
echo " bump a pin ONLY when coupled to a --model swap in the same workflow (#2540 invariant)."
|
|
391
|
+
else
|
|
392
|
+
echo " no claude-code-action pins under .github (or scanning a test root)."
|
|
393
|
+
fi
|
|
394
|
+
echo
|
|
395
|
+
|
|
396
|
+
echo "[2b] pinned claude-code CLI knows the tier models (FLAG-ONLY)"
|
|
397
|
+
# The `claude` CLI carries a BUNDLED per-model table. A model ID absent from it
|
|
398
|
+
# is treated exactly like a garbage ID: the CLI silently falls back to HALF the
|
|
399
|
+
# max_tokens (measured 64000 -> 32000, #6934), degrading every cron that passes
|
|
400
|
+
# --model. This is invisible to the model-ID sweep, to tsc, and to the suite —
|
|
401
|
+
# the argv is well-formed and the run succeeds. Grep the installed bundle when
|
|
402
|
+
# present; absence of node_modules is UNKNOWN, never a pass.
|
|
403
|
+
#
|
|
404
|
+
# WHAT IS MEASURED: the INSTALLED tree, which is not necessarily the PIN. The
|
|
405
|
+
# model table ships in the platform binary (@anthropic-ai/claude-code-linux-x64),
|
|
406
|
+
# fetched by the stub's postinstall — the npm tarball for @anthropic-ai/claude-code
|
|
407
|
+
# is a ~23 kB launcher that contains no model ids at all, so only an installed
|
|
408
|
+
# (or separately unpacked platform) tree can answer this question.
|
|
409
|
+
#
|
|
410
|
+
# A stale node_modules therefore reports DRIFT against ids the PIN actually
|
|
411
|
+
# knows. Observed 2026-09-03: node_modules held 2.1.142 while package.json
|
|
412
|
+
# pinned 2.1.219, and this check reported `claude-opus-5` and `claude-sonnet-5`
|
|
413
|
+
# ABSENT — both are present in 2.1.219. A false DRIFT here costs a needless
|
|
414
|
+
# dependency bump; the same skew in the other direction (node_modules NEWER
|
|
415
|
+
# than the pin) would report a false PASS, which is worse. So state the two
|
|
416
|
+
# versions and refuse to call a mismatch a measurement of the pin.
|
|
417
|
+
# SCOPE IS LOAD-BEARING: probe the PLATFORM BINARY, never the @anthropic-ai
|
|
418
|
+
# scope. Measured 2026-09-03 in this repo: `claude-agent-sdk` and
|
|
419
|
+
# `claude-agent-sdk-linux-x64` BOTH contain `claude-sonnet-5`, so a scope-wide
|
|
420
|
+
# grep answers "ok present in the pinned CLI bundle" from the AGENT SDK while
|
|
421
|
+
# claude-code lacks the id entirely — a false PASS on the exact #6934
|
|
422
|
+
# degradation this check exists to catch. Read the version from the same
|
|
423
|
+
# package we grep, or the printed version labels a measurement of a different
|
|
424
|
+
# package (the stub carries no model ids, so its version is not the subject).
|
|
425
|
+
_cli_pkg="$ROOT/apps/web-platform/node_modules/@anthropic-ai/claude-code-linux-x64"
|
|
426
|
+
_cli_dir="$_cli_pkg"
|
|
427
|
+
_cli_pinned="$(grep -oE '"@anthropic-ai/claude-code"[[:space:]]*:[[:space:]]*"[^"]+"' \
|
|
428
|
+
"$ROOT/apps/web-platform/package.json" 2>/dev/null | grep -oE '[0-9][^"]*' | head -1 || true)"
|
|
429
|
+
_cli_installed="$(grep -oE '"version"[[:space:]]*:[[:space:]]*"[^"]+"' \
|
|
430
|
+
"$_cli_pkg/package.json" 2>/dev/null \
|
|
431
|
+
| head -1 | grep -oE '[0-9][^"]*' || true)"
|
|
432
|
+
# Every arm names what it measured. The `elif` MUST require _cli_installed:
|
|
433
|
+
# guarding on _cli_pinned alone printed "matches the package.json pin" on a
|
|
434
|
+
# tree with no install at all (reproduced on a root carrying only
|
|
435
|
+
# package.json), immediately above the UNKNOWN line that contradicts it — a
|
|
436
|
+
# pass-shaped claim over a channel that was never read, which is the
|
|
437
|
+
# absent-vs-could-not-look conflation collect_config_hits exists to prevent.
|
|
438
|
+
if [[ -n "$_cli_pinned" && -n "$_cli_installed" && "$_cli_pinned" != "$_cli_installed" ]]; then
|
|
439
|
+
echo " NOTE: measuring INSTALLED ${_cli_installed}, but package.json pins ${_cli_pinned}."
|
|
440
|
+
echo " Findings below describe the installed tree, NOT the pin — reinstall before trusting them."
|
|
441
|
+
elif [[ -n "$_cli_pinned" && -n "$_cli_installed" ]]; then
|
|
442
|
+
echo " measuring installed tree @ ${_cli_installed} (matches the package.json pin)."
|
|
443
|
+
elif [[ -n "$_cli_pinned" ]]; then
|
|
444
|
+
echo " pin: ${_cli_pinned} / installed: (none) — comparison UNKNOWN, not a match."
|
|
445
|
+
else
|
|
446
|
+
echo " pin: UNKNOWN (could not read @anthropic-ai/claude-code from apps/web-platform/package.json)."
|
|
447
|
+
fi
|
|
448
|
+
if [[ -d "$_cli_dir" ]]; then
|
|
449
|
+
# `fable` included: the alternation must cover every tier that can appear in
|
|
450
|
+
# the scanned registries, or the one model whose id the pin lacks is the one
|
|
451
|
+
# model never checked. (Fable reaches Soleur as the harness `model: fable`
|
|
452
|
+
# ALIAS today, so no fable literal is in these files yet — this closes the
|
|
453
|
+
# gap for the launch where one lands.)
|
|
454
|
+
for _m in $(grep -ohE '"claude-(opus|sonnet|haiku|fable)-[0-9a-z-]+"' \
|
|
455
|
+
"$ROOT/apps/web-platform/server/inngest/model-tiers.ts" \
|
|
456
|
+
"$ROOT/apps/web-platform/server/inngest/leader-prompts/constants.ts" 2>/dev/null \
|
|
457
|
+
| tr -d '"' | sort -u); do
|
|
458
|
+
# -a: the linux-x64 CLI is a compiled binary; a text-mode grep silently
|
|
459
|
+
# reports zero hits for EVERY id, including known-good ones (a null result
|
|
460
|
+
# that reads exactly like a real one).
|
|
461
|
+
# Anchored on the SAME boundary as everything else: a fixed-string probe is
|
|
462
|
+
# unanchored on both sides, so a bundle carrying only `claude-opus-5-20260101`
|
|
463
|
+
# answered "ok present" for `claude-opus-5` AND for the bare tier
|
|
464
|
+
# `claude-opus` (measured). That is this PR's own prefix-shadowing class in
|
|
465
|
+
# the PRESENCE direction — a tier whose id the pin genuinely lacks reports
|
|
466
|
+
# green whenever any longer id sharing its prefix is in the blob.
|
|
467
|
+
# Left-anchored too (#8603), matching the CI twin
|
|
468
|
+
# apps/web-platform/test/server/inngest/claude-cli-pin-knows-models.test.ts:
|
|
469
|
+
# an id present only inside a longer token (the Bedrock provider form
|
|
470
|
+
# `us.anthropic.<id>`) is not an entry the model table resolves.
|
|
471
|
+
if grep -raqE "(^|[^0-9A-Za-z.-])${_m}${ID_BOUNDARY}" "$_cli_dir" 2>/dev/null; then
|
|
472
|
+
echo " ok $_m present in the pinned CLI bundle"
|
|
473
|
+
else
|
|
474
|
+
echo " DRIFT $_m ABSENT from ${_cli_pkg##*/} @ ${_cli_installed:-unknown} — bump @anthropic-ai/claude-code"
|
|
475
|
+
fi
|
|
476
|
+
done
|
|
477
|
+
else
|
|
478
|
+
echo " UNKNOWN (${_cli_pkg#"$ROOT"/} absent) — NOT a pass; run after install."
|
|
479
|
+
fi
|
|
480
|
+
echo
|
|
481
|
+
|
|
482
|
+
echo "[3] pricing + tier-map + dormant work (FLAG-ONLY)"
|
|
483
|
+
echo " - pricing: compare apps/web-platform/server/inngest/functions/agent-on-spawn-requested.ts"
|
|
484
|
+
echo " MODEL_PRICING rows against the claude-api source-of-truth; never auto-edit (billing constant)."
|
|
485
|
+
echo " - tier-map: re-check cron model literals + ADR-053 / plugins/soleur/AGENTS.md policy vs new pricing."
|
|
486
|
+
echo " (workflow-model-pins.test.ts PIN_ALLOWLIST is a don't-mutate invariant, not a pricing surface.)"
|
|
487
|
+
echo " - dormant: gh issue list --state open -L 200 --search 'deferred model OR pricing'"
|
|
488
|
+
echo " - grok tier-map (item 6, agent-run): compare 'grok models' + docs.x.ai against TIER_MAPS.grok."
|
|
489
|
+
echo " - thinking-API shape: the REQUEST side sets no thinking params, but the CLI applies each"
|
|
490
|
+
echo " model row's default_effort: re-decide AUDIT_EFFORT (apps/web-platform/server/inngest/"
|
|
491
|
+
echo " model-tiers.ts) and update REVIEWED_DEFAULT_EFFORT in claude-cli-pin-knows-models.test.ts (#8603)."
|
|
492
|
+
echo " The RESPONSE side is NOT inert: a thinking-by-default model puts a thinking block"
|
|
493
|
+
echo " FIRST, so any reader indexing a fixed content position silently returns empty"
|
|
494
|
+
echo " and the model's answer is billed and discarded (#8392)."
|
|
495
|
+
echo " The BLOCKING guard is scripts/lint-anthropic-content-position.py, twin-"
|
|
496
|
+
echo " registered in scripts/test-all.sh so it gates every PR — this census does"
|
|
497
|
+
echo " NOT gate anything and is reachable only from this hand-run audit mode"
|
|
498
|
+
echo " (--detect and --fix both return before it). Advisory echo of the same scan:"
|
|
499
|
+
collect_content_position_readers
|
|
500
|
+
echo
|
|
501
|
+
echo "== end audit =="
|