@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,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flag-delete
|
|
3
|
+
description: "This skill should be used to delete a runtime feature flag end-to-end (the inverse of flag-create): removes it from Flagsmith, server.ts RUNTIME_FLAGS, .env.example, the flag-set-role flip.sh map, and Doppler dev+prd, with a WORM audit and typed-yes guardrail."
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<!-- soleur-cloud-mode:start -->
|
|
8
|
+
**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.
|
|
9
|
+
<!-- soleur-cloud-mode:end -->
|
|
10
|
+
|
|
11
|
+
<!-- grok-harness-invoke:start -->
|
|
12
|
+
**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.
|
|
13
|
+
<!-- grok-harness-invoke:end -->
|
|
14
|
+
|
|
15
|
+
# flag-delete
|
|
16
|
+
|
|
17
|
+
Removes a runtime feature flag from **all five** sites — the exact inverse of
|
|
18
|
+
`flag-create`, the **Delete** verb of the flag CRUD set. Destructive: gated by a
|
|
19
|
+
dry-run, a typed-`yes` confirmation, and a WORM audit row written before any
|
|
20
|
+
mutation.
|
|
21
|
+
|
|
22
|
+
## When to use
|
|
23
|
+
|
|
24
|
+
- Retiring a runtime flag whose rollout is complete (or was abandoned).
|
|
25
|
+
- Before deleting, run `soleur:flag-list` to see the flag's blast radius
|
|
26
|
+
(which segments/roles/orgs it targets — all destroyed by the Flagsmith
|
|
27
|
+
cascade).
|
|
28
|
+
|
|
29
|
+
## When NOT to use
|
|
30
|
+
|
|
31
|
+
- Turning a flag off without removing it → `soleur:flag-set-role <flag> <env> off`.
|
|
32
|
+
- Removing a build-time DCE flag (`dev-signin`) → hand-edit `ENV_FLAGS` in
|
|
33
|
+
`server.ts` + `.env.example` (it has no Flagsmith feature).
|
|
34
|
+
|
|
35
|
+
## When to use this skill vs other flag skills
|
|
36
|
+
|
|
37
|
+
The flag CRUD set: `soleur:flag-create` (Create), `soleur:flag-set-role`
|
|
38
|
+
(Update — per-role/per-org), `soleur:flag-list` (Read),
|
|
39
|
+
**`soleur:flag-delete` (Delete — this)**. Initial wiring is the
|
|
40
|
+
`${CLAUDE_PLUGIN_ROOT}/skills/flag-bootstrap/SETUP.md` runbook (operator documentation, not an invocable
|
|
41
|
+
skill).
|
|
42
|
+
|
|
43
|
+
## Arguments
|
|
44
|
+
|
|
45
|
+
<arguments> #$ARGUMENTS </arguments>
|
|
46
|
+
|
|
47
|
+
Required positional: `<kebab-flag-name>`.
|
|
48
|
+
Optional: `--dry-run` (enumerate the 5 mutations and exit before any change).
|
|
49
|
+
|
|
50
|
+
There is intentionally **no** `--yes`/`--force` bypass — the typed-`yes` prompt
|
|
51
|
+
always gates a real delete, and it needs a person at a terminal, because the audit row accepts only that
|
|
52
|
+
acknowledgement (ADR-249; staged-gate migration is tracked in #9387).
|
|
53
|
+
|
|
54
|
+
## Prerequisites
|
|
55
|
+
|
|
56
|
+
- Doppler authed with access to `soleur` configs `dev`, `prd`, `cli_ops`.
|
|
57
|
+
- Worktree of the soleur repo (the script edits `apps/web-platform/` + `flip.sh`).
|
|
58
|
+
- `curl` + `python3` + `jq` on PATH.
|
|
59
|
+
|
|
60
|
+
## Procedure
|
|
61
|
+
|
|
62
|
+
The agent runs only the preview:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
bash "${CLAUDE_PLUGIN_ROOT}/skills/flag-delete/scripts/delete.sh" <flag-name> --dry-run
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## The write is the one typed-`yes` handoff (ADR-249)
|
|
69
|
+
|
|
70
|
+
The write path asks for a typed `yes` through the operator-script library's TTY
|
|
71
|
+
acknowledgement, because the audit row this script writes records only that kind of
|
|
72
|
+
acknowledgement (ADR-249); moving it to the staged agent-run approval gate that
|
|
73
|
+
generated operator scripts use is tracked in #9387. It has no skip variable and no
|
|
74
|
+
flag. An agent's shell has no TTY, so a write run there stops with exit `64` and `SOLEUR_BOOTSTRAP_INPUT_REQUIRED` on
|
|
75
|
+
stdout, before any credential is fetched. Exit `64` is a refusal, never a success.
|
|
76
|
+
The agent therefore does every other step itself (reads, the dry-run preview,
|
|
77
|
+
preflight, verification) and hands over only the typed-`yes` write:
|
|
78
|
+
|
|
79
|
+
1. Runs the script with `--dry-run` and shows the preview. That mode needs no TTY
|
|
80
|
+
and makes no writes.
|
|
81
|
+
2. Prints the exact write command below, in a fenced block, for the operator to type
|
|
82
|
+
at a terminal prompt (Warp), the one step an agent cannot take. It replaces `<WORKTREE>` with the absolute path of
|
|
83
|
+
the worktree that holds this change (`git rev-parse --show-toplevel`) and
|
|
84
|
+
`<ARGS>` with `<flag-name>`, without `--dry-run`. It never prints a
|
|
85
|
+
`${CLAUDE_PLUGIN_ROOT}` or repo-relative form. The script also edits repo files in the directory it runs from, so an operator running it from the main checkout or another worktree would land the code wiring in the wrong tree while Flagsmith and Doppler change.
|
|
86
|
+
3. Does not run the command, and does not run it through Claude Code's `!` prefix
|
|
87
|
+
either (whether that gives the command a TTY is unmeasured, ADR-249). The
|
|
88
|
+
printed command is an undone operator step under
|
|
89
|
+
`wg-block-pr-ready-on-undeferred-operator-steps`: record it where the pipeline
|
|
90
|
+
tracks operator steps, and do not mark a PR ready until the operator says it ran.
|
|
91
|
+
|
|
92
|
+
<!-- operator-write-command -->
|
|
93
|
+
```bash
|
|
94
|
+
cd <WORKTREE> && bash <WORKTREE>/plugins/soleur/skills/flag-delete/scripts/delete.sh <ARGS>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The operator types `yes` at the prompt. Any other answer stops the script with exit
|
|
98
|
+
`1` and `SOLEUR_BOOTSTRAP_ABORTED stage=ack`, before anything is written.
|
|
99
|
+
|
|
100
|
+
The script (full in [scripts/delete.sh](./scripts/delete.sh)) deletes from **5
|
|
101
|
+
sites** (the issue's 4-site framing misses the `flip.sh` map):
|
|
102
|
+
|
|
103
|
+
1. **Flagsmith feature** — `DELETE /api/v1/projects/39082/features/{id}/` →
|
|
104
|
+
HTTP 204. The DB cascade removes all segment + identity overrides; no manual
|
|
105
|
+
pre-deletion needed. The feature_id is resolved by an **exact** `name ==`
|
|
106
|
+
match (the `?q=` filter is substring, so a bare pick could delete the wrong
|
|
107
|
+
feature).
|
|
108
|
+
2. **server.ts** — strip the `"<name>": "FLAG_<X>"` entry from `RUNTIME_FLAGS`.
|
|
109
|
+
3. **.env.example** — remove the `FLAG_<X>=` line.
|
|
110
|
+
4. **flip.sh** — remove the `["<name>"]="FLAG_<X>"` entry from the
|
|
111
|
+
`flag-set-role` `FLAG_ENV_VARS` map (a stale entry lets `flag-set-role` try
|
|
112
|
+
to flip a deleted flag).
|
|
113
|
+
5. **Doppler** — delete the secret in `soleur/dev` AND `soleur/prd` (each delete
|
|
114
|
+
line redirects stdout to `/dev/null` — the Doppler delete command otherwise
|
|
115
|
+
prints the full remaining config).
|
|
116
|
+
|
|
117
|
+
Order: name-validate → confirm flag present in `RUNTIME_FLAGS` → resolve
|
|
118
|
+
Flagsmith id → propose/dry-run/typed-`yes` → **WORM audit (action `archive`)
|
|
119
|
+
before any mutation** → Flagsmith DELETE → code edits → Doppler deletes →
|
|
120
|
+
verify deletion.
|
|
121
|
+
|
|
122
|
+
## Exit codes
|
|
123
|
+
|
|
124
|
+
- `0` — success / dry-run.
|
|
125
|
+
- `1` — name validation failure (or flag not in `RUNTIME_FLAGS`), or the operator
|
|
126
|
+
did not type `yes` (`SOLEUR_BOOTSTRAP_ABORTED stage=ack`; nothing mutated).
|
|
127
|
+
- `2` — prerequisite missing.
|
|
128
|
+
- `3` — Flagsmith API error (non-204 DELETE).
|
|
129
|
+
- `4` — file edit or audit append failed.
|
|
130
|
+
- `5` — Doppler delete failed.
|
|
131
|
+
- `64` — a write run with no TTY (`SOLEUR_BOOTSTRAP_INPUT_REQUIRED`): nothing was
|
|
132
|
+
fetched or changed; hand the command to the operator (above).
|
|
133
|
+
|
|
134
|
+
## Recovery from a partial delete
|
|
135
|
+
|
|
136
|
+
The 5 sites fail independently. The exit code + stderr message identify how far
|
|
137
|
+
the delete got, so a partial state is recoverable:
|
|
138
|
+
|
|
139
|
+
- **exit 3** — nothing mutated (Flagsmith DELETE is the first mutation; a
|
|
140
|
+
non-204 means no code/Doppler change). Re-run is safe.
|
|
141
|
+
- **exit 4, "FATAL: audit RPC …"** — pre-mutation: the WORM append failed
|
|
142
|
+
before the Flagsmith DELETE, so nothing changed. Re-run is safe.
|
|
143
|
+
- **exit 4, server.ts/.env.example/flip.sh edit message** — the Flagsmith
|
|
144
|
+
feature is gone but a code edit failed. Half-deleted: finish the remaining
|
|
145
|
+
edits + Doppler deletes by hand, or re-run (the code-cleanup steps are
|
|
146
|
+
idempotent — each is a no-op if already removed).
|
|
147
|
+
- **exit 5** — Flagsmith + all code files done; a Doppler delete failed. Re-run
|
|
148
|
+
(idempotent) or remove `FLAG_<X>` from Doppler dev/prd by hand.
|
|
149
|
+
|
|
150
|
+
A clean exit `0` is the full-delete signal. The WORM `action` enum (migration
|
|
151
|
+
071: `on`/`off`/`create`/`archive`) has no "delete" value — `archive` is the
|
|
152
|
+
sanctioned flag-removed action, so no schema change is needed.
|
|
153
|
+
|
|
154
|
+
## Sharp edges
|
|
155
|
+
|
|
156
|
+
- **Destructive + edits source files.** Run from a clean worktree and review
|
|
157
|
+
the diff (server.ts + .env.example + flip.sh) before committing.
|
|
158
|
+
- The Flagsmith name is **reusable** after delete (the soft-delete unique index
|
|
159
|
+
ignores deleted rows — verified live 2026-06-15), so a create→delete→recreate
|
|
160
|
+
round-trip works.
|
|
161
|
+
- The management API key is read via `doppler secrets get … -c cli_ops --plain`
|
|
162
|
+
and passed only on curl's stdin config — never echoed.
|
|
163
|
+
|
|
164
|
+
## Cross-references
|
|
165
|
+
|
|
166
|
+
- ADR: `knowledge-base/engineering/architecture/decisions/ADR-038-feature-flags-flagsmith.md`
|
|
167
|
+
- Inverse skill: `soleur:flag-create`. Sibling skills: `soleur:flag-list`, `soleur:flag-set-role`.
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Delete a runtime feature flag end-to-end — the exact inverse of flag-create.
|
|
3
|
+
# Removes the flag from ALL FIVE sites:
|
|
4
|
+
# 1. Flagsmith feature (DELETE → 204; DB cascade removes all segment/identity overrides)
|
|
5
|
+
# 2. server.ts RUNTIME_FLAGS entry
|
|
6
|
+
# 3. .env.example FLAG_<X>= line
|
|
7
|
+
# 4. flag-set-role/scripts/flip.sh FLAG_ENV_VARS map entry (the 5th site the
|
|
8
|
+
# issue's 4-site framing misses — a stale entry lets flag-set-role try to
|
|
9
|
+
# flip a deleted flag)
|
|
10
|
+
# 5. Doppler secret in soleur/dev AND soleur/prd
|
|
11
|
+
#
|
|
12
|
+
# Contract: SKILL.md in the parent directory. Inverse of flag-create/scripts/create.sh.
|
|
13
|
+
#
|
|
14
|
+
# Usage: bash delete.sh <kebab-name> [--dry-run]
|
|
15
|
+
#
|
|
16
|
+
# Run the write in your OWN terminal: the ack below needs a person to type yes.
|
|
17
|
+
# An agent runs only `--dry-run` and prints this command for the operator.
|
|
18
|
+
#
|
|
19
|
+
# Exit codes (same map as create.sh):
|
|
20
|
+
# 0 — success / dry-run
|
|
21
|
+
# 1 — name validation failure, or the operator did not type yes at the ack
|
|
22
|
+
# (stdout: SOLEUR_BOOTSTRAP_ABORTED stage=ack; nothing mutated)
|
|
23
|
+
# 2 — prerequisite missing
|
|
24
|
+
# 64 — no TTY on stdin for a write run (stdout: SOLEUR_BOOTSTRAP_INPUT_REQUIRED);
|
|
25
|
+
# refused before any credential fetch or network call (#8486)
|
|
26
|
+
# 3 — Flagsmith API error
|
|
27
|
+
# 4 — file edit / audit append failed
|
|
28
|
+
# 5 — Doppler delete failed
|
|
29
|
+
#
|
|
30
|
+
# Per-exit-code recovery state (a destructive op's audit trail must distinguish
|
|
31
|
+
# full from partial delete — see SKILL.md "Recovery from a partial delete").
|
|
32
|
+
# The stderr message disambiguates the two exit-4 sub-cases:
|
|
33
|
+
# exit 3 → nothing mutated (Flagsmith DELETE was the first mutation; a non-204
|
|
34
|
+
# means no code/Doppler change happened). Re-run is safe.
|
|
35
|
+
# exit 4 (audit message "FATAL: audit RPC …") → pre-mutation: the WORM append
|
|
36
|
+
# failed BEFORE the Flagsmith DELETE, so nothing was mutated. Re-run safe.
|
|
37
|
+
# exit 4 (server.ts/.env.example/flip.sh edit message) → Flagsmith feature is
|
|
38
|
+
# GONE but a code-file edit failed. Half-deleted: finish the remaining
|
|
39
|
+
# edits + Doppler deletes by hand (or re-run — the code-cleanup steps
|
|
40
|
+
# are idempotent: each is a no-op if already removed).
|
|
41
|
+
# exit 5 → Flagsmith + all code files done; a Doppler delete failed. Re-run
|
|
42
|
+
# (idempotent) or remove FLAG_<X> from Doppler dev/prd by hand.
|
|
43
|
+
#
|
|
44
|
+
# Audit action: 'archive' (migration 071's WORM check constraint allows
|
|
45
|
+
# on/off/create/archive — 'archive' is the sanctioned flag-removed action; no
|
|
46
|
+
# schema change needed). before=current default_enabled, after=null.
|
|
47
|
+
|
|
48
|
+
set -euo pipefail
|
|
49
|
+
|
|
50
|
+
# (#7797) Refuse to run under shell tracing. UNCONDITIONAL — deliberately NOT
|
|
51
|
+
# gated on a non-emptiness test of the credential variable, because
|
|
52
|
+
# every credential this script handles (the Flagsmith management key, and the
|
|
53
|
+
# soleur/prd SUPABASE_SERVICE_ROLE_KEY the audit helper binds) is acquired by
|
|
54
|
+
# `doppler secrets get` BELOW this point, so a conditional arm would test an empty
|
|
55
|
+
# variable at guard time, open, and then trace the acquisition itself. The refusal
|
|
56
|
+
# prints on STDOUT because agent runtimes surface stdout and swallow stderr
|
|
57
|
+
# (knowledge-base/project/constitution.md > Code Style).
|
|
58
|
+
case "$-" in
|
|
59
|
+
*x*)
|
|
60
|
+
printf '[FATAL] refusing to run under xtrace: this script handles a live credential and -x would print it (see #7797)\n'
|
|
61
|
+
exit 78
|
|
62
|
+
;;
|
|
63
|
+
esac
|
|
64
|
+
|
|
65
|
+
# (#7873) `--disable` closes ~/.curlrc and `--noproxy '*'` closes the proxy vars,
|
|
66
|
+
# but neither touches the env that subverts TLS ITSELF. SSLKEYLOGFILE writes the
|
|
67
|
+
# session keys and the CA vars substitute the trust store, so a CURL_CA_BUNDLE
|
|
68
|
+
# MITM of these credentials works with every other guard fully intact.
|
|
69
|
+
unset SSLKEYLOGFILE CURL_CA_BUNDLE SSL_CERT_FILE SSL_CERT_DIR CURL_HOME \
|
|
70
|
+
HOSTALIASES LOCALDOMAIN RES_OPTIONS
|
|
71
|
+
|
|
72
|
+
# Shared WORM audit-append helper (PostgREST RPC). See #4581 PR-1.
|
|
73
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
74
|
+
source "$SCRIPT_DIR/../../../scripts/audit-flag-flip.sh"
|
|
75
|
+
|
|
76
|
+
# Human-presence gate (#8486, ADR-249). Every production write below waits on the
|
|
77
|
+
# operator-script library's class-2 ack, which has NO skip variable and no flag:
|
|
78
|
+
# it needs a person typing `yes` at a terminal, so an agent's tool subprocess
|
|
79
|
+
# (no TTY) is refused with exit 64 before any credential fetch. Clear anything an
|
|
80
|
+
# inherited environment could use to pre-empt the library's double-source guard
|
|
81
|
+
# or to stand in for its ack before sourcing it. (BASH_ENV runs before this
|
|
82
|
+
# script and cannot be cleared from inside it — recorded in ADR-249 as a
|
|
83
|
+
# hijack-class residual.)
|
|
84
|
+
unset _SOLEUR_OPERATOR_SCRIPT_LOADED SOLEUR_OP_ACKED
|
|
85
|
+
unset -f soleur_op_ack_or_die soleur_op_input_required soleur_op_aborted
|
|
86
|
+
# shellcheck source=../../../scripts/lib/operator-script.sh
|
|
87
|
+
source "$SCRIPT_DIR/../../../scripts/lib/operator-script.sh"
|
|
88
|
+
[[ ${SOLEUR_OP_LIB_API:-0} -eq 1 ]] || {
|
|
89
|
+
printf 'SOLEUR_BOOTSTRAP_LIB_INCOMPATIBLE need=1 got=%s\n' "${SOLEUR_OP_LIB_API:-0}"
|
|
90
|
+
exit 64
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
readonly FLAGSMITH_PROJECT_ID=39082
|
|
94
|
+
readonly FLAGSMITH_API="https://api.flagsmith.com/api/v1"
|
|
95
|
+
readonly SERVER_TS="apps/web-platform/lib/feature-flags/server.ts"
|
|
96
|
+
readonly ENV_EXAMPLE="apps/web-platform/.env.example"
|
|
97
|
+
readonly FLIP_SH="plugins/soleur/skills/flag-set-role/scripts/flip.sh"
|
|
98
|
+
|
|
99
|
+
DRY_RUN=0
|
|
100
|
+
NAME=""
|
|
101
|
+
while [[ $# -gt 0 ]]; do
|
|
102
|
+
case "$1" in
|
|
103
|
+
--dry-run) DRY_RUN=1; shift ;;
|
|
104
|
+
--*) echo "unknown flag: $1" >&2; exit 1 ;;
|
|
105
|
+
*) NAME="$1"; shift ;;
|
|
106
|
+
esac
|
|
107
|
+
done
|
|
108
|
+
|
|
109
|
+
# --- name validation FIRST, before ANY interpolation (security P0-2) --------
|
|
110
|
+
# $NAME is later interpolated into python3 source, the ?q= URL, and grep/sed
|
|
111
|
+
# patterns; an unvalidated name with a quote/newline/regex metachar is an
|
|
112
|
+
# injection vector. This is the first executable line after arg parse.
|
|
113
|
+
[[ -z "$NAME" ]] && { echo "Usage: delete.sh <kebab-name> [--dry-run]" >&2; exit 1; }
|
|
114
|
+
[[ ! "$NAME" =~ ^[a-z][a-z0-9-]*[a-z0-9]$ ]] && { echo "name must be lowercase kebab-case (got: $NAME)" >&2; exit 1; }
|
|
115
|
+
|
|
116
|
+
ENV_VAR="FLAG_$(echo "$NAME" | tr 'a-z-' 'A-Z_')"
|
|
117
|
+
|
|
118
|
+
# --- no TTY, no write: refuse before any credential fetch or network call ---
|
|
119
|
+
if [[ $DRY_RUN -eq 0 ]]; then [[ -t 0 ]] || soleur_op_input_required "destructive-write-ack(no-skip-variable-by-design)" ack; fi
|
|
120
|
+
|
|
121
|
+
# --- prerequisites ----------------------------------------------------------
|
|
122
|
+
command -v curl >/dev/null || { echo "missing: curl" >&2; exit 2; }
|
|
123
|
+
command -v python3 >/dev/null || { echo "missing: python3" >&2; exit 2; }
|
|
124
|
+
command -v doppler >/dev/null || { echo "missing: doppler" >&2; exit 2; }
|
|
125
|
+
[[ -f "$SERVER_TS" ]] || { echo "missing $SERVER_TS (run from repo root / worktree)" >&2; exit 2; }
|
|
126
|
+
[[ -f "$ENV_EXAMPLE" ]] || { echo "missing $ENV_EXAMPLE" >&2; exit 2; }
|
|
127
|
+
[[ -f "$FLIP_SH" ]] || { echo "missing $FLIP_SH" >&2; exit 2; }
|
|
128
|
+
|
|
129
|
+
# --- validate the flag EXISTS (inverse of create's "already registered") ----
|
|
130
|
+
if ! grep -qE "\"${NAME}\"" "$SERVER_TS"; then
|
|
131
|
+
echo "'$NAME' is not in $SERVER_TS RUNTIME_FLAGS — nothing to delete (use flag-list to see active flags)" >&2
|
|
132
|
+
exit 1
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
TOKEN=$(doppler secrets get FLAGSMITH_MANAGEMENT_API_KEY -p soleur -c cli_ops --plain 2>/dev/null || true)
|
|
136
|
+
[[ -z "$TOKEN" ]] && { echo "FLAGSMITH_MANAGEMENT_API_KEY not in Doppler soleur/cli_ops" >&2; exit 2; }
|
|
137
|
+
|
|
138
|
+
# Token-shape guard: a newline in the key would inject a curl config directive on the stdin
|
|
139
|
+
# channel below. Never echoes the value.
|
|
140
|
+
_bearer_ok() { local LC_ALL=C; case "${1:-}" in ''|*[!A-Za-z0-9._~+/=-]*) return 1 ;; esac; }
|
|
141
|
+
_bearer_ok "$TOKEN" || { echo "FLAGSMITH_MANAGEMENT_API_KEY has an unexpected shape" >&2; exit 2; }
|
|
142
|
+
|
|
143
|
+
# The Flagsmith management key travels on curl's stdin config channel, never on argv.
|
|
144
|
+
fs_api() {
|
|
145
|
+
curl --disable --noproxy '*' -sS -H "Content-Type: application/json" "$@" --config - \
|
|
146
|
+
< <(printf 'header = "Authorization: Api-Key %s"\n' "$TOKEN")
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
# --- resolve Flagsmith feature_id via EXACT-name filter (security P2-2) ------
|
|
150
|
+
# ?q= is substring (name__icontains) — a bare pick could DELETE the wrong
|
|
151
|
+
# feature, so filter to f['name'] == NAME exactly (create.sh's EXISTING= shape).
|
|
152
|
+
RESOLVED=$(fs_api "${FLAGSMITH_API}/projects/${FLAGSMITH_PROJECT_ID}/features/?q=${NAME}&page_size=100" \
|
|
153
|
+
| python3 -c "
|
|
154
|
+
import json, sys
|
|
155
|
+
d = json.load(sys.stdin)
|
|
156
|
+
for f in d.get('results', []):
|
|
157
|
+
if f['name'] == '$NAME':
|
|
158
|
+
print(f\"{f['id']}\t{str(bool(f.get('default_enabled'))).lower()}\"); sys.exit(0)
|
|
159
|
+
" 2>/dev/null || true)
|
|
160
|
+
FEATURE_ID="${RESOLVED%%$'\t'*}"
|
|
161
|
+
DEFAULT_ENABLED="${RESOLVED##*$'\t'}"
|
|
162
|
+
[[ "$RESOLVED" != *$'\t'* ]] && { FEATURE_ID=""; DEFAULT_ENABLED=""; }
|
|
163
|
+
|
|
164
|
+
# --- propose ----------------------------------------------------------------
|
|
165
|
+
echo "→ Proposed deletion of flag '$NAME' (5 sites):"
|
|
166
|
+
if [[ -n "$FEATURE_ID" ]]; then
|
|
167
|
+
echo " 1. Flagsmith: DELETE feature '$NAME' (id=$FEATURE_ID; cascade removes all segment/identity overrides)"
|
|
168
|
+
else
|
|
169
|
+
echo " 1. Flagsmith: feature '$NAME' NOT FOUND — skipping (code-side cleanup continues; drift recovery)"
|
|
170
|
+
fi
|
|
171
|
+
echo " 2. $SERVER_TS: remove \"$NAME\": \"$ENV_VAR\" from RUNTIME_FLAGS"
|
|
172
|
+
echo " 3. $ENV_EXAMPLE: remove $ENV_VAR= line"
|
|
173
|
+
echo " 4. $FLIP_SH: remove [\"$NAME\"]=\"$ENV_VAR\" from FLAG_ENV_VARS map"
|
|
174
|
+
echo " 5. Doppler: delete $ENV_VAR in soleur/dev AND soleur/prd"
|
|
175
|
+
|
|
176
|
+
if [[ $DRY_RUN -eq 1 ]]; then
|
|
177
|
+
echo "(dry-run — exiting 0 before any mutation)"
|
|
178
|
+
exit 0
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
soleur_op_ack_or_die "Delete flag '${NAME}' from Flagsmith, the code and Doppler (dev + prd) now? Type yes: "
|
|
182
|
+
|
|
183
|
+
# --- audit append (WORM) BEFORE any mutation --------------------------------
|
|
184
|
+
# Records intent: action=archive (migration 071's sanctioned flag-removed
|
|
185
|
+
# action), target=global, before=current enablement, after=null. Abort (exit 4)
|
|
186
|
+
# on audit failure — destructive ops must be audited.
|
|
187
|
+
ACTOR=$(doppler secrets get OPERATOR_EMAIL -p soleur -c cli_ops --plain 2>/dev/null | tr '[:upper:]' '[:lower:]')
|
|
188
|
+
[[ -z "$ACTOR" ]] && { echo "FATAL: OPERATOR_EMAIL not in Doppler soleur/cli_ops" >&2; exit 4; }
|
|
189
|
+
AUDIT_URL=$(doppler secrets get SUPABASE_URL -p soleur -c dev --plain 2>/dev/null) || true
|
|
190
|
+
AUDIT_SRK=$(doppler secrets get SUPABASE_SERVICE_ROLE_KEY -p soleur -c dev --plain 2>/dev/null) || true
|
|
191
|
+
[[ -z "$AUDIT_URL" || -z "$AUDIT_SRK" ]] && { echo "FATAL: SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY not in Doppler soleur/dev" >&2; exit 4; }
|
|
192
|
+
BEFORE_BOOL=$([[ "$DEFAULT_ENABLED" == "true" || "$DEFAULT_ENABLED" == "false" ]] && echo "$DEFAULT_ENABLED" || echo null)
|
|
193
|
+
AUDIT_ID=$(audit_flag_flip_rpc "$AUDIT_URL" "$AUDIT_SRK" "$NAME" "dev" "global" "archive" "$BEFORE_BOOL" null "$ACTOR") || exit 4
|
|
194
|
+
echo " audit_id=$AUDIT_ID"
|
|
195
|
+
|
|
196
|
+
# --- 1. DELETE Flagsmith feature (first mutation) ---------------------------
|
|
197
|
+
if [[ -n "$FEATURE_ID" ]]; then
|
|
198
|
+
echo "→ Deleting Flagsmith feature '$NAME' (id=$FEATURE_ID)…"
|
|
199
|
+
CODE=$(fs_api -o /dev/null -w '%{http_code}' -X DELETE "${FLAGSMITH_API}/projects/${FLAGSMITH_PROJECT_ID}/features/${FEATURE_ID}/")
|
|
200
|
+
[[ "$CODE" == "204" ]] || { echo "Flagsmith DELETE returned HTTP $CODE (expected 204)" >&2; exit 3; }
|
|
201
|
+
echo " deleted (HTTP 204; cascade removed all overrides)"
|
|
202
|
+
else
|
|
203
|
+
echo "→ Flagsmith: feature absent, skipping (code-side cleanup continues)"
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
# --- 2. strip server.ts RUNTIME_FLAGS entry --------------------------------
|
|
207
|
+
echo "→ Editing $SERVER_TS…"
|
|
208
|
+
NAME="$NAME" python3 <<'PY' || exit 4
|
|
209
|
+
import os, re, sys
|
|
210
|
+
p = "apps/web-platform/lib/feature-flags/server.ts"
|
|
211
|
+
name = os.environ["NAME"]
|
|
212
|
+
with open(p) as f: src = f.read()
|
|
213
|
+
m = re.search(r'(const RUNTIME_FLAGS = \{)(.*?)(\}[ \t]*as const;)', src, re.DOTALL)
|
|
214
|
+
if not m:
|
|
215
|
+
print('RUNTIME_FLAGS block not found in', p, file=sys.stderr); sys.exit(1)
|
|
216
|
+
body = m.group(2)
|
|
217
|
+
# Remove the "<name>": "FLAG_<X>", line (with surrounding indentation/newline).
|
|
218
|
+
new_body, n = re.subn(r'\n[ \t]*"' + re.escape(name) + r'"\s*:\s*"[A-Z0-9_]+"\s*,?', '', body)
|
|
219
|
+
if n == 0:
|
|
220
|
+
print(f'no RUNTIME_FLAGS entry for "{name}" found', file=sys.stderr); sys.exit(1)
|
|
221
|
+
src = src[:m.start(2)] + new_body + src[m.end(2):]
|
|
222
|
+
with open(p, 'w') as f: f.write(src)
|
|
223
|
+
print(f' removed {n} RUNTIME_FLAGS entr{"y" if n==1 else "ies"} for "{name}"')
|
|
224
|
+
PY
|
|
225
|
+
|
|
226
|
+
# --- 3. remove .env.example FLAG_<X>= line ---------------------------------
|
|
227
|
+
echo "→ Editing $ENV_EXAMPLE…"
|
|
228
|
+
ENV_VAR="$ENV_VAR" python3 <<'PY' || exit 4
|
|
229
|
+
import os, sys
|
|
230
|
+
p = "apps/web-platform/.env.example"
|
|
231
|
+
ev = os.environ["ENV_VAR"]
|
|
232
|
+
with open(p) as f: lines = f.readlines()
|
|
233
|
+
out = [l for l in lines if not l.startswith(ev + "=")]
|
|
234
|
+
if len(out) == len(lines):
|
|
235
|
+
print(f' (no {ev}= line in {p} — already absent)')
|
|
236
|
+
else:
|
|
237
|
+
with open(p, 'w') as f: f.writelines(out)
|
|
238
|
+
print(f' removed {ev}= line')
|
|
239
|
+
PY
|
|
240
|
+
|
|
241
|
+
# --- 4. remove flip.sh FLAG_ENV_VARS map entry (the 5th site) ---------------
|
|
242
|
+
echo "→ Editing $FLIP_SH FLAG_ENV_VARS map…"
|
|
243
|
+
NAME="$NAME" python3 <<'PY' || exit 4
|
|
244
|
+
import os, re, sys
|
|
245
|
+
p = "plugins/soleur/skills/flag-set-role/scripts/flip.sh"
|
|
246
|
+
name = os.environ["NAME"]
|
|
247
|
+
with open(p) as f: lines = f.readlines()
|
|
248
|
+
pat = re.compile(r'^\s*\["' + re.escape(name) + r'"\]="[A-Z0-9_]+"\s*$')
|
|
249
|
+
out = [l for l in lines if not pat.match(l.rstrip('\n'))]
|
|
250
|
+
if len(out) == len(lines):
|
|
251
|
+
print(f' (no FLAG_ENV_VARS entry for "{name}" — already absent)')
|
|
252
|
+
else:
|
|
253
|
+
with open(p, 'w') as f: f.writelines(out)
|
|
254
|
+
print(f' removed FLAG_ENV_VARS["{name}"] entry')
|
|
255
|
+
PY
|
|
256
|
+
|
|
257
|
+
# --- 5. delete Doppler secrets (dev + prd) ----------------------------------
|
|
258
|
+
# `> /dev/null` is MANDATORY on each delete line: the Doppler delete command
|
|
259
|
+
# prints the full remaining config to stdout (2026-05-26 learning). Never
|
|
260
|
+
# echo/tee the delete output.
|
|
261
|
+
echo "→ Doppler dev: delete $ENV_VAR…"
|
|
262
|
+
doppler secrets delete "$ENV_VAR" -p soleur -c dev --yes > /dev/null || exit 5
|
|
263
|
+
echo "→ Doppler prd: delete $ENV_VAR…"
|
|
264
|
+
doppler secrets delete "$ENV_VAR" -p soleur -c prd --yes > /dev/null || exit 5
|
|
265
|
+
|
|
266
|
+
# Verify deletion. The missing-key message is "Could not find requested secret"
|
|
267
|
+
# (NOT "not found") with a non-zero exit — verified live 2026-06-15. `2>&1 | grep
|
|
268
|
+
# -q` is safe (-q discards output; no config dump risk on the read path).
|
|
269
|
+
for cfg in dev prd; do
|
|
270
|
+
if doppler secrets get "$ENV_VAR" -p soleur -c "$cfg" --plain >/dev/null 2>&1; then
|
|
271
|
+
echo " ⚠ $ENV_VAR still present in soleur/$cfg after delete — investigate" >&2
|
|
272
|
+
else
|
|
273
|
+
echo " ✓ $ENV_VAR gone from soleur/$cfg"
|
|
274
|
+
fi
|
|
275
|
+
done
|
|
276
|
+
|
|
277
|
+
# --- outcome signal (P1-1) --------------------------------------------------
|
|
278
|
+
# The pre-mutation WORM row recorded intent (action=archive). Reaching this line
|
|
279
|
+
# means all 5 sites succeeded — a clean exit 0 IS the full-delete signal, and the
|
|
280
|
+
# per-exit-code recovery doc (header + SKILL.md) distinguishes any partial outcome
|
|
281
|
+
# (non-zero exit). The WORM action enum (071) has no "complete" value, so a second
|
|
282
|
+
# row would duplicate the archive action without adding signal; the exit code is
|
|
283
|
+
# the authoritative full-vs-partial discriminator.
|
|
284
|
+
|
|
285
|
+
echo
|
|
286
|
+
echo "✓ Done. '$NAME' removed from all 5 sites. Review + commit:"
|
|
287
|
+
echo " git add $SERVER_TS $ENV_EXAMPLE $FLIP_SH && git commit -m 'feat(flags): delete $NAME runtime flag'"
|
|
288
|
+
exit 0
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flag-list
|
|
3
|
+
description: "This skill should be used to read and audit all runtime feature flags before a promotion or delete decision: Flagsmith state, server.ts code-wiring, live Doppler dev/prd values, and per-segment overrides, with drift detection."
|
|
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
|
+
# flag-list
|
|
15
|
+
|
|
16
|
+
Reads every runtime feature flag across all three sources of truth and shows
|
|
17
|
+
them side by side — the **Read** verb of the flag CRUD set. Use it to audit
|
|
18
|
+
active flags before a promotion (`flag-set-role`) or a delete (`flag-delete`).
|
|
19
|
+
|
|
20
|
+
## When to use
|
|
21
|
+
|
|
22
|
+
- Auditing active flags before promoting one dev→prd, or before deleting one.
|
|
23
|
+
- Detecting drift: a Flagsmith feature with no `RUNTIME_FLAGS` entry, or a
|
|
24
|
+
code-wired flag missing from Flagsmith.
|
|
25
|
+
- Seeing a flag's blast radius (which segments/roles/orgs it targets) before a
|
|
26
|
+
destructive change.
|
|
27
|
+
|
|
28
|
+
## When NOT to use
|
|
29
|
+
|
|
30
|
+
- Creating a flag → `soleur:flag-create`.
|
|
31
|
+
- Toggling a flag per role/org → `soleur:flag-set-role`.
|
|
32
|
+
- Removing a flag → the operator types `soleur:flag-delete` (user-invoked, ADR-236: the model cannot
|
|
33
|
+
run it, so hand over the exact command, rendered per `formatSkillInvocation`).
|
|
34
|
+
|
|
35
|
+
## When to use this skill vs other flag skills
|
|
36
|
+
|
|
37
|
+
The flag CRUD set: `soleur:flag-create` (Create), `soleur:flag-set-role`
|
|
38
|
+
(Update — per-role/per-org), **`soleur:flag-list` (Read — this)**,
|
|
39
|
+
`soleur:flag-delete` (Delete). Initial wiring is the `${CLAUDE_PLUGIN_ROOT}/skills/flag-bootstrap/SETUP.md`
|
|
40
|
+
runbook (operator documentation, not an invocable skill).
|
|
41
|
+
|
|
42
|
+
## Arguments
|
|
43
|
+
|
|
44
|
+
<arguments> #$ARGUMENTS </arguments>
|
|
45
|
+
|
|
46
|
+
Optional: `--json` (emit a JSON array instead of the formatted table).
|
|
47
|
+
|
|
48
|
+
## Prerequisites
|
|
49
|
+
|
|
50
|
+
- Doppler authed with access to `soleur` configs `dev`, `prd`, `cli_ops`.
|
|
51
|
+
- Worktree of the soleur repo (the script reads `server.ts`).
|
|
52
|
+
- `curl` + `python3` on PATH.
|
|
53
|
+
|
|
54
|
+
## Procedure
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
bash "${CLAUDE_PLUGIN_ROOT}/skills/flag-list/scripts/list.sh" [--json]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The script (full in [scripts/list.sh](./scripts/list.sh)):
|
|
61
|
+
|
|
62
|
+
1. **Fetch Flagsmith features** — `GET /api/v1/projects/39082/features/`
|
|
63
|
+
(paginated while `next` is present).
|
|
64
|
+
2. **Parse code-wiring** — extract `RUNTIME_FLAGS` (and `ENV_FLAGS`) keys from
|
|
65
|
+
`apps/web-platform/lib/feature-flags/server.ts`.
|
|
66
|
+
3. **Read live Doppler values** — a single targeted `FLAG_<X>` read per flag in
|
|
67
|
+
both `soleur/dev` and `soleur/prd` (never `doppler secrets download` /
|
|
68
|
+
`doppler secrets`, which dump the whole config). Always on — the dev→prd
|
|
69
|
+
value comparison is the audit's headline data, not an optional extra.
|
|
70
|
+
4. **Enumerate segment overrides** — per flag, per env, resolve which segments
|
|
71
|
+
(`role-dev`, `<flag>-orgs`, …) carry an ON/OFF override (mirrors
|
|
72
|
+
`flag-set-role`'s feature-state read shape).
|
|
73
|
+
5. **Flag drift** — Flagsmith-only features and code-only flags are surfaced
|
|
74
|
+
distinctly.
|
|
75
|
+
6. **Render** — formatted table, or `--json` array with fields `name`,
|
|
76
|
+
`env_var`, `flagsmith_id`, `default_enabled`, `code_wired`, `doppler_dev`,
|
|
77
|
+
`doppler_prd`, `segments`.
|
|
78
|
+
|
|
79
|
+
`ENV_FLAGS` (build-time DCE flags like `dev-signin`) are listed under a
|
|
80
|
+
separate heading — they are not runtime/Flagsmith flags.
|
|
81
|
+
|
|
82
|
+
## Exit codes
|
|
83
|
+
|
|
84
|
+
- `0` — success.
|
|
85
|
+
- `2` — prerequisite missing (token / binaries / `server.ts`).
|
|
86
|
+
- `3` — Flagsmith API error.
|
|
87
|
+
|
|
88
|
+
## Sharp edges
|
|
89
|
+
|
|
90
|
+
- **Read-only.** No mutations, no WORM audit append, no `--dry-run` needed.
|
|
91
|
+
- The management API key is read via `doppler secrets get … -c cli_ops --plain`
|
|
92
|
+
and passed only on curl's stdin config — never echoed.
|
|
93
|
+
- A `doppler_dev`/`doppler_prd` of `unset` means the `FLAG_<X>` key is absent
|
|
94
|
+
from that Doppler config (legitimate for flags wired but not yet mirrored).
|
|
95
|
+
|
|
96
|
+
## Cross-references
|
|
97
|
+
|
|
98
|
+
- ADR: `knowledge-base/engineering/architecture/decisions/ADR-038-feature-flags-flagsmith.md`
|
|
99
|
+
- Sibling skills: `soleur:flag-create`, `soleur:flag-set-role`, `soleur:flag-delete`
|