@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,270 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* bot-fixture.ts — seed/reset the ux-audit bot's DB state.
|
|
4
|
+
*
|
|
5
|
+
* Scope: DB-only v1. KB file seeding deferred to #2351 (files live in GitHub
|
|
6
|
+
* workspace, not Supabase Storage).
|
|
7
|
+
*
|
|
8
|
+
* Usage: bun "${CLAUDE_PLUGIN_ROOT}/skills/ux-audit/scripts/bot-fixture.ts" <seed|reset>
|
|
9
|
+
*
|
|
10
|
+
* Env (from Doppler prd + prd_scheduled):
|
|
11
|
+
* SUPABASE_URL prd
|
|
12
|
+
* SUPABASE_SERVICE_ROLE_KEY prd
|
|
13
|
+
* UX_AUDIT_BOT_EMAIL prd_scheduled
|
|
14
|
+
*
|
|
15
|
+
* CI-caller contract: any GitHub Actions job that invokes `seed` or
|
|
16
|
+
* `reset` MUST set job-level
|
|
17
|
+
* concurrency:
|
|
18
|
+
* group: bot-fixture-shared-state
|
|
19
|
+
* cancel-in-progress: false
|
|
20
|
+
* so parallel workflows never race on the shared bot user. The existing
|
|
21
|
+
* consumer is .github/workflows/scheduled-ux-audit.yml — mirror that
|
|
22
|
+
* stanza in any new caller.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const TC_VERSION = "1.0.0";
|
|
26
|
+
|
|
27
|
+
// Error-body truncation bound for Supabase REST error surfaces. 200 chars
|
|
28
|
+
// captures the PostgREST `{code, message}` envelope without dumping long
|
|
29
|
+
// `details` enumerations into CI logs. Referenced by symbol at every
|
|
30
|
+
// `res.text()` callsite below.
|
|
31
|
+
const ERROR_BODY_MAX = 200;
|
|
32
|
+
|
|
33
|
+
// Defense-in-depth allowlist. Matches the test-side guard in
|
|
34
|
+
// `bot-fixture.test.ts` and rule `cq-destructive-prod-tests-allowlist`.
|
|
35
|
+
// seed()/reset() DELETE+PATCH live prod rows; a misconfigured
|
|
36
|
+
// UX_AUDIT_BOT_EMAIL would otherwise cascade onto a real user. Add new
|
|
37
|
+
// synthetic emails here explicitly.
|
|
38
|
+
const ALLOWED_BOT_EMAILS = new Set(["ux-audit-bot@jikigai.com"]);
|
|
39
|
+
|
|
40
|
+
const FIXTURE_CONVERSATIONS = [
|
|
41
|
+
{
|
|
42
|
+
session_id: "ux-audit-fixture-conv-1",
|
|
43
|
+
domain_leader: "cmo",
|
|
44
|
+
messages: [
|
|
45
|
+
{ role: "user" as const, content: "What's the highest-leverage thing I can do this week to grow?" },
|
|
46
|
+
{ role: "assistant" as const, content: "Given your current stage, I'd focus on outbound to the 12 closest-fit prospects from last month's signups. Want me to draft the sequence?" },
|
|
47
|
+
{ role: "user" as const, content: "Yes, draft it." },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
session_id: "ux-audit-fixture-conv-2",
|
|
52
|
+
domain_leader: "cto",
|
|
53
|
+
messages: [
|
|
54
|
+
{ role: "user" as const, content: "Is our CI pipeline a bottleneck?" },
|
|
55
|
+
{ role: "assistant" as const, content: "Looking at the last 50 runs, median is 6m 40s. The Eleventy build step is the longest single job. Want me to profile it?" },
|
|
56
|
+
{ role: "user" as const, content: "Please do, and share the top 3 wins." },
|
|
57
|
+
{ role: "assistant" as const, content: "Top wins: (1) cache node_modules between jobs, (2) parallelize lint + typecheck, (3) skip docs build on non-docs PRs." },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
] as const;
|
|
61
|
+
|
|
62
|
+
function env(key: string): string {
|
|
63
|
+
const v = process.env[key];
|
|
64
|
+
if (!v) throw new Error(`Missing env: ${key}`);
|
|
65
|
+
return v;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function sbFetch(
|
|
69
|
+
path: string,
|
|
70
|
+
init: RequestInit = {},
|
|
71
|
+
): Promise<Response> {
|
|
72
|
+
const SUPABASE_URL = env("SUPABASE_URL");
|
|
73
|
+
const SERVICE_KEY = env("SUPABASE_SERVICE_ROLE_KEY");
|
|
74
|
+
return fetch(`${SUPABASE_URL}${path}`, {
|
|
75
|
+
...init,
|
|
76
|
+
headers: {
|
|
77
|
+
apikey: SERVICE_KEY,
|
|
78
|
+
Authorization: `Bearer ${SERVICE_KEY}`,
|
|
79
|
+
"Content-Type": "application/json",
|
|
80
|
+
...init.headers,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function sbDelete(path: string): Promise<void> {
|
|
86
|
+
const res = await sbFetch(path, { method: "DELETE" });
|
|
87
|
+
if (!res.ok) {
|
|
88
|
+
const body = (await res.text()).slice(0, ERROR_BODY_MAX);
|
|
89
|
+
throw new Error(`DELETE ${path} failed: ${res.status} ${body}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function getBotUserId(): Promise<string> {
|
|
94
|
+
const email = env("UX_AUDIT_BOT_EMAIL");
|
|
95
|
+
if (!ALLOWED_BOT_EMAILS.has(email)) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
`UX_AUDIT_BOT_EMAIL=${email} is not in the synthetic allowlist. ` +
|
|
98
|
+
`seed/reset would mutate a real user's data. Refusing to proceed. ` +
|
|
99
|
+
`See ALLOWED_BOT_EMAILS + rule cq-destructive-prod-tests-allowlist.`,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
const res = await sbFetch(`/auth/v1/admin/users?per_page=1000`);
|
|
103
|
+
if (!res.ok) {
|
|
104
|
+
const body = (await res.text()).slice(0, ERROR_BODY_MAX);
|
|
105
|
+
throw new Error(`admin users GET failed: ${res.status} ${body}`);
|
|
106
|
+
}
|
|
107
|
+
const data = (await res.json()) as {
|
|
108
|
+
users: Array<{ id: string; email: string }>;
|
|
109
|
+
};
|
|
110
|
+
const bot = data.users.find((u) => u.email === email);
|
|
111
|
+
if (!bot) throw new Error(`bot user ${email} not found — run 1.1 first`);
|
|
112
|
+
return bot.id;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function updateUserRow(
|
|
116
|
+
userId: string,
|
|
117
|
+
patch: Record<string, unknown>,
|
|
118
|
+
): Promise<void> {
|
|
119
|
+
const res = await sbFetch(`/rest/v1/users?id=eq.${userId}`, {
|
|
120
|
+
method: "PATCH",
|
|
121
|
+
body: JSON.stringify(patch),
|
|
122
|
+
});
|
|
123
|
+
if (!res.ok) {
|
|
124
|
+
const body = (await res.text()).slice(0, ERROR_BODY_MAX);
|
|
125
|
+
throw new Error(`PATCH users failed: ${res.status} ${body}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function upsertConversation(
|
|
130
|
+
userId: string,
|
|
131
|
+
sessionId: string,
|
|
132
|
+
domainLeader: string,
|
|
133
|
+
): Promise<string> {
|
|
134
|
+
// Body intentionally omits `created_at`: PostgREST's
|
|
135
|
+
// resolution=merge-duplicates compiles to `ON CONFLICT ... DO UPDATE
|
|
136
|
+
// SET col = EXCLUDED.col` for every column in the body. Leaving
|
|
137
|
+
// `created_at` out preserves the original insert timestamp on re-seed.
|
|
138
|
+
// The non-partial unique index `uniq_conversations_user_id_session_id_total`
|
|
139
|
+
// (migration 035) is the arbiter — PostgREST cannot infer a partial unique
|
|
140
|
+
// index because it does not emit the index's WHERE predicate. With NULLS
|
|
141
|
+
// DISTINCT (Postgres default) multiple (user_id, NULL) rows coexist, so an
|
|
142
|
+
// empty sessionId would defeat merge-duplicates and silently insert a new
|
|
143
|
+
// row on every re-seed.
|
|
144
|
+
if (!sessionId) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
`upsertConversation requires a non-empty sessionId (NULLs would bypass merge-duplicates and insert duplicate rows)`,
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
const res = await sbFetch(
|
|
150
|
+
`/rest/v1/conversations?on_conflict=user_id,session_id`,
|
|
151
|
+
{
|
|
152
|
+
method: "POST",
|
|
153
|
+
headers: {
|
|
154
|
+
Prefer: "return=representation,resolution=merge-duplicates",
|
|
155
|
+
},
|
|
156
|
+
body: JSON.stringify({
|
|
157
|
+
user_id: userId,
|
|
158
|
+
session_id: sessionId,
|
|
159
|
+
domain_leader: domainLeader,
|
|
160
|
+
status: "completed",
|
|
161
|
+
}),
|
|
162
|
+
},
|
|
163
|
+
);
|
|
164
|
+
if (!res.ok) {
|
|
165
|
+
const body = (await res.text()).slice(0, ERROR_BODY_MAX);
|
|
166
|
+
throw new Error(`POST conversations (upsert) failed: ${res.status} ${body}`);
|
|
167
|
+
}
|
|
168
|
+
const rows = (await res.json()) as Array<{ id: string }>;
|
|
169
|
+
if (!rows[0]) {
|
|
170
|
+
throw new Error(`POST conversations returned empty array — representation missing`);
|
|
171
|
+
}
|
|
172
|
+
return rows[0].id;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function insertMessages(
|
|
176
|
+
conversationId: string,
|
|
177
|
+
messages: ReadonlyArray<{ role: "user" | "assistant"; content: string }>,
|
|
178
|
+
): Promise<void> {
|
|
179
|
+
const res = await sbFetch(`/rest/v1/messages`, {
|
|
180
|
+
method: "POST",
|
|
181
|
+
body: JSON.stringify(
|
|
182
|
+
messages.map((m) => ({
|
|
183
|
+
conversation_id: conversationId,
|
|
184
|
+
role: m.role,
|
|
185
|
+
content: m.content,
|
|
186
|
+
})),
|
|
187
|
+
),
|
|
188
|
+
});
|
|
189
|
+
if (!res.ok) {
|
|
190
|
+
const body = (await res.text()).slice(0, ERROR_BODY_MAX);
|
|
191
|
+
throw new Error(`POST messages failed: ${res.status} ${body}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export async function seed(): Promise<void> {
|
|
196
|
+
const botId = await getBotUserId();
|
|
197
|
+
console.log(`[seed] bot user id: ${botId}`);
|
|
198
|
+
|
|
199
|
+
await updateUserRow(botId, {
|
|
200
|
+
tc_accepted_version: TC_VERSION,
|
|
201
|
+
tc_accepted_at: new Date().toISOString(),
|
|
202
|
+
onboarding_completed_at: new Date().toISOString(),
|
|
203
|
+
subscription_status: "active",
|
|
204
|
+
stripe_customer_id: "cus_ux_audit_fixture",
|
|
205
|
+
stripe_subscription_id: "sub_ux_audit_fixture",
|
|
206
|
+
current_period_end: new Date(Date.now() + 365 * 24 * 3600 * 1000).toISOString(),
|
|
207
|
+
cancel_at_period_end: false,
|
|
208
|
+
});
|
|
209
|
+
console.log("[seed] users row patched (tc + subscription + onboarding)");
|
|
210
|
+
|
|
211
|
+
for (const c of FIXTURE_CONVERSATIONS) {
|
|
212
|
+
const cid = await upsertConversation(botId, c.session_id, c.domain_leader);
|
|
213
|
+
// DELETE-then-INSERT keeps message count stable across re-seeds. Without
|
|
214
|
+
// this, upsert's merge-duplicates would re-insert and double the count
|
|
215
|
+
// (the messages table has no natural unique key we want to index).
|
|
216
|
+
// NOT atomic — two separate PostgREST calls. If the process dies between
|
|
217
|
+
// the DELETE and the INSERT, the conversation is left with zero messages.
|
|
218
|
+
// That is self-healing: the next `seed` run restores the full set.
|
|
219
|
+
// Acceptable for a fixture; do NOT wrap the pair in a misguided retry.
|
|
220
|
+
await sbDelete(`/rest/v1/messages?conversation_id=eq.${cid}`);
|
|
221
|
+
await insertMessages(cid, c.messages);
|
|
222
|
+
console.log(`[seed] conversation ${c.session_id} upserted (${cid}) with ${c.messages.length} messages`);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
console.log("[seed] done");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export async function reset(): Promise<void> {
|
|
229
|
+
const botId = await getBotUserId();
|
|
230
|
+
console.log(`[reset] bot user id: ${botId}`);
|
|
231
|
+
|
|
232
|
+
const convRes = await sbFetch(
|
|
233
|
+
`/rest/v1/conversations?user_id=eq.${botId}&select=id`,
|
|
234
|
+
);
|
|
235
|
+
if (!convRes.ok) throw new Error(`conversations GET ${convRes.status}`);
|
|
236
|
+
const conversations = (await convRes.json()) as Array<{ id: string }>;
|
|
237
|
+
|
|
238
|
+
for (const c of conversations) {
|
|
239
|
+
await sbDelete(`/rest/v1/messages?conversation_id=eq.${c.id}`);
|
|
240
|
+
}
|
|
241
|
+
if (conversations.length > 0) {
|
|
242
|
+
await sbDelete(`/rest/v1/conversations?user_id=eq.${botId}`);
|
|
243
|
+
}
|
|
244
|
+
console.log(`[reset] deleted ${conversations.length} conversations + messages`);
|
|
245
|
+
|
|
246
|
+
await updateUserRow(botId, {
|
|
247
|
+
tc_accepted_version: null,
|
|
248
|
+
tc_accepted_at: null,
|
|
249
|
+
onboarding_completed_at: null,
|
|
250
|
+
subscription_status: "none",
|
|
251
|
+
stripe_customer_id: null,
|
|
252
|
+
stripe_subscription_id: null,
|
|
253
|
+
current_period_end: null,
|
|
254
|
+
cancel_at_period_end: false,
|
|
255
|
+
});
|
|
256
|
+
console.log("[reset] users row cleared");
|
|
257
|
+
console.log("[reset] done");
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (import.meta.main) {
|
|
261
|
+
const cmd = process.argv[2];
|
|
262
|
+
if (cmd === "seed") {
|
|
263
|
+
await seed();
|
|
264
|
+
} else if (cmd === "reset") {
|
|
265
|
+
await reset();
|
|
266
|
+
} else {
|
|
267
|
+
console.error("Usage: bun bot-fixture.ts <seed|reset>");
|
|
268
|
+
process.exit(2);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* bot-signin.ts — signs in as the ux-audit bot and writes a Playwright-compatible
|
|
4
|
+
* storageState JSON containing the Supabase SSR auth cookie.
|
|
5
|
+
*
|
|
6
|
+
* Usage: bun "${CLAUDE_PLUGIN_ROOT}/skills/ux-audit/scripts/bot-signin.ts"
|
|
7
|
+
*
|
|
8
|
+
* Env:
|
|
9
|
+
* SUPABASE_URL prd
|
|
10
|
+
* NEXT_PUBLIC_SUPABASE_ANON_KEY prd
|
|
11
|
+
* NEXT_PUBLIC_APP_URL prd (domain for the cookie)
|
|
12
|
+
* UX_AUDIT_BOT_EMAIL prd_scheduled
|
|
13
|
+
* UX_AUDIT_BOT_PASSWORD prd_scheduled
|
|
14
|
+
* UX_AUDIT_STORAGE_STATE (optional) output path override
|
|
15
|
+
*
|
|
16
|
+
* Default output path: $GITHUB_WORKSPACE/tmp/ux-audit/storage-state.json
|
|
17
|
+
* or ./tmp/ux-audit/storage-state.json when run locally.
|
|
18
|
+
* Pattern source: apps/web-platform/e2e/global-setup.ts
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
22
|
+
import { dirname, resolve } from "node:path";
|
|
23
|
+
|
|
24
|
+
function env(key: string): string {
|
|
25
|
+
const v = process.env[key];
|
|
26
|
+
if (!v) throw new Error(`Missing env: ${key}`);
|
|
27
|
+
return v;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function projectRef(supabaseUrl: string): string {
|
|
31
|
+
const m = supabaseUrl.match(/^https:\/\/([^.]+)\.supabase\.co/);
|
|
32
|
+
if (!m) throw new Error(`Cannot derive project ref from SUPABASE_URL=${supabaseUrl}`);
|
|
33
|
+
return m[1];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function cookieDomain(siteUrl: string): string {
|
|
37
|
+
const u = new URL(siteUrl);
|
|
38
|
+
return u.hostname;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function defaultStoragePath(): string {
|
|
42
|
+
const workspace = process.env.GITHUB_WORKSPACE ?? process.cwd();
|
|
43
|
+
return resolve(workspace, "tmp/ux-audit/storage-state.json");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface Session {
|
|
47
|
+
access_token: string;
|
|
48
|
+
refresh_token: string;
|
|
49
|
+
expires_in: number;
|
|
50
|
+
expires_at: number;
|
|
51
|
+
token_type: string;
|
|
52
|
+
user: unknown;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function isSession(x: unknown): x is Session {
|
|
56
|
+
if (typeof x !== "object" || x === null) return false;
|
|
57
|
+
const s = x as Record<string, unknown>;
|
|
58
|
+
return (
|
|
59
|
+
typeof s.access_token === "string" &&
|
|
60
|
+
typeof s.refresh_token === "string" &&
|
|
61
|
+
typeof s.expires_at === "number" &&
|
|
62
|
+
typeof s.token_type === "string"
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function signIn(): Promise<Session> {
|
|
67
|
+
const supabaseUrl = env("SUPABASE_URL");
|
|
68
|
+
const anonKey = env("NEXT_PUBLIC_SUPABASE_ANON_KEY");
|
|
69
|
+
const email = env("UX_AUDIT_BOT_EMAIL");
|
|
70
|
+
const password = env("UX_AUDIT_BOT_PASSWORD");
|
|
71
|
+
|
|
72
|
+
const res = await fetch(`${supabaseUrl}/auth/v1/token?grant_type=password`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: {
|
|
75
|
+
apikey: anonKey,
|
|
76
|
+
"Content-Type": "application/json",
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({ email, password }),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const body = await res.json();
|
|
82
|
+
if (!res.ok) {
|
|
83
|
+
const msg = (body as { error_description?: string; msg?: string }).error_description
|
|
84
|
+
?? (body as { msg?: string }).msg
|
|
85
|
+
?? `http ${res.status}`;
|
|
86
|
+
throw new Error(`signin failed: invalid credentials (${msg})`);
|
|
87
|
+
}
|
|
88
|
+
if (!isSession(body)) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`signin returned malformed session (missing access_token, refresh_token, expires_at, or token_type)`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
return body;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function writeStorageState(
|
|
97
|
+
session: Session,
|
|
98
|
+
outPath: string,
|
|
99
|
+
supabaseUrl: string,
|
|
100
|
+
siteUrl: string,
|
|
101
|
+
): void {
|
|
102
|
+
const ref = projectRef(supabaseUrl);
|
|
103
|
+
const domain = cookieDomain(siteUrl);
|
|
104
|
+
const cookieName = `sb-${ref}-auth-token`;
|
|
105
|
+
|
|
106
|
+
const storageState = {
|
|
107
|
+
cookies: [
|
|
108
|
+
{
|
|
109
|
+
name: cookieName,
|
|
110
|
+
value: JSON.stringify(session),
|
|
111
|
+
domain,
|
|
112
|
+
path: "/",
|
|
113
|
+
expires: session.expires_at,
|
|
114
|
+
httpOnly: false,
|
|
115
|
+
secure: true,
|
|
116
|
+
sameSite: "Lax" as const,
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
origins: [],
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
mkdirSync(dirname(outPath), { recursive: true, mode: 0o700 });
|
|
123
|
+
writeFileSync(outPath, JSON.stringify(storageState, null, 2), { mode: 0o600 });
|
|
124
|
+
console.log(`[signin] wrote storageState to ${outPath} (cookie ${cookieName} for ${domain})`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function main() {
|
|
128
|
+
const session = await signIn();
|
|
129
|
+
const outPath = process.env.UX_AUDIT_STORAGE_STATE ?? defaultStoragePath();
|
|
130
|
+
writeStorageState(session, outPath, env("SUPABASE_URL"), env("NEXT_PUBLIC_APP_URL"));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (import.meta.main) {
|
|
134
|
+
await main();
|
|
135
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dedup-hash.ts — canonical finding-hash computation.
|
|
3
|
+
*
|
|
4
|
+
* Hash format: sha256(utf8("{route}|{selector}|{category}")).
|
|
5
|
+
* Embedded in issue bodies as `<!-- ux-audit-hash: <64-hex> -->` so the skill
|
|
6
|
+
* can dedupe via a single `gh issue list --search "ux-audit-hash: <hash>"` call
|
|
7
|
+
* (TR3 in the plan).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Canonical category list. Drift-guarded by `category-drift.test.ts`
|
|
14
|
+
* (see `plugins/soleur/test/ux-audit/category-drift.test.ts`). Any
|
|
15
|
+
* edit here requires updating SKILL.md §"Constants", ux-design-lead.md
|
|
16
|
+
* §"5-category rubric" + `category` field rule, and the
|
|
17
|
+
* `properties.category.enum` in
|
|
18
|
+
* `plugins/soleur/skills/ux-audit/references/finding.schema.json`.
|
|
19
|
+
*/
|
|
20
|
+
export const FINDING_CATEGORIES = [
|
|
21
|
+
"real-estate",
|
|
22
|
+
"ia",
|
|
23
|
+
"consistency",
|
|
24
|
+
"responsive",
|
|
25
|
+
"comprehension",
|
|
26
|
+
"anti-slop",
|
|
27
|
+
] as const;
|
|
28
|
+
|
|
29
|
+
export type FindingCategory = (typeof FINDING_CATEGORIES)[number];
|
|
30
|
+
|
|
31
|
+
export interface Finding {
|
|
32
|
+
route: string;
|
|
33
|
+
selector: string;
|
|
34
|
+
category: FindingCategory;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function computeFindingHash(f: Finding): string {
|
|
38
|
+
if (!FINDING_CATEGORIES.includes(f.category as FindingCategory)) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`invalid category "${f.category}" — expected one of: ${FINDING_CATEGORIES.join(", ")}`,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
const selector = f.selector === "" ? "*" : f.selector;
|
|
44
|
+
const canonical = `${f.route}|${selector}|${f.category}`;
|
|
45
|
+
return createHash("sha256").update(canonical, "utf8").digest("hex");
|
|
46
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verification-scaffold
|
|
3
|
+
description: "This skill should be used when installing the generic guardrail set (secret-scan, commit-on-main, block-stash, orphan-test) into a user repository's hooks and CI, advisory-first."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- grok-harness-invoke:start -->
|
|
7
|
+
**Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
|
|
8
|
+
<!-- grok-harness-invoke:end -->
|
|
9
|
+
|
|
10
|
+
# verification-scaffold
|
|
11
|
+
|
|
12
|
+
Installs a fixed, tested set of **generic** repo guardrails into a user repository —
|
|
13
|
+
the repo-generic fraction of Soleur's own hook/lint corpus, classified in
|
|
14
|
+
[guardrail-audit.md](references/guardrail-audit.md) (which corpus member is `generic`,
|
|
15
|
+
`generic-after-extraction`, or `soleur-coupled`, and why). This is the
|
|
16
|
+
`constraint-scaffold` sibling for the guardrail *corpus* rather than a single gate
|
|
17
|
+
(#10404, epic #10397).
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
bash "${CLAUDE_PLUGIN_ROOT}/skills/verification-scaffold/scripts/verification-scaffold.sh" --headless
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Installs the v1 set into the current repo. Flags: `--target <path>` (default
|
|
26
|
+
cwd), `--guards a,b` / `--all` (default: all v1 rows of [guards.tsv](references/guards.tsv)),
|
|
27
|
+
`--mode advisory|enforce` (default `advisory`), `--dry-run`, `--list`,
|
|
28
|
+
`--uninstall <guard>`.
|
|
29
|
+
|
|
30
|
+
## What it emits
|
|
31
|
+
|
|
32
|
+
| Guard | Surfaces | Emitted |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `secret-scan` | hook + CI | `.claude/hooks/secret-scan.sh` (gitleaks staged scan), `.gitleaks.toml` (only when absent — a default-ruleset pointer, never overwrites a user's), the `secret-scan` job in `.github/workflows/verification-gates.yml` |
|
|
35
|
+
| `commit-on-main` | hook | `.claude/hooks/commit-on-main.sh` → [scripts/verification/precommit-guard.sh](references/guards/precommit-guard.sh.template) + [lib/wrapper-boundary.sh](references/guards/wrapper-boundary.sh.template) (the near-verbatim canonical emit, default-branch set stamped) |
|
|
36
|
+
| `block-stash` | hook | `.claude/hooks/block-stash.sh` (chain-boundary `git stash`; `list`/`show` are documented read-only exceptions) |
|
|
37
|
+
| `orphan-test` | CI | [scripts/verification/orphan-test-check.sh](references/guards/orphan-test-check.sh.template) + the `orphan-test` job + `.github/verification-known-orphans.txt` (reason-required exclusion manifest, seeded with grandfathered rows) |
|
|
38
|
+
|
|
39
|
+
Hooks are registered as `PreToolUse` `Bash` entries in `.claude/settings.json`
|
|
40
|
+
(node-first, `jq` fallback — a repo with neither is refused with the dependency
|
|
41
|
+
named; malformed existing JSON is refused before any write). The workflow lands
|
|
42
|
+
at repo ROOT — a nested `.github/workflows/` is dormant.
|
|
43
|
+
|
|
44
|
+
## Advisory-first contract
|
|
45
|
+
|
|
46
|
+
Every guard installs **advisory**: identical predicates, different decision verb
|
|
47
|
+
— hooks warn+allow (`ask` only on a REAL secret-scan finding), CI jobs carry
|
|
48
|
+
`continue-on-error: true`. Promotion is the one-line flip the emitted
|
|
49
|
+
`VERIFICATION.md` documents (`MODE="enforce"`, `continue-on-error: false`), and
|
|
50
|
+
it requires ≥1 observed clean advisory run first. Non-destructive: any existing
|
|
51
|
+
artifact is a refusal — there is no `--force`.
|
|
52
|
+
|
|
53
|
+
## Agent-owns-gates
|
|
54
|
+
|
|
55
|
+
Same model as `constraint-scaffold`: the agent owns the emitted files; the
|
|
56
|
+
target user never hand-edits a gate. `--uninstall <guard>` removes only that
|
|
57
|
+
guard's artifacts + settings entry; it is idempotent and prints "not installed"
|
|
58
|
+
for a never-installed guard, and it strips the marker doc block from
|
|
59
|
+
VERIFICATION.md/README.md once no guard artifact remains.
|
|
60
|
+
|
|
61
|
+
## Bite-proof
|
|
62
|
+
|
|
63
|
+
Every install proves each selected guard **pass → fail → pass** on a detached
|
|
64
|
+
worktree under TMPDIR (a TMPDIR inside the repo is refused, exit 69) before the
|
|
65
|
+
doc block is written; a mid-install failure removes exactly the files that run
|
|
66
|
+
emitted. The `secret-scan` arm requires `gitleaks` on PATH and is reported as a
|
|
67
|
+
loud SKIP when absent — an advisory hook that cannot scan is a tool error, not
|
|
68
|
+
a silent guard.
|
|
69
|
+
|
|
70
|
+
## Requirements
|
|
71
|
+
|
|
72
|
+
bash + POSIX tools on the target host (stock macOS included). Emitted artifacts
|
|
73
|
+
carry no Soleur couplings and zero network egress; `manifest.test.sh` pins both.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# .gitleaks.toml — emitted by soleur:verification-scaffold ONLY because the repo
|
|
2
|
+
# had none (a pre-existing ruleset is never overwritten). It is deliberately a
|
|
3
|
+
# default-pack pointer: `useDefault = true` inherits the gitleaks default rules
|
|
4
|
+
# (cloud keys, vendor tokens, PEM bodies, webhooks). Narrow or widen by editing
|
|
5
|
+
# this file — the emitted hook and the emitted CI job both read it.
|
|
6
|
+
#
|
|
7
|
+
# Waivers: annotate a known-safe line with `# gitleaks:allow <reason>` (or the
|
|
8
|
+
# `//` form) — never commit-then-rotate.
|
|
9
|
+
|
|
10
|
+
title = "verification-scaffold secret-scan floor"
|
|
11
|
+
|
|
12
|
+
[extend]
|
|
13
|
+
useDefault = true
|