@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,328 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: questionnaire-generate
|
|
3
|
+
description: "This skill should be used when a decision needs an answer only an outside expert holds (accountant, lawyer, auditor, insurer, bank, regulator, landlord) and the founder must send them written questions with a deadline."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- grok-harness-invoke:start -->
|
|
7
|
+
**Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
|
|
8
|
+
<!-- grok-harness-invoke:end -->
|
|
9
|
+
|
|
10
|
+
<!-- Inspired by mattpocock/skills/skills/productivity/to-questionnaire/SKILL.md (MIT, Copyright (c) 2026 Matt Pocock). -->
|
|
11
|
+
|
|
12
|
+
# Questionnaire Generate — ask the expert, not the founder
|
|
13
|
+
|
|
14
|
+
The founder is stuck on something an outside professional knows and they do not: an accountant, a
|
|
15
|
+
bookkeeper, a lawyer, a notary, an auditor, an insurer, a bank, a regulator, a landlord. The wrong move
|
|
16
|
+
is to put the question to the founder, who cannot answer it either. The right move is to write the
|
|
17
|
+
questions down, hand the founder one document, and let them send it.
|
|
18
|
+
|
|
19
|
+
This skill produces that document. It never sends it — the founder sends it from their own mail client,
|
|
20
|
+
so nothing here becomes an intermediary for anyone's correspondence.
|
|
21
|
+
|
|
22
|
+
Two entry paths, and the reliable one is the route. `soleur:go` carries a `questionnaire` row that
|
|
23
|
+
dispatches here directly. Separately, `.claude/hooks/pre-ask-technical-fork-gate.sh` denies an
|
|
24
|
+
`AskUserQuestion` whose answer is held outside the company and names this skill in the deny reason.
|
|
25
|
+
|
|
26
|
+
That hook arm is a BACKSTOP, not the main entrance, and the distinction is measured rather than
|
|
27
|
+
assumed: its vocabulary is a fixed list of profession nouns, so a question can be squarely in scope and
|
|
28
|
+
still not match. This skill's own worked example is one — "should the prepaid hosting contract be
|
|
29
|
+
expensed now or spread across the term?" names no profession and is ALLOWED by the hook in both of its
|
|
30
|
+
phrasings (measured). An earlier revision of this paragraph called the deny "the main way this skill is
|
|
31
|
+
reached", which is false for the very example the skill ships. That
|
|
32
|
+
arm has no resolution ladder — it is a single unconditional deny evaluated ahead of the authority
|
|
33
|
+
short-circuit — so citing a "rung" of one would be the invented-precision this repository's own
|
|
34
|
+
glossary discipline exists to stop. That deny is the main way this skill is reached, which is why every guardrail below is about
|
|
35
|
+
protecting a founder who did not ask for the document and will not audit it.
|
|
36
|
+
|
|
37
|
+
## What the document is
|
|
38
|
+
|
|
39
|
+
A list of questions from a founder. It is not a position, not an analysis, not advice, and not a
|
|
40
|
+
completed brief. The emitted document says so in its own opening lines, and that self-description is
|
|
41
|
+
load-bearing in two directions: it stops the recipient reading a guess as a claim, and it keeps
|
|
42
|
+
`docs/legal/disclaimer.md` §1.3 true, because nothing produced here is offered as professional advice.
|
|
43
|
+
It routes the founder **to** a professional rather than standing in for one.
|
|
44
|
+
|
|
45
|
+
The document also makes no promise about what the recipient does with it. Do not write, in the
|
|
46
|
+
founder's voice, any undertaking about confidentiality, retention or handling on the recipient's side.
|
|
47
|
+
The founder cannot warrant another party's behaviour.
|
|
48
|
+
|
|
49
|
+
## Step 1 — Interview the send, never the subject
|
|
50
|
+
|
|
51
|
+
Exactly three questions to the founder, and all three are about the send:
|
|
52
|
+
|
|
53
|
+
1. **What decision is blocked?** One sentence, in the founder's own words. This is the third
|
|
54
|
+
allowlisted Context field and the frontmatter's `blocked_decision`, and an earlier revision of this
|
|
55
|
+
step did not collect it — leaving Step 2 to claim "all three came out of Step 1" when only two did,
|
|
56
|
+
and the executor to recover the third from the triggering context or from a file, which the
|
|
57
|
+
allowlist forbids. Ask it; never infer it.
|
|
58
|
+
2. **Who receives this?** The role, and what they know that the founder does not.
|
|
59
|
+
3. **What has to come back?** The specific facts or decisions the founder cannot resolve alone.
|
|
60
|
+
4. **By when?** A date the founder names. If the founder answers with a PERIOD rather than a date
|
|
61
|
+
("before the quarter closes"), ask once for the date — do not convert it. The record's README is
|
|
62
|
+
explicit that nothing derives this field, nothing rounds it and no default replaces it, so a
|
|
63
|
+
derived date would be the skill inventing the one fact the follow-through sweep alarms on.
|
|
64
|
+
|
|
65
|
+
That is the whole interview. **If a question about the subject matter can usefully be put to the
|
|
66
|
+
founder, this skill had no reason to run** — the founder's not knowing the subject is the precondition
|
|
67
|
+
for being here. Aim every question at the distance between what this recipient already holds and what
|
|
68
|
+
the founder is missing — never at the founder.
|
|
69
|
+
|
|
70
|
+
Then write the questions. One idea per question, never compound, most consequential first, with a blank
|
|
71
|
+
quote line under each for the answer, and a single "why I am asking" line only where the question reads
|
|
72
|
+
two ways without it. Use the shape in
|
|
73
|
+
[questionnaire.template](./references/questionnaire.template).
|
|
74
|
+
|
|
75
|
+
## Step 2 — Assemble `## Context` from an allowlist
|
|
76
|
+
|
|
77
|
+
The Context paragraph carries **three things and nothing else**: the decision being made, the
|
|
78
|
+
recipient's role, and the deadline. All three came out of Step 1. Build the paragraph by putting those
|
|
79
|
+
three fields together.
|
|
80
|
+
|
|
81
|
+
**Do not read the knowledge base on the drafting path.** Not for colour, not for background, not to
|
|
82
|
+
"make the ask land better". No file read, no grep, no prior artifact, no summary of the project.
|
|
83
|
+
|
|
84
|
+
**Never draft a fuller paragraph and then remove what should not be in it.** That is the #7331 failure
|
|
85
|
+
shape: a draft-then-redact pipeline with every gate green and the thing that mattered still in the
|
|
86
|
+
document.
|
|
87
|
+
|
|
88
|
+
### Why an allowlist and not a scan
|
|
89
|
+
|
|
90
|
+
Because a scan cannot hold this line and a construction rule can. Every one of the following passes
|
|
91
|
+
`redact-sentinel.sh` completely clean, because that engine matches **secrets**:
|
|
92
|
+
|
|
93
|
+
- the all-in monthly burn and the break-even user count from `knowledge-base/finance/cost-model.md`
|
|
94
|
+
- a `PIVOT` validation verdict
|
|
95
|
+
- the alpha-user count, and that user's name
|
|
96
|
+
- competitor names
|
|
97
|
+
- roadmap phases that have not shipped
|
|
98
|
+
- issue and PR numbers, file paths, agent and skill names
|
|
99
|
+
- anything under `knowledge-base/legal/`
|
|
100
|
+
|
|
101
|
+
None of it is a credential. All of it is reachable today by any skill that summarises the knowledge
|
|
102
|
+
base. And per `hr-third-party-content-grep-on-undertaking`, *a PII-scoped gate PASSES on filenames,
|
|
103
|
+
directory listings and repo internals — publication is a different predicate*. So the protection cannot
|
|
104
|
+
be "scan the draft and remove what looks sensitive". It is "the paragraph is assembled from three named
|
|
105
|
+
fields, so there is nothing to remove".
|
|
106
|
+
|
|
107
|
+
A future session will read this section and think the rule is over-strict. It is not: the allowlist is
|
|
108
|
+
the only part of this design that survives contact with a document written to be sent.
|
|
109
|
+
|
|
110
|
+
## Step 3 — Assemble the whole document, then apply the glossary as an outbound stop-list
|
|
111
|
+
|
|
112
|
+
1. Assemble the whole document in memory: the `## Context` paragraph from Step 2, the questions, and
|
|
113
|
+
the template's remaining sections.
|
|
114
|
+
2. Then apply the stop-list below.
|
|
115
|
+
|
|
116
|
+
THIS STEP RUNS BEFORE THE REDACTION FLOOR, AND THE ORDER IS THE WHOLE POINT. The floor must scan the
|
|
117
|
+
bytes that actually go out, so nothing may edit the document after it. An earlier revision put the
|
|
118
|
+
floor here and the stop-list after it, which meant the stop-list rewrote text the sentinel had already
|
|
119
|
+
cleared — reintroducing, legitimately, the un-scanned preview the floor exists to prevent.
|
|
120
|
+
|
|
121
|
+
`knowledge-base/project/glossary.md` is the list of internal words that must not leave the repository
|
|
122
|
+
inside a document attributed to the founder. Read it as a stop-list here, before the redaction floor runs: if a word in
|
|
123
|
+
the document has an entry there, it is an internal noun and the emitted document says the plain thing
|
|
124
|
+
instead. Skill names, agent names, phase names, lane names and workflow nouns do not appear in a
|
|
125
|
+
document a founder signs.
|
|
126
|
+
|
|
127
|
+
**This is the one sanctioned knowledge-base read on the drafting path, and it is not an exception to
|
|
128
|
+
Step 2.** Step 2 forbids SOURCING a fact from the knowledge base into the document. This read does the
|
|
129
|
+
opposite: it supplies a list of words to TAKE OUT. Nothing read here can enter the document, so the
|
|
130
|
+
allowlist is intact. Stated explicitly because the two rules otherwise read as a contradiction — one
|
|
131
|
+
says "no file read on the drafting path" and this step is a file read on the drafting path.
|
|
132
|
+
|
|
133
|
+
## Step 4 — The redaction floor
|
|
134
|
+
|
|
135
|
+
Before the file is written, run the document through the redaction sentinel — the same boundary
|
|
136
|
+
`soleur:legal-generate` applies before it presents a draft. Run this as ONE fence: each fenced block is
|
|
137
|
+
a separate Bash call and shell state does not persist, so a preflight in one fence protects nothing in
|
|
138
|
+
the next.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# ALLOCATE THE DRAFT FIRST. Everything below operates on "$DRAFT", and an earlier revision of this
|
|
142
|
+
# fence referenced it four times without ever defining it — so `[ -s "$DRAFT" ]` was false on every
|
|
143
|
+
# run and the floor halted with `reason=draft-empty` unconditionally. A gate that always refuses is
|
|
144
|
+
# not a strict gate, it is an unrunnable skill, and it is worse than the unanchored path it replaced.
|
|
145
|
+
DRAFT="$(mktemp -p "$(mktemp -d -t soleur-run.$$.XXXXXXXX)")" || { echo "SOLEUR_QUESTIONNAIRE_HALT reason=draft-alloc-failed"
|
|
146
|
+
echo "questionnaire-generate: cannot allocate a draft file — stopping before any draft text exists." >&2
|
|
147
|
+
exit 2; }
|
|
148
|
+
trap 'rm -f "$DRAFT"; rmdir "$(dirname "$DRAFT")" 2>/dev/null' EXIT INT TERM HUP
|
|
149
|
+
|
|
150
|
+
# Write the assembled document into "$DRAFT" HERE, in THIS fence, before the gate below — each fenced
|
|
151
|
+
# block is a separate Bash call and shell state does not persist, so a draft written in another fence
|
|
152
|
+
# is not visible to this one and the emptiness check below would refuse.
|
|
153
|
+
#
|
|
154
|
+
# Use a QUOTED heredoc delimiter (`<<'DOC_EOF'`). The founder's three Step 1 answers are free text and
|
|
155
|
+
# can contain `$(…)`, backticks or `$VAR`; an unquoted delimiter would EXECUTE those substitutions on
|
|
156
|
+
# the founder's machine and expand `$VAR` to empty — mutating the very text the sentinel is about to
|
|
157
|
+
# scan, so a secret's shape can be destroyed by the shell rather than caught by the redactor.
|
|
158
|
+
# cat > "$DRAFT" <<'DOC_EOF'
|
|
159
|
+
# <the assembled questionnaire, verbatim — the Step 2 Context paragraph plus the questions>
|
|
160
|
+
# DOC_EOF
|
|
161
|
+
|
|
162
|
+
# PLUGIN IDENTITY (ADR-179 decision 2). `[[ -r "$SENTINEL" ]]` alone is a SHAPE check, and
|
|
163
|
+
# ADR-179 §(a) measured that shape as bypassable: with an ambient CLAUDE_PLUGIN_ROOT pointing at an
|
|
164
|
+
# attacker-chosen directory a `test -d` preflight PASSED and the hostile payload executed. Verify the
|
|
165
|
+
# plugin's IDENTITY, and halt in THIS arm — a sibling halt further down the fence does not make this
|
|
166
|
+
# check fail-closed.
|
|
167
|
+
[ -f "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" ] \
|
|
168
|
+
&& grep -q '"name"[[:space:]]*:[[:space:]]*"soleur"' "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" \
|
|
169
|
+
|| { echo "SOLEUR_QUESTIONNAIRE_HALT reason=plugin-root-unverified root=[${CLAUDE_PLUGIN_ROOT}]"
|
|
170
|
+
echo "questionnaire-generate: cannot verify the Soleur plugin installation — stopping before any document is written." >&2
|
|
171
|
+
echo " Resolved plugin root: [${CLAUDE_PLUGIN_ROOT}]" >&2
|
|
172
|
+
echo " If that is EMPTY: no Soleur plugin is loaded in this session. Install it and start a NEW session — re-running here resolves the same empty root." >&2
|
|
173
|
+
echo " If it names a path: that path is not a Soleur install (a repo checkout is not an install). Run 'claude plugin update soleur@soleur-marketplace' (or the id 'claude plugin list' prints, if you added the repository directly), then RESTART Claude Code — plugin changes apply only on restart." >&2
|
|
174
|
+
echo " Do NOT hand-write and send this document instead — the allowlist in Step 2 is what makes it safe to send, and this gate is the floor under it." >&2
|
|
175
|
+
exit 2; }
|
|
176
|
+
|
|
177
|
+
SENTINEL="${CLAUDE_PLUGIN_ROOT}/skills/incident/scripts/redact-sentinel.sh"
|
|
178
|
+
[[ -r "$SENTINEL" ]] || { echo "SOLEUR_QUESTIONNAIRE_HALT reason=sentinel-unreadable sentinel=[$SENTINEL]"
|
|
179
|
+
echo "questionnaire-generate: the redaction sentinel is missing from an otherwise valid Soleur install — stopping." >&2
|
|
180
|
+
echo " Expected at: [$SENTINEL]" >&2
|
|
181
|
+
echo " The install is partial or out of date. Run 'claude plugin update soleur@soleur-marketplace', then RESTART Claude Code." >&2
|
|
182
|
+
exit 2; }
|
|
183
|
+
|
|
184
|
+
# EMPTINESS IS A FAILURE, NOT A CLEAN SCAN. The sentinel exits 0 on zero bytes, so an unwritten draft
|
|
185
|
+
# passes this gate vacuously and the preview then presents un-scanned text. Same shape as
|
|
186
|
+
# legal-generate's `[ -s "$DRAFT" ]`.
|
|
187
|
+
[ -s "$DRAFT" ] || { echo "SOLEUR_QUESTIONNAIRE_HALT reason=draft-empty draft=[$DRAFT]"
|
|
188
|
+
echo "questionnaire-generate: the draft is empty — nothing was scanned, so nothing is safe to send." >&2
|
|
189
|
+
echo " Write the document into \"\$DRAFT\" in the SAME fence as this gate, then re-run." >&2
|
|
190
|
+
exit 2; }
|
|
191
|
+
|
|
192
|
+
bash "$SENTINEL" "$DRAFT"
|
|
193
|
+
sentinel_rc=$?
|
|
194
|
+
|
|
195
|
+
# DISPATCH HERE, INSIDE THE FENCE, AND EMIT THE VERDICT. Assigning `sentinel_rc` and dispatching in
|
|
196
|
+
# prose below does not work and was measured not working: an assignment is the fence's terminal
|
|
197
|
+
# statement so the fence exits 0 whatever the sentinel said, shell state does not persist to the next
|
|
198
|
+
# fence (see the note above), and — the part that matters — rc=0 and rc=2 produce BYTE-IDENTICAL
|
|
199
|
+
# stdout, zero bytes each, because the sentinel writes its cannot-evaluate diagnostic to stderr.
|
|
200
|
+
# Measured: clean rc=0/0 bytes, matches rc=1/53 bytes, unreadable rc=2/0 bytes. So a document that was
|
|
201
|
+
# never scanned was indistinguishable from one that scanned clean, and the "cannot evaluate -> halt"
|
|
202
|
+
# arm below was unreachable. That is fail-OPEN, in the one gate whose whole purpose is to fail closed.
|
|
203
|
+
case "$sentinel_rc" in
|
|
204
|
+
0) echo "SOLEUR_QUESTIONNAIRE_SENTINEL verdict=clean" ;;
|
|
205
|
+
1) echo "SOLEUR_QUESTIONNAIRE_HALT reason=sentinel-matches"
|
|
206
|
+
echo "questionnaire-generate: the sentinel matched. Do NOT write and do NOT present." >&2
|
|
207
|
+
echo " The allowlist was violated upstream — fix the CONSTRUCTION in Step 2, not the output." >&2
|
|
208
|
+
exit 1 ;;
|
|
209
|
+
*) echo "SOLEUR_QUESTIONNAIRE_HALT reason=sentinel-cannot-evaluate rc=[$sentinel_rc]"
|
|
210
|
+
echo "questionnaire-generate: the sentinel could not evaluate the draft — stopping." >&2
|
|
211
|
+
echo " An un-scanned document is not a clean one. Do not present it and do not send it." >&2
|
|
212
|
+
exit 2 ;;
|
|
213
|
+
esac
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
The fence above emits exactly one `SOLEUR_QUESTIONNAIRE_*` marker and halts on anything but a clean
|
|
217
|
+
scan. For reference, the arms it implements:
|
|
218
|
+
|
|
219
|
+
- **0** — clean. Proceed.
|
|
220
|
+
- **1** — matches found. Do not write and do not present. The allowlist was violated upstream; fix the
|
|
221
|
+
construction, not the output.
|
|
222
|
+
- **2** — cannot evaluate. **Halt.** An un-scanned document is not a clean one.
|
|
223
|
+
|
|
224
|
+
This sentinel is a **floor and never a ceiling**. Exit 0 means no secret was found. It does not mean
|
|
225
|
+
the document is safe to send — Step 2 is what makes it safe to send.
|
|
226
|
+
|
|
227
|
+
## Step 5 — Compute, preview, then take a typed confirmation
|
|
228
|
+
|
|
229
|
+
The shape is `plugins/soleur/skills/invoice/SKILL.md` S4 steps 4 and 5: compute the artifact, show the
|
|
230
|
+
founder what will actually go out, and take a literal typed `yes` before it becomes sendable.
|
|
231
|
+
|
|
232
|
+
1. Show the founder the recipient role, the deadline, the question list, and the `## Context` paragraph
|
|
233
|
+
**verbatim** — the real bytes, not a summary of them.
|
|
234
|
+
2. **Append nothing after the Context paragraph.** Whatever the preview ends with is what the recipient
|
|
235
|
+
reads. A line added after the confirmation is a line the founder never approved.
|
|
236
|
+
3. Require a single literal `yes`. Any other token — `y`, `Yes`, `yes go ahead` — re-shows the Context
|
|
237
|
+
paragraph once, then aborts. There is no force flag.
|
|
238
|
+
4. Only then write the file.
|
|
239
|
+
|
|
240
|
+
## Step 6 — Emit
|
|
241
|
+
|
|
242
|
+
Write to:
|
|
243
|
+
|
|
244
|
+
```text
|
|
245
|
+
knowledge-base/project/questionnaires/YYYY-MM-DD-<recipient-role>-<topic>.md
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Strip the first line of the template.** Line 1 of
|
|
249
|
+
[questionnaire.template](./references/questionnaire.template) is a provenance comment for this
|
|
250
|
+
repository, and the emitted document is a founder's correspondence rather than a Soleur artifact — so
|
|
251
|
+
the emitter drops line 1 and the document starts at the frontmatter fence. The emitted file carries no
|
|
252
|
+
vendor mark of any kind.
|
|
253
|
+
|
|
254
|
+
Frontmatter, all four fields required: `recipient_role` (a role, never a person's name), `needed_by`
|
|
255
|
+
(the date from Step 1 question 4), `blocked_decision` (Step 1 question 1), and **`status: draft`**.
|
|
256
|
+
|
|
257
|
+
**`draft`, not `sent`, and this is a correctness matter rather than a nicety.** This skill writes a
|
|
258
|
+
document; it never sends anything — the founder sends it later, by hand, from their own mail client.
|
|
259
|
+
So at emit time nothing is known about whether it was sent, and an earlier revision emitted
|
|
260
|
+
`status: sent`. [questionnaire-unanswered-8289.sh](../../../../scripts/followthroughs/questionnaire-unanswered-8289.sh)
|
|
261
|
+
starts its overdue clock at
|
|
262
|
+
`sent`, so an unsent draft became an ACTION REQUIRED on its own `needed_by` — reporting an overdue
|
|
263
|
+
answer to a question nobody had asked, in an unattended sweep that writes to a public issue comment.
|
|
264
|
+
Tell the founder, in the hand-off line, to change `draft` to `sent` when they actually send it.
|
|
265
|
+
|
|
266
|
+
`<topic>` in the filename is a two-or-three-word slug of `blocked_decision`, lower-case and
|
|
267
|
+
hyphenated — derived from a field Step 1 collected, never invented from the subject matter.
|
|
268
|
+
|
|
269
|
+
`## Blocked on` takes the artifact that caused the ask: a repo-relative path, or an issue reference.
|
|
270
|
+
If Step 1 produced no such artifact, write the plan or decision record the founder named when they
|
|
271
|
+
described the block; if there is genuinely none, say so in one line rather than leaving the section
|
|
272
|
+
empty, because the section is what lets the next session pick the thread up. The remaining conventions
|
|
273
|
+
for this directory, including the `## Answers` discipline, are in
|
|
274
|
+
`knowledge-base/project/questionnaires/README.md`.
|
|
275
|
+
|
|
276
|
+
## Voice
|
|
277
|
+
|
|
278
|
+
Brand-guide **General register** (`knowledge-base/marketing/brand-guide.md` → Audience Voice Profiles).
|
|
279
|
+
Over the emitted document:
|
|
280
|
+
|
|
281
|
+
- First-person singular. "I need", "my accountant". Never `we` or `our` for the sender — a solo founder
|
|
282
|
+
writing as a committee reads as a form letter and invites a form answer.
|
|
283
|
+
- **Jikigai** wherever a legal entity is named. The word **Soleur** never appears. The founder is
|
|
284
|
+
writing to their accountant, not introducing their tooling vendor.
|
|
285
|
+
- No emoji.
|
|
286
|
+
- No hedges. `might`, `could`, `potentially` and `perhaps` are absent. A hedged question invites a
|
|
287
|
+
hedged answer, and the founder gets one async round-trip.
|
|
288
|
+
- Plain language, no jargon without an immediate definition in the same sentence.
|
|
289
|
+
|
|
290
|
+
## Must refuse
|
|
291
|
+
|
|
292
|
+
Each of these ends the step and routes to a founder-fix, exactly as
|
|
293
|
+
`plugins/soleur/skills/invoice/SKILL.md` S6 refuses to invent an invoice fact:
|
|
294
|
+
|
|
295
|
+
- **Any fact about the founder's business the founder did not say out loud in this session.** No
|
|
296
|
+
knowledge-base enrichment, no inferred figures, no "based on your roadmap", no rounded estimate.
|
|
297
|
+
- **Claimed knowledge the founder does not have.** No "as we discussed", no invented prior
|
|
298
|
+
correspondence, no implied earlier call. The founder has to be able to answer any follow-up the
|
|
299
|
+
recipient asks about their own document, and every sentence in it is a sentence they may be asked
|
|
300
|
+
about.
|
|
301
|
+
- **Forged attribution.** No signature block, job title, letterhead, address or credential the founder
|
|
302
|
+
did not supply.
|
|
303
|
+
- **A question whose answer the founder is obliged to already hold.** A registration number, a fiscal
|
|
304
|
+
year end, a filing date: asking an outsider for those is the founder's own record-keeping gap
|
|
305
|
+
wearing a questionnaire's clothes. Route it to the founder as a fix.
|
|
306
|
+
|
|
307
|
+
## The return leg
|
|
308
|
+
|
|
309
|
+
The document is half the mechanism. The other half is that nobody has to remember it.
|
|
310
|
+
`status: sent` plus the founder's own `needed_by` is what
|
|
311
|
+
[questionnaire-unanswered-8289.sh](../../../../scripts/followthroughs/questionnaire-unanswered-8289.sh)
|
|
312
|
+
reads on the follow-through sweep: still `sent` and past its date means the founder is waiting on an
|
|
313
|
+
answer. `## Blocked on` points back at the artifact that caused the ask, so the next session finds the
|
|
314
|
+
open question instead of re-deriving it.
|
|
315
|
+
|
|
316
|
+
That probe runs on the sweeper and **never inside this skill**. A skill that reports on its own output
|
|
317
|
+
is reporting on itself (#6737, ADR-126).
|
|
318
|
+
|
|
319
|
+
## Sharp edges
|
|
320
|
+
|
|
321
|
+
- **Three interview questions, not four.** Adding a subject question is the most tempting change here
|
|
322
|
+
and it defeats the skill: the founder does not have that answer, which is why the document exists.
|
|
323
|
+
- **The preview is the document, byte for byte.** A preview that paraphrases the Context paragraph
|
|
324
|
+
confirms something the founder never saw.
|
|
325
|
+
- **`redact-sentinel.sh` going green is not approval.** It is the floor. Step 2 is the design.
|
|
326
|
+
- **This skill sends nothing.** Emitting to a mail API, an issue comment or any outbound channel would
|
|
327
|
+
make the Plugin an intermediary for third-party correspondence, which
|
|
328
|
+
`docs/legal/data-protection-disclosure.md` §2.1(d) says it is not. The founder sends the file.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!-- Inspired by mattpocock/skills/skills/productivity/to-questionnaire/SKILL.md (MIT, Copyright (c) 2026 Matt Pocock). -->
|
|
2
|
+
---
|
|
3
|
+
recipient_role: <recipient-role, lowercase, no person's name>
|
|
4
|
+
needed_by: <YYYY-MM-DD, the date the founder stated>
|
|
5
|
+
blocked_decision: <the one decision that cannot be made until these answers arrive>
|
|
6
|
+
status: draft # flip to `sent` when you actually send it; the overdue sweep starts from that
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Questions for my <recipient-role>
|
|
10
|
+
|
|
11
|
+
I am the founder of Jikigai. What follows is a list of questions and nothing else. It is not a
|
|
12
|
+
position, not a brief, and not advice from me to you. I am asking because the answers sit with you
|
|
13
|
+
and not with me.
|
|
14
|
+
|
|
15
|
+
## Context
|
|
16
|
+
|
|
17
|
+
<One paragraph. It is built from exactly three things the founder stated out loud: the decision being
|
|
18
|
+
made, the role of the person receiving this, and the date the answers are needed. Nothing is added to
|
|
19
|
+
it and nothing is looked up for it.>
|
|
20
|
+
|
|
21
|
+
## How to answer
|
|
22
|
+
|
|
23
|
+
Write your answer on the blank quote line under each question. A partial answer is worth more to me
|
|
24
|
+
than a blank one, and "I do not know" is a real answer I can act on. Where a question rests on
|
|
25
|
+
something you need from me first, say what you need rather than assuming it.
|
|
26
|
+
|
|
27
|
+
I need this back by <YYYY-MM-DD>.
|
|
28
|
+
|
|
29
|
+
## Questions
|
|
30
|
+
|
|
31
|
+
### <First question. One idea, phrased as a question, most consequential first.>
|
|
32
|
+
|
|
33
|
+
_Why I am asking: <one line, and only where the question reads two ways without it>_
|
|
34
|
+
|
|
35
|
+
>
|
|
36
|
+
|
|
37
|
+
### <Next question. Same shape. Group under a `### ` theme heading once there are more than six.>
|
|
38
|
+
|
|
39
|
+
>
|
|
40
|
+
|
|
41
|
+
## Anything I have not asked
|
|
42
|
+
|
|
43
|
+
Is there a question I should have put on this list? Write it here with your answer.
|
|
44
|
+
|
|
45
|
+
>
|
|
46
|
+
|
|
47
|
+
## Answers
|
|
48
|
+
|
|
49
|
+
<Left blank when this is sent. If the reply arrives as an email rather than as an edit to this file,
|
|
50
|
+
transcribe each answer under its question here and change status to answered in the frontmatter
|
|
51
|
+
above. Do NOT paste the message itself: an inbound reply carries the sender's name, signature block
|
|
52
|
+
and contact details, and this repository is PUBLIC with permanent history. Drop the greeting, the
|
|
53
|
+
sign-off and the signature; attribute to the ROLE ('the accountant'), never to a person. Quote a
|
|
54
|
+
sentence verbatim only where the exact wording matters — a figure, a statutory citation, a
|
|
55
|
+
commitment — and say that it is a quotation. See knowledge-base/project/questionnaires/README.md.>
|
|
56
|
+
|
|
57
|
+
## Blocked on
|
|
58
|
+
|
|
59
|
+
<Repo-relative path, or issue reference, for the artifact that could not be finished without these
|
|
60
|
+
answers.>
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rclone
|
|
3
|
+
description: "This skill should be used when uploading, syncing, or managing files across cloud storage providers using rclone. It handles transfers to S3, Cloudflare R2, Backblaze B2, Google Drive, Dropbox, or any S3-compatible storage."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- soleur-cloud-mode:start -->
|
|
7
|
+
**Cloud Mode (Devin):** before pipeline work run `bash "${CLAUDE_PLUGIN_ROOT}/scripts/cloud-detect.sh"`. If `CLAUDE_PLUGIN_ROOT` is unset (cloud exec shells do not export it), resolve the root by IDENTITY, never by script basename: for `d` in `"$HOME/.local/share/devin/cli/plugins/cache"` and `/opt/.devin/plugins`, skip unless `[ -d "$d" ]`, then `MANIFEST="$(find "$d" -path '*/.claude-plugin/plugin.json' -exec grep -l '"name"[[:space:]]*:[[:space:]]*"soleur"' {} + 2>/dev/null | head -1)"`, `ROOT="${MANIFEST%/.claude-plugin/plugin.json}"` — one resolution, two consumers: `$ROOT/scripts/cloud-detect.sh` and `$ROOT/scripts/precommit-guard.sh`. (Shape check, not authentication: a planted `{"name":"soleur"}` dir passes — ADR-179 A11.) `local` or `not-local:no-devin-env` proceeds normally; any other `not-local:<reason>` applies `<plugin-root>/devin/INSTRUCTIONS.md` §Cloud Mode: emit the `--banner`, fan out sequentially with `Reviewed-Coverage: sequential-fallback` disclosure (never claim an independent review ran), `message_user` ack before any secrets read or production mutation, and run `precommit-guard.sh` before any `git commit` — hooks do not fire in cloud.
|
|
8
|
+
<!-- soleur-cloud-mode:end -->
|
|
9
|
+
|
|
10
|
+
<!-- grok-harness-invoke:start -->
|
|
11
|
+
**Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
|
|
12
|
+
<!-- grok-harness-invoke:end -->
|
|
13
|
+
|
|
14
|
+
# rclone File Transfer Skill
|
|
15
|
+
|
|
16
|
+
## Setup Check (Always Run First)
|
|
17
|
+
|
|
18
|
+
Before any rclone operation, verify installation and configuration:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Check if rclone is installed
|
|
22
|
+
command -v rclone >/dev/null 2>&1 && rclone version || echo "NOT INSTALLED"
|
|
23
|
+
|
|
24
|
+
# List configured remotes
|
|
25
|
+
rclone listremotes 2>/dev/null || echo "NO REMOTES CONFIGURED"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### If rclone is NOT installed
|
|
29
|
+
|
|
30
|
+
Guide the user to install:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# macOS
|
|
34
|
+
brew install rclone
|
|
35
|
+
|
|
36
|
+
# Linux (static binary to ~/.local/bin)
|
|
37
|
+
d=$(mktemp -d -t soleur-run.$$.XXXXXXXX) && mkdir -p ~/.local/bin && curl -sfL https://downloads.rclone.org/rclone-current-linux-amd64.zip -o "$d/rclone.zip" && unzip -q "$d/rclone.zip" -d "$d" && cp "$d"/rclone-*/rclone ~/.local/bin/ && chmod +x ~/.local/bin/rclone && rm -rf "$d"
|
|
38
|
+
# For arm64: replace amd64 with arm64 in the URL above
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### If NO remotes are configured
|
|
42
|
+
|
|
43
|
+
Walk the user through interactive configuration:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
rclone config
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Common provider setup quick reference:**
|
|
50
|
+
|
|
51
|
+
| Provider | Type | Key Settings |
|
|
52
|
+
|----------|------|--------------|
|
|
53
|
+
| AWS S3 | `s3` | access_key_id, secret_access_key, region |
|
|
54
|
+
| Cloudflare R2 | `s3` | access_key_id, secret_access_key, endpoint (account_id.r2.cloudflarestorage.com) |
|
|
55
|
+
| Backblaze B2 | `b2` | account (keyID), key (applicationKey) |
|
|
56
|
+
| DigitalOcean Spaces | `s3` | access_key_id, secret_access_key, endpoint (region.digitaloceanspaces.com) |
|
|
57
|
+
| Google Drive | `drive` | OAuth flow (opens browser) |
|
|
58
|
+
| Dropbox | `dropbox` | OAuth flow (opens browser) |
|
|
59
|
+
|
|
60
|
+
**Example: Configure Cloudflare R2**
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
rclone config create r2 s3 \
|
|
64
|
+
provider=Cloudflare \
|
|
65
|
+
access_key_id=YOUR_ACCESS_KEY \
|
|
66
|
+
secret_access_key=YOUR_SECRET_KEY \
|
|
67
|
+
endpoint=ACCOUNT_ID.r2.cloudflarestorage.com \
|
|
68
|
+
acl=private
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Example: Configure AWS S3**
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
rclone config create aws s3 \
|
|
75
|
+
provider=AWS \
|
|
76
|
+
access_key_id=YOUR_ACCESS_KEY \
|
|
77
|
+
secret_access_key=YOUR_SECRET_KEY \
|
|
78
|
+
region=us-east-1
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Common Operations
|
|
82
|
+
|
|
83
|
+
### Upload single file
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
rclone copy /path/to/file.mp4 remote:bucket/path/ --progress
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Upload directory
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
rclone copy /path/to/folder remote:bucket/folder/ --progress
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Sync directory (mirror, deletes removed files)
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
rclone sync /local/path remote:bucket/path/ --progress
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### List remote contents
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
rclone ls remote:bucket/
|
|
105
|
+
rclone lsd remote:bucket/ # directories only
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Check what would be transferred (dry run)
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
rclone copy /path remote:bucket/ --dry-run
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Useful Flags
|
|
115
|
+
|
|
116
|
+
| Flag | Purpose |
|
|
117
|
+
|------|---------|
|
|
118
|
+
| `--progress` | Show transfer progress |
|
|
119
|
+
| `--dry-run` | Preview without transferring |
|
|
120
|
+
| `-v` | Verbose output |
|
|
121
|
+
| `--transfers=N` | Parallel transfers (default 4) |
|
|
122
|
+
| `--bwlimit=RATE` | Bandwidth limit (e.g., `10M`) |
|
|
123
|
+
| `--checksum` | Compare by checksum, not size/time |
|
|
124
|
+
| `--exclude="*.tmp"` | Exclude patterns |
|
|
125
|
+
| `--include="*.mp4"` | Include only matching |
|
|
126
|
+
| `--min-size=SIZE` | Skip files smaller than SIZE |
|
|
127
|
+
| `--max-size=SIZE` | Skip files larger than SIZE |
|
|
128
|
+
|
|
129
|
+
## Large File Uploads
|
|
130
|
+
|
|
131
|
+
For videos and large files, use chunked uploads:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# S3 multipart upload (automatic for >200MB)
|
|
135
|
+
rclone copy large_video.mp4 remote:bucket/ --s3-chunk-size=64M --progress
|
|
136
|
+
|
|
137
|
+
# Resume interrupted transfers
|
|
138
|
+
rclone copy /path remote:bucket/ --progress --retries=5
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Verify Upload
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Check file exists and matches
|
|
145
|
+
rclone check /local/file remote:bucket/file
|
|
146
|
+
|
|
147
|
+
# Get file info
|
|
148
|
+
rclone lsl remote:bucket/path/to/file
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Troubleshooting
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Test connection
|
|
155
|
+
rclone lsd remote:
|
|
156
|
+
|
|
157
|
+
# Debug connection issues
|
|
158
|
+
rclone lsd remote: -vv
|
|
159
|
+
|
|
160
|
+
# Check config
|
|
161
|
+
rclone config show remote
|
|
162
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# rclone setup checker - verifies installation and configuration
|
|
3
|
+
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
echo "=== rclone Setup Check ==="
|
|
7
|
+
echo
|
|
8
|
+
|
|
9
|
+
# Check if rclone is installed
|
|
10
|
+
if command -v rclone >/dev/null 2>&1; then
|
|
11
|
+
echo "✓ rclone installed"
|
|
12
|
+
rclone version | head -1
|
|
13
|
+
echo
|
|
14
|
+
else
|
|
15
|
+
echo "✗ rclone NOT INSTALLED"
|
|
16
|
+
echo
|
|
17
|
+
echo "Install with:"
|
|
18
|
+
echo " macOS: brew install rclone"
|
|
19
|
+
# Single-quoted ON PURPOSE: under double quotes the lexer sees `\$(mktemp`
|
|
20
|
+
# as a live `$(…)` span and the trap-ownership census counts this DATA
|
|
21
|
+
# mention as an untrapped allocation (#10017). Single quotes keep it inert.
|
|
22
|
+
echo ' Linux: d=$(mktemp -d -t soleur-run.$$.XXXXXXXX) && mkdir -p ~/.local/bin && curl -sfL https://downloads.rclone.org/rclone-current-linux-amd64.zip -o "$d/rclone.zip" && unzip -q "$d/rclone.zip" -d "$d" && cp "$d"/rclone-*/rclone ~/.local/bin/ && chmod +x ~/.local/bin/rclone && rm -rf "$d"'
|
|
23
|
+
echo " (for arm64: replace amd64 with arm64 in the URL)"
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Check for configured remotes
|
|
28
|
+
REMOTES=$(rclone listremotes 2>/dev/null || true)
|
|
29
|
+
|
|
30
|
+
if [[ -z "$REMOTES" ]]; then
|
|
31
|
+
echo "✗ No remotes configured"
|
|
32
|
+
echo
|
|
33
|
+
echo "Run 'rclone config' to set up a remote, or use:"
|
|
34
|
+
echo
|
|
35
|
+
echo " # Cloudflare R2"
|
|
36
|
+
echo " rclone config create r2 s3 provider=Cloudflare \\"
|
|
37
|
+
echo " access_key_id=KEY secret_access_key=SECRET \\"
|
|
38
|
+
echo " endpoint=ACCOUNT_ID.r2.cloudflarestorage.com"
|
|
39
|
+
echo
|
|
40
|
+
echo " # AWS S3"
|
|
41
|
+
echo " rclone config create aws s3 provider=AWS \\"
|
|
42
|
+
echo " access_key_id=KEY secret_access_key=SECRET region=us-east-1"
|
|
43
|
+
echo
|
|
44
|
+
exit 1
|
|
45
|
+
else
|
|
46
|
+
echo "✓ Configured remotes:"
|
|
47
|
+
echo "$REMOTES" | sed 's/^/ /'
|
|
48
|
+
echo
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# Test connectivity for each remote
|
|
52
|
+
echo "Testing remote connectivity..."
|
|
53
|
+
for remote in $REMOTES; do
|
|
54
|
+
remote_name="${remote%:}"
|
|
55
|
+
if rclone lsd "$remote" >/dev/null 2>&1; then
|
|
56
|
+
echo " ✓ $remote_name - connected"
|
|
57
|
+
else
|
|
58
|
+
echo " ✗ $remote_name - connection failed (check credentials)"
|
|
59
|
+
fi
|
|
60
|
+
done
|
|
61
|
+
|
|
62
|
+
echo
|
|
63
|
+
echo "=== Setup Complete ==="
|