@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,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-tweet
|
|
3
|
+
description: "This skill should be used when converting a shipping feature PR into a draft short-form X post (single tweet or up-to-3-tweet thread) for operator approval."
|
|
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
|
+
# feature-tweet
|
|
11
|
+
|
|
12
|
+
Convert a feature **just shipped to production** (a merged PR, verified live)
|
|
13
|
+
into a **draft** short-form X post — written to the existing
|
|
14
|
+
`knowledge-base/marketing/distribution-content/*.md` format and drained by the
|
|
15
|
+
existing `content-publisher.sh` cron. No new publishing path; nothing
|
|
16
|
+
reaches X until the operator flips `status: draft` → `scheduled`.
|
|
17
|
+
|
|
18
|
+
Invoked by `soleur:ship` (Phase 6 "Feature-Tweet Draft (pre-merge bundle)")
|
|
19
|
+
which commits the draft to the feature branch so it rides the PR into `main` —
|
|
20
|
+
where `content-publisher.sh` reads from. `soleur:postmerge` Phase 3.8 then
|
|
21
|
+
verifies + displays the on-`main` draft (and warns if deploy health is
|
|
22
|
+
unverified). The draft stays inert (`status: draft`) until the operator
|
|
23
|
+
schedules it, so "only tweet what actually deployed" is preserved by the
|
|
24
|
+
operator's post-deploy publish gate, not by withholding the draft. Also runnable
|
|
25
|
+
standalone as a catch-up path:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
soleur:feature-tweet #<pr>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The brand-critical floor is the deterministic, fail-closed eligibility filter
|
|
32
|
+
`tweet-eligibility.sh` (under the repo's scripts/lib directory). A forbidden PR (security/infra/non-product/
|
|
33
|
+
unlabeled) is excluded **before** any draft is generated, so it never reaches
|
|
34
|
+
the operator's approval queue.
|
|
35
|
+
|
|
36
|
+
## Arguments
|
|
37
|
+
|
|
38
|
+
- `#<pr>` (required) — the merged PR number. Accept `123` or `#123`.
|
|
39
|
+
- `--headless` — non-interactive; never posts (drafts only, same as default).
|
|
40
|
+
|
|
41
|
+
## Step 1 — Eligibility (fail-closed, run FIRST)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
bash scripts/lib/tweet-eligibility.sh <pr>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- Exit 0 + `eligible` → continue.
|
|
48
|
+
- Exit non-zero + `excluded: <reason>` → **stop. Write no file.** Print the
|
|
49
|
+
reason and exit. This is a silent no-op from the operator's perspective (no
|
|
50
|
+
draft, no error escalation) — exclusion is the designed outcome, not a fault.
|
|
51
|
+
|
|
52
|
+
Never second-guess or override the filter. Any uncertainty (missing labels,
|
|
53
|
+
`gh` error, deny label, deny path) is `excluded` by design.
|
|
54
|
+
|
|
55
|
+
## Step 2 — Idempotency
|
|
56
|
+
|
|
57
|
+
Search existing drafts for this PR before generating:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
grep -rl 'pr_reference: "#<pr>"' knowledge-base/marketing/distribution-content/ 2>/dev/null
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
If a file matches, **no-op** with a message naming the existing path — do not
|
|
64
|
+
overwrite an operator-edited draft.
|
|
65
|
+
|
|
66
|
+
## Step 3 — Fetch PR context
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
gh pr view <pr> --json title,body,url
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Read the author identity for any copy that references a person from
|
|
73
|
+
`plugins/soleur/docs/_data/site.json` → `author.name` ("Jean Deruelle"). **Never
|
|
74
|
+
infer a name** from the PR; contributor names are PII and are excluded.
|
|
75
|
+
|
|
76
|
+
## Step 4 — Generate the X thread AND the Bluesky post (sanitized, voice-aligned)
|
|
77
|
+
|
|
78
|
+
Generate copy for BOTH channels (the publisher cross-posts to X and Bluesky).
|
|
79
|
+
Follow `knowledge-base/marketing/brand-guide.md` → `### X/Twitter` and its
|
|
80
|
+
`#### Ship Tweets (feature-launch)` sub-section. Hard rules:
|
|
81
|
+
|
|
82
|
+
- **X shape:** single tweet (hook only) OR a numbered thread of **at most 3**
|
|
83
|
+
tweets. Tweet 1 = the hook (no prefix, no "thread" announcement). Tweets 2–3
|
|
84
|
+
are prefixed `2/`, `3/` on a fresh line (the canonical numbered format the
|
|
85
|
+
publisher's `extract_tweets` parses).
|
|
86
|
+
- **X limit: 280 characters per tweet**, enforced during generation, not trimmed
|
|
87
|
+
after.
|
|
88
|
+
- **Bluesky shape + limit:** a **single post**, **300 characters total** for the
|
|
89
|
+
whole `## Bluesky` section. The publisher (`post_bluesky`) posts the entire
|
|
90
|
+
section as ONE Bluesky post — it does NOT split a numbered thread (no
|
|
91
|
+
`extract_tweets` equivalent), and truncates the section at 300 chars. So write
|
|
92
|
+
one self-contained post; do NOT use `2/`/`3/` prefixes here. Adapt the copy to
|
|
93
|
+
Bluesky — do NOT clone the X hook verbatim: Bluesky carries no hashtags
|
|
94
|
+
(brand-guide `### Bluesky`). Lead the same one buyer benefit in plainer register.
|
|
95
|
+
- **Sanitization (mandatory — benefit only), applied to BOTH channels:**
|
|
96
|
+
- No implementation/diff detail. State the user-facing benefit, not how it was
|
|
97
|
+
built.
|
|
98
|
+
- **No contributor names or author attribution** (PII; no marketing consent).
|
|
99
|
+
- **No customer names** — run an explicit customer-name/NDA scan over the PR
|
|
100
|
+
title and body; if a proper noun could be a customer, omit it.
|
|
101
|
+
- **No naked numbers** — any statistic must be verifiable from the PR or
|
|
102
|
+
omitted.
|
|
103
|
+
- Present-tense "just shipped X" framing; lead the build-in-public peer voice,
|
|
104
|
+
land one concrete buyer benefit. General register (plain language).
|
|
105
|
+
- Links (if any) go in the **final** post of each channel only. A ship tweet has
|
|
106
|
+
no blog, so `blog_url` is omitted entirely.
|
|
107
|
+
|
|
108
|
+
## Step 5 — Write the draft file
|
|
109
|
+
|
|
110
|
+
Path: `knowledge-base/marketing/distribution-content/<YYYY-MM-DD>-<slug>.md`
|
|
111
|
+
where `<slug>` is the PR title with its `feat(...)` prefix stripped and
|
|
112
|
+
slugified.
|
|
113
|
+
|
|
114
|
+
Frontmatter + body:
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
---
|
|
118
|
+
title: "<concise benefit-framed title>"
|
|
119
|
+
type: feature-launch
|
|
120
|
+
publish_date: ""
|
|
121
|
+
channels: x, bluesky
|
|
122
|
+
status: draft
|
|
123
|
+
pr_reference: "#<pr>"
|
|
124
|
+
issue_reference: "#<issue>" # only if the PR closes one; else omit
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
<!-- To publish: set BOTH publish_date AND status: scheduled -->
|
|
128
|
+
|
|
129
|
+
## X/Twitter Thread
|
|
130
|
+
|
|
131
|
+
<hook tweet>
|
|
132
|
+
|
|
133
|
+
2/ <body tweet>
|
|
134
|
+
|
|
135
|
+
3/ <final tweet, link only if applicable>
|
|
136
|
+
|
|
137
|
+
## Bluesky
|
|
138
|
+
|
|
139
|
+
<single adapted post — ≤300 chars total, no hashtags, no 2//3/ prefixes>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`publish_date: ""` + `status: draft` is the intentionally-parked state
|
|
143
|
+
(`content-publisher.sh` skips it). `channels: x, bluesky` cross-posts to both —
|
|
144
|
+
the publisher requires one body section per channel, so the `## X/Twitter Thread`
|
|
145
|
+
AND `## Bluesky` sections are BOTH mandatory (the structural gate in Step 6
|
|
146
|
+
rejects a draft missing either).
|
|
147
|
+
|
|
148
|
+
## Step 6 — Structural assertion (skill-owned gate — NOT lint)
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
bash scripts/lib/validate-tweet-draft.sh <file>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Asserts a non-empty `title`, `status: draft`, a `channels` value including BOTH
|
|
155
|
+
`x` and `bluesky`, and non-empty `## X/Twitter Thread` AND `## Bluesky` sections.
|
|
156
|
+
On non-zero exit, **delete the file** (`rm -f <file>`) and abort — leave no
|
|
157
|
+
partial draft. This is the field/heading gate; the Liquid linter validates
|
|
158
|
+
neither.
|
|
159
|
+
|
|
160
|
+
## Step 7 — Lint (Liquid markers)
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
bash scripts/lint-distribution-content.sh <file>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
On non-zero exit, delete the file and abort.
|
|
167
|
+
|
|
168
|
+
## Output
|
|
169
|
+
|
|
170
|
+
On success, **display the full draft content inline for operator approval** —
|
|
171
|
+
the path alone is not enough, because the operator cannot judge or approve copy
|
|
172
|
+
they cannot see (and a worktree-resident draft may be discarded by cleanup
|
|
173
|
+
before they open the file). Print, in this order:
|
|
174
|
+
|
|
175
|
+
1. The draft path.
|
|
176
|
+
2. The complete rendered draft: the `title`, every `## X/Twitter Thread` tweet,
|
|
177
|
+
and the full `## Bluesky` post — verbatim, exactly as written to the file
|
|
178
|
+
(read it back with the Read tool rather than reproducing from memory, so what
|
|
179
|
+
the operator approves is what is on disk).
|
|
180
|
+
3. The explicit operator instruction:
|
|
181
|
+
|
|
182
|
+
> Draft written to `<path>`. To publish: set BOTH `publish_date` and
|
|
183
|
+
> `status: scheduled`. The existing content-publisher cron posts it on date.
|
|
184
|
+
|
|
185
|
+
This display-for-approval step is mandatory in BOTH interactive and headless
|
|
186
|
+
modes (headless still surfaces the copy in its returned summary so the
|
|
187
|
+
orchestrator/operator sees it) — the draft is operator-gated content, and the
|
|
188
|
+
approval gate is meaningless if the content is never shown. Never reduce the
|
|
189
|
+
output to "draft written to `<path>`" without the copy.
|
|
190
|
+
|
|
191
|
+
Headless mode never posts — it only writes the draft, displays it, and prints
|
|
192
|
+
the path.
|
|
193
|
+
|
|
194
|
+
## Multi-PR contract (v1)
|
|
195
|
+
|
|
196
|
+
One tweet per eligible PR. `soleur:postmerge` passes its single bound PR
|
|
197
|
+
number; batching multiple PRs from one deploy is deferred. A `soleur:merge-pr`-
|
|
198
|
+
only flow bypasses the postmerge hook by design — run standalone
|
|
199
|
+
`soleur:feature-tweet #<pr>` as the recovery path.
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-video
|
|
3
|
+
description: "This skill should be used to record video walkthroughs of features for PR descriptions. Captures browser interactions via agent-browser CLI; optional GIF/MP4 via ffmpeg and upload via rclone."
|
|
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
|
+
# Feature Video Walkthrough
|
|
11
|
+
|
|
12
|
+
<command_purpose>Record a video walkthrough demonstrating a feature, upload it, and add it to the PR description.</command_purpose>
|
|
13
|
+
|
|
14
|
+
## Introduction
|
|
15
|
+
|
|
16
|
+
<role>Developer Relations Engineer creating feature demo videos</role>
|
|
17
|
+
|
|
18
|
+
This skill creates professional video walkthroughs of features for PR documentation:
|
|
19
|
+
|
|
20
|
+
- Records browser interactions using agent-browser CLI
|
|
21
|
+
- Demonstrates the complete user flow
|
|
22
|
+
- Converts screenshots to video/GIF (when ffmpeg is available)
|
|
23
|
+
- Uploads to cloud storage (when rclone is configured)
|
|
24
|
+
- Updates the PR description with the best available output
|
|
25
|
+
|
|
26
|
+
## Prerequisites
|
|
27
|
+
|
|
28
|
+
<requirements>
|
|
29
|
+
- Local development server running (e.g., `bin/dev`, `rails server`)
|
|
30
|
+
- agent-browser CLI installed (required)
|
|
31
|
+
- Git repository with a PR to document
|
|
32
|
+
- `ffmpeg` installed (optional -- without it, screenshots are captured but no video/GIF is created). Can be installed automatically by the dependency check script.
|
|
33
|
+
- `rclone` configured (optional -- without it, video stays local instead of uploading to cloud storage). Can be installed automatically by the dependency check script.
|
|
34
|
+
</requirements>
|
|
35
|
+
|
|
36
|
+
## Phase 0: Dependency Check
|
|
37
|
+
|
|
38
|
+
Run [check_deps.sh](./scripts/check_deps.sh) before proceeding. When invoked from a pipeline (e.g., one-shot), pass `--auto` to skip interactive prompts and install missing tools automatically:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
bash "${CLAUDE_PLUGIN_ROOT}/skills/feature-video/scripts/check_deps.sh"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
For pipeline/automated use:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
bash "${CLAUDE_PLUGIN_ROOT}/skills/feature-video/scripts/check_deps.sh" --auto
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
If the script exits non-zero, agent-browser is missing and recording cannot proceed. Stop and inform the user.
|
|
51
|
+
|
|
52
|
+
If ffmpeg or rclone show `[skip]`, note which tools are unavailable. The skill continues with degraded capability:
|
|
53
|
+
|
|
54
|
+
- **No ffmpeg**: Capture screenshots only. Skip video/GIF creation in steps 4-5.
|
|
55
|
+
- **No rclone**: Create video locally. Skip upload in step 6.
|
|
56
|
+
|
|
57
|
+
Store the availability as variables for use in later steps:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
HAS_FFMPEG=$(command -v ffmpeg >/dev/null 2>&1 && echo "true" || echo "false")
|
|
61
|
+
HAS_RCLONE=$(command -v rclone >/dev/null 2>&1 && echo "true" || echo "false")
|
|
62
|
+
RCLONE_CONFIGURED="false"
|
|
63
|
+
if [ "$HAS_RCLONE" = "true" ]; then
|
|
64
|
+
REMOTES=$(rclone listremotes 2>/dev/null || true)
|
|
65
|
+
[ -n "$REMOTES" ] && RCLONE_CONFIGURED="true"
|
|
66
|
+
fi
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Main Tasks
|
|
70
|
+
|
|
71
|
+
### 1. Parse Arguments
|
|
72
|
+
|
|
73
|
+
<parse_args>
|
|
74
|
+
|
|
75
|
+
**Arguments:** $ARGUMENTS
|
|
76
|
+
|
|
77
|
+
Parse the input:
|
|
78
|
+
|
|
79
|
+
- First argument: PR number or "current" (defaults to current branch's PR)
|
|
80
|
+
- Second argument: Base URL (defaults to `http://localhost:3000`)
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Get PR number for current branch if needed
|
|
84
|
+
gh pr view --json number -q '.number'
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
</parse_args>
|
|
88
|
+
|
|
89
|
+
### 2. Gather Feature Context
|
|
90
|
+
|
|
91
|
+
<gather_context>
|
|
92
|
+
|
|
93
|
+
**Get PR details:**
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
gh pr view [number] --json title,body,files,headRefName -q '.'
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Get changed files:**
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
gh pr view [number] --json files -q '.files[].path'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Map files to testable routes** (same as playwright-test):
|
|
106
|
+
|
|
107
|
+
| File Pattern | Route(s) |
|
|
108
|
+
|-------------|----------|
|
|
109
|
+
| `app/views/users/*` | `/users`, `/users/:id`, `/users/new` |
|
|
110
|
+
| `app/controllers/settings_controller.rb` | `/settings` |
|
|
111
|
+
| `app/javascript/controllers/*_controller.js` | Pages using that Stimulus controller |
|
|
112
|
+
| `app/components/*_component.rb` | Pages rendering that component |
|
|
113
|
+
|
|
114
|
+
</gather_context>
|
|
115
|
+
|
|
116
|
+
### 3. Plan the Video Flow
|
|
117
|
+
|
|
118
|
+
<plan_flow>
|
|
119
|
+
|
|
120
|
+
Before recording, create a shot list:
|
|
121
|
+
|
|
122
|
+
1. **Opening shot**: Homepage or starting point (2-3 seconds)
|
|
123
|
+
2. **Navigation**: How user gets to the feature
|
|
124
|
+
3. **Feature demonstration**: Core functionality (main focus)
|
|
125
|
+
4. **Edge cases**: Error states, validation, etc. (if applicable)
|
|
126
|
+
5. **Success state**: Completed action/result
|
|
127
|
+
|
|
128
|
+
Ask user to confirm or adjust the flow:
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
**Proposed Video Flow**
|
|
132
|
+
|
|
133
|
+
Based on PR #[number]: [title]
|
|
134
|
+
|
|
135
|
+
1. Start at: /[starting-route]
|
|
136
|
+
2. Navigate to: /[feature-route]
|
|
137
|
+
3. Demonstrate:
|
|
138
|
+
- [Action 1]
|
|
139
|
+
- [Action 2]
|
|
140
|
+
- [Action 3]
|
|
141
|
+
4. Show result: [success state]
|
|
142
|
+
|
|
143
|
+
Estimated duration: ~[X] seconds
|
|
144
|
+
|
|
145
|
+
Does this look right?
|
|
146
|
+
1. Yes, start recording
|
|
147
|
+
2. Modify the flow (describe changes)
|
|
148
|
+
3. Add specific interactions to demonstrate
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
</plan_flow>
|
|
152
|
+
|
|
153
|
+
### 4. Setup Video Recording
|
|
154
|
+
|
|
155
|
+
<setup_recording>
|
|
156
|
+
|
|
157
|
+
**Create directories:**
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
mkdir -p tmp/screenshots tmp/videos
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Recording approach: Use browser screenshots as frames**
|
|
164
|
+
|
|
165
|
+
agent-browser captures screenshots at key moments. If ffmpeg is available, screenshots are combined into video/GIF in step 5.
|
|
166
|
+
|
|
167
|
+
**If ffmpeg is unavailable:** Screenshots are the final output. Skip video/GIF creation commands in step 5.
|
|
168
|
+
|
|
169
|
+
</setup_recording>
|
|
170
|
+
|
|
171
|
+
### 5. Record the Walkthrough
|
|
172
|
+
|
|
173
|
+
<record_walkthrough>
|
|
174
|
+
|
|
175
|
+
Execute the planned flow, capturing each step:
|
|
176
|
+
|
|
177
|
+
**Step 1: Navigate to starting point**
|
|
178
|
+
|
|
179
|
+
On Linux (Ubuntu 23.10+, containers, VMs), export the no-sandbox launch flag once
|
|
180
|
+
before the first command — otherwise Chrome cannot launch and `open` hangs (see the
|
|
181
|
+
`agent-browser` skill's "Chrome fails to launch / `open` hangs" troubleshooting):
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
export AGENT_BROWSER_ARGS="--no-sandbox"
|
|
185
|
+
agent-browser open "[base-url]/[start-route]"
|
|
186
|
+
agent-browser wait 2000
|
|
187
|
+
agent-browser screenshot tmp/screenshots/01-start.png
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Step 2: Perform navigation/interactions**
|
|
191
|
+
|
|
192
|
+
### Preflight: verify the plugin install before any snapshot
|
|
193
|
+
|
|
194
|
+
The redactor is reached through `${CLAUDE_PLUGIN_ROOT}`. An ambient value pointing at a
|
|
195
|
+
directory that is not a Soleur install would resolve to a path that does not exist — or, worse,
|
|
196
|
+
to one an attacker chose. Verify plugin IDENTITY and halt if it does not hold (ADR-179 decision 2);
|
|
197
|
+
a `test -f` on the script alone is a shape check and was measured bypassable.
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
[ -f "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" ] \
|
|
201
|
+
&& grep -q '"name"[[:space:]]*:[[:space:]]*"soleur"' "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" \
|
|
202
|
+
|| { echo "SOLEUR_SNAPSHOT_HALT reason=plugin-root-unverified root=[${CLAUDE_PLUGIN_ROOT}]" >&2
|
|
203
|
+
echo " Cannot locate the snapshot redactor, so no accessibility snapshot may be taken here." >&2
|
|
204
|
+
echo " Root EMPTY: no Soleur plugin is loaded in this session. Install it and start a NEW session." >&2
|
|
205
|
+
echo " Root set but wrong: a repo checkout is not an install. Run 'claude plugin update soleur@soleur-marketplace' (or the id 'claude plugin list' prints, if you added the repository directly), then RESTART Claude Code." >&2
|
|
206
|
+
echo " Nothing has been captured yet, so nothing has leaked." >&2
|
|
207
|
+
exit 2; }
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # Get refs
|
|
212
|
+
agent-browser click @e1 # Click navigation element
|
|
213
|
+
agent-browser wait 1000
|
|
214
|
+
agent-browser screenshot tmp/screenshots/02-navigate.png
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Step 3: Demonstrate feature**
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # Get refs for feature elements
|
|
221
|
+
agent-browser click @e2 # Click feature element
|
|
222
|
+
agent-browser wait 1000
|
|
223
|
+
agent-browser screenshot tmp/screenshots/03-feature.png
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Step 4: Capture result**
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
agent-browser wait 2000
|
|
230
|
+
agent-browser screenshot tmp/screenshots/04-result.png
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Create video/GIF from screenshots (skip if ffmpeg unavailable):**
|
|
234
|
+
|
|
235
|
+
If `HAS_FFMPEG=false`, skip the ffmpeg commands below. The screenshots in `tmp/screenshots/` are the final output. Inform the user: "ffmpeg not installed -- screenshots captured but video/GIF creation skipped."
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Only run if HAS_FFMPEG=true
|
|
239
|
+
|
|
240
|
+
# Create MP4 video (RECOMMENDED - better quality, smaller size)
|
|
241
|
+
# -framerate 0.5 = 2 seconds per frame (slower playback)
|
|
242
|
+
# -framerate 1 = 1 second per frame
|
|
243
|
+
ffmpeg -y -framerate 0.5 -pattern_type glob -i 'tmp/screenshots/*.png' \
|
|
244
|
+
-c:v libx264 -pix_fmt yuv420p -vf "scale=1280:-2" \
|
|
245
|
+
tmp/videos/feature-demo.mp4
|
|
246
|
+
|
|
247
|
+
# Create low-quality GIF for preview (small file, for GitHub embed)
|
|
248
|
+
ffmpeg -y -framerate 0.5 -pattern_type glob -i 'tmp/screenshots/*.png' \
|
|
249
|
+
-vf "scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse" \
|
|
250
|
+
-loop 0 tmp/videos/feature-demo-preview.gif
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Note:**
|
|
254
|
+
|
|
255
|
+
- The `-2` in MP4 scale ensures height is divisible by 2 (required for H.264)
|
|
256
|
+
- Preview GIF uses 640px width and 128 colors to keep file size small (~100-200KB)
|
|
257
|
+
|
|
258
|
+
</record_walkthrough>
|
|
259
|
+
|
|
260
|
+
### 6. Upload the Video
|
|
261
|
+
|
|
262
|
+
<upload_video>
|
|
263
|
+
|
|
264
|
+
**Skip this step if `RCLONE_CONFIGURED=false`.** Inform the user: "rclone not available or not configured -- video retained locally at tmp/videos/."
|
|
265
|
+
|
|
266
|
+
**Upload with rclone (only if RCLONE_CONFIGURED=true):**
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# Upload video, preview GIF, and screenshots to cloud storage
|
|
270
|
+
# Use --s3-no-check-bucket to avoid permission errors
|
|
271
|
+
rclone copy tmp/videos/ r2:kieran-claude/pr-videos/pr-[number]/ --s3-no-check-bucket --progress
|
|
272
|
+
rclone copy tmp/screenshots/ r2:kieran-claude/pr-videos/pr-[number]/screenshots/ --s3-no-check-bucket --progress
|
|
273
|
+
|
|
274
|
+
# List uploaded files
|
|
275
|
+
rclone ls r2:kieran-claude/pr-videos/pr-[number]/
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Public URLs (R2 with public access):
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
Video: https://pub-4047722ebb1b4b09853f24d3b61467f1.r2.dev/pr-videos/pr-[number]/feature-demo.mp4
|
|
282
|
+
Preview: https://pub-4047722ebb1b4b09853f24d3b61467f1.r2.dev/pr-videos/pr-[number]/feature-demo-preview.gif
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
</upload_video>
|
|
286
|
+
|
|
287
|
+
### 7. Update PR Description
|
|
288
|
+
|
|
289
|
+
<update_pr>
|
|
290
|
+
|
|
291
|
+
**Get current PR body:**
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
gh pr view [number] --json body -q '.body'
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Add a demo section to the PR description based on what was produced:**
|
|
298
|
+
|
|
299
|
+
If the PR already has a demo section, replace it. Otherwise, append.
|
|
300
|
+
|
|
301
|
+
**Case A: Video uploaded (HAS_FFMPEG=true, RCLONE_CONFIGURED=true)**
|
|
302
|
+
|
|
303
|
+
Use a clickable GIF that links to the video (GitHub cannot embed external MP4s directly):
|
|
304
|
+
|
|
305
|
+
```markdown
|
|
306
|
+
## Demo
|
|
307
|
+
|
|
308
|
+
[]([video-mp4-url])
|
|
309
|
+
|
|
310
|
+
*Click to view full video*
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Case B: Video created locally (HAS_FFMPEG=true, RCLONE_CONFIGURED=false)**
|
|
314
|
+
|
|
315
|
+
Upload the video to the PR as a GitHub comment attachment before cleanup deletes local files:
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
# Upload video as a PR comment (GitHub accepts drag-and-drop or API upload)
|
|
319
|
+
echo "Upload tmp/videos/feature-demo.mp4 to PR #[number] as a comment attachment"
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Then add to PR body:
|
|
323
|
+
|
|
324
|
+
```markdown
|
|
325
|
+
## Demo
|
|
326
|
+
|
|
327
|
+
See video in PR comments below.
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
**Case C: Screenshots only (HAS_FFMPEG=false)**
|
|
331
|
+
|
|
332
|
+
Upload screenshots to the PR as comment attachments before cleanup deletes local files, then embed in the PR body:
|
|
333
|
+
|
|
334
|
+
```markdown
|
|
335
|
+
## Demo
|
|
336
|
+
|
|
337
|
+
Screenshots captured (video conversion requires ffmpeg). See PR comments for images.
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Update the PR:**
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
gh pr edit [number] --body "[updated body with demo section]"
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
</update_pr>
|
|
347
|
+
|
|
348
|
+
### 8. Cleanup
|
|
349
|
+
|
|
350
|
+
<cleanup>
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# Always clean up tmp artifacts after PR description is updated
|
|
354
|
+
rm -rf tmp/screenshots tmp/videos
|
|
355
|
+
echo "Cleaned up tmp/screenshots/ and tmp/videos/"
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
</cleanup>
|
|
359
|
+
|
|
360
|
+
### 9. Summary
|
|
361
|
+
|
|
362
|
+
<summary>
|
|
363
|
+
|
|
364
|
+
Present completion summary:
|
|
365
|
+
|
|
366
|
+
```markdown
|
|
367
|
+
## Feature Video Complete
|
|
368
|
+
|
|
369
|
+
**PR:** #[number] - [title]
|
|
370
|
+
**Video:** [url or local path]
|
|
371
|
+
**Duration:** ~[X] seconds
|
|
372
|
+
**Format:** [GIF/MP4]
|
|
373
|
+
|
|
374
|
+
### Shots Captured
|
|
375
|
+
1. [Starting point] - [description]
|
|
376
|
+
2. [Navigation] - [description]
|
|
377
|
+
3. [Feature demo] - [description]
|
|
378
|
+
4. [Result] - [description]
|
|
379
|
+
|
|
380
|
+
### PR Updated
|
|
381
|
+
- [x] Video section added to PR description
|
|
382
|
+
- [ ] Ready for review
|
|
383
|
+
|
|
384
|
+
**Next steps:**
|
|
385
|
+
- Review the video to ensure it accurately demonstrates the feature
|
|
386
|
+
- Share with reviewers for context
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
</summary>
|
|
390
|
+
|
|
391
|
+
## Quick Usage Examples
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
# Record video for current branch's PR
|
|
395
|
+
soleur:feature-video
|
|
396
|
+
|
|
397
|
+
# Record video for specific PR
|
|
398
|
+
soleur:feature-video 847
|
|
399
|
+
|
|
400
|
+
# Record with custom base URL
|
|
401
|
+
soleur:feature-video 847 http://localhost:5000
|
|
402
|
+
|
|
403
|
+
# Record for staging environment
|
|
404
|
+
soleur:feature-video current https://staging.example.com
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## Tips
|
|
408
|
+
|
|
409
|
+
- **Keep it short**: 10-30 seconds is ideal for PR demos
|
|
410
|
+
- **Focus on the change**: Don't include unrelated UI
|
|
411
|
+
- **Show before/after**: If fixing a bug, show the broken state first (if possible)
|
|
412
|
+
- **Annotate if needed**: Add text overlays for complex features
|