@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,331 @@
|
|
|
1
|
+
<!-- Adapted from gosprinto/compliance-skills (MIT) — see NOTICE -->
|
|
2
|
+
# Layer: Data in Transit
|
|
3
|
+
|
|
4
|
+
## When This Layer Loads
|
|
5
|
+
|
|
6
|
+
Auto-trigger inline when Claude is about to generate:
|
|
7
|
+
- Any `fetch`, `axios`, `requests`, `http` or similar HTTP client code
|
|
8
|
+
- Any middleware, interceptor, or request/response logger
|
|
9
|
+
- Any webhook handler or inbound HTTP endpoint
|
|
10
|
+
- Any internal service-to-service API call
|
|
11
|
+
- Any URL construction that includes user data
|
|
12
|
+
- Any request logging or monitoring setup
|
|
13
|
+
|
|
14
|
+
Also loads during full repo scan.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## T-01: PII in URL Query Parameters
|
|
19
|
+
|
|
20
|
+
What to grep:
|
|
21
|
+
```
|
|
22
|
+
?email=
|
|
23
|
+
?phone=
|
|
24
|
+
?ssn=
|
|
25
|
+
?token= (in URL, not header)
|
|
26
|
+
?key=
|
|
27
|
+
`/api/users?email=${
|
|
28
|
+
`/search?phone=${
|
|
29
|
+
req.query.email
|
|
30
|
+
req.query.ssn
|
|
31
|
+
params[:email]
|
|
32
|
+
request.GET['email']
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Flag when:
|
|
36
|
+
- PII passed as query parameter in any HTTP call
|
|
37
|
+
- Auth tokens in query strings: `?token=abc123`, `?api_key=xyz`
|
|
38
|
+
- Email used as query param for lookup: `/verify?email=john@doe.com`
|
|
39
|
+
|
|
40
|
+
Why it matters: Query parameters appear in:
|
|
41
|
+
- Server access logs (stored indefinitely by default)
|
|
42
|
+
- Browser history
|
|
43
|
+
- HTTP Referer headers sent to third parties
|
|
44
|
+
- CDN and proxy logs
|
|
45
|
+
- Analytics tools that capture full URLs
|
|
46
|
+
|
|
47
|
+
Fix pattern:
|
|
48
|
+
```javascript
|
|
49
|
+
// Wrong
|
|
50
|
+
await fetch(`/api/users?email=${email}&dob=${dob}`)
|
|
51
|
+
await fetch(`/api/verify?token=${resetToken}`)
|
|
52
|
+
|
|
53
|
+
// Right — POST body for PII, opaque IDs in URLs
|
|
54
|
+
await fetch('/api/users/lookup', {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
body: JSON.stringify({ email, dob }),
|
|
57
|
+
headers: { 'Content-Type': 'application/json' }
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// For tokens — use short path param that's opaque, not the PII itself
|
|
61
|
+
await fetch(`/api/verify/${opaqueCode}`)
|
|
62
|
+
// Server resolves opaqueCode to user server-side — email never in URL
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Regulation: CCPA, HIPAA, PCI-DSS
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## T-02: Hardcoded HTTP (Not HTTPS) for Internal Calls
|
|
70
|
+
|
|
71
|
+
What to grep:
|
|
72
|
+
```
|
|
73
|
+
http:// (in fetch, axios, requests, etc — not localhost)
|
|
74
|
+
'http://api.
|
|
75
|
+
"http://service.
|
|
76
|
+
http://internal.
|
|
77
|
+
http://microservice.
|
|
78
|
+
requests.get('http://
|
|
79
|
+
axios.get('http://
|
|
80
|
+
fetch('http://
|
|
81
|
+
RestClient.get('http://
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Flag when:
|
|
85
|
+
- Internal service-to-service calls over HTTP (not HTTPS)
|
|
86
|
+
- Hardcoded `http://` to non-localhost URLs in API clients
|
|
87
|
+
- Database connection strings using unencrypted protocol
|
|
88
|
+
|
|
89
|
+
Note: `http://localhost` is acceptable in development. Flag all others.
|
|
90
|
+
|
|
91
|
+
Fix pattern:
|
|
92
|
+
```javascript
|
|
93
|
+
// Wrong
|
|
94
|
+
const response = await axios.get('http://user-service.internal/api/users')
|
|
95
|
+
const data = await fetch('http://payments-api/charge')
|
|
96
|
+
|
|
97
|
+
// Right
|
|
98
|
+
const response = await axios.get('https://user-service.internal/api/users')
|
|
99
|
+
// Also: enforce via environment variables, never hardcode protocol+host
|
|
100
|
+
const API_BASE = process.env.USER_SERVICE_URL // set to https:// in env
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Regulation: HIPAA (transmission security), PCI-DSS, GLBA
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## T-03: Webhook Signature Not Verified
|
|
108
|
+
|
|
109
|
+
What to grep:
|
|
110
|
+
```
|
|
111
|
+
app.post('/webhook'
|
|
112
|
+
router.post('/webhook'
|
|
113
|
+
app.post('/hooks/
|
|
114
|
+
def webhook(
|
|
115
|
+
async webhook(
|
|
116
|
+
stripe.webhooks. (check if constructEvent is used)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Flag when:
|
|
120
|
+
- Webhook endpoint processes payload without verifying signature
|
|
121
|
+
- No `x-signature`, `x-hub-signature`, or vendor-specific header check
|
|
122
|
+
- Signature present but not validated before payload is processed
|
|
123
|
+
|
|
124
|
+
Why it matters: Unverified webhooks allow anyone to POST fake events
|
|
125
|
+
to your endpoint — including fake payment confirmations or user data.
|
|
126
|
+
|
|
127
|
+
Fix pattern:
|
|
128
|
+
```javascript
|
|
129
|
+
// Wrong
|
|
130
|
+
app.post('/webhook/stripe', express.json(), async (req, res) => {
|
|
131
|
+
const event = req.body // trusting payload blindly
|
|
132
|
+
await processEvent(event)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
// Right
|
|
136
|
+
app.post('/webhook/stripe',
|
|
137
|
+
express.raw({ type: 'application/json' }), // raw body needed for sig check
|
|
138
|
+
async (req, res) => {
|
|
139
|
+
const sig = req.headers['stripe-signature']
|
|
140
|
+
let event
|
|
141
|
+
try {
|
|
142
|
+
event = stripe.webhooks.constructEvent(req.body, sig, process.env.STRIPE_WEBHOOK_SECRET)
|
|
143
|
+
} catch (err) {
|
|
144
|
+
return res.status(400).send('Webhook signature verification failed')
|
|
145
|
+
}
|
|
146
|
+
await processEvent(event)
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Regulation: PCI-DSS, FTC Act
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## T-04: PII in HTTP Headers (Non-Auth)
|
|
156
|
+
|
|
157
|
+
What to grep:
|
|
158
|
+
```
|
|
159
|
+
req.headers['x-user-email'
|
|
160
|
+
res.setHeader('x-user-
|
|
161
|
+
headers: { 'x-email':
|
|
162
|
+
'X-User-Data':
|
|
163
|
+
'X-Customer-Info':
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Flag when:
|
|
167
|
+
- PII passed in custom HTTP headers between services
|
|
168
|
+
- Full user object serialized into a custom header
|
|
169
|
+
- Email, phone, or SSN in a forwarded header
|
|
170
|
+
|
|
171
|
+
Why it matters: Headers appear in proxy logs, CDN logs, and load balancer logs.
|
|
172
|
+
Custom headers with PII create unintended log exposure across your infrastructure.
|
|
173
|
+
|
|
174
|
+
Fix pattern:
|
|
175
|
+
```javascript
|
|
176
|
+
// Wrong
|
|
177
|
+
await fetch('/api/process', {
|
|
178
|
+
headers: {
|
|
179
|
+
'X-User-Email': user.email,
|
|
180
|
+
'X-User-Phone': user.phone,
|
|
181
|
+
'X-User-Data': JSON.stringify(user)
|
|
182
|
+
}
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
// Right — pass opaque user ID only, resolve server-side
|
|
186
|
+
await fetch('/api/process', {
|
|
187
|
+
headers: {
|
|
188
|
+
'X-User-Id': user.id, // opaque ID only
|
|
189
|
+
'Authorization': `Bearer ${token}`
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Regulation: CCPA, HIPAA
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## T-05: Sensitive Data in Request Logging Middleware
|
|
199
|
+
|
|
200
|
+
What to grep:
|
|
201
|
+
```
|
|
202
|
+
morgan(
|
|
203
|
+
app.use(logger(
|
|
204
|
+
expressWinston.logger(
|
|
205
|
+
requestLogger
|
|
206
|
+
logRequests
|
|
207
|
+
before_action :log
|
|
208
|
+
rack middleware
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Flag when:
|
|
212
|
+
- Request logging middleware logs full request body
|
|
213
|
+
- No body sanitization before logging
|
|
214
|
+
- Response body logged (may contain PII from DB)
|
|
215
|
+
|
|
216
|
+
Fix pattern:
|
|
217
|
+
```javascript
|
|
218
|
+
// Wrong
|
|
219
|
+
app.use(morgan('combined')) // logs full URL including query params with PII
|
|
220
|
+
app.use((req, res, next) => {
|
|
221
|
+
console.log(req.body) // logs passwords, PII
|
|
222
|
+
next()
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
// Right
|
|
226
|
+
app.use(morgan(':method :url :status :response-time ms'))
|
|
227
|
+
// Custom sanitizing middleware
|
|
228
|
+
app.use((req, res, next) => {
|
|
229
|
+
const safeBody = sanitizeForLog(req.body, ['password', 'ssn', 'card_number', 'cvv'])
|
|
230
|
+
req.log = { method: req.method, path: req.path, body: safeBody }
|
|
231
|
+
next()
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
function sanitizeForLog(body, sensitiveFields) {
|
|
235
|
+
const safe = { ...body }
|
|
236
|
+
sensitiveFields.forEach(f => { if (safe[f]) safe[f] = '[REDACTED]' })
|
|
237
|
+
return safe
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Regulation: CCPA, HIPAA, PCI-DSS
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## T-06: HTTPS Not Enforced
|
|
246
|
+
|
|
247
|
+
What to grep:
|
|
248
|
+
```
|
|
249
|
+
http:// (non-localhost hardcoded URLs in server config)
|
|
250
|
+
HSTS
|
|
251
|
+
helmet( (check if hsts is configured)
|
|
252
|
+
Strict-Transport-Security
|
|
253
|
+
force_ssl
|
|
254
|
+
config.force_ssl
|
|
255
|
+
SECURE_SSL_REDIRECT (Django)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Flag when:
|
|
259
|
+
- No HSTS header configured in production middleware
|
|
260
|
+
- No HTTP → HTTPS redirect middleware
|
|
261
|
+
- `http://` hardcoded in allowed origins or callback URLs
|
|
262
|
+
- `helmet()` used without HSTS config
|
|
263
|
+
- Django `SECURE_SSL_REDIRECT = False` or not set
|
|
264
|
+
|
|
265
|
+
Fix pattern:
|
|
266
|
+
```javascript
|
|
267
|
+
// Wrong — no HTTPS enforcement
|
|
268
|
+
app.use(helmet()) // helmet defaults don't include HSTS
|
|
269
|
+
|
|
270
|
+
// Right
|
|
271
|
+
app.use(helmet({
|
|
272
|
+
hsts: {
|
|
273
|
+
maxAge: 31536000, // 1 year
|
|
274
|
+
includeSubDomains: true,
|
|
275
|
+
preload: true
|
|
276
|
+
}
|
|
277
|
+
}))
|
|
278
|
+
|
|
279
|
+
// HTTP → HTTPS redirect middleware
|
|
280
|
+
app.use((req, res, next) => {
|
|
281
|
+
if (process.env.NODE_ENV === 'production' && !req.secure) {
|
|
282
|
+
return res.redirect(301, `https://${req.headers.host}${req.url}`)
|
|
283
|
+
}
|
|
284
|
+
next()
|
|
285
|
+
})
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
```python
|
|
289
|
+
# Django settings.py
|
|
290
|
+
SECURE_SSL_REDIRECT = True # redirect HTTP → HTTPS
|
|
291
|
+
SECURE_HSTS_SECONDS = 31536000 # 1 year
|
|
292
|
+
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
|
|
293
|
+
SECURE_HSTS_PRELOAD = True
|
|
294
|
+
SESSION_COOKIE_SECURE = True
|
|
295
|
+
CSRF_COOKIE_SECURE = True
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```ruby
|
|
299
|
+
# Rails config/environments/production.rb
|
|
300
|
+
config.force_ssl = true
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Regulation: HIPAA (transmission security), PCI-DSS, GLBA
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## DT-EU-CB: Cross-Border Transfer (GDPR Chapter V)
|
|
308
|
+
|
|
309
|
+
EU extension (not in upstream Sprinto). Chapter V (Articles 44-49) restricts personal-data transfers outside the EEA / countries lacking an adequacy decision.
|
|
310
|
+
|
|
311
|
+
What to grep:
|
|
312
|
+
```
|
|
313
|
+
fetch("https://api.<vendor>.com/...
|
|
314
|
+
process.env.STRIPE_API_KEY
|
|
315
|
+
process.env.OPENAI_API_KEY
|
|
316
|
+
process.env.ANTHROPIC_API_KEY
|
|
317
|
+
process.env.SENDGRID_API_KEY
|
|
318
|
+
new <Vendor>Client(...)
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Flag when:
|
|
322
|
+
- A new third-party vendor environment variable or SDK is introduced AND the vendor's data-processing locale is outside the EEA AND the vendor is not present in `knowledge-base/legal/compliance-posture.md` Vendor DPAs
|
|
323
|
+
- A request handler forwards request bodies, headers, or any user-derived field to a non-EEA endpoint
|
|
324
|
+
|
|
325
|
+
Why it matters: Each new non-EEA processor is a Chapter V transfer. Without a Standard Contractual Clauses (SCC) or adequacy basis recorded in `compliance-posture.md`, the transfer lacks a lawful basis and is a regulator-complaint-shaped failure surface.
|
|
326
|
+
|
|
327
|
+
Adequacy short-list (2026, non-exhaustive): EU/EEA, UK, Switzerland, Canada (commercial), Japan, South Korea, New Zealand, Argentina, Israel, Uruguay, Faroe Islands, Andorra, Guernsey, Isle of Man, Jersey. US transfers require Data Privacy Framework participation OR SCCs.
|
|
328
|
+
|
|
329
|
+
Fix pattern: every new non-EEA vendor MUST land a Vendor DPA row in `compliance-posture.md` (operator-managed, gate never writes the row). The gate emits `Important` severity on detection so the row gap is visible at design time.
|
|
330
|
+
|
|
331
|
+
Regulation: GDPR Chapter V (Art. 44-49), UK GDPR, Swiss FADP
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
<!-- Adapted from gosprinto/compliance-skills (MIT) — see NOTICE -->
|
|
2
|
+
# Layer: Data Lifecycle
|
|
3
|
+
|
|
4
|
+
## When This Layer Loads
|
|
5
|
+
|
|
6
|
+
Auto-trigger inline when Claude is about to generate:
|
|
7
|
+
- Any delete, destroy, or remove function on user/customer records
|
|
8
|
+
- Any anonymization or scrubbing function
|
|
9
|
+
- Any data export or portability endpoint
|
|
10
|
+
- Any cron job, scheduled task, or background worker
|
|
11
|
+
- Any backup script or database dump
|
|
12
|
+
- Any retention policy or cleanup job
|
|
13
|
+
- Any cascade delete or foreign key relationship setup
|
|
14
|
+
|
|
15
|
+
Also loads during full repo scan.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## DL-01: No Hard-Delete Path (Soft-Delete Only)
|
|
20
|
+
|
|
21
|
+
What to grep:
|
|
22
|
+
```
|
|
23
|
+
deleted_at
|
|
24
|
+
paranoid: (Sequelize paranoid, Rails acts_as_paranoid)
|
|
25
|
+
acts_as_paranoid
|
|
26
|
+
SoftDelete
|
|
27
|
+
is_deleted
|
|
28
|
+
is_active: false (as substitute for deletion)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Flag when:
|
|
32
|
+
- Model has `deleted_at` but no corresponding hard-delete function
|
|
33
|
+
- ORM paranoid/soft-delete mode with no escape hatch
|
|
34
|
+
- `is_deleted` flag set but record stays in DB indefinitely
|
|
35
|
+
- No documented path to permanently purge a user's data
|
|
36
|
+
|
|
37
|
+
Why it matters: CCPA right to erasure requires actual deletion, not just hiding
|
|
38
|
+
records. Soft-delete alone is not sufficient — data is still in the database,
|
|
39
|
+
still in backups, and still exposed in a breach.
|
|
40
|
+
|
|
41
|
+
Fix pattern:
|
|
42
|
+
```javascript
|
|
43
|
+
// Wrong — soft delete only, no hard delete
|
|
44
|
+
async function deleteUser(userId) {
|
|
45
|
+
await User.update({ deleted_at: new Date() }, { where: { id: userId } })
|
|
46
|
+
// Record still in DB, still in backups, never truly gone
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Right — soft delete for grace period, then hard delete
|
|
50
|
+
async function deleteUser(userId) {
|
|
51
|
+
// Mark for deletion with timestamp
|
|
52
|
+
await User.update({
|
|
53
|
+
deleted_at: new Date(),
|
|
54
|
+
deletion_scheduled_at: new Date(Date.now() + 30 * 24 * 3600000) // 30 day grace
|
|
55
|
+
}, { where: { id: userId } })
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Scheduled job — runs nightly
|
|
59
|
+
async function purgeDeletedUsers() {
|
|
60
|
+
const users = await User.findAll({
|
|
61
|
+
where: {
|
|
62
|
+
deletion_scheduled_at: { [Op.lt]: new Date() }
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
for (const user of users) {
|
|
66
|
+
await cascadeDeleteUserData(user.id) // see DL-02
|
|
67
|
+
await user.destroy({ force: true }) // hard delete
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Regulation: CCPA (right to erasure), HIPAA
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## DL-02: Deletion Doesn't Cascade to Related Tables
|
|
77
|
+
|
|
78
|
+
What to grep:
|
|
79
|
+
```
|
|
80
|
+
User.destroy(
|
|
81
|
+
User.delete(
|
|
82
|
+
user.delete()
|
|
83
|
+
DELETE FROM users
|
|
84
|
+
await user.remove()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Flag when:
|
|
88
|
+
- User deleted from `users` table but related records remain
|
|
89
|
+
- No cascade delete on foreign keys
|
|
90
|
+
- PII orphaned in: `orders`, `addresses`, `payment_methods`, `audit_logs`,
|
|
91
|
+
`sessions`, `notifications`, `support_tickets`, `analytics_events`
|
|
92
|
+
- Related tables not listed in deletion function
|
|
93
|
+
|
|
94
|
+
Why it matters: Deleting the user row leaves PII scattered across the database.
|
|
95
|
+
A CCPA deletion request must remove data from ALL tables, not just `users`.
|
|
96
|
+
|
|
97
|
+
Fix pattern:
|
|
98
|
+
```javascript
|
|
99
|
+
// Wrong
|
|
100
|
+
async function deleteUser(userId) {
|
|
101
|
+
await User.destroy({ where: { id: userId } })
|
|
102
|
+
// Orders, addresses, payment methods, sessions still in DB
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Right — explicit cascade
|
|
106
|
+
async function cascadeDeleteUserData(userId) {
|
|
107
|
+
await db.transaction(async (t) => {
|
|
108
|
+
// Anonymize audit logs (keep for legal compliance, remove PII)
|
|
109
|
+
await AuditLog.update(
|
|
110
|
+
{ user_id: null, ip_address: null, user_agent: null },
|
|
111
|
+
{ where: { user_id: userId }, transaction: t }
|
|
112
|
+
)
|
|
113
|
+
// Hard delete everything else
|
|
114
|
+
await Session.destroy({ where: { user_id: userId }, transaction: t })
|
|
115
|
+
await Address.destroy({ where: { user_id: userId }, transaction: t })
|
|
116
|
+
await PaymentMethod.destroy({ where: { user_id: userId }, transaction: t })
|
|
117
|
+
await Notification.destroy({ where: { user_id: userId }, transaction: t })
|
|
118
|
+
await Order.update( // anonymize orders (keep for accounting)
|
|
119
|
+
{ user_id: null, shipping_address: '[deleted]', billing_name: '[deleted]' },
|
|
120
|
+
{ where: { user_id: userId }, transaction: t }
|
|
121
|
+
)
|
|
122
|
+
await User.destroy({ where: { id: userId }, force: true, transaction: t })
|
|
123
|
+
})
|
|
124
|
+
// Also: trigger deletion from downstream vendors (email tool, CRM, analytics)
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Regulation: CCPA, HIPAA
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## DL-03: Anonymization That Doesn't Actually Anonymize
|
|
133
|
+
|
|
134
|
+
What to grep:
|
|
135
|
+
```
|
|
136
|
+
anonymize(
|
|
137
|
+
anonymise(
|
|
138
|
+
scrub_user(
|
|
139
|
+
redact(
|
|
140
|
+
null (setting fields to null as "anonymization")
|
|
141
|
+
'[deleted]' (replacing with literal string)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Flag when:
|
|
145
|
+
- "Anonymization" only nulls out name/email but keeps DOB + zip + gender (re-identifiable combo)
|
|
146
|
+
- Email replaced with `[deleted]` but user_id kept linked to other tables
|
|
147
|
+
- IP addresses kept after "anonymization"
|
|
148
|
+
- Unique identifiers (phone, SSN) replaced with placeholder that's still unique
|
|
149
|
+
|
|
150
|
+
Why it matters: A user with DOB + zip code + gender is re-identifiable in 87%
|
|
151
|
+
of cases (Latanya Sweeney). Nulling name and email while keeping these fields
|
|
152
|
+
is not anonymization — it's pseudonymization at best.
|
|
153
|
+
|
|
154
|
+
Fix pattern:
|
|
155
|
+
```javascript
|
|
156
|
+
// Wrong — leaves re-identifiable combination
|
|
157
|
+
async function anonymizeUser(userId) {
|
|
158
|
+
await User.update({
|
|
159
|
+
email: null, // removed
|
|
160
|
+
name: null, // removed
|
|
161
|
+
// dob, zip, gender, ip_address still present — re-identifiable
|
|
162
|
+
}, { where: { id: userId } })
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Right — remove or generalize all quasi-identifiers
|
|
166
|
+
async function anonymizeUser(userId) {
|
|
167
|
+
await User.update({
|
|
168
|
+
email: `anon_${crypto.randomUUID()}@deleted.invalid`, // unique but not real
|
|
169
|
+
name: null,
|
|
170
|
+
phone: null,
|
|
171
|
+
ip_address: null,
|
|
172
|
+
date_of_birth: null, // or replace with birth_year only
|
|
173
|
+
zip_code: zip.slice(0, 3) + '00', // generalize to 3-digit prefix
|
|
174
|
+
// Keep: aggregated/non-identifying analytics only
|
|
175
|
+
}, { where: { id: userId } })
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Regulation: CCPA, HIPAA, FTC Act
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## DL-04: No Data Export / Portability Function (GDPR Art. 20 + CCPA)
|
|
184
|
+
|
|
185
|
+
EU rewrite (upstream framed CCPA-only). GDPR Art. 20 grants the data subject the right to receive personal data in a "structured, commonly used and machine-readable format" and to transmit it to another controller. CCPA grants a parallel right under §1798.110/.130. Both apply.
|
|
186
|
+
|
|
187
|
+
What to grep:
|
|
188
|
+
```
|
|
189
|
+
export_user_data
|
|
190
|
+
download_my_data
|
|
191
|
+
data_export
|
|
192
|
+
portability
|
|
193
|
+
/api/users/export
|
|
194
|
+
/account/download
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Flag when:
|
|
198
|
+
- No data export endpoint or function exists in the codebase
|
|
199
|
+
- Export function exists but omits tables (check it covers all PII tables — see DL-02 cascade audit)
|
|
200
|
+
- Export format is not machine-readable (Art. 20 + CCPA both require structured format)
|
|
201
|
+
- Export omits data subject fields obtainable under Art. 15 right of access (which is broader than Art. 20 portability)
|
|
202
|
+
|
|
203
|
+
Why it matters: GDPR Art. 20 is enforceable independently of Art. 15 access requests. CCPA aligns. Without an automatable export endpoint, every DSAR becomes a manual SQL job — and the gate at FR4.3 (`GDPR-Art-17`) cannot verify deletability without evidence of complete enumeration first.
|
|
204
|
+
|
|
205
|
+
Fix pattern:
|
|
206
|
+
```javascript
|
|
207
|
+
// Minimum viable GDPR Art. 20 + CCPA data export
|
|
208
|
+
app.get('/api/account/export', auth, async (req, res) => {
|
|
209
|
+
const userId = req.user.id
|
|
210
|
+
|
|
211
|
+
const [user, orders, addresses, activityLog] = await Promise.all([
|
|
212
|
+
User.findById(userId).select('-password_hash -ssn_encrypted'),
|
|
213
|
+
Order.findAll({ where: { user_id: userId } }),
|
|
214
|
+
Address.findAll({ where: { user_id: userId } }),
|
|
215
|
+
ActivityLog.findAll({ where: { user_id: userId } })
|
|
216
|
+
])
|
|
217
|
+
|
|
218
|
+
const export_data = {
|
|
219
|
+
exported_at: new Date().toISOString(),
|
|
220
|
+
profile: user,
|
|
221
|
+
orders,
|
|
222
|
+
addresses,
|
|
223
|
+
activity: activityLog
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
res.setHeader('Content-Disposition', 'attachment; filename="my-data.json"')
|
|
227
|
+
res.setHeader('Content-Type', 'application/json')
|
|
228
|
+
res.json(export_data)
|
|
229
|
+
|
|
230
|
+
// Log the export request for audit trail
|
|
231
|
+
await AuditLog.create({ user_id: userId, action: 'data_export_requested' })
|
|
232
|
+
})
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Regulation: GDPR Art. 20 (right to data portability), GDPR Art. 15 (right of access), CCPA §1798.110/.130, CPRA
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## DL-05: No Retention Policy Enforcement in Code
|
|
240
|
+
|
|
241
|
+
What to grep:
|
|
242
|
+
```
|
|
243
|
+
created_at (check if old records are ever purged)
|
|
244
|
+
expires_at (check if expiry is actually enforced)
|
|
245
|
+
purge_at
|
|
246
|
+
scheduled_deletion
|
|
247
|
+
cron (check if cleanup jobs exist)
|
|
248
|
+
sidekiq (check for cleanup workers)
|
|
249
|
+
celery (check for cleanup tasks)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Flag when:
|
|
253
|
+
- PII tables have no cleanup job or scheduled purge
|
|
254
|
+
- `expires_at` field exists but no code actually checks or enforces it
|
|
255
|
+
- Session table grows unboundedly (no cleanup of expired sessions)
|
|
256
|
+
- Audit logs accumulate forever with no retention limit
|
|
257
|
+
|
|
258
|
+
Fix pattern:
|
|
259
|
+
```javascript
|
|
260
|
+
// Retention enforcement job (run nightly via cron/Sidekiq/Celery)
|
|
261
|
+
async function enforceRetentionPolicies() {
|
|
262
|
+
const now = new Date()
|
|
263
|
+
|
|
264
|
+
// Expired sessions
|
|
265
|
+
await Session.destroy({
|
|
266
|
+
where: { expires_at: { [Op.lt]: now } }
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
// Audit logs older than 2 years
|
|
270
|
+
const twoYearsAgo = new Date(now - 2 * 365 * 24 * 3600000)
|
|
271
|
+
await AuditLog.destroy({
|
|
272
|
+
where: { created_at: { [Op.lt]: twoYearsAgo } }
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
// Soft-deleted users past grace period
|
|
276
|
+
await purgeDeletedUsers()
|
|
277
|
+
|
|
278
|
+
// Unverified accounts older than 30 days (never activated)
|
|
279
|
+
const thirtyDaysAgo = new Date(now - 30 * 24 * 3600000)
|
|
280
|
+
await User.destroy({
|
|
281
|
+
where: {
|
|
282
|
+
email_verified_at: null,
|
|
283
|
+
created_at: { [Op.lt]: thirtyDaysAgo }
|
|
284
|
+
},
|
|
285
|
+
force: true
|
|
286
|
+
})
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Regulation: CCPA, HIPAA, GLBA
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## DL-06: PII in Database Backups Without Encryption
|
|
295
|
+
|
|
296
|
+
What to grep:
|
|
297
|
+
```
|
|
298
|
+
pg_dump
|
|
299
|
+
mysqldump
|
|
300
|
+
mongodump
|
|
301
|
+
backup
|
|
302
|
+
db:backup
|
|
303
|
+
rake db:dump
|
|
304
|
+
s3.upload (near backup-related code)
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Flag when:
|
|
308
|
+
- Backup scripts run without encryption flag
|
|
309
|
+
- Backup files uploaded to S3 without server-side encryption
|
|
310
|
+
- Backup destination is publicly accessible bucket
|
|
311
|
+
- No TTL/lifecycle policy on backup files (kept indefinitely)
|
|
312
|
+
|
|
313
|
+
Fix pattern:
|
|
314
|
+
```bash
|
|
315
|
+
# Wrong
|
|
316
|
+
pg_dump mydb > backup.sql
|
|
317
|
+
aws s3 cp backup.sql s3://my-backups/
|
|
318
|
+
|
|
319
|
+
# Right
|
|
320
|
+
pg_dump mydb | gzip | \
|
|
321
|
+
openssl enc -aes-256-cbc -pass env:BACKUP_ENCRYPTION_KEY | \
|
|
322
|
+
aws s3 cp - s3://my-backups/backup-$(date +%Y%m%d).sql.gz.enc \
|
|
323
|
+
--sse AES256 \
|
|
324
|
+
--storage-class STANDARD_IA
|
|
325
|
+
|
|
326
|
+
# S3 bucket policy: block public access
|
|
327
|
+
# S3 lifecycle rule: delete backups older than 90 days
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
```javascript
|
|
331
|
+
// In application backup code
|
|
332
|
+
await s3.putObject({
|
|
333
|
+
Bucket: 'my-backups',
|
|
334
|
+
Key: `backup-${Date.now()}.sql.gz`,
|
|
335
|
+
Body: encryptedBackupStream,
|
|
336
|
+
ServerSideEncryption: 'AES256',
|
|
337
|
+
ACL: 'private', // never public
|
|
338
|
+
})
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Regulation: HIPAA, PCI-DSS, CCPA, GLBA
|