@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,411 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# meta-dir-reap.test.sh — the startup age-reap for run-scan.sh's meta_dir
|
|
3
|
+
# (#6789) and the scratch-orphan sweep under TMPDIR (#6760).
|
|
4
|
+
#
|
|
5
|
+
# WHAT THIS GUARDS. Each run-scan.sh invocation creates
|
|
6
|
+
# ${XDG_RUNTIME_DIR:-/tmp}/skill-security-scan-<pid>/ and, before #6789, NOTHING
|
|
7
|
+
# ever removed it — measured 12,889 leaked dirs. The fix age-reaps OLDER
|
|
8
|
+
# siblings at startup.
|
|
9
|
+
#
|
|
10
|
+
# THE FIX IS NOT AN EXIT TRAP, AND THAT IS THE POINT. .scan-meta.json is GDPR
|
|
11
|
+
# Art. 32 evidence: override-mechanism.md tells the operator to reference the
|
|
12
|
+
# path AFTER the scan exits, so `trap 'rm -rf "$meta_dir"' EXIT` would delete
|
|
13
|
+
# the artifact the override flow needs (plan R1). The two load-bearing arms are
|
|
14
|
+
# therefore: (a) an OLD sibling is reaped, and (b) the CURRENT run's artifact
|
|
15
|
+
# STILL EXISTS after the process exits (AC8).
|
|
16
|
+
#
|
|
17
|
+
# Seams: SKILL_SCAN_META_BASE relocates the meta root into the test's temp dir;
|
|
18
|
+
# SKILL_SCAN_META_REAP_MIN sets the age floor. Fixtures are synthesized.
|
|
19
|
+
|
|
20
|
+
set -uo pipefail
|
|
21
|
+
|
|
22
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
23
|
+
RUN_SCAN="$SCRIPT_DIR/../scripts/run-scan.sh"
|
|
24
|
+
|
|
25
|
+
PASS=0
|
|
26
|
+
FAIL=0
|
|
27
|
+
ok() { PASS=$((PASS + 1)); echo " [ok] $1"; }
|
|
28
|
+
bad() { FAIL=$((FAIL + 1)); echo " [FAIL] $1" >&2; }
|
|
29
|
+
|
|
30
|
+
TESTROOT="$(mktemp -d -t meta-dir-reap.XXXXXXXX)"
|
|
31
|
+
trap 'rm -rf "$TESTROOT"' EXIT
|
|
32
|
+
|
|
33
|
+
META_BASE="$TESTROOT/meta"
|
|
34
|
+
mkdir -p "$META_BASE"
|
|
35
|
+
|
|
36
|
+
# The scratch sweep (#6760) runs over ${TMPDIR:-/tmp} — seal it in EVERY
|
|
37
|
+
# scan invocation below so no arm ever sweeps the host's real TMPDIR.
|
|
38
|
+
SCRATCH_META="$TESTROOT/tmp-meta"
|
|
39
|
+
SCRATCH="$TESTROOT/tmp"
|
|
40
|
+
mkdir -p "$SCRATCH_META" "$SCRATCH"
|
|
41
|
+
|
|
42
|
+
# A tiny, benign skill body — the scan's verdict is irrelevant here.
|
|
43
|
+
INPUT="$TESTROOT/skill.md"
|
|
44
|
+
printf '# Demo skill\n\nThis skill reads a file.\n' > "$INPUT"
|
|
45
|
+
|
|
46
|
+
run_scan() {
|
|
47
|
+
SKILL_SCAN_META_BASE="$META_BASE" \
|
|
48
|
+
SKILL_SCAN_META_REAP_MIN="${1:-1440}" \
|
|
49
|
+
TMPDIR="$SCRATCH_META" \
|
|
50
|
+
bash "$RUN_SCAN" "${2:-$INPUT}" 2>/dev/null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
echo "=== run-scan.sh meta_dir age-reap (#6789) ==="
|
|
54
|
+
|
|
55
|
+
# --- Arm 1: an OLD sibling dir is reaped at startup ------------------------
|
|
56
|
+
old="$META_BASE/skill-security-scan-999001"
|
|
57
|
+
mkdir -p "$old"; echo '{}' > "$old/.scan-meta.json"
|
|
58
|
+
touch -d "-3000 minutes" "$old/.scan-meta.json" "$old"
|
|
59
|
+
run_scan 1440 >/dev/null
|
|
60
|
+
if [[ ! -e "$old" ]]; then
|
|
61
|
+
ok "an old skill-security-scan-<pid> sibling is reaped at startup"
|
|
62
|
+
else
|
|
63
|
+
bad "the old sibling dir was NOT reaped"
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# --- Arm 2: a RECENT sibling dir is NOT reaped -----------------------------
|
|
67
|
+
recent="$META_BASE/skill-security-scan-999002"
|
|
68
|
+
mkdir -p "$recent"; echo '{}' > "$recent/.scan-meta.json"
|
|
69
|
+
# left at current mtime → younger than the floor
|
|
70
|
+
run_scan 1440 >/dev/null
|
|
71
|
+
if [[ -e "$recent" ]]; then
|
|
72
|
+
ok "a recent sibling dir is NOT reaped (age gate holds)"
|
|
73
|
+
else
|
|
74
|
+
bad "a recent sibling dir was wrongly reaped"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# --- Arm 3 (AC8): the CURRENT run's artifact survives after exit -----------
|
|
78
|
+
# This is the regression guard against a naive EXIT trap. The path run-scan
|
|
79
|
+
# prints must exist AFTER the process has fully exited.
|
|
80
|
+
out="$(run_scan 1440)"
|
|
81
|
+
meta_path="$(sed -n 's/^\.scan-meta\.json written to: //p' <<<"$out" | head -1)"
|
|
82
|
+
if [[ -n "$meta_path" && -f "$meta_path" ]]; then
|
|
83
|
+
ok "AC8: the current run's .scan-meta.json exists after the process exits"
|
|
84
|
+
else
|
|
85
|
+
bad "AC8: .scan-meta.json missing after exit (an EXIT trap would cause this); path='$meta_path'"
|
|
86
|
+
fi
|
|
87
|
+
# And it must live under the seam base, i.e. the reap logic honoured the seam.
|
|
88
|
+
if [[ -n "$meta_path" && "$meta_path" == "$META_BASE/"* ]]; then
|
|
89
|
+
ok "the meta_dir honours SKILL_SCAN_META_BASE"
|
|
90
|
+
else
|
|
91
|
+
bad "meta_path not under the seam base: '$meta_path'"
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# --- Arm 4: the reap NEVER removes the current run's own dir ----------------
|
|
95
|
+
# Even with an aggressively low floor (0 minutes — still clamped to 60, but
|
|
96
|
+
# the own-dir guarantee is independent of the floor), the run's own dir is
|
|
97
|
+
# created AFTER the reap, so its artifact must survive.
|
|
98
|
+
out="$(run_scan 0)"
|
|
99
|
+
meta_path="$(sed -n 's/^\.scan-meta\.json written to: //p' <<<"$out" | head -1)"
|
|
100
|
+
if [[ -n "$meta_path" && -f "$meta_path" ]]; then
|
|
101
|
+
ok "the reap never targets the current run's own dir (floor=0)"
|
|
102
|
+
else
|
|
103
|
+
bad "floor=0 destroyed the current run's own artifact; path='$meta_path'"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# --- Arm 5: the fix is age-reap at startup, NOT an EXIT trap on meta_dir ----
|
|
107
|
+
# Source assertion (cq-assert-anchor-not-bare-token): a trap that rm's the
|
|
108
|
+
# meta_dir/meta_path on EXIT is the exact R1 regression. Full-line comments are
|
|
109
|
+
# stripped FIRST — this script's own prose legitimately quotes the forbidden
|
|
110
|
+
# `trap 'rm -rf "$meta_dir"' EXIT` shape to explain why it is forbidden, and so
|
|
111
|
+
# does run-scan.sh's, so a raw grep matches the explanation, not the code (the
|
|
112
|
+
# grep-matches-own-comment trap from work/SKILL.md).
|
|
113
|
+
TRAP_RE="trap.*rm.*(meta_dir|meta_path).*(EXIT|RETURN)"
|
|
114
|
+
code_only="$(grep -vE '^[[:space:]]*#' "$SCRIPT_DIR/../scripts/run-scan.sh")"
|
|
115
|
+
if grep -qE "$TRAP_RE" <<<"$code_only"; then
|
|
116
|
+
bad "run-scan.sh traps rm on the meta_dir/meta_path — the R1 regression"
|
|
117
|
+
else
|
|
118
|
+
ok "no EXIT/RETURN trap deletes the meta_dir (R1 respected)"
|
|
119
|
+
fi
|
|
120
|
+
# POSITIVE CONTROL: the SAME regex must MATCH when the forbidden shape is present,
|
|
121
|
+
# or a typo'd pattern reads "clean forever" and the negative arm is vacuous.
|
|
122
|
+
if grep -qE "$TRAP_RE" <<<"trap 'rm -rf \"\$meta_dir\"' EXIT"; then
|
|
123
|
+
ok "the EXIT-trap regex is live (matches the forbidden shape)"
|
|
124
|
+
else
|
|
125
|
+
bad "the EXIT-trap regex matches nothing — the negative arm is vacuous"
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
# --- Arm 6: a NON-matching old dir is never reaped (name filter holds) ------
|
|
129
|
+
# The reap must target only skill-security-scan-<pid> dirs, never every stale
|
|
130
|
+
# dir in the meta base — that base defaults to $XDG_RUNTIME_DIR, shared with
|
|
131
|
+
# other tools.
|
|
132
|
+
other="$META_BASE/some-unrelated-dir"
|
|
133
|
+
mkdir -p "$other"; echo x > "$other/f"
|
|
134
|
+
touch -d "-3000 minutes" "$other/f" "$other"
|
|
135
|
+
run_scan 1440 >/dev/null
|
|
136
|
+
if [[ -e "$other" ]]; then
|
|
137
|
+
ok "an old dir NOT named skill-security-scan-* is never reaped"
|
|
138
|
+
else
|
|
139
|
+
bad "the reap deleted an unrelated dir — name filter missing"
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
# --- Arm 7: the reap is uid-scoped (source anchor) --------------------------
|
|
143
|
+
# A foreign-owned dir cannot be synthesized without root, so assert the -user
|
|
144
|
+
# predicate is present on the reap's find (anchored on the predicate, not a
|
|
145
|
+
# bare word a comment could satisfy — cq-assert-anchor-not-bare-token).
|
|
146
|
+
reap_code="$(grep -vE '^[[:space:]]*#' "$SCRIPT_DIR/../scripts/run-scan.sh")"
|
|
147
|
+
if grep -qE 'skill-security-scan-.*|-user[[:space:]]' <<<"$reap_code" \
|
|
148
|
+
&& grep -qE '\-user[[:space:]]+"\$\(id -u\)"' <<<"$reap_code"; then
|
|
149
|
+
ok "the meta_dir reap is scoped to the current uid (-user)"
|
|
150
|
+
else
|
|
151
|
+
bad "the meta_dir reap has no -user predicate — could reap another user's dirs"
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
echo "=== run-scan.sh scratch-orphan sweep under TMPDIR (#6760) ==="
|
|
155
|
+
|
|
156
|
+
# The scratch sweep runs over ${TMPDIR:-/tmp}, NOT the meta base: the
|
|
157
|
+
# skill-scan-* scratch families (skill-scan-input-*, skill-scan-results-*,
|
|
158
|
+
# skill-scan-XXXXXX + .code/.fm/.body/.req/.resp siblings) are created under
|
|
159
|
+
# TMPDIR by `mktemp -t`, and skill-security-scan-* meta dirs written under /tmp
|
|
160
|
+
# before XDG_RUNTIME_DIR was set are unreachable by the meta-base sweep (the
|
|
161
|
+
# env-flip crossover). Fixtures are synthesized under the seam $SCRATCH.
|
|
162
|
+
|
|
163
|
+
run_scan_tmp() {
|
|
164
|
+
SKILL_SCAN_META_BASE="$META_BASE" \
|
|
165
|
+
SKILL_SCAN_META_REAP_MIN="${1:-1440}" \
|
|
166
|
+
TMPDIR="$SCRATCH" \
|
|
167
|
+
bash "$RUN_SCAN" "${2:-$INPUT}" 2>/dev/null
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# --- Arm 8: an old skill-scan-input-* FILE is reaped ------------------------
|
|
171
|
+
old_in="$SCRATCH/skill-scan-input-999101"
|
|
172
|
+
echo x > "$old_in"; touch -d "-3000 minutes" "$old_in"
|
|
173
|
+
run_scan_tmp 1440 >/dev/null
|
|
174
|
+
if [[ ! -e "$old_in" ]]; then
|
|
175
|
+
ok "an old skill-scan-input-* file is reaped from TMPDIR"
|
|
176
|
+
else
|
|
177
|
+
bad "the old skill-scan-input-* file was NOT reaped"
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
# --- Arm 9: an old skill-scan-results-* DIR is reaped -----------------------
|
|
181
|
+
old_res="$SCRATCH/skill-scan-results-999102"
|
|
182
|
+
mkdir -p "$old_res"; echo '{}' > "$old_res/code-execution.json"
|
|
183
|
+
touch -d "-3000 minutes" "$old_res/code-execution.json" "$old_res"
|
|
184
|
+
run_scan_tmp 1440 >/dev/null
|
|
185
|
+
if [[ ! -e "$old_res" ]]; then
|
|
186
|
+
ok "an old skill-scan-results-* dir is reaped from TMPDIR"
|
|
187
|
+
else
|
|
188
|
+
bad "the old skill-scan-results-* dir was NOT reaped"
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
# --- Arm 10: an old skill-scan-*.code-style sibling FILE is reaped ----------
|
|
192
|
+
old_sib="$SCRATCH/skill-scan-Ab12Cd.code"
|
|
193
|
+
echo x > "$old_sib"; touch -d "-3000 minutes" "$old_sib"
|
|
194
|
+
run_scan_tmp 1440 >/dev/null
|
|
195
|
+
if [[ ! -e "$old_sib" ]]; then
|
|
196
|
+
ok "an old skill-scan-*.code sibling file is reaped from TMPDIR"
|
|
197
|
+
else
|
|
198
|
+
bad "the old skill-scan-*.code sibling was NOT reaped"
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
# --- Arm 11: the XDG-toggle crossover — an old skill-security-scan-* dir ----
|
|
202
|
+
# --- under TMPDIR is reaped -------------------------------------------------
|
|
203
|
+
old_xdg="$SCRATCH/skill-security-scan-999103"
|
|
204
|
+
mkdir -p "$old_xdg"; echo '{}' > "$old_xdg/.scan-meta.json"
|
|
205
|
+
touch -d "-3000 minutes" "$old_xdg/.scan-meta.json" "$old_xdg"
|
|
206
|
+
run_scan_tmp 1440 >/dev/null
|
|
207
|
+
if [[ ! -e "$old_xdg" ]]; then
|
|
208
|
+
ok "an old skill-security-scan-* dir under TMPDIR is reaped (XDG crossover)"
|
|
209
|
+
else
|
|
210
|
+
bad "the old skill-security-scan-* TMPDIR dir was NOT reaped"
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
# --- Arm 12: an sss-write.* hook orphan is reaped ---------------------------
|
|
214
|
+
old_sss="$SCRATCH/sss-write.999104.err"
|
|
215
|
+
echo x > "$old_sss"; touch -d "-3000 minutes" "$old_sss"
|
|
216
|
+
run_scan_tmp 1440 >/dev/null
|
|
217
|
+
if [[ ! -e "$old_sss" ]]; then
|
|
218
|
+
ok "an old sss-write.* hook err-capture is reaped from TMPDIR"
|
|
219
|
+
else
|
|
220
|
+
bad "the old sss-write.* entry was NOT reaped"
|
|
221
|
+
fi
|
|
222
|
+
|
|
223
|
+
# --- Arm 13: a MID-AGE skill-scan-* entry is spared (age gate holds) --------
|
|
224
|
+
# 300 min < floor 1440: discriminates both an over-reap AND a floor shrink to
|
|
225
|
+
# a positive value below the gap — an age-0 fixture only discriminates +0.
|
|
226
|
+
mid="$SCRATCH/skill-scan-input-999105"
|
|
227
|
+
echo x > "$mid"; touch -d "-300 minutes" "$mid"
|
|
228
|
+
run_scan_tmp 1440 >/dev/null
|
|
229
|
+
if [[ -e "$mid" ]]; then
|
|
230
|
+
ok "a mid-age skill-scan-* entry under TMPDIR is NOT reaped (age gate holds)"
|
|
231
|
+
else
|
|
232
|
+
bad "a mid-age skill-scan-* entry was wrongly reaped"
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
# --- Arm 14: an unrelated old entry under TMPDIR is NEVER reaped ------------
|
|
236
|
+
# The arm-6 counterpart for the scratch sweep — a post-group -o widening
|
|
237
|
+
# (`\) -o -name '*'`) satisfies NAME_RE's literal anchor while reaping every
|
|
238
|
+
# aged own-uid entry in TMPDIR; only a behavioral arm catches it.
|
|
239
|
+
unrel="$SCRATCH/some-unrelated-entry"
|
|
240
|
+
mkdir -p "$unrel"; echo x > "$unrel/f"
|
|
241
|
+
touch -d "-3000 minutes" "$unrel/f" "$unrel"
|
|
242
|
+
run_scan_tmp 1440 >/dev/null
|
|
243
|
+
if [[ -e "$unrel" ]]; then
|
|
244
|
+
ok "an old entry NOT named like a producer family is never reaped"
|
|
245
|
+
else
|
|
246
|
+
bad "the sweep deleted an unrelated entry — name filter missing"
|
|
247
|
+
fi
|
|
248
|
+
|
|
249
|
+
# --- Arm 15: a NESTED family-named entry is spared (depth bound) ------------
|
|
250
|
+
# -mindepth 1 -maxdepth 1 bounds the reap to top-level entries — a nested
|
|
251
|
+
# skill-scan-* inside a foreign tree must survive (TMPDIR is shared space).
|
|
252
|
+
mkdir -p "$SCRATCH/otherdir"
|
|
253
|
+
nested="$SCRATCH/otherdir/skill-scan-999106"
|
|
254
|
+
echo x > "$nested"; touch -d "-3000 minutes" "$nested" "$SCRATCH/otherdir"
|
|
255
|
+
run_scan_tmp 1440 >/dev/null
|
|
256
|
+
if [[ -e "$nested" ]]; then
|
|
257
|
+
ok "a nested skill-scan-* below a foreign dir is NOT reaped (depth bound)"
|
|
258
|
+
else
|
|
259
|
+
bad "the sweep reaped a nested entry — depth bound missing"
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
# --- Arm 16: a backdated family-named positional INPUT survives -------------
|
|
263
|
+
# Behavioral pin for the own-scratch exclusion: the file is a reap candidate
|
|
264
|
+
# by name AND age (backdated past every floor), and survives only because
|
|
265
|
+
# `! -samefile "$INPUT"` excludes it. A glob metachar in the name proves the
|
|
266
|
+
# exclusion is inode-based, not a -path string/fnmatch compare. The sibling
|
|
267
|
+
# control is reaped in the SAME invocation — proving the sweep ran, not that
|
|
268
|
+
# it no-oped.
|
|
269
|
+
victim="$SCRATCH/skill-scan-input-[victim]"
|
|
270
|
+
printf '# scanned body\n' > "$victim"
|
|
271
|
+
touch -d "-3000 minutes" "$victim"
|
|
272
|
+
control="$SCRATCH/skill-scan-input-999107"
|
|
273
|
+
echo x > "$control"; touch -d "-3000 minutes" "$control"
|
|
274
|
+
out="$(run_scan_tmp 0 "$victim")"
|
|
275
|
+
meta_path="$(sed -n 's/^\.scan-meta\.json written to: //p' <<<"$out" | head -1)"
|
|
276
|
+
if [[ -e "$victim" && ! -e "$control" && -n "$meta_path" ]]; then
|
|
277
|
+
ok "a backdated skill-scan-* positional INPUT survives (own-scratch exclusion is behavioral, not anchor-only)"
|
|
278
|
+
else
|
|
279
|
+
bad "own-scratch exclusion wrong; exists=$(test -e "$victim" && echo yes) control=$(test -e "$control" && echo present || echo reaped) meta='$meta_path'"
|
|
280
|
+
fi
|
|
281
|
+
|
|
282
|
+
# --- Arm 17: the 60-minute floor clamp is behavioral -------------------------
|
|
283
|
+
# Mutant `_reap_min` verbatim (no clamp) reaps this <1-min entry under the
|
|
284
|
+
# test-seam floor 0 — `-mmin "+0"` matches ANY past mtime — so a fresh entry
|
|
285
|
+
# surviving a floor-0 scan is the clamp's only discriminating pin.
|
|
286
|
+
fresh_clamp="$SCRATCH/skill-scan-input-999108"
|
|
287
|
+
echo x > "$fresh_clamp"
|
|
288
|
+
run_scan_tmp 0 >/dev/null
|
|
289
|
+
if [[ -e "$fresh_clamp" ]]; then
|
|
290
|
+
ok "the 60-minute floor clamp spares fresh entries under a floor-0 invocation"
|
|
291
|
+
else
|
|
292
|
+
bad "the 60-minute clamp is missing — floor 0 reaped a fresh entry"
|
|
293
|
+
fi
|
|
294
|
+
|
|
295
|
+
# --- Arm 18: a non-numeric or octal floor never crashes the scan -------------
|
|
296
|
+
# The knob falls back on garbage and `10#`-normalizes leading zeros — either
|
|
297
|
+
# bug abandons the scan or silently bypasses the 60-min clamp BEFORE the meta
|
|
298
|
+
# line is emitted (a gate deny for every scanned write, on a benign env typo).
|
|
299
|
+
# The `08` fixture is discriminating, not just no-crash: a 30-min entry sits
|
|
300
|
+
# between the octal-legal floor (8) and the clamp (60) — under an unnormalized
|
|
301
|
+
# `08` the expansion error strands _reap_min as the literal "08" (find reads
|
|
302
|
+
# floor 8 → fixture reaped); normalized it clamps to 60 → fixture spared.
|
|
303
|
+
knob_fixture="$SCRATCH/skill-scan-input-999109"
|
|
304
|
+
echo x > "$knob_fixture"; touch -d "-30 minutes" "$knob_fixture"
|
|
305
|
+
for knob in abc 08; do
|
|
306
|
+
out="$(run_scan_tmp "$knob")"
|
|
307
|
+
if grep -q . < <(sed -n 's/^\.scan-meta\.json written to: //p' <<<"$out"); then
|
|
308
|
+
ok "SKILL_SCAN_META_REAP_MIN=$knob still emits .scan-meta.json (floor normalised)"
|
|
309
|
+
else
|
|
310
|
+
bad "SKILL_SCAN_META_REAP_MIN=$knob crashed the scan before meta write"
|
|
311
|
+
fi
|
|
312
|
+
done
|
|
313
|
+
if [[ -e "$knob_fixture" ]]; then
|
|
314
|
+
ok "an octal-legal knob is normalised before the clamp (08 -> 8 -> floor 60)"
|
|
315
|
+
else
|
|
316
|
+
bad "knob 08 bypassed the 60-min clamp — 10# normalization missing"
|
|
317
|
+
fi
|
|
318
|
+
|
|
319
|
+
# --- Arm 18b: the meta sweep's clamp is pinned too ----------------------------
|
|
320
|
+
# A fresh meta sibling under floor-0 survives only because _reap_min clamps
|
|
321
|
+
# before BOTH finds — a scratch-only clamp mutant reaps it.
|
|
322
|
+
fresh_meta="$META_BASE/skill-security-scan-999110"
|
|
323
|
+
mkdir -p "$fresh_meta"; echo '{}' > "$fresh_meta/.scan-meta.json"
|
|
324
|
+
run_scan 0 >/dev/null
|
|
325
|
+
if [[ -d "$fresh_meta" ]]; then
|
|
326
|
+
ok "the 60-minute clamp also covers the meta_dir reap (fresh sibling spared)"
|
|
327
|
+
else
|
|
328
|
+
bad "the meta reap ran unclamped — a peer's live meta_dir is wipeable"
|
|
329
|
+
fi
|
|
330
|
+
|
|
331
|
+
# --- Arm 19: source anchors for the scratch sweep ---------------------------
|
|
332
|
+
# Pin the load-bearing predicates on the live code (cq-assert-anchor-not-bare-
|
|
333
|
+
# token): the grouped -name arms, uid/age/depth predicates, and the
|
|
334
|
+
# ! -samefile own-scratch exclusions (INPUT/results_dir predate the reap,
|
|
335
|
+
# unlike meta_dir — the asymmetry that makes the exclusions load-bearing).
|
|
336
|
+
# The grouped predicate is written `\( -name … \)` in the source, so the ERE
|
|
337
|
+
# pins the literal backslashes via a char class (ERE `\(` is a literal paren,
|
|
338
|
+
# not `\` + `(` — an unescaped-backslash reading is how this anchor vacuated).
|
|
339
|
+
NAME_RE="[\\\\]\\( -name 'skill-security-scan-\\*' -o -name 'skill-scan-\\*' -o -name 'sss-write\\.\\*\\.err' [\\\\]\\)"
|
|
340
|
+
scratch_find="$(grep -vE '^[[:space:]]*#' "$SCRIPT_DIR/../scripts/run-scan.sh" \
|
|
341
|
+
| grep -A10 'tmp_root=')"
|
|
342
|
+
if grep -qE "$NAME_RE" <<<"$scratch_find"; then
|
|
343
|
+
ok "the TMPDIR sweep names all three families (-o grouped -name arms)"
|
|
344
|
+
else
|
|
345
|
+
bad "the TMPDIR sweep is missing the grouped -name arms"
|
|
346
|
+
fi
|
|
347
|
+
for anchor in '-mindepth 1 -maxdepth 1' '-mmin' '-user "$(id -u)"'; do
|
|
348
|
+
if grep -qF -- "$anchor" <<<"$scratch_find"; then
|
|
349
|
+
ok "the TMPDIR sweep pins: $anchor"
|
|
350
|
+
else
|
|
351
|
+
bad "the TMPDIR sweep is missing predicate: $anchor"
|
|
352
|
+
fi
|
|
353
|
+
done
|
|
354
|
+
# The `10#` token is pinned in its code spelling — a bare `10#` grep would
|
|
355
|
+
# match its own mention in the reap comments (anchor laundering; the same
|
|
356
|
+
# trap arm 5's comment-strip guards against).
|
|
357
|
+
for anchor in 'pwd -P' '10#${_reap_min}' '-e "$INPUT"' '-e "$results_dir"' \
|
|
358
|
+
'-samefile "$INPUT"' '-samefile "$results_dir"'; do
|
|
359
|
+
if grep -qF -- "$anchor" "$SCRIPT_DIR/../scripts/run-scan.sh"; then
|
|
360
|
+
ok "the reap block pins: $anchor"
|
|
361
|
+
else
|
|
362
|
+
bad "the reap block is missing: $anchor"
|
|
363
|
+
fi
|
|
364
|
+
done
|
|
365
|
+
# Meta-side predicates get the same anchor treatment (an `-amin` mutation is
|
|
366
|
+
# behaviorally invisible under touch -d's atime≈mtime).
|
|
367
|
+
meta_find="$(grep -vE '^[[:space:]]*#' "$SCRIPT_DIR/../scripts/run-scan.sh" \
|
|
368
|
+
| grep -A6 'meta_root=')"
|
|
369
|
+
for anchor in '-mmin' '-type d' '-user "$(id -u)"'; do
|
|
370
|
+
if grep -qF -- "$anchor" <<<"$meta_find"; then
|
|
371
|
+
ok "the meta reap pins: $anchor"
|
|
372
|
+
else
|
|
373
|
+
bad "the meta reap is missing predicate: $anchor"
|
|
374
|
+
fi
|
|
375
|
+
done
|
|
376
|
+
# Producer-prefix pin: every `mktemp -t`/`-dt` template under the skill's
|
|
377
|
+
# scripts/ must emit inside the sweep's name window — a new producer writing
|
|
378
|
+
# `mktemp -t some-other-name` orphans forever with no coverage. Flagless
|
|
379
|
+
# `mktemp` emits `tmp.*`, which tmp-classify.sh assigns to systemd-tmpfiles —
|
|
380
|
+
# outside the pin's scope by design.
|
|
381
|
+
drift="$(grep -hoE 'mktemp -[dt]+ "?[A-Za-z0-9_.*-]+' "$SCRIPT_DIR/../scripts/"*.sh \
|
|
382
|
+
| awk '{print $NF}' | tr -d '"' | grep -v '^skill-scan-' || true)"
|
|
383
|
+
if [[ -z "$drift" ]]; then
|
|
384
|
+
ok "every mktemp template under scripts/ emits a swept skill-scan-* name"
|
|
385
|
+
else
|
|
386
|
+
bad "producer outside the sweep window: $drift"
|
|
387
|
+
fi
|
|
388
|
+
# Hook-side producer pin: the sss-write.*.err shape is literal-path
|
|
389
|
+
# construction in the write-hook, outside scripts/ — a rename there orphans
|
|
390
|
+
# the family while every arm above stays green.
|
|
391
|
+
hook_producer="$(cd "$SCRIPT_DIR/../../../../.." && pwd -P)/.claude/hooks/skill-security-scan-write.sh"
|
|
392
|
+
if grep -qE 'TMPDIR:-/tmp[^/]*/sss-write\.[^"]*\.err' "$hook_producer"; then
|
|
393
|
+
ok "the write-hook's sss-write.* capture stays inside the sweep window"
|
|
394
|
+
else
|
|
395
|
+
bad "the sss-write producer moved or renamed — sweep coverage silently lost"
|
|
396
|
+
fi
|
|
397
|
+
# POSITIVE CONTROLS: each anchor must MATCH a synthetic live-shaped line, or a
|
|
398
|
+
# typo'd pattern reads "clean forever" and every arm above is vacuous.
|
|
399
|
+
if grep -qE "$NAME_RE" <<<"find \"\$tmp_root\" \( -name 'skill-security-scan-*' -o -name 'skill-scan-*' -o -name 'sss-write.*.err' \)"; then
|
|
400
|
+
ok "the grouped -name regex is live (matches the predicate shape)"
|
|
401
|
+
else
|
|
402
|
+
bad "the grouped -name regex matches nothing — the anchor arm is vacuous"
|
|
403
|
+
fi
|
|
404
|
+
if grep -qF -- '-samefile "$INPUT"' <<<"find /tmp ! -samefile \"\$INPUT\" ! -samefile \"\$results_dir\""; then
|
|
405
|
+
ok "the ! -samefile exclusion anchors are live (match the predicate shape)"
|
|
406
|
+
else
|
|
407
|
+
bad "the ! -samefile anchors match nothing — the anchor arm is vacuous"
|
|
408
|
+
fi
|
|
409
|
+
|
|
410
|
+
echo "=== meta-dir-reap: $PASS passed, $FAIL failed ==="
|
|
411
|
+
[[ "$FAIL" -eq 0 ]] || exit 1
|