@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,483 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# pr-overlap-preflight.sh -- before work starts and before a merge is armed, list the OTHER open
|
|
3
|
+
# changes on this repository that overlap with this one. READ-ONLY: it never comments on, edits,
|
|
4
|
+
# closes or pushes to anyone's change (a skill never edits another session's change).
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# pr-overlap-preflight.sh [--mode start|merge] [--pr <N>] [--files "<f ...>"] [--vehicle <N>|this]
|
|
8
|
+
#
|
|
9
|
+
# --mode start (default; no change needs to exist yet) or merge (a change must exist and the
|
|
10
|
+
# starting point must be readable, otherwise exit 2)
|
|
11
|
+
# --pr this change's number (default: read from `gh pr view`)
|
|
12
|
+
# --files the files this change touches, space-separated (default: git diff --no-renames
|
|
13
|
+
# --name-only origin/main...HEAD)
|
|
14
|
+
# --vehicle the change a CTO ruling designated to carry the work. Taken from this flag ONLY, never
|
|
15
|
+
# parsed out of prose. `this` means THIS change is the vehicle (usable before a change
|
|
16
|
+
# exists).
|
|
17
|
+
#
|
|
18
|
+
# An "overlap" is an open change that (a) edits a file in the set, or (b) carries a change with the
|
|
19
|
+
# same title as one of ours (generic titles such as `chore: initialize ...`, `WIP ...`, merge commits
|
|
20
|
+
# and titles under 20 characters are ignored). Generated files (lockfiles, suite timing tables,
|
|
21
|
+
# *.likec4.json, rule-body-hashes.txt, *.baseline.txt) never count as shared files.
|
|
22
|
+
#
|
|
23
|
+
# A DUPLICATE is an overlap where the other change makes the identical edit (equal per-file patch
|
|
24
|
+
# identity) on ALL of our changed files, or on at least two of them; or carries the same title. One
|
|
25
|
+
# identical hunk in one of several shared files is not a duplicate.
|
|
26
|
+
#
|
|
27
|
+
# Who can stop a merge: only a change whose author is OWNER, MEMBER or COLLABORATOR of the repository
|
|
28
|
+
# (GitHub's author_association, read from the REST list of open pulls) can produce exit 10 or 12. A
|
|
29
|
+
# change from anyone else is listed for information (exit 13) and costs no history or diff reads.
|
|
30
|
+
#
|
|
31
|
+
# Exit codes (graduated: only a duplicate or a designated vehicle stops a merge):
|
|
32
|
+
# 0 clear: nothing overlaps
|
|
33
|
+
# 10 overlap and the designated vehicle is the OTHER (team) change: this one carves out
|
|
34
|
+
# 11 overlap and THIS change is the vehicle: the others carve out (informational)
|
|
35
|
+
# 12 a duplicate (same edit or same title) by a team author and no vehicle designated: the caller
|
|
36
|
+
# spawns the CTO to designate one and records the ruling (never an operator question)
|
|
37
|
+
# 13 overlap on shared files only, or any overlap by a non-team author, no vehicle: informational,
|
|
38
|
+
# nothing stops
|
|
39
|
+
# 2 could not check, or called wrongly (printed as "I could not check", never as clear)
|
|
40
|
+
#
|
|
41
|
+
# Cost bounds: one list call plus one author read (100 a page); same-title history is read only for
|
|
42
|
+
# team changes that share a file (per_page=100); a diff is downloaded only when the other change's
|
|
43
|
+
# per-file additions/deletions equal ours; at most 20 diffs; the whole run stops comparing after 45
|
|
44
|
+
# seconds (PR_OVERLAP_DEADLINE_SECS overrides, whole seconds, 1 to 999) and says so, with `deadline=hit`
|
|
45
|
+
# on the last line. Without `timeout`/`gtimeout` the clock is checked before every call.
|
|
46
|
+
#
|
|
47
|
+
# Output: a plain-language human block, then ONE last line for the calling agent:
|
|
48
|
+
# SOLEUR_OVERLAP exit=<code> prs=<n,n|none> vehicle=<n|this|none>[ deadline=hit]
|
|
49
|
+
# A change from outside the team is shown as a link only: its title is never printed.
|
|
50
|
+
# Titles are attacker-controllable text on a public repository: they are printed as data (control,
|
|
51
|
+
# format, bidirectional and line-separator characters stripped, change number and conventional-commit
|
|
52
|
+
# prefix removed, 80 characters), never executed and never placed in a question option.
|
|
53
|
+
#
|
|
54
|
+
# `set -uo pipefail`, deliberately NOT `-e`: the scanners are pipelines whose grep exits 1 on no
|
|
55
|
+
# match. Portable to bash 3.2 and mawk (no associative arrays, no mapfile, no ${var,,}, no sed -i).
|
|
56
|
+
# Lines carrying `# mut:<name>` are the mutation points the suite replaces to prove each check can
|
|
57
|
+
# fail.
|
|
58
|
+
|
|
59
|
+
set -uo pipefail
|
|
60
|
+
export LC_ALL=C
|
|
61
|
+
|
|
62
|
+
MODE=start
|
|
63
|
+
PR_ARG=""
|
|
64
|
+
FILES_ARG=""
|
|
65
|
+
FILES_SET=0
|
|
66
|
+
VEHICLE=""
|
|
67
|
+
|
|
68
|
+
PAGE_CAP=100 # mut:paginate
|
|
69
|
+
LIST_CAP=200 # mut:lcap
|
|
70
|
+
DIFF_CAP=20
|
|
71
|
+
DEADLINE_SECS=45
|
|
72
|
+
deadline_ok() { case "${1-}" in '' | *[!0-9]*) return 1 ;; esac; [ "${#1}" -le 3 ] && [ "$((10#$1))" -gt 0 ]; } # mut:envcheck
|
|
73
|
+
if deadline_ok "${PR_OVERLAP_DEADLINE_SECS:-}"; then DEADLINE_SECS=$((10#$PR_OVERLAP_DEADLINE_SECS)); fi
|
|
74
|
+
T0=$SECONDS
|
|
75
|
+
DEADLINE_HIT=0
|
|
76
|
+
TO_BIN=""
|
|
77
|
+
if command -v timeout >/dev/null 2>&1; then TO_BIN=timeout; elif command -v gtimeout >/dev/null 2>&1; then TO_BIN=gtimeout; fi
|
|
78
|
+
|
|
79
|
+
say() { printf '%s\n' "$*"; }
|
|
80
|
+
|
|
81
|
+
over_deadline() { [ $((SECONDS - T0)) -ge "$DEADLINE_SECS" ]; } # mut:deadline
|
|
82
|
+
|
|
83
|
+
finish() { # finish <code> <csv|none>
|
|
84
|
+
local v="${VEHICLE:-none}" tok=""
|
|
85
|
+
[ "$DEADLINE_HIT" -eq 1 ] && tok=" deadline=hit" # mut:dltoken
|
|
86
|
+
if [ -z "$TO_BIN" ]; then
|
|
87
|
+
say "This machine has no time-limit tool, so one slow answer from GitHub cannot be cut off; no call starts after the deadline, and a call already running is waited for."
|
|
88
|
+
fi
|
|
89
|
+
printf 'SOLEUR_OVERLAP exit=%s prs=%s vehicle=%s%s\n' "$1" "${2:-none}" "$v" "$tok"
|
|
90
|
+
exit "$1"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
cannot_check() { # cannot_check <plain reason> [noretry]
|
|
94
|
+
say "I could not check whether other open work overlaps with this change ($1)."
|
|
95
|
+
say "It was not checked, and that is not a clear result."
|
|
96
|
+
if [ "${2:-}" = noretry ]; then
|
|
97
|
+
say "Next step for me: continue, and say plainly that the overlap check did not run."
|
|
98
|
+
else
|
|
99
|
+
say "Next step for me: retry once, then continue and say plainly that it was not checked."
|
|
100
|
+
fi
|
|
101
|
+
finish 2 none
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
usage_error() { # usage_error <plain reason>
|
|
105
|
+
say "I could not check whether other open work overlaps with this change ($1)."
|
|
106
|
+
say "It was not checked, and that is not a clear result."
|
|
107
|
+
say "Next step for me: correct the way I called the check (pr-overlap.md lists the options) and run it again."
|
|
108
|
+
finish 2 none
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
is_int() { # digits only, 1 to 9 of them
|
|
112
|
+
case "${1-}" in '' | *[!0-9]*) return 1 ;; esac
|
|
113
|
+
[ "${#1}" -le 9 ]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# Bound every network call by its own cap and by what is left of the run deadline. Where neither
|
|
117
|
+
# `timeout` nor `gtimeout` exists (a stock macOS) a running call cannot be cut off, so no call is
|
|
118
|
+
# started once the deadline has passed (status 124, as a killed call would give) and the output says
|
|
119
|
+
# so; the callers retry once and then continue with a visible notice.
|
|
120
|
+
bounded() { # bounded <seconds> <cmd...>
|
|
121
|
+
local secs="$1" left
|
|
122
|
+
shift
|
|
123
|
+
if [ -z "$TO_BIN" ] && over_deadline; then return 124; fi # mut:notimeoutguard
|
|
124
|
+
left=$((DEADLINE_SECS - (SECONDS - T0)))
|
|
125
|
+
[ "$left" -lt 1 ] && left=1
|
|
126
|
+
[ "$secs" -gt "$left" ] && secs="$left" # mut:clip
|
|
127
|
+
if [ -n "$TO_BIN" ]; then
|
|
128
|
+
"$TO_BIN" "$secs" "$@"
|
|
129
|
+
else
|
|
130
|
+
"$@"
|
|
131
|
+
fi
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
# ---- arguments -------------------------------------------------------------------------------
|
|
135
|
+
while [ $# -gt 0 ]; do
|
|
136
|
+
case "$1" in
|
|
137
|
+
--mode)
|
|
138
|
+
[ $# -ge 2 ] || usage_error "the request to this check was incomplete"
|
|
139
|
+
case "$2" in
|
|
140
|
+
start | merge) MODE="$2" ;;
|
|
141
|
+
*) usage_error "the request to this check named an unknown mode" ;;
|
|
142
|
+
esac
|
|
143
|
+
shift 2 ;;
|
|
144
|
+
--pr)
|
|
145
|
+
[ $# -ge 2 ] || usage_error "the request to this check was incomplete"
|
|
146
|
+
is_int "$2" || usage_error "the request to this check gave a change number that is not a number"
|
|
147
|
+
PR_ARG="$2"; shift 2 ;;
|
|
148
|
+
--files)
|
|
149
|
+
[ $# -ge 2 ] || usage_error "the request to this check was incomplete"
|
|
150
|
+
FILES_ARG="$2"; FILES_SET=1; shift 2 ;;
|
|
151
|
+
--vehicle)
|
|
152
|
+
[ $# -ge 2 ] || usage_error "the request to this check was incomplete"
|
|
153
|
+
if [ "$2" = this ] || is_int "$2"; then VEHICLE="$2"; else
|
|
154
|
+
usage_error "the request to this check named a vehicle that is not a number"
|
|
155
|
+
fi
|
|
156
|
+
shift 2 ;;
|
|
157
|
+
*) usage_error "the request to this check had an option I do not recognise" ;;
|
|
158
|
+
esac
|
|
159
|
+
done
|
|
160
|
+
|
|
161
|
+
command -v gh >/dev/null 2>&1 || cannot_check "the GitHub tool is not available here" noretry
|
|
162
|
+
command -v jq >/dev/null 2>&1 || cannot_check "a required reading tool is not available here" noretry
|
|
163
|
+
command -v git >/dev/null 2>&1 || cannot_check "git is not available here" noretry
|
|
164
|
+
|
|
165
|
+
WORK="$(mktemp -d "${TMPDIR:-/tmp}/pr-overlap.XXXXXXXX")" || cannot_check "I could not make a scratch folder"
|
|
166
|
+
trap 'rm -rf "$WORK"' EXIT # mut:write
|
|
167
|
+
|
|
168
|
+
# ---- jq helpers -------------------------------------------------------------------------------
|
|
169
|
+
# clean drops control characters, C1 controls, soft hyphen, Arabic letter mark, Mongolian vowel
|
|
170
|
+
# separator, zero-width and directional marks, line and paragraph separators, bidirectional
|
|
171
|
+
# embeddings and isolates, invisible operators, the byte-order mark, interlinear annotation marks and
|
|
172
|
+
# tag characters: everything a stranger could use to hide, reorder or split the text of a title.
|
|
173
|
+
JQ_DEFS='
|
|
174
|
+
def clean: explode | map(select(. >= 32 and . != 127 and (. < 128 or . > 159) and . != 173 and . != 1564 and . != 6158 and (. < 8203 or . > 8207) and (. < 8232 or . > 8238) and (. < 8288 or . > 8297) and . != 65279 and (. < 65529 or . > 65531) and (. < 917504 or . > 917631))) | implode; # mut:clean
|
|
175
|
+
def norm: clean | sub("\\s*\\(#[0-9]+\\)\\s*$";"") | ascii_downcase | gsub("\\s+";" ") | sub("^ +";"") | sub(" +$";""); # mut:norm
|
|
176
|
+
def short: length < 20; # mut:short
|
|
177
|
+
def generic: test("^(chore: initialize|wip(:| |$)|fixup!|squash!|merge )") or . == "chore: record plan-phase session state" or short; # mut:generic
|
|
178
|
+
def disp: clean | sub("\\s*\\(#[0-9]+\\)\\s*$";"") | sub("^[a-zA-Z]+(\\([^)]*\\))?!?: *";"") | gsub("#(?=[0-9])";"") | gsub("\\s+";" ") | sub("^ +";"") | sub(" +$";"") | (if length == 0 then "untitled" else . end) | (if length > 80 then .[0:77] + "..." else . end);
|
|
179
|
+
def shown: if .trusted then "\"" + (.title | disp) + "\"" else "a change from someone outside the team" end; # mut:untitle
|
|
180
|
+
def noise: test("(^|/)(package-lock\\.json|npm-shrinkwrap\\.json|bun\\.lockb?|yarn\\.lock|pnpm-lock\\.yaml|Gemfile\\.lock|Cargo\\.lock|poetry\\.lock|uv\\.lock|composer\\.lock|go\\.sum|suite-[a-z-]+\\.tsv|rule-body-hashes\\.txt)$") or test("\\.likec4\\.json$") or test("\\.baseline\\.txt$"); # mut:noise
|
|
181
|
+
def trusted: IN("OWNER","MEMBER","COLLABORATOR"); # mut:assoc
|
|
182
|
+
'
|
|
183
|
+
SELF_DEFS='
|
|
184
|
+
def own_number: (.number | tostring) == $cur; # mut:selfnum
|
|
185
|
+
def own_branch: $head != "" and .headRefName == $head and ((.isCrossRepository // false) | not) or ($head != "" and .headRefName == $head and $owner != "" and (.headRepositoryOwner.login // "") == $owner); # mut:selfbranch
|
|
186
|
+
'
|
|
187
|
+
SHARED_DEFS='
|
|
188
|
+
def sharedfiles($eff; $ours): [$eff[] | clean | select((noise | not) and IN($ours[]))] | unique; # mut:samefile
|
|
189
|
+
'
|
|
190
|
+
EDIT_RULE_JQ='$e >= 2 or ($e >= 1 and $e == $o)' # mut:dup
|
|
191
|
+
|
|
192
|
+
# ---- this change ----------------------------------------------------------------------------
|
|
193
|
+
CUR_HEAD="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
|
|
194
|
+
[ "$CUR_HEAD" = HEAD ] && CUR_HEAD=""
|
|
195
|
+
CUR_PR="$PR_ARG"
|
|
196
|
+
VIEW_OWNER=""
|
|
197
|
+
if [ -z "$CUR_PR" ]; then
|
|
198
|
+
VIEW_JSON="$(bounded 30 gh pr view --json number,headRefName,headRepositoryOwner 2>/dev/null)"
|
|
199
|
+
vrc=$?
|
|
200
|
+
if [ "$vrc" -eq 0 ] && VIEW_N="$(printf '%s' "$VIEW_JSON" | jq -er '.number' 2>/dev/null)" && is_int "$VIEW_N"; then
|
|
201
|
+
CUR_PR="$VIEW_N"
|
|
202
|
+
VIEW_H="$(printf '%s' "$VIEW_JSON" | jq -r '.headRefName // empty' 2>/dev/null)"
|
|
203
|
+
[ -n "$VIEW_H" ] && CUR_HEAD="$VIEW_H"
|
|
204
|
+
VIEW_OWNER="$(printf '%s' "$VIEW_JSON" | jq -r '.headRepositoryOwner.login // empty' 2>/dev/null)"
|
|
205
|
+
elif [ "$MODE" = merge ]; then
|
|
206
|
+
cannot_check "I could not find this change on GitHub"
|
|
207
|
+
fi
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
BASE_OK=0
|
|
211
|
+
git rev-parse --verify -q 'origin/main^{commit}' >/dev/null 2>&1 && BASE_OK=1
|
|
212
|
+
if [ "$MODE" = merge ] && [ "$BASE_OK" -ne 1 ]; then
|
|
213
|
+
cannot_check "I cannot see where this work started from"
|
|
214
|
+
fi
|
|
215
|
+
|
|
216
|
+
OWN_FILES=""
|
|
217
|
+
if [ "$FILES_SET" -eq 1 ]; then
|
|
218
|
+
set -f
|
|
219
|
+
for f in $FILES_ARG; do OWN_FILES="$OWN_FILES$f"$'\n'; done
|
|
220
|
+
set +f
|
|
221
|
+
else
|
|
222
|
+
[ "$BASE_OK" -eq 1 ] || cannot_check "I could not read which files this change touches"
|
|
223
|
+
OWN_FILES="$(git diff --no-renames --name-only origin/main...HEAD 2>/dev/null)" # mut:norenames
|
|
224
|
+
rc=$?
|
|
225
|
+
[ "$rc" -eq 0 ] || cannot_check "I could not read which files this change touches"
|
|
226
|
+
fi
|
|
227
|
+
OURS_JSON="$(printf '%s\n' "$OWN_FILES" | jq -R -s -c "$JQ_DEFS"' split("\n") | map(select(length > 0 and (noise | not))) | unique')" \
|
|
228
|
+
|| cannot_check "I could not read which files this change touches"
|
|
229
|
+
NOURS="$(printf '%s' "$OURS_JSON" | jq 'length')"
|
|
230
|
+
NEED=2
|
|
231
|
+
[ "$NOURS" -lt 2 ] && NEED="$NOURS"
|
|
232
|
+
|
|
233
|
+
# Our own per-file additions and deletions, to compare with the numbers the list already carries.
|
|
234
|
+
OWN_STATS='{}'
|
|
235
|
+
if [ "$BASE_OK" -eq 1 ]; then
|
|
236
|
+
OWN_STATS="$(git diff --no-renames --numstat origin/main...HEAD 2>/dev/null \
|
|
237
|
+
| jq -R -s -c 'split("\n") | map(select(length > 0) | split("\t") | select(length >= 3 and .[0] != "-") | {key: .[2], value: (.[0] + ":" + .[1])}) | from_entries')" \
|
|
238
|
+
|| OWN_STATS='{}'
|
|
239
|
+
fi
|
|
240
|
+
HAVE_EDITS="$(printf '%s' "$OURS_JSON" | jq --argjson st "$OWN_STATS" '[.[] | select($st[.] != null)] | length')"
|
|
241
|
+
|
|
242
|
+
OWN_SUBJECTS=""
|
|
243
|
+
if [ "$BASE_OK" -eq 1 ]; then
|
|
244
|
+
OWN_SUBJECTS="$(git log --no-merges --format=%s origin/main..HEAD 2>/dev/null)"
|
|
245
|
+
rc=$?
|
|
246
|
+
if [ "$rc" -ne 0 ] && [ "$MODE" = merge ]; then cannot_check "I could not read the titles of this change's steps"; fi
|
|
247
|
+
fi
|
|
248
|
+
SUBJ_OURS_JSON="$(printf '%s\n' "$OWN_SUBJECTS" | jq -R -s -c "$JQ_DEFS"' split("\n") | map(norm | select(length > 0 and (generic | not))) | unique')" \
|
|
249
|
+
|| cannot_check "I could not read the titles of this change's steps"
|
|
250
|
+
|
|
251
|
+
# ---- the other open changes ---------------------------------------------------------------------
|
|
252
|
+
LIST_JSON="$(bounded 40 gh pr list --state open -L "$LIST_CAP" --json number,title,url,isDraft,files,headRefName,headRepositoryOwner,isCrossRepository 2>/dev/null)"
|
|
253
|
+
rc=$?
|
|
254
|
+
[ "$rc" -ne 0 ] && cannot_check "GitHub did not answer when I asked for the open changes" # mut:listfail
|
|
255
|
+
printf '%s' "$LIST_JSON" | jq -e 'type == "array"' >/dev/null 2>&1 \
|
|
256
|
+
|| cannot_check "GitHub gave me an answer I could not read"
|
|
257
|
+
LIST_COUNT="$(printf '%s' "$LIST_JSON" | jq 'length')"
|
|
258
|
+
|
|
259
|
+
# Who wrote each change. `gh pr list --json` has no author-association field, so read it from the REST
|
|
260
|
+
# list of open pulls (one paginated call, 100 a page). Without it nobody can be told from a stranger,
|
|
261
|
+
# so a failed read is "could not check", never a guess.
|
|
262
|
+
ASSOC_MAP='{}'
|
|
263
|
+
if [ "$LIST_COUNT" -gt 0 ]; then
|
|
264
|
+
ASSOC_RAW="$(bounded 30 gh api "repos/{owner}/{repo}/pulls?state=open&per_page=100" --paginate --jq '.[] | {number: .number, assoc: (.author_association // "")}' 2>/dev/null)"
|
|
265
|
+
rc=$?
|
|
266
|
+
[ "$rc" -ne 0 ] && cannot_check "GitHub did not answer when I asked who wrote the open changes" # mut:authread
|
|
267
|
+
ASSOC_MAP="$(printf '%s\n' "$ASSOC_RAW" | jq -s -c 'map({key: (.number | tostring), value: .assoc}) | from_entries')" \
|
|
268
|
+
|| cannot_check "GitHub gave me an answer I could not read"
|
|
269
|
+
fi
|
|
270
|
+
|
|
271
|
+
# This change is never an overlap: not by number, and not a change from the same branch of this
|
|
272
|
+
# repository (a fork's change that merely shares the branch name is somebody else's).
|
|
273
|
+
OTHERS="$(printf '%s' "$LIST_JSON" | jq -c --arg cur "$CUR_PR" --arg head "$CUR_HEAD" --arg owner "$VIEW_OWNER" --argjson assoc "$ASSOC_MAP" "$SELF_DEFS"'[.[] | select((own_number or own_branch) | not) | .authorAssociation = ($assoc[(.number | tostring)] // "")]')" \
|
|
274
|
+
|| cannot_check "GitHub gave me an answer I could not read"
|
|
275
|
+
|
|
276
|
+
# A change that lists PAGE_CAP files may have more: GitHub caps the list per change. Re-read the team
|
|
277
|
+
# changes whose first page shares nothing with us, with a paginated call; a failed re-read is "could
|
|
278
|
+
# not check", never clear. Nothing to look for (no files) or nothing to learn (the first page already
|
|
279
|
+
# shares a file) means no call.
|
|
280
|
+
OV='{}'
|
|
281
|
+
CAPPED=""
|
|
282
|
+
if [ "$NOURS" -gt 0 ]; then
|
|
283
|
+
CAPPED="$(printf '%s' "$OTHERS" | jq -r --argjson cap "$PAGE_CAP" --argjson ours "$OURS_JSON" "$JQ_DEFS"'.[] | select(((.authorAssociation // "") | trusted) and (.files | length) >= $cap and ([.files[]?.path | clean | select((noise | not) and IN($ours[]))] | length) == 0) | .number')"
|
|
284
|
+
fi
|
|
285
|
+
for n in $CAPPED; do
|
|
286
|
+
over_deadline && cannot_check "I ran out of time reading the full file list of a large change"
|
|
287
|
+
pages="$(bounded 30 gh api "repos/{owner}/{repo}/pulls/$n/files?per_page=100" --paginate --jq '.[].filename' 2>/dev/null)"
|
|
288
|
+
rc=$?
|
|
289
|
+
[ "$rc" -ne 0 ] && cannot_check "GitHub did not answer when I asked for the full file list of a large change" # mut:pagefail
|
|
290
|
+
arr="$(printf '%s\n' "$pages" | jq -R -s -c 'split("\n") | map(select(length > 0))')"
|
|
291
|
+
OV="$(printf '%s' "$OV" | jq -c --arg n "$n" --argjson a "$arr" '. + {($n): $a}')"
|
|
292
|
+
done
|
|
293
|
+
|
|
294
|
+
# Same-file signal. `eq` lists the shared files whose additions/deletions equal ours (or cannot be
|
|
295
|
+
# told because the file list was re-read by name): only those can carry the identical edit.
|
|
296
|
+
CAND="$(printf '%s' "$OTHERS" | jq -c --argjson ours "$OURS_JSON" --argjson ov "$OV" --argjson st "$OWN_STATS" "$JQ_DEFS$SHARED_DEFS"'
|
|
297
|
+
[ .[] | . as $p
|
|
298
|
+
| ($ov[($p.number | tostring)]) as $ovf
|
|
299
|
+
| ($p.files // []) as $pf
|
|
300
|
+
| (if $ovf != null then $ovf else [$pf[]?.path] end) as $eff
|
|
301
|
+
| sharedfiles($eff; $ours) as $sh
|
|
302
|
+
| { number: $p.number, title: ($p.title // ""), url: ($p.url // ""), draft: ($p.isDraft // false),
|
|
303
|
+
trusted: (($p.authorAssociation // "") | trusted),
|
|
304
|
+
files: $sh,
|
|
305
|
+
eq: [ $sh[] | . as $f | select($st[$f] != null and ($ovf != null or ([$pf[] | select(.path == $f) | (((.additions // 0) | tostring) + ":" + ((.deletions // 0) | tostring))] | any(. == $st[$f])))) ] } ]')" \
|
|
306
|
+
|| cannot_check "GitHub gave me an answer I could not read"
|
|
307
|
+
|
|
308
|
+
# ---- same-title signal (the change title) ------------------------------------------------------------
|
|
309
|
+
SUBJ_NUMS=""
|
|
310
|
+
if [ "$SUBJ_OURS_JSON" != "[]" ]; then
|
|
311
|
+
TITLE_HITS="$(printf '%s' "$CAND" | jq -r --argjson s "$SUBJ_OURS_JSON" "$JQ_DEFS"'.[] | select((.title | norm) as $t | ($t | generic | not) and ($s | any(. == $t))) | .number')"
|
|
312
|
+
for n in $TITLE_HITS; do SUBJ_NUMS="$SUBJ_NUMS $n"; done
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
# ---- same-edit and same-title-history signals: team changes that share a file only -------------------
|
|
316
|
+
own_pid() { # own_pid <file> -> the patch identity of OUR edit to the file, or nothing
|
|
317
|
+
local key cf
|
|
318
|
+
key="$(printf '%s' "$1" | cksum | tr ' ' '_')"
|
|
319
|
+
cf="$WORK/own.$key"
|
|
320
|
+
if [ ! -f "$cf" ]; then
|
|
321
|
+
git diff --no-ext-diff --no-color --no-renames origin/main...HEAD -- "$1" 2>/dev/null | git patch-id --stable 2>/dev/null | awk 'NR==1{print $1}' > "$cf"
|
|
322
|
+
fi
|
|
323
|
+
cat "$cf"
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
EDIT_NUMS=""
|
|
327
|
+
DIFF_ELIG=0
|
|
328
|
+
DIFF_N=0
|
|
329
|
+
DIFF_FAILED=0
|
|
330
|
+
DEADLINE_SKIPPED=0
|
|
331
|
+
NOBASE=0
|
|
332
|
+
NOEDITS=0
|
|
333
|
+
[ "$BASE_OK" -eq 1 ] || NOBASE=1 # mut:nobasenote
|
|
334
|
+
[ "$BASE_OK" -eq 1 ] && [ "$HAVE_EDITS" -eq 0 ] && NOEDITS=1
|
|
335
|
+
SHARING="$(printf '%s' "$CAND" | jq -r '.[] | select(.trusted and (.files | length) > 0) | (.number | tostring) + ":" + (.eq | length | tostring)')"
|
|
336
|
+
for tok in $SHARING; do
|
|
337
|
+
n="${tok%%:*}"
|
|
338
|
+
eqn="${tok##*:}"
|
|
339
|
+
if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
|
|
340
|
+
# Edits: only when we have a saved edit of our own and the numbers can match.
|
|
341
|
+
if [ "$BASE_OK" -eq 1 ] && [ "$HAVE_EDITS" -gt 0 ] && [ "$eqn" -ge "$NEED" ] && [ "$NEED" -gt 0 ]; then
|
|
342
|
+
DIFF_ELIG=$((DIFF_ELIG + 1))
|
|
343
|
+
if [ "$DIFF_N" -lt "$DIFF_CAP" ]; then
|
|
344
|
+
DIFF_N=$((DIFF_N + 1))
|
|
345
|
+
d="$WORK/pd$n"; mkdir -p "$d"
|
|
346
|
+
bounded 30 gh pr diff "$n" > "$d/all.diff" 2>/dev/null
|
|
347
|
+
rc=$?
|
|
348
|
+
if [ "$rc" -ne 0 ]; then
|
|
349
|
+
if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
|
|
350
|
+
DIFF_FAILED=$((DIFF_FAILED + 1))
|
|
351
|
+
else
|
|
352
|
+
awk -v dir="$d" '
|
|
353
|
+
/^diff --git a\// {
|
|
354
|
+
if (out != "") close(out)
|
|
355
|
+
k++
|
|
356
|
+
name = $0
|
|
357
|
+
sub(/^diff --git a\/.* b\//, "", name)
|
|
358
|
+
out = dir "/" k ".patch"
|
|
359
|
+
print name > (dir "/" k ".name")
|
|
360
|
+
close(dir "/" k ".name")
|
|
361
|
+
}
|
|
362
|
+
k > 0 { print > out }
|
|
363
|
+
' "$d/all.diff"
|
|
364
|
+
printf '%s' "$CAND" | jq -r --argjson n "$n" '.[] | select(.number == $n) | .eq[]' > "$WORK/eq.$n"
|
|
365
|
+
E=0
|
|
366
|
+
while IFS= read -r f; do
|
|
367
|
+
[ -n "$f" ] || continue
|
|
368
|
+
mine="$(own_pid "$f")"
|
|
369
|
+
[ -n "$mine" ] || continue
|
|
370
|
+
nf="$(grep -lFx -- "$f" "$d"/*.name 2>/dev/null | head -n 1)"
|
|
371
|
+
[ -n "$nf" ] || continue
|
|
372
|
+
theirs="$(git patch-id --stable < "${nf%.name}.patch" 2>/dev/null | awk 'NR==1{print $1}')"
|
|
373
|
+
if [ -n "$theirs" ] && [ "$theirs" = "$mine" ]; then
|
|
374
|
+
E=$((E + 1))
|
|
375
|
+
if [ "$(jq -n --argjson e "$E" --argjson o "$NOURS" "$EDIT_RULE_JQ")" = true ]; then
|
|
376
|
+
EDIT_NUMS="$EDIT_NUMS $n"
|
|
377
|
+
break
|
|
378
|
+
fi
|
|
379
|
+
fi
|
|
380
|
+
done < "$WORK/eq.$n"
|
|
381
|
+
fi
|
|
382
|
+
fi
|
|
383
|
+
fi
|
|
384
|
+
# Same title in the step-by-step history: one read of up to 100 steps, only for what shares a file.
|
|
385
|
+
case " $SUBJ_NUMS $EDIT_NUMS " in *" $n "*) continue ;; esac
|
|
386
|
+
if [ "$SUBJ_OURS_JSON" != "[]" ]; then
|
|
387
|
+
if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
|
|
388
|
+
lines="$(bounded 30 gh api "repos/{owner}/{repo}/pulls/$n/commits?per_page=100" --paginate --jq '.[].commit.message | split("\n")[0]' 2>/dev/null)"
|
|
389
|
+
rc=$?
|
|
390
|
+
if [ "$rc" -ne 0 ]; then
|
|
391
|
+
if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
|
|
392
|
+
cannot_check "GitHub did not answer when I asked for the history of another change"
|
|
393
|
+
fi
|
|
394
|
+
hit="$(printf '%s\n' "$lines" | jq -R -s -r --argjson s "$SUBJ_OURS_JSON" "$JQ_DEFS"'split("\n") | map(norm | select(length > 0 and (generic | not))) | if any(.[]; . as $t | $s | any(. == $t)) then "yes" else "no" end')"
|
|
395
|
+
[ "$hit" = yes ] && SUBJ_NUMS="$SUBJ_NUMS $n"
|
|
396
|
+
fi
|
|
397
|
+
done
|
|
398
|
+
# shellcheck disable=SC2086 # the lists are space-separated integers
|
|
399
|
+
EDIT_JSON="$(printf '%s\n' $EDIT_NUMS | jq -R -s -c 'split("\n") | map(select(length > 0) | tonumber)')"
|
|
400
|
+
# shellcheck disable=SC2086
|
|
401
|
+
SUBJ_JSON="$(printf '%s\n' $SUBJ_NUMS | jq -R -s -c 'split("\n") | map(select(length > 0) | tonumber)')"
|
|
402
|
+
|
|
403
|
+
# ---- decide ----------------------------------------------------------------------------------------
|
|
404
|
+
OVER="$(printf '%s' "$CAND" | jq -c --argjson edits "$EDIT_JSON" --argjson subj "$SUBJ_JSON" '
|
|
405
|
+
map(. + { edit: (.number as $n | $edits | any(. == $n)), subject: (.number as $n | $subj | any(. == $n)) })
|
|
406
|
+
| map(select((.files | length) > 0 or .subject))
|
|
407
|
+
| sort_by(.number)')" \
|
|
408
|
+
|| cannot_check "I could not combine what I found"
|
|
409
|
+
|
|
410
|
+
N_OVER="$(printf '%s' "$OVER" | jq 'length')"
|
|
411
|
+
IDS="$(printf '%s' "$OVER" | jq -r 'map(.number | tostring) | join(",")')"
|
|
412
|
+
DUP="$(printf '%s' "$OVER" | jq 'any(.[]; .trusted and (.edit or .subject))')"
|
|
413
|
+
VEH_IN=false
|
|
414
|
+
[ -n "$VEHICLE" ] && VEH_IN="$(printf '%s' "$OVER" | jq --arg v "$VEHICLE" 'any(.[]; .trusted and (.number | tostring) == $v)')"
|
|
415
|
+
|
|
416
|
+
vehicle_is_this() { [ -n "$VEHICLE" ] && { [ "$VEHICLE" = this ] || [ "$VEHICLE" = "$CUR_PR" ]; }; } # mut:vehicle
|
|
417
|
+
|
|
418
|
+
if [ "$N_OVER" -eq 0 ]; then
|
|
419
|
+
CODE=0
|
|
420
|
+
elif vehicle_is_this; then
|
|
421
|
+
CODE=11
|
|
422
|
+
elif [ "$VEH_IN" = true ]; then
|
|
423
|
+
CODE=10
|
|
424
|
+
elif [ "$DUP" = true ]; then
|
|
425
|
+
CODE=12
|
|
426
|
+
else
|
|
427
|
+
CODE=13 # mut:sharedblock
|
|
428
|
+
fi
|
|
429
|
+
|
|
430
|
+
# ---- say it in plain words ------------------------------------------------------------------------
|
|
431
|
+
if [ "$N_OVER" -eq 0 ]; then
|
|
432
|
+
say "No other open work overlaps with this change."
|
|
433
|
+
else
|
|
434
|
+
say "Other open work overlaps with this change:"
|
|
435
|
+
printf '%s' "$OVER" | jq -r "$JQ_DEFS"'.[] |
|
|
436
|
+
"- " + shown + " - " + (.url | clean),
|
|
437
|
+
(if (.files | length) > 0 then " Changes some of the same files as yours: " + (.files | map(clean) | .[0:5] | join(", ")) + (if (.files | length) > 5 then " and " + (((.files | length) - 5) | tostring) + " more" else "" end) else empty end),
|
|
438
|
+
(if .edit then " This change makes the same edit as yours." else empty end),
|
|
439
|
+
(if .subject then " It has a change with the same title as one of yours." else empty end),
|
|
440
|
+
(if .trusted | not then " I list it for information only and will not hold anything back for it." else empty end),
|
|
441
|
+
(if .draft then " It is still being worked on and is not ready yet." else empty end)'
|
|
442
|
+
fi
|
|
443
|
+
|
|
444
|
+
if [ "$LIST_COUNT" -ge "$LIST_CAP" ]; then
|
|
445
|
+
say "GitHub listed $LIST_CAP open changes, the most I can read at once, so there may be more that I did not see."
|
|
446
|
+
fi
|
|
447
|
+
if [ "$DIFF_ELIG" -gt "$DIFF_CAP" ]; then
|
|
448
|
+
say "I compared the actual edits of $DIFF_CAP of the $DIFF_ELIG changes that could be the same edit as yours; the rest are matched by file name only."
|
|
449
|
+
fi
|
|
450
|
+
if [ "$DIFF_FAILED" -gt 0 ]; then
|
|
451
|
+
say "I could not compare the edits themselves for $DIFF_FAILED of them, so those are matched by file name only."
|
|
452
|
+
fi
|
|
453
|
+
if [ "$DEADLINE_HIT" -eq 1 ]; then
|
|
454
|
+
say "I stopped comparing after $DEADLINE_SECS seconds so this check would not hold things up; $DEADLINE_SKIPPED of the changes that share files with yours were matched by file name and title only."
|
|
455
|
+
fi
|
|
456
|
+
if [ "$NOBASE" -eq 1 ]; then
|
|
457
|
+
say "I could not compare the edits themselves because I cannot see where this work started from yet."
|
|
458
|
+
elif [ "$NOEDITS" -eq 1 ]; then
|
|
459
|
+
say "I cannot compare the actual edits yet because none of the files for this work have saved changes, so shared files are matched by name only. The edit check runs again before this is merged."
|
|
460
|
+
fi
|
|
461
|
+
|
|
462
|
+
case "$CODE" in
|
|
463
|
+
0)
|
|
464
|
+
: ;;
|
|
465
|
+
10)
|
|
466
|
+
say "What this means: another open change was chosen to carry this work. I am holding mine back and will not touch theirs."
|
|
467
|
+
say "Next step for me: wait until that change is live, then check again."
|
|
468
|
+
;;
|
|
469
|
+
11)
|
|
470
|
+
say "What this means: this change was chosen to carry the work, so the other changes should step aside. I am not touching them."
|
|
471
|
+
say "Next step for me: carry on with this change; the others are listed only so you know they exist."
|
|
472
|
+
;;
|
|
473
|
+
12)
|
|
474
|
+
say "What this means: another open change already covers the same work and nobody has chosen which one carries it. I am holding mine back."
|
|
475
|
+
say "Next step for me: ask the engineering lead agent to choose one change to carry the work and record its decision (a technical choice, not a question for the operator), then run this check again with the chosen change named."
|
|
476
|
+
;;
|
|
477
|
+
13)
|
|
478
|
+
say "What this means: these changes touch some of the same files, which is common and does not stop anything. Whichever goes second may need small adjustments."
|
|
479
|
+
say "Next step for me: carry on; I will not touch their changes."
|
|
480
|
+
;;
|
|
481
|
+
esac
|
|
482
|
+
|
|
483
|
+
finish "$CODE" "${IDS:-none}"
|