@soleur/opencode 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +659 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +108 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +342 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +152 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +493 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +363 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +520 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +113 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +178 -0
- package/scripts/sync-opencode-adapter.ts +479 -0
- package/scripts/sync-pr-behind.sh +534 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +65 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +142 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +118 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +668 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +325 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +138 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1621 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3022 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +149 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/work/SKILL.md +1479 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# gdpr-gate `--repo-scan` walker.
|
|
3
|
+
#
|
|
4
|
+
# Operator-initiated only — never auto-fires from /soleur:plan, /soleur:work,
|
|
5
|
+
# or lefthook. Resolves the canonical regulated-data regex and the path
|
|
6
|
+
# deny-list, then emits surviving candidate paths to stdout. The dispatching
|
|
7
|
+
# agent reads stdout, batches 25 files per Haiku call (ADR-026 TR3), and
|
|
8
|
+
# summarises findings inline.
|
|
9
|
+
#
|
|
10
|
+
# Defenses (named in the v2 plan §"User-Brand Impact"):
|
|
11
|
+
# D1 Path deny-list before any read (path-denylist.txt)
|
|
12
|
+
# D2 git ls-files -c -o --exclude-standard (no working-tree rename laundering)
|
|
13
|
+
# D3 Path-allowlist env var, two-clause typo (GDPR_GATE_REPO_SCAN_ALLOW_PATHS)
|
|
14
|
+
# defense + CI-environment refusal (CI + ALLOW_PATHS → exit 1)
|
|
15
|
+
# D4 Inline-only output (no disk persistence here)
|
|
16
|
+
# D5 Schema-only invariant (carried by the prompt template)
|
|
17
|
+
# D6 Symlink refusal (path-typed `-L` guard before stdout)
|
|
18
|
+
#
|
|
19
|
+
# Outputs:
|
|
20
|
+
# stdout — surviving candidate paths, one per line
|
|
21
|
+
# stderr — `# blocked: <path>` for denied paths, `# bypass: <path>` for
|
|
22
|
+
# denied-but-allow-listed paths, `# blocked: <path> (symlink)`
|
|
23
|
+
# for symlinks, plus error messages on exit 1
|
|
24
|
+
|
|
25
|
+
set -euo pipefail
|
|
26
|
+
LC_ALL=POSIX
|
|
27
|
+
export LC_ALL
|
|
28
|
+
|
|
29
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
30
|
+
SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
31
|
+
SKILL_MD="$SKILL_DIR/SKILL.md"
|
|
32
|
+
DENYLIST_FILE="$SCRIPT_DIR/path-denylist.txt"
|
|
33
|
+
|
|
34
|
+
# CI-environment refusal must trip BEFORE we touch git or read SKILL.md, so
|
|
35
|
+
# misconfigured CI runbooks fail loudly at the script boundary. Empty / "0" /
|
|
36
|
+
# "false" are treated as "not in CI" so a developer who explicitly exports
|
|
37
|
+
# `CI=` does not silently re-enable allow-list bypass under the false belief
|
|
38
|
+
# that CI-refusal protects them.
|
|
39
|
+
ci_active=0
|
|
40
|
+
case "${CI:-}" in
|
|
41
|
+
""|"0"|"false"|"FALSE") ci_active=0 ;;
|
|
42
|
+
*) ci_active=1 ;;
|
|
43
|
+
esac
|
|
44
|
+
if (( ci_active == 1 )) && [[ -n "${GDPR_GATE_REPO_SCAN_ALLOW_PATHS:-}" ]]; then
|
|
45
|
+
echo "gdpr-gate repo-scan: allow-list bypass refused in CI environment" >&2
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
if [[ ! -f "$SKILL_MD" ]]; then
|
|
50
|
+
echo "gdpr-gate repo-scan: SKILL.md not found at $SKILL_MD" >&2
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
if [[ ! -f "$DENYLIST_FILE" ]]; then
|
|
55
|
+
echo "gdpr-gate repo-scan: deny-list not found at $DENYLIST_FILE" >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Extract the canonical regex from SKILL.md §"Path globs (canonical)".
|
|
60
|
+
# Layout: a `## Path globs (canonical)` heading, prose, then a fenced ```
|
|
61
|
+
# block whose first non-blank line is the regex (starts with `^`).
|
|
62
|
+
canonical_regex="$(awk '
|
|
63
|
+
/^## Path globs \(canonical\)/ { found = 1; next }
|
|
64
|
+
found && /^```/ { in_block = !in_block; next }
|
|
65
|
+
found && in_block && /^[[:space:]]*\^/ { print; exit }
|
|
66
|
+
' "$SKILL_MD")"
|
|
67
|
+
|
|
68
|
+
if [[ -z "$canonical_regex" ]]; then
|
|
69
|
+
echo "gdpr-gate repo-scan: canonical regex not found in SKILL.md" >&2
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Load deny-list patterns (skip blanks and `#` comments).
|
|
74
|
+
declare -a denylist_patterns=()
|
|
75
|
+
while IFS= read -r raw_line || [[ -n "$raw_line" ]]; do
|
|
76
|
+
line="${raw_line%$'\r'}"
|
|
77
|
+
[[ -z "${line// /}" ]] && continue
|
|
78
|
+
[[ "$line" =~ ^[[:space:]]*# ]] && continue
|
|
79
|
+
denylist_patterns+=("$line")
|
|
80
|
+
done < "$DENYLIST_FILE"
|
|
81
|
+
|
|
82
|
+
if (( ${#denylist_patterns[@]} == 0 )); then
|
|
83
|
+
echo "gdpr-gate repo-scan: deny-list is empty" >&2
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# `path_is_denied` is the single source of truth for deny-list matching.
|
|
88
|
+
# Used by both the D3 first-clause check (allow-list entries must match a
|
|
89
|
+
# deny pattern) and the walker. `shopt -s nocasematch` is scoped here so
|
|
90
|
+
# `.PEM` / `.KEY` files match `.pem` / `.key` patterns — defense-in-depth
|
|
91
|
+
# against case-variant filenames on macOS or Windows checkouts. Importantly,
|
|
92
|
+
# `nocasematch` is reset before return so it does NOT leak into `is_allowed`
|
|
93
|
+
# (which uses `[[ == ]]` and must remain byte-exact for allow-list entries).
|
|
94
|
+
path_is_denied() {
|
|
95
|
+
local path="$1" dp
|
|
96
|
+
shopt -s nocasematch
|
|
97
|
+
for dp in "${denylist_patterns[@]}"; do
|
|
98
|
+
if [[ "$path" =~ $dp ]]; then
|
|
99
|
+
shopt -u nocasematch
|
|
100
|
+
return 0
|
|
101
|
+
fi
|
|
102
|
+
done
|
|
103
|
+
shopt -u nocasematch
|
|
104
|
+
return 1
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# Parse GDPR_GATE_REPO_SCAN_ALLOW_PATHS (D3 two-clause defense).
|
|
108
|
+
declare -a allow_paths=()
|
|
109
|
+
allow_paths_raw="${GDPR_GATE_REPO_SCAN_ALLOW_PATHS:-}"
|
|
110
|
+
if [[ -n "$allow_paths_raw" ]]; then
|
|
111
|
+
IFS=':' read -ra allow_paths <<< "$allow_paths_raw"
|
|
112
|
+
for ap in "${allow_paths[@]}"; do
|
|
113
|
+
if ! path_is_denied "$ap"; then
|
|
114
|
+
echo "gdpr-gate repo-scan: bypass references non-blocked path: $ap (did you mean a path under the deny-list?)" >&2
|
|
115
|
+
exit 1
|
|
116
|
+
fi
|
|
117
|
+
if ! git ls-files -c -o --exclude-standard --error-unmatch -- "$ap" >/dev/null 2>&1; then
|
|
118
|
+
echo "gdpr-gate repo-scan: bypass references nonexistent path: $ap" >&2
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
done
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
is_allowed() {
|
|
125
|
+
local path="$1"
|
|
126
|
+
local ap
|
|
127
|
+
for ap in "${allow_paths[@]+"${allow_paths[@]}"}"; do
|
|
128
|
+
[[ "$path" == "$ap" ]] && return 0
|
|
129
|
+
done
|
|
130
|
+
return 1
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# Walk: candidate paths after canonical-regex filter, then deny/allow check
|
|
134
|
+
# and symlink guard. `|| true` on `grep -E` keeps `pipefail` from tripping
|
|
135
|
+
# when the canonical regex matches zero files (a legitimate "no regulated-
|
|
136
|
+
# data paths in this repo" outcome — fail-open here is safe because the
|
|
137
|
+
# downstream consumer simply receives an empty path list).
|
|
138
|
+
git ls-files -c -o --exclude-standard \
|
|
139
|
+
| { grep -E "$canonical_regex" || true; } \
|
|
140
|
+
| while IFS= read -r path; do
|
|
141
|
+
if path_is_denied "$path"; then
|
|
142
|
+
if is_allowed "$path"; then
|
|
143
|
+
echo "# bypass: $path" >&2
|
|
144
|
+
else
|
|
145
|
+
echo "# blocked: $path" >&2
|
|
146
|
+
fi
|
|
147
|
+
continue
|
|
148
|
+
fi
|
|
149
|
+
# D6 symlink refusal — the deny-list cannot anticipate every link
|
|
150
|
+
# target, so we refuse symlinks unconditionally. A contributor who
|
|
151
|
+
# adds e.g. `apps/web-platform/lib/auth/foo.ts -> ../../.env` would
|
|
152
|
+
# otherwise leak the link target's content to the dispatching agent.
|
|
153
|
+
if [[ -L "$path" ]]; then
|
|
154
|
+
echo "# blocked: $path (symlink)" >&2
|
|
155
|
+
continue
|
|
156
|
+
fi
|
|
157
|
+
printf '%s\n' "$path"
|
|
158
|
+
done
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# vendor-drift-classify.sh — severity classifier for an upstream content diff.
|
|
3
|
+
#
|
|
4
|
+
# Reads a unified diff on stdin. Optional positional args are the SHA pair
|
|
5
|
+
# `<old-sha> <new-sha>` (used for rollback detection). Optional flags:
|
|
6
|
+
# --archived exit 12 (upstream archived; signaled by drift workflow)
|
|
7
|
+
# --renamed exit 16 (upstream renamed; signaled by drift workflow)
|
|
8
|
+
#
|
|
9
|
+
# Priority chain (exit-code wins go highest→lowest):
|
|
10
|
+
# 15 rollback new-sha is ancestor of old-sha
|
|
11
|
+
# 12 archived --archived flag set
|
|
12
|
+
# 16 renamed --renamed flag set
|
|
13
|
+
# 11 license diff touches a path containing LICENSE
|
|
14
|
+
# 10 security security-relevant regex hits in diff body
|
|
15
|
+
# 13 batched non-empty diff with no security signal
|
|
16
|
+
# 0 no-op empty / whitespace-only diff
|
|
17
|
+
#
|
|
18
|
+
# Security regex set (from plan §Phase 1.3 — additions only, hence ^\+):
|
|
19
|
+
# ^\+.*\|.*\|.*$ added markdown table row
|
|
20
|
+
# ^\+.*\[CRITICAL\] criticality marker
|
|
21
|
+
# ^\+.*\bMUST\b RFC-2119 normative
|
|
22
|
+
# ^\+.*Art\. [0-9]+ GDPR/CCPA article reference
|
|
23
|
+
# ^\+.*§\s*[0-9]+ section symbol
|
|
24
|
+
# ^\+\+\+ b/.*/layers/ new file under references/layers/
|
|
25
|
+
#
|
|
26
|
+
# Stdout contract (review #3521 — multi-category fix):
|
|
27
|
+
# For every category that matches, one line is emitted on stdout in the
|
|
28
|
+
# form `category=<name>` where <name> ∈ {rollback,archived,renamed,license,
|
|
29
|
+
# security,batched,no-op}. The workflow consumer accumulates labels from
|
|
30
|
+
# the full set, while routing (auto-PR vs issue) uses the exit code.
|
|
31
|
+
# The single-exit-code contract previously under-labeled co-occurring
|
|
32
|
+
# security + license drift.
|
|
33
|
+
#
|
|
34
|
+
# On unexpected argument shape the script writes to stderr and exits 2.
|
|
35
|
+
|
|
36
|
+
set -euo pipefail
|
|
37
|
+
|
|
38
|
+
ARCHIVED=0
|
|
39
|
+
RENAMED=0
|
|
40
|
+
OLD_SHA=""
|
|
41
|
+
NEW_SHA=""
|
|
42
|
+
|
|
43
|
+
while [[ $# -gt 0 ]]; do
|
|
44
|
+
case "$1" in
|
|
45
|
+
--archived) ARCHIVED=1; shift ;;
|
|
46
|
+
--renamed) RENAMED=1; shift ;;
|
|
47
|
+
--) shift; break ;;
|
|
48
|
+
-*)
|
|
49
|
+
echo "vendor-drift-classify: unknown flag: $1" >&2
|
|
50
|
+
exit 2
|
|
51
|
+
;;
|
|
52
|
+
*)
|
|
53
|
+
if [[ -z "$OLD_SHA" ]]; then
|
|
54
|
+
OLD_SHA="$1"
|
|
55
|
+
elif [[ -z "$NEW_SHA" ]]; then
|
|
56
|
+
NEW_SHA="$1"
|
|
57
|
+
else
|
|
58
|
+
echo "vendor-drift-classify: unexpected positional arg: $1" >&2
|
|
59
|
+
exit 2
|
|
60
|
+
fi
|
|
61
|
+
shift
|
|
62
|
+
;;
|
|
63
|
+
esac
|
|
64
|
+
done
|
|
65
|
+
|
|
66
|
+
DIFF=$(cat)
|
|
67
|
+
|
|
68
|
+
# Accumulate every matching category to stdout. Exit code retains the
|
|
69
|
+
# first-match-wins priority for routing; stdout is used by the consumer for
|
|
70
|
+
# label accumulation (review #3521 multi-category contract).
|
|
71
|
+
exit_code=0
|
|
72
|
+
|
|
73
|
+
# 1. Rollback: new-sha is an ancestor of old-sha (and not the same commit).
|
|
74
|
+
if [[ -n "$OLD_SHA" && -n "$NEW_SHA" && "$OLD_SHA" != "$NEW_SHA" ]]; then
|
|
75
|
+
if git merge-base --is-ancestor "$NEW_SHA" "$OLD_SHA" 2>/dev/null; then
|
|
76
|
+
echo "category=rollback"
|
|
77
|
+
exit 15
|
|
78
|
+
fi
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# 2. Upstream-disambiguation flags (signaled by the workflow's gh-api step).
|
|
82
|
+
if (( ARCHIVED )); then
|
|
83
|
+
echo "category=archived"
|
|
84
|
+
exit_code=12
|
|
85
|
+
fi
|
|
86
|
+
if (( RENAMED )); then
|
|
87
|
+
echo "category=renamed"
|
|
88
|
+
(( exit_code == 0 )) && exit_code=16
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# 3. LICENSE diff (basename anchored, optionally with extension). The
|
|
92
|
+
# anchor prevents false-positives on paths like docs/LICENSE-DISCUSSION.md
|
|
93
|
+
# or src/license_parser.py where `LICENSE` is a substring but the file is
|
|
94
|
+
# not a license document.
|
|
95
|
+
if grep -qE '^(\+\+\+|---) [ab]/(.*/)?LICENSE(\.[^/]+)?$' <<<"$DIFF"; then
|
|
96
|
+
echo "category=license"
|
|
97
|
+
(( exit_code == 0 )) && exit_code=11
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# 4. Security-relevant regex set.
|
|
101
|
+
if grep -qE '^\+.*\|.*\|.*$|^\+.*\[CRITICAL\]|^\+.*\bMUST\b|^\+.*Art\. [0-9]+|^\+.*§[[:space:]]*[0-9]+|^\+\+\+ b/.*/layers/' <<<"$DIFF"; then
|
|
102
|
+
echo "category=security"
|
|
103
|
+
(( exit_code == 0 )) && exit_code=10
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# If any category fired (archived/renamed/license/security), exit with the
|
|
107
|
+
# highest-priority code we accumulated.
|
|
108
|
+
if (( exit_code != 0 )); then
|
|
109
|
+
exit "$exit_code"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# 5. Batched (non-empty diff, no security signal).
|
|
113
|
+
if [[ -n "$(printf '%s' "$DIFF" | tr -d '[:space:]')" ]]; then
|
|
114
|
+
echo "category=batched"
|
|
115
|
+
exit 13
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
# 6. No-op.
|
|
119
|
+
echo "category=no-op"
|
|
120
|
+
exit 0
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# vendor-pin-integrity.sh — pre-commit lefthook target (FR5, TR1).
|
|
3
|
+
#
|
|
4
|
+
# For each file argument: compute `git hash-object --no-filters` against the
|
|
5
|
+
# working-tree contents and compare to the blob-sha pinned in NOTICE
|
|
6
|
+
# frontmatter. Exit 1 on any mismatch (or on a staged file that is in neither
|
|
7
|
+
# NOTICE registry — silent local addition).
|
|
8
|
+
#
|
|
9
|
+
# NOTE the script iterates only over its ARGUMENTS and never walks the tree,
|
|
10
|
+
# so it cannot detect a reference file that is absent from both registries
|
|
11
|
+
# unless lefthook happens to stage it. The symmetric-difference property
|
|
12
|
+
# (disk(references/**) == lifted-files U soleur-authored) is bought by
|
|
13
|
+
# plugins/soleur/test/vendor-pin-integrity.test.sh, which does walk. That is
|
|
14
|
+
# the chokepoint; this script is not (#7710).
|
|
15
|
+
#
|
|
16
|
+
# `--no-filters` is load-bearing per TR1: skips gitattributes line-ending
|
|
17
|
+
# conversion that would otherwise diverge from upstream blob SHAs on
|
|
18
|
+
# Windows/CRLF setups.
|
|
19
|
+
#
|
|
20
|
+
# Modes:
|
|
21
|
+
# default local pin check (per-file hash vs NOTICE local-blob-sha)
|
|
22
|
+
# --verify-upstream for every NOTICE lifted-files record, call
|
|
23
|
+
# `gh api repos/$UPSTREAM/contents/<upstream-path>?ref=<pinned-commit>`
|
|
24
|
+
# and assert the returned .sha equals the record's
|
|
25
|
+
# upstream-blob-sha. Binds path + pinned commit + blob in
|
|
26
|
+
# one call (#8181): the pre-#8181 `git/blobs/<sha>` check
|
|
27
|
+
# proved only that the object exists SOMEWHERE in the
|
|
28
|
+
# upstream store, so a NOTICE pinning a real blob under
|
|
29
|
+
# the wrong path passed while attesting content upstream
|
|
30
|
+
# never published there. Closes the NOTICE co-edit bypass
|
|
31
|
+
# (review #3521) — local hash + NOTICE-SHA match alone is
|
|
32
|
+
# tautological if the PR edits both.
|
|
33
|
+
#
|
|
34
|
+
# Invoked from lefthook.yml (local mode) and
|
|
35
|
+
# `.github/workflows/vendor-pin-verify.yml` (--verify-upstream mode).
|
|
36
|
+
#
|
|
37
|
+
# NOTICE_FILE env var overrides the parser's default NOTICE path so tests can
|
|
38
|
+
# point at fixture frontmatter without mutating the live skill NOTICE.
|
|
39
|
+
|
|
40
|
+
set -euo pipefail
|
|
41
|
+
|
|
42
|
+
VERIFY_UPSTREAM=0
|
|
43
|
+
ARGS=()
|
|
44
|
+
while [[ $# -gt 0 ]]; do
|
|
45
|
+
case "$1" in
|
|
46
|
+
--verify-upstream) VERIFY_UPSTREAM=1; shift ;;
|
|
47
|
+
--) shift; ARGS+=("$@"); break ;;
|
|
48
|
+
*) ARGS+=("$1"); shift ;;
|
|
49
|
+
esac
|
|
50
|
+
done
|
|
51
|
+
set -- "${ARGS[@]}"
|
|
52
|
+
|
|
53
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
54
|
+
# Resolve the root with every inherited GIT_* variable stripped (by prefix, not a
|
|
55
|
+
# name list). A pre-commit hook in a worktree inherits GIT_DIR, and with GIT_DIR
|
|
56
|
+
# set and no GIT_WORK_TREE, `--show-toplevel` answers the -C directory itself, so
|
|
57
|
+
# REPO_ROOT became this scripts dir and every staged file read as "missing from
|
|
58
|
+
# working tree" (#8150, measured on a merge that staged legal-generate templates).
|
|
59
|
+
_git_env_unset=()
|
|
60
|
+
while IFS='=' read -r _name _; do
|
|
61
|
+
[[ "$_name" == GIT_* ]] && _git_env_unset+=(-u "$_name")
|
|
62
|
+
done < <(env)
|
|
63
|
+
REPO_ROOT="$(env "${_git_env_unset[@]}" git -C "$SCRIPT_DIR" rev-parse --show-toplevel)"
|
|
64
|
+
PARSER="$SCRIPT_DIR/notice-frontmatter.sh"
|
|
65
|
+
# SKILL_PREFIX + NOTICE_FILE env overrides parameterize the script for a
|
|
66
|
+
# second vendored bundle (ADR-095 shared-engine precedent: the scripts stay
|
|
67
|
+
# gdpr-gate-owned; each bundle's lefthook stanza and CI step export both).
|
|
68
|
+
# The --verify-upstream arm reads only NOTICE_FILE + the NOTICE-internal
|
|
69
|
+
# upstream coordinate, so it needs no SKILL_PREFIX.
|
|
70
|
+
SKILL_PREFIX="${SKILL_PREFIX:-plugins/soleur/skills/gdpr-gate}"
|
|
71
|
+
|
|
72
|
+
if (( VERIFY_UPSTREAM )); then
|
|
73
|
+
UPSTREAM=$(bash "$PARSER" field upstream 2>/dev/null || true)
|
|
74
|
+
if [[ -z "$UPSTREAM" ]]; then
|
|
75
|
+
echo "vendor-pin-integrity: NOTICE frontmatter missing 'upstream' field; cannot verify upstream blobs" >&2
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
# NOTICE upstream field is `github.com/<owner>/<repo>`; strip the host.
|
|
79
|
+
OWNER_REPO="${UPSTREAM#github.com/}"
|
|
80
|
+
if [[ -z "$OWNER_REPO" || "$OWNER_REPO" == "$UPSTREAM" ]]; then
|
|
81
|
+
echo "vendor-pin-integrity: NOTICE upstream field '$UPSTREAM' is not in github.com/<owner>/<repo> form" >&2
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
85
|
+
echo "vendor-pin-integrity: --verify-upstream requires gh CLI" >&2
|
|
86
|
+
exit 1
|
|
87
|
+
fi
|
|
88
|
+
# pinned-commit is the ref under verification. Empty or non-40-hex must
|
|
89
|
+
# fail closed — a malformed ref silently degrading to a default-branch
|
|
90
|
+
# read would attest a binding never checked (#8181).
|
|
91
|
+
PINNED_COMMIT=$(bash "$PARSER" field pinned-commit 2>/dev/null || true)
|
|
92
|
+
if [[ ! "$PINNED_COMMIT" =~ ^[0-9a-f]{40}$ ]]; then
|
|
93
|
+
echo "vendor-pin-integrity: NOTICE pinned-commit '$PINNED_COMMIT' is missing or not a 40-hex SHA — cannot bind path/commit/blob" >&2
|
|
94
|
+
exit 1
|
|
95
|
+
fi
|
|
96
|
+
fails=0
|
|
97
|
+
checked=0
|
|
98
|
+
while IFS= read -r line; do
|
|
99
|
+
[[ -z "$line" ]] && continue
|
|
100
|
+
upstream_path="${line%%:*}"
|
|
101
|
+
upstream_sha="${line##*:}"
|
|
102
|
+
checked=$((checked + 1))
|
|
103
|
+
# The path is interpolated into the request URL's path segment —
|
|
104
|
+
# unvalidated, a NOTICE-supplied `?`/`&`/`#`/space/`%` would split the
|
|
105
|
+
# segment early and smuggle a second `ref` (or truncate the binding to
|
|
106
|
+
# whatever precedes it), attesting a path the check never read (#8185
|
|
107
|
+
# review). Repo paths are constrained to a portable charset; anything
|
|
108
|
+
# else fails closed rather than constructing a malformed request.
|
|
109
|
+
if [[ ! "$upstream_path" =~ ^[A-Za-z0-9._/-]+$ ]]; then
|
|
110
|
+
echo "vendor-pin-integrity: upstream path '$upstream_path' contains characters unsafe for URL interpolation — refusing to bind" >&2
|
|
111
|
+
fails=$((fails + 1))
|
|
112
|
+
continue
|
|
113
|
+
fi
|
|
114
|
+
# The contents endpoint binds all three fields in one answer: the PATH
|
|
115
|
+
# at the pinned COMMIT must resolve to the pinned BLOB. A 404 (path
|
|
116
|
+
# absent at that commit) yields empty actual_sha -> fail; a directory
|
|
117
|
+
# path yields a JSON array whose .sha is null -> fail. `ref` travels as
|
|
118
|
+
# a -f field so gh percent-encodes it — the pinned commit can never be
|
|
119
|
+
# re-sliced by a metacharacter in the path argument. -X GET is
|
|
120
|
+
# REQUIRED: gh api defaults to POST whenever a -f field is present, and
|
|
121
|
+
# POST on the contents endpoint 404s (measured on PR #8185 CI).
|
|
122
|
+
actual_sha=$(gh api -X GET "repos/$OWNER_REPO/contents/$upstream_path" -f "ref=$PINNED_COMMIT" --jq '.sha' 2>/dev/null || true)
|
|
123
|
+
if [[ "$actual_sha" != "$upstream_sha" ]]; then
|
|
124
|
+
echo "vendor-pin-integrity: $upstream_path at pinned-commit $PINNED_COMMIT resolves to blob '${actual_sha:-<unresolved>}' but NOTICE pins $upstream_sha — path/commit/blob binding failed" >&2
|
|
125
|
+
fails=$((fails + 1))
|
|
126
|
+
fi
|
|
127
|
+
done < <(bash "$PARSER" upstream-files)
|
|
128
|
+
# "0 checked, 0 failed" must NOT read as success — an empty lifted-files
|
|
129
|
+
# registry (or a parser that yields nothing) would otherwise print the
|
|
130
|
+
# verified message and exit 0 having verified no blob at all.
|
|
131
|
+
if (( checked == 0 )); then
|
|
132
|
+
echo "vendor-pin-integrity: NOTICE declares no lifted-files records — nothing was verified; refusing to pass vacuously" >&2
|
|
133
|
+
exit 1
|
|
134
|
+
fi
|
|
135
|
+
if (( fails > 0 )); then
|
|
136
|
+
echo "vendor-pin-integrity: $fails upstream binding(s) failed verification" >&2
|
|
137
|
+
exit 1
|
|
138
|
+
fi
|
|
139
|
+
echo "vendor-pin-integrity: all $checked NOTICE upstream-blob-sha bindings verified against $OWNER_REPO at pinned-commit ${PINNED_COMMIT:0:12}"
|
|
140
|
+
exit 0
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
# Build expected map (rel_path → blob-sha) from NOTICE.
|
|
144
|
+
#
|
|
145
|
+
# TWO registries feed this map, with the same record shape and opposite
|
|
146
|
+
# provenance (#7710):
|
|
147
|
+
# lifted-files — upstream-derived, pinned against the NOTICE's declared
|
|
148
|
+
# upstream (goSprinto MIT for gdpr-gate; General-Legal CC0
|
|
149
|
+
# for legal-generate via the SKILL_PREFIX/NOTICE_FILE
|
|
150
|
+
# overrides).
|
|
151
|
+
# soleur-authored — written from scratch for this plugin, no upstream.
|
|
152
|
+
# Both are tamper-checked identically; only the ORIGIN map below differs, and
|
|
153
|
+
# it exists so a mismatch names the list the file actually belongs to. Before
|
|
154
|
+
# #7710 only `lifted-files` was consulted, so every Soleur-authored reference
|
|
155
|
+
# file was rejected as a "silent local addition" and could not be committed
|
|
156
|
+
# without `--no-verify` — which blocked the documented v2->v3 lifecycle of
|
|
157
|
+
# `legal-consent.md`.
|
|
158
|
+
declare -A EXPECTED=()
|
|
159
|
+
declare -A ORIGIN=()
|
|
160
|
+
while IFS= read -r line; do
|
|
161
|
+
[[ -z "$line" ]] && continue
|
|
162
|
+
rel_path="${line%%:*}"
|
|
163
|
+
sha="${line##*:}"
|
|
164
|
+
EXPECTED["$SKILL_PREFIX/$rel_path"]="$sha"
|
|
165
|
+
ORIGIN["$SKILL_PREFIX/$rel_path"]="lifted-files"
|
|
166
|
+
done < <(bash "$PARSER" lifted-files)
|
|
167
|
+
|
|
168
|
+
while IFS= read -r line; do
|
|
169
|
+
[[ -z "$line" ]] && continue
|
|
170
|
+
rel_path="${line%%:*}"
|
|
171
|
+
sha="${line##*:}"
|
|
172
|
+
# A path in BOTH registries is a provenance falsification, not a duplicate
|
|
173
|
+
# pin: it would attest MIT provenance for Soleur's own writing. Refuse
|
|
174
|
+
# rather than let one map silently win.
|
|
175
|
+
if [[ -n "${EXPECTED["$SKILL_PREFIX/$rel_path"]:-}" ]]; then
|
|
176
|
+
echo "vendor-pin-integrity: $SKILL_PREFIX/$rel_path appears in BOTH lifted-files and soleur-authored — provenance is ambiguous; a file is upstream-derived or Soleur-authored, never both." >&2
|
|
177
|
+
exit 1
|
|
178
|
+
fi
|
|
179
|
+
EXPECTED["$SKILL_PREFIX/$rel_path"]="$sha"
|
|
180
|
+
ORIGIN["$SKILL_PREFIX/$rel_path"]="soleur-authored"
|
|
181
|
+
done < <(bash "$PARSER" soleur-authored)
|
|
182
|
+
|
|
183
|
+
mismatches=0
|
|
184
|
+
for f in "$@"; do
|
|
185
|
+
# Normalise to canonical repo-relative for registry lookup. `realpath -m`
|
|
186
|
+
# resolves `..` segments without requiring the file to exist (covers the
|
|
187
|
+
# synthetic-deletion case below).
|
|
188
|
+
if [[ "$f" == /* ]]; then
|
|
189
|
+
abs="$(realpath -m "$f" 2>/dev/null || echo "$f")"
|
|
190
|
+
rel="${abs#"$REPO_ROOT"/}"
|
|
191
|
+
else
|
|
192
|
+
rel="$f"
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
# NOTICE itself is in the lefthook glob (any byte change should re-run the
|
|
196
|
+
# integrity gate) but is not a lifted-files registry entry. Skip the
|
|
197
|
+
# registry check for it; its content is governed by the workflow's
|
|
198
|
+
# NOTICE-bump step + reviewer eyes.
|
|
199
|
+
if [[ "$rel" == "$SKILL_PREFIX/NOTICE" ]]; then
|
|
200
|
+
continue
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
expected="${EXPECTED[$rel]:-}"
|
|
204
|
+
if [[ -z "$expected" ]]; then
|
|
205
|
+
echo "vendor-pin-integrity: $rel is staged but appears in neither NOTICE lifted-files nor soleur-authored — silent local addition? Add it to lifted-files if it is vendored from upstream, or to soleur-authored if it is written for this plugin, or remove the file." >&2
|
|
206
|
+
mismatches=$((mismatches + 1))
|
|
207
|
+
continue
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
if [[ ! -f "$REPO_ROOT/$rel" ]]; then
|
|
211
|
+
echo "vendor-pin-integrity: $rel listed in NOTICE but missing from working tree" >&2
|
|
212
|
+
mismatches=$((mismatches + 1))
|
|
213
|
+
continue
|
|
214
|
+
fi
|
|
215
|
+
|
|
216
|
+
actual="$(git hash-object --no-filters "$REPO_ROOT/$rel")"
|
|
217
|
+
if [[ "$actual" != "$expected" ]]; then
|
|
218
|
+
# Name the list the file belongs to AND a mechanism that exists. The
|
|
219
|
+
# previous text sent a blocked contributor to "the vendor-drift
|
|
220
|
+
# workflow", deleted in #4483 — the only exit offered at the moment
|
|
221
|
+
# their commit is refused, and a dead end.
|
|
222
|
+
origin="${ORIGIN[$rel]:-lifted-files}"
|
|
223
|
+
echo "vendor-pin-integrity: BLOB SHA mismatch on $rel (registry $origin: expected $expected, got $actual)." >&2
|
|
224
|
+
if [[ "$origin" == "soleur-authored" ]]; then
|
|
225
|
+
echo " This file is Soleur-authored, so editing it is expected. Update its local-blob-sha in the soleur-authored block of $SKILL_PREFIX/NOTICE to: $actual" >&2
|
|
226
|
+
else
|
|
227
|
+
echo " This file is vendored from upstream. Either revert the local edit, or — if this is a deliberate re-vendor — update its local-blob-sha in the lifted-files block of $SKILL_PREFIX/NOTICE to: $actual and record the upstream delta in the NOTICE table." >&2
|
|
228
|
+
fi
|
|
229
|
+
mismatches=$((mismatches + 1))
|
|
230
|
+
fi
|
|
231
|
+
done
|
|
232
|
+
|
|
233
|
+
if (( mismatches > 0 )); then
|
|
234
|
+
exit 1
|
|
235
|
+
fi
|
|
236
|
+
|
|
237
|
+
exit 0
|