@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,176 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 2026-07-01 reproducer: worktree-manager.sh must self-heal a stale git lock
|
|
3
|
+
# file left when a git process is killed mid-write (the 2026-07-01 seccomp
|
|
4
|
+
# outage class — a residual .git/config.lock wedges every later `git config`
|
|
5
|
+
# write with EEXIST forever). Age-guarded sweep: aged config locks removed,
|
|
6
|
+
# fresh and future-dated locks preserved; index/HEAD locks out of scope.
|
|
7
|
+
#
|
|
8
|
+
# Plan: knowledge-base/project/plans/archive/20261013-041741-2026-07-01-fix-stale-git-lock-sweep-worktree-plan.md
|
|
9
|
+
#
|
|
10
|
+
# Run via: bash plugins/soleur/skills/git-worktree/test/stale-lock-sweep.test.sh
|
|
11
|
+
|
|
12
|
+
set -uo pipefail
|
|
13
|
+
|
|
14
|
+
# Git-location tripwire (#7833). These suites drive worktree-manager.sh, which runs
|
|
15
|
+
# `git worktree remove`, `git branch -D` and `git reset --hard` -- the highest-damage git writes
|
|
16
|
+
# in the corpus. An inherited GIT_DIR aims all of them at the developer's real repository, so
|
|
17
|
+
# this file aborts rather than proceeding. Inline rather than sourcing test-helpers.sh, which
|
|
18
|
+
# would also import an assertion framework these suites do not use.
|
|
19
|
+
for _v in GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY \
|
|
20
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE GIT_TEMPLATE_DIR GIT_EXEC_PATH; do
|
|
21
|
+
if [[ -n "${!_v:-}" && "${SOLEUR_GIT_TRIPWIRE_ALLOW:-0}" != "1" ]]; then
|
|
22
|
+
printf 'FATAL: %s started with an inherited git-location environment (%s=%s).\n' \
|
|
23
|
+
"${BASH_SOURCE[0]}" "$_v" "${!_v}" >&2
|
|
24
|
+
printf 'Fix the ENTRY POINT: unset %s && <runner>\n' "$_v" >&2
|
|
25
|
+
exit 97
|
|
26
|
+
fi
|
|
27
|
+
done
|
|
28
|
+
unset _v
|
|
29
|
+
|
|
30
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)"
|
|
31
|
+
WM="$REPO_ROOT/plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh"
|
|
32
|
+
|
|
33
|
+
PASS=0; FAIL=0
|
|
34
|
+
fail() { echo " FAIL: $1"; FAIL=$((FAIL+1)); }
|
|
35
|
+
pass() { echo " pass: $1"; PASS=$((PASS+1)); }
|
|
36
|
+
|
|
37
|
+
TMP=$(mktemp -d)
|
|
38
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
39
|
+
|
|
40
|
+
# GNU coreutils preflight — the sweep + this test use GNU `stat -c%Y` and
|
|
41
|
+
# `touch -d '<rel>'` (Linux/CI ubuntu target). Skip cleanly on a non-GNU host
|
|
42
|
+
# (e.g. BSD/macOS dev box) instead of hard-erroring at plant() with a confusing
|
|
43
|
+
# "invalid date format".
|
|
44
|
+
if ! stat -c%Y "$TMP" >/dev/null 2>&1 || ! touch -d '1 second ago' "$TMP/.probe" 2>/dev/null; then
|
|
45
|
+
echo "SKIP: GNU coreutils (stat -c / touch -d relative) required — non-GNU host"
|
|
46
|
+
exit 0
|
|
47
|
+
fi
|
|
48
|
+
rm -f "$TMP/.probe"
|
|
49
|
+
|
|
50
|
+
# --- Stand up upstream + local bare clone (mirrors the soleur bare-repo layout,
|
|
51
|
+
# same pattern as create-from-origin-main.test.sh) ---
|
|
52
|
+
UPSTREAM="$TMP/upstream.git"
|
|
53
|
+
git init --bare -b main "$UPSTREAM" >/dev/null
|
|
54
|
+
SEED="$TMP/seed"
|
|
55
|
+
git clone "$UPSTREAM" "$SEED" >/dev/null 2>&1
|
|
56
|
+
( cd "$SEED" && git -c user.email=t@t -c user.name=t commit --allow-empty -m seed >/dev/null && git push origin main >/dev/null 2>&1 )
|
|
57
|
+
rm -rf "$SEED"
|
|
58
|
+
|
|
59
|
+
LOCAL="$TMP/local.git"
|
|
60
|
+
git init --bare -b main "$LOCAL" >/dev/null
|
|
61
|
+
( cd "$LOCAL" && git remote add origin "$UPSTREAM" && git fetch --no-tags origin main:main >/dev/null 2>&1 )
|
|
62
|
+
|
|
63
|
+
# For a bare repo, `ensure_bare_config` resolves git_dir == GIT_ROOT (the bare
|
|
64
|
+
# dir itself), so the config locks live directly under $LOCAL.
|
|
65
|
+
GIT_DIR="$LOCAL"
|
|
66
|
+
|
|
67
|
+
# --- Source the script to unit-test sweep_stale_git_locks() directly. The
|
|
68
|
+
# script's BASH_SOURCE guard (worktree-manager.sh:1490) suppresses main() when
|
|
69
|
+
# sourced. The script sets `set -euo pipefail`; disable errexit afterward so the
|
|
70
|
+
# harness's if/else assertion style behaves like the sibling tests. ---
|
|
71
|
+
cd "$LOCAL"
|
|
72
|
+
# shellcheck source=/dev/null
|
|
73
|
+
source "$WM"
|
|
74
|
+
set +e
|
|
75
|
+
|
|
76
|
+
# Plant a lock file with a specific mtime. $2 = seconds in the PAST.
|
|
77
|
+
plant() { : > "$GIT_DIR/$1"; touch -d "$2 seconds ago" "$GIT_DIR/$1"; }
|
|
78
|
+
present() { [[ -f "$GIT_DIR/$1" ]]; }
|
|
79
|
+
|
|
80
|
+
# --- AC1: aged config.lock removed ---
|
|
81
|
+
plant config.lock 120
|
|
82
|
+
sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null
|
|
83
|
+
if present config.lock; then
|
|
84
|
+
fail "AC1: aged config.lock was NOT removed"
|
|
85
|
+
else
|
|
86
|
+
pass "AC1: aged config.lock removed"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# --- AC2: fresh config.worktree.lock preserved ---
|
|
90
|
+
: > "$GIT_DIR/config.worktree.lock" # mtime = now
|
|
91
|
+
sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null
|
|
92
|
+
if present config.worktree.lock; then
|
|
93
|
+
pass "AC2: fresh config.worktree.lock preserved (age < threshold)"
|
|
94
|
+
else
|
|
95
|
+
fail "AC2: fresh config.worktree.lock was WRONGLY removed"
|
|
96
|
+
fi
|
|
97
|
+
rm -f "$GIT_DIR/config.worktree.lock"
|
|
98
|
+
|
|
99
|
+
# --- AC3: per-file age discrimination in one run — aged config.lock removed,
|
|
100
|
+
# fresh config.worktree.lock preserved (fails against both a no-op and an
|
|
101
|
+
# over-broad "delete every lock" impl) ---
|
|
102
|
+
plant config.lock 120
|
|
103
|
+
: > "$GIT_DIR/config.worktree.lock"
|
|
104
|
+
sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null
|
|
105
|
+
if ! present config.lock && present config.worktree.lock; then
|
|
106
|
+
pass "AC3: aged config.lock removed AND fresh config.worktree.lock preserved in one run"
|
|
107
|
+
else
|
|
108
|
+
fail "AC3: mixed-age sweep wrong (config.lock present=$(present config.lock && echo y || echo n), config.worktree.lock present=$(present config.worktree.lock && echo y || echo n))"
|
|
109
|
+
fi
|
|
110
|
+
rm -f "$GIT_DIR/config.worktree.lock"
|
|
111
|
+
|
|
112
|
+
# --- AC3b: index.lock / HEAD.lock are OUT of scope — even aged instances are
|
|
113
|
+
# preserved (on a non-bare git_dir these are LIVE working-tree locks; removing
|
|
114
|
+
# one mid-op would tear the tenant's index — and they never block config writes) ---
|
|
115
|
+
plant index.lock 120
|
|
116
|
+
plant HEAD.lock 120
|
|
117
|
+
sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null
|
|
118
|
+
if present index.lock && present HEAD.lock; then
|
|
119
|
+
pass "AC3b: aged index.lock/HEAD.lock preserved (deliberately out of sweep scope)"
|
|
120
|
+
else
|
|
121
|
+
fail "AC3b: index.lock/HEAD.lock were swept (should be out of scope)"
|
|
122
|
+
fi
|
|
123
|
+
rm -f "$GIT_DIR/index.lock" "$GIT_DIR/HEAD.lock"
|
|
124
|
+
|
|
125
|
+
# --- AC4: clock-skew guard — future-dated lock preserved (negative age = fresh) ---
|
|
126
|
+
: > "$GIT_DIR/config.lock"
|
|
127
|
+
touch -d "+120 seconds" "$GIT_DIR/config.lock"
|
|
128
|
+
sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null
|
|
129
|
+
if present config.lock; then
|
|
130
|
+
pass "AC4: future-dated lock preserved (clock-skew guard)"
|
|
131
|
+
else
|
|
132
|
+
fail "AC4: future-dated lock was WRONGLY removed"
|
|
133
|
+
fi
|
|
134
|
+
rm -f "$GIT_DIR/config.lock"
|
|
135
|
+
|
|
136
|
+
# --- AC6: sweep clears an aged config.lock so a real git config write succeeds
|
|
137
|
+
# (the exact prod EEXIST symptom, at the unit level — discriminating, not vacuous) ---
|
|
138
|
+
plant config.lock 120
|
|
139
|
+
sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null
|
|
140
|
+
if git config --file "$GIT_DIR/config" test.key val >/dev/null 2>&1 \
|
|
141
|
+
&& [[ "$(git config --file "$GIT_DIR/config" test.key 2>/dev/null)" == "val" ]]; then
|
|
142
|
+
pass "AC6: aged config.lock swept → git config write succeeds (no EEXIST)"
|
|
143
|
+
else
|
|
144
|
+
fail "AC6: git config write FAILED after sweep (config.lock not cleared?)"
|
|
145
|
+
fi
|
|
146
|
+
git config --file "$GIT_DIR/config" --unset test.key 2>/dev/null
|
|
147
|
+
|
|
148
|
+
# --- AC7: no-op is safe under `set -e` (empty lock set + missing dir) ---
|
|
149
|
+
rm -f "$GIT_DIR"/*.lock 2>/dev/null
|
|
150
|
+
if ( set -e; sweep_stale_git_locks "$GIT_DIR" 60 >/dev/null ); then
|
|
151
|
+
pass "AC7a: no-op sweep exits 0 under set -e (empty lock set)"
|
|
152
|
+
else
|
|
153
|
+
fail "AC7a: no-op sweep aborted under set -e"
|
|
154
|
+
fi
|
|
155
|
+
if ( set -e; sweep_stale_git_locks "$TMP/does-not-exist" 60 >/dev/null ); then
|
|
156
|
+
pass "AC7b: sweep on missing dir exits 0 under set -e"
|
|
157
|
+
else
|
|
158
|
+
fail "AC7b: sweep on missing dir aborted under set -e"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# --- AC5: black-box self-heal wiring — an aged config.lock is swept when
|
|
162
|
+
# cleanup-merged (the session-start preamble path) runs through ensure_bare_config ---
|
|
163
|
+
: > "$GIT_DIR/config.lock"; touch -d "120 seconds ago" "$GIT_DIR/config.lock"
|
|
164
|
+
( cd "$LOCAL" && bash "$WM" --yes cleanup-merged >"$TMP/cm.log" 2>&1 ) || true
|
|
165
|
+
if present config.lock; then
|
|
166
|
+
fail "AC5: config.lock survived cleanup-merged (ensure_bare_config wiring; log: $(cat "$TMP/cm.log"))"
|
|
167
|
+
else
|
|
168
|
+
pass "AC5: aged config.lock swept via cleanup-merged (ensure_bare_config wiring)"
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
echo
|
|
172
|
+
echo "=== Results ==="
|
|
173
|
+
echo "PASS: $PASS"
|
|
174
|
+
echo "FAIL: $FAIL"
|
|
175
|
+
[[ "$FAIL" -eq 0 ]] || exit 1
|
|
176
|
+
exit 0
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: go
|
|
3
|
+
description: This skill is the unified entry point that classifies intent and routes to the right workflow skill
|
|
4
|
+
argument-hint: "[what you want to do]"
|
|
5
|
+
# `/soleur:go` also ships as plugins/soleur/commands/go.md. Claude Code loads
|
|
6
|
+
# plugin commands AND plugin skills into one slash menu, so without this the name
|
|
7
|
+
# renders twice. `user-invocable: false` leaves the menu row to the command while
|
|
8
|
+
# keeping this skill model-invocable — Skill(soleur:go) must keep working.
|
|
9
|
+
# Grok 1.0.40 validates plugin commands/ but does not register them as slash
|
|
10
|
+
# commands. Do not flip this flag to expose the go row there — that re-duplicates
|
|
11
|
+
# Claude Code. The Grok slash row is `.grok/commands/go.md` (symlink onto
|
|
12
|
+
# commands/go.md).
|
|
13
|
+
user-invocable: false
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<!-- soleur-cloud-mode:start -->
|
|
17
|
+
**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.
|
|
18
|
+
<!-- soleur-cloud-mode:end -->
|
|
19
|
+
|
|
20
|
+
<!-- grok-harness-invoke:start -->
|
|
21
|
+
**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.
|
|
22
|
+
<!-- grok-harness-invoke:end -->
|
|
23
|
+
|
|
24
|
+
**Which harness this body is for.** Everything below the next heading is the **Devin CLI**
|
|
25
|
+
entry-point shim: it addresses itself as the `/soleur:go` slash command, resolves paths through
|
|
26
|
+
`${CLAUDE_PLUGIN_ROOT}`, and names Devin's own adapter tools. The Grok block above says to run
|
|
27
|
+
this document to completion; read the two together, because on a harness other than Devin the
|
|
28
|
+
body below is not the thing to run:
|
|
29
|
+
|
|
30
|
+
- **Claude Code** — this skill is `user-invocable: false` and the operator-facing row is
|
|
31
|
+
`plugins/soleur/commands/go.md`. Read that file and act as its handler.
|
|
32
|
+
- **Grok Build** — the slash row is `.grok/commands/go.md`, which resolves to the same
|
|
33
|
+
`commands/go.md`. Read that file and act as its handler. Do NOT detect the harness as Devin,
|
|
34
|
+
and do not use `run_subagent`; Grok's spawn tool is `spawn_subagent` with hyphenated agent ids.
|
|
35
|
+
- **Codex** — `codex/skills/go/SKILL.md` is the front door. Read `commands/go.md` and act as
|
|
36
|
+
its handler, translating tools through `codex/INSTRUCTIONS.md` §Tools.
|
|
37
|
+
|
|
38
|
+
In every case the AUTHORITY is `commands/go.md`; the harness shims differ only in how they
|
|
39
|
+
address the operator and which tool names they use.
|
|
40
|
+
|
|
41
|
+
The authority's first Sharp Edge covers a brief: its "ask the operator" / "OPEN DECISION" wording on a technical fork is the trigger to spawn the CTO, never a reason to ask ([technical-ruling-delegation.md](${CLAUDE_PLUGIN_ROOT}/skills/brainstorm-techniques/references/technical-ruling-delegation.md)).
|
|
42
|
+
|
|
43
|
+
# /soleur:go (Devin CLI entry point)
|
|
44
|
+
|
|
45
|
+
You are the `/soleur:go` slash command for the Soleur plugin on Devin CLI.
|
|
46
|
+
|
|
47
|
+
The user's request is the text that follows `/soleur:go`. Treat that text as `$ARGUMENTS`.
|
|
48
|
+
|
|
49
|
+
1. Read `${CLAUDE_PLUGIN_ROOT}/commands/go.md`.
|
|
50
|
+
2. Follow every instruction in that file as if you were the `/soleur:go` handler.
|
|
51
|
+
3. Where the file uses `$ARGUMENTS` or `#$ARGUMENTS`, substitute the user's actual request.
|
|
52
|
+
4. When routing to a skill, use the Devin harness adapter: invoke the `/soleur:<skill>` slash command with the user's request as arguments.
|
|
53
|
+
5. When routing to an agent, use the `run_subagent` tool with the agent id and the user's request as the prompt.
|
|
54
|
+
6. Do not improvise workflow steps. Route through the named skill or agent.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: growth
|
|
3
|
+
description: "This skill should be used when performing content strategy analysis, keyword research, content auditing, content gap analysis, or AI agent consumability auditing. Sub-commands: auditing, planning, applying fixes."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- soleur-cloud-mode:start -->
|
|
7
|
+
**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.
|
|
8
|
+
<!-- soleur-cloud-mode:end -->
|
|
9
|
+
|
|
10
|
+
<!-- grok-harness-invoke:start -->
|
|
11
|
+
**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.
|
|
12
|
+
<!-- grok-harness-invoke:end -->
|
|
13
|
+
|
|
14
|
+
# Growth Strategy
|
|
15
|
+
|
|
16
|
+
Analyze content for keyword alignment, plan content to capture search traffic, audit AI agent consumability, and apply content fixes. This skill delegates to the soleur:marketing:growth-strategist agent for content-level analysis and execution.
|
|
17
|
+
|
|
18
|
+
## Sub-commands
|
|
19
|
+
|
|
20
|
+
| Command | Description |
|
|
21
|
+
|---------|-------------|
|
|
22
|
+
| `growth audit <url-or-path>` | Audit existing content for keyword alignment and search intent match |
|
|
23
|
+
| `growth fix <path>` | Audit and apply keyword/copy/AEO fixes to local source files |
|
|
24
|
+
| `growth plan <topic> [--site <url-or-path>] [--competitors url1,url2]` | Research keywords, analyze gaps, and produce a prioritized content plan |
|
|
25
|
+
| `growth aeo <url-or-path>` | Audit content for GEO/AEO optimization (source citations, statistics, conversational readiness, FAQ structure, citation quality) |
|
|
26
|
+
|
|
27
|
+
If no sub-command is provided, display the table above and ask which sub-command to run.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Sub-command: audit
|
|
32
|
+
|
|
33
|
+
Analyze existing site content for keyword alignment, search intent match, and readability. Produces a report with issues and rewrite suggestions.
|
|
34
|
+
|
|
35
|
+
### Steps
|
|
36
|
+
|
|
37
|
+
1. Parse the argument as a URL or local file/directory path. URLs start with `http://` or `https://`. Everything else is a local path.
|
|
38
|
+
|
|
39
|
+
2. Check for brand guide:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
if [[ -f "knowledge-base/marketing/brand-guide.md" ]]; then
|
|
43
|
+
echo "Brand guide found. Will use for voice alignment."
|
|
44
|
+
fi
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
3. Launch the soleur:marketing:growth-strategist agent via the Task tool:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Task soleur:marketing:growth-strategist: "Audit the content at <url-or-path> for keyword alignment,
|
|
51
|
+
search intent match, and readability. <if brand guide exists: Also read
|
|
52
|
+
knowledge-base/marketing/brand-guide.md and align rewrite suggestions with the brand voice.>
|
|
53
|
+
Produce a structured report with per-page analysis, issues found, and rewrite suggestions.
|
|
54
|
+
Use WebFetch for URLs or Read/Glob for local paths."
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
4. Present the agent's report to the user.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Sub-command: fix
|
|
62
|
+
|
|
63
|
+
Audit existing content and apply fixes to local source files. Combines analysis and execution in one pass, following the `seo-aeo fix` pattern.
|
|
64
|
+
|
|
65
|
+
### Steps
|
|
66
|
+
|
|
67
|
+
1. Parse the argument as a local file or directory path. If the argument starts with `http://` or `https://`, display: "growth fix works on local files only. For URL analysis, use `growth audit`." Stop execution.
|
|
68
|
+
|
|
69
|
+
2. Check for brand guide:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
if [[ -f "knowledge-base/marketing/brand-guide.md" ]]; then
|
|
73
|
+
echo "Brand guide found. Will validate rewrites against brand voice."
|
|
74
|
+
fi
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
3. Launch the soleur:marketing:growth-strategist agent via the Task tool:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Task soleur:marketing:growth-strategist: "Audit the content at <path> for keyword alignment,
|
|
81
|
+
search intent match, readability, and GEO/AEO gaps. For each issue found, apply
|
|
82
|
+
a fix to the source files. Read each file before editing.
|
|
83
|
+
<if brand guide exists: Read knowledge-base/marketing/brand-guide.md and
|
|
84
|
+
validate all rewrites against the brand voice before applying.>
|
|
85
|
+
After all fixes, build the site to verify changes compile.
|
|
86
|
+
Report what was changed per file."
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
4. Present the agent's report showing changes made.
|
|
90
|
+
5. If the build failed, show the error and suggest: "Run `git checkout -- <file>` to revert changes, or fix the build error manually."
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Sub-command: plan
|
|
95
|
+
|
|
96
|
+
Research keywords, analyze content gaps, and produce a prioritized content plan. This is a self-contained workflow that combines keyword research, gap analysis, and planning.
|
|
97
|
+
|
|
98
|
+
### Steps
|
|
99
|
+
|
|
100
|
+
1. Parse arguments:
|
|
101
|
+
- `<topic>` (required): the topic or keyword space to research
|
|
102
|
+
- `--site <url-or-path>` (optional): the user's existing site for gap analysis
|
|
103
|
+
- `--competitors url1,url2` (optional): competitor URLs for comparison
|
|
104
|
+
|
|
105
|
+
2. Check for brand guide (same as audit step 2).
|
|
106
|
+
|
|
107
|
+
3. Launch the soleur:marketing:growth-strategist agent via the Task tool:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
Task soleur:marketing:growth-strategist: "Create a content plan for the topic '<topic>'.
|
|
111
|
+
|
|
112
|
+
1. Research keywords related to this topic using WebSearch. Classify each by search
|
|
113
|
+
intent (informational, navigational, commercial, transactional) and relevance.
|
|
114
|
+
|
|
115
|
+
2. <if --site provided: Analyze the existing content at <site> to identify gaps --
|
|
116
|
+
topics where the site has no coverage or only partial coverage.>
|
|
117
|
+
|
|
118
|
+
3. <if --competitors provided: Fetch competitor sites at <urls> via WebFetch and
|
|
119
|
+
compare their content coverage against the target keywords. Skip unreachable
|
|
120
|
+
competitors and note them.>
|
|
121
|
+
|
|
122
|
+
4. Produce a prioritized content plan: P1 (high impact), P2 (medium), P3 (future).
|
|
123
|
+
Each piece should include content type, target keywords, search intent, and outline.
|
|
124
|
+
|
|
125
|
+
<if brand guide exists: Read knowledge-base/marketing/brand-guide.md and align
|
|
126
|
+
keyword relevance and content priorities with the brand positioning.>"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
4. Present the agent's report to the user.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Sub-command: aeo
|
|
134
|
+
|
|
135
|
+
Audit content for AI agent consumability at the content level. Checks whether AI models can accurately extract, cite, and quote the content.
|
|
136
|
+
|
|
137
|
+
### Steps
|
|
138
|
+
|
|
139
|
+
1. Parse the argument as a URL or local path (same heuristic as audit).
|
|
140
|
+
|
|
141
|
+
2. Launch the soleur:marketing:growth-strategist agent via the Task tool:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Task soleur:marketing:growth-strategist: "Audit the content at <url-or-path> for GEO/AEO optimization.
|
|
145
|
+
Check source citation presence, statistics/specificity, conversational readiness,
|
|
146
|
+
FAQ structure quality, definition extractability, summary quality, and
|
|
147
|
+
citation-friendly paragraph structure.
|
|
148
|
+
Do NOT check JSON-LD, meta tags, sitemaps, or llms.txt format -- those belong to
|
|
149
|
+
the soleur:marketing:seo-aeo-analyst agent. Focus only on content-level checks.
|
|
150
|
+
Use WebFetch for URLs or Read/Glob for local paths."
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
3. Present the agent's report to the user.
|
|
154
|
+
4. If technical AEO checks are also needed, suggest: "Run `seo-aeo audit` for technical SEO and AEO checks (JSON-LD, meta tags, llms.txt)."
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Important Guidelines
|
|
159
|
+
|
|
160
|
+
- Each sub-command is independent. No sub-command requires a prior run of another.
|
|
161
|
+
- The `plan` sub-command performs its own keyword research internally -- no need to run a separate research step first.
|
|
162
|
+
- The `audit`, `plan`, and `aeo` sub-commands produce inline output only. The `fix` sub-command modifies source files directly.
|
|
163
|
+
- The soleur:marketing:growth-strategist agent handles content-level analysis. For technical SEO (meta tags, JSON-LD, sitemaps, llms.txt), direct users to the `seo-aeo` skill instead.
|
|
164
|
+
- For generating new articles from content plans, direct users to the `content-writer` skill.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: harvest-debt
|
|
3
|
+
description: "This skill should be used when harvesting inline SOLEUR-DEBT: markers from the codebase into a ledger grouped by file, flagging markers with no upgrade trigger."
|
|
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
|
+
# Harvest Inline Deferral Markers
|
|
11
|
+
|
|
12
|
+
Read-only harvester for inline `SOLEUR-DEBT:` deferral markers. It makes the
|
|
13
|
+
deliberate shortcuts left in code grep-discoverable so a deferral cannot quietly
|
|
14
|
+
become permanent. It complements — never duplicates — the reactive
|
|
15
|
+
[technical-debt ledger](../../../../knowledge-base/project/learnings/technical-debt/README.md):
|
|
16
|
+
|
|
17
|
+
- **harvest-debt (this skill)** — SURFACE inline markers where they live, in code.
|
|
18
|
+
- [soleur:compound](../compound-capture/SKILL.md) — PROMOTE a worth-tracking marker into a ledger entry.
|
|
19
|
+
- [soleur:resolve-debt](../resolve-debt/SKILL.md) — CLOSE a ledger entry with a linked GitHub issue.
|
|
20
|
+
|
|
21
|
+
It writes nothing and closes nothing; promotion and closure stay deliberate acts.
|
|
22
|
+
|
|
23
|
+
## The marker convention
|
|
24
|
+
|
|
25
|
+
A deliberate shortcut is annotated inline, in a code comment, with the ceiling it
|
|
26
|
+
tops out at and the observable trigger that says "do the real thing now":
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
// SOLEUR-DEBT: <ceiling>; <upgrade trigger>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- Use the all-caps `SOLEUR-DEBT:` marker — never a bare `soleur:` prefix, which
|
|
33
|
+
collides with skill references like `soleur:go` throughout the docs.
|
|
34
|
+
- The text before the first `;` is the **ceiling** (the shortcut / current limit);
|
|
35
|
+
the text after is the **upgrade trigger**.
|
|
36
|
+
- Example: `// SOLEUR-DEBT: global lock; switch to per-account locks if throughput matters`.
|
|
37
|
+
- A marker with no `;`-delimited trigger is the rot-prone case — the harvest flags
|
|
38
|
+
it `no-trigger`.
|
|
39
|
+
|
|
40
|
+
This marker is the canonical, grep-discoverable form of the in-place deferral that
|
|
41
|
+
the `wg-when-deferring-a-capability-create-a` gate prefers over filing speculative backlog
|
|
42
|
+
issues. Document a deferral here, in code, and harvest makes it visible without
|
|
43
|
+
converting every shortcut into phantom backlog.
|
|
44
|
+
|
|
45
|
+
## Run
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
bash "${CLAUDE_PLUGIN_ROOT}/skills/harvest-debt/scripts/harvest-debt.sh"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Run from the repo root. The harvester ([harvest-debt.sh](./scripts/harvest-debt.sh)):
|
|
52
|
+
|
|
53
|
+
1. Greps tracked source for `SOLEUR-DEBT:` markers.
|
|
54
|
+
2. Groups hits by file and splits each on the first `;` into ceiling + trigger.
|
|
55
|
+
3. Flags any marker with no trigger as `no-trigger`.
|
|
56
|
+
4. Prints a markdown report ending with `<N> markers, <M> with no trigger.`, or
|
|
57
|
+
`No SOLEUR-DEBT markers found.` when the tree is clean.
|
|
58
|
+
|
|
59
|
+
`--help` prints usage. The script is idempotent and read-only.
|
|
60
|
+
|
|
61
|
+
## After harvesting
|
|
62
|
+
|
|
63
|
+
For each surfaced marker, decide:
|
|
64
|
+
|
|
65
|
+
- **Worth tracking** → run [soleur:compound](../compound-capture/SKILL.md) to promote it
|
|
66
|
+
into a `technical-debt/` ledger entry, then [soleur:resolve-debt](../resolve-debt/SKILL.md)
|
|
67
|
+
to close it with a linked issue once the upgrade trigger fires.
|
|
68
|
+
- **`no-trigger`** → add the missing upgrade trigger to the comment, or delete the
|
|
69
|
+
marker if the shortcut is now permanent and accepted.
|
|
70
|
+
|
|
71
|
+
## Scope (and its one limitation)
|
|
72
|
+
|
|
73
|
+
The harvest scans CODE comments only. Prose (`*.md` — the convention doc, plans,
|
|
74
|
+
specs, SKILL bodies), `node_modules`, and build output (`_site`, `dist`, `*.min.*`)
|
|
75
|
+
are excluded so the marker DEFINITION never self-reports as debt. This is a **path
|
|
76
|
+
denylist, not a semantic check**: a `SOLEUR-DEBT:` literal placed in a non-`.md`
|
|
77
|
+
source file purely as documentation would still be reported. Keep marker examples
|
|
78
|
+
in markdown.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# harvest-debt.sh — surface inline SOLEUR-DEBT deferral markers as a ledger.
|
|
3
|
+
#
|
|
4
|
+
# Greps tracked SOURCE for `SOLEUR-DEBT:` markers, groups hits by file, splits
|
|
5
|
+
# each on the first `;` into ceiling + upgrade-trigger, and flags any marker
|
|
6
|
+
# with no trigger as `no-trigger` (the rot-prone case). Read-only: it writes
|
|
7
|
+
# nothing and closes nothing — promotion into the ledger is /soleur:compound,
|
|
8
|
+
# closure is /soleur:resolve-debt.
|
|
9
|
+
#
|
|
10
|
+
# Scope: CODE comments only. `*.md` prose (the convention doc, plans, specs,
|
|
11
|
+
# SKILL bodies) is excluded by design so the marker DEFINITION never self-reports
|
|
12
|
+
# as debt — a path denylist, not a semantic check (see SKILL.md "Scope").
|
|
13
|
+
#
|
|
14
|
+
# Usage: harvest-debt.sh [--help] (run from the repo root)
|
|
15
|
+
# Exit: 0 = clean (markers reported or none found); 2 = usage error.
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
readonly MARKER="SOLEUR-DEBT:"
|
|
19
|
+
|
|
20
|
+
usage() {
|
|
21
|
+
cat <<'EOF'
|
|
22
|
+
harvest-debt.sh — list inline SOLEUR-DEBT deferral markers, grouped by file.
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
harvest-debt.sh Harvest markers from the current git repo.
|
|
26
|
+
harvest-debt.sh --help Show this help.
|
|
27
|
+
|
|
28
|
+
A marker reads `// SOLEUR-DEBT: <ceiling>; <upgrade trigger>`. Markers with no
|
|
29
|
+
`;`-delimited trigger are flagged `no-trigger`. Read-only — promote worth-tracking
|
|
30
|
+
markers with /soleur:compound, close them with /soleur:resolve-debt.
|
|
31
|
+
EOF
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
main() {
|
|
35
|
+
case "${1:-}" in
|
|
36
|
+
-h | --help)
|
|
37
|
+
usage
|
|
38
|
+
exit 0
|
|
39
|
+
;;
|
|
40
|
+
"") ;;
|
|
41
|
+
*)
|
|
42
|
+
echo "harvest-debt: unknown argument '$1'" >&2
|
|
43
|
+
usage >&2
|
|
44
|
+
exit 2
|
|
45
|
+
;;
|
|
46
|
+
esac
|
|
47
|
+
|
|
48
|
+
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
49
|
+
echo "harvest-debt: not inside a git work tree" >&2
|
|
50
|
+
exit 2
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Anchor at the repo root so the exclude pathspecs (which are repo-root-relative)
|
|
54
|
+
# match regardless of the caller's subdirectory — enforces the "run from root"
|
|
55
|
+
# contract instead of merely documenting it.
|
|
56
|
+
cd "$(git rev-parse --show-toplevel)" || exit 2
|
|
57
|
+
|
|
58
|
+
# git grep already skips untracked paths (node_modules, .git). Exclude prose
|
|
59
|
+
# (*.md), this skill's own dir (its marker literals are definitions), and build
|
|
60
|
+
# output. git grep exits 1 on no match under pipefail — tolerate with `|| true`.
|
|
61
|
+
local hits
|
|
62
|
+
hits="$(
|
|
63
|
+
git grep -nI -F -e "$MARKER" -- \
|
|
64
|
+
':(exclude)*.md' \
|
|
65
|
+
':(exclude)plugins/soleur/skills/harvest-debt' \
|
|
66
|
+
':(exclude)*.min.*' \
|
|
67
|
+
':(exclude,glob)**/node_modules/**' \
|
|
68
|
+
':(exclude,glob)**/_site/**' \
|
|
69
|
+
':(exclude,glob)**/dist/**' \
|
|
70
|
+
2>/dev/null || true
|
|
71
|
+
)"
|
|
72
|
+
|
|
73
|
+
if [[ -z "$hits" ]]; then
|
|
74
|
+
echo "No SOLEUR-DEBT markers found."
|
|
75
|
+
exit 0
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
printf '%s\n' "$hits" | awk -v marker="$MARKER" '
|
|
79
|
+
BEGIN { total = 0; untriggered = 0; prev = "" }
|
|
80
|
+
{
|
|
81
|
+
# git grep -n emits "<file>:<lineno>:<content>". Anchor on the ":<digits>:"
|
|
82
|
+
# boundary (lineno is always numeric) so a colon WITHIN the path does not
|
|
83
|
+
# mis-peel file/lineno. Skip any line lacking that boundary.
|
|
84
|
+
if (!match($0, /:[0-9]+:/)) next
|
|
85
|
+
file = substr($0, 1, RSTART - 1)
|
|
86
|
+
rest = substr($0, RSTART + 1)
|
|
87
|
+
j = index(rest, ":"); lineno = substr(rest, 1, j - 1); content = substr(rest, j + 1)
|
|
88
|
+
|
|
89
|
+
m = index(content, marker)
|
|
90
|
+
after = substr(content, m + length(marker))
|
|
91
|
+
gsub(/^[ \t]+/, "", after); gsub(/[ \t]+$/, "", after)
|
|
92
|
+
|
|
93
|
+
s = index(after, ";")
|
|
94
|
+
if (s > 0) { ceiling = substr(after, 1, s - 1); trigger = substr(after, s + 1) }
|
|
95
|
+
else { ceiling = after; trigger = "" }
|
|
96
|
+
gsub(/[ \t]+$/, "", ceiling)
|
|
97
|
+
gsub(/^[ \t]+/, "", trigger); gsub(/[ \t]+$/, "", trigger)
|
|
98
|
+
|
|
99
|
+
if (file != prev) { printf "\n## %s\n", file; prev = file }
|
|
100
|
+
if (trigger == "") {
|
|
101
|
+
printf "- L%s — ceiling: %s — **no-trigger**\n", lineno, ceiling
|
|
102
|
+
untriggered++
|
|
103
|
+
} else {
|
|
104
|
+
printf "- L%s — ceiling: %s — trigger: %s\n", lineno, ceiling, trigger
|
|
105
|
+
}
|
|
106
|
+
total++
|
|
107
|
+
}
|
|
108
|
+
END {
|
|
109
|
+
printf "\n%d marker%s, %d with no trigger.\n", total, (total == 1 ? "" : "s"), untriggered
|
|
110
|
+
}
|
|
111
|
+
'
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
main "$@"
|