@soleur/opencode 0.0.0-stage → 3.354.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +660 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +29 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +361 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +171 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +818 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +411 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +509 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +115 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +165 -0
- package/scripts/sync-opencode-adapter.ts +498 -0
- package/scripts/sync-pr-behind.sh +647 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +67 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +143 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +670 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +331 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +141 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1620 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-evidence-comment.md +36 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3023 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/cleanup-merged-archival.md +39 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/delegated-act-authoring-form.md +7 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/epic-close-sweep.md +62 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +179 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/verification-scaffold/SKILL.md +73 -0
- package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
- package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
- package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
- package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
- package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
- package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
- package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
- package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
- package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
- package/skills/verification-scaffold/references/guards.tsv +21 -0
- package/skills/verification-scaffold/references/verification-readme.template +55 -0
- package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
- package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
- package/skills/verification-scaffold/test/generator.test.sh +319 -0
- package/skills/verification-scaffold/test/manifest.test.sh +144 -0
- package/skills/work/SKILL.md +1480 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Soleur process helpers: enumerate and signal test runs WITHOUT killing the
|
|
3
|
+
# invoking shell or another worktree's session.
|
|
4
|
+
#
|
|
5
|
+
# WHY THIS FILE EXISTS. A prose rule forbidding self-matching `pkill -f` already
|
|
6
|
+
# lived in the work skill and did not prevent the failure it describes: on
|
|
7
|
+
# 2026-08-13 an agent read that rule, ran the forbidden form anyway, killed its
|
|
8
|
+
# own shell, then wrote a "more careful" pgrep loop that self-matched and killed
|
|
9
|
+
# its shell a second time. The second attempt was also unscoped across sibling
|
|
10
|
+
# worktrees — parallel worktrees are this repo's documented workflow, so an
|
|
11
|
+
# unscoped pattern is a cross-session destructive action. Prose does not
|
|
12
|
+
# execute; this does. See #7525.
|
|
13
|
+
#
|
|
14
|
+
# WHY BRACKET-SAFETY IS A CATEGORY ERROR HERE. `[t]est-all` is a pgrep/`ps|grep`
|
|
15
|
+
# idiom: it stops the MATCHER from matching itself. A /proc walk has no pattern
|
|
16
|
+
# for a bracket to fool, and the invoker's own command line still contains the
|
|
17
|
+
# literal pattern either way. The property ("never reports the process
|
|
18
|
+
# performing the enumeration") is bought by the three exclusions below instead.
|
|
19
|
+
#
|
|
20
|
+
# HIDDEN ASSUMPTION, stated because the design depends on it: proc.sh's own
|
|
21
|
+
# command line MATCHES proc.sh's own predicate. That is the entire reason the
|
|
22
|
+
# process-group exclusion is required — proc.sh's command-substitution forks
|
|
23
|
+
# match the predicate and are NOT ancestors. Do not remove it on the grounds
|
|
24
|
+
# that ancestry already covers the invoking shell.
|
|
25
|
+
#
|
|
26
|
+
# THE SCAN->SIGNAL CHANNEL CARRIES NO PATHS. This is the file's single most
|
|
27
|
+
# important structural property and it was learned the hard way: the first
|
|
28
|
+
# revision emitted `class<TAB>pid<TAB>cwd` and read it back with
|
|
29
|
+
# `IFS=$'\t' read`. A directory name may legally contain a newline, and
|
|
30
|
+
# /proc/<pid>/cwd reports it verbatim — so a process whose cwd was a directory
|
|
31
|
+
# named $'evil\nsignal\t31337\t/pwned' injected a FORGED `signal` row into the
|
|
32
|
+
# protocol. Measured: pid 31337 reached the kill site having never matched the
|
|
33
|
+
# pattern, never been classified, and never had its cwd tested, while the
|
|
34
|
+
# carrier process itself was correctly refused. The refusal path WAS the
|
|
35
|
+
# injection vector, so a correct boundary check did not help.
|
|
36
|
+
#
|
|
37
|
+
# Therefore the channel now carries only (a) a class token from a closed set of
|
|
38
|
+
# literals and (b) a pid, which is numeric by construction and re-validated
|
|
39
|
+
# before use. Paths are re-read by the consumer for DISPLAY only, and sanitized.
|
|
40
|
+
# Do not put a filesystem path back into this channel.
|
|
41
|
+
#
|
|
42
|
+
# The /proc primitives below are MIRRORED from scripts/lib/test-contention.sh
|
|
43
|
+
# (search that file for `_tc_stat_field`), deliberately not sourced: this file
|
|
44
|
+
# ships inside the plugin (ADR-178) and a shipped file sourcing a repo-root
|
|
45
|
+
# library is the exact defect ADR-178 exists to prevent. plugins/soleur/test/
|
|
46
|
+
# proc.test.sh pins the mirrored forms against drift.
|
|
47
|
+
#
|
|
48
|
+
# Location: ships INSIDE the plugin (ADR-178, ADR-179) so a marketplace install
|
|
49
|
+
# resolves it, and so a customer's own `scripts/` directory cannot shadow a file
|
|
50
|
+
# whose advertised contract is to send signals.
|
|
51
|
+
#
|
|
52
|
+
# PORTABILITY: bash 3.2 (the /bin/bash macOS ships). `mapfile -d` is bash 4.4+
|
|
53
|
+
# and is deliberately NOT used — when it is absent the error is swallowed, argv
|
|
54
|
+
# stays empty, nothing ever matches, and `kill_mine` prints `killed=0`, which
|
|
55
|
+
# reads as "nothing to kill" and sends the operator back to pkill. That is this
|
|
56
|
+
# file's own failure mode reappearing one level down, so the NUL read below is
|
|
57
|
+
# written the portable way on purpose.
|
|
58
|
+
|
|
59
|
+
# Guard against double-source within a single shell.
|
|
60
|
+
if [[ "${_SOLEUR_PROC_LOADED:-}" == "1" ]]; then
|
|
61
|
+
return 0 2>/dev/null || true
|
|
62
|
+
fi
|
|
63
|
+
_SOLEUR_PROC_LOADED=1
|
|
64
|
+
|
|
65
|
+
# Test seams. Namespace-prefixed because scripts/tmpfs-guard.sh already binds a
|
|
66
|
+
# bare PROC_ROOT and this file is sourceable.
|
|
67
|
+
PROC_SH_ROOT="${PROC_SH_ROOT:-/proc}"
|
|
68
|
+
PROC_SH_SELF_PID="${PROC_SH_SELF_PID:-$$}"
|
|
69
|
+
|
|
70
|
+
# Wrapper commands that legitimately precede a shell on the command line.
|
|
71
|
+
# Without this, `timeout 600 bash scripts/test-all.sh` has argv[0]=timeout and
|
|
72
|
+
# is INVISIBLE to both verbs — and `timeout … bash <suite>` is a real shape in
|
|
73
|
+
# this repo (scripts/lib/test-contention.sh says so in its own comments). An
|
|
74
|
+
# invisible run is a silent `killed=0`, i.e. the D6 failure mode.
|
|
75
|
+
_PROC_WRAPPERS='timeout env nohup nice ionice setsid stdbuf time taskset flock script unbuffer rtk'
|
|
76
|
+
# `rtk` carries an optional exec-subcommand word (run|err|test|proxy|bypass|summary) between
|
|
77
|
+
# itself and the real argv — `rtk run bash x.sh` execs bash, and `rtk bash x.sh` does too
|
|
78
|
+
# (filtered subcommand or run_fallback raw exec). The walk below skips the wrapper's own
|
|
79
|
+
# options, then that subcommand word if present, before landing.
|
|
80
|
+
# NOT `busybox`: it is an applet multiplexer, not a shell, so admitting it makes
|
|
81
|
+
# `busybox grep -rn test-all.sh` scan every later token and match — the same
|
|
82
|
+
# over-match the wrapper walk below was corrected for.
|
|
83
|
+
_PROC_SHELLS='bash sh dash zsh ksh mksh ash'
|
|
84
|
+
|
|
85
|
+
# --- /proc primitives (mirrored from scripts/lib/test-contention.sh) --------
|
|
86
|
+
#
|
|
87
|
+
# comm (field 2) is parenthesized and MAY contain spaces and close-parens, so
|
|
88
|
+
# the parser strips through the LAST ') ' rather than splitting on whitespace.
|
|
89
|
+
# A naive `awk '{print $4}'` mis-indexes on any such process — which is exactly
|
|
90
|
+
# what the /proc recipe currently quoted in git-worktree/SKILL.md does.
|
|
91
|
+
_proc_stat_field() {
|
|
92
|
+
# $1 = path to a /proc/<pid>/stat file, $2 = field index AFTER the comm strip
|
|
93
|
+
# (i.e. overall field N maps to N-2 here).
|
|
94
|
+
local f="$1" idx="$2" line rest
|
|
95
|
+
[[ -r "$f" ]] || return 0
|
|
96
|
+
line=$(cat "$f" 2>/dev/null) || return 0
|
|
97
|
+
rest="${line##*') '}"
|
|
98
|
+
awk -v i="$idx" '{print $i}' <<<"$rest"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# Overall field 4 (ppid) => field 2 after the comm strip.
|
|
102
|
+
_proc_ppid() { _proc_stat_field "$1" 2; }
|
|
103
|
+
# Overall field 5 (pgrp) => field 3 after the comm strip.
|
|
104
|
+
_proc_pgrp() { _proc_stat_field "$1" 3; }
|
|
105
|
+
|
|
106
|
+
# Self plus every ancestor pid.
|
|
107
|
+
#
|
|
108
|
+
# WHY THE WHOLE CHAIN, not just $$ and $PPID: this helper is normally launched
|
|
109
|
+
# through a wrapper (`bash -c '… bash …/proc.sh kill_mine test-all.sh'`, a CI
|
|
110
|
+
# step shell, an agent harness), and that wrapper's OWN command line contains
|
|
111
|
+
# the pattern. Excluding only $$ reports the caller's own invocation as a
|
|
112
|
+
# target on EVERY run. Measured in test-contention.sh's development: a clean
|
|
113
|
+
# solo run reported 2 phantom siblings, both links in its own ancestor chain.
|
|
114
|
+
_proc_self_and_ancestors() {
|
|
115
|
+
local pid="$PROC_SH_SELF_PID" out="" guard=0
|
|
116
|
+
while [[ "$pid" =~ ^[0-9]+$ ]] && (( pid > 0 && guard < 64 )); do
|
|
117
|
+
out+="$pid "
|
|
118
|
+
local ppid
|
|
119
|
+
ppid=$(_proc_ppid "$PROC_SH_ROOT/$pid/stat") || ppid=""
|
|
120
|
+
[[ "$ppid" =~ ^[0-9]+$ ]] || break
|
|
121
|
+
[[ "$ppid" == "$pid" ]] && break
|
|
122
|
+
pid="$ppid"
|
|
123
|
+
guard=$(( guard + 1 ))
|
|
124
|
+
done
|
|
125
|
+
printf '%s' "$out"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# --- Ownership boundary ----------------------------------------------------
|
|
129
|
+
|
|
130
|
+
# Canonicalize a directory so a symlinked worktree path compares equal to the
|
|
131
|
+
# resolved cwd /proc reports. Without this, kill_mine refuses EVERYTHING and
|
|
132
|
+
# looks correct — a failure the suite must have a fixture for, because a
|
|
133
|
+
# positive control whose paths are already canonical cannot see it.
|
|
134
|
+
_proc_canon() {
|
|
135
|
+
local p="$1"
|
|
136
|
+
if [[ -d "$p" ]]; then
|
|
137
|
+
(cd "$p" 2>/dev/null && pwd -P) && return 0
|
|
138
|
+
fi
|
|
139
|
+
printf '%s' "$p"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# The current worktree, or a loud failure. Fail-closed on purpose: a scan with
|
|
143
|
+
# no ownership boundary would classify every match as foreign or, worse, as
|
|
144
|
+
# mine — and this file's whole contract is that boundary.
|
|
145
|
+
_proc_worktree() {
|
|
146
|
+
local root
|
|
147
|
+
if [[ -n "${PROC_SH_WORKTREE:-}" ]]; then
|
|
148
|
+
root=$(_proc_canon "$PROC_SH_WORKTREE")
|
|
149
|
+
else
|
|
150
|
+
root=$(git rev-parse --show-toplevel 2>/dev/null) || root=""
|
|
151
|
+
if [[ -z "$root" ]]; then
|
|
152
|
+
echo "proc.sh: cannot resolve the current worktree (not inside a git repository and PROC_SH_WORKTREE is unset)." >&2
|
|
153
|
+
echo "proc.sh: refusing to scan — without an ownership boundary this cannot tell your processes from another session's." >&2
|
|
154
|
+
return 1
|
|
155
|
+
fi
|
|
156
|
+
root=$(_proc_canon "$root")
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
# The boundary must be an absolute path below the filesystem root. An empty
|
|
160
|
+
# root would make the prefix test `/*`, which matches EVERY absolute path;
|
|
161
|
+
# a bare `/` is a boundary that owns the whole machine. Both are refused
|
|
162
|
+
# structurally rather than relying on the prefix test's incidental behaviour.
|
|
163
|
+
if [[ "$root" != /* || "$root" == "/" ]]; then
|
|
164
|
+
echo "proc.sh: refusing to scan — ownership boundary '$root' is not an absolute path below /." >&2
|
|
165
|
+
return 1
|
|
166
|
+
fi
|
|
167
|
+
printf '%s' "$root"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# Sibling worktrees nested UNDER the current root, loaded into the global array
|
|
171
|
+
# `_PROC_NESTED`.
|
|
172
|
+
#
|
|
173
|
+
# WHY: in the ordinary non-bare layout the main checkout's toplevel is a strict
|
|
174
|
+
# PREFIX of every worktree beneath it, so `kill_mine` run from the main checkout
|
|
175
|
+
# would classify every sibling worktree's processes as `mine` — the exact
|
|
176
|
+
# cross-session kill this file exists to prevent, arriving through the boundary
|
|
177
|
+
# rather than around it.
|
|
178
|
+
#
|
|
179
|
+
# AN ARRAY, NOT A DELIMITED STRING, and `--porcelain`, NOT the default format.
|
|
180
|
+
# The first revision of this function did `${line%% *}` over `git worktree list`
|
|
181
|
+
# and joined the results space-delimited, then re-split them with an unquoted
|
|
182
|
+
# `for`. That is the F1 defect class — a path in a text channel — re-created
|
|
183
|
+
# inside the guard written to close a different instance of it. Measured: a
|
|
184
|
+
# worktree at `.worktrees/my branch` truncated to `.worktrees/my`, matched
|
|
185
|
+
# nothing, and was NOT excluded, so the cross-worktree kill came back through
|
|
186
|
+
# the new guard. The unquoted `for` also glob-expanded any path containing `*`.
|
|
187
|
+
# `--porcelain` emits one unambiguous `worktree <path>` line per entry.
|
|
188
|
+
#
|
|
189
|
+
# `git -C "$root"`, not the ambient cwd: with PROC_SH_WORKTREE scoping the
|
|
190
|
+
# boundary to a repo other than the caller's cwd — the documented seam — running
|
|
191
|
+
# git in the cwd returns nothing, and an empty exclusion set is NOT harmless. It
|
|
192
|
+
# is precisely the state this function exists to prevent, so it warns.
|
|
193
|
+
_PROC_NESTED=()
|
|
194
|
+
_proc_load_nested() {
|
|
195
|
+
local root="$1" line p
|
|
196
|
+
_PROC_NESTED=()
|
|
197
|
+
if ! git -C "$root" rev-parse --git-dir >/dev/null 2>&1; then
|
|
198
|
+
echo "proc.sh: warning — cannot enumerate worktrees under '$root' (not a git repo, or git unavailable)." >&2
|
|
199
|
+
echo "proc.sh: nested worktrees will NOT be excluded; a process in one may be classified as yours." >&2
|
|
200
|
+
return 0
|
|
201
|
+
fi
|
|
202
|
+
while IFS= read -r line; do
|
|
203
|
+
[[ "$line" == worktree\ * ]] || continue
|
|
204
|
+
p="${line#worktree }"
|
|
205
|
+
[[ -n "$p" ]] || continue
|
|
206
|
+
p=$(_proc_canon "$p")
|
|
207
|
+
[[ "$p" == "$root" ]] && continue
|
|
208
|
+
[[ "$p" == "$root"/* ]] && _PROC_NESTED+=("$p")
|
|
209
|
+
done < <(git -C "$root" worktree list --porcelain 2>/dev/null || true)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
# Does this pid's own cwd lie inside the ownership boundary?
|
|
213
|
+
#
|
|
214
|
+
# The SINGLE source of truth for the boundary — called once during the walk and
|
|
215
|
+
# again immediately before the signal. The second call narrows the pid-reuse
|
|
216
|
+
# window and re-validates numeric form; it is NOT a forgery defence (a forged
|
|
217
|
+
# pid naming any process whose cwd is inside the boundary would pass it
|
|
218
|
+
# unchanged). The forgery defence is that the channel carries no paths at all.
|
|
219
|
+
#
|
|
220
|
+
# On success it sets `_PROC_OWNS_CWD` to the canonicalized path that PASSED the
|
|
221
|
+
# check, so the caller can report the value the decision was made on rather than
|
|
222
|
+
# taking a third, independent reading.
|
|
223
|
+
_PROC_OWNS_CWD=""
|
|
224
|
+
_proc_owns() {
|
|
225
|
+
local pid="$1" root="$2" cwd n
|
|
226
|
+
_PROC_OWNS_CWD=""
|
|
227
|
+
[[ "$pid" =~ ^[1-9][0-9]*$ ]] || return 1
|
|
228
|
+
cwd=$(readlink "$PROC_SH_ROOT/$pid/cwd" 2>/dev/null) || return 1
|
|
229
|
+
[[ -n "$cwd" ]] || return 1
|
|
230
|
+
# A deleted cwd is reported by the kernel as `<path> (deleted)`, with rc 0.
|
|
231
|
+
# That is a "could not establish where this process is" state, not a path, so
|
|
232
|
+
# it is refused rather than string-matched — no positive proof, no signal.
|
|
233
|
+
#
|
|
234
|
+
# This suffix test is FALSIFIABLE, and deliberately kept anyway (#7537).
|
|
235
|
+
# Measured: a live directory literally named `work (deleted)` reads st_nlink 2
|
|
236
|
+
# while a genuinely deleted cwd reads 0, so the suffix alone cannot tell the
|
|
237
|
+
# two apart. Here that does not matter, because the failure direction is a
|
|
238
|
+
# REFUSAL — a process in such a directory is simply never claimed as ours, and
|
|
239
|
+
# nothing is signalled on the strength of it.
|
|
240
|
+
#
|
|
241
|
+
# The repo-root `scripts/orphan-process-reaper.sh` (a developer-box tool, not
|
|
242
|
+
# shipped to customers, so this path may not exist in your checkout) asks a
|
|
243
|
+
# DIFFERENT question about the same
|
|
244
|
+
# link — "is this inode unlinked?" — and answers it with `stat -Lc '%h'`
|
|
245
|
+
# rather than with the suffix, because for that question the failure direction
|
|
246
|
+
# is a KILL. The two predicates are meant to diverge; unifying them would move
|
|
247
|
+
# this file's refusal onto a test built for the opposite consequence.
|
|
248
|
+
[[ "$cwd" == *' (deleted)' ]] && return 1
|
|
249
|
+
cwd=$(_proc_canon "$cwd")
|
|
250
|
+
for n in ${_PROC_NESTED[@]+"${_PROC_NESTED[@]}"}; do
|
|
251
|
+
[[ "$cwd" == "$n" || "$cwd" == "$n"/* ]] && return 1
|
|
252
|
+
done
|
|
253
|
+
# The trailing `/` is the whole prefix boundary: without it a sibling
|
|
254
|
+
# worktree named `<ROOT>-two` is selected as ours.
|
|
255
|
+
if [[ "$cwd" == "$root" || "$cwd" == "$root"/* ]]; then
|
|
256
|
+
_PROC_OWNS_CWD="$cwd"
|
|
257
|
+
return 0
|
|
258
|
+
fi
|
|
259
|
+
return 1
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
# A string rendered safe to print.
|
|
263
|
+
#
|
|
264
|
+
# `tr -c '[:print:]'`, not a hand-picked list. The first revision mapped only
|
|
265
|
+
# \n \t \r, which is the shape that looks thorough and is not: measured, ESC,
|
|
266
|
+
# BEL, backspace, VT and DEL all survived it. A directory can legally be named
|
|
267
|
+
# $'\033[2K\033[1Aoverwritten', and printing that erases the line above it in
|
|
268
|
+
# the operator's terminal — audit forgery in the tool whose output is the only
|
|
269
|
+
# evidence of what it did. LC_ALL=C so the class is byte-wise; the cost is that
|
|
270
|
+
# non-ASCII path bytes are masked too, which is the right trade here.
|
|
271
|
+
# `printf | tr`, NOT a herestring: `<<<` appends a newline, which is itself
|
|
272
|
+
# non-printing and so became a spurious trailing `?` on every path.
|
|
273
|
+
_proc_sanitize() { printf '%s' "$1" | LC_ALL=C tr -c '[:print:]' '?'; }
|
|
274
|
+
|
|
275
|
+
# The cwd of a pid, re-read and sanitized, for DISPLAY only.
|
|
276
|
+
_proc_show_cwd() {
|
|
277
|
+
local pid="$1" cwd
|
|
278
|
+
cwd=$(readlink "$PROC_SH_ROOT/$pid/cwd" 2>/dev/null) || cwd=""
|
|
279
|
+
[[ -n "$cwd" ]] || { printf '<unreadable>'; return 0; }
|
|
280
|
+
_proc_sanitize "$cwd"
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
# --- Matching --------------------------------------------------------------
|
|
284
|
+
|
|
285
|
+
# Does this /proc/<pid> match PATTERN, by ARGV POSITION rather than by substring
|
|
286
|
+
# anywhere in the joined command line (cq-assert-anchor-not-bare-token applied
|
|
287
|
+
# to process matching)?
|
|
288
|
+
#
|
|
289
|
+
# A substring over the joined cmdline matches any process that merely MENTIONS
|
|
290
|
+
# the target — including `grep -rn test-all.sh scripts/`, so `kill_mine
|
|
291
|
+
# test-all.sh` would kill the operator's own grep.
|
|
292
|
+
_proc_is_match() {
|
|
293
|
+
local d="$1" pat="$2"
|
|
294
|
+
[[ -r "$d/cmdline" ]] || return 1
|
|
295
|
+
|
|
296
|
+
# Portable NUL-separated argv read. NOT `mapfile -d ''` — see PORTABILITY.
|
|
297
|
+
#
|
|
298
|
+
# The `|| [[ -n "$arg" ]]` is load-bearing: `read` returns non-zero at EOF
|
|
299
|
+
# when the final field has no delimiter, so without it the last argv element
|
|
300
|
+
# is silently DISCARDED. Processes that rewrite argv in place (Perl `$0=`,
|
|
301
|
+
# Python setproctitle, several daemons) routinely leave the trailing NUL off,
|
|
302
|
+
# and measured, such a process was invisible to both verbs — a silent
|
|
303
|
+
# `killed=0`, which is the failure this construct was chosen to avoid.
|
|
304
|
+
local -a argv=()
|
|
305
|
+
local arg
|
|
306
|
+
while IFS= read -r -d '' arg || [[ -n "$arg" ]]; do
|
|
307
|
+
argv+=("$arg")
|
|
308
|
+
done < "$d/cmdline"
|
|
309
|
+
(( ${#argv[@]} > 0 )) || return 1
|
|
310
|
+
|
|
311
|
+
# Step over leading wrapper commands AND their own arguments, so
|
|
312
|
+
# `timeout 600 bash suite.sh` is not invisible.
|
|
313
|
+
#
|
|
314
|
+
# A PREVIOUS REVISION GOT THIS WRONG IN THE DANGEROUS DIRECTION and it is
|
|
315
|
+
# recorded here because the failure is subtle: it tolerated arbitrary tokens
|
|
316
|
+
# after any wrapper, which degenerated the whole rule into a bare basename
|
|
317
|
+
# match over every argv element. Measured — `timeout 600 grep -rn test-all.sh
|
|
318
|
+
# scripts/` classified as OURS, so `kill_mine test-all.sh` would have killed
|
|
319
|
+
# the operator's own grep from inside their own worktree, where the cwd test
|
|
320
|
+
# cannot save them. That is exactly the harm the argv-position rule exists to
|
|
321
|
+
# prevent, reintroduced by the fix for wrapper invisibility.
|
|
322
|
+
#
|
|
323
|
+
# So the wrapper walk consumes only what a wrapper can plausibly take —
|
|
324
|
+
# options, VAR=value assignments, bare numeric durations — and then the STRICT
|
|
325
|
+
# rule is re-applied to whatever it lands on. Anything unrecognized ends the
|
|
326
|
+
# walk rather than being skipped: an unmatched run is invisible (fail closed),
|
|
327
|
+
# while a wrongly-matched one is a kill.
|
|
328
|
+
local i=0 b
|
|
329
|
+
while (( i < ${#argv[@]} )); do
|
|
330
|
+
b="${argv[i]##*/}"
|
|
331
|
+
case " $_PROC_WRAPPERS " in
|
|
332
|
+
*" $b "*)
|
|
333
|
+
i=$(( i + 1 ))
|
|
334
|
+
while (( i < ${#argv[@]} )); do
|
|
335
|
+
case "${argv[i]}" in
|
|
336
|
+
-* | *=* | [0-9]*) i=$(( i + 1 )) ;;
|
|
337
|
+
*) break ;;
|
|
338
|
+
esac
|
|
339
|
+
done
|
|
340
|
+
if [[ "$b" == rtk ]]; then
|
|
341
|
+
case "${argv[i]:-}" in run|err|test|proxy|bypass|summary) i=$(( i + 1 )) ;; esac
|
|
342
|
+
while (( i < ${#argv[@]} )); do
|
|
343
|
+
case "${argv[i]}" in
|
|
344
|
+
-* | *=* | [0-9]*) i=$(( i + 1 )) ;;
|
|
345
|
+
*) break ;;
|
|
346
|
+
esac
|
|
347
|
+
done
|
|
348
|
+
fi
|
|
349
|
+
continue
|
|
350
|
+
;;
|
|
351
|
+
esac
|
|
352
|
+
break
|
|
353
|
+
done
|
|
354
|
+
(( i < ${#argv[@]} )) || return 1
|
|
355
|
+
|
|
356
|
+
# The effective command. STRICT from here: it is the target itself, or a
|
|
357
|
+
# shell whose later arguments may name the target. Never an arbitrary command
|
|
358
|
+
# that merely mentions the pattern somewhere in its argv.
|
|
359
|
+
b="${argv[i]##*/}"
|
|
360
|
+
[[ "$b" == "$pat" ]] && return 0
|
|
361
|
+
case " $_PROC_SHELLS " in
|
|
362
|
+
*" $b "*) ;;
|
|
363
|
+
*) return 1 ;;
|
|
364
|
+
esac
|
|
365
|
+
|
|
366
|
+
local tok j
|
|
367
|
+
for (( j = i + 1; j < ${#argv[@]}; j++ )); do
|
|
368
|
+
tok="${argv[j]}"
|
|
369
|
+
[[ "$tok" == *[[:space:]]* ]] && continue
|
|
370
|
+
[[ "${tok##*/}" == "$pat" ]] && return 0
|
|
371
|
+
done
|
|
372
|
+
return 1
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
# --- The single walk -------------------------------------------------------
|
|
376
|
+
#
|
|
377
|
+
# ONE walk, shared by both verbs, so there is exactly one place where a pid can
|
|
378
|
+
# be classified. Emits `<class><TAB><pid>` where class is one of the literals
|
|
379
|
+
# below and pid is numeric — NO PATHS (see the header). `total` carries a count
|
|
380
|
+
# rather than a pid.
|
|
381
|
+
_proc_scan() {
|
|
382
|
+
local pat="$1" root="$2"
|
|
383
|
+
local excluded self_pgrp d pid pgrp scanned=0
|
|
384
|
+
|
|
385
|
+
excluded=" $(_proc_self_and_ancestors)"
|
|
386
|
+
|
|
387
|
+
# Own process GROUP. The command-substitution subshells and `&`-backgrounded
|
|
388
|
+
# forks of THIS very invocation share its pgid but are NOT in the ancestor
|
|
389
|
+
# chain, so ancestry alone lets proc.sh select a transient fork of itself. A
|
|
390
|
+
# genuinely separate session has a DIFFERENT pgid, so pgid is the exact
|
|
391
|
+
# discriminator.
|
|
392
|
+
self_pgrp=$(_proc_pgrp "$PROC_SH_ROOT/$PROC_SH_SELF_PID/stat" 2>/dev/null) || self_pgrp=""
|
|
393
|
+
[[ "$self_pgrp" =~ ^[0-9]+$ ]] || self_pgrp=""
|
|
394
|
+
|
|
395
|
+
for d in "$PROC_SH_ROOT"/[0-9]*; do
|
|
396
|
+
[[ -d "$d" ]] || continue
|
|
397
|
+
pid="${d##*/}"
|
|
398
|
+
# The glob only guarantees a LEADING digit: `12abc` and `0` both match it,
|
|
399
|
+
# and `kill -TERM 0` signals the caller's whole process group. Validated
|
|
400
|
+
# here so no non-pid can reach the signal site.
|
|
401
|
+
[[ "$pid" =~ ^[1-9][0-9]*$ ]] || continue
|
|
402
|
+
scanned=$(( scanned + 1 ))
|
|
403
|
+
|
|
404
|
+
[[ "$excluded" == *" $pid "* ]] && continue
|
|
405
|
+
_proc_is_match "$d" "$pat" || continue
|
|
406
|
+
|
|
407
|
+
pgrp=$(_proc_pgrp "$d/stat") || pgrp=""
|
|
408
|
+
if [[ -n "$self_pgrp" ]] && [[ "$pgrp" == "$self_pgrp" ]]; then
|
|
409
|
+
printf 'skip\t%s\n' "$pid"
|
|
410
|
+
continue
|
|
411
|
+
fi
|
|
412
|
+
|
|
413
|
+
if _proc_owns "$pid" "$root"; then
|
|
414
|
+
printf 'signal\t%s\n' "$pid"
|
|
415
|
+
else
|
|
416
|
+
printf 'refuse\t%s\n' "$pid"
|
|
417
|
+
fi
|
|
418
|
+
done
|
|
419
|
+
|
|
420
|
+
printf 'total\t%s\n' "$scanned"
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
# Reject a pattern that can never match, loudly. Both comparisons are against a
|
|
424
|
+
# BASENAME, so a pattern containing `/` matches nothing — and would print
|
|
425
|
+
# `killed=0`, which reads as "nothing to kill" and sends the operator back to
|
|
426
|
+
# pkill.
|
|
427
|
+
_proc_check_pattern() {
|
|
428
|
+
local pat="$1" verb="$2"
|
|
429
|
+
if [[ -z "$pat" ]]; then
|
|
430
|
+
echo "usage: $verb <pattern> [signal]" >&2
|
|
431
|
+
return 2
|
|
432
|
+
fi
|
|
433
|
+
if [[ "$pat" == */* ]]; then
|
|
434
|
+
echo "proc.sh: pattern '$pat' contains '/' and can never match — matching is on the BASENAME." >&2
|
|
435
|
+
echo "proc.sh: use '${pat##*/}' instead." >&2
|
|
436
|
+
return 2
|
|
437
|
+
fi
|
|
438
|
+
return 0
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
# --- Verbs -----------------------------------------------------------------
|
|
442
|
+
|
|
443
|
+
# list_runs <pattern>
|
|
444
|
+
#
|
|
445
|
+
# Enumerate every matching process, each labelled with the worktree that owns
|
|
446
|
+
# it. Signals nothing — this is the dry run, and the thing to reach for first.
|
|
447
|
+
list_runs() {
|
|
448
|
+
local pat="${1:-}"
|
|
449
|
+
_proc_check_pattern "$pat" list_runs || return $?
|
|
450
|
+
local root
|
|
451
|
+
root=$(_proc_worktree) || return 1
|
|
452
|
+
_proc_load_nested "$root"
|
|
453
|
+
|
|
454
|
+
local cls pid n=0
|
|
455
|
+
while IFS=$'\t' read -r cls pid; do
|
|
456
|
+
case "$cls" in
|
|
457
|
+
signal) printf '%s\tmine\t%s\n' "$pid" "$(_proc_show_cwd "$pid")"; n=$(( n + 1 )) ;;
|
|
458
|
+
refuse) printf '%s\tforeign\t%s\n' "$pid" "$(_proc_show_cwd "$pid")"; n=$(( n + 1 )) ;;
|
|
459
|
+
skip) printf '%s\tskipped\tsame-process-group\n' "$pid"; n=$(( n + 1 )) ;;
|
|
460
|
+
*) ;;
|
|
461
|
+
esac
|
|
462
|
+
done < <(_proc_scan "$pat" "$root")
|
|
463
|
+
|
|
464
|
+
(( n > 0 )) || echo "no processes match '$pat'"
|
|
465
|
+
return 0
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
# kill_mine <pattern> [signal]
|
|
469
|
+
#
|
|
470
|
+
# Signal ONLY the matching processes whose own cwd is inside the current
|
|
471
|
+
# worktree. Everything else is refused AND printed — a refusal you cannot see
|
|
472
|
+
# is indistinguishable from a match that never happened.
|
|
473
|
+
#
|
|
474
|
+
# Individual pids are signalled, never a process group: `kill -TERM 0` can
|
|
475
|
+
# reach the parent. Default TERM; the caller may pass another signal, and no
|
|
476
|
+
# escalation to KILL happens on its own.
|
|
477
|
+
kill_mine() {
|
|
478
|
+
local pat="${1:-}" sig="${2:-TERM}"
|
|
479
|
+
_proc_check_pattern "$pat" kill_mine || return $?
|
|
480
|
+
local root
|
|
481
|
+
root=$(_proc_worktree) || return 1
|
|
482
|
+
_proc_load_nested "$root"
|
|
483
|
+
|
|
484
|
+
# Fail SAFE, not open: anything other than an explicit off value means dry
|
|
485
|
+
# run. The previous form matched only the literal `1`, so PROC_SH_DRY_RUN=true
|
|
486
|
+
# performed a REAL kill on an operator who had asked for a rehearsal.
|
|
487
|
+
local dry=0
|
|
488
|
+
case "${PROC_SH_DRY_RUN:-0}" in
|
|
489
|
+
0 | false | "") dry=0 ;;
|
|
490
|
+
*) dry=1 ;;
|
|
491
|
+
esac
|
|
492
|
+
|
|
493
|
+
local killed=0 would=0 refused=0 late=0 skipped=0 failed=0 scanned=0
|
|
494
|
+
local cls pid rc shown
|
|
495
|
+
while IFS=$'\t' read -r cls pid; do
|
|
496
|
+
case "$cls" in
|
|
497
|
+
signal)
|
|
498
|
+
# Re-verify ownership at the signal site. The walk's verdict is about a
|
|
499
|
+
# pid at scan time; a pid can die and be recycled onto an unrelated
|
|
500
|
+
# process before this line runs. One extra readlink narrows that window.
|
|
501
|
+
if ! _proc_owns "$pid" "$root"; then
|
|
502
|
+
late=$(( late + 1 ))
|
|
503
|
+
printf 'refused pid=%s reason=%s\n' "$pid" "ownership-changed-before-signal"
|
|
504
|
+
continue
|
|
505
|
+
fi
|
|
506
|
+
# Capture the display path from the SAME check that authorized the
|
|
507
|
+
# signal, BEFORE sending it. Re-reading afterwards loses the path
|
|
508
|
+
# exactly when the kill succeeds — the process is gone, readlink fails,
|
|
509
|
+
# and the record degrades to `<unreadable>`. Measured: a live run
|
|
510
|
+
# printed `signalled pid=954752 cwd=<unreadable>` while the dry run
|
|
511
|
+
# printed the real path, so the rehearsal showed what the real run hid.
|
|
512
|
+
shown=$(_proc_sanitize "$_PROC_OWNS_CWD")
|
|
513
|
+
if (( dry )); then
|
|
514
|
+
would=$(( would + 1 ))
|
|
515
|
+
printf 'would-signal pid=%s cwd=%s\n' "$pid" "$shown"
|
|
516
|
+
continue
|
|
517
|
+
fi
|
|
518
|
+
rc=0
|
|
519
|
+
kill -"$sig" "$pid" 2>/dev/null || rc=$?
|
|
520
|
+
if (( rc == 0 )); then
|
|
521
|
+
killed=$(( killed + 1 ))
|
|
522
|
+
printf 'signalled pid=%s cwd=%s\n' "$pid" "$shown"
|
|
523
|
+
else
|
|
524
|
+
# A swallowed failure counted as a kill is a lie in the direction
|
|
525
|
+
# that matters: the operator reads killed=1 and stops looking.
|
|
526
|
+
failed=$(( failed + 1 ))
|
|
527
|
+
printf 'FAILED pid=%s rc=%s (signal not delivered)\n' "$pid" "$rc"
|
|
528
|
+
fi
|
|
529
|
+
;;
|
|
530
|
+
refuse)
|
|
531
|
+
refused=$(( refused + 1 ))
|
|
532
|
+
printf 'refused pid=%s cwd=%s\n' "$pid" "$(_proc_show_cwd "$pid")"
|
|
533
|
+
;;
|
|
534
|
+
skip)
|
|
535
|
+
skipped=$(( skipped + 1 ))
|
|
536
|
+
printf 'refused pid=%s reason=%s\n' "$pid" "same-process-group"
|
|
537
|
+
;;
|
|
538
|
+
total) scanned="$pid" ;;
|
|
539
|
+
*) ;;
|
|
540
|
+
esac
|
|
541
|
+
done < <(_proc_scan "$pat" "$root")
|
|
542
|
+
|
|
543
|
+
# Printed on EVERY invocation. `skipped_same_pgroup` is counted SEPARATELY
|
|
544
|
+
# because the pgid exclusion can legitimately suppress a real target — under
|
|
545
|
+
# a non-interactive shell without job control, a run launched with `&` from
|
|
546
|
+
# the same shell shares this pgid. A bare `killed=0` would then read as
|
|
547
|
+
# "nothing to kill" and send the operator straight back to pkill, which is
|
|
548
|
+
# the precise failure this file exists to prevent, one level down. The
|
|
549
|
+
# documented workaround is to launch under `setsid`, which creates a new pgid.
|
|
550
|
+
# `mode` is on the line because output alone could not previously distinguish
|
|
551
|
+
# a rehearsal from a real kill.
|
|
552
|
+
# `would_signal` is separate from `killed` so a rehearsal never reports kills
|
|
553
|
+
# it did not perform, and `late_refused` is separate from `refused` so the
|
|
554
|
+
# signal-site re-check is visible as its own enforcement point rather than
|
|
555
|
+
# being folded into the walk's verdict.
|
|
556
|
+
printf 'killed=%s would_signal=%s failed=%s refused=%s late_refused=%s skipped_same_pgroup=%s scanned=%s mode=%s\n' \
|
|
557
|
+
"$killed" "$would" "$failed" "$refused" "$late" "$skipped" "$scanned" \
|
|
558
|
+
"$( (( dry )) && printf 'dry-run' || printf 'live' )"
|
|
559
|
+
return 0
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
# Allow `bash proc.sh <fn> <args>` as a CLI shim (used by SKILL.md pointers and
|
|
563
|
+
# ad-hoc operator invocations), mirroring session-state.sh's dispatch.
|
|
564
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
565
|
+
fn="${1:-}"
|
|
566
|
+
shift || true
|
|
567
|
+
case "$fn" in
|
|
568
|
+
list_runs | kill_mine)
|
|
569
|
+
"$fn" "$@"
|
|
570
|
+
;;
|
|
571
|
+
"")
|
|
572
|
+
echo "usage: $0 {list_runs|kill_mine} <pattern> [signal]" >&2
|
|
573
|
+
exit 2
|
|
574
|
+
;;
|
|
575
|
+
*)
|
|
576
|
+
echo "proc.sh: unknown function: $fn" >&2
|
|
577
|
+
exit 2
|
|
578
|
+
;;
|
|
579
|
+
esac
|
|
580
|
+
fi
|