@soleur/opencode 0.0.0-stage → 3.354.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +660 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +29 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +361 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +171 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +818 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +411 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +509 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +115 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +165 -0
- package/scripts/sync-opencode-adapter.ts +498 -0
- package/scripts/sync-pr-behind.sh +647 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +67 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +143 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +670 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +331 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +141 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1620 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-evidence-comment.md +36 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3023 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/cleanup-merged-archival.md +39 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/delegated-act-authoring-form.md +7 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/epic-close-sweep.md +62 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +179 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/verification-scaffold/SKILL.md +73 -0
- package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
- package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
- package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
- package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
- package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
- package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
- package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
- package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
- package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
- package/skills/verification-scaffold/references/guards.tsv +21 -0
- package/skills/verification-scaffold/references/verification-readme.template +55 -0
- package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
- package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
- package/skills/verification-scaffold/test/generator.test.sh +319 -0
- package/skills/verification-scaffold/test/manifest.test.sh +144 -0
- package/skills/work/SKILL.md +1480 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# community-router.sh — thin dispatch router for community platform scripts
|
|
3
|
+
# Single source of truth for platform detection and dispatch.
|
|
4
|
+
# Adding a new platform: add one entry to PLATFORMS and create the script.
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
|
|
9
|
+
# Platform registry: name|script|required_env_vars (comma-separated)|auth_command
|
|
10
|
+
# Empty env_vars + empty auth_command = always enabled (e.g., HN uses public API)
|
|
11
|
+
PLATFORMS=(
|
|
12
|
+
"discord|discord-community.sh|DISCORD_BOT_TOKEN,DISCORD_GUILD_ID|"
|
|
13
|
+
"github|github-community.sh||gh auth status 2>/dev/null"
|
|
14
|
+
"x|x-community.sh|X_API_KEY,X_API_SECRET,X_ACCESS_TOKEN,X_ACCESS_TOKEN_SECRET|"
|
|
15
|
+
"bsky|bsky-community.sh|BSKY_HANDLE,BSKY_APP_PASSWORD|"
|
|
16
|
+
"linkedin|linkedin-community.sh|LINKEDIN_ACCESS_TOKEN,LINKEDIN_PERSON_URN|"
|
|
17
|
+
"hn|hn-community.sh||"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
check_auth() {
|
|
21
|
+
local env_vars="$1" auth_cmd="$2"
|
|
22
|
+
|
|
23
|
+
# If auth command specified, run it (suppress all output)
|
|
24
|
+
if [[ -n "$auth_cmd" ]]; then
|
|
25
|
+
eval "$auth_cmd" &>/dev/null && return 0 || return 1
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# If env vars specified, check all are set
|
|
29
|
+
if [[ -n "$env_vars" ]]; then
|
|
30
|
+
IFS=',' read -ra vars <<< "$env_vars"
|
|
31
|
+
for var in "${vars[@]}"; do
|
|
32
|
+
[[ -n "${!var:-}" ]] || return 1
|
|
33
|
+
done
|
|
34
|
+
return 0
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# No env vars and no auth command = always enabled
|
|
38
|
+
return 0
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
cmd_platforms() {
|
|
42
|
+
local name script env_vars auth_cmd status
|
|
43
|
+
printf "%-10s %-8s %s\n" "PLATFORM" "STATUS" "SCRIPT"
|
|
44
|
+
printf "%-10s %-8s %s\n" "--------" "------" "------"
|
|
45
|
+
for entry in "${PLATFORMS[@]}"; do
|
|
46
|
+
IFS='|' read -r name script env_vars auth_cmd <<< "$entry"
|
|
47
|
+
if [[ ! -f "$SCRIPT_DIR/$script" ]]; then
|
|
48
|
+
status="missing"
|
|
49
|
+
elif check_auth "$env_vars" "$auth_cmd"; then
|
|
50
|
+
status="enabled"
|
|
51
|
+
else
|
|
52
|
+
status="disabled"
|
|
53
|
+
fi
|
|
54
|
+
printf "%-10s %-8s %s\n" "$name" "$status" "$script"
|
|
55
|
+
done
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
dispatch() {
|
|
59
|
+
local target="$1"; shift
|
|
60
|
+
local name script env_vars auth_cmd
|
|
61
|
+
for entry in "${PLATFORMS[@]}"; do
|
|
62
|
+
IFS='|' read -r name script env_vars auth_cmd <<< "$entry"
|
|
63
|
+
if [[ "$name" == "$target" ]]; then
|
|
64
|
+
if [[ ! -f "$SCRIPT_DIR/$script" ]]; then
|
|
65
|
+
echo "Error: script '$script' not found for platform '$name'." >&2
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
exec "$SCRIPT_DIR/$script" "$@"
|
|
69
|
+
fi
|
|
70
|
+
done
|
|
71
|
+
echo "Error: unknown platform '$target'." >&2
|
|
72
|
+
local names=()
|
|
73
|
+
for entry in "${PLATFORMS[@]}"; do
|
|
74
|
+
names+=("${entry%%|*}")
|
|
75
|
+
done
|
|
76
|
+
echo "Available platforms: ${names[*]}" >&2
|
|
77
|
+
exit 1
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
main() {
|
|
81
|
+
local command="${1:-}"
|
|
82
|
+
shift || true
|
|
83
|
+
|
|
84
|
+
case "$command" in
|
|
85
|
+
platforms) cmd_platforms ;;
|
|
86
|
+
"") echo "Usage: community-router.sh <platform> <command> [args...]" >&2
|
|
87
|
+
echo " community-router.sh platforms" >&2
|
|
88
|
+
exit 1 ;;
|
|
89
|
+
*) dispatch "$command" "$@" ;;
|
|
90
|
+
esac
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
main "$@"
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# discord-community.sh -- Discord Bot API wrapper for community operations
|
|
3
|
+
#
|
|
4
|
+
# Usage: discord-community.sh <command> [args]
|
|
5
|
+
# Commands:
|
|
6
|
+
# messages <channel_id> [limit] [after_id] - Fetch channel messages
|
|
7
|
+
# members [limit] - Fetch guild members
|
|
8
|
+
# guild-info - Fetch guild metadata
|
|
9
|
+
# channels - List guild text channels
|
|
10
|
+
#
|
|
11
|
+
# Environment variables (required):
|
|
12
|
+
# DISCORD_BOT_TOKEN - Discord bot token for API authentication
|
|
13
|
+
# DISCORD_GUILD_ID - Discord guild (server) ID
|
|
14
|
+
#
|
|
15
|
+
# Output: JSON to stdout
|
|
16
|
+
# Errors: Messages to stderr, exit 1
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
# (#7797) Xtrace refusal -- the FIRST thing after `set …`, so nothing above it is
|
|
21
|
+
# traced. This script ships to installed Soleur CLIs: the terminal it runs in
|
|
22
|
+
# belongs to the founder, and `bash -x` would print their live Discord
|
|
23
|
+
# credentials. The `:+x` form tests non-emptiness WITHOUT expanding the value, so
|
|
24
|
+
# the guard cannot leak the thing it is refusing over. CONDITIONAL, and that is
|
|
25
|
+
# measured rather than inherited: every credential this file handles is bound
|
|
26
|
+
# BEFORE the prologue runs (this script's own credential check reads them from
|
|
27
|
+
# the environment, it never acquires one at runtime), so the guard can never be
|
|
28
|
+
# empty while a credential is live -- and a founder tracing with none set keeps
|
|
29
|
+
# full tracing.
|
|
30
|
+
# Refusal goes to STDOUT, not stderr: agent runtimes surface stdout and swallow
|
|
31
|
+
# stderr (constitution.md > Code Style > Always), and a swallowed security refusal
|
|
32
|
+
# leaves the user with a bare `exit 78` and no text at all.
|
|
33
|
+
case "$-" in
|
|
34
|
+
*x*)
|
|
35
|
+
if [ -n "${DISCORD_BOT_TOKEN:+x}" ]; then
|
|
36
|
+
printf 'Refusing to run under `bash -x`: DISCORD_BOT_TOKEN is set, and tracing would print it to your terminal. To trace safely, unset it and re-run.\n'
|
|
37
|
+
exit 78
|
|
38
|
+
fi
|
|
39
|
+
;;
|
|
40
|
+
esac
|
|
41
|
+
|
|
42
|
+
# (#7873) `--disable` closes ~/.curlrc and `--noproxy '*'` closes the proxy
|
|
43
|
+
# variables, but NEITHER touches the trust store or the TLS session-key log. On an
|
|
44
|
+
# installed CLI the environment belongs to someone who is not us, so
|
|
45
|
+
# a substituted `CURL_CA_BUNDLE` is a clean MITM of the founder's platform
|
|
46
|
+
# token with every other guard fully intact, and `SSLKEYLOGFILE` is passive
|
|
47
|
+
# decryption with no MITM at all. Matches the line in scripts/betterstack-query.sh.
|
|
48
|
+
unset SSLKEYLOGFILE CURL_CA_BUNDLE SSL_CERT_FILE SSL_CERT_DIR CURL_HOME \
|
|
49
|
+
HOSTALIASES LOCALDOMAIN RES_OPTIONS
|
|
50
|
+
|
|
51
|
+
# --- Transport-confinement diagnostics (#7873) --------------------------------
|
|
52
|
+
# Every credentialed `curl` below carries `--disable --noproxy '*'` and discards
|
|
53
|
+
# curl's own stderr (which can carry the URL). A failed request then has four
|
|
54
|
+
# competing causes the founder cannot tell apart: the proxy this script
|
|
55
|
+
# deliberately bypassed, a ~/.curlrc that `--disable` dropped, a TLS trust
|
|
56
|
+
# variable it cleared, or an ordinary network failure. So each failure emits ONE
|
|
57
|
+
# structured marker carrying the discriminators, beside a human line that names
|
|
58
|
+
# the bypass instead of blaming the founder's connectivity.
|
|
59
|
+
SOLEUR_TRANSPORT_SCRIPT="discord-community.sh"
|
|
60
|
+
SOLEUR_TRANSPORT_PLATFORM="Discord"
|
|
61
|
+
|
|
62
|
+
# The request helpers below run inside `$(...)`, where fd 1 is the capture pipe.
|
|
63
|
+
# Save the script's real stdout so the marker reaches the founder's terminal (and
|
|
64
|
+
# the always-on PostToolUse Bash extractor) instead of being swallowed into a
|
|
65
|
+
# variable. The marker is on stdout BY DESIGN -- the call sites' `2>/dev/null` is
|
|
66
|
+
# what keeps curl's URL-carrying stderr out of the transcript, and it must not be
|
|
67
|
+
# able to suppress the diagnostic too.
|
|
68
|
+
exec 3>&1
|
|
69
|
+
|
|
70
|
+
# Which proxy variables are non-empty, or `none`.
|
|
71
|
+
proxy_env_names() {
|
|
72
|
+
local names="" n
|
|
73
|
+
for n in HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY http_proxy https_proxy all_proxy no_proxy; do
|
|
74
|
+
if [[ -n "${!n-}" ]]; then
|
|
75
|
+
names="${names},${n}"
|
|
76
|
+
fi
|
|
77
|
+
done
|
|
78
|
+
if [[ -z "$names" ]]; then
|
|
79
|
+
printf 'none'
|
|
80
|
+
else
|
|
81
|
+
printf '%s' "${names#,}"
|
|
82
|
+
fi
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# True when a proxy this script deliberately bypasses is configured. NO_PROXY
|
|
86
|
+
# alone is not one -- it only ever narrows proxying, so it cannot be the cause.
|
|
87
|
+
proxy_bypassed() {
|
|
88
|
+
[[ -n "${HTTP_PROXY:-}${HTTPS_PROXY:-}${ALL_PROXY:-}${http_proxy:-}${https_proxy:-}${all_proxy:-}" ]]
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# One line, eight fields, on the saved stdout.
|
|
92
|
+
#
|
|
93
|
+
# Two fields were literals in the first cut and are now MEASURED (#7898 review):
|
|
94
|
+
# `noproxy_applied` was the constant "true", which ASSERTS the property instead of
|
|
95
|
+
# observing it -- dropping --noproxy from a call site left the diagnostic still
|
|
96
|
+
# claiming it was applied. It now reports whether a proxy was actually configured
|
|
97
|
+
# for this request to bypass, which is the fact a reader needs. `refusal` was the
|
|
98
|
+
# constant "none" at every call site, so the cause it exists to discriminate could
|
|
99
|
+
# never appear; the field stays for a caller that can refuse for a named cause, and
|
|
100
|
+
# this script has none, so it passes "none".
|
|
101
|
+
#
|
|
102
|
+
# `tls_env_cleared` is new. The prologue unsets CURL_CA_BUNDLE/SSL_CERT_FILE et al,
|
|
103
|
+
# which is correct against an attacker and BREAKS a founder whose corporate CA
|
|
104
|
+
# arrives that way -- curl then exits 60 and, without this field, the event is
|
|
105
|
+
# indistinguishable from an ordinary network failure.
|
|
106
|
+
emit_transport_diag() {
|
|
107
|
+
local curl_exit="$1" refusal="$2" surface="installed-cli" curlrc="false" noproxy="false"
|
|
108
|
+
# The hosted sandbox always sets this (agent-env.ts > AGENT_ENV_OVERRIDES); an
|
|
109
|
+
# installed CLI does not. A label on the event, not a gate on behaviour.
|
|
110
|
+
if [[ -n "${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-}" ]]; then
|
|
111
|
+
surface="in-sandbox"
|
|
112
|
+
fi
|
|
113
|
+
if [[ -f "${HOME:-}/.curlrc" ]]; then
|
|
114
|
+
curlrc="true"
|
|
115
|
+
fi
|
|
116
|
+
if proxy_bypassed; then
|
|
117
|
+
noproxy="true"
|
|
118
|
+
fi
|
|
119
|
+
printf 'SOLEUR_TRANSPORT_DIAG surface=%s script=%s curl_exit=%s refusal=%s proxy_env=%s curlrc_present=%s noproxy_applied=%s tls_env_cleared=%s\n' \
|
|
120
|
+
"$surface" "$SOLEUR_TRANSPORT_SCRIPT" "$curl_exit" "$refusal" \
|
|
121
|
+
"$(proxy_env_names)" "$curlrc" "$noproxy" "true" >&3
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
# Replaces the bare "Check your network connection and try again." on a
|
|
125
|
+
# credentialed-curl failure. With a proxy set, that line blames the founder for a
|
|
126
|
+
# bypass this script chose.
|
|
127
|
+
report_transport_failure() {
|
|
128
|
+
local curl_exit="${1:-unknown}"
|
|
129
|
+
local detail="${2:-Failed to connect to the ${SOLEUR_TRANSPORT_PLATFORM} API.}"
|
|
130
|
+
emit_transport_diag "$curl_exit" "none"
|
|
131
|
+
echo "Error: ${detail}" >&2
|
|
132
|
+
# Ordered by how specific the evidence is. Each arm names something THIS script
|
|
133
|
+
# did, so the founder is never told to go debug their own network for a choice
|
|
134
|
+
# made here. The bare "check your connection" line is the LAST resort, not the
|
|
135
|
+
# default -- it was the default in the first cut, which meant a founder whose
|
|
136
|
+
# corporate CA or curlrc we had just discarded was blamed for it (#7898 review).
|
|
137
|
+
if [[ "$curl_exit" == "60" || "$curl_exit" == "35" || "$curl_exit" == "77" ]]; then
|
|
138
|
+
# 60 peer-certificate, 35 TLS handshake, 77 CA-bundle unreadable.
|
|
139
|
+
echo "This looks like a TLS trust failure. This script deliberately clears CURL_CA_BUNDLE, SSL_CERT_FILE, SSL_CERT_DIR and SSLKEYLOGFILE before the request, because those variables can redirect or expose a request carrying your ${SOLEUR_TRANSPORT_PLATFORM} credential." >&2
|
|
140
|
+
echo "If your machine needs a corporate CA to reach ${SOLEUR_TRANSPORT_PLATFORM}, that is not currently supported -- please open an issue at https://github.com/jikig-ai/soleur/issues." >&2
|
|
141
|
+
elif proxy_bypassed; then
|
|
142
|
+
echo "This request deliberately bypasses your proxy ($(proxy_env_names)), because a proxy can redirect a request carrying your ${SOLEUR_TRANSPORT_PLATFORM} token." >&2
|
|
143
|
+
echo "If you need Soleur to reach ${SOLEUR_TRANSPORT_PLATFORM} through your proxy, that is not currently supported -- please open an issue at https://github.com/jikig-ai/soleur/issues." >&2
|
|
144
|
+
elif [[ -f "${HOME:-}/.curlrc" ]]; then
|
|
145
|
+
echo "You have a ~/.curlrc, and this request deliberately ignores it (--disable), because a curlrc can redirect a request carrying your ${SOLEUR_TRANSPORT_PLATFORM} token. If it configures a proxy or a CA bundle you need, that is why this failed." >&2
|
|
146
|
+
echo "That is not currently supported -- please open an issue at https://github.com/jikig-ai/soleur/issues." >&2
|
|
147
|
+
else
|
|
148
|
+
echo "Check your network connection and try again." >&2
|
|
149
|
+
fi
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# readonly (#7898 review): `cmd_verify` and friends run `set -a; source "$env_file"; set +a`
|
|
153
|
+
# BELOW this line, so a plain assignment here is rebindable by the repo's .env --
|
|
154
|
+
# which retargets the credentialed request while every transport flag stays intact.
|
|
155
|
+
# That is the "--disable and --noproxy are intact and irrelevant" shape this change
|
|
156
|
+
# exists to close, one layer up. readonly makes the destination non-rebindable.
|
|
157
|
+
readonly DISCORD_API="https://discord.com/api/v10"
|
|
158
|
+
|
|
159
|
+
# --- Token-shape guard (#9597) ------------------------------------------------
|
|
160
|
+
# The Bot token rides curl's STDIN config channel (`--config -`), never its argument
|
|
161
|
+
# list (readable by every local user in /proc/<pid>/cmdline). That channel is
|
|
162
|
+
# line-oriented, so a token holding a quote or a newline could append a `url = "..."`
|
|
163
|
+
# directive and make curl issue a second request. This guard refuses anything outside
|
|
164
|
+
# the base64url.base64url.base64url shape BEFORE the value is formatted into the
|
|
165
|
+
# stream (the check validate_env always ran, now also the guard in front of the
|
|
166
|
+
# config stream; the `=~` runs in the C locale so the ranges are ASCII).
|
|
167
|
+
# The refusal line is fixed and value-free (never the token), goes to stderr,
|
|
168
|
+
# and exits 1: it is NOT a transport failure, so it must not go through
|
|
169
|
+
# report_transport_failure, whose text blames ~/.curlrc and proxies.
|
|
170
|
+
_discord_token_ok() {
|
|
171
|
+
local LC_ALL=C t="${1:-}"
|
|
172
|
+
[[ "$t" =~ ^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$ ]]
|
|
173
|
+
}
|
|
174
|
+
refuse_token_shape() {
|
|
175
|
+
printf 'SOLEUR_CREDENTIAL_REFUSED script=%s reason=token_shape\n' "$SOLEUR_TRANSPORT_SCRIPT" >&2
|
|
176
|
+
echo "Error: DISCORD_BOT_TOKEN is not shaped like a Discord bot token, so nothing was sent. Expected three dot-separated base64url segments (letters, digits, '-' and '_'), with no 'Bot ' prefix, quotes, spaces, or line breaks (including a trailing CR or newline). The value is not shown." >&2
|
|
177
|
+
exit 1
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
# --- Dependency checks ---
|
|
181
|
+
|
|
182
|
+
require_jq() {
|
|
183
|
+
if ! command -v jq &>/dev/null; then
|
|
184
|
+
echo "Error: jq is required but not installed." >&2
|
|
185
|
+
echo "Install it: https://jqlang.github.io/jq/download/" >&2
|
|
186
|
+
exit 1
|
|
187
|
+
fi
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# --- Validation ---
|
|
191
|
+
|
|
192
|
+
validate_env() {
|
|
193
|
+
if [[ -z "${DISCORD_BOT_TOKEN:-}" ]]; then
|
|
194
|
+
echo "Error: DISCORD_BOT_TOKEN is not set." >&2
|
|
195
|
+
echo "" >&2
|
|
196
|
+
echo "To configure:" >&2
|
|
197
|
+
echo " 1. Go to https://discord.com/developers/applications" >&2
|
|
198
|
+
echo " 2. Select your bot application > Bot > Copy token" >&2
|
|
199
|
+
echo " 3. export DISCORD_BOT_TOKEN=\"your-token-here\"" >&2
|
|
200
|
+
exit 1
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
# Bot tokens follow the pattern: base64url.base64url.base64url
|
|
204
|
+
if ! _discord_token_ok "${DISCORD_BOT_TOKEN}"; then
|
|
205
|
+
refuse_token_shape
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
if [[ -z "${DISCORD_GUILD_ID:-}" ]]; then
|
|
209
|
+
echo "Error: DISCORD_GUILD_ID is not set." >&2
|
|
210
|
+
echo "" >&2
|
|
211
|
+
echo "To configure:" >&2
|
|
212
|
+
echo " 1. Enable Developer Mode in Discord (Settings > Advanced)" >&2
|
|
213
|
+
echo " 2. Right-click your server name > Copy Server ID" >&2
|
|
214
|
+
echo " 3. export DISCORD_GUILD_ID=\"your-guild-id\"" >&2
|
|
215
|
+
exit 1
|
|
216
|
+
fi
|
|
217
|
+
|
|
218
|
+
if [[ ! "${DISCORD_GUILD_ID}" =~ ^[0-9]+$ ]]; then
|
|
219
|
+
echo "Error: DISCORD_GUILD_ID must be numeric. Got: ${DISCORD_GUILD_ID}" >&2
|
|
220
|
+
exit 1
|
|
221
|
+
fi
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
# --- API helpers ---
|
|
225
|
+
|
|
226
|
+
discord_request() {
|
|
227
|
+
local endpoint="$1"
|
|
228
|
+
local depth="${2:-0}"
|
|
229
|
+
|
|
230
|
+
if (( depth >= 3 )); then
|
|
231
|
+
echo "Error: Discord API rate limit exceeded after 3 retries." >&2
|
|
232
|
+
exit 2
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
local response http_code body
|
|
236
|
+
|
|
237
|
+
# The guard sits IMMEDIATELY before the call it protects, so no later edit to
|
|
238
|
+
# validate_env can leave a malformed token reaching the config stream.
|
|
239
|
+
_discord_token_ok "${DISCORD_BOT_TOKEN}" || refuse_token_shape
|
|
240
|
+
|
|
241
|
+
# Suppress stderr to prevent token leakage in curl debug output. The token rides
|
|
242
|
+
# curl's stdin config channel, never its argument list.
|
|
243
|
+
local __curl_rc=0
|
|
244
|
+
response=$(curl --disable --noproxy '*' -s -w "\n%{http_code}" --config - \
|
|
245
|
+
-H "Content-Type: application/json" \
|
|
246
|
+
"${DISCORD_API}${endpoint}" 2>/dev/null \
|
|
247
|
+
< <(printf 'header = "Authorization: Bot %s"\n' "$DISCORD_BOT_TOKEN")) || __curl_rc=$?
|
|
248
|
+
if (( __curl_rc != 0 )); then
|
|
249
|
+
report_transport_failure "$__curl_rc" "Failed to connect to Discord API (endpoint: ${endpoint})."
|
|
250
|
+
exit 1
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
http_code=$(echo "$response" | tail -1)
|
|
254
|
+
body=$(echo "$response" | sed '$d')
|
|
255
|
+
|
|
256
|
+
case "$http_code" in
|
|
257
|
+
2[0-9][0-9])
|
|
258
|
+
# Validate JSON
|
|
259
|
+
if ! echo "$body" | jq . >/dev/null 2>&1; then
|
|
260
|
+
echo "Error: Discord API returned malformed JSON for ${endpoint}" >&2
|
|
261
|
+
exit 1
|
|
262
|
+
fi
|
|
263
|
+
echo "$body"
|
|
264
|
+
;;
|
|
265
|
+
401)
|
|
266
|
+
echo "Error: Discord API returned 401 Unauthorized." >&2
|
|
267
|
+
echo "Your bot token may be expired or invalid." >&2
|
|
268
|
+
echo "" >&2
|
|
269
|
+
echo "To fix:" >&2
|
|
270
|
+
echo " 1. Go to https://discord.com/developers/applications" >&2
|
|
271
|
+
echo " 2. Select your bot > Bot > Reset Token" >&2
|
|
272
|
+
echo " 3. Update DISCORD_BOT_TOKEN with the new token" >&2
|
|
273
|
+
exit 1
|
|
274
|
+
;;
|
|
275
|
+
429)
|
|
276
|
+
local retry_after
|
|
277
|
+
retry_after=$(echo "$body" | jq -r '.retry_after // 5' 2>/dev/null || echo "5")
|
|
278
|
+
# Clamp retry_after to sane range [1, 60]
|
|
279
|
+
# Use printf to truncate float to integer for arithmetic comparison
|
|
280
|
+
# (sleep accepts floats natively, but bash (( )) does not)
|
|
281
|
+
local retry_int
|
|
282
|
+
retry_int=$(printf '%.0f' "$retry_after" 2>/dev/null || echo "5")
|
|
283
|
+
if (( retry_int > 60 )); then
|
|
284
|
+
retry_after=60
|
|
285
|
+
elif (( retry_int < 1 )); then
|
|
286
|
+
retry_after=1
|
|
287
|
+
fi
|
|
288
|
+
echo "Rate limited. Retrying after ${retry_after}s (attempt $((depth + 1))/3)..." >&2
|
|
289
|
+
sleep "$retry_after"
|
|
290
|
+
discord_request "$endpoint" "$((depth + 1))"
|
|
291
|
+
;;
|
|
292
|
+
*)
|
|
293
|
+
local message
|
|
294
|
+
message=$(echo "$body" | jq -r '.message // "Unknown error"' 2>/dev/null || echo "Unknown error")
|
|
295
|
+
echo "Error: Discord API returned HTTP ${http_code}: ${message}" >&2
|
|
296
|
+
exit 1
|
|
297
|
+
;;
|
|
298
|
+
esac
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
# --- Compact output (#9678) ---
|
|
302
|
+
#
|
|
303
|
+
# The spawned community-monitor agent has no file tools, so any collector output
|
|
304
|
+
# past the Bash tool's inline limit (30,000 characters) is unreadable and the digest row
|
|
305
|
+
# is forced to `partial` / `output-too-large`. The cron handler therefore sets
|
|
306
|
+
# SOLEUR_COLLECTOR_COMPACT=1 and each command prints ONE line of compact JSON
|
|
307
|
+
# holding only the fields the prompt reads (counts, channel ids). Unset, or any
|
|
308
|
+
# other value, leaves the output byte-identical to the interactive form.
|
|
309
|
+
# `members` is exempt: the cron's containment hook denies it, so it never runs there.
|
|
310
|
+
readonly COMPACT_MAX_ITEMS=40
|
|
311
|
+
|
|
312
|
+
compact_on() {
|
|
313
|
+
[[ "${SOLEUR_COLLECTOR_COMPACT:-}" == "1" ]] && return 0
|
|
314
|
+
if [[ -n "${SOLEUR_COLLECTOR_COMPACT:-}" ]]; then
|
|
315
|
+
echo "compact mode ignored: SOLEUR_COLLECTOR_COMPACT must be 1" >&2
|
|
316
|
+
fi
|
|
317
|
+
return 1
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
# --- Commands ---
|
|
321
|
+
|
|
322
|
+
# An operand reaches bash arithmetic, a URL or a jq program only AFTER this check:
|
|
323
|
+
# `(( limit ))` and `$(( limit ))` EVALUATE their operand, so `HOME[$(cmd)]` would run
|
|
324
|
+
# `cmd` (#7122). The message names the operand's LABEL and never the offending value:
|
|
325
|
+
# agent runtimes surface stderr, and the value is third-party-influenced text.
|
|
326
|
+
require_uint() {
|
|
327
|
+
local label="$1"
|
|
328
|
+
if [[ ! "${2:-}" =~ ^(0|[1-9][0-9]*)$ ]]; then
|
|
329
|
+
echo "Error: ${label} must be a non-negative integer." >&2
|
|
330
|
+
exit 1
|
|
331
|
+
fi
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
validate_snowflake_id() {
|
|
335
|
+
require_uint "$2" "$1"
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
cmd_messages() {
|
|
339
|
+
local channel_id="${1:?Usage: discord-community.sh messages <channel_id> [limit] [after_id]}"
|
|
340
|
+
validate_snowflake_id "$channel_id" "channel_id"
|
|
341
|
+
local limit="${2:-100}"
|
|
342
|
+
local after_id="${3:-}"
|
|
343
|
+
require_uint "limit" "$limit"
|
|
344
|
+
if [[ -n "$after_id" ]]; then
|
|
345
|
+
require_uint "after_id" "$after_id"
|
|
346
|
+
fi
|
|
347
|
+
|
|
348
|
+
local all_messages="[]"
|
|
349
|
+
local fetched=0
|
|
350
|
+
local batch_size=100
|
|
351
|
+
|
|
352
|
+
while (( fetched < limit )); do
|
|
353
|
+
local remaining=$(( limit - fetched ))
|
|
354
|
+
local this_batch=$(( remaining < batch_size ? remaining : batch_size ))
|
|
355
|
+
local params="?limit=${this_batch}"
|
|
356
|
+
|
|
357
|
+
if [[ -n "$after_id" ]]; then
|
|
358
|
+
params="${params}&after=${after_id}"
|
|
359
|
+
fi
|
|
360
|
+
|
|
361
|
+
local batch
|
|
362
|
+
batch=$(discord_request "/channels/${channel_id}/messages${params}")
|
|
363
|
+
|
|
364
|
+
local count
|
|
365
|
+
count=$(echo "$batch" | jq 'length')
|
|
366
|
+
|
|
367
|
+
if (( count == 0 )); then
|
|
368
|
+
break
|
|
369
|
+
fi
|
|
370
|
+
|
|
371
|
+
all_messages=$(echo "$all_messages" "$batch" | jq -s '.[0] + .[1]')
|
|
372
|
+
fetched=$(( fetched + count ))
|
|
373
|
+
|
|
374
|
+
# Get the oldest message ID for pagination
|
|
375
|
+
after_id=$(echo "$batch" | jq -r 'last .id')
|
|
376
|
+
|
|
377
|
+
# If we got fewer than requested, no more messages
|
|
378
|
+
if (( count < this_batch )); then
|
|
379
|
+
break
|
|
380
|
+
fi
|
|
381
|
+
done
|
|
382
|
+
|
|
383
|
+
if compact_on; then
|
|
384
|
+
# Only the count is read; bodies, authors and attachments never reach the model.
|
|
385
|
+
jq -ce 'if type == "array" then {count: length} else error("compact: messages not an array") end' <<<"$all_messages"
|
|
386
|
+
return
|
|
387
|
+
fi
|
|
388
|
+
echo "$all_messages"
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
cmd_members() {
|
|
392
|
+
local limit="${1:-1000}"
|
|
393
|
+
require_uint "limit" "$limit"
|
|
394
|
+
local all_members="[]"
|
|
395
|
+
local after="0"
|
|
396
|
+
local batch_size=1000
|
|
397
|
+
|
|
398
|
+
while true; do
|
|
399
|
+
local this_batch=$(( limit < batch_size ? limit : batch_size ))
|
|
400
|
+
local batch
|
|
401
|
+
batch=$(discord_request "/guilds/${DISCORD_GUILD_ID}/members?limit=${this_batch}&after=${after}")
|
|
402
|
+
|
|
403
|
+
local count
|
|
404
|
+
count=$(echo "$batch" | jq 'length')
|
|
405
|
+
|
|
406
|
+
if (( count == 0 )); then
|
|
407
|
+
break
|
|
408
|
+
fi
|
|
409
|
+
|
|
410
|
+
all_members=$(echo "$all_members" "$batch" | jq -s '.[0] + .[1]')
|
|
411
|
+
|
|
412
|
+
local total
|
|
413
|
+
total=$(echo "$all_members" | jq 'length')
|
|
414
|
+
|
|
415
|
+
if (( total >= limit )); then
|
|
416
|
+
all_members=$(echo "$all_members" | jq --argjson n "$limit" '.[0:$n]')
|
|
417
|
+
break
|
|
418
|
+
fi
|
|
419
|
+
|
|
420
|
+
after=$(echo "$batch" | jq -r 'last .user.id')
|
|
421
|
+
|
|
422
|
+
if (( count < this_batch )); then
|
|
423
|
+
break
|
|
424
|
+
fi
|
|
425
|
+
done
|
|
426
|
+
|
|
427
|
+
echo "$all_members"
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
cmd_guild_info() {
|
|
431
|
+
if compact_on; then
|
|
432
|
+
discord_request "/guilds/${DISCORD_GUILD_ID}?with_counts=true" | \
|
|
433
|
+
jq -ce '{approximate_member_count: (.approximate_member_count | if type == "number" then . else error("compact: approximate_member_count missing") end)}'
|
|
434
|
+
return
|
|
435
|
+
fi
|
|
436
|
+
discord_request "/guilds/${DISCORD_GUILD_ID}?with_counts=true"
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
cmd_channels() {
|
|
440
|
+
if compact_on; then
|
|
441
|
+
# `count` stays exact so more than COMPACT_MAX_ITEMS channels is still detectable; ids
|
|
442
|
+
# are filtered to digits because they feed the next Bash call.
|
|
443
|
+
discord_request "/guilds/${DISCORD_GUILD_ID}/channels" | \
|
|
444
|
+
jq -ce --argjson max "$COMPACT_MAX_ITEMS" \
|
|
445
|
+
'[.[] | select(.type == 0)] as $t
|
|
446
|
+
| {count: ($t | length),
|
|
447
|
+
channel_ids: [$t[] | .id | strings | select(test("^[0-9]{1,20}$"))][:$max]}'
|
|
448
|
+
return
|
|
449
|
+
fi
|
|
450
|
+
discord_request "/guilds/${DISCORD_GUILD_ID}/channels" | \
|
|
451
|
+
jq '[.[] | select(.type == 0)]' # type 0 = text channels
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
# --- Main ---
|
|
455
|
+
|
|
456
|
+
main() {
|
|
457
|
+
local command="${1:-}"
|
|
458
|
+
shift || true
|
|
459
|
+
|
|
460
|
+
if [[ -z "$command" ]]; then
|
|
461
|
+
echo "Usage: discord-community.sh <command> [args]" >&2
|
|
462
|
+
echo "" >&2
|
|
463
|
+
echo "Commands:" >&2
|
|
464
|
+
echo " messages <channel_id> [limit] [after_id] - Fetch channel messages" >&2
|
|
465
|
+
echo " members [limit] - Fetch guild members" >&2
|
|
466
|
+
echo " guild-info - Fetch guild metadata" >&2
|
|
467
|
+
echo " channels - List guild text channels" >&2
|
|
468
|
+
exit 1
|
|
469
|
+
fi
|
|
470
|
+
|
|
471
|
+
require_jq
|
|
472
|
+
validate_env
|
|
473
|
+
|
|
474
|
+
case "$command" in
|
|
475
|
+
messages) cmd_messages "$@" ;;
|
|
476
|
+
members) cmd_members "$@" ;;
|
|
477
|
+
guild-info) cmd_guild_info ;;
|
|
478
|
+
channels) cmd_channels ;;
|
|
479
|
+
*)
|
|
480
|
+
echo "Error: Unknown command '${command}'" >&2
|
|
481
|
+
echo "Run 'discord-community.sh' without arguments for usage." >&2
|
|
482
|
+
exit 1
|
|
483
|
+
;;
|
|
484
|
+
esac
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
main "$@"
|