@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,447 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Test harness for plugins/soleur/skills/code-to-prd/scripts/code-to-prd.sh (#2726).
|
|
3
|
+
#
|
|
4
|
+
# Pattern mirrors plugins/soleur/skills/incident/test/redact-sentinel.test.sh:
|
|
5
|
+
# - set -uo pipefail (NOT -e — single test failure must not abort the suite)
|
|
6
|
+
# - PASS/FAIL counter
|
|
7
|
+
# - trap-based cleanup
|
|
8
|
+
#
|
|
9
|
+
# Test assertions (plan Phase 6):
|
|
10
|
+
# 1. All 3 fixture routes captured in the PRD.
|
|
11
|
+
# 2. HTTP method (`GET`) captured for `api/health/route.ts` (FR3).
|
|
12
|
+
# 3. Zero fixture-secret tokens appear in PRD output.
|
|
13
|
+
# 4. No env-var VALUE appears in PRD (FR5 — only names).
|
|
14
|
+
# 5. `## Coverage Caveats` block non-empty with all four subsections.
|
|
15
|
+
# 6. Both banners present (verbatim string match).
|
|
16
|
+
# 7. `### How to Read This PRD` subsection present in banner block.
|
|
17
|
+
# 8. `## Gap Analysis` section present (populated or SKIPPED).
|
|
18
|
+
# 9. MIT attribution footer present.
|
|
19
|
+
# 10. Layer 2 sentinel halts the write when a fresh secret is injected post-render (RED).
|
|
20
|
+
# 11. Layer 3 deletes the file if Layer 2 is bypassed via env var (RED).
|
|
21
|
+
#
|
|
22
|
+
# Plus plan AC tests:
|
|
23
|
+
# - AC3: sentinel regex matches the fixture token.
|
|
24
|
+
# - AC6: gitleaks-absent preflight abort.
|
|
25
|
+
# - AC8: missing-package.json preflight abort.
|
|
26
|
+
# - AC9: symlink rejection.
|
|
27
|
+
|
|
28
|
+
set -uo pipefail
|
|
29
|
+
|
|
30
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
31
|
+
SKILL_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
32
|
+
PLUGIN_DIR="$(cd "${SKILL_DIR}/../.." && pwd)"
|
|
33
|
+
REPO_ROOT="$(cd "${PLUGIN_DIR}/../.." && pwd)"
|
|
34
|
+
|
|
35
|
+
CODE_TO_PRD="${SKILL_DIR}/scripts/code-to-prd.sh"
|
|
36
|
+
REDACT_SENTINEL="${PLUGIN_DIR}/skills/incident/scripts/redact-sentinel.sh"
|
|
37
|
+
FIXTURE="${SCRIPT_DIR}/fixture"
|
|
38
|
+
|
|
39
|
+
PASS=0
|
|
40
|
+
FAIL=0
|
|
41
|
+
TMP_DIR="$(mktemp -d -t code-to-prd-test.XXXXXX)"
|
|
42
|
+
trap 'rm -rf "${TMP_DIR}"' EXIT
|
|
43
|
+
|
|
44
|
+
assert_exit() {
|
|
45
|
+
local label="$1" expected="$2" actual="$3"
|
|
46
|
+
if [[ "${expected}" == "${actual}" ]]; then
|
|
47
|
+
echo "PASS: ${label} (exit=${actual})"
|
|
48
|
+
PASS=$((PASS + 1))
|
|
49
|
+
else
|
|
50
|
+
echo "FAIL: ${label} (expected exit=${expected}, got ${actual})"
|
|
51
|
+
FAIL=$((FAIL + 1))
|
|
52
|
+
fi
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
assert_grep() {
|
|
56
|
+
local label="$1" pattern="$2" file="$3"
|
|
57
|
+
if grep -qE -- "${pattern}" "${file}"; then
|
|
58
|
+
echo "PASS: ${label}"
|
|
59
|
+
PASS=$((PASS + 1))
|
|
60
|
+
else
|
|
61
|
+
echo "FAIL: ${label} (pattern '${pattern}' not found in ${file##*/})"
|
|
62
|
+
FAIL=$((FAIL + 1))
|
|
63
|
+
fi
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
assert_grep_fixed() {
|
|
67
|
+
local label="$1" needle="$2" file="$3"
|
|
68
|
+
if grep -qF -- "${needle}" "${file}"; then
|
|
69
|
+
echo "PASS: ${label}"
|
|
70
|
+
PASS=$((PASS + 1))
|
|
71
|
+
else
|
|
72
|
+
echo "FAIL: ${label} (literal '${needle}' not found in ${file##*/})"
|
|
73
|
+
FAIL=$((FAIL + 1))
|
|
74
|
+
fi
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
assert_no_grep() {
|
|
78
|
+
local label="$1" needle="$2" file="$3"
|
|
79
|
+
if grep -qF -- "${needle}" "${file}"; then
|
|
80
|
+
echo "FAIL: ${label} (literal '${needle}' UNEXPECTEDLY present in ${file##*/})"
|
|
81
|
+
FAIL=$((FAIL + 1))
|
|
82
|
+
else
|
|
83
|
+
echo "PASS: ${label}"
|
|
84
|
+
PASS=$((PASS + 1))
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
assert_file_absent() {
|
|
89
|
+
local label="$1" path="$2"
|
|
90
|
+
if [[ ! -e "${path}" ]]; then
|
|
91
|
+
echo "PASS: ${label}"
|
|
92
|
+
PASS=$((PASS + 1))
|
|
93
|
+
else
|
|
94
|
+
echo "FAIL: ${label} (path ${path} still exists)"
|
|
95
|
+
FAIL=$((FAIL + 1))
|
|
96
|
+
fi
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# ---------------------------------------------------------------------------
|
|
100
|
+
# Tool availability (#8266). The baseline and every arm that reaches the real
|
|
101
|
+
# Layer-3 scan need a RUNNABLE gitleaks. A resolvable-but-unrunnable binary (an
|
|
102
|
+
# unpinned mise shim) used to fail the baseline and report it as a code-to-prd
|
|
103
|
+
# failure; those arms now SKIP locally, naming the cause, and the suite FAILS
|
|
104
|
+
# under CI=true, where the runner must provide gitleaks (ADR-188). The probe
|
|
105
|
+
# mirrors the script's: timeout -> gtimeout -> bare.
|
|
106
|
+
# ---------------------------------------------------------------------------
|
|
107
|
+
# shellcheck source=../../../../test/lib/gitleaks-probe.sh
|
|
108
|
+
source "$(cd -P "$(dirname "${BASH_SOURCE[0]}")/../../../test/lib" && pwd -P)/gitleaks-probe.sh"
|
|
109
|
+
gl_probe
|
|
110
|
+
|
|
111
|
+
# A PATH that contains every executable on the current PATH EXCEPT gitleaks,
|
|
112
|
+
# timeout and gtimeout, plus a gitleaks STUB of the given mode. Dropping PATH
|
|
113
|
+
# entries cannot remove a tool that lives in /usr/bin beside everything else,
|
|
114
|
+
# so this links tools individually. $1 = unrunnable | scan-error | findings | clean
|
|
115
|
+
mk_stub_path() {
|
|
116
|
+
local mode="$1" d dir f name
|
|
117
|
+
d="$(mktemp -d "${TMP_DIR}/stubpath.XXXXXX")"
|
|
118
|
+
local IFS=:
|
|
119
|
+
for dir in ${PATH}; do
|
|
120
|
+
[[ -d "${dir}" ]] || continue
|
|
121
|
+
for f in "${dir}"/*; do
|
|
122
|
+
name="${f##*/}"
|
|
123
|
+
case "${name}" in gitleaks|timeout|gtimeout) continue ;; esac
|
|
124
|
+
[[ -x "${f}" && ! -d "${f}" && ! -e "${d}/${name}" ]] && ln -s "${f}" "${d}/${name}"
|
|
125
|
+
done
|
|
126
|
+
done
|
|
127
|
+
# Stub bodies are quoted heredocs: they are DATA written into the stub, and the
|
|
128
|
+
# redirect inside the findings stub is the stub's own, not a fixture write.
|
|
129
|
+
case "${mode}" in
|
|
130
|
+
unrunnable)
|
|
131
|
+
cat > "${d}/gitleaks" <<'STUB'
|
|
132
|
+
#!/bin/sh
|
|
133
|
+
echo "mise ERROR No version is set for shim: gitleaks" >&2
|
|
134
|
+
exit 1
|
|
135
|
+
STUB
|
|
136
|
+
;;
|
|
137
|
+
scan-error)
|
|
138
|
+
cat > "${d}/gitleaks" <<'STUB'
|
|
139
|
+
#!/bin/sh
|
|
140
|
+
[ "$1" = version ] && { echo 8.24.2; exit 0; }
|
|
141
|
+
echo "gitleaks: fatal: could not read source" >&2
|
|
142
|
+
exit 1
|
|
143
|
+
STUB
|
|
144
|
+
;;
|
|
145
|
+
findings)
|
|
146
|
+
cat > "${d}/gitleaks" <<'STUB'
|
|
147
|
+
#!/bin/sh
|
|
148
|
+
[ "$1" = version ] && { echo 8.24.2; exit 0; }
|
|
149
|
+
rp=""; while [ $# -gt 0 ]; do [ "$1" = --report-path ] && rp="$2"; shift; done
|
|
150
|
+
printf '%s' '[{"RuleID":"stripe-access-token","File":"prd.md","StartLine":3}]' > "$rp"
|
|
151
|
+
exit 1
|
|
152
|
+
STUB
|
|
153
|
+
;;
|
|
154
|
+
clean)
|
|
155
|
+
cat > "${d}/gitleaks" <<'STUB'
|
|
156
|
+
#!/bin/sh
|
|
157
|
+
[ "$1" = version ] && { echo 8.24.2; exit 0; }
|
|
158
|
+
exit 0
|
|
159
|
+
STUB
|
|
160
|
+
;;
|
|
161
|
+
esac
|
|
162
|
+
chmod +x "${d}/gitleaks"
|
|
163
|
+
printf '%s\n' "${d}"
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
# ---------------------------------------------------------------------------
|
|
167
|
+
# Generate a clean PRD from the fixture (positive baseline for tests 1-9)
|
|
168
|
+
# ---------------------------------------------------------------------------
|
|
169
|
+
if _needs_gl "baseline + T1-T9"; then
|
|
170
|
+
BASELINE_PRD="${TMP_DIR}/baseline-prd.md"
|
|
171
|
+
log="${TMP_DIR}/baseline.log"
|
|
172
|
+
bash "${CODE_TO_PRD}" "${FIXTURE}" "${BASELINE_PRD}" >"${log}" 2>&1
|
|
173
|
+
baseline_rc=$?
|
|
174
|
+
assert_exit "Baseline: code-to-prd against fixture exits 0" 0 "${baseline_rc}"
|
|
175
|
+
|
|
176
|
+
if [[ ! -f "${BASELINE_PRD}" ]]; then
|
|
177
|
+
echo "FATAL: baseline PRD was not written; remaining tests skipped."
|
|
178
|
+
echo " See ${log}"
|
|
179
|
+
cat "${log}" >&2
|
|
180
|
+
echo "---"
|
|
181
|
+
echo "PASS=${PASS} FAIL=${FAIL}"
|
|
182
|
+
exit 1
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
# Test 1 — all 3 fixture routes captured
|
|
186
|
+
assert_grep_fixed "T1.a: route '/' present" '`/`' "${BASELINE_PRD}"
|
|
187
|
+
assert_grep_fixed "T1.b: route '/about' present" '`/about`' "${BASELINE_PRD}"
|
|
188
|
+
assert_grep_fixed "T1.c: route '/api/health' present" '`/api/health`' "${BASELINE_PRD}"
|
|
189
|
+
|
|
190
|
+
# Test 2 — GET method captured for api/health/route.ts (FR3)
|
|
191
|
+
assert_grep "T2: GET method captured for api/health" '\| `/api/health` \| `app/api/health/route\.ts` \| GET \|' "${BASELINE_PRD}"
|
|
192
|
+
|
|
193
|
+
# Test 3 — sentinel-clean: zero redaction-class matches in the PRD
|
|
194
|
+
sentinel_out="${TMP_DIR}/sentinel.out"
|
|
195
|
+
bash "${REDACT_SENTINEL}" "${BASELINE_PRD}" >"${sentinel_out}" 2>&1
|
|
196
|
+
assert_exit "T3: redact-sentinel exits 0 on baseline PRD (AC2)" 0 $?
|
|
197
|
+
|
|
198
|
+
# Test 4 — no env-var VALUE appears (we don't have .env.example yet — once
|
|
199
|
+
# Phase 9b lands, this becomes load-bearing; for now we assert the marker
|
|
200
|
+
# 'FIXTUREDONOTUSE' is absent, which is true under any flow).
|
|
201
|
+
assert_no_grep "T4: env-var VALUE 'FIXTUREDONOTUSE' absent (FR5)" "FIXTUREDONOTUSE" "${BASELINE_PRD}"
|
|
202
|
+
|
|
203
|
+
# Test 5 — Coverage Caveats: non-empty + 4 subsections
|
|
204
|
+
assert_grep_fixed "T5.a: '## Coverage Caveats' header present" '## Coverage Caveats' "${BASELINE_PRD}"
|
|
205
|
+
assert_grep_fixed "T5.b: 'Frameworks not scanned' subsection" '### Frameworks not scanned' "${BASELINE_PRD}"
|
|
206
|
+
assert_grep_fixed "T5.c: 'Extraction techniques used' subsection" '### Extraction techniques used' "${BASELINE_PRD}"
|
|
207
|
+
assert_grep_fixed "T5.d: 'Excluded by path filter' subsection" '### Excluded by path filter' "${BASELINE_PRD}"
|
|
208
|
+
assert_grep_fixed "T5.e: 'GDPR Art. 9 special-category disclaimer' subsection" '### GDPR Art. 9 special-category disclaimer' "${BASELINE_PRD}"
|
|
209
|
+
|
|
210
|
+
# Test 6 — both banners present (verbatim signature markers)
|
|
211
|
+
assert_grep_fixed "T6.a: due-diligence banner sentinel present" 'BANNER:DUE-DILIGENCE' "${BASELINE_PRD}"
|
|
212
|
+
assert_grep_fixed "T6.b: PII/confidentiality banner sentinel present" 'BANNER:PII-CONFIDENTIALITY' "${BASELINE_PRD}"
|
|
213
|
+
|
|
214
|
+
# Test 7 — How to Read This PRD subsection (FR7.1)
|
|
215
|
+
assert_grep_fixed "T7: '### How to Read This PRD' subsection present (FR7.1)" '### How to Read This PRD' "${BASELINE_PRD}"
|
|
216
|
+
|
|
217
|
+
# Test 8 — Gap Analysis section present (populated or SKIPPED)
|
|
218
|
+
assert_grep_fixed "T8.a: '## Gap Analysis' header present" '## Gap Analysis' "${BASELINE_PRD}"
|
|
219
|
+
assert_grep "T8.b: SKIPPED-or-populated body present" 'SKIPPED \(spec-flow-analyzer unavailable at|^# Gap Analysis' "${BASELINE_PRD}"
|
|
220
|
+
|
|
221
|
+
# Test 9 — MIT attribution footer
|
|
222
|
+
assert_grep_fixed "T9: MIT attribution footer present" 'alirezarezvani/claude-skills' "${BASELINE_PRD}"
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
# ---------------------------------------------------------------------------
|
|
226
|
+
# Synthetic Stripe-shape tokens — assembled at runtime to dodge gitleaks
|
|
227
|
+
# default-pack AND GitHub push-protection (learning 10df08e3: literal
|
|
228
|
+
# `sk_live_*` / `sk_test_*` tokens in committed prose are rejected at push
|
|
229
|
+
# time, separate from pre-commit gitleaks). All halves are inert alone.
|
|
230
|
+
# ---------------------------------------------------------------------------
|
|
231
|
+
SK_PFX="sk_l"
|
|
232
|
+
SK_TAIL="ive_REDTESTLAYER2FIXTUREALNUMSTRIPE0001" # 36 alnum, no underscores
|
|
233
|
+
SYNTHETIC_LIVE="${SK_PFX}${SK_TAIL}"
|
|
234
|
+
|
|
235
|
+
# ---------------------------------------------------------------------------
|
|
236
|
+
# Test 10 — Layer 2 sentinel halts the write when a fresh secret would land.
|
|
237
|
+
# Synthesize a tampered fixture whose app/page.tsx carries the secret in a
|
|
238
|
+
# useState initial value — the State Shapes extractor lifts that line
|
|
239
|
+
# verbatim into the rendered PRD, giving Layer 2 something to react to.
|
|
240
|
+
# ---------------------------------------------------------------------------
|
|
241
|
+
TAMPERED="${TMP_DIR}/tampered-fixture"
|
|
242
|
+
cp -a "${FIXTURE}" "${TAMPERED}"
|
|
243
|
+
cat >"${TAMPERED}/app/page.tsx" <<EOF
|
|
244
|
+
/** Tampered landing page (Layer-2/3 RED test). */
|
|
245
|
+
import { useState } from "react";
|
|
246
|
+
export default function HomePage() {
|
|
247
|
+
const [k, setK] = useState("${SYNTHETIC_LIVE}");
|
|
248
|
+
return <pre>{k}</pre>;
|
|
249
|
+
}
|
|
250
|
+
EOF
|
|
251
|
+
# Initialize a tiny git repo so the walker sees the tampered file.
|
|
252
|
+
#
|
|
253
|
+
# Every mutation names its repository with `-C`. This file runs `set -uo
|
|
254
|
+
# pipefail` WITHOUT `-e`, so a bare `cd` into a fixture that `cp -a` failed to
|
|
255
|
+
# create would not abort — and `git add -A` plus a commit would then run in the
|
|
256
|
+
# inherited cwd, staging and committing the entire real repository. That is the
|
|
257
|
+
# 2026-08-20 incident shape; see plugins/soleur/test/fixture-cd-containment.test.sh.
|
|
258
|
+
git init -q "${TAMPERED}"
|
|
259
|
+
git -C "${TAMPERED}" add -A
|
|
260
|
+
git -C "${TAMPERED}" -c user.email=t@t -c user.name=t commit -q -m fixture --no-verify >/dev/null 2>&1 || true
|
|
261
|
+
if _needs_gl "T10/T11 (Layer 2 halt, Layer 3 catch)"; then
|
|
262
|
+
T10_OUT="${TMP_DIR}/t10-prd.md"
|
|
263
|
+
t10_log="${TMP_DIR}/t10.log"
|
|
264
|
+
bash "${CODE_TO_PRD}" "${TAMPERED}" "${T10_OUT}" >"${t10_log}" 2>&1
|
|
265
|
+
t10_rc=$?
|
|
266
|
+
assert_exit "T10: Layer 2 halts write when secret present (AC4)" 1 "${t10_rc}"
|
|
267
|
+
assert_file_absent "T10: no PRD on disk after Layer 2 abort" "${T10_OUT}"
|
|
268
|
+
|
|
269
|
+
# ---------------------------------------------------------------------------
|
|
270
|
+
# Test 11 — Layer 3 catches what Layer 2 missed (RED test via env bypass).
|
|
271
|
+
# ---------------------------------------------------------------------------
|
|
272
|
+
T11_OUT="${TMP_DIR}/t11-prd.md"
|
|
273
|
+
t11_log="${TMP_DIR}/t11.log"
|
|
274
|
+
CODE_TO_PRD_SKIP_LAYER_2=1 bash "${CODE_TO_PRD}" "${TAMPERED}" "${T11_OUT}" >"${t11_log}" 2>&1
|
|
275
|
+
t11_rc=$?
|
|
276
|
+
assert_exit "T11: Layer 3 catches Layer-2-bypass and exits 1 (AC5)" 1 "${t11_rc}"
|
|
277
|
+
assert_file_absent "T11: Layer 3 deletes the leaked PRD" "${T11_OUT}"
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
# ---------------------------------------------------------------------------
|
|
281
|
+
# AC3 — sentinel regex matches the planned fixture token (loud guard against
|
|
282
|
+
# Kieran P0-1 underscore-in-regex correctness bug).
|
|
283
|
+
# ---------------------------------------------------------------------------
|
|
284
|
+
ac3_tmp="${TMP_DIR}/ac3.txt"
|
|
285
|
+
AC3_PFX="sk_t"
|
|
286
|
+
AC3_TAIL="est_FIXTUREDONOTUSESYNTHETICTOKEN123"
|
|
287
|
+
printf 'STRIPE_SECRET_KEY=%s%s\n' "${AC3_PFX}" "${AC3_TAIL}" >"${ac3_tmp}"
|
|
288
|
+
bash "${REDACT_SENTINEL}" "${ac3_tmp}" >/dev/null 2>&1
|
|
289
|
+
assert_exit "AC3: sentinel matches fixture token shape (no underscore in tail)" 1 $?
|
|
290
|
+
|
|
291
|
+
# ---------------------------------------------------------------------------
|
|
292
|
+
# AC6 — gitleaks-absent preflight abort.
|
|
293
|
+
# ---------------------------------------------------------------------------
|
|
294
|
+
ac6_log="${TMP_DIR}/ac6.log"
|
|
295
|
+
SCRUBBED_PATH="$(echo "${PATH}" | tr ':' '\n' | while read -r p; do
|
|
296
|
+
[[ -z "${p}" ]] && continue
|
|
297
|
+
if [[ -x "${p}/gitleaks" ]]; then continue; fi
|
|
298
|
+
printf '%s:' "${p}"
|
|
299
|
+
done)"
|
|
300
|
+
PATH="${SCRUBBED_PATH%:}" bash "${CODE_TO_PRD}" "${FIXTURE}" "${TMP_DIR}/ac6-prd.md" >"${ac6_log}" 2>&1
|
|
301
|
+
ac6_rc=$?
|
|
302
|
+
assert_exit "AC6: gitleaks-absent preflight aborts with exit 2" 2 "${ac6_rc}"
|
|
303
|
+
assert_grep_fixed "AC6: error message mentions gitleaks" "gitleaks not found" "${ac6_log}"
|
|
304
|
+
|
|
305
|
+
# ---------------------------------------------------------------------------
|
|
306
|
+
# AC8 — missing-package.json preflight abort.
|
|
307
|
+
# ---------------------------------------------------------------------------
|
|
308
|
+
# The gitleaks preflight runs BEFORE the package.json check, so this arm needs
|
|
309
|
+
# a runnable gitleaks to reach the check it names.
|
|
310
|
+
if _needs_gl "AC8 missing package.json"; then
|
|
311
|
+
ac8_target="${TMP_DIR}/empty-dir"
|
|
312
|
+
mkdir -p "${ac8_target}"
|
|
313
|
+
ac8_log="${TMP_DIR}/ac8.log"
|
|
314
|
+
bash "${CODE_TO_PRD}" "${ac8_target}" "${TMP_DIR}/ac8-prd.md" >"${ac8_log}" 2>&1
|
|
315
|
+
ac8_rc=$?
|
|
316
|
+
assert_exit "AC8: missing-package.json preflight aborts with exit 2" 2 "${ac8_rc}"
|
|
317
|
+
assert_grep_fixed "AC8: error message includes the literal target path" "${ac8_target}" "${ac8_log}"
|
|
318
|
+
fi
|
|
319
|
+
|
|
320
|
+
# ---------------------------------------------------------------------------
|
|
321
|
+
# AC9 — symlink rejection (FR2.1).
|
|
322
|
+
# Plant a symlink inside a copy of the fixture pointing at a sibling sensitive
|
|
323
|
+
# file; confirm the linked content does NOT enter the PRD.
|
|
324
|
+
# ---------------------------------------------------------------------------
|
|
325
|
+
if _needs_gl "AC9 symlink rejection"; then
|
|
326
|
+
ac9_target="${TMP_DIR}/sym-fixture"
|
|
327
|
+
cp -a "${FIXTURE}" "${ac9_target}"
|
|
328
|
+
ac9_sensitive="${TMP_DIR}/sensitive.txt"
|
|
329
|
+
printf 'CANARY_VALUE_SHOULD_NOT_APPEAR_IN_PRD\n' >"${ac9_sensitive}"
|
|
330
|
+
ln -s "${ac9_sensitive}" "${ac9_target}/leaked-link.txt"
|
|
331
|
+
# `-C` for the same reason as the tampered fixture above: an unguarded `cd`
|
|
332
|
+
# into a directory `cp -a` may not have created would redirect `git add -A` at
|
|
333
|
+
# the real repository.
|
|
334
|
+
git init -q "${ac9_target}"
|
|
335
|
+
git -C "${ac9_target}" add -A
|
|
336
|
+
git -C "${ac9_target}" -c user.email=t@t -c user.name=t commit -q -m sym --no-verify >/dev/null 2>&1 || true
|
|
337
|
+
ac9_out="${TMP_DIR}/ac9-prd.md"
|
|
338
|
+
bash "${CODE_TO_PRD}" "${ac9_target}" "${ac9_out}" >"${TMP_DIR}/ac9.log" 2>&1
|
|
339
|
+
assert_no_grep "AC9: symlink target content NOT in PRD" "CANARY_VALUE_SHOULD_NOT_APPEAR_IN_PRD" "${ac9_out}"
|
|
340
|
+
fi
|
|
341
|
+
|
|
342
|
+
# ---------------------------------------------------------------------------
|
|
343
|
+
# AC5 (#8266) — a tool that cannot run is never reported as a verdict about the
|
|
344
|
+
# PRD. Stub gitleaks on a PATH without timeout/gtimeout; no real gitleaks needed.
|
|
345
|
+
# ---------------------------------------------------------------------------
|
|
346
|
+
PREV_BODY="previous PRD — must survive a failed or positive scan"
|
|
347
|
+
stub_case() { # $1 = label, $2 = stub mode; sets SC_RC, SC_LOG, SC_OUT
|
|
348
|
+
local out_dir; out_dir="$(mktemp -d "${TMP_DIR}/stubcase.XXXXXX")"
|
|
349
|
+
SC_OUT="${out_dir}/prd.md"
|
|
350
|
+
SC_LOG="${out_dir}/run.log"
|
|
351
|
+
printf '%s\n' "${PREV_BODY}" > "${SC_OUT}"
|
|
352
|
+
local sp; sp="$(mk_stub_path "$2")"
|
|
353
|
+
PATH="${sp}" bash "${CODE_TO_PRD}" "${FIXTURE}" "${SC_OUT}" >"${SC_LOG}" 2>&1
|
|
354
|
+
SC_RC=$?
|
|
355
|
+
}
|
|
356
|
+
prev_preserved() { # $1 = label
|
|
357
|
+
if [[ -f "${SC_OUT}" && "$(cat "${SC_OUT}")" == "${PREV_BODY}" ]]; then
|
|
358
|
+
echo "PASS: $1"; PASS=$((PASS + 1))
|
|
359
|
+
else
|
|
360
|
+
echo "FAIL: $1 (previous PRD at the output path was modified or removed)"; FAIL=$((FAIL + 1))
|
|
361
|
+
fi
|
|
362
|
+
}
|
|
363
|
+
no_dangling_report_path() { # $1 = label
|
|
364
|
+
# Asserts the LIVE contract, not a retired one. This used to extract a path from
|
|
365
|
+
# a ` Report at: ` line and pass when it was absent OR existed — but this PR
|
|
366
|
+
# deleted that line from the script, so the extraction was permanently empty and
|
|
367
|
+
# the `-z` branch made the row unconditionally green. It had never once evaluated
|
|
368
|
+
# its predicate. Now: require the script to SAY the report is not kept (a positive
|
|
369
|
+
# anchor that a future re-add of an operator-facing path would break), and require
|
|
370
|
+
# no path-shaped `Report at:` line to come back.
|
|
371
|
+
local rp; rp="$(sed -n 's/^[[:space:]]*Report at: //p' "${SC_LOG}")"
|
|
372
|
+
if [[ -n "${rp}" ]]; then
|
|
373
|
+
echo "FAIL: $1 (a 'Report at:' path reappeared: ${rp}; GITLEAKS_OUT is removed by the EXIT trap, so any printed path dangles)"; FAIL=$((FAIL + 1))
|
|
374
|
+
elif ! grep -qF 'not kept on disk' "${SC_LOG}"; then
|
|
375
|
+
echo "FAIL: $1 (the scan log no longer states the report is not kept on disk — the anchor this row pins is gone)"; FAIL=$((FAIL + 1))
|
|
376
|
+
else
|
|
377
|
+
echo "PASS: $1"; PASS=$((PASS + 1))
|
|
378
|
+
fi
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
stub_case "AC5a" unrunnable
|
|
382
|
+
assert_exit "AC5a: unrunnable gitleaks aborts at preflight with exit 2" 2 "${SC_RC}"
|
|
383
|
+
assert_grep_fixed "AC5a: message says the tool cannot run" "not runnable" "${SC_LOG}"
|
|
384
|
+
assert_grep_fixed "AC5a: message names the CI pin" "8.24.2" "${SC_LOG}"
|
|
385
|
+
assert_no_grep "AC5a: never claims the PRD contained secrets" "found secrets" "${SC_LOG}"
|
|
386
|
+
prev_preserved "AC5a: previous PRD untouched"
|
|
387
|
+
|
|
388
|
+
stub_case "AC5b" scan-error
|
|
389
|
+
assert_exit "AC5b: scan that errors without a report exits 2" 2 "${SC_RC}"
|
|
390
|
+
assert_grep_fixed "AC5b: message says the scan did not complete" "did not complete" "${SC_LOG}"
|
|
391
|
+
assert_no_grep "AC5b: never claims the PRD contained secrets" "found secrets" "${SC_LOG}"
|
|
392
|
+
prev_preserved "AC5b: previous PRD untouched (new PRD withheld, not written)"
|
|
393
|
+
|
|
394
|
+
stub_case "AC5c" findings
|
|
395
|
+
assert_exit "AC5c: a real finding exits 1" 1 "${SC_RC}"
|
|
396
|
+
assert_grep_fixed "AC5c: finding count reported" "1 finding" "${SC_LOG}"
|
|
397
|
+
prev_preserved "AC5c: previous PRD untouched (new PRD withheld, not written)"
|
|
398
|
+
no_dangling_report_path "AC5c: no printed report path that does not exist"
|
|
399
|
+
|
|
400
|
+
stub_case "AC5d" clean
|
|
401
|
+
assert_exit "AC5d: a working gitleaks on a host without timeout still scans and writes" 0 "${SC_RC}"
|
|
402
|
+
assert_grep_fixed "AC5d: new PRD written" "## Coverage Caveats" "${SC_OUT}"
|
|
403
|
+
|
|
404
|
+
# ---------------------------------------------------------------------------
|
|
405
|
+
# Summary
|
|
406
|
+
# ---------------------------------------------------------------------------
|
|
407
|
+
# CI fail-on-skip contract, asserted against the epilogue's REAL BYTES. That
|
|
408
|
+
# contract is the only thing stopping the skipped arms from reading as green on a
|
|
409
|
+
# runner without gitleaks, and nothing asserted it — a refactor of the tail would
|
|
410
|
+
# drop it silently and the shard would stay green. Extracted between the markers
|
|
411
|
+
# and driven through a three-row truth table, so a mutation to the SHIPPED code
|
|
412
|
+
# (not a copy) reds.
|
|
413
|
+
_t_ci_contract() {
|
|
414
|
+
local body rc
|
|
415
|
+
body=$(awk '/^# >>> ci-contract-epilogue$/{f=1;next} /^# <<< ci-contract-epilogue$/{f=0} f' "${BASH_SOURCE[0]}")
|
|
416
|
+
if [[ -z "${body//[[:space:]]/}" ]]; then
|
|
417
|
+
echo "FAIL: CI fail-on-skip contract — epilogue markers matched nothing — the extraction is broken, not the contract"; FAIL=$((FAIL + 1))
|
|
418
|
+
return
|
|
419
|
+
fi
|
|
420
|
+
rc=0; ( set +e; eval 'SKIPPED_ARMS=(x); CI=true; PASS=1; FAIL=0'"
|
|
421
|
+
$body" ) >/dev/null 2>&1 || rc=$?
|
|
422
|
+
if [[ "$rc" != 1 ]]; then echo "FAIL: CI fail-on-skip contract — CI=true with skips did not exit 1"; FAIL=$((FAIL + 1)); return; fi
|
|
423
|
+
rc=0; ( set +e; eval 'SKIPPED_ARMS=(x); unset CI; PASS=1; FAIL=0'"
|
|
424
|
+
$body" ) >/dev/null 2>&1 || rc=$?
|
|
425
|
+
if [[ "$rc" == 1 ]]; then echo "FAIL: CI fail-on-skip contract — a local skip (no CI) exited 1"; FAIL=$((FAIL + 1)); return; fi
|
|
426
|
+
rc=0; ( set +e; eval 'SKIPPED_ARMS=(); CI=true; PASS=1; FAIL=0'"
|
|
427
|
+
$body" ) >/dev/null 2>&1 || rc=$?
|
|
428
|
+
if [[ "$rc" == 1 ]]; then echo "FAIL: CI fail-on-skip contract — CI=true with no skips exited 1"; FAIL=$((FAIL + 1)); return; fi
|
|
429
|
+
echo "PASS: CI fail-on-skip contract (3-row truth table on the real epilogue)"; PASS=$((PASS + 1))
|
|
430
|
+
}
|
|
431
|
+
_t_ci_contract
|
|
432
|
+
|
|
433
|
+
# >>> ci-contract-epilogue
|
|
434
|
+
echo "---"
|
|
435
|
+
echo "PASS=${PASS} FAIL=${FAIL} SKIPPED_ARMS=${#SKIPPED_ARMS[@]}"
|
|
436
|
+
if (( ${#SKIPPED_ARMS[@]} > 0 )); then
|
|
437
|
+
printf ' skipped: %s\n' "${SKIPPED_ARMS[@]}"
|
|
438
|
+
if [[ "${CI:-}" == "true" ]]; then
|
|
439
|
+
echo "CI=true: ${#SKIPPED_ARMS[@]} arm(s) could not run because gitleaks is not runnable on this runner — a FAILURE, not a skip (the runner must provide gitleaks 8.24.2)." >&2
|
|
440
|
+
exit 1
|
|
441
|
+
fi
|
|
442
|
+
fi
|
|
443
|
+
# <<< ci-contract-epilogue
|
|
444
|
+
if (( FAIL > 0 )); then
|
|
445
|
+
exit 1
|
|
446
|
+
fi
|
|
447
|
+
exit 0
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Synthetic .env.example for code-to-prd fixture (#2726). DO NOT DEPLOY.
|
|
2
|
+
# Token below is alnum-only after `sk_test_` prefix per Kieran P0-1; matches
|
|
3
|
+
# `redact-sentinel.sh` stripe_key regex `sk_(test|live)_[A-Za-z0-9]{16,}`.
|
|
4
|
+
# Allowlisted via `.gitleaks.toml` `[allowlist]` block (commit landed 2026-05-15)
|
|
5
|
+
# per `cq-test-fixtures-synthesized-only`.
|
|
6
|
+
STRIPE_SECRET_KEY=sk_test_FIXTUREDONOTUSESYNTHETICTOKEN123
|
|
7
|
+
DATABASE_URL=postgres://fixture-user:fixture-pass@localhost:5432/code_to_prd_fixture
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health-check endpoint — returns 200 OK.
|
|
3
|
+
*/
|
|
4
|
+
export async function GET() {
|
|
5
|
+
const upstream = await fetch("https://api.example.com/healthz");
|
|
6
|
+
return new Response(JSON.stringify({ ok: true, upstream: upstream.status }), {
|
|
7
|
+
headers: { "content-type": "application/json" },
|
|
8
|
+
status: 200,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Landing page for the synthetic code-to-prd fixture.
|
|
3
|
+
*/
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
|
|
6
|
+
export default function HomePage() {
|
|
7
|
+
const [count, setCount] = useState(0);
|
|
8
|
+
return (
|
|
9
|
+
<main>
|
|
10
|
+
<h1>code-to-prd fixture</h1>
|
|
11
|
+
<button onClick={() => setCount(count + 1)}>Count: {count}</button>
|
|
12
|
+
</main>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "code-to-prd-fixture",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Synthetic Next.js skeleton used by plugins/soleur/skills/code-to-prd/test/code-to-prd.test.sh. Dependencies are intentionally omitted — the fixture is a walker target and is never installed. Adding real dependency versions trips the dependency-review CI gate on transient upstream CVEs unrelated to this codebase."
|
|
6
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cohort-status
|
|
3
|
+
description: "This skill should be used when the operator asks for the alpha-tester cohort status — recruitment tally, checkpoint state, quiet flags. Pull-based; no dashboard."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- grok-harness-invoke:start -->
|
|
7
|
+
**Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
|
|
8
|
+
<!-- grok-harness-invoke:end -->
|
|
9
|
+
|
|
10
|
+
# cohort-status
|
|
11
|
+
|
|
12
|
+
Prints the alpha-tester cohort table on demand — the pull-based answer to "where is the
|
|
13
|
+
cohort". **Operator-invoked only; never cron.** The armed `cohort-quiet` Inngest check is
|
|
14
|
+
the push path; this skill is for when the operator asks.
|
|
15
|
+
|
|
16
|
+
## Sources (all local + `gh`; never the hosted DB — there is no CLI auth path)
|
|
17
|
+
|
|
18
|
+
1. **Tally** — the recruitment-mix table in
|
|
19
|
+
`knowledge-base/engineering/operations/runbooks/alpha-tester-onboarding.md`
|
|
20
|
+
(columns: Tester | Company | Claude Code user? | Surface | Onboarded | Terms |
|
|
21
|
+
cohort_key | nudged_at). This is the only ledger for mix/quota state.
|
|
22
|
+
2. **Checkpoint state** — `gh issue list --state all -L 50 --search "checkpoint: 2-week
|
|
23
|
+
usage review" --json number,title,state,createdAt`. Per-tester checkpoint issues are
|
|
24
|
+
titled `checkpoint: 2-week usage review — <Company> (alpha tester #N), due <date>`.
|
|
25
|
+
3. **Armed reminders** — derived by convention, not read from a store:
|
|
26
|
+
`checkpoint-tester-N-<YYYY-MM-DD>` and `cohort-quiet-tester-N-<YYYY-MM-DD>` exist iff
|
|
27
|
+
Step 6 of the runbook ran (`arm-checkpoint.sh N <issue>`). A tester row whose tally has
|
|
28
|
+
no checkpoint issue means arming never happened — report `checkpoint_armed: NO`, do not
|
|
29
|
+
infer dates.
|
|
30
|
+
|
|
31
|
+
## Procedure
|
|
32
|
+
|
|
33
|
+
1. Read the runbook tally table. If the file or the table is unreadable, print
|
|
34
|
+
`UNREADABLE: <path>` and stop — **never** print zeros for a failed read.
|
|
35
|
+
2. Run the `gh issue list` query. If it fails, print `UNREADABLE: gh` and show the tally
|
|
36
|
+
alone.
|
|
37
|
+
3. Per tester row, compute:
|
|
38
|
+
- `checkpoint` — open / closed / `unfiled` (no matching issue found for #N)
|
|
39
|
+
- `armed` — `yes` iff a matching checkpoint issue exists (Step 6 files it and arms in
|
|
40
|
+
the same step)
|
|
41
|
+
- `quiet` — only from a POSITIVE read: a tester is `quiet` iff the latest `cohort-quiet`
|
|
42
|
+
comment on their tracking issue names their company domain (the check emits
|
|
43
|
+
company-level identifiers — email domains, never mailboxes). Never mark quiet from
|
|
44
|
+
absence — absent data is `unknown`, not `quiet`.
|
|
45
|
+
- `nudged_at` — echoed verbatim from the tally row; the checkpoint interview discloses
|
|
46
|
+
assisted-vs-unassisted returns.
|
|
47
|
+
4. **Sanitize every issue title before printing** — `tr -d '\n'` and `tr '|' '/'` (issue
|
|
48
|
+
titles are editable text; a newline or pipe inside one breaks the table layout).
|
|
49
|
+
5. Print the table:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
| Tester | Company | CC? | Surface | Onboarded | cohort_key | checkpoint | armed | quiet | nudged_at |
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
6. Print the mix floor: `Non-CC recorded X / floor 3; CC recorded Y / ceiling 7` — a
|
|
56
|
+
tester #8 warning when the floor is unreachable.
|
|
57
|
+
|
|
58
|
+
## Hard rules
|
|
59
|
+
|
|
60
|
+
- `UNREADABLE`, never fabricated zeros — a failed read is a hole, not a count.
|
|
61
|
+
- Company-level identifiers only; never print tester names/emails from elsewhere.
|
|
62
|
+
- No automatic nudging, no posting — this skill is read-only.
|