@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,88 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Concierge repo-readiness gate (fix-concierge-repo-readiness-gate):
|
|
3
|
+
# worktree-manager.sh must FAIL LOUD when invoked in a workspace that has no git
|
|
4
|
+
# repository at all (the Concierge cloud env when a connected repo's clone is
|
|
5
|
+
# still in flight, or its self-heal clone failed). Previously the `create` path
|
|
6
|
+
# died silently under `set -e` on `git rev-parse --show-toplevel`, so the
|
|
7
|
+
# skill (go/one-shot) saw no clear signal and the agent improvised ~40 varied
|
|
8
|
+
# exploration commands (evading the narrow cd-&&-pwd-loop runtime detector from
|
|
9
|
+
# #5313) before the session hung. The fix emits a distinct `NO_GIT_REPOSITORY`
|
|
10
|
+
# marker + non-zero exit so the skill can stop with an honest, no-wait message.
|
|
11
|
+
#
|
|
12
|
+
# Run via: bash plugins/soleur/skills/git-worktree/test/no-repo-fail-loud.test.sh
|
|
13
|
+
|
|
14
|
+
set -uo pipefail
|
|
15
|
+
|
|
16
|
+
# Git-location tripwire (#7833). These suites drive worktree-manager.sh, which runs
|
|
17
|
+
# `git worktree remove`, `git branch -D` and `git reset --hard` -- the highest-damage git writes
|
|
18
|
+
# in the corpus. An inherited GIT_DIR aims all of them at the developer's real repository, so
|
|
19
|
+
# this file aborts rather than proceeding. Inline rather than sourcing test-helpers.sh, which
|
|
20
|
+
# would also import an assertion framework these suites do not use.
|
|
21
|
+
for _v in GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY \
|
|
22
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE GIT_TEMPLATE_DIR GIT_EXEC_PATH; do
|
|
23
|
+
if [[ -n "${!_v:-}" && "${SOLEUR_GIT_TRIPWIRE_ALLOW:-0}" != "1" ]]; then
|
|
24
|
+
printf 'FATAL: %s started with an inherited git-location environment (%s=%s).\n' \
|
|
25
|
+
"${BASH_SOURCE[0]}" "$_v" "${!_v}" >&2
|
|
26
|
+
printf 'Fix the ENTRY POINT: unset %s && <runner>\n' "$_v" >&2
|
|
27
|
+
exit 97
|
|
28
|
+
fi
|
|
29
|
+
done
|
|
30
|
+
unset _v
|
|
31
|
+
|
|
32
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)"
|
|
33
|
+
WM="$REPO_ROOT/plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh"
|
|
34
|
+
|
|
35
|
+
PASS=0; FAIL=0
|
|
36
|
+
fail() { echo " FAIL: $1"; FAIL=$((FAIL+1)); }
|
|
37
|
+
pass() { echo " pass: $1"; PASS=$((PASS+1)); }
|
|
38
|
+
|
|
39
|
+
TMP=$(mktemp -d)
|
|
40
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
41
|
+
|
|
42
|
+
# A workspace dir that is NOT a git repo (no `.git`) — mirrors a Concierge
|
|
43
|
+
# /workspaces/<id> whose clone never landed. GIT_CEILING_DIRECTORIES stops git
|
|
44
|
+
# from discovering an ancestor repo (e.g. the soleur checkout hosting this test).
|
|
45
|
+
NOREPO="$TMP/workspace"
|
|
46
|
+
mkdir -p "$NOREPO"
|
|
47
|
+
export GIT_CEILING_DIRECTORIES="$TMP"
|
|
48
|
+
|
|
49
|
+
# --- AC1: `create` exits non-zero in a repo-less workspace ---
|
|
50
|
+
(
|
|
51
|
+
cd "$NOREPO"
|
|
52
|
+
bash "$WM" --yes create feat-x
|
|
53
|
+
) >"$TMP/out.log" 2>&1
|
|
54
|
+
RC=$?
|
|
55
|
+
[[ "$RC" -ne 0 ]] \
|
|
56
|
+
&& pass "AC1: create exits non-zero in a repo-less workspace (rc=$RC)" \
|
|
57
|
+
|| fail "AC1: create exited 0 in a repo-less workspace (should fail loud)"
|
|
58
|
+
|
|
59
|
+
# --- AC2: output carries the machine-detectable NO_GIT_REPOSITORY marker ---
|
|
60
|
+
grep -q "NO_GIT_REPOSITORY" "$TMP/out.log" \
|
|
61
|
+
&& pass "AC2: output contains NO_GIT_REPOSITORY marker" \
|
|
62
|
+
|| fail "AC2: output missing NO_GIT_REPOSITORY marker (got: $(cat "$TMP/out.log"))"
|
|
63
|
+
|
|
64
|
+
# --- AC3: it does NOT die with the raw, opaque git error under set -e ---
|
|
65
|
+
grep -qi "not a git repository\|must be run in a work tree" "$TMP/out.log" \
|
|
66
|
+
&& fail "AC3: leaked raw git error instead of the honest marker (got: $(cat "$TMP/out.log"))" \
|
|
67
|
+
|| pass "AC3: no raw/opaque git error leaked"
|
|
68
|
+
|
|
69
|
+
# --- AC4: a real bare-repo workspace still works (guard is not over-broad) ---
|
|
70
|
+
BARE="$TMP/local.git"
|
|
71
|
+
git init --bare -b main "$BARE" >/dev/null
|
|
72
|
+
SEED="$TMP/seed"
|
|
73
|
+
git clone "$BARE" "$SEED" >/dev/null 2>&1
|
|
74
|
+
( 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 )
|
|
75
|
+
rm -rf "$SEED"
|
|
76
|
+
(
|
|
77
|
+
cd "$BARE"
|
|
78
|
+
bash "$WM" --yes create feat-ok
|
|
79
|
+
) >"$TMP/out.ok.log" 2>&1 \
|
|
80
|
+
&& pass "AC4: create still succeeds in a valid bare repo" \
|
|
81
|
+
|| fail "AC4: create regressed in a valid bare repo (output: $(cat "$TMP/out.ok.log"))"
|
|
82
|
+
|
|
83
|
+
echo
|
|
84
|
+
echo "=== Results ==="
|
|
85
|
+
echo "PASS: $PASS"
|
|
86
|
+
echo "FAIL: $FAIL"
|
|
87
|
+
[[ "$FAIL" -eq 0 ]] || exit 1
|
|
88
|
+
exit 0
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# #7102 — the orphan reaper must not report a cleanup it did not perform.
|
|
3
|
+
#
|
|
4
|
+
# `cleanup_orphan_worktree_dirs` ran `rm -rf` without checking the exit
|
|
5
|
+
# status and incremented `orphans_cleaned` unconditionally, so a directory it
|
|
6
|
+
# could not remove was still counted, still announced per-directory, and still
|
|
7
|
+
# folded into the "Cleaned N orphan directory(ies)" summary. The trigger is
|
|
8
|
+
# ordinary: the local Supabase stack bind-mounts as root and leaves
|
|
9
|
+
# root:root dirs inside an otherwise user-owned worktree, which an unprivileged
|
|
10
|
+
# `rm` cannot unlink. The class recurs for any worktree that ever started it.
|
|
11
|
+
#
|
|
12
|
+
# A third defect sits one line below the reported one: the function's last
|
|
13
|
+
# statement was `[[ "$verbose" == "true" ]] && echo …`, so a SUCCESSFUL clean at
|
|
14
|
+
# the default verbose=false returned rc=1 — and both call sites are bare inside
|
|
15
|
+
# `cleanup_merged_worktrees` under `set -e`, silently skipping the tmp reapers.
|
|
16
|
+
#
|
|
17
|
+
# Review additionally surfaced three destructive/observability defects covered
|
|
18
|
+
# here: a `.git` DIRECTORY (a nested full clone) read as "definitely orphaned"
|
|
19
|
+
# and destroyed; a swallowed `git worktree list` failure emptying the registry
|
|
20
|
+
# so every directory reads as unregistered; and an unsanitized directory name
|
|
21
|
+
# interpolated into a line-oriented telemetry sink.
|
|
22
|
+
#
|
|
23
|
+
# Plan: knowledge-base/project/plans/archive/20261013-041741-2026-07-31-fix-honest-failure-reporting-hook-timeout-and-orphan-reaper-plan.md
|
|
24
|
+
#
|
|
25
|
+
# Run via: bash plugins/soleur/skills/git-worktree/test/orphan-reaper-honest-count.test.sh
|
|
26
|
+
|
|
27
|
+
set -uo pipefail
|
|
28
|
+
|
|
29
|
+
# Git-location tripwire (#7833). These suites drive worktree-manager.sh, which runs
|
|
30
|
+
# `git worktree remove`, `git branch -D` and `git reset --hard` -- the highest-damage git writes
|
|
31
|
+
# in the corpus. An inherited GIT_DIR aims all of them at the developer's real repository, so
|
|
32
|
+
# this file aborts rather than proceeding. Inline rather than sourcing test-helpers.sh, which
|
|
33
|
+
# would also import an assertion framework these suites do not use.
|
|
34
|
+
for _v in GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY \
|
|
35
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE GIT_TEMPLATE_DIR GIT_EXEC_PATH; do
|
|
36
|
+
if [[ -n "${!_v:-}" && "${SOLEUR_GIT_TRIPWIRE_ALLOW:-0}" != "1" ]]; then
|
|
37
|
+
printf 'FATAL: %s started with an inherited git-location environment (%s=%s).\n' \
|
|
38
|
+
"${BASH_SOURCE[0]}" "$_v" "${!_v}" >&2
|
|
39
|
+
printf 'Fix the ENTRY POINT: unset %s && <runner>\n' "$_v" >&2
|
|
40
|
+
exit 97
|
|
41
|
+
fi
|
|
42
|
+
done
|
|
43
|
+
unset _v
|
|
44
|
+
|
|
45
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)"
|
|
46
|
+
WM="$REPO_ROOT/plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh"
|
|
47
|
+
|
|
48
|
+
PASS=0; FAIL=0
|
|
49
|
+
fail() { echo " FAIL: $1"; FAIL=$((FAIL+1)); }
|
|
50
|
+
pass() { echo " pass: $1"; PASS=$((PASS+1)); }
|
|
51
|
+
|
|
52
|
+
# Every assertion below must run for the suite to mean anything. A preflight
|
|
53
|
+
# SKIP exits 77 (autotools convention) BEFORE this point, so a skip is
|
|
54
|
+
# distinguishable from a pass. EXACT equality, not a floor: a floor with slack
|
|
55
|
+
# only fires once that many assertions vanish, and it drifts by hand anyway
|
|
56
|
+
# (each added assertion bumps it), so it costs the same maintenance for strictly
|
|
57
|
+
# less power. Counting PASS+FAIL rather than PASS means a FAILING assertion
|
|
58
|
+
# still counts as coverage, so this gate and the pass/fail gate stay orthogonal.
|
|
59
|
+
EXPECTED_ASSERTIONS=41
|
|
60
|
+
|
|
61
|
+
# Case 2 leaves a `chmod 500` directory behind, which defeats a plain
|
|
62
|
+
# `rm -rf "$TMP"` cleanup exactly as it defeats the reaper. Restore write
|
|
63
|
+
# permission at the top of the trap or the suite litters TMPDIR every run.
|
|
64
|
+
TMP=$(mktemp -d)
|
|
65
|
+
trap 'chmod -R u+rwX "$TMP" 2>/dev/null; rm -rf "$TMP"' EXIT
|
|
66
|
+
|
|
67
|
+
# --- Preflight: root ignores permission bits, so the unremovable fixture
|
|
68
|
+
# cannot be constructed and the failure cases would pass vacuously. Exit 77,
|
|
69
|
+
# not 0 — a skip that exits 0 is indistinguishable from a full green run. ---
|
|
70
|
+
if [[ $EUID -eq 0 ]]; then
|
|
71
|
+
echo "SKIP: running as root — the chmod 500 unremovable fixture cannot be built"
|
|
72
|
+
exit 77
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# --- Preflight: the sentinel maps GNU `rm` strerror text to an errno label.
|
|
76
|
+
# On a non-GNU host the label would be OTHER and the errno assertion is
|
|
77
|
+
# meaningless. Probe the real thing rather than guessing from `uname`. ---
|
|
78
|
+
probe="$TMP/.probe"; mkdir -p "$probe/inner"; : > "$probe/inner/f"; chmod 500 "$probe/inner"
|
|
79
|
+
probe_err=$(LC_ALL=C rm -rf -- "$probe" 2>&1 >/dev/null)
|
|
80
|
+
chmod -R u+rwX "$probe" 2>/dev/null; rm -rf "$probe"
|
|
81
|
+
if [[ "$probe_err" != *"Permission denied"* ]]; then
|
|
82
|
+
echo "SKIP: non-GNU \`rm\` strerror (got: ${probe_err:-<empty>}) — errno mapping not assertable"
|
|
83
|
+
exit 77
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# --- Stand up a real repo so `git worktree list --porcelain` returns a real
|
|
87
|
+
# registered path (the reaper's allowlist). Mirrors the sibling suites. ---
|
|
88
|
+
UPSTREAM="$TMP/upstream.git"
|
|
89
|
+
git init --bare -b main "$UPSTREAM" >/dev/null
|
|
90
|
+
SEED="$TMP/seed"
|
|
91
|
+
git clone "$UPSTREAM" "$SEED" >/dev/null 2>&1
|
|
92
|
+
( cd "$SEED" && git -c user.email=t@t -c user.name=t commit --allow-empty -m seed >/dev/null \
|
|
93
|
+
&& git push origin main >/dev/null 2>&1 )
|
|
94
|
+
rm -rf "$SEED"
|
|
95
|
+
|
|
96
|
+
LOCAL="$TMP/local.git"
|
|
97
|
+
git init --bare -b main "$LOCAL" >/dev/null
|
|
98
|
+
( cd "$LOCAL" && git remote add origin "$UPSTREAM" && git fetch --no-tags origin main:main >/dev/null 2>&1 )
|
|
99
|
+
|
|
100
|
+
cd "$LOCAL" || exit 1
|
|
101
|
+
# shellcheck source=/dev/null
|
|
102
|
+
source "$WM"
|
|
103
|
+
set +e
|
|
104
|
+
|
|
105
|
+
strip_ansi() { sed -e 's/\x1b\[[0-9;]*m//g'; }
|
|
106
|
+
count_dirs() { find "$1" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' '; }
|
|
107
|
+
|
|
108
|
+
# Parse the reaper's own success summary. Returns the integer it CLAIMS to have
|
|
109
|
+
# cleaned, or "none" when no summary was printed. Only meaningful at
|
|
110
|
+
# verbose=true — the success summary is verbose-gated by design.
|
|
111
|
+
claimed_count() { grep -oE 'Cleaned [0-9]+ orphan' <<<"$1" | grep -oE '[0-9]+' || echo "none"; }
|
|
112
|
+
|
|
113
|
+
mk_stuck() { mkdir -p "$1/inner"; : > "$1/inner/f"; chmod 500 "$1/inner"; }
|
|
114
|
+
|
|
115
|
+
# ---------------------------------------------------------------------------
|
|
116
|
+
# Case 1 — the happy path still discriminates correctly.
|
|
117
|
+
# ---------------------------------------------------------------------------
|
|
118
|
+
echo "Case 1: discriminates orphan vs registered vs has-.git"
|
|
119
|
+
WORKTREE_DIR="$TMP/wt1"; mkdir -p "$WORKTREE_DIR"
|
|
120
|
+
mkdir -p "$WORKTREE_DIR/plain-orphan/nested"; : > "$WORKTREE_DIR/plain-orphan/nested/f"
|
|
121
|
+
git -C "$LOCAL" worktree add "$WORKTREE_DIR/registered" -b c1 main >/dev/null 2>&1
|
|
122
|
+
mkdir -p "$WORKTREE_DIR/has-git-file"; echo "gitdir: /nowhere" > "$WORKTREE_DIR/has-git-file/.git"
|
|
123
|
+
# A nested FULL clone has a `.git` DIRECTORY, not a file. A `-f` test reads that
|
|
124
|
+
# as "definitely orphaned" and destroys the clone along with any uncommitted
|
|
125
|
+
# work in it — and the honest-reporting fix would then faithfully announce the
|
|
126
|
+
# destruction, which is worse than the silent version.
|
|
127
|
+
git clone "$UPSTREAM" "$WORKTREE_DIR/nested-clone" >/dev/null 2>&1
|
|
128
|
+
: > "$WORKTREE_DIR/nested-clone/uncommitted-work.txt"
|
|
129
|
+
# A BARE repo has NO `.git` entry at all -- it IS the git dir -- so every
|
|
130
|
+
# `.git`-based test (including `-e`) reads it as orphaned and reaps its refs
|
|
131
|
+
# and objects. Verified destroyed before the positive bare-layout guard landed.
|
|
132
|
+
git init --bare -b main "$WORKTREE_DIR/parked-bare.git" >/dev/null 2>&1
|
|
133
|
+
: > "$WORKTREE_DIR/parked-bare.git/PRECIOUS-REFS"
|
|
134
|
+
|
|
135
|
+
out1=$(cleanup_orphan_worktree_dirs true 2>&1 | strip_ansi)
|
|
136
|
+
|
|
137
|
+
[[ "$(claimed_count "$out1")" == "1" ]] \
|
|
138
|
+
&& pass "claims exactly 1 cleaned" \
|
|
139
|
+
|| fail "claims $(claimed_count "$out1") cleaned, expected 1"
|
|
140
|
+
[[ ! -d "$WORKTREE_DIR/plain-orphan" ]] \
|
|
141
|
+
&& pass "plain orphan removed" \
|
|
142
|
+
|| fail "plain orphan survived"
|
|
143
|
+
[[ -d "$WORKTREE_DIR/registered" ]] \
|
|
144
|
+
&& pass "registered worktree preserved" \
|
|
145
|
+
|| fail "registered worktree was destroyed"
|
|
146
|
+
[[ -d "$WORKTREE_DIR/has-git-file" ]] \
|
|
147
|
+
&& pass "orphan with .git file preserved" \
|
|
148
|
+
|| fail "orphan with .git file was destroyed"
|
|
149
|
+
[[ -f "$WORKTREE_DIR/nested-clone/uncommitted-work.txt" ]] \
|
|
150
|
+
&& pass "nested clone (.git DIRECTORY) preserved with its uncommitted work" \
|
|
151
|
+
|| fail "nested clone was DESTROYED — a .git directory must not read as orphaned"
|
|
152
|
+
[[ -f "$WORKTREE_DIR/parked-bare.git/PRECIOUS-REFS" ]] \
|
|
153
|
+
&& pass "bare repository preserved (no .git entry is not the same as orphaned)" \
|
|
154
|
+
|| fail "bare repository was DESTROYED — its refs and objects are unrecoverable"
|
|
155
|
+
|
|
156
|
+
# ---------------------------------------------------------------------------
|
|
157
|
+
# Case 2 — an UNREMOVABLE orphan must not be counted or announced.
|
|
158
|
+
# ---------------------------------------------------------------------------
|
|
159
|
+
echo "Case 2: unremovable orphan is reported honestly"
|
|
160
|
+
WORKTREE_DIR="$TMP/wt2"; mkdir -p "$WORKTREE_DIR"; mk_stuck "$WORKTREE_DIR/stuck"
|
|
161
|
+
|
|
162
|
+
out2=$(cleanup_orphan_worktree_dirs false 2>/dev/null | strip_ansi)
|
|
163
|
+
err2=$(cleanup_orphan_worktree_dirs false 2>&1 >/dev/null | strip_ansi)
|
|
164
|
+
# The success summary is verbose-gated, so a verbose=FALSE capture can never
|
|
165
|
+
# contain it — asserting "does not claim" against that stream is unconditionally
|
|
166
|
+
# true and pins nothing. Capture at verbose=TRUE, where the summary WOULD print
|
|
167
|
+
# if the counter were wrong, and assert the value rather than negating one of
|
|
168
|
+
# many possible wrong values.
|
|
169
|
+
outv=$(cleanup_orphan_worktree_dirs true 2>/dev/null | strip_ansi)
|
|
170
|
+
|
|
171
|
+
[[ -d "$WORKTREE_DIR/stuck" ]] \
|
|
172
|
+
&& pass "unremovable dir survives (fixture is valid)" \
|
|
173
|
+
|| fail "fixture invalid — dir was removed, cannot test the failure path"
|
|
174
|
+
[[ "$(claimed_count "$outv")" == "none" ]] \
|
|
175
|
+
&& pass "prints no success summary at verbose=true when nothing was cleaned" \
|
|
176
|
+
|| fail "claimed $(claimed_count "$outv") cleaned while the directory is still on disk"
|
|
177
|
+
grep -q 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out2" \
|
|
178
|
+
&& pass "emits SOLEUR_ORPHAN_UNREMOVABLE sentinel on stdout" \
|
|
179
|
+
|| fail "no SOLEUR_ORPHAN_UNREMOVABLE sentinel on stdout"
|
|
180
|
+
grep -q 'errno=EACCES' <<<"$out2" \
|
|
181
|
+
&& pass "sentinel carries errno=EACCES" \
|
|
182
|
+
|| fail "sentinel missing errno=EACCES"
|
|
183
|
+
grep -q 'reason=rm-partial' <<<"$out2" \
|
|
184
|
+
&& pass "sentinel uses reason=rm-partial (rm -rf deletes what it can first)" \
|
|
185
|
+
|| fail "sentinel missing reason=rm-partial"
|
|
186
|
+
# The success counter must be readable at the DEFAULT verbosity. Nothing else
|
|
187
|
+
# reads it there (the success summary is verbose-gated), so without this the
|
|
188
|
+
# counter can be corrupted on the default path undetectably.
|
|
189
|
+
grep -q 'cleaned=0' <<<"$out2" \
|
|
190
|
+
&& pass "sentinel reports cleaned=0 when nothing was removed (counter honest at verbose=false)" \
|
|
191
|
+
|| fail "sentinel did not report cleaned=0: $(grep -oE 'cleaned=[0-9]+' <<<"$out2")"
|
|
192
|
+
grep -qE 'Could not remove [0-9]+ orphan directory' <<<"$err2" \
|
|
193
|
+
&& pass "failure summary prints on stderr at verbose=false" \
|
|
194
|
+
|| fail "failure summary suppressed at verbose=false (the default path)"
|
|
195
|
+
grep -qF "$WORKTREE_DIR/stuck" <<<"$err2" \
|
|
196
|
+
&& pass "failure summary names the surviving directory" \
|
|
197
|
+
|| fail "failure summary does not name the surviving directory"
|
|
198
|
+
grep -qF 'SKILL.md' <<<"$err2" \
|
|
199
|
+
&& pass "failure summary points at the remediation runbook" \
|
|
200
|
+
|| fail "failure summary has no remediation pointer"
|
|
201
|
+
# The remediation must not hand an agent a guardrail-bypassing command. Check
|
|
202
|
+
# BOTH streams — the pointer lives on stderr, the sentinel on stdout.
|
|
203
|
+
grep -q 'docker run' <<<"$out2$err2" \
|
|
204
|
+
&& fail "remediation contains a docker run string (bypasses the rm -rf guardrail)" \
|
|
205
|
+
|| pass "remediation contains no guardrail-bypassing docker command"
|
|
206
|
+
grep -q "Removed orphan directory: stuck" <<<"$outv" \
|
|
207
|
+
&& fail "announces 'Removed orphan directory: stuck' for a dir still on disk" \
|
|
208
|
+
|| pass "no per-directory removal line for the surviving dir"
|
|
209
|
+
|
|
210
|
+
# ---------------------------------------------------------------------------
|
|
211
|
+
# Case 3 — counter integrity, with MORE THAN ONE stuck directory so the count,
|
|
212
|
+
# the plural path, the per-directory loop and the array append are all pinned
|
|
213
|
+
# above N=1 (at N=1 a hardcoded "1", a `[0]`-only loop and a clobbering
|
|
214
|
+
# assignment are all indistinguishable from correct).
|
|
215
|
+
# ---------------------------------------------------------------------------
|
|
216
|
+
echo "Case 3: claimed count equals the find-verified delta, with N>1 failures"
|
|
217
|
+
WORKTREE_DIR="$TMP/wt3"; mkdir -p "$WORKTREE_DIR"
|
|
218
|
+
mkdir -p "$WORKTREE_DIR/gone-a" "$WORKTREE_DIR/gone-b"
|
|
219
|
+
mk_stuck "$WORKTREE_DIR/stuck3a"; mk_stuck "$WORKTREE_DIR/stuck3b"
|
|
220
|
+
|
|
221
|
+
before3=$(count_dirs "$WORKTREE_DIR")
|
|
222
|
+
# One invocation, both streams: a second call would run against the leftovers
|
|
223
|
+
# (gone-a/gone-b already reaped) and report cleaned=0.
|
|
224
|
+
cleanup_orphan_worktree_dirs true >"$TMP/o3.raw" 2>"$TMP/e3.raw"
|
|
225
|
+
out3=$(strip_ansi <"$TMP/o3.raw"); err3=$(strip_ansi <"$TMP/e3.raw")
|
|
226
|
+
after3=$(count_dirs "$WORKTREE_DIR")
|
|
227
|
+
delta3=$(( before3 - after3 ))
|
|
228
|
+
claim3=$(claimed_count "$out3")
|
|
229
|
+
|
|
230
|
+
[[ "$delta3" == "2" ]] \
|
|
231
|
+
&& pass "two removable orphans actually removed" \
|
|
232
|
+
|| fail "expected delta 2, observed $delta3"
|
|
233
|
+
[[ "$claim3" == "$delta3" ]] \
|
|
234
|
+
&& pass "claimed $claim3 == observed delta $delta3" \
|
|
235
|
+
|| fail "claimed $claim3 but only $delta3 directories actually disappeared"
|
|
236
|
+
grep -qE 'Could not remove 2 orphan directory' <<<"$err3" \
|
|
237
|
+
&& pass "failure summary reports exactly 2 (count is not hardcoded)" \
|
|
238
|
+
|| fail "failure summary did not report 2: $(grep -oE 'Could not remove [0-9]+' <<<"$err3")"
|
|
239
|
+
grep -qF "stuck3a" <<<"$err3" && grep -qF "stuck3b" <<<"$err3" \
|
|
240
|
+
&& pass "failure summary names BOTH stuck directories (loop is not [0]-only)" \
|
|
241
|
+
|| fail "failure summary omitted one of the two stuck directories"
|
|
242
|
+
grep -qE 'SOLEUR_ORPHAN_UNREMOVABLE count=2' <<<"$out3" \
|
|
243
|
+
&& pass "sentinel aggregates with count=2" \
|
|
244
|
+
|| fail "sentinel did not report count=2"
|
|
245
|
+
grep -q 'cleaned=2' <<<"$out3" \
|
|
246
|
+
&& pass "sentinel reports cleaned=2 in a mixed run (success counter honest alongside failures)" \
|
|
247
|
+
|| fail "sentinel did not report cleaned=2: $(grep -oE 'cleaned=[0-9]+' <<<"$out3")"
|
|
248
|
+
# One aggregate marker per invocation, never one per directory: the marker
|
|
249
|
+
# extractor keeps a fixed budget per tool_response and STOPS at the cap, so an
|
|
250
|
+
# unbounded per-directory producer would crowd out the paging wedge markers.
|
|
251
|
+
[[ "$(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out3")" == "1" ]] \
|
|
252
|
+
&& pass "emits exactly ONE aggregate marker for 2 failures (bounded producer)" \
|
|
253
|
+
|| fail "emitted $(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out3") markers; must be 1"
|
|
254
|
+
|
|
255
|
+
# ---------------------------------------------------------------------------
|
|
256
|
+
# Case 4 — the function must return 0 on every path.
|
|
257
|
+
# ---------------------------------------------------------------------------
|
|
258
|
+
echo "Case 4: returns 0 on every path (defect 3)"
|
|
259
|
+
WORKTREE_DIR="$TMP/wt4a"; mkdir -p "$WORKTREE_DIR/orphan-a"
|
|
260
|
+
cleanup_orphan_worktree_dirs false >/dev/null 2>&1; rc4a=$?
|
|
261
|
+
[[ "$rc4a" -eq 0 ]] \
|
|
262
|
+
&& pass "rc=0 for (cleaned>=1, verbose=false)" \
|
|
263
|
+
|| fail "rc=$rc4a for (cleaned>=1, verbose=false) — aborts its caller under set -e"
|
|
264
|
+
|
|
265
|
+
WORKTREE_DIR="$TMP/wt4b"; mkdir -p "$WORKTREE_DIR/orphan-b"
|
|
266
|
+
cleanup_orphan_worktree_dirs true >/dev/null 2>&1; rc4b=$?
|
|
267
|
+
[[ "$rc4b" -eq 0 ]] \
|
|
268
|
+
&& pass "rc=0 for (cleaned>=1, verbose=true)" \
|
|
269
|
+
|| fail "rc=$rc4b for (cleaned>=1, verbose=true)"
|
|
270
|
+
|
|
271
|
+
WORKTREE_DIR="$TMP/wt4c"; mkdir -p "$WORKTREE_DIR"; mk_stuck "$WORKTREE_DIR/stuck4"
|
|
272
|
+
cleanup_orphan_worktree_dirs false >/dev/null 2>&1; rc4c=$?
|
|
273
|
+
[[ "$rc4c" -eq 0 ]] \
|
|
274
|
+
&& pass "rc=0 for (failed removal, verbose=false)" \
|
|
275
|
+
|| fail "rc=$rc4c for (failed removal, verbose=false)"
|
|
276
|
+
|
|
277
|
+
WORKTREE_DIR="$TMP/wt4d"; mkdir -p "$WORKTREE_DIR"
|
|
278
|
+
cleanup_orphan_worktree_dirs false >/dev/null 2>&1; rc4d=$?
|
|
279
|
+
[[ "$rc4d" -eq 0 ]] \
|
|
280
|
+
&& pass "rc=0 for (nothing to clean)" \
|
|
281
|
+
|| fail "rc=$rc4d for (nothing to clean)"
|
|
282
|
+
|
|
283
|
+
# ---------------------------------------------------------------------------
|
|
284
|
+
# Case 5 — the OTHER direction. Every case above asks "does it report the
|
|
285
|
+
# failure?"; none asks "does it stay quiet when there is none?". Without this,
|
|
286
|
+
# making the failure summary unconditional, or emitting the sentinel on the
|
|
287
|
+
# SUCCESS branch, both pass — and the reaper would cry wolf on every run of the
|
|
288
|
+
# default path that session-start, work Phase 0 and ship Phase 7 all execute.
|
|
289
|
+
# ---------------------------------------------------------------------------
|
|
290
|
+
echo "Case 5: silent on a fully clean run (no false failure surfaces)"
|
|
291
|
+
for v in false true; do
|
|
292
|
+
WORKTREE_DIR="$TMP/wt5-$v"; mkdir -p "$WORKTREE_DIR"/{ok-a,ok-b,ok-c}
|
|
293
|
+
# ONE invocation, both streams captured. The reaper is destructive: a second
|
|
294
|
+
# call runs against an already-emptied directory, so it would assert the
|
|
295
|
+
# nothing-to-do path while claiming to cover the reaped-three path.
|
|
296
|
+
cleanup_orphan_worktree_dirs "$v" >"$TMP/o5.raw" 2>"$TMP/e5.raw"; rc5=$?
|
|
297
|
+
o5=$(strip_ansi <"$TMP/o5.raw"); e5=$(strip_ansi <"$TMP/e5.raw")
|
|
298
|
+
grep -q 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$o5" \
|
|
299
|
+
&& fail "verbose=$v: emitted an UNREMOVABLE sentinel on a clean run" \
|
|
300
|
+
|| pass "verbose=$v: no UNREMOVABLE sentinel on a clean run"
|
|
301
|
+
grep -q 'Could not remove' <<<"$e5" \
|
|
302
|
+
&& fail "verbose=$v: printed a failure summary on a clean run" \
|
|
303
|
+
|| pass "verbose=$v: no failure summary on a clean run"
|
|
304
|
+
# A crash produces silence too, and silence would satisfy both greps above.
|
|
305
|
+
# Pin rc from the SAME invocation so an abort (e.g. an unbound array read
|
|
306
|
+
# under `set -u`) is not mistaken for a clean, quiet run.
|
|
307
|
+
[[ "$rc5" -eq 0 ]] \
|
|
308
|
+
&& pass "verbose=$v: clean run returns 0 (silence is not a crash)" \
|
|
309
|
+
|| fail "verbose=$v: clean run returned rc=$rc5"
|
|
310
|
+
done
|
|
311
|
+
[[ "$(count_dirs "$TMP/wt5-false")" == "0" ]] \
|
|
312
|
+
&& pass "clean run actually removed all three orphans" \
|
|
313
|
+
|| fail "clean-run fixture did not reap: $(count_dirs "$TMP/wt5-false") left"
|
|
314
|
+
|
|
315
|
+
# ---------------------------------------------------------------------------
|
|
316
|
+
# Case 6 — the registry must FAIL CLOSED. `git worktree list` can fail wholesale
|
|
317
|
+
# under the sandbox's masked-config wedge; a swallowed failure yields an EMPTY
|
|
318
|
+
# registry, under which every directory reads as unregistered and the reaper
|
|
319
|
+
# deletes the entire tree including live worktrees.
|
|
320
|
+
# ---------------------------------------------------------------------------
|
|
321
|
+
echo "Case 6: fails closed when the worktree registry is unavailable"
|
|
322
|
+
WORKTREE_DIR="$TMP/wt6"; mkdir -p "$WORKTREE_DIR/precious/nested"
|
|
323
|
+
: > "$WORKTREE_DIR/precious/nested/data.txt"
|
|
324
|
+
# Make `git worktree list` fail for real rather than shadowing `git` with a
|
|
325
|
+
# shell function: a function named `git` is visible to every earlier call in
|
|
326
|
+
# the file (shellcheck SC2218) and is a foot-gun in a suite that uses real git
|
|
327
|
+
# for its fixtures. Running from a non-repo CWD makes git exit 128 naturally,
|
|
328
|
+
# which is the actual shape of the masked-config wedge this guards against.
|
|
329
|
+
NONREPO="$TMP/not-a-repo"; mkdir -p "$NONREPO"
|
|
330
|
+
pushd "$NONREPO" >/dev/null || exit 1
|
|
331
|
+
out6=$(cleanup_orphan_worktree_dirs false 2>/dev/null | strip_ansi); rc6=$?
|
|
332
|
+
popd >/dev/null || exit 1
|
|
333
|
+
|
|
334
|
+
[[ -f "$WORKTREE_DIR/precious/nested/data.txt" ]] \
|
|
335
|
+
&& pass "refuses to reap when the registry is unavailable" \
|
|
336
|
+
|| fail "DELETED content while the registry was unavailable (fails OPEN)"
|
|
337
|
+
grep -q 'SOLEUR_ORPHAN_REGISTRY_UNAVAILABLE' <<<"$out6" \
|
|
338
|
+
&& pass "emits SOLEUR_ORPHAN_REGISTRY_UNAVAILABLE" \
|
|
339
|
+
|| fail "no sentinel for the unavailable registry — the skip is silent"
|
|
340
|
+
[[ "$rc6" -eq 0 ]] \
|
|
341
|
+
&& pass "rc=0 on the fail-closed path (does not abort its caller)" \
|
|
342
|
+
|| fail "rc=$rc6 on the fail-closed path"
|
|
343
|
+
|
|
344
|
+
# ---------------------------------------------------------------------------
|
|
345
|
+
# Case 7 — a directory name must not be able to forge a telemetry line. This
|
|
346
|
+
# loop is the ONLY one handling arbitrarily-named UNREGISTERED directories:
|
|
347
|
+
# git refnames forbid control characters, so the creation path cannot produce
|
|
348
|
+
# them, but any process can mkdir a name embedding a newline.
|
|
349
|
+
# ---------------------------------------------------------------------------
|
|
350
|
+
echo "Case 7: a hostile directory name cannot forge a marker line"
|
|
351
|
+
WORKTREE_DIR="$TMP/wt7"; mkdir -p "$WORKTREE_DIR"
|
|
352
|
+
EVIL=$'evil\nworktree wedge: forged'
|
|
353
|
+
mk_stuck "$WORKTREE_DIR/$EVIL"
|
|
354
|
+
out7=$(cleanup_orphan_worktree_dirs false 2>/dev/null | strip_ansi)
|
|
355
|
+
|
|
356
|
+
[[ "$(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out7")" == "1" ]] \
|
|
357
|
+
&& pass "hostile name still yields exactly one marker line" \
|
|
358
|
+
|| fail "hostile name produced $(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out7") marker lines"
|
|
359
|
+
grep -qE '^worktree wedge:' <<<"$out7" \
|
|
360
|
+
&& fail "hostile name FORGED a wedge line on the telemetry stream" \
|
|
361
|
+
|| pass "no forged wedge line — the name is sanitized before emission"
|
|
362
|
+
grep -q 'reason=rm-partial' <<<"$out7" \
|
|
363
|
+
&& pass "the real marker survives sanitization intact" \
|
|
364
|
+
|| fail "sanitization destroyed the marker's own key=value shape"
|
|
365
|
+
|
|
366
|
+
# ---------------------------------------------------------------------------
|
|
367
|
+
echo
|
|
368
|
+
echo "PASS=$PASS FAIL=$FAIL"
|
|
369
|
+
|
|
370
|
+
# Anti-vacuity parity: a preflight SKIP exits 77 above; reaching here with a
|
|
371
|
+
# short PASS count means assertions were silently dropped.
|
|
372
|
+
RAN=$(( PASS + FAIL ))
|
|
373
|
+
if [[ "$RAN" -ne "$EXPECTED_ASSERTIONS" ]]; then
|
|
374
|
+
echo "FAIL: $RAN assertions ran, expected exactly $EXPECTED_ASSERTIONS (coverage drifted)"
|
|
375
|
+
exit 1
|
|
376
|
+
fi
|
|
377
|
+
|
|
378
|
+
[[ "$FAIL" -eq 0 ]] || exit 1
|
|
379
|
+
exit 0
|