@soleur/opencode 0.0.0-stage → 1.0.0
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 +659 -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 +108 -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 +342 -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 +152 -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 +493 -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 +363 -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 +520 -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 +113 -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 +178 -0
- package/scripts/sync-opencode-adapter.ts +479 -0
- package/scripts/sync-pr-behind.sh +534 -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 +65 -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 +142 -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 +118 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -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 +668 -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 +325 -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 +138 -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 +1621 -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-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +95 -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 +3022 -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/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/detached-battery-verdict.md +13 -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 +149 -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/work/SKILL.md +1479 -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,355 @@
|
|
|
1
|
+
<!-- Adapted from gosprinto/compliance-skills (MIT) — see NOTICE -->
|
|
2
|
+
# Layer: API Layer
|
|
3
|
+
|
|
4
|
+
## When This Layer Loads
|
|
5
|
+
|
|
6
|
+
Auto-trigger inline when Claude is about to generate:
|
|
7
|
+
- Any REST route handler or controller action
|
|
8
|
+
- Any GraphQL resolver, query, or mutation
|
|
9
|
+
- Any serializer, DTO, or response shaping code
|
|
10
|
+
- Any endpoint that fetches, updates, or returns user data
|
|
11
|
+
- Any bulk data endpoint or admin panel query
|
|
12
|
+
- Any error response handler
|
|
13
|
+
|
|
14
|
+
Also loads during full repo scan.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## AP-01: Full Object Returned in API Response
|
|
19
|
+
|
|
20
|
+
What to grep:
|
|
21
|
+
```
|
|
22
|
+
res.json(user)
|
|
23
|
+
res.json(req.user)
|
|
24
|
+
render json: @user
|
|
25
|
+
jsonify(user)
|
|
26
|
+
return user
|
|
27
|
+
JSON.stringify(user)
|
|
28
|
+
res.send(user)
|
|
29
|
+
serialize(user) (check what fields are included)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Flag when:
|
|
33
|
+
- Full model object returned without field selection
|
|
34
|
+
- `password_hash`, `ssn`, `api_key`, or sensitive fields in response
|
|
35
|
+
- `SELECT *` used in query that feeds into response
|
|
36
|
+
- Serializer includes all fields by default
|
|
37
|
+
|
|
38
|
+
Fix pattern:
|
|
39
|
+
```javascript
|
|
40
|
+
// Wrong
|
|
41
|
+
app.get('/api/profile', auth, async (req, res) => {
|
|
42
|
+
const user = await User.findById(req.user.id)
|
|
43
|
+
res.json(user) // returns password_hash, ssn, internal_score, everything
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Right — explicit field selection at query AND response level
|
|
47
|
+
app.get('/api/profile', auth, async (req, res) => {
|
|
48
|
+
const user = await User.findById(req.user.id)
|
|
49
|
+
.select('id name email createdAt') // only what client needs
|
|
50
|
+
res.json({
|
|
51
|
+
id: user.id,
|
|
52
|
+
name: user.name,
|
|
53
|
+
email: user.email
|
|
54
|
+
// explicit — nothing slips through accidentally
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Regulation: CCPA, HIPAA (minimum necessary), GLBA
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## AP-02: Missing Ownership Check (IDOR)
|
|
64
|
+
|
|
65
|
+
What to grep:
|
|
66
|
+
```
|
|
67
|
+
req.params.id
|
|
68
|
+
req.params.userId
|
|
69
|
+
params[:id]
|
|
70
|
+
request.GET['id']
|
|
71
|
+
findById(req.params.id)
|
|
72
|
+
findOne({ id: req.params.id })
|
|
73
|
+
User.find(params[:id])
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Flag when:
|
|
77
|
+
- Record fetched by ID from URL param without verifying requester owns it
|
|
78
|
+
- No check that `req.user.id === record.userId`
|
|
79
|
+
- Admin check missing — non-admins can access any record by guessing ID
|
|
80
|
+
|
|
81
|
+
Why it matters: IDOR (Insecure Direct Object Reference) lets any authenticated
|
|
82
|
+
user access any other user's PII by changing the ID in the URL.
|
|
83
|
+
`/api/users/123/profile` → change to `/api/users/124/profile` → other user's data.
|
|
84
|
+
|
|
85
|
+
Fix pattern:
|
|
86
|
+
```javascript
|
|
87
|
+
// Wrong
|
|
88
|
+
app.get('/api/users/:id', auth, async (req, res) => {
|
|
89
|
+
const user = await User.findById(req.params.id) // no ownership check
|
|
90
|
+
res.json(user)
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
// Right
|
|
94
|
+
app.get('/api/users/:id', auth, async (req, res) => {
|
|
95
|
+
// Verify ownership — requester can only access their own record
|
|
96
|
+
if (req.params.id !== req.user.id && !req.user.isAdmin) {
|
|
97
|
+
return res.status(403).json({ error: 'Forbidden' })
|
|
98
|
+
}
|
|
99
|
+
const user = await User.findById(req.params.id).select('id name email')
|
|
100
|
+
res.json(user)
|
|
101
|
+
})
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Regulation: CCPA, HIPAA, FTC Act
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## AP-03: GraphQL Introspection Enabled in Production
|
|
109
|
+
|
|
110
|
+
What to grep:
|
|
111
|
+
```
|
|
112
|
+
introspection:
|
|
113
|
+
introspection: true
|
|
114
|
+
NODE_ENV !== 'production' (check if introspection gated on this)
|
|
115
|
+
ApolloServer({
|
|
116
|
+
buildSchema(
|
|
117
|
+
makeExecutableSchema(
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Flag when:
|
|
121
|
+
- `introspection: true` set unconditionally
|
|
122
|
+
- No environment check before enabling introspection
|
|
123
|
+
- No query depth limiting (allows deeply nested queries to extract data)
|
|
124
|
+
|
|
125
|
+
Why it matters: Introspection exposes your full data model — every type,
|
|
126
|
+
field name, and relationship — to anyone who can reach the endpoint.
|
|
127
|
+
This reveals your PII field names and data structure to attackers.
|
|
128
|
+
|
|
129
|
+
Fix pattern:
|
|
130
|
+
```javascript
|
|
131
|
+
// Wrong
|
|
132
|
+
const server = new ApolloServer({
|
|
133
|
+
schema,
|
|
134
|
+
introspection: true // always on
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// Right
|
|
138
|
+
const server = new ApolloServer({
|
|
139
|
+
schema,
|
|
140
|
+
introspection: process.env.NODE_ENV !== 'production',
|
|
141
|
+
plugins: [
|
|
142
|
+
ApolloServerPluginLandingPageDisabledPlugin() // disable playground in prod
|
|
143
|
+
]
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
// Also add query depth limiting
|
|
147
|
+
import depthLimit from 'graphql-depth-limit'
|
|
148
|
+
const server = new ApolloServer({
|
|
149
|
+
schema,
|
|
150
|
+
validationRules: [depthLimit(5)]
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Regulation: FTC Act, CCPA (data exposure risk)
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## AP-04: Bulk Endpoint Returns All Records Without Scoping
|
|
159
|
+
|
|
160
|
+
What to grep:
|
|
161
|
+
```
|
|
162
|
+
User.findAll()
|
|
163
|
+
User.all
|
|
164
|
+
User.find({})
|
|
165
|
+
db.users.find({})
|
|
166
|
+
SELECT * FROM users
|
|
167
|
+
.findMany() (without where clause)
|
|
168
|
+
Model.objects.all()
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Flag when:
|
|
172
|
+
- Endpoint returns all users/records without auth scoping
|
|
173
|
+
- No `WHERE user_id = ?` limiting results to requester's own data
|
|
174
|
+
- Admin list endpoints accessible without admin role check
|
|
175
|
+
- No pagination (allows full data extraction in one call)
|
|
176
|
+
|
|
177
|
+
Fix pattern:
|
|
178
|
+
```javascript
|
|
179
|
+
// Wrong
|
|
180
|
+
app.get('/api/users', auth, async (req, res) => {
|
|
181
|
+
const users = await User.findAll() // returns everyone's data
|
|
182
|
+
res.json(users)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
// Right
|
|
186
|
+
app.get('/api/users', auth, requireAdmin, async (req, res) => {
|
|
187
|
+
const users = await User.findAll({
|
|
188
|
+
attributes: ['id', 'name', 'email', 'createdAt'], // no sensitive fields
|
|
189
|
+
limit: req.query.limit || 50, // always paginate
|
|
190
|
+
offset: req.query.offset || 0,
|
|
191
|
+
order: [['createdAt', 'DESC']]
|
|
192
|
+
})
|
|
193
|
+
res.json({ users, total: await User.count() })
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
// For non-admin endpoints — scope to requester only
|
|
197
|
+
app.get('/api/my/data', auth, async (req, res) => {
|
|
198
|
+
const records = await Record.findAll({
|
|
199
|
+
where: { userId: req.user.id } // always scope to current user
|
|
200
|
+
})
|
|
201
|
+
res.json(records)
|
|
202
|
+
})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Regulation: CCPA, HIPAA, FTC Act
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## AP-05: PII Returned in Error Messages
|
|
210
|
+
|
|
211
|
+
What to grep:
|
|
212
|
+
```
|
|
213
|
+
`User ${email} not found`
|
|
214
|
+
`Email ${req.body.email} already exists`
|
|
215
|
+
`Invalid password for ${username}`
|
|
216
|
+
`Account ${ssn} not found`
|
|
217
|
+
res.json({ error: `${email}
|
|
218
|
+
res.status(404).json({ message: `User ${
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Flag when:
|
|
222
|
+
- Email or username confirmed in error response (account enumeration)
|
|
223
|
+
- PII reflected back in error messages
|
|
224
|
+
- Database error messages forwarded to client (may contain field values)
|
|
225
|
+
|
|
226
|
+
Fix pattern:
|
|
227
|
+
```javascript
|
|
228
|
+
// Wrong
|
|
229
|
+
if (!user) {
|
|
230
|
+
return res.status(404).json({ error: `User ${email} not found` })
|
|
231
|
+
}
|
|
232
|
+
if (existingUser) {
|
|
233
|
+
return res.status(409).json({ error: `Email ${email} already registered` })
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Right — generic messages that don't confirm PII or account existence
|
|
237
|
+
if (!user || !validPassword) {
|
|
238
|
+
return res.status(401).json({ error: 'Invalid credentials' })
|
|
239
|
+
// Same message whether user doesn't exist or password is wrong
|
|
240
|
+
}
|
|
241
|
+
if (existingUser) {
|
|
242
|
+
return res.status(409).json({ error: 'An account with this email already exists' })
|
|
243
|
+
// OK to confirm email taken at registration — but not at login
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Regulation: CCPA, FTC Act, HIPAA
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## AP-06: Rate Limiting Missing on Auth / PII Endpoints
|
|
252
|
+
|
|
253
|
+
What to grep:
|
|
254
|
+
```
|
|
255
|
+
app.post('/login'
|
|
256
|
+
app.post('/forgot-password'
|
|
257
|
+
app.post('/reset-password'
|
|
258
|
+
app.get('/api/users/:id'
|
|
259
|
+
app.post('/api/verify'
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Flag when:
|
|
263
|
+
- Login endpoint has no rate limiting (brute force risk)
|
|
264
|
+
- Password reset endpoint has no rate limiting (enumeration risk)
|
|
265
|
+
- PII lookup endpoints have no rate limiting (scraping risk)
|
|
266
|
+
- No `express-rate-limit`, `rack-attack`, `django-ratelimit`, or equivalent
|
|
267
|
+
|
|
268
|
+
Fix pattern:
|
|
269
|
+
```javascript
|
|
270
|
+
// Add to auth-sensitive routes
|
|
271
|
+
import rateLimit from 'express-rate-limit'
|
|
272
|
+
|
|
273
|
+
const authLimiter = rateLimit({
|
|
274
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
275
|
+
max: 10, // 10 attempts per window
|
|
276
|
+
message: { error: 'Too many attempts, please try again later' },
|
|
277
|
+
standardHeaders: true,
|
|
278
|
+
legacyHeaders: false,
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
app.post('/login', authLimiter, loginHandler)
|
|
282
|
+
app.post('/forgot-password', authLimiter, forgotPasswordHandler)
|
|
283
|
+
app.post('/api/verify', authLimiter, verifyHandler)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Regulation: FTC Act, PCI-DSS, HIPAA
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## AP-07: CORS Misconfiguration
|
|
291
|
+
|
|
292
|
+
What to grep:
|
|
293
|
+
```
|
|
294
|
+
origin: '*'
|
|
295
|
+
origin: true
|
|
296
|
+
cors({ origin: '*'
|
|
297
|
+
corsOptions = { origin: '*'
|
|
298
|
+
allow_all_origins = True (Django)
|
|
299
|
+
CORS_ALLOW_ALL_ORIGINS = True (Django)
|
|
300
|
+
config.allow_origins = ["*"] (FastAPI)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Flag when:
|
|
304
|
+
- `origin: '*'` on any API that handles authenticated requests
|
|
305
|
+
- `origin: true` (reflects any origin) on credentialed endpoints
|
|
306
|
+
- No `credentials: true` check alongside wildcard origin
|
|
307
|
+
- Different CORS policy for dev vs prod not enforced
|
|
308
|
+
|
|
309
|
+
Why it matters: A wildcard CORS origin on an authenticated API allows any
|
|
310
|
+
website to make credentialed requests on behalf of your users — reading
|
|
311
|
+
their data, performing actions. One of the most common misconfigurations
|
|
312
|
+
that leads to data exposure.
|
|
313
|
+
|
|
314
|
+
Fix pattern:
|
|
315
|
+
```javascript
|
|
316
|
+
// Wrong
|
|
317
|
+
app.use(cors({ origin: '*' })) // allows any domain
|
|
318
|
+
|
|
319
|
+
// Wrong — reflects any origin
|
|
320
|
+
app.use(cors({ origin: true, credentials: true }))
|
|
321
|
+
|
|
322
|
+
// Right
|
|
323
|
+
const allowedOrigins = [
|
|
324
|
+
'https://app.yourcompany.com',
|
|
325
|
+
'https://www.yourcompany.com',
|
|
326
|
+
...(process.env.NODE_ENV === 'development' ? ['http://localhost:3000'] : [])
|
|
327
|
+
]
|
|
328
|
+
|
|
329
|
+
app.use(cors({
|
|
330
|
+
origin: (origin, callback) => {
|
|
331
|
+
if (!origin || allowedOrigins.includes(origin)) {
|
|
332
|
+
callback(null, true)
|
|
333
|
+
} else {
|
|
334
|
+
callback(new Error(`CORS blocked: ${origin}`))
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
credentials: true
|
|
338
|
+
}))
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
```python
|
|
342
|
+
# Wrong (FastAPI)
|
|
343
|
+
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True)
|
|
344
|
+
|
|
345
|
+
# Right
|
|
346
|
+
app.add_middleware(
|
|
347
|
+
CORSMiddleware,
|
|
348
|
+
allow_origins=["https://app.yourcompany.com"],
|
|
349
|
+
allow_credentials=True,
|
|
350
|
+
allow_methods=["GET", "POST", "PUT", "DELETE"],
|
|
351
|
+
allow_headers=["*"],
|
|
352
|
+
)
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Regulation: FTC Act, CCPA (data exposure via cross-origin request)
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
<!-- Adapted from gosprinto/compliance-skills (MIT) — see NOTICE -->
|
|
2
|
+
# Layer: Auth & Sessions
|
|
3
|
+
|
|
4
|
+
## When This Layer Loads
|
|
5
|
+
|
|
6
|
+
Auto-trigger inline when Claude is about to generate:
|
|
7
|
+
- A login, logout, signup, or registration flow
|
|
8
|
+
- Any JWT creation, signing, or verification code
|
|
9
|
+
- Any token (access, refresh, reset, API key) generation or storage
|
|
10
|
+
- Any session creation, validation, or invalidation
|
|
11
|
+
- OAuth / SSO integration code
|
|
12
|
+
- Password reset or MFA / OTP flows
|
|
13
|
+
- Any `auth`, `session`, `token`, or `credential` handling
|
|
14
|
+
|
|
15
|
+
Also loads during full repo scan.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## A-01: PII in JWT Payload
|
|
20
|
+
|
|
21
|
+
What to grep:
|
|
22
|
+
```
|
|
23
|
+
jwt.sign(
|
|
24
|
+
jsonwebtoken.sign(
|
|
25
|
+
JWT.encode(
|
|
26
|
+
jose.SignJWT(
|
|
27
|
+
sign(payload
|
|
28
|
+
new SignJWT({
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Flag when:
|
|
32
|
+
- PII fields in JWT payload: `{ email, name, ssn, dob, role, phone }`
|
|
33
|
+
- Health or financial data in token
|
|
34
|
+
- Full user object signed into JWT
|
|
35
|
+
|
|
36
|
+
Why it matters: JWT payloads are base64-encoded, not encrypted. Anyone who
|
|
37
|
+
intercepts or decodes the token can read every field in the payload.
|
|
38
|
+
`atob(token.split('.')[1])` in any browser reveals it all.
|
|
39
|
+
|
|
40
|
+
Fix pattern:
|
|
41
|
+
```javascript
|
|
42
|
+
// Wrong
|
|
43
|
+
const token = jwt.sign({
|
|
44
|
+
userId: user.id,
|
|
45
|
+
email: user.email, // PII — readable by anyone
|
|
46
|
+
role: user.role,
|
|
47
|
+
ssn: user.ssn, // critical — never in JWT
|
|
48
|
+
plan: user.plan
|
|
49
|
+
}, secret)
|
|
50
|
+
|
|
51
|
+
// Right — opaque ID only, look up everything else server-side
|
|
52
|
+
const token = jwt.sign({
|
|
53
|
+
sub: user.id, // subject — opaque ID only
|
|
54
|
+
iat: Date.now(),
|
|
55
|
+
exp: Date.now() + 3600 // always set expiry
|
|
56
|
+
}, secret)
|
|
57
|
+
// Fetch user.email, user.role from DB on each request using sub
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Regulation: CCPA, HIPAA (if health data in token), FTC Act
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## A-02: Token Stored in localStorage
|
|
65
|
+
|
|
66
|
+
What to grep:
|
|
67
|
+
```
|
|
68
|
+
localStorage.setItem('token'
|
|
69
|
+
localStorage.setItem('jwt'
|
|
70
|
+
localStorage.setItem('access_token'
|
|
71
|
+
localStorage.setItem('auth'
|
|
72
|
+
sessionStorage.setItem('token'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Flag when:
|
|
76
|
+
- Any auth token stored in localStorage or sessionStorage
|
|
77
|
+
- JWT, access token, refresh token, or API key in client-side storage
|
|
78
|
+
|
|
79
|
+
Why it matters: localStorage is accessible to any JavaScript on the page.
|
|
80
|
+
An XSS vulnerability anywhere on the domain exposes all tokens.
|
|
81
|
+
|
|
82
|
+
Fix pattern:
|
|
83
|
+
```javascript
|
|
84
|
+
// Wrong
|
|
85
|
+
localStorage.setItem('token', accessToken)
|
|
86
|
+
|
|
87
|
+
// Right — server sets HttpOnly cookie, JS never touches the token
|
|
88
|
+
// Server-side:
|
|
89
|
+
res.cookie('access_token', token, {
|
|
90
|
+
httpOnly: true,
|
|
91
|
+
secure: true,
|
|
92
|
+
sameSite: 'strict',
|
|
93
|
+
maxAge: 3600000
|
|
94
|
+
})
|
|
95
|
+
// Client-side: token is sent automatically with requests, JS can't read it
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Regulation: CCPA, FTC Act, PCI-DSS
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## A-03: No Token Expiry
|
|
103
|
+
|
|
104
|
+
What to grep:
|
|
105
|
+
```
|
|
106
|
+
jwt.sign({ (check for missing exp/expiresIn)
|
|
107
|
+
expiresIn: (check value — flag if > 24h for access tokens)
|
|
108
|
+
jwt.sign(payload, secret) (no options = no expiry)
|
|
109
|
+
createToken( (check implementation)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Flag when:
|
|
113
|
+
- JWT signed with no `exp` or `expiresIn`
|
|
114
|
+
- `expiresIn` set to days/weeks for access tokens (> 24h)
|
|
115
|
+
- Refresh tokens with no expiry at all
|
|
116
|
+
- Session tokens with no `maxAge` or `expires`
|
|
117
|
+
|
|
118
|
+
Fix pattern:
|
|
119
|
+
```javascript
|
|
120
|
+
// Wrong
|
|
121
|
+
const token = jwt.sign({ sub: user.id }, secret) // no expiry — lives forever
|
|
122
|
+
|
|
123
|
+
// Right
|
|
124
|
+
const accessToken = jwt.sign({ sub: user.id }, secret, { expiresIn: '15m' })
|
|
125
|
+
const refreshToken = jwt.sign({ sub: user.id }, refreshSecret, { expiresIn: '7d' })
|
|
126
|
+
// Refresh tokens stored in DB so they can be revoked
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Regulation: FTC Act, PCI-DSS (session timeout requirements)
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## A-04: Password Reset Tokens — Single-Use Not Enforced
|
|
134
|
+
|
|
135
|
+
What to grep:
|
|
136
|
+
```
|
|
137
|
+
reset_token
|
|
138
|
+
password_reset_token
|
|
139
|
+
forgot_password
|
|
140
|
+
resetToken
|
|
141
|
+
verifyToken(
|
|
142
|
+
findOne({ reset_token:
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Flag when:
|
|
146
|
+
- Reset token stored but no `used_at` or `expires_at` field
|
|
147
|
+
- Token not invalidated after use (can be reused)
|
|
148
|
+
- Token expiry too long (> 1 hour is too long for password reset)
|
|
149
|
+
- Token stored as plaintext (should be hashed like a password)
|
|
150
|
+
|
|
151
|
+
Fix pattern:
|
|
152
|
+
```javascript
|
|
153
|
+
// Wrong
|
|
154
|
+
await User.update({ reset_token: token }, { where: { id: userId } })
|
|
155
|
+
// Token never expires, never marked used
|
|
156
|
+
|
|
157
|
+
// Right
|
|
158
|
+
await User.update({
|
|
159
|
+
reset_token_hash: await bcrypt.hash(token, 12), // hash it
|
|
160
|
+
reset_token_expires_at: new Date(Date.now() + 3600000), // 1 hour
|
|
161
|
+
reset_token_used_at: null
|
|
162
|
+
}, { where: { id: userId } })
|
|
163
|
+
|
|
164
|
+
// On use:
|
|
165
|
+
await User.update({
|
|
166
|
+
reset_token_hash: null,
|
|
167
|
+
reset_token_expires_at: null,
|
|
168
|
+
reset_token_used_at: new Date()
|
|
169
|
+
}, { where: { id: userId } })
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Regulation: FTC Act, HIPAA (for health platforms)
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## A-05: OAuth Scope Over-Request
|
|
177
|
+
|
|
178
|
+
What to grep:
|
|
179
|
+
```
|
|
180
|
+
scope:
|
|
181
|
+
scopes:
|
|
182
|
+
'https://www.googleapis.com/auth/
|
|
183
|
+
offline_access
|
|
184
|
+
openid profile email
|
|
185
|
+
passport.use(
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Flag when:
|
|
189
|
+
- Requesting `offline_access` when refresh tokens aren't needed
|
|
190
|
+
- Requesting full profile scope when only email is used
|
|
191
|
+
- Google: requesting drive, calendar, or contacts when only email needed
|
|
192
|
+
- GitHub: requesting `repo` (full repo access) when only user info needed
|
|
193
|
+
|
|
194
|
+
Fix pattern:
|
|
195
|
+
```javascript
|
|
196
|
+
// Wrong
|
|
197
|
+
const scopes = ['openid', 'profile', 'email', 'offline_access',
|
|
198
|
+
'https://www.googleapis.com/auth/drive']
|
|
199
|
+
|
|
200
|
+
// Right — request only what you actually use
|
|
201
|
+
const scopes = ['openid', 'email']
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Regulation: FTC Act (data minimization principle), CCPA
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## A-06: Session Not Invalidated on Logout
|
|
209
|
+
|
|
210
|
+
What to grep:
|
|
211
|
+
```
|
|
212
|
+
app.post('/logout'
|
|
213
|
+
router.post('/logout'
|
|
214
|
+
def logout(
|
|
215
|
+
async logout(
|
|
216
|
+
signOut(
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Flag when:
|
|
220
|
+
- Logout only deletes client-side cookie/token without server-side invalidation
|
|
221
|
+
- No session store deletion on logout
|
|
222
|
+
- JWT-based auth with no token blocklist or short enough expiry
|
|
223
|
+
|
|
224
|
+
Fix pattern:
|
|
225
|
+
```javascript
|
|
226
|
+
// Wrong — client-side only logout
|
|
227
|
+
app.post('/logout', (req, res) => {
|
|
228
|
+
res.clearCookie('session') // cookie gone but server doesn't know
|
|
229
|
+
res.json({ success: true })
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
// Right — invalidate server-side too
|
|
233
|
+
app.post('/logout', async (req, res) => {
|
|
234
|
+
const token = req.cookies.session
|
|
235
|
+
await SessionStore.delete(token) // invalidate in DB/Redis
|
|
236
|
+
await TokenBlocklist.add(token) // blocklist if JWT
|
|
237
|
+
res.clearCookie('session', { httpOnly: true, secure: true })
|
|
238
|
+
res.json({ success: true })
|
|
239
|
+
})
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Regulation: FTC Act, PCI-DSS, HIPAA
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## A-07: MFA / OTP Codes Stored Plaintext or Without Expiry
|
|
247
|
+
|
|
248
|
+
What to grep:
|
|
249
|
+
```
|
|
250
|
+
otp_code
|
|
251
|
+
mfa_code
|
|
252
|
+
verification_code
|
|
253
|
+
two_factor_code
|
|
254
|
+
totp_secret
|
|
255
|
+
backup_codes
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Flag when:
|
|
259
|
+
- OTP stored as plaintext integer/string without expiry
|
|
260
|
+
- TOTP secret stored without encryption
|
|
261
|
+
- Backup codes stored plaintext (should be hashed like passwords)
|
|
262
|
+
- No `expires_at` on OTP codes
|
|
263
|
+
|
|
264
|
+
Fix pattern:
|
|
265
|
+
```javascript
|
|
266
|
+
// Wrong
|
|
267
|
+
await User.update({ otp_code: 123456 }, { where: { id: userId } })
|
|
268
|
+
|
|
269
|
+
// Right
|
|
270
|
+
await User.update({
|
|
271
|
+
otp_code_hash: await bcrypt.hash('123456', 12), // hash it
|
|
272
|
+
otp_expires_at: new Date(Date.now() + 600000), // 10 min max
|
|
273
|
+
otp_attempts: 0 // rate limit attempts
|
|
274
|
+
}, { where: { id: userId } })
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Regulation: FTC Act, HIPAA, PCI-DSS
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## EU extension — Art. 32(1)(b) confidentiality
|
|
282
|
+
|
|
283
|
+
A-01..A-07 are Soleur-extended for the EU regime under GDPR Art. 32(1)(b)
|
|
284
|
+
("the ability to ensure the ongoing confidentiality, integrity, availability
|
|
285
|
+
and resilience of processing systems and services"). Storing PII in JWT
|
|
286
|
+
payloads, leaking session tokens to logs, or persisting OTP secrets in plain
|
|
287
|
+
text are confidentiality failures under Art. 32 even when no other GDPR
|
|
288
|
+
article fires. Treat A-01..A-07 findings as Art. 32 candidates regardless of
|
|
289
|
+
whether a separate Art. 6 / Art. 9 / Art. 32 finding has already been raised
|
|
290
|
+
on the same diff.
|