@soleur/opencode 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +659 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +108 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +342 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +152 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +493 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +363 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +520 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +113 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +178 -0
- package/scripts/sync-opencode-adapter.ts +479 -0
- package/scripts/sync-pr-behind.sh +534 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +65 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +142 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +118 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +668 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +325 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +138 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1621 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3022 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +149 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/work/SKILL.md +1479 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SOLEUR-GENERATED-OPERATOR-SCRIPT v2
|
|
3
|
+
#
|
|
4
|
+
# Generated by `soleur:operator-bootstrap` from
|
|
5
|
+
# plugins/soleur/skills/operator-bootstrap/template.sh.
|
|
6
|
+
#
|
|
7
|
+
# This header marker identifies the file as a generated operator script. It does
|
|
8
|
+
# NOT pin a byte-identical library region: there is one distribution mode and the
|
|
9
|
+
# script SOURCES the library, so there is no copy to drift from.
|
|
10
|
+
#
|
|
11
|
+
# <!-- Inspired by mattpocock/skills/skills/engineering/wizard/ (MIT, Copyright (c) 2026 Matt Pocock). -->
|
|
12
|
+
#
|
|
13
|
+
# THE CONTRACT (ADR-264): an AGENT runs this script, one stage at a time, with no
|
|
14
|
+
# terminal. A human acknowledges every production write, but at the harness
|
|
15
|
+
# approval prompt on the exact command, not at a typed `yes` (this guards against an
|
|
16
|
+
# agent acting on a mistaken instruction, not a compromised one; headless, bypass-mode
|
|
17
|
+
# and no-hook surfaces defer or refuse and never auto-approve — ADR-264):
|
|
18
|
+
# bash bootstrap.sh --list the stages (static; no credentials)
|
|
19
|
+
# bash bootstrap.sh --stage <name> read stage: runs; write stage: prints the PLAN
|
|
20
|
+
# bash bootstrap.sh --stage <name> --apply --plan-digest <d> write stage: the approved write
|
|
21
|
+
# There is no run-all mode and no `--yes`. Every stage is idempotent: a re-run
|
|
22
|
+
# of a satisfied stage changes nothing and needs no approval.
|
|
23
|
+
#
|
|
24
|
+
# WHAT TO EDIT: the `# SOLEUR-STAGE` lines and the `read_*` / `plan_*` / `apply_*`
|
|
25
|
+
# functions below them, plus the ONE generation-time substitution of
|
|
26
|
+
# SOLEUR_OP_LIB_BAKED. Everything above the STAGES banner is the contract the
|
|
27
|
+
# library expects. NEVER hand-edit plugins/soleur/scripts/lib/operator-script.sh
|
|
28
|
+
# — the library is one file and every generated script shares it.
|
|
29
|
+
#
|
|
30
|
+
# Exit codes and stdout markers: the library header ("EXIT CODES" and "STDOUT
|
|
31
|
+
# MARKERS" in plugins/soleur/scripts/lib/operator-script.sh) is the single
|
|
32
|
+
# source. Do not restate the table here.
|
|
33
|
+
set -euo pipefail
|
|
34
|
+
|
|
35
|
+
# --- PROLOGUE (must stay ABOVE the `source` line) ----------------------------
|
|
36
|
+
# Duplicated here, never moved into the library — see "SOURCING PRECONDITIONS"
|
|
37
|
+
# §2 in the library header for why. Stdout, not stderr: agent runtimes surface
|
|
38
|
+
# stdout and swallow stderr.
|
|
39
|
+
case "$-" in
|
|
40
|
+
*x*)
|
|
41
|
+
printf '[FATAL] refusing to run under xtrace: this script handles a live credential and -x would print it (see #7797)\n'
|
|
42
|
+
exit 78
|
|
43
|
+
;;
|
|
44
|
+
esac
|
|
45
|
+
|
|
46
|
+
# SSLKEYLOGFILE writes TLS session keys to disk; nothing a stage runs should
|
|
47
|
+
# inherit it. The CA-pool variables (SSL_CERT_FILE, SSL_CERT_DIR,
|
|
48
|
+
# CURL_CA_BUNDLE) are deliberately NOT stripped: `gh` and `hcloud` are Go
|
|
49
|
+
# clients that read them for their root pool, and a founder behind a
|
|
50
|
+
# TLS-inspecting proxy needs them (the credential linter requires only the
|
|
51
|
+
# xtrace refusal above — measured).
|
|
52
|
+
unset SSLKEYLOGFILE
|
|
53
|
+
|
|
54
|
+
# No pathname expansion anywhere below: stage code loops over vendor-supplied names
|
|
55
|
+
# (`for s in $SLUGS`), and a name such as `*` must stay a name, never a file glob.
|
|
56
|
+
set -f
|
|
57
|
+
|
|
58
|
+
# --- the stage table ---------------------------------------------------------
|
|
59
|
+
# ONE source of truth: --list prints it, the dispatcher validates `--stage`
|
|
60
|
+
# against it, and the approval hook reads these same lines (statically; it never
|
|
61
|
+
# executes this script) to show the human the impact and rollback they are
|
|
62
|
+
# approving. Format: name|class|impact|rollback (class: read | write).
|
|
63
|
+
# A write stage's impact and rollback are one plain sentence each, written for a
|
|
64
|
+
# founder, with no `|` in them. Replace the two examples.
|
|
65
|
+
#
|
|
66
|
+
# SOLEUR-STAGE account|read|Nothing changes: this only reads the vendor account.|None needed.
|
|
67
|
+
# SOLEUR-STAGE provision|write|A billable resource is created in the vendor account.|Delete the resource in the vendor console; nothing else depends on it yet.
|
|
68
|
+
|
|
69
|
+
# `--list` is a STATIC read of the table above: no library, no credentials, no
|
|
70
|
+
# network, so an agent can probe it first. It sits BELOW the xtrace refusal and
|
|
71
|
+
# ABOVE library resolution (the linter allows no command above the refusal).
|
|
72
|
+
if [[ "${1:-}" == "--list" ]]; then
|
|
73
|
+
grep -a '^# SOLEUR-STAGE ' "${BASH_SOURCE[0]}" | sed 's/^# SOLEUR-STAGE //' | awk -F'|' '{ printf "SOLEUR_BOOTSTRAP_STAGE_DECL stage=%s class=%s\n", $1, $2 }'
|
|
74
|
+
exit 0
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# --- library resolution ------------------------------------------------------
|
|
78
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
79
|
+
|
|
80
|
+
# GENERATION-TIME SUBSTITUTION. The generator (operator-bootstrap/SKILL.md §3)
|
|
81
|
+
# replaces the placeholder below with the ABSOLUTE path of the library resolved
|
|
82
|
+
# at generation time — `realpath "${CLAUDE_PLUGIN_ROOT}/scripts/lib/operator-
|
|
83
|
+
# script.sh"`. A generated script lives at
|
|
84
|
+
# knowledge-base/project/specs/feat-<name>/bootstrap.sh in the FOUNDER's repo,
|
|
85
|
+
# where no relative path to the plugin exists and CLAUDE_PLUGIN_ROOT may be unset;
|
|
86
|
+
# without the bake the only reachable outcome from that location was LIB_MISSING
|
|
87
|
+
# (measured, review F1). An unsubstituted placeholder is not an absolute path, so
|
|
88
|
+
# the loop below treats it as "not baked", never as a path — and the loop
|
|
89
|
+
# deliberately does not spell the placeholder, so a global substitution cannot
|
|
90
|
+
# rewrite the guard along with the value.
|
|
91
|
+
SOLEUR_OP_LIB_BAKED="__SOLEUR_OP_LIB_BAKED__"
|
|
92
|
+
|
|
93
|
+
# Resolution order, most explicit first:
|
|
94
|
+
# 1. SOLEUR_OP_LIB — explicit env override (a moved plugin, a test). Must
|
|
95
|
+
# be ABSOLUTE: `-r` tests a relative name against cwd
|
|
96
|
+
# while `source` searches PATH for it, two different
|
|
97
|
+
# files.
|
|
98
|
+
# 2. CLAUDE_PLUGIN_ROOT — a script run from inside a Claude Code session: the
|
|
99
|
+
# LIVE plugin, which beats a bake that may point at a
|
|
100
|
+
# stale marketplace cache hash.
|
|
101
|
+
# 3. the baked path — what a generated script runs on where 2 is unset.
|
|
102
|
+
# 4. hard exit 64, naming the LAST candidate that was rejected.
|
|
103
|
+
# A candidate that does not define the staged gate (a stale cached library) is
|
|
104
|
+
# skipped BEFORE it is sourced, so it can never shadow a newer baked one.
|
|
105
|
+
SOLEUR_OP_LIB="${SOLEUR_OP_LIB:-}"
|
|
106
|
+
last_rejected="<no candidate was absolute>"
|
|
107
|
+
if [[ -n "$SOLEUR_OP_LIB" && "$SOLEUR_OP_LIB" != /* ]]; then
|
|
108
|
+
last_rejected="$SOLEUR_OP_LIB (SOLEUR_OP_LIB must be an absolute path)"
|
|
109
|
+
SOLEUR_OP_LIB=""
|
|
110
|
+
fi
|
|
111
|
+
# An override is held to the same test as every other candidate (a readable regular
|
|
112
|
+
# file named operator-script.sh that defines the gate): a stray value cannot make this
|
|
113
|
+
# script source an arbitrary file. HONEST LIMIT: a process that can write such a file
|
|
114
|
+
# and set this variable can also edit this script; that is the hijacked-agent case the
|
|
115
|
+
# approval receipt does not claim to resist (ADR-264).
|
|
116
|
+
if [[ -n "$SOLEUR_OP_LIB" ]] && ! { [[ -f "$SOLEUR_OP_LIB" && ! -L "$SOLEUR_OP_LIB" && -r "$SOLEUR_OP_LIB" && "${SOLEUR_OP_LIB##*/}" == "operator-script.sh" ]] && grep -aq '^soleur_op_stage_gate()' "$SOLEUR_OP_LIB"; }; then
|
|
117
|
+
last_rejected="$SOLEUR_OP_LIB (SOLEUR_OP_LIB must name a regular readable operator-script.sh that defines the staged gate)"
|
|
118
|
+
SOLEUR_OP_LIB=""
|
|
119
|
+
fi
|
|
120
|
+
if [[ -z "$SOLEUR_OP_LIB" ]]; then
|
|
121
|
+
for candidate in \
|
|
122
|
+
"${CLAUDE_PLUGIN_ROOT:-/nonexistent}/scripts/lib/operator-script.sh" \
|
|
123
|
+
"$SOLEUR_OP_LIB_BAKED"
|
|
124
|
+
do
|
|
125
|
+
[[ "$candidate" == /* ]] || continue
|
|
126
|
+
if [[ -r "$candidate" ]] && grep -aq '^soleur_op_stage_gate()' "$candidate"; then SOLEUR_OP_LIB="$candidate"; break; fi
|
|
127
|
+
last_rejected="$candidate"
|
|
128
|
+
done
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
# HARD EXIT, never a stub. ADR-178 Context §1 records what fail-closed stubs did
|
|
132
|
+
# to `cleanup-merged`: it refused to reap forever while reporting success.
|
|
133
|
+
if [[ -z "$SOLEUR_OP_LIB" || ! -r "$SOLEUR_OP_LIB" ]]; then
|
|
134
|
+
printf 'SOLEUR_BOOTSTRAP_LIB_MISSING path=%s\n' "${SOLEUR_OP_LIB:-$last_rejected}"
|
|
135
|
+
printf 'Install or update the Soleur plugin, or set SOLEUR_OP_LIB to the absolute path of the library.\n'
|
|
136
|
+
exit 64
|
|
137
|
+
fi
|
|
138
|
+
unset last_rejected
|
|
139
|
+
|
|
140
|
+
# shellcheck source=../../scripts/lib/operator-script.sh disable=SC1091
|
|
141
|
+
source "$SOLEUR_OP_LIB"
|
|
142
|
+
|
|
143
|
+
# API contract (library header §API). EQUALITY: the library auto-updates with
|
|
144
|
+
# the plugin while this script is frozen in the founder's repository, so
|
|
145
|
+
# "library newer than script" is the only incompatibility that can occur, and
|
|
146
|
+
# `-ge` admitted exactly that. Refused BEFORE any ledger write.
|
|
147
|
+
[[ ${SOLEUR_OP_LIB_API:-0} -eq 1 ]] || {
|
|
148
|
+
printf 'SOLEUR_BOOTSTRAP_LIB_INCOMPATIBLE need=1 got=%s\n' "${SOLEUR_OP_LIB_API:-0}"
|
|
149
|
+
exit 64
|
|
150
|
+
}
|
|
151
|
+
# The staged-contract capability is detected by the function itself, never by a
|
|
152
|
+
# second API number (the frozen legacy scripts assert API equality).
|
|
153
|
+
declare -F soleur_op_stage_gate >/dev/null 2>&1 || {
|
|
154
|
+
printf 'SOLEUR_BOOTSTRAP_LIB_INCOMPATIBLE need=stage-1 got=%s\n' "${SOLEUR_OP_LIB_API:-0}"
|
|
155
|
+
exit 64
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# --- configuration -----------------------------------------------------------
|
|
159
|
+
SLUG="${SLUG:-example}"
|
|
160
|
+
ENV_FILE="${ENV_FILE:-${SCRIPT_DIR}/.env}"
|
|
161
|
+
: "${SOLEUR_BOOTSTRAP_LEDGER:=${SCRIPT_DIR}/bootstrap-runs.jsonl}"
|
|
162
|
+
export SOLEUR_BOOTSTRAP_LEDGER
|
|
163
|
+
|
|
164
|
+
usage() {
|
|
165
|
+
cat <<USAGE
|
|
166
|
+
Usage: bootstrap.sh --list
|
|
167
|
+
bootstrap.sh --stage <name>
|
|
168
|
+
bootstrap.sh --stage <name> --apply --plan-digest <digest> [--rotate-token]
|
|
169
|
+
bootstrap.sh --reset <KEY> | --help
|
|
170
|
+
|
|
171
|
+
--list The stages and their class (read or write). Static; needs nothing.
|
|
172
|
+
--stage <name> A READ stage runs. A WRITE stage prints its PLAN (what it would
|
|
173
|
+
change, in plain words, and the exact apply command) and changes nothing.
|
|
174
|
+
--apply With --stage <name> --plan-digest <digest>: perform the write. The
|
|
175
|
+
person approves the exact command at the harness prompt first.
|
|
176
|
+
--plan-digest The digest the plan printed. The script recomputes the plan; a
|
|
177
|
+
mismatch (the state moved) exits 75 and writes nothing.
|
|
178
|
+
--reset <KEY> Forget a persisted .env value so the next run re-asks for it.
|
|
179
|
+
--help This text.
|
|
180
|
+
|
|
181
|
+
There is no run-all mode and no flag that approves a write by itself.
|
|
182
|
+
|
|
183
|
+
Environment:
|
|
184
|
+
SOLEUR_BOOTSTRAP_LEDGER=<path> Run ledger (default: beside this script).
|
|
185
|
+
SOLEUR_OP_LIB=<abs-path> Override the library path baked at generation.
|
|
186
|
+
|
|
187
|
+
Skip variables — one per class-1/class-3 prompt in THIS script, derived from
|
|
188
|
+
its source so the list cannot drift (naming convention: SOLEUR_BOOTSTRAP_<WHAT>
|
|
189
|
+
for a value, SOLEUR_BOOTSTRAP_SKIP_<WHAT>_BARRIER for a barrier):
|
|
190
|
+
$(grep -oE '^[[:space:]]*soleur_op_(barrier|value) SOLEUR_BOOTSTRAP_[A-Z0-9_]+' "${BASH_SOURCE[0]}" | awk '{print " " $2}' | sort -u | grep . || echo ' (none: this script has no class-1 or class-3 prompt)')
|
|
191
|
+
USAGE
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
# --- argument validation -----------------------------------------------------
|
|
195
|
+
# Deliberately ABOVE the EXIT trap installed below: a usage error must print no
|
|
196
|
+
# "Stopped during stage" banner, and `--reset` is not a stage. ORIG_ARGV keeps the
|
|
197
|
+
# invocation exactly as the shell handed it over: the approval receipt is bound to
|
|
198
|
+
# it (so `"a b"` and `"a" "b"` differ).
|
|
199
|
+
ORIG_ARGV=("$@")
|
|
200
|
+
STAGE=""
|
|
201
|
+
APPLY=0
|
|
202
|
+
PLAN_DIGEST=""
|
|
203
|
+
ROTATE_TOKEN=0
|
|
204
|
+
RESET_KEY=""
|
|
205
|
+
while [[ $# -gt 0 ]]; do
|
|
206
|
+
case "$1" in
|
|
207
|
+
--stage) STAGE="${2:-}"; [[ -n "$STAGE" ]] || { echo "Error: --stage needs a stage name (--list shows them)" >&2; usage >&2; exit 1; }; shift 2 ;;
|
|
208
|
+
--apply) APPLY=1; shift ;;
|
|
209
|
+
--plan-digest) PLAN_DIGEST="${2:-}"; [[ -n "$PLAN_DIGEST" ]] || { echo "Error: --plan-digest needs the digest the plan printed" >&2; usage >&2; exit 1; }; shift 2 ;;
|
|
210
|
+
--rotate-token) ROTATE_TOKEN=1; shift ;;
|
|
211
|
+
--reset) RESET_KEY="${2:-}"; [[ -n "$RESET_KEY" ]] || { echo "Error: --reset needs a KEY" >&2; usage >&2; exit 1; }; shift 2 ;;
|
|
212
|
+
--list) soleur_op_list "${BASH_SOURCE[0]}"; exit 0 ;;
|
|
213
|
+
--help|-h) usage; exit 0 ;;
|
|
214
|
+
*) echo "Unknown argument: $1" >&2; usage >&2; exit 1 ;;
|
|
215
|
+
esac
|
|
216
|
+
done
|
|
217
|
+
|
|
218
|
+
# --- the credentials file must be ignored by git ------------------------------
|
|
219
|
+
# This script lives in a TRACKED directory (SKILL.md §Where), and its .env holds
|
|
220
|
+
# recorded values. A .gitignore that does not cover it turns the founder's next
|
|
221
|
+
# `git add .` into a pushed token (review P1-1). Checked BEFORE the first write —
|
|
222
|
+
# `--reset` writes too — on the .env AND on the `.tmp.XXXXXX` sibling the upsert
|
|
223
|
+
# creates beside it, which a bare `.env` pattern does not cover. Outside a git
|
|
224
|
+
# work tree (or without git) there is nothing to commit, so the check passes.
|
|
225
|
+
#
|
|
226
|
+
# PROBE THE RESOLVED PATH — the writer does. `soleur_op_env_upsert` and
|
|
227
|
+
# `soleur_op_env_reset` both `readlink -f` before writing, so probing the link
|
|
228
|
+
# NAME asks git about a file the write never touches: a founder who symlinks
|
|
229
|
+
# .env at a shared credentials file gets an ignored name, a passing probe, and
|
|
230
|
+
# the value written to a target git reports as untracked-and-not-ignored. The
|
|
231
|
+
# `.tmp.XXXXXX` sibling is created beside the RESOLVED file too, so it is
|
|
232
|
+
# derived from the resolved path rather than from $ENV_FILE. Confirmed against
|
|
233
|
+
# a fixture; Guard 7's symlink rows pin it.
|
|
234
|
+
env_not_ignored() {
|
|
235
|
+
local dir; dir="$(dirname "$1")"
|
|
236
|
+
git -C "$dir" rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 1
|
|
237
|
+
! git -C "$dir" check-ignore -q "$1"
|
|
238
|
+
}
|
|
239
|
+
ENV_FILE_RESOLVED="$(readlink -f -- "$ENV_FILE" 2>/dev/null || printf '%s' "$ENV_FILE")"
|
|
240
|
+
for probe in "$ENV_FILE_RESOLVED" "${ENV_FILE_RESOLVED}.tmp.XXXXXX"; do
|
|
241
|
+
if env_not_ignored "$probe"; then
|
|
242
|
+
printf 'SOLEUR_BOOTSTRAP_ENV_NOT_IGNORED path=%s\n' "$probe"
|
|
243
|
+
printf 'The credentials file would be committed. Add it to .gitignore first (a pattern such as .env* covers both the file and its temp sibling).\n'
|
|
244
|
+
exit 64
|
|
245
|
+
fi
|
|
246
|
+
done
|
|
247
|
+
unset probe
|
|
248
|
+
|
|
249
|
+
if [[ -n "$RESET_KEY" ]]; then
|
|
250
|
+
soleur_op_env_reset "$ENV_FILE" "$RESET_KEY"
|
|
251
|
+
soleur_op_green "Forgot ${RESET_KEY}. Re-run the stage to be asked for it again."
|
|
252
|
+
exit 0
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
if [[ -z "$STAGE" ]]; then
|
|
256
|
+
printf 'SOLEUR_BOOTSTRAP_STAGE_REQUIRED\n'
|
|
257
|
+
printf 'Pick one stage with --stage <name>; this script has no run-all mode. The stages are:\n'
|
|
258
|
+
soleur_op_list "${BASH_SOURCE[0]}"
|
|
259
|
+
exit 64
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
# --- terminal outcome --------------------------------------------------------
|
|
263
|
+
# ONE trap. On a non-zero exit inside a stage it prints the STAGE_FAILED marker,
|
|
264
|
+
# tells the founder which stage stopped and the one command that resumes, and
|
|
265
|
+
# settles the stage in the ledger as `failed`. A refusal that already printed its
|
|
266
|
+
# own marker and sentence (approval required / invalid / plan drift, a precondition,
|
|
267
|
+
# a missing digest) raised the library's SOLEUR_OP_REFUSED flag and settles as
|
|
268
|
+
# `refused`, adding nothing. The flag, not the exit code, decides: a vendor CLI that
|
|
269
|
+
# exits 75 mid-write is a failure.
|
|
270
|
+
SCRIPT_PATH="${SCRIPT_DIR}/$(basename "${BASH_SOURCE[0]}")"
|
|
271
|
+
SCRIPT_REAL="$(soleur_approval_realpath "${BASH_SOURCE[0]}")"
|
|
272
|
+
CURRENT_STAGE_INDEX=0
|
|
273
|
+
CURRENT_STAGE_NAME=""
|
|
274
|
+
STAGE_CHANGED=""
|
|
275
|
+
mark_changed() { STAGE_CHANGED="${STAGE_CHANGED:+${STAGE_CHANGED}; }$1"; }
|
|
276
|
+
on_exit() {
|
|
277
|
+
local rc=$?
|
|
278
|
+
[[ "$rc" -ne 0 && "$CURRENT_STAGE_INDEX" -gt 0 ]] || return 0
|
|
279
|
+
if [[ -n "${SOLEUR_OP_REFUSED:-}" ]]; then
|
|
280
|
+
soleur_op_stage_end "$CURRENT_STAGE_INDEX" "$CURRENT_STAGE_NAME" refused "$rc"
|
|
281
|
+
return 0
|
|
282
|
+
fi
|
|
283
|
+
printf 'SOLEUR_BOOTSTRAP_STAGE_FAILED stage=%s rc=%s\n' "$CURRENT_STAGE_NAME" "$rc"
|
|
284
|
+
# "Nothing else was changed" is FALSE on one path the library documents: a
|
|
285
|
+
# secret whose write returned 0 and whose read-back did not confirm it may be
|
|
286
|
+
# live (SOLEUR_BOOTSTRAP_SECRET_VERIFY_FAILED). The library raises a flag and
|
|
287
|
+
# this sentence defers to it.
|
|
288
|
+
if [[ -n "${SOLEUR_OP_WRITE_MAY_HAVE_LANDED:-}" ]]; then
|
|
289
|
+
printf 'Stopped during stage %s. A credential may already have been written — check it and revoke it if you did not mean to. Run the stage again to see where it stands: bash %s --stage %s\n' \
|
|
290
|
+
"$CURRENT_STAGE_NAME" "$SCRIPT_PATH" "$CURRENT_STAGE_NAME"
|
|
291
|
+
elif [[ -n "$STAGE_CHANGED" ]]; then
|
|
292
|
+
printf 'Stopped during stage %s AFTER it may have changed production: %s. Read the lines above before re-running. Run the stage again to see where it stands: bash %s --stage %s\n' \
|
|
293
|
+
"$CURRENT_STAGE_NAME" "$STAGE_CHANGED" "$SCRIPT_PATH" "$CURRENT_STAGE_NAME"
|
|
294
|
+
else
|
|
295
|
+
printf 'Stopped during stage %s. Nothing else was changed. Run the stage again: bash %s --stage %s\n' \
|
|
296
|
+
"$CURRENT_STAGE_NAME" "$SCRIPT_PATH" "$CURRENT_STAGE_NAME"
|
|
297
|
+
fi
|
|
298
|
+
soleur_op_stage_end "$CURRENT_STAGE_INDEX" "$CURRENT_STAGE_NAME" failed "$rc"
|
|
299
|
+
}
|
|
300
|
+
trap on_exit EXIT
|
|
301
|
+
|
|
302
|
+
# =============================================================================
|
|
303
|
+
# STAGES — everything below this line is yours. Replace the examples.
|
|
304
|
+
# =============================================================================
|
|
305
|
+
#
|
|
306
|
+
# For each stage declared in the table above:
|
|
307
|
+
# read stage read_<name>() precondition-free: it only READS and reports.
|
|
308
|
+
# write stage plan_<name>() READ-ONLY. Calls `soleur_op_plan_op <op> <target>`
|
|
309
|
+
# once per change it WOULD make, naming operations
|
|
310
|
+
# and targets only (never a value). A stage that is
|
|
311
|
+
# already satisfied declares NO operation: it then
|
|
312
|
+
# needs no approval and `--apply` changes nothing.
|
|
313
|
+
# If a precondition (an earlier stage's work) does
|
|
314
|
+
# not hold, call `soleur_op_precondition_failed
|
|
315
|
+
# <stage> <need-stage> "<sentence>"`: stages are
|
|
316
|
+
# separately addressable, so each re-proves what it
|
|
317
|
+
# depends on instead of trusting that another ran.
|
|
318
|
+
# apply_<name>() the writes. It runs ONLY after the gate returned,
|
|
319
|
+
# i.e. after the human approved the exact command.
|
|
320
|
+
# Function names replace `-` in the stage name with `_`.
|
|
321
|
+
#
|
|
322
|
+
# NEVER call `soleur_op_ack_or_die` here: it needs a typed `yes` at a terminal and
|
|
323
|
+
# makes the stage unrunnable by an agent. The gate is `soleur_op_stage_gate`, called
|
|
324
|
+
# by the dispatcher below, not by your stage.
|
|
325
|
+
#
|
|
326
|
+
# The library sets `umask 077`, and every child a stage starts INHERITS it: a
|
|
327
|
+
# file a stage writes for someone else (a public key, a config the vendor CLI
|
|
328
|
+
# reads) lands 0600. Escape per command, never globally:
|
|
329
|
+
# (umask 022; printf '%s\n' "$pubkey" > "$HOME/.ssh/id.pub")
|
|
330
|
+
|
|
331
|
+
# EXAMPLE read stage with a class-1 (non-secret) value: set the named skip variable
|
|
332
|
+
# and run again. Credential ENTRY never goes through this helper.
|
|
333
|
+
read_account() {
|
|
334
|
+
local account_id=""
|
|
335
|
+
if [[ -f "$ENV_FILE" ]] && grep -aq '^EXAMPLE_ACCOUNT_ID=' "$ENV_FILE"; then
|
|
336
|
+
soleur_op_yellow " already recorded: EXAMPLE_ACCOUNT_ID"
|
|
337
|
+
return 0
|
|
338
|
+
fi
|
|
339
|
+
soleur_op_value SOLEUR_BOOTSTRAP_ACCOUNT_ID " Account id: " account_id
|
|
340
|
+
[[ -n "$account_id" ]] || { soleur_op_red "no account id"; return 1; }
|
|
341
|
+
soleur_op_env_upsert "$ENV_FILE" EXAMPLE_ACCOUNT_ID "$account_id"
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
# EXAMPLE write stage. The precondition asks the VENDOR, never only a local marker
|
|
345
|
+
# written after the create: between "create succeeded" and "marker written" an
|
|
346
|
+
# interruption leaves a resource the next run cannot see, and it creates a second.
|
|
347
|
+
# Two controls close that window — REPLACE the vendor read, KEEP the shape:
|
|
348
|
+
# 1. `example_resource_exists` is the vendor-side read (hcloud server list,
|
|
349
|
+
# gh api, doppler projects get). It is what makes re-run safe.
|
|
350
|
+
# 2. an ATTEMPTED marker is written BEFORE the create. A re-run that finds it
|
|
351
|
+
# without the PROVISIONED marker stops and sends the person to the vendor
|
|
352
|
+
# console instead of creating again; `--reset EXAMPLE_PROVISION_ATTEMPTED`
|
|
353
|
+
# clears it once they have looked.
|
|
354
|
+
example_resource_exists() {
|
|
355
|
+
# REPLACE with the vendor read. The stand-in consults the local record only
|
|
356
|
+
# because this template has no vendor to ask.
|
|
357
|
+
[[ -f "$ENV_FILE" ]] && grep -aq '^EXAMPLE_PROVISIONED=' "$ENV_FILE"
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
plan_provision() {
|
|
361
|
+
if example_resource_exists "$SLUG"; then
|
|
362
|
+
return 0 # already satisfied: no operation, so no approval is asked
|
|
363
|
+
fi
|
|
364
|
+
if [[ -f "$ENV_FILE" ]] && grep -aq '^EXAMPLE_PROVISION_ATTEMPTED=' "$ENV_FILE"; then
|
|
365
|
+
soleur_op_precondition_failed provision account "A previous run started this create and was interrupted before it could record the result. Check the vendor console for '${SLUG}'. If nothing exists there, run: bash ${SCRIPT_PATH} --reset EXAMPLE_PROVISION_ATTEMPTED"
|
|
366
|
+
fi
|
|
367
|
+
soleur_op_plan_op create-resource "$SLUG"
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
apply_provision() {
|
|
371
|
+
mark_changed "the resource '${SLUG}' may have been created"
|
|
372
|
+
soleur_op_env_upsert "$ENV_FILE" EXAMPLE_PROVISION_ATTEMPTED "$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
|
|
373
|
+
# ... the write goes here (stdin for a secret, never argv) ...
|
|
374
|
+
soleur_op_env_upsert "$ENV_FILE" EXAMPLE_PROVISIONED "yes"
|
|
375
|
+
soleur_op_env_reset "$ENV_FILE" EXAMPLE_PROVISION_ATTEMPTED
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
# --- the dispatcher: one stage per invocation --------------------------------
|
|
379
|
+
# Not a stage: the one place that applies the staged contract. A stage function
|
|
380
|
+
# never gates itself and never prints a stage marker (a marker printed inside a
|
|
381
|
+
# `$(...)` capture becomes the captured value).
|
|
382
|
+
dispatch_stage() {
|
|
383
|
+
local stage="$1" class fn impact rollback flags="" n
|
|
384
|
+
if ! class="$(soleur_op_stage_field "${BASH_SOURCE[0]}" "$stage" 2)"; then
|
|
385
|
+
printf 'SOLEUR_BOOTSTRAP_UNKNOWN_STAGE stage=%s\n' "$stage"
|
|
386
|
+
printf 'That stage is not declared by this script. The stages are:\n'
|
|
387
|
+
soleur_op_list "${BASH_SOURCE[0]}"
|
|
388
|
+
exit 64
|
|
389
|
+
fi
|
|
390
|
+
fn="${stage//-/_}"
|
|
391
|
+
CURRENT_STAGE_INDEX=1; CURRENT_STAGE_NAME="$stage"; STAGE_CHANGED=""
|
|
392
|
+
soleur_op_stage_begin 1 "$stage"
|
|
393
|
+
case "$class" in
|
|
394
|
+
read)
|
|
395
|
+
"read_${fn}"
|
|
396
|
+
soleur_op_stage_ok "$stage" 0
|
|
397
|
+
;;
|
|
398
|
+
write)
|
|
399
|
+
impact="$(soleur_op_stage_field "${BASH_SOURCE[0]}" "$stage" 3)"
|
|
400
|
+
rollback="$(soleur_op_stage_field "${BASH_SOURCE[0]}" "$stage" 4)"
|
|
401
|
+
[[ "$ROTATE_TOKEN" == "1" ]] && flags="rotate-token"
|
|
402
|
+
soleur_op_plan_begin
|
|
403
|
+
"plan_${fn}"
|
|
404
|
+
n="$(soleur_op_plan_count)"
|
|
405
|
+
if [[ "$APPLY" -ne 1 ]]; then
|
|
406
|
+
soleur_op_plan_emit "$SCRIPT_REAL" "$stage" "$ROTATE_TOKEN"
|
|
407
|
+
if [[ "$n" -eq 0 ]]; then soleur_op_stage_ok "$stage" 0; fi
|
|
408
|
+
elif [[ "$n" -eq 0 ]]; then
|
|
409
|
+
soleur_op_stage_ok "$stage" 0
|
|
410
|
+
else
|
|
411
|
+
if [[ -z "$PLAN_DIGEST" ]]; then
|
|
412
|
+
printf 'SOLEUR_BOOTSTRAP_PLAN_DIGEST_REQUIRED stage=%s\n' "$stage"
|
|
413
|
+
printf 'Run the stage without --apply first, then run the apply command exactly as the plan printed it.\n'
|
|
414
|
+
SOLEUR_OP_REFUSED=1
|
|
415
|
+
exit 64
|
|
416
|
+
fi
|
|
417
|
+
local computed
|
|
418
|
+
computed="$(soleur_op_plan_digest "$SCRIPT_REAL" "$stage" "$flags" "$impact" "$rollback")"
|
|
419
|
+
soleur_op_stage_gate "$SCRIPT_REAL" "$stage" "$computed" "$PLAN_DIGEST" "$impact" "$rollback" "${ORIG_ARGV[@]}"
|
|
420
|
+
"apply_${fn}"
|
|
421
|
+
soleur_op_stage_ok "$stage" 1 "$SOLEUR_OP_APPROVAL"
|
|
422
|
+
fi
|
|
423
|
+
;;
|
|
424
|
+
*)
|
|
425
|
+
printf 'SOLEUR_BOOTSTRAP_UNKNOWN_STAGE stage=%s\n' "$stage"
|
|
426
|
+
exit 64
|
|
427
|
+
;;
|
|
428
|
+
esac
|
|
429
|
+
soleur_op_stage_end 1 "$stage" ok 0
|
|
430
|
+
CURRENT_STAGE_INDEX=0; CURRENT_STAGE_NAME=""; STAGE_CHANGED=""
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
main() {
|
|
434
|
+
soleur_op_require_bins grep mktemp printenv sed date od id stat cut tr awk find
|
|
435
|
+
soleur_op_ledger_init 1 "bootstrap.sh"
|
|
436
|
+
dispatch_stage "$STAGE"
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
main "$@"
|