@soleur/opencode 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +659 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +108 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +342 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +152 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +493 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +363 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +520 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +113 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +178 -0
- package/scripts/sync-opencode-adapter.ts +479 -0
- package/scripts/sync-pr-behind.sh +534 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +65 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +142 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +118 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +668 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +325 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +138 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1621 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3022 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +149 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/work/SKILL.md +1479 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""resolve-debt — read + close half of the technical-debt ledger loop.
|
|
3
|
+
|
|
4
|
+
Modes:
|
|
5
|
+
--list Print a deterministic markdown table of open entries.
|
|
6
|
+
--no-verify Skip `gh issue view` round-trip when closing.
|
|
7
|
+
--ledger <path> Override ledger root (testing).
|
|
8
|
+
--help Print usage and exit.
|
|
9
|
+
(default) Interactive close flow.
|
|
10
|
+
|
|
11
|
+
Frontmatter parsing uses `scripts/frontmatter_lib.py` from the repo root
|
|
12
|
+
(shared helper module — also consumed by `scripts/backfill-frontmatter.py`).
|
|
13
|
+
Close mutation does surgical line-level edits to preserve key order.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
import contextlib
|
|
18
|
+
import hashlib
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
import tempfile
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any, Callable
|
|
26
|
+
|
|
27
|
+
LEDGER_DEFAULT = "knowledge-base/project/learnings/technical-debt"
|
|
28
|
+
SEVERITY_RANK = {"high": 0, "medium": 1, "low": 2}
|
|
29
|
+
LINKED_ISSUE_MIN = 1
|
|
30
|
+
LINKED_ISSUE_MAX = 9_999_999
|
|
31
|
+
GH_TIMEOUT_SECONDS = 5
|
|
32
|
+
MAX_PROMPT_ATTEMPTS = 3
|
|
33
|
+
VALID_STATUSES = ("open", "resolved", "wont-fix")
|
|
34
|
+
CLOSE_STATUSES = ("resolved", "wont-fix")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def repo_root() -> Path:
|
|
38
|
+
"""Find the repo root by walking up to an AGENTS.md + plugins/ anchor."""
|
|
39
|
+
here = Path(__file__).resolve()
|
|
40
|
+
for parent in [here, *here.parents]:
|
|
41
|
+
if (parent / "AGENTS.md").exists() and (parent / "plugins").is_dir():
|
|
42
|
+
return parent
|
|
43
|
+
sys.exit(
|
|
44
|
+
"ERROR: cannot locate repo root (AGENTS.md + plugins/ anchor missing). "
|
|
45
|
+
"resolve-debt must run from inside a Soleur checkout."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def load_frontmatter_helpers() -> Callable[[str], tuple]:
|
|
50
|
+
"""Load parse_frontmatter from scripts/frontmatter_lib.py via sys.path."""
|
|
51
|
+
scripts_dir = repo_root() / "scripts"
|
|
52
|
+
lib = scripts_dir / "frontmatter_lib.py"
|
|
53
|
+
if not lib.exists():
|
|
54
|
+
sys.exit(f"ERROR: required helper not found: {lib}")
|
|
55
|
+
if str(scripts_dir) not in sys.path:
|
|
56
|
+
sys.path.insert(0, str(scripts_dir))
|
|
57
|
+
from frontmatter_lib import parse_frontmatter # noqa: E402
|
|
58
|
+
|
|
59
|
+
return parse_frontmatter
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def list_open_entries(
|
|
63
|
+
ledger: Path, parse_frontmatter: Callable[[str], tuple]
|
|
64
|
+
) -> list[tuple[Path, dict]]:
|
|
65
|
+
"""Walk ledger, parse each *.md, return list of (path, fm) for status==open.
|
|
66
|
+
|
|
67
|
+
Sorted by severity desc (high>medium>low>unset), then date asc.
|
|
68
|
+
Warns to stderr on parse failure and skips that file.
|
|
69
|
+
"""
|
|
70
|
+
if not ledger.exists():
|
|
71
|
+
return []
|
|
72
|
+
entries = []
|
|
73
|
+
for fp in sorted(ledger.iterdir()):
|
|
74
|
+
if fp.is_dir() or not fp.name.endswith(".md"):
|
|
75
|
+
continue
|
|
76
|
+
try:
|
|
77
|
+
content = fp.read_text()
|
|
78
|
+
except OSError as e:
|
|
79
|
+
print(f"WARN: cannot read {fp.name}: {e}", file=sys.stderr)
|
|
80
|
+
continue
|
|
81
|
+
fm, _body, _raw = parse_frontmatter(content)
|
|
82
|
+
if fm is None:
|
|
83
|
+
print(f"WARN: malformed frontmatter, skipping: {fp.name}", file=sys.stderr)
|
|
84
|
+
continue
|
|
85
|
+
if fm.get("status") != "open":
|
|
86
|
+
continue
|
|
87
|
+
entries.append((fp, fm))
|
|
88
|
+
|
|
89
|
+
def sort_key(item):
|
|
90
|
+
_fp, fm = item
|
|
91
|
+
sev = SEVERITY_RANK.get(str(fm.get("severity", "")).lower(), 99)
|
|
92
|
+
return (sev, str(fm.get("date", "")))
|
|
93
|
+
|
|
94
|
+
entries.sort(key=sort_key)
|
|
95
|
+
return entries
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def render_table(entries: list[tuple[Path, dict]]) -> str:
|
|
99
|
+
"""Render entries as a markdown table (idx, file, date, severity, comp/cat, title)."""
|
|
100
|
+
if not entries:
|
|
101
|
+
return "No open debt entries."
|
|
102
|
+
header = "| idx | file | date | severity | component/category | title |"
|
|
103
|
+
sep = "|-----|------|------|----------|--------------------|-------|"
|
|
104
|
+
rows = [header, sep]
|
|
105
|
+
for i, (fp, fm) in enumerate(entries, start=1):
|
|
106
|
+
comp_or_cat = fm.get("component") or fm.get("category") or "-"
|
|
107
|
+
title = fm.get("title") or fp.stem
|
|
108
|
+
date = fm.get("date", "-")
|
|
109
|
+
sev = fm.get("severity", "-")
|
|
110
|
+
rows.append(
|
|
111
|
+
f"| {i} | {fp.name} | {date} | {sev} | {comp_or_cat} | {title} |"
|
|
112
|
+
)
|
|
113
|
+
return "\n".join(rows)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def prompt_with_retry(
|
|
117
|
+
prompt: str,
|
|
118
|
+
validate: Callable[[str], tuple[bool, Any]],
|
|
119
|
+
*,
|
|
120
|
+
attempts: int = MAX_PROMPT_ATTEMPTS,
|
|
121
|
+
) -> Any:
|
|
122
|
+
"""Prompt until validate returns (True, value) or attempts exhausted.
|
|
123
|
+
|
|
124
|
+
validate(raw_input) -> (ok: bool, value_or_msg).
|
|
125
|
+
Returns the validated value, or sys.exit(2) on exhaustion.
|
|
126
|
+
"""
|
|
127
|
+
for _ in range(attempts):
|
|
128
|
+
try:
|
|
129
|
+
raw = input(prompt)
|
|
130
|
+
except EOFError:
|
|
131
|
+
sys.exit(2)
|
|
132
|
+
ok, val_or_msg = validate(raw)
|
|
133
|
+
if ok:
|
|
134
|
+
return val_or_msg
|
|
135
|
+
print(f" invalid: {val_or_msg}", file=sys.stderr)
|
|
136
|
+
print(" too many invalid attempts; aborting.", file=sys.stderr)
|
|
137
|
+
sys.exit(2)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def validate_selection(raw: str, n: int) -> tuple[bool, Any]:
|
|
141
|
+
raw = raw.strip()
|
|
142
|
+
if raw.lower() == "q":
|
|
143
|
+
return True, "quit"
|
|
144
|
+
try:
|
|
145
|
+
idx = int(raw)
|
|
146
|
+
except ValueError:
|
|
147
|
+
return False, f"'{raw}' is not an integer"
|
|
148
|
+
if not (1 <= idx <= n):
|
|
149
|
+
return False, f"{idx} out of range 1..{n}"
|
|
150
|
+
return True, idx
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def validate_status(raw: str) -> tuple[bool, Any]:
|
|
154
|
+
raw = raw.strip().lower()
|
|
155
|
+
if raw in CLOSE_STATUSES:
|
|
156
|
+
return True, raw
|
|
157
|
+
return False, f"'{raw}' is not 'resolved' or 'wont-fix'"
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def validate_linked_issue(raw: str, *, required: bool) -> tuple[bool, Any]:
|
|
161
|
+
raw = raw.strip()
|
|
162
|
+
if not raw:
|
|
163
|
+
if required:
|
|
164
|
+
return False, "linked_issue is required when status=resolved"
|
|
165
|
+
return True, None
|
|
166
|
+
try:
|
|
167
|
+
n = int(raw)
|
|
168
|
+
except ValueError:
|
|
169
|
+
return False, f"'{raw}' is not an integer"
|
|
170
|
+
if not (LINKED_ISSUE_MIN <= n <= LINKED_ISSUE_MAX):
|
|
171
|
+
return False, f"{n} out of range {LINKED_ISSUE_MIN}..{LINKED_ISSUE_MAX}"
|
|
172
|
+
return True, n
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def verify_issue_via_gh(issue_n: int) -> None:
|
|
176
|
+
"""Call `gh issue view <N>`; exit 1 with --no-verify hint on failure."""
|
|
177
|
+
try:
|
|
178
|
+
result = subprocess.run(
|
|
179
|
+
["gh", "issue", "view", str(issue_n), "--json", "state,title"],
|
|
180
|
+
capture_output=True,
|
|
181
|
+
text=True,
|
|
182
|
+
timeout=GH_TIMEOUT_SECONDS,
|
|
183
|
+
)
|
|
184
|
+
except FileNotFoundError:
|
|
185
|
+
print(
|
|
186
|
+
"gh issue view failed (gh not on PATH). "
|
|
187
|
+
"Re-invoke with --no-verify to skip validation.",
|
|
188
|
+
file=sys.stderr,
|
|
189
|
+
)
|
|
190
|
+
sys.exit(1)
|
|
191
|
+
except subprocess.TimeoutExpired:
|
|
192
|
+
print(
|
|
193
|
+
f"gh issue view failed (timeout after {GH_TIMEOUT_SECONDS}s). "
|
|
194
|
+
"Re-invoke with --no-verify to skip validation.",
|
|
195
|
+
file=sys.stderr,
|
|
196
|
+
)
|
|
197
|
+
sys.exit(1)
|
|
198
|
+
if result.returncode != 0:
|
|
199
|
+
stderr = result.stderr.strip() or "non-zero exit"
|
|
200
|
+
print(
|
|
201
|
+
f"gh issue view failed ({stderr}). "
|
|
202
|
+
"Re-invoke with --no-verify to skip validation.",
|
|
203
|
+
file=sys.stderr,
|
|
204
|
+
)
|
|
205
|
+
sys.exit(1)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def find_frontmatter_block(lines: list[str]) -> tuple[int, int] | None:
|
|
209
|
+
"""Return (start, end) line indices of `---` boundaries, or None."""
|
|
210
|
+
if not lines or lines[0].strip() != "---":
|
|
211
|
+
return None
|
|
212
|
+
for i in range(1, min(len(lines), 30)):
|
|
213
|
+
if lines[i].strip() == "---":
|
|
214
|
+
return (0, i)
|
|
215
|
+
return None
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _note(exc: BaseException, site: str) -> None:
|
|
219
|
+
# Class name and a static site label only. Never str(exc)/repr(exc): exception text can carry a path or
|
|
220
|
+
# ledger content. `site` is a string literal at every call site.
|
|
221
|
+
# A closed, full or missing stderr (None when fd 2 is closed) must not turn a swallowed error into a crash.
|
|
222
|
+
with contextlib.suppress(OSError, ValueError, AttributeError):
|
|
223
|
+
sys.stderr.write("resolve-debt: swallowed %s at %s\n" % (type(exc).__name__, site))
|
|
224
|
+
sys.stderr.flush()
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def mutate_entry(fp: Path, new_status: str, linked_issue: int | None) -> None:
|
|
228
|
+
"""Rewrite the entry's frontmatter: replace status:, optionally insert linked_issue:.
|
|
229
|
+
|
|
230
|
+
Atomic via tempfile + os.replace. Asserts body MD5 unchanged (defense
|
|
231
|
+
against CRLF/EOL drift and accidental body mutation). Raises on
|
|
232
|
+
structural failure or prior-status-not-in-enum.
|
|
233
|
+
"""
|
|
234
|
+
if new_status == "open" and linked_issue is not None:
|
|
235
|
+
sys.exit(
|
|
236
|
+
"ERROR: linked_issue is forbidden when status=open "
|
|
237
|
+
"(see knowledge-base/project/learnings/technical-debt/README.md)."
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
text = fp.read_text()
|
|
241
|
+
lines = text.split("\n")
|
|
242
|
+
bounds = find_frontmatter_block(lines)
|
|
243
|
+
if bounds is None:
|
|
244
|
+
sys.exit(f"ERROR: cannot locate frontmatter block in {fp.name}")
|
|
245
|
+
start, end = bounds
|
|
246
|
+
|
|
247
|
+
# Capture body hash BEFORE mutation. Mutations are line-level inside the
|
|
248
|
+
# frontmatter block; the body (lines after the closing `---`) must round-
|
|
249
|
+
# trip byte-for-byte.
|
|
250
|
+
body_before = "\n".join(lines[end + 1 :])
|
|
251
|
+
body_hash_before = hashlib.md5(body_before.encode()).hexdigest()
|
|
252
|
+
|
|
253
|
+
new_lines = list(lines)
|
|
254
|
+
status_idx = None
|
|
255
|
+
linked_idx = None
|
|
256
|
+
prior_status_value = None
|
|
257
|
+
for i in range(start + 1, end):
|
|
258
|
+
stripped = new_lines[i].lstrip()
|
|
259
|
+
if stripped.startswith("status:"):
|
|
260
|
+
status_idx = i
|
|
261
|
+
prior_status_value = stripped.split(":", 1)[1].strip()
|
|
262
|
+
elif stripped.startswith("linked_issue:"):
|
|
263
|
+
linked_idx = i
|
|
264
|
+
|
|
265
|
+
if status_idx is None:
|
|
266
|
+
sys.exit(f"ERROR: no status: line in {fp.name} (Phase 1 backfill skipped?)")
|
|
267
|
+
|
|
268
|
+
if prior_status_value not in VALID_STATUSES:
|
|
269
|
+
sys.exit(
|
|
270
|
+
f"ERROR: {fp.name} has out-of-enum prior status "
|
|
271
|
+
f"'{prior_status_value}' (expected one of {VALID_STATUSES}). "
|
|
272
|
+
"Inspect manually before mutating."
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
new_lines[status_idx] = f"status: {new_status}"
|
|
276
|
+
|
|
277
|
+
if linked_issue is not None:
|
|
278
|
+
line = f"linked_issue: {linked_issue}"
|
|
279
|
+
if linked_idx is not None:
|
|
280
|
+
new_lines[linked_idx] = line
|
|
281
|
+
else:
|
|
282
|
+
new_lines.insert(status_idx + 1, line)
|
|
283
|
+
else:
|
|
284
|
+
# wont-fix with no linked_issue: leave any existing linked_issue alone.
|
|
285
|
+
pass
|
|
286
|
+
|
|
287
|
+
new_text = "\n".join(new_lines)
|
|
288
|
+
|
|
289
|
+
# Re-locate frontmatter boundary in the mutated lines so we can verify
|
|
290
|
+
# body integrity by hash. If insertion shifted the closing ---, end+1
|
|
291
|
+
# → end+2 in new_lines.
|
|
292
|
+
new_bounds = find_frontmatter_block(new_lines)
|
|
293
|
+
if new_bounds is None:
|
|
294
|
+
sys.exit(f"ERROR: post-mutation frontmatter block missing in {fp.name}")
|
|
295
|
+
_, new_end = new_bounds
|
|
296
|
+
body_after = "\n".join(new_lines[new_end + 1 :])
|
|
297
|
+
body_hash_after = hashlib.md5(body_after.encode()).hexdigest()
|
|
298
|
+
if body_hash_before != body_hash_after:
|
|
299
|
+
sys.exit(
|
|
300
|
+
f"ERROR: body hash drift on {fp.name} "
|
|
301
|
+
f"(before={body_hash_before}, after={body_hash_after}). "
|
|
302
|
+
"Mutation aborted; no file written."
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Atomic write: tempfile in same dir, then os.replace.
|
|
306
|
+
fd, tmp_path = tempfile.mkstemp(
|
|
307
|
+
prefix=fp.name + ".", suffix=".tmp", dir=str(fp.parent)
|
|
308
|
+
)
|
|
309
|
+
try:
|
|
310
|
+
with os.fdopen(fd, "w") as f:
|
|
311
|
+
f.write(new_text)
|
|
312
|
+
os.replace(tmp_path, str(fp))
|
|
313
|
+
except Exception:
|
|
314
|
+
try:
|
|
315
|
+
os.unlink(tmp_path)
|
|
316
|
+
except OSError as exc:
|
|
317
|
+
_note(exc, "tmp-cleanup")
|
|
318
|
+
raise
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def print_diff(fp: Path) -> None:
|
|
322
|
+
"""Print `git diff -- <fp>` to stdout. Warn loudly on git failure.
|
|
323
|
+
|
|
324
|
+
Silent on FileNotFoundError (git missing) since the script's contract
|
|
325
|
+
is "mutate atomically + print diff for review"; if git is unreachable
|
|
326
|
+
the operator can run `diff` themselves, but we must SAY SO rather than
|
|
327
|
+
leave the call site believing the diff was rendered.
|
|
328
|
+
"""
|
|
329
|
+
try:
|
|
330
|
+
result = subprocess.run(
|
|
331
|
+
["git", "diff", "--", str(fp)],
|
|
332
|
+
check=False,
|
|
333
|
+
)
|
|
334
|
+
except FileNotFoundError:
|
|
335
|
+
print(
|
|
336
|
+
f"WARN: git not on PATH. Mutation succeeded; inspect {fp} manually.",
|
|
337
|
+
file=sys.stderr,
|
|
338
|
+
)
|
|
339
|
+
return
|
|
340
|
+
if result.returncode != 0:
|
|
341
|
+
print(
|
|
342
|
+
f"WARN: git diff failed (rc={result.returncode}). "
|
|
343
|
+
f"Mutation succeeded; inspect {fp} manually.",
|
|
344
|
+
file=sys.stderr,
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def render_json(entries: list[tuple[Path, dict]]) -> str:
|
|
349
|
+
"""Render entries as a JSON array (for agent/loop consumption).
|
|
350
|
+
|
|
351
|
+
PyYAML returns `datetime.date` for ISO dates; coerce all values to
|
|
352
|
+
JSON-safe primitives so the default encoder doesn't raise.
|
|
353
|
+
"""
|
|
354
|
+
def _safe(v: Any) -> Any:
|
|
355
|
+
if v is None or isinstance(v, (str, int, float, bool, list, dict)):
|
|
356
|
+
return v
|
|
357
|
+
return str(v)
|
|
358
|
+
|
|
359
|
+
rows = []
|
|
360
|
+
for i, (fp, fm) in enumerate(entries, start=1):
|
|
361
|
+
rows.append(
|
|
362
|
+
{
|
|
363
|
+
"idx": i,
|
|
364
|
+
"file": fp.name,
|
|
365
|
+
"date": _safe(fm.get("date")),
|
|
366
|
+
"severity": _safe(fm.get("severity")),
|
|
367
|
+
"component_or_category": _safe(fm.get("component") or fm.get("category")),
|
|
368
|
+
"title": _safe(fm.get("title") or fp.stem),
|
|
369
|
+
"status": _safe(fm.get("status")),
|
|
370
|
+
}
|
|
371
|
+
)
|
|
372
|
+
return json.dumps(rows, indent=2)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def cmd_list(
|
|
376
|
+
ledger: Path, parse_frontmatter: Callable[[str], tuple], *, as_json: bool
|
|
377
|
+
) -> int:
|
|
378
|
+
entries = list_open_entries(ledger, parse_frontmatter)
|
|
379
|
+
if as_json:
|
|
380
|
+
print(render_json(entries))
|
|
381
|
+
else:
|
|
382
|
+
print(render_table(entries))
|
|
383
|
+
return 0
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def cmd_close_noninteractive(
|
|
387
|
+
ledger: Path,
|
|
388
|
+
parse_frontmatter: Callable[[str], tuple],
|
|
389
|
+
*,
|
|
390
|
+
close_idx: int,
|
|
391
|
+
new_status: str,
|
|
392
|
+
linked_issue: int | None,
|
|
393
|
+
verify: bool,
|
|
394
|
+
allow_fixture: bool,
|
|
395
|
+
) -> int:
|
|
396
|
+
"""Close a single entry without prompts. For /loop and agent composition.
|
|
397
|
+
|
|
398
|
+
Reuses the same validation surface as interactive mode (status enum,
|
|
399
|
+
linked_issue range, fixture-path refusal, gh verify, atomic mutation,
|
|
400
|
+
body MD5). Re-resolves the entry index against the current sorted
|
|
401
|
+
--list ordering so external `--list --json` → `--close N` pipelines
|
|
402
|
+
are coherent.
|
|
403
|
+
"""
|
|
404
|
+
ledger_str = str(ledger.resolve())
|
|
405
|
+
if "/test/fixtures/" in ledger_str and not allow_fixture:
|
|
406
|
+
sys.exit(
|
|
407
|
+
f"ERROR: refusing to mutate fixtures under {ledger_str}. "
|
|
408
|
+
"Pass --allow-fixture to override (test smoke-runs only)."
|
|
409
|
+
)
|
|
410
|
+
if new_status not in CLOSE_STATUSES:
|
|
411
|
+
sys.exit(
|
|
412
|
+
f"ERROR: --status must be one of {CLOSE_STATUSES}; got '{new_status}'."
|
|
413
|
+
)
|
|
414
|
+
if new_status == "resolved" and linked_issue is None:
|
|
415
|
+
sys.exit("ERROR: --linked-issue is required when --status=resolved.")
|
|
416
|
+
entries = list_open_entries(ledger, parse_frontmatter)
|
|
417
|
+
if not entries:
|
|
418
|
+
sys.exit("ERROR: no open entries to close.")
|
|
419
|
+
if not (1 <= close_idx <= len(entries)):
|
|
420
|
+
sys.exit(
|
|
421
|
+
f"ERROR: --close index {close_idx} out of range 1..{len(entries)}."
|
|
422
|
+
)
|
|
423
|
+
fp, _fm = entries[close_idx - 1]
|
|
424
|
+
if verify and linked_issue is not None:
|
|
425
|
+
verify_issue_via_gh(linked_issue)
|
|
426
|
+
mutate_entry(fp, new_status, linked_issue)
|
|
427
|
+
print_diff(fp)
|
|
428
|
+
print(
|
|
429
|
+
f"Diff above. Review and commit when ready. To undo: git checkout -- {fp}. "
|
|
430
|
+
"No auto-commit by design.",
|
|
431
|
+
file=sys.stderr,
|
|
432
|
+
)
|
|
433
|
+
return 0
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def cmd_interactive(
|
|
437
|
+
ledger: Path,
|
|
438
|
+
parse_frontmatter: Callable[[str], tuple],
|
|
439
|
+
*,
|
|
440
|
+
verify: bool,
|
|
441
|
+
allow_fixture: bool,
|
|
442
|
+
) -> int:
|
|
443
|
+
# Refuse to mutate fixtures by default — the interactive flow rewrites
|
|
444
|
+
# files in place, and an operator running smoke tests against fixture
|
|
445
|
+
# paths under plugins/**/test/fixtures/** would otherwise create a
|
|
446
|
+
# mutated-fixture commit risk (see #3645 review F6).
|
|
447
|
+
ledger_str = str(ledger.resolve())
|
|
448
|
+
if "/test/fixtures/" in ledger_str and not allow_fixture:
|
|
449
|
+
sys.exit(
|
|
450
|
+
f"ERROR: refusing to mutate fixtures under {ledger_str}. "
|
|
451
|
+
"Pass --allow-fixture to override (test smoke-runs only)."
|
|
452
|
+
)
|
|
453
|
+
entries = list_open_entries(ledger, parse_frontmatter)
|
|
454
|
+
if not entries:
|
|
455
|
+
print("No open debt entries.")
|
|
456
|
+
return 0
|
|
457
|
+
print(render_table(entries))
|
|
458
|
+
|
|
459
|
+
sel = prompt_with_retry(
|
|
460
|
+
f"Select entry (1..{len(entries)}) or q to quit: ",
|
|
461
|
+
lambda r: validate_selection(r, len(entries)),
|
|
462
|
+
)
|
|
463
|
+
if sel == "quit":
|
|
464
|
+
return 0
|
|
465
|
+
fp, _fm = entries[sel - 1]
|
|
466
|
+
|
|
467
|
+
new_status = prompt_with_retry(
|
|
468
|
+
"Status (resolved | wont-fix): ", validate_status
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
linked_issue = None
|
|
472
|
+
if new_status == "resolved":
|
|
473
|
+
linked_issue = prompt_with_retry(
|
|
474
|
+
"linked_issue (integer, e.g., 2723): ",
|
|
475
|
+
lambda r: validate_linked_issue(r, required=True),
|
|
476
|
+
)
|
|
477
|
+
else: # wont-fix — optional
|
|
478
|
+
linked_issue = prompt_with_retry(
|
|
479
|
+
"linked_issue (integer, optional — press enter to skip): ",
|
|
480
|
+
lambda r: validate_linked_issue(r, required=False),
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
if verify and linked_issue is not None:
|
|
484
|
+
verify_issue_via_gh(linked_issue)
|
|
485
|
+
|
|
486
|
+
mutate_entry(fp, new_status, linked_issue)
|
|
487
|
+
print_diff(fp)
|
|
488
|
+
print(
|
|
489
|
+
f"Diff above. Review and commit when ready. To undo: git checkout -- {fp}. "
|
|
490
|
+
"No auto-commit by design.",
|
|
491
|
+
file=sys.stderr,
|
|
492
|
+
)
|
|
493
|
+
return 0
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
def main() -> int:
|
|
497
|
+
parser = argparse.ArgumentParser(
|
|
498
|
+
prog="resolve-debt",
|
|
499
|
+
description="Triage and close entries in the technical-debt ledger.",
|
|
500
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
501
|
+
epilog=(
|
|
502
|
+
"Modes:\n"
|
|
503
|
+
" --list Print open entries as a markdown table.\n"
|
|
504
|
+
" --list --json Print open entries as JSON (for agents).\n"
|
|
505
|
+
" --close N --status S [--linked-issue N] Non-interactive close.\n"
|
|
506
|
+
" --no-verify Skip `gh issue view` when closing.\n"
|
|
507
|
+
" --ledger <path> Override ledger root (testing).\n"
|
|
508
|
+
" --allow-fixture Permit mutation under test/fixtures/.\n"
|
|
509
|
+
" (no flags) Interactive close flow.\n"
|
|
510
|
+
"\n"
|
|
511
|
+
"The skill never auto-commits. After mutation, it prints the diff\n"
|
|
512
|
+
"and stops. To undo: `git checkout -- <file>` (pre-commit) or\n"
|
|
513
|
+
"`git revert` (post-commit).\n"
|
|
514
|
+
),
|
|
515
|
+
)
|
|
516
|
+
parser.add_argument("--list", action="store_true", help="list open entries; no prompts")
|
|
517
|
+
parser.add_argument(
|
|
518
|
+
"--json",
|
|
519
|
+
action="store_true",
|
|
520
|
+
help="with --list, emit JSON instead of markdown (for agents / /loop)",
|
|
521
|
+
)
|
|
522
|
+
parser.add_argument("--no-verify", action="store_true", help="skip `gh issue view` validation")
|
|
523
|
+
parser.add_argument(
|
|
524
|
+
"--ledger",
|
|
525
|
+
default=None,
|
|
526
|
+
help=f"ledger directory (default: {LEDGER_DEFAULT})",
|
|
527
|
+
)
|
|
528
|
+
parser.add_argument(
|
|
529
|
+
"--allow-fixture",
|
|
530
|
+
action="store_true",
|
|
531
|
+
help="allow mutation against test/fixtures/ paths (smoke-runs only)",
|
|
532
|
+
)
|
|
533
|
+
parser.add_argument(
|
|
534
|
+
"--close",
|
|
535
|
+
type=int,
|
|
536
|
+
default=None,
|
|
537
|
+
metavar="IDX",
|
|
538
|
+
help="non-interactive close: target the IDX-th open entry (1-based, same order as --list)",
|
|
539
|
+
)
|
|
540
|
+
parser.add_argument(
|
|
541
|
+
"--status",
|
|
542
|
+
default=None,
|
|
543
|
+
choices=list(CLOSE_STATUSES),
|
|
544
|
+
help="with --close: new status (resolved|wont-fix)",
|
|
545
|
+
)
|
|
546
|
+
parser.add_argument(
|
|
547
|
+
"--linked-issue",
|
|
548
|
+
type=int,
|
|
549
|
+
default=None,
|
|
550
|
+
help="with --close: linked GitHub issue number (required for resolved)",
|
|
551
|
+
)
|
|
552
|
+
args = parser.parse_args()
|
|
553
|
+
|
|
554
|
+
parse_frontmatter = load_frontmatter_helpers()
|
|
555
|
+
ledger = Path(args.ledger) if args.ledger else (repo_root() / LEDGER_DEFAULT)
|
|
556
|
+
|
|
557
|
+
if args.list:
|
|
558
|
+
return cmd_list(ledger, parse_frontmatter, as_json=args.json)
|
|
559
|
+
if args.close is not None:
|
|
560
|
+
if args.status is None:
|
|
561
|
+
sys.exit("ERROR: --status is required with --close.")
|
|
562
|
+
if args.linked_issue is not None:
|
|
563
|
+
ok, msg = validate_linked_issue(str(args.linked_issue), required=False)
|
|
564
|
+
if not ok:
|
|
565
|
+
sys.exit(f"ERROR: --linked-issue invalid: {msg}")
|
|
566
|
+
return cmd_close_noninteractive(
|
|
567
|
+
ledger,
|
|
568
|
+
parse_frontmatter,
|
|
569
|
+
close_idx=args.close,
|
|
570
|
+
new_status=args.status,
|
|
571
|
+
linked_issue=args.linked_issue,
|
|
572
|
+
verify=not args.no_verify,
|
|
573
|
+
allow_fixture=args.allow_fixture,
|
|
574
|
+
)
|
|
575
|
+
return cmd_interactive(
|
|
576
|
+
ledger,
|
|
577
|
+
parse_frontmatter,
|
|
578
|
+
verify=not args.no_verify,
|
|
579
|
+
allow_fixture=args.allow_fixture,
|
|
580
|
+
)
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
if __name__ == "__main__":
|
|
584
|
+
sys.exit(main())
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: resolve-parallel
|
|
3
|
+
description: "This skill should be used when resolving all TODO comments in the codebase using parallel processing. It analyzes dependencies, creates a resolution plan with a mermaid flow diagram, and spawns parallel resolver agents."
|
|
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
|
+
> **Dynamic-workflow alternative (opt-in).** A [`Workflow`-tool](https://claude.com/blog/introducing-dynamic-workflows-in-claude-code) port of this skill lives at [`workflows/resolve-parallel.workflow.js`](./workflows/resolve-parallel.workflow.js) — deterministic fan-out, journaled resume, schema-validated output. Run it with `Workflow({ scriptPath: "plugins/soleur/skills/resolve-parallel/workflows/resolve-parallel.workflow.js", args: ... })`. The prose skill below stays the default; the two coexist during calibration. See [`knowledge-base/project/specs/archive/20261013-032858-feat-review-workflow-prototype/spec.md`](../../../../knowledge-base/project/specs/archive/20261013-032858-feat-review-workflow-prototype/spec.md).
|
|
15
|
+
|
|
16
|
+
# Resolve TODO Comments in Parallel
|
|
17
|
+
|
|
18
|
+
Resolve all TODO comments using parallel processing.
|
|
19
|
+
|
|
20
|
+
## Workflow
|
|
21
|
+
|
|
22
|
+
### 1. Analyze
|
|
23
|
+
|
|
24
|
+
Gather the TODO items from the codebase.
|
|
25
|
+
|
|
26
|
+
### 2. Plan
|
|
27
|
+
|
|
28
|
+
Create a TodoWrite list of all unresolved items grouped by type. Look at dependencies that might occur and prioritize the ones needed by others. For example, if a name change is needed, wait to do the dependents. Output a mermaid flow diagram showing how the work can proceed. Can everything run in parallel? Does one item need to complete first before others can start? Structure the to-dos in the mermaid diagram flow-wise so the agent knows how to proceed in order.
|
|
29
|
+
|
|
30
|
+
### 3. Implement (PARALLEL)
|
|
31
|
+
|
|
32
|
+
Spawn a soleur:engineering:workflow:pr-comment-resolver agent for each unresolved item in parallel.
|
|
33
|
+
|
|
34
|
+
So if there are 3 items, spawn 3 soleur:engineering:workflow:pr-comment-resolver agents in parallel:
|
|
35
|
+
|
|
36
|
+
1. Task soleur:engineering:workflow:pr-comment-resolver(item1)
|
|
37
|
+
2. Task soleur:engineering:workflow:pr-comment-resolver(item2)
|
|
38
|
+
3. Task soleur:engineering:workflow:pr-comment-resolver(item3)
|
|
39
|
+
|
|
40
|
+
Always run all in parallel subagents/Tasks for each Todo item.
|
|
41
|
+
|
|
42
|
+
### 4. Commit & Resolve
|
|
43
|
+
|
|
44
|
+
- Commit changes
|
|
45
|
+
- Push to remote
|