@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,525 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* tier1-scan.ts — deterministic regex audit for React/Next.js anti-slop patterns.
|
|
4
|
+
*
|
|
5
|
+
* Adapted from Hallmark's `slop-test.md` Tier 1 gates (MIT, see /LICENSES/hallmark.MIT.txt).
|
|
6
|
+
* Rules live in `../references/slop-rules.md`; this script parses the Active-rules
|
|
7
|
+
* markdown table, filters `tier === 1`, and runs each rule's `pattern` regex over
|
|
8
|
+
* the target files.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* bun plugins/soleur/skills/frontend-anti-slop/scripts/tier1-scan.ts \
|
|
12
|
+
* [--paths <file-or-glob> ...] [--dry-run|--json] [--rule <id>]
|
|
13
|
+
*
|
|
14
|
+
* Default paths: `git diff --name-only --cached --diff-filter=AMR` filtered to
|
|
15
|
+
* `apps/web-platform/(app|components)/**\*.(tsx|jsx|css)` AND
|
|
16
|
+
* `apps/web-platform/server/**\*.(ts|tsx)` AND
|
|
17
|
+
* `plugins/soleur/docs/**\*.(njk|css)`.
|
|
18
|
+
*
|
|
19
|
+
* Output:
|
|
20
|
+
* - `--dry-run` (default) — human-readable findings on stdout.
|
|
21
|
+
* - `--json` — JSON array conforming to `finding.schema.json` with
|
|
22
|
+
* `category: "anti-slop"`, `selector: "<file-path>#<rule-id>"`,
|
|
23
|
+
* `route: ""`.
|
|
24
|
+
*
|
|
25
|
+
* Exit codes:
|
|
26
|
+
* 0 — scan completed with no blocking findings (anti-slop findings are advisory).
|
|
27
|
+
* 1 — bad CLI / parse error / IO error, OR ≥ 1 blocking finding (a finding whose
|
|
28
|
+
* originating rule is `category === "brand" && severity === "high"`).
|
|
29
|
+
* See `computeExitCode`. Non-brand and brand-below-high findings remain advisory.
|
|
30
|
+
*
|
|
31
|
+
* Per-file rule disable: `anti-slop:disable RULE_ID reason="..."` — matched as
|
|
32
|
+
* a literal substring, so any comment form works (JSX, HTML, CSS block, line).
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import {
|
|
36
|
+
readFileSync,
|
|
37
|
+
existsSync,
|
|
38
|
+
statSync,
|
|
39
|
+
lstatSync,
|
|
40
|
+
readdirSync,
|
|
41
|
+
} from "node:fs";
|
|
42
|
+
import { resolve, relative, join } from "node:path";
|
|
43
|
+
|
|
44
|
+
const TC_VERSION = "1.0.0";
|
|
45
|
+
|
|
46
|
+
function gitRepoRoot(): string {
|
|
47
|
+
// Use Bun.spawnSync (no shell expansion, argv-array form — no command-injection
|
|
48
|
+
// surface). Falls back to cwd if not in a git repo.
|
|
49
|
+
try {
|
|
50
|
+
const p = Bun.spawnSync(["git", "rev-parse", "--show-toplevel"], {
|
|
51
|
+
stdout: "pipe",
|
|
52
|
+
stderr: "pipe",
|
|
53
|
+
});
|
|
54
|
+
if (p.exitCode === 0) {
|
|
55
|
+
return new TextDecoder().decode(p.stdout).trim();
|
|
56
|
+
}
|
|
57
|
+
} catch {
|
|
58
|
+
/* fall through */
|
|
59
|
+
}
|
|
60
|
+
return process.cwd();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const REPO_ROOT = gitRepoRoot();
|
|
64
|
+
|
|
65
|
+
const RULES_FILE = resolve(
|
|
66
|
+
import.meta.dir,
|
|
67
|
+
"..",
|
|
68
|
+
"references",
|
|
69
|
+
"slop-rules.md",
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
interface Rule {
|
|
73
|
+
id: string;
|
|
74
|
+
tier: 1 | 2;
|
|
75
|
+
category: string;
|
|
76
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
77
|
+
pattern: RegExp;
|
|
78
|
+
message: string;
|
|
79
|
+
suggested_fix: string;
|
|
80
|
+
/** UNIFORM-HOVER-SCALE-style rules fire only at ≥ N occurrences in a single file. */
|
|
81
|
+
min_occurrences?: number;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface Finding {
|
|
85
|
+
route: string;
|
|
86
|
+
selector: string;
|
|
87
|
+
category: "anti-slop";
|
|
88
|
+
severity: Rule["severity"];
|
|
89
|
+
title: string;
|
|
90
|
+
description: string;
|
|
91
|
+
fix_hint: string;
|
|
92
|
+
screenshot_ref: string;
|
|
93
|
+
line: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface CliArgs {
|
|
97
|
+
paths: string[];
|
|
98
|
+
json: boolean;
|
|
99
|
+
ruleFilter?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function parseArgs(argv: string[]): CliArgs {
|
|
103
|
+
const out: CliArgs = { paths: [], json: false };
|
|
104
|
+
for (let i = 0; i < argv.length; i++) {
|
|
105
|
+
const a = argv[i];
|
|
106
|
+
if (a === "--paths") {
|
|
107
|
+
while (i + 1 < argv.length && !argv[i + 1].startsWith("--")) {
|
|
108
|
+
out.paths.push(argv[++i]);
|
|
109
|
+
}
|
|
110
|
+
} else if (a === "--json") {
|
|
111
|
+
out.json = true;
|
|
112
|
+
} else if (a === "--dry-run") {
|
|
113
|
+
out.json = false;
|
|
114
|
+
} else if (a === "--rule") {
|
|
115
|
+
out.ruleFilter = argv[++i];
|
|
116
|
+
} else if (a === "-h" || a === "--help") {
|
|
117
|
+
printHelp();
|
|
118
|
+
process.exit(0);
|
|
119
|
+
} else if (!a.startsWith("--")) {
|
|
120
|
+
out.paths.push(a);
|
|
121
|
+
} else {
|
|
122
|
+
console.error(`unknown arg: ${a}`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function printHelp(): void {
|
|
130
|
+
console.log(
|
|
131
|
+
"tier1-scan.ts — React/Next.js anti-slop deterministic audit (v" +
|
|
132
|
+
TC_VERSION +
|
|
133
|
+
")",
|
|
134
|
+
);
|
|
135
|
+
console.log(
|
|
136
|
+
"\nUsage: bun .../tier1-scan.ts [--paths <file>...] [--dry-run|--json] [--rule <id>]",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Parse the Active-rules table from references/slop-rules.md.
|
|
142
|
+
*
|
|
143
|
+
* Format: standard GitHub-flavoured Markdown pipe table. Header row is
|
|
144
|
+
* `| id | tier | category | hallmark_gate | severity | pattern | message | suggested_fix |`.
|
|
145
|
+
* Each data row contributes one Rule; `pattern` is unwrapped from backticks and
|
|
146
|
+
* compiled as a RegExp.
|
|
147
|
+
*/
|
|
148
|
+
function parseRules(content: string): Rule[] {
|
|
149
|
+
const lines = content.split("\n");
|
|
150
|
+
const rules: Rule[] = [];
|
|
151
|
+
|
|
152
|
+
let inActiveTable = false;
|
|
153
|
+
let headerSeen = false;
|
|
154
|
+
|
|
155
|
+
for (const line of lines) {
|
|
156
|
+
if (line.trim().startsWith("## Active rules")) {
|
|
157
|
+
inActiveTable = true;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (inActiveTable && line.trim().startsWith("## ")) {
|
|
161
|
+
// hit the next section — stop
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
if (!inActiveTable) continue;
|
|
165
|
+
|
|
166
|
+
if (line.startsWith("| id |")) {
|
|
167
|
+
headerSeen = true;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (!headerSeen) continue;
|
|
171
|
+
if (line.startsWith("|---")) continue;
|
|
172
|
+
if (!line.startsWith("|")) continue;
|
|
173
|
+
|
|
174
|
+
// Split on unescaped `|` only — markdown table cells escape literal pipes
|
|
175
|
+
// (used inside regex alternations) as `\|`. After splitting, unescape.
|
|
176
|
+
const cells = line
|
|
177
|
+
.split(/(?<!\\)\|/)
|
|
178
|
+
.slice(1, -1)
|
|
179
|
+
.map((c) => c.trim().replace(/\\\|/g, "|"));
|
|
180
|
+
if (cells.length < 8) continue;
|
|
181
|
+
|
|
182
|
+
const [
|
|
183
|
+
id,
|
|
184
|
+
tierRaw,
|
|
185
|
+
category,
|
|
186
|
+
_hallmark,
|
|
187
|
+
severityRaw,
|
|
188
|
+
patternRaw,
|
|
189
|
+
message,
|
|
190
|
+
fix,
|
|
191
|
+
] = cells;
|
|
192
|
+
const tier = Number(tierRaw) as 1 | 2;
|
|
193
|
+
if (tier !== 1) continue;
|
|
194
|
+
|
|
195
|
+
const patternBody = unwrapBackticks(patternRaw);
|
|
196
|
+
let regex: RegExp;
|
|
197
|
+
try {
|
|
198
|
+
regex = new RegExp(patternBody);
|
|
199
|
+
} catch (err) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`invalid regex for rule ${id}: ${patternBody} (${(err as Error).message})`,
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const rule: Rule = {
|
|
206
|
+
id,
|
|
207
|
+
tier,
|
|
208
|
+
category,
|
|
209
|
+
severity: severityRaw as Rule["severity"],
|
|
210
|
+
pattern: regex,
|
|
211
|
+
message: unwrapBackticks(message),
|
|
212
|
+
suggested_fix: unwrapBackticks(fix),
|
|
213
|
+
};
|
|
214
|
+
if (id === "UNIFORM-HOVER-SCALE") rule.min_occurrences = 4;
|
|
215
|
+
|
|
216
|
+
rules.push(rule);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (rules.length === 0) {
|
|
220
|
+
throw new Error(
|
|
221
|
+
`parseRules: no Tier-1 rules parsed from ${RULES_FILE} — table format drift`,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
return rules;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function unwrapBackticks(s: string): string {
|
|
228
|
+
// Markdown table cells often have leading/trailing backticks (code spans).
|
|
229
|
+
// Strip a single pair if present.
|
|
230
|
+
if (s.startsWith("`") && s.endsWith("`") && s.length >= 2) {
|
|
231
|
+
return s.slice(1, -1);
|
|
232
|
+
}
|
|
233
|
+
return s;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Canonical scanner path regex SOURCE (single source of truth).
|
|
238
|
+
*
|
|
239
|
+
* Both `defaultPaths()` (JS RegExp) and the `review/SKILL.md` "Anti-slop Scanner
|
|
240
|
+
* Hook" collector (shell ERE) must contain the same alternation body (a parity
|
|
241
|
+
* test asserts it). The trailing `$` anchors the path end. Includes the
|
|
242
|
+
* `server/.*\.(ts|tsx)$` alternation so server-side email/HTML templates are in
|
|
243
|
+
* scope alongside the Next.js app/components and the Eleventy docs site.
|
|
244
|
+
*/
|
|
245
|
+
const DEFAULT_PATH_RE_SOURCE =
|
|
246
|
+
"^(apps/web-platform/(app|components)/.*\\.(tsx|jsx|css)|apps/web-platform/server/.*\\.(ts|tsx)|plugins/soleur/docs/.*\\.(njk|css))$";
|
|
247
|
+
|
|
248
|
+
function defaultPaths(): string[] {
|
|
249
|
+
try {
|
|
250
|
+
const p = Bun.spawnSync(
|
|
251
|
+
["git", "diff", "--name-only", "--cached", "--diff-filter=AMR"],
|
|
252
|
+
{ cwd: REPO_ROOT, stdout: "pipe", stderr: "pipe" },
|
|
253
|
+
);
|
|
254
|
+
if (p.exitCode !== 0) return [];
|
|
255
|
+
const out = new TextDecoder().decode(p.stdout);
|
|
256
|
+
const all = out
|
|
257
|
+
.split("\n")
|
|
258
|
+
.map((p) => p.trim())
|
|
259
|
+
.filter(Boolean);
|
|
260
|
+
const re = new RegExp(DEFAULT_PATH_RE_SOURCE);
|
|
261
|
+
return all.filter((p) => re.test(p));
|
|
262
|
+
} catch {
|
|
263
|
+
return [];
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function isContainedInRepo(abs: string): boolean {
|
|
268
|
+
// Containment check: the resolved path must live under REPO_ROOT.
|
|
269
|
+
// `relative` returns "" when abs === REPO_ROOT, an absolute path on
|
|
270
|
+
// Windows-different-drive (defensive — Linux-only here), or a path
|
|
271
|
+
// starting with ".." when abs is outside REPO_ROOT.
|
|
272
|
+
const rel = relative(REPO_ROOT, abs);
|
|
273
|
+
if (rel === "" || rel.startsWith("..") || rel.startsWith("/")) return false;
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function expandPaths(inputs: string[]): string[] {
|
|
278
|
+
// Caller may pass repo-relative paths OR abs paths. Normalise to absolute,
|
|
279
|
+
// confine to REPO_ROOT, reject symlinks (no traversal via symlink chain),
|
|
280
|
+
// then keep only existing files matching the frontend glob. No glob
|
|
281
|
+
// expansion here — the shell already expanded any literal `*`; callers
|
|
282
|
+
// passing dir paths get all child .tsx/.jsx/.css.
|
|
283
|
+
const out: string[] = [];
|
|
284
|
+
for (const p of inputs) {
|
|
285
|
+
const abs = resolve(REPO_ROOT, p);
|
|
286
|
+
if (!isContainedInRepo(abs)) continue;
|
|
287
|
+
if (!existsSync(abs)) continue;
|
|
288
|
+
// `lstatSync` (not `statSync`) so we see the symlink itself, not its
|
|
289
|
+
// target. Symlinks under the repo pointing outside (or to sensitive
|
|
290
|
+
// files) are rejected here.
|
|
291
|
+
const ls = lstatSync(abs);
|
|
292
|
+
if (ls.isSymbolicLink()) continue;
|
|
293
|
+
const s = statSync(abs);
|
|
294
|
+
if (s.isFile()) {
|
|
295
|
+
// `.ts` included so server-side email/HTML templates
|
|
296
|
+
// (`apps/web-platform/server/*.ts`) are scannable when passed explicitly.
|
|
297
|
+
if (/\.(ts|tsx|jsx|css|njk)$/.test(abs)) out.push(abs);
|
|
298
|
+
} else if (s.isDirectory()) {
|
|
299
|
+
out.push(
|
|
300
|
+
...listFilesRecursive(abs).filter((f) =>
|
|
301
|
+
/\.(ts|tsx|jsx|css|njk)$/.test(f),
|
|
302
|
+
),
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Scope post-filter: the bare extension test above is BROADER than
|
|
307
|
+
// DEFAULT_PATH_RE_SOURCE (which scopes `.ts` to apps/web-platform/server/).
|
|
308
|
+
// Without this, `--paths apps/web-platform/app/api/x/route.ts` would be
|
|
309
|
+
// scanned and could block on raw hex outside the declared scope. Post-filter
|
|
310
|
+
// the repo-relative paths through the canonical regex so expandPaths and
|
|
311
|
+
// defaultPaths agree by construction.
|
|
312
|
+
const scopeRe = new RegExp(DEFAULT_PATH_RE_SOURCE);
|
|
313
|
+
return out.filter((abs) => scopeRe.test(relative(REPO_ROOT, abs)));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function listFilesRecursive(dir: string): string[] {
|
|
317
|
+
const acc: string[] = [];
|
|
318
|
+
const stack = [dir];
|
|
319
|
+
while (stack.length) {
|
|
320
|
+
const d = stack.pop()!;
|
|
321
|
+
let entries;
|
|
322
|
+
try {
|
|
323
|
+
entries = readdirSync(d, { withFileTypes: true });
|
|
324
|
+
} catch {
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
for (const e of entries) {
|
|
328
|
+
const full = join(d, e.name);
|
|
329
|
+
// Symlinks rejected — same containment posture as `expandPaths`,
|
|
330
|
+
// so a recursive walk cannot escape the repo via a symlinked
|
|
331
|
+
// subdirectory or grab a sensitive file via a symlinked entry.
|
|
332
|
+
if (e.isSymbolicLink()) continue;
|
|
333
|
+
if (e.isDirectory()) {
|
|
334
|
+
if (e.name === "node_modules" || e.name === ".next") continue;
|
|
335
|
+
stack.push(full);
|
|
336
|
+
} else if (e.isFile()) {
|
|
337
|
+
acc.push(full);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return acc;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function disabledRulesInFile(content: string): Set<string> {
|
|
345
|
+
const out = new Set<string>();
|
|
346
|
+
const re = /anti-slop:disable\s+([A-Z][A-Z0-9-]*)/g;
|
|
347
|
+
let m: RegExpExecArray | null;
|
|
348
|
+
while ((m = re.exec(content)) !== null) out.add(m[1]);
|
|
349
|
+
return out;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Per-line scan cap. Some rules (notably BRAND-WHITE-ON-GOLD, whose `[^"\n]*`
|
|
354
|
+
* spans can backtrack) are O(n²) on a single very long line, and minified
|
|
355
|
+
* `.css` (one line, hundreds of KB) is in scope. Testing against a bounded
|
|
356
|
+
* prefix bounds the worst-case work for ALL rules. A token that opens past
|
|
357
|
+
* 2000 chars on one physical line is not a realistic brand/slop signal we need
|
|
358
|
+
* to catch, so the truncation is safe.
|
|
359
|
+
*/
|
|
360
|
+
const MAX_SCAN_LINE = 2000;
|
|
361
|
+
|
|
362
|
+
function scanFile(absPath: string, rules: Rule[]): Finding[] {
|
|
363
|
+
let content: string;
|
|
364
|
+
try {
|
|
365
|
+
content = readFileSync(absPath, "utf8");
|
|
366
|
+
} catch (err) {
|
|
367
|
+
console.error(
|
|
368
|
+
`[tier1-scan] read failed: ${absPath} (${(err as Error).message})`,
|
|
369
|
+
);
|
|
370
|
+
return [];
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const relPath = relative(REPO_ROOT, absPath);
|
|
374
|
+
const lines = content.split("\n");
|
|
375
|
+
const disabled = disabledRulesInFile(content);
|
|
376
|
+
const findings: Finding[] = [];
|
|
377
|
+
|
|
378
|
+
for (const rule of rules) {
|
|
379
|
+
if (disabled.has(rule.id)) continue;
|
|
380
|
+
|
|
381
|
+
const hitLines: number[] = [];
|
|
382
|
+
for (let i = 0; i < lines.length; i++) {
|
|
383
|
+
// ReDoS guard: bound each line to MAX_SCAN_LINE before matching.
|
|
384
|
+
const lineToTest =
|
|
385
|
+
lines[i].length > MAX_SCAN_LINE
|
|
386
|
+
? lines[i].slice(0, MAX_SCAN_LINE)
|
|
387
|
+
: lines[i];
|
|
388
|
+
if (rule.pattern.test(lineToTest)) hitLines.push(i + 1);
|
|
389
|
+
}
|
|
390
|
+
if (hitLines.length === 0) continue;
|
|
391
|
+
if (
|
|
392
|
+
rule.min_occurrences !== undefined &&
|
|
393
|
+
hitLines.length < rule.min_occurrences
|
|
394
|
+
) {
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
findings.push({
|
|
399
|
+
route: "",
|
|
400
|
+
selector: `${relPath}#${rule.id}`,
|
|
401
|
+
category: "anti-slop",
|
|
402
|
+
severity: rule.severity,
|
|
403
|
+
title: `${rule.message} (rule ${rule.id})`,
|
|
404
|
+
description: `${rule.message} Detected at ${relPath}:${hitLines[0]}${
|
|
405
|
+
hitLines.length > 1 ? ` (and ${hitLines.length - 1} more)` : ""
|
|
406
|
+
}.`,
|
|
407
|
+
fix_hint: rule.suggested_fix,
|
|
408
|
+
screenshot_ref: "/tmp/anti-slop/no-screenshot.png",
|
|
409
|
+
line: hitLines[0],
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
return findings;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function formatHuman(findings: Finding[]): string {
|
|
416
|
+
if (findings.length === 0) return "anti-slop: no findings.\n";
|
|
417
|
+
const lines: string[] = [`anti-slop: ${findings.length} finding(s)\n`];
|
|
418
|
+
for (const f of findings) {
|
|
419
|
+
lines.push(
|
|
420
|
+
` [${f.severity.padEnd(8)}] ${f.selector}:${f.line}\n ${f.title}\n fix: ${f.fix_hint}\n`,
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
return lines.join("");
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Decide the process exit code from the findings and the rule set.
|
|
428
|
+
*
|
|
429
|
+
* Blocking is keyed on the originating **Rule**, not the emitted Finding (which
|
|
430
|
+
* always serializes `category: "anti-slop"` for `finding.schema.json`
|
|
431
|
+
* conformance). The rule id is recovered from the finding's `selector`
|
|
432
|
+
* (`"<file>#<RULE-ID>"`). Returns 1 iff any finding maps to a rule with
|
|
433
|
+
* `category === "brand" && severity === "high"`; else 0 (anti-slop and
|
|
434
|
+
* brand-below-high findings are advisory).
|
|
435
|
+
*/
|
|
436
|
+
function computeExitCode(findings: Finding[], rules: Rule[]): number {
|
|
437
|
+
const byId = new Map<string, Rule>();
|
|
438
|
+
for (const r of rules) byId.set(r.id, r);
|
|
439
|
+
for (const f of findings) {
|
|
440
|
+
// The selector is `${relPath}#${rule.id}`, so the rule id is the LAST
|
|
441
|
+
// `#`-segment. Splitting and taking `[1]` mis-captures a path fragment when
|
|
442
|
+
// a scanned file path itself contains `#`, the byId lookup misses, and the
|
|
443
|
+
// gate fails OPEN (returns 0) on a real brand/high finding. Parse from the
|
|
444
|
+
// last `#` so a `#`-bearing path can never defeat the blocking gate. If the
|
|
445
|
+
// selector has no `#`, lastIndexOf returns -1 → slice(0) yields the whole
|
|
446
|
+
// string → byId miss → non-blocking, which is acceptable for a malformed
|
|
447
|
+
// selector.
|
|
448
|
+
const ruleId = f.selector.slice(f.selector.lastIndexOf("#") + 1);
|
|
449
|
+
const rule = ruleId ? byId.get(ruleId) : undefined;
|
|
450
|
+
if (rule && rule.category === "brand" && rule.severity === "high") {
|
|
451
|
+
return 1;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return 0;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function main() {
|
|
458
|
+
const args = parseArgs(process.argv.slice(2));
|
|
459
|
+
|
|
460
|
+
let rules: Rule[];
|
|
461
|
+
try {
|
|
462
|
+
rules = parseRules(readFileSync(RULES_FILE, "utf8"));
|
|
463
|
+
} catch (err) {
|
|
464
|
+
console.error(`[tier1-scan] ${(err as Error).message}`);
|
|
465
|
+
process.exit(1);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
if (args.ruleFilter) {
|
|
469
|
+
rules = rules.filter((r) => r.id === args.ruleFilter);
|
|
470
|
+
if (rules.length === 0) {
|
|
471
|
+
console.error(
|
|
472
|
+
`[tier1-scan] --rule ${args.ruleFilter} matched zero rules`,
|
|
473
|
+
);
|
|
474
|
+
process.exit(1);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const candidatePaths =
|
|
479
|
+
args.paths.length > 0
|
|
480
|
+
? expandPaths(args.paths)
|
|
481
|
+
: expandPaths(defaultPaths());
|
|
482
|
+
|
|
483
|
+
if (candidatePaths.length === 0) {
|
|
484
|
+
if (args.json) {
|
|
485
|
+
process.stdout.write("[]\n");
|
|
486
|
+
} else {
|
|
487
|
+
process.stdout.write(
|
|
488
|
+
"anti-slop: no frontend files in scope; skipping scan.\n",
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
process.exit(0);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
const findings: Finding[] = [];
|
|
495
|
+
for (const file of candidatePaths) {
|
|
496
|
+
findings.push(...scanFile(file, rules));
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
if (args.json) {
|
|
500
|
+
// Emit machine-readable shape (drop the `line` field — not in finding.schema.json).
|
|
501
|
+
const emit = findings.map(({ line: _line, ...rest }) => rest);
|
|
502
|
+
process.stdout.write(JSON.stringify(emit, null, 2) + "\n");
|
|
503
|
+
} else {
|
|
504
|
+
process.stdout.write(formatHuman(findings));
|
|
505
|
+
}
|
|
506
|
+
process.exit(computeExitCode(findings, rules));
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
if (import.meta.main) {
|
|
510
|
+
main();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
export {
|
|
514
|
+
parseRules,
|
|
515
|
+
scanFile,
|
|
516
|
+
disabledRulesInFile,
|
|
517
|
+
expandPaths,
|
|
518
|
+
defaultPaths,
|
|
519
|
+
computeExitCode,
|
|
520
|
+
unwrapBackticks,
|
|
521
|
+
DEFAULT_PATH_RE_SOURCE,
|
|
522
|
+
REPO_ROOT,
|
|
523
|
+
RULES_FILE,
|
|
524
|
+
};
|
|
525
|
+
export type { Rule, Finding };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-design
|
|
3
|
+
description: "This skill should be used when creating distinctive, production-grade frontend interfaces. It generates creative, polished web components, pages, or applications that avoid generic AI aesthetics with high design quality."
|
|
4
|
+
context_queries:
|
|
5
|
+
- knowledge-base/marketing/brand-guide.md
|
|
6
|
+
- knowledge-base/product/design/taste-profile.md
|
|
7
|
+
license: Complete terms in LICENSE.txt
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
<!-- soleur-cloud-mode:start -->
|
|
11
|
+
**Cloud Mode (Devin):** before pipeline work run `bash "${CLAUDE_PLUGIN_ROOT}/scripts/cloud-detect.sh"`. If `CLAUDE_PLUGIN_ROOT` is unset (cloud exec shells do not export it), resolve the root by IDENTITY, never by script basename: for `d` in `"$HOME/.local/share/devin/cli/plugins/cache"` and `/opt/.devin/plugins`, skip unless `[ -d "$d" ]`, then `MANIFEST="$(find "$d" -path '*/.claude-plugin/plugin.json' -exec grep -l '"name"[[:space:]]*:[[:space:]]*"soleur"' {} + 2>/dev/null | head -1)"`, `ROOT="${MANIFEST%/.claude-plugin/plugin.json}"` — one resolution, two consumers: `$ROOT/scripts/cloud-detect.sh` and `$ROOT/scripts/precommit-guard.sh`. (Shape check, not authentication: a planted `{"name":"soleur"}` dir passes — ADR-179 A11.) `local` or `not-local:no-devin-env` proceeds normally; any other `not-local:<reason>` applies `<plugin-root>/devin/INSTRUCTIONS.md` §Cloud Mode: emit the `--banner`, fan out sequentially with `Reviewed-Coverage: sequential-fallback` disclosure (never claim an independent review ran), `message_user` ack before any secrets read or production mutation, and run `precommit-guard.sh` before any `git commit` — hooks do not fire in cloud.
|
|
12
|
+
<!-- soleur-cloud-mode:end -->
|
|
13
|
+
|
|
14
|
+
<!-- grok-harness-invoke:start -->
|
|
15
|
+
**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.
|
|
16
|
+
<!-- grok-harness-invoke:end -->
|
|
17
|
+
|
|
18
|
+
This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
|
|
19
|
+
|
|
20
|
+
The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.
|
|
21
|
+
|
|
22
|
+
## Design Thinking
|
|
23
|
+
|
|
24
|
+
Before coding, understand the context and commit to a BOLD aesthetic direction:
|
|
25
|
+
|
|
26
|
+
- **Purpose**: What problem does this interface solve? Who uses it?
|
|
27
|
+
- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
|
|
28
|
+
- **Constraints**: Technical requirements (framework, performance, accessibility).
|
|
29
|
+
- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?
|
|
30
|
+
|
|
31
|
+
**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.
|
|
32
|
+
|
|
33
|
+
Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
|
|
34
|
+
|
|
35
|
+
- Production-grade and functional
|
|
36
|
+
- Visually striking and memorable
|
|
37
|
+
- Cohesive with a clear aesthetic point-of-view
|
|
38
|
+
- Meticulously refined in every detail
|
|
39
|
+
|
|
40
|
+
## Frontend Aesthetics Guidelines
|
|
41
|
+
|
|
42
|
+
Focus on:
|
|
43
|
+
|
|
44
|
+
- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
|
|
45
|
+
- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
|
|
46
|
+
- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
|
|
47
|
+
- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
|
|
48
|
+
- **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.
|
|
49
|
+
|
|
50
|
+
NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character.
|
|
51
|
+
|
|
52
|
+
Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations.
|
|
53
|
+
|
|
54
|
+
**IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.
|
|
55
|
+
|
|
56
|
+
Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
|
|
57
|
+
|
|
58
|
+
### Multi-Variant Fan-Out
|
|
59
|
+
|
|
60
|
+
When the design brief is a full surface (page, app, or non-trivial component), generate **3 variants in parallel** instead of a single take, then let the operator choose. This is Soleur's all-Claude adaptation of gstack `design-shotgun` (ADR-090).
|
|
61
|
+
|
|
62
|
+
1. **Load learned taste (FR6 + validate).** The FR6 hook injects a read-directive for `knowledge-base/product/design/taste-profile.md`. Before trusting it, run `bash plugins/soleur/scripts/taste-profile-update.sh --validate knowledge-base/product/design/taste-profile.md`. On a **non-zero** exit, design with **no taste bias** (fail-open — never block on a corrupt profile). On success, read the profile's **fenced JSON machine block** (`entries[]` between the `taste-profile:data` markers — this is the region `--validate` certifies; do NOT bias from the human `## Reinforced Aesthetics` table, which `--validate` does not cover) and take the entries whose `context` matches the current design context (`landing-page | marketing-site | dashboard | app-ui | docs | email | component`); the most-recent value per axis is the operator's current lean.
|
|
63
|
+
2. **Seed distinct directions.** Pick 3 distinct aesthetic directions from the Design Thinking tone list. Bias — do not restrict — the seeds toward the loaded taste: if the profile leans `minimalist@dashboard`, one seed should honor it and the others deliberately diverge so the operator still sees range. With an empty/invalid profile, pick 3 maximally-distinct seeds.
|
|
64
|
+
3. **Fan out via the Agent tool.** Spawn 3 sub-agents (one per seed), each with the full brief + its assigned direction **in the prompt text** — sub-agents do NOT inherit the FR6 injection, so the taste bias must be passed explicitly. Each returns a self-contained variant.
|
|
65
|
+
4. **Present the slate** for selection. Interactive: describe the 3 variants and let the operator choose by natural conversation — **never** `AskUserQuestion` (a nested Task subagent hangs on it). Headless / no operator turn: auto-select the variant matching the top-recency taste entry (or variant 1 if the profile is empty) and skip step 5 (no operator signal = no learning).
|
|
66
|
+
|
|
67
|
+
### Recording Taste
|
|
68
|
+
|
|
69
|
+
When the operator selects a variant **in an interactive session**, record the choice so future sessions are primed:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
bash plugins/soleur/scripts/taste-profile-update.sh \
|
|
73
|
+
knowledge-base/product/design/taste-profile.md \
|
|
74
|
+
<context> aesthetic-direction <selected-direction> "$(date -u +%F)"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`<context>` is the current design context (the enum above); `<selected-direction>` is the chosen direction as a sanitized lowercase-hyphen token (e.g. `minimalist`, `editorial`). The helper ([`taste-profile-update.sh`](../../scripts/taste-profile-update.sh)) validates every token, recomputes the entry by recency, flags a same-context contradiction, and bumps `last_updated` only. Do **not** hand-edit `taste-profile.md`. Do **not** record in headless runs.
|