@mrciphersmith/keryx 0.2.9
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/LICENSE +21 -0
- package/README.md +351 -0
- package/dist/cli.js +48427 -0
- package/dist/proxy-worker.js +381 -0
- package/package.json +63 -0
- package/src/gdgraph/affected.test.ts +100 -0
- package/src/gdgraph/affected.ts +135 -0
- package/src/gdgraph/build-integrity.test.ts +193 -0
- package/src/gdgraph/build-lang.test.ts +399 -0
- package/src/gdgraph/build.test.ts +120 -0
- package/src/gdgraph/build.ts +804 -0
- package/src/gdgraph/config.test.ts +47 -0
- package/src/gdgraph/config.ts +113 -0
- package/src/gdgraph/core-sources.test.ts +99 -0
- package/src/gdgraph/core-sources.ts +20 -0
- package/src/gdgraph/enrich.ts +79 -0
- package/src/gdgraph/fallback.test.ts +153 -0
- package/src/gdgraph/find.test.ts +78 -0
- package/src/gdgraph/find.ts +107 -0
- package/src/gdgraph/pagerank.ts +129 -0
- package/src/gdgraph/path.test.ts +56 -0
- package/src/gdgraph/path.ts +112 -0
- package/src/gdgraph/query.ts +133 -0
- package/src/gdgraph/repomap.test.ts +110 -0
- package/src/gdgraph/repomap.ts +193 -0
- package/src/gdgraph/service.test.ts +59 -0
- package/src/gdgraph/service.ts +51 -0
- package/src/gdgraph/staleness.ts +20 -0
- package/src/gdgraph/symbol.test.ts +89 -0
- package/src/gdgraph/symbol.ts +123 -0
- package/src/gdgraph/symbols-capability.test.ts +41 -0
- package/src/gdgraph/symbols-capability.ts +49 -0
- package/src/gdgraph/target.ts +56 -0
- package/src/gdgraph/treesitter/adapter.test.ts +249 -0
- package/src/gdgraph/treesitter/adapter.ts +213 -0
- package/src/gdgraph/treesitter/extract.test.ts +278 -0
- package/src/gdgraph/treesitter/extract.ts +389 -0
- package/src/gdgraph/treesitter/grammars.ts +110 -0
- package/src/gdgraph/treesitter/no-treesitter-import.test.ts +51 -0
- package/src/gdgraph/treesitter/resolve-calls.test.ts +38 -0
- package/src/gdgraph/types.ts +63 -0
- package/src/gdskills/bundled/rules/core/api-contracts.mdc +148 -0
- package/src/gdskills/bundled/rules/core/async-patterns.mdc +185 -0
- package/src/gdskills/bundled/rules/core/clean-architecture.mdc +163 -0
- package/src/gdskills/bundled/rules/core/code-review-ai-assistant.mdc +49 -0
- package/src/gdskills/bundled/rules/core/code-review-b091-profile.mdc +48 -0
- package/src/gdskills/bundled/rules/core/code-style-patterns.mdc +54 -0
- package/src/gdskills/bundled/rules/core/commit-message-formatting.mdc +25 -0
- package/src/gdskills/bundled/rules/core/database-patterns.mdc +162 -0
- package/src/gdskills/bundled/rules/core/documentation-management.mdc +106 -0
- package/src/gdskills/bundled/rules/core/error-handling.mdc +163 -0
- package/src/gdskills/bundled/rules/core/execution-metrics.md +99 -0
- package/src/gdskills/bundled/rules/core/frontend-assistant.mdc +40 -0
- package/src/gdskills/bundled/rules/core/git-rules.mdc +37 -0
- package/src/gdskills/bundled/rules/core/gproject-contracts.mdc +198 -0
- package/src/gdskills/bundled/rules/core/implementation-doc-mandate.mdc +149 -0
- package/src/gdskills/bundled/rules/core/implementation-plans.mdc +58 -0
- package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +221 -0
- package/src/gdskills/bundled/rules/core/mobx-store-template.mdc +561 -0
- package/src/gdskills/bundled/rules/core/model-selection.mdc +53 -0
- package/src/gdskills/bundled/rules/core/nestjs-dto.mdc +50 -0
- package/src/gdskills/bundled/rules/core/playwright-testing.mdc +321 -0
- package/src/gdskills/bundled/rules/core/requirements-management.mdc +35 -0
- package/src/gdskills/bundled/rules/core/requirements-package-standard.mdc +103 -0
- package/src/gdskills/bundled/rules/core/review-agent-profile.mdc +49 -0
- package/src/gdskills/bundled/rules/core/review-strict-profile.mdc +44 -0
- package/src/gdskills/bundled/rules/core/rule-management-workflow.mdc +62 -0
- package/src/gdskills/bundled/rules/core/security-baseline.mdc +155 -0
- package/src/gdskills/bundled/rules/core/shared-definitions.mdc +79 -0
- package/src/gdskills/bundled/rules/core/skill-lifecycle.mdc +55 -0
- package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +88 -0
- package/src/gdskills/bundled/rules/core/solid-principles.mdc +149 -0
- package/src/gdskills/bundled/rules/core/storybook-guidelines.mdc +36 -0
- package/src/gdskills/bundled/rules/core/subagent-context-construction.md +107 -0
- package/src/gdskills/bundled/rules/core/subagent-status-protocol.md +169 -0
- package/src/gdskills/bundled/rules/core/tdd-workflow.mdc +96 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +47 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +55 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +352 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +39 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +29 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +655 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/input-contract.schema.json +134 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +183 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/output-contract.schema.json +208 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.detail.md +735 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +468 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.md +62 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.template.md +79 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/input-contract.schema.json +247 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +362 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/output-contract.schema.json +87 -0
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +105 -0
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +105 -0
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +165 -0
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +379 -0
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/input-contract.schema.json +33 -0
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/output-contract.schema.json +41 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +373 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/input-contract.schema.json +130 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/issue-request.template.md +50 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +155 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/output-contract.schema.json +61 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +373 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/input-contract.schema.json +55 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/output-contract.schema.json +58 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1734 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/input-contract.schema.json +188 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/orchestrator-prompt.md +179 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/output-contract.schema.json +103 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/state.schema.json +164 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +556 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +204 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/orchestrator-prompt.md +206 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +51 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/task-request.template.md +111 -0
- package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +163 -0
- package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +161 -0
- package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +128 -0
- package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +321 -0
- package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +166 -0
- package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +253 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.claude.md +46 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +90 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +90 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +90 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +33 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +33 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +190 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +142 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/input-contract.schema.json +31 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/output-contract.schema.json +31 -0
- package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +80 -0
- package/src/gdskills/bundled/skills/planning/docpack-review/input-contract.schema.json +20 -0
- package/src/gdskills/bundled/skills/planning/docpack-review/output-contract.schema.json +36 -0
- package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +181 -0
- package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +181 -0
- package/src/gdskills/bundled/skills/planning/interview/SKILL.md +187 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.claude.md +94 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +99 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +99 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +105 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +33 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +33 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +237 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +33 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +33 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.md +190 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/input-contract.schema.json +63 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/output-contract.schema.json +175 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +31 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +31 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +153 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +32 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +32 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +166 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +44 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +44 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +243 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +43 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +43 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +193 -0
- package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +47 -0
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +87 -0
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +87 -0
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +87 -0
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +100 -0
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +100 -0
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +100 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.claude.md +45 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +84 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +84 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +84 -0
- package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +66 -0
- package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +66 -0
- package/src/gdskills/bundled/skills/quality/commit/SKILL.md +66 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.claude.md +40 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +66 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +66 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +66 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.claude.md +45 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +81 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +81 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +81 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.claude.md +42 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +70 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +70 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +70 -0
- package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +103 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.claude.md +48 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +83 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +83 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +83 -0
- package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +75 -0
- package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +75 -0
- package/src/gdskills/bundled/skills/quality/pr/SKILL.md +75 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +364 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +295 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +378 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +364 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +38 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/input-contract.schema.json +53 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/output-contract.schema.json +46 -0
- package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +52 -0
- package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +52 -0
- package/src/gdskills/bundled/skills/quality/push/SKILL.md +52 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.claude.md +40 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +61 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +61 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +61 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.claude.md +30 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +75 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +75 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +75 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +64 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +74 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +339 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +48 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +44 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/input-contract.schema.json +121 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/output-contract.schema.json +127 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +204 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +204 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +203 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +204 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +204 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.codex.md +209 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.cursor.md +209 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.md +208 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.opencode.md +209 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.zed.md +209 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +263 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +263 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +258 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +263 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +263 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +175 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +175 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +168 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +175 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +175 -0
- package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +360 -0
- package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +337 -0
- package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +477 -0
- package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +93 -0
- package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +119 -0
- package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +595 -0
- package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +144 -0
- package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +519 -0
- package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +323 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +927 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/input-contract.schema.json +153 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/output-contract.schema.json +77 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/review-context.schema.json +389 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +189 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-input.schema.json +241 -0
- package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +344 -0
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +327 -0
- package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +348 -0
- package/src/gdskills/bundled/skills/review/review-strict/SKILL.md +328 -0
- package/src/gdskills/bundled/skills/review/review-style/SKILL.md +343 -0
- package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +134 -0
- package/src/gdskills/bundled/skills/shared/git-merge-base.md +33 -0
- package/src/gdskills/contracts/agent-event.schema.json +32 -0
- package/src/gdskills/contracts/orchestrator-state.schema.json +58 -0
- package/src/gdskills/contracts/review-finding.schema.json +59 -0
- package/src/gdskills/contracts/subagent-dispatch.schema.json +123 -0
- package/src/gdskills/contracts/subagent-result.schema.json +136 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-security-code
|
|
3
|
+
description: "Use when a code-level security review is requested, checking for injection vulnerabilities, auth gaps, insecure cryptography, secrets, and OWASP Top 10 patterns in changed code. NOT for infrastructure, deployment, or dependency audits."
|
|
4
|
+
triggers:
|
|
5
|
+
- "review security"
|
|
6
|
+
- "security review"
|
|
7
|
+
- "check for vulnerabilities"
|
|
8
|
+
- "security check"
|
|
9
|
+
- "OWASP review"
|
|
10
|
+
- dispatched by review-orchestrator
|
|
11
|
+
metadata:
|
|
12
|
+
author: "MrCipherSmith"
|
|
13
|
+
version: "1.0.0"
|
|
14
|
+
category: "review"
|
|
15
|
+
license: "MIT"
|
|
16
|
+
compatibility: "cursor,codex,zed,opencode,claude"
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Review: Security Code (Code-Level Vulnerabilities)
|
|
20
|
+
|
|
21
|
+
## Purpose
|
|
22
|
+
|
|
23
|
+
Finds exploitable security vulnerabilities introduced in the changed code of the current branch. Covers injection, auth/authz gaps, IDOR, secrets, insecure crypto, CSRF, path traversal, and framework-specific patterns (NestJS, React). Produces findings with explicit attack vectors and concrete fixes.
|
|
24
|
+
|
|
25
|
+
This skill covers **code-level security only**. It does NOT audit npm/bun dependency trees, Docker configurations, or deployment surfaces — use `security-audit` for those.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Input Contract
|
|
30
|
+
|
|
31
|
+
| Field | Required | Description |
|
|
32
|
+
|-------|----------|-------------|
|
|
33
|
+
| Branch / diff range | No | Defaults to merge-base..HEAD + uncommitted changes |
|
|
34
|
+
| Explicit commit hash/range | No | Review only that range when provided |
|
|
35
|
+
| `JOB_NAME` | No | Job name when dispatched by orchestrator |
|
|
36
|
+
| `CONTEXT_PATH` | No | Path to context doc when dispatched by orchestrator |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Scope Boundaries
|
|
41
|
+
|
|
42
|
+
| Concern | This skill | Use instead |
|
|
43
|
+
|---------|-----------|-------------|
|
|
44
|
+
| Injection (SQL, XSS, command, SSTI) | YES | — |
|
|
45
|
+
| Auth/authz gaps, IDOR, privilege escalation | YES | — |
|
|
46
|
+
| Missing input validation / DTO validation | YES | — |
|
|
47
|
+
| Hardcoded secrets, logging secrets | YES | — |
|
|
48
|
+
| Insecure cryptography (MD5, SHA1, weak random) | YES | — |
|
|
49
|
+
| CSRF, path traversal, open redirect | YES | — |
|
|
50
|
+
| OWASP Top 10 code patterns | YES | — |
|
|
51
|
+
| NestJS-specific: missing guards, unvalidated DTOs | YES | — |
|
|
52
|
+
| React-specific: dangerouslySetInnerHTML, eval() | YES | — |
|
|
53
|
+
| npm/bun dependency vulnerabilities | NO | `security-audit` |
|
|
54
|
+
| Infrastructure / Docker / deployment security | NO | `security-audit` |
|
|
55
|
+
| Performance bottlenecks | NO | `review-performance` |
|
|
56
|
+
| Logic correctness, architecture | NO | `review-logic`, `review-architecture` |
|
|
57
|
+
| Code style, naming | NO | `code-style-review` |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Scope Detection
|
|
62
|
+
|
|
63
|
+
See shared script: `skills/shared/git-merge-base.md`
|
|
64
|
+
|
|
65
|
+
Run the script from that file to determine `MERGE_BASE` (`BASE_SHA`) and `SCOPE` before proceeding.
|
|
66
|
+
|
|
67
|
+
### Commands to collect the review slice
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
git status
|
|
71
|
+
git log --oneline "${BASE_SHA}..HEAD"
|
|
72
|
+
git diff --stat --name-status "${BASE_SHA}..HEAD"
|
|
73
|
+
git diff "${BASE_SHA}..HEAD"
|
|
74
|
+
|
|
75
|
+
# Include uncommitted changes (default mode):
|
|
76
|
+
git diff --stat --name-status "${BASE_SHA}"
|
|
77
|
+
git diff "${BASE_SHA}"
|
|
78
|
+
git ls-files --others --exclude-standard
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For explicit hash/range mode:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git diff --stat --name-status <FROM_SHA>..<TO_SHA>
|
|
85
|
+
git diff <FROM_SHA>..<TO_SHA>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Review Checklist
|
|
91
|
+
|
|
92
|
+
Work through every category below for each changed file. Tie every finding to a concrete line in the diff.
|
|
93
|
+
|
|
94
|
+
### 1. Injection Vulnerabilities
|
|
95
|
+
|
|
96
|
+
**SQL Injection**
|
|
97
|
+
- [ ] Raw SQL built by string concatenation or template literals with user input
|
|
98
|
+
- [ ] ORM `query()` / `rawQuery()` calls with unparameterized values
|
|
99
|
+
- [ ] TypeORM `createQueryBuilder` using `.where(\`field = '${value}'\`)` instead of parameterized bindings
|
|
100
|
+
|
|
101
|
+
Attack vector template: _"Attacker sends `' OR '1'='1` as `<param>`, bypassing WHERE clause."_
|
|
102
|
+
|
|
103
|
+
**XSS (Cross-Site Scripting)**
|
|
104
|
+
- [ ] React `dangerouslySetInnerHTML` with unsanitized user content
|
|
105
|
+
- [ ] Template engines rendering user data without escaping
|
|
106
|
+
- [ ] Server-side HTML construction with string concatenation
|
|
107
|
+
|
|
108
|
+
Attack vector template: _"Attacker injects `<script>document.cookie</script>` via `<param>`."_
|
|
109
|
+
|
|
110
|
+
**Command Injection**
|
|
111
|
+
- [ ] `child_process.exec()` / `execSync()` with user-supplied arguments
|
|
112
|
+
- [ ] Shell string building: `exec(\`ls ${userInput}\`)`
|
|
113
|
+
- [ ] Prefer `execFile()` / `spawn()` with argument arrays
|
|
114
|
+
|
|
115
|
+
Attack vector template: _"Attacker passes `; rm -rf /` as `<param>`, executed in shell context."_
|
|
116
|
+
|
|
117
|
+
**Server-Side Template Injection (SSTI)**
|
|
118
|
+
- [ ] Template engine `render()` called with user-controlled template string (not just data)
|
|
119
|
+
- [ ] Dynamic template loading from user-supplied names without allowlist
|
|
120
|
+
|
|
121
|
+
**`eval()` / `Function()` / `vm.runInNewContext()`**
|
|
122
|
+
- [ ] Any usage with non-literal, non-compile-time strings
|
|
123
|
+
|
|
124
|
+
### 2. Authentication and Authorization
|
|
125
|
+
|
|
126
|
+
**Missing Authentication Guards**
|
|
127
|
+
- [ ] NestJS: controllers or routes missing `@UseGuards(JwtAuthGuard)` (or equivalent)
|
|
128
|
+
- [ ] Express: middleware chain missing auth check before sensitive handler
|
|
129
|
+
- [ ] GraphQL resolvers missing `@UseGuards` decorator
|
|
130
|
+
|
|
131
|
+
**Missing Authorization / RBAC**
|
|
132
|
+
- [ ] NestJS: routes with data-mutating operations missing `@Roles()` / `@Permissions()`
|
|
133
|
+
- [ ] Guard present but role check is overly permissive (e.g., allows any authenticated user for admin action)
|
|
134
|
+
|
|
135
|
+
**Broken Auth Logic**
|
|
136
|
+
- [ ] JWT verification disabled or bypassed (`verify: false`, `algorithms: []`)
|
|
137
|
+
- [ ] Session fixation: session ID not rotated on privilege elevation
|
|
138
|
+
- [ ] Password comparison with `==` instead of `crypto.timingSafeEqual` or bcrypt
|
|
139
|
+
|
|
140
|
+
**Privilege Escalation**
|
|
141
|
+
- [ ] User can change their own `role`, `permissions`, or `isAdmin` via a user-facing update endpoint
|
|
142
|
+
- [ ] User ID taken from request body instead of authenticated session/token
|
|
143
|
+
|
|
144
|
+
### 3. Insecure Direct Object References (IDOR)
|
|
145
|
+
|
|
146
|
+
- [ ] DB lookup by `id` taken from request params/body without verifying ownership: `repo.findOne({ id: req.params.id })` — no `userId` scope check
|
|
147
|
+
- [ ] File access, download, or deletion by filename/path from request without ownership validation
|
|
148
|
+
|
|
149
|
+
Attack vector template: _"Attacker replaces `id=123` with `id=456` in request, accessing another user's resource."_
|
|
150
|
+
|
|
151
|
+
### 4. Missing Input Validation / Sanitization
|
|
152
|
+
|
|
153
|
+
- [ ] NestJS: DTO class without `class-validator` decorators (`@IsString()`, `@IsEmail()`, `@IsUUID()`, etc.)
|
|
154
|
+
- [ ] NestJS: `ValidationPipe` not applied globally or per-handler
|
|
155
|
+
- [ ] Express: no `express-validator` or equivalent on body/query params
|
|
156
|
+
- [ ] Accepting unbounded `limit`/`offset` from user without max cap (DoS vector)
|
|
157
|
+
- [ ] File upload: MIME type and extension validated only client-side, not server-side
|
|
158
|
+
- [ ] Email/URL fields accepted without format validation
|
|
159
|
+
|
|
160
|
+
### 5. Secrets and Credentials
|
|
161
|
+
|
|
162
|
+
- [ ] Hardcoded API keys, passwords, tokens, or private keys in source
|
|
163
|
+
- [ ] Secrets passed via URL query params (end up in logs and proxies)
|
|
164
|
+
- [ ] Passwords, tokens, or PII logged via `console.log`, `logger.debug`, or error serialization
|
|
165
|
+
- [ ] `.env` files committed to version control
|
|
166
|
+
- [ ] JWT secret is a short literal string (`"secret"`, `"myapp"`)
|
|
167
|
+
|
|
168
|
+
### 6. Insecure Cryptography
|
|
169
|
+
|
|
170
|
+
- [ ] MD5 or SHA1 used for password hashing or security tokens
|
|
171
|
+
- [ ] `Math.random()` used to generate tokens, nonces, or session IDs — use `crypto.randomBytes()`
|
|
172
|
+
- [ ] AES-ECB mode (deterministic, leaks patterns) — prefer AES-GCM
|
|
173
|
+
- [ ] RSA with key size < 2048 bits
|
|
174
|
+
- [ ] Hardcoded IV/salt instead of random per-operation
|
|
175
|
+
|
|
176
|
+
### 7. CSRF
|
|
177
|
+
|
|
178
|
+
- [ ] State-changing endpoints (POST/PUT/PATCH/DELETE) accessible from browser context without CSRF token validation
|
|
179
|
+
- [ ] CSRF protection middleware bypassed for specific routes
|
|
180
|
+
- [ ] SameSite cookie attribute absent or set to `None` without `Secure`
|
|
181
|
+
|
|
182
|
+
### 8. Path Traversal
|
|
183
|
+
|
|
184
|
+
- [ ] File path constructed from user input without normalization and allowlist check: `fs.readFile('./uploads/' + filename)`
|
|
185
|
+
- [ ] `path.join()` used but result not validated against base directory (join can escape with `..`)
|
|
186
|
+
- [ ] Correct pattern: `path.resolve(BASE, filename)` followed by check that result starts with `BASE`
|
|
187
|
+
|
|
188
|
+
Attack vector template: _"Attacker sends `filename=../../etc/passwd`, reading arbitrary server files."_
|
|
189
|
+
|
|
190
|
+
### 9. Open Redirect
|
|
191
|
+
|
|
192
|
+
- [ ] Redirect target taken from user-supplied query param without allowlist: `res.redirect(req.query.returnTo)`
|
|
193
|
+
- [ ] Only relative paths or allowlisted origins should be accepted as redirect targets
|
|
194
|
+
|
|
195
|
+
### 10. React-Specific Patterns
|
|
196
|
+
|
|
197
|
+
- [ ] `dangerouslySetInnerHTML={{ __html: userContent }}` without DOMPurify or equivalent sanitization
|
|
198
|
+
- [ ] `eval(userInput)` or `new Function(userInput)` in component or hook
|
|
199
|
+
- [ ] Sensitive data stored in `localStorage` / `sessionStorage` (XSS accessible)
|
|
200
|
+
- [ ] `postMessage` handler without origin check
|
|
201
|
+
|
|
202
|
+
### 11. NestJS-Specific Patterns
|
|
203
|
+
|
|
204
|
+
- [ ] Controller method lacks `@UseGuards` when the route handles sensitive data or mutations
|
|
205
|
+
- [ ] DTO class lacks `class-validator` annotations; `ValidationPipe` has `whitelist: false` or `forbidNonWhitelisted: false`
|
|
206
|
+
- [ ] `@Body() body: any` — accepting untyped, unvalidated body
|
|
207
|
+
- [ ] `@Public()` decorator used on an endpoint that should require auth
|
|
208
|
+
- [ ] File upload handler missing MIME-type and size validation
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Iron Laws
|
|
213
|
+
|
|
214
|
+
1. **Every security finding MUST state the attack vector explicitly.** Name the attacker action, the entry point, and the impact. No attack vector → no finding above INFO.
|
|
215
|
+
2. **A finding without a reproducible code path is INFO, not blocker.** "Could theoretically..." = INFO. "Attacker sends X to endpoint Y, which executes Z" = blocker/major.
|
|
216
|
+
3. **Never flag theoretical vulnerabilities.** The vulnerable code path must exist in the changed diff. Do not report hypothetical misuse of safe APIs.
|
|
217
|
+
4. **Do not flag the same pattern twice.** If the same class of issue (e.g., missing `@UseGuards`) appears in five files, group them under one finding with all locations listed.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Output Contract
|
|
222
|
+
|
|
223
|
+
### Class scope — required for `blocker` and `major`
|
|
224
|
+
|
|
225
|
+
Every `blocker` and `major` finding must carry `class_scope`: **every** site that
|
|
226
|
+
holds the shape you found, and **how you enumerated them** — the grep or query
|
|
227
|
+
you ran, or the guard that derives the set.
|
|
228
|
+
|
|
229
|
+
A finding anchored to one `file:line` is a claim about one site. The recorded
|
|
230
|
+
history of this repository is that a fix then repairs that site and leaves its
|
|
231
|
+
siblings: one writer of five, one operator instruction of four, six readers of
|
|
232
|
+
eight. Each was found by the *next* review round, which is why reviews here have
|
|
233
|
+
run to seven and four rounds instead of one.
|
|
234
|
+
|
|
235
|
+
```yaml
|
|
236
|
+
class_scope:
|
|
237
|
+
sites: ["src/lib/shell-config.ts:60", "src/session/store.ts:133"]
|
|
238
|
+
enumeration_method: "grep for the config-path resolvers; 7 writers, 2 unguarded"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
"I checked the others" is not an enumeration method. A single-entry `sites` list
|
|
242
|
+
is a claim that the class has exactly one member — make it deliberately, because
|
|
243
|
+
`review-finding.schema.json` accepts it and the next round tests it.
|
|
244
|
+
|
|
245
|
+
`minor` and `info` may omit it: enumerating the class for every low-severity
|
|
246
|
+
observation is theatre, not rigour.
|
|
247
|
+
|
|
248
|
+
### Status line (first line of response)
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
STATUS: DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
- `DONE` — review complete, findings (if any) are below, no external info needed
|
|
255
|
+
- `DONE_WITH_CONCERNS` — review complete but one or more blockers or majors found
|
|
256
|
+
- `NEEDS_CONTEXT` — cannot determine whether code is vulnerable without additional context (e.g., missing route config, missing auth middleware file not in diff)
|
|
257
|
+
- `BLOCKED` — cannot run git commands or access the repo
|
|
258
|
+
|
|
259
|
+
### Report structure
|
|
260
|
+
|
|
261
|
+
```markdown
|
|
262
|
+
STATUS: DONE_WITH_CONCERNS
|
|
263
|
+
|
|
264
|
+
## Security Review
|
|
265
|
+
|
|
266
|
+
### Scope
|
|
267
|
+
- Branch: `<BRANCH>`
|
|
268
|
+
- Parent ref: `<PARENT>`
|
|
269
|
+
- Merge-base: `<BASE_SHA>`
|
|
270
|
+
- Scope mode: default-with-uncommitted | explicit-hash-range
|
|
271
|
+
- Changed files reviewed: <N>
|
|
272
|
+
|
|
273
|
+
### Summary
|
|
274
|
+
- Blockers: <N>
|
|
275
|
+
- Major: <N>
|
|
276
|
+
- Minor: <N>
|
|
277
|
+
- Info: <N>
|
|
278
|
+
|
|
279
|
+
### Findings
|
|
280
|
+
|
|
281
|
+
### [F-001] Title
|
|
282
|
+
- **Severity**: blocker | major | minor | info
|
|
283
|
+
- **File**: path/to/file.ts:line
|
|
284
|
+
- **Attack vector**: precise description of how an attacker exploits this
|
|
285
|
+
- **Problem**: what is wrong in the code
|
|
286
|
+
- **Why it matters**: concrete impact (data breach, account takeover, RCE, etc.)
|
|
287
|
+
- **Fix**: concrete suggestion
|
|
288
|
+
- **Patch** (optional):
|
|
289
|
+
```diff
|
|
290
|
+
- vulnerable line
|
|
291
|
+
+ fixed line
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Clean Areas
|
|
295
|
+
[List categories with no findings, confirming they were checked]
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Severity definitions
|
|
299
|
+
|
|
300
|
+
| Severity | Meaning |
|
|
301
|
+
|----------|---------|
|
|
302
|
+
| `blocker` | Exploitable vulnerability in the current code path; must fix before merge |
|
|
303
|
+
| `major` | High-likelihood risk with a plausible attack scenario; strongly recommended before merge |
|
|
304
|
+
| `minor` | Hardening improvement or defense-in-depth; can ship but should be tracked |
|
|
305
|
+
| `info` | Pattern worth noting; no clear attack vector in current code |
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Red Flags Table
|
|
310
|
+
|
|
311
|
+
Stop and re-read these rules if you are thinking:
|
|
312
|
+
|
|
313
|
+
| Rationalization | Why it's wrong |
|
|
314
|
+
|---|---|
|
|
315
|
+
| "It's probably behind auth so injection doesn't matter" | Auth is a separate layer; injection must be fixed at the data layer regardless |
|
|
316
|
+
| "The team would never send that payload" | Attackers are not on the team |
|
|
317
|
+
| "MD5 is used for caching keys, not passwords — it's fine" | State it as INFO, but do not silently skip it; it often drifts |
|
|
318
|
+
| "I'll downgrade to minor to avoid friction" | Severity reflects real risk, not social dynamics |
|
|
319
|
+
| "The code uses an ORM so SQL injection is not possible" | ORMs have raw-query escape hatches; verify parameterization |
|
|
320
|
+
| "No attack vector found — I'll call it major anyway" | No attack vector = INFO only, per Iron Law 1 |
|
|
321
|
+
| "It's outside the diff but the pattern is clearly wrong" | Only flag changed code; flag legacy via INFO with note to track separately |
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Job Context Awareness
|
|
326
|
+
|
|
327
|
+
When dispatched by `job-orchestrator` or `review-orchestrator` as part of a job pipeline, the prompt MAY include:
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
JOB_NAME: <job-name>
|
|
331
|
+
CONTEXT_PATH: <JOBS_ROOT>/<job-name>/ai/context.md
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
If provided and the file exists, read the context document before starting the review. Use it to:
|
|
335
|
+
- Understand which auth framework is in use (custom JWT, Passport, Keycloak, etc.)
|
|
336
|
+
- Identify intentional public endpoints that are documented as unauthenticated by design
|
|
337
|
+
- Understand which validation library and pipe configuration the project uses
|
|
338
|
+
- Avoid flagging intentional architectural security decisions as findings
|
|
339
|
+
|
|
340
|
+
If the file does not exist or is not provided, proceed normally — context is optional and non-blocking.
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
## Orchestrated Review Contract
|
|
344
|
+
|
|
345
|
+
When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-strict
|
|
3
|
+
description: |
|
|
4
|
+
Use when: a strict engineering pass is needed — either as a meta-reviewer reading consolidated
|
|
5
|
+
findings from other reviewers and elevating weak findings, or standalone on a git diff.
|
|
6
|
+
Covers "strict review", "review --strict", "boss review", "review as boss", or dispatched
|
|
7
|
+
by review-orchestrator as an optional post-pass after other reviewers complete.
|
|
8
|
+
NOT for: first-pass review (run domain reviewers first); large refactors outside the diff
|
|
9
|
+
scope (file separately).
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
triggers:
|
|
12
|
+
- "strict review"
|
|
13
|
+
- "review --strict"
|
|
14
|
+
- "boss review"
|
|
15
|
+
- "review as boss"
|
|
16
|
+
metadata:
|
|
17
|
+
author: "MrCipherSmith"
|
|
18
|
+
version: "1.0.0"
|
|
19
|
+
category: "review"
|
|
20
|
+
license: "MIT"
|
|
21
|
+
compatibility: "cursor,codex,zed,opencode,claude"
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Review — Strict (Meta-Reviewer)
|
|
25
|
+
|
|
26
|
+
Strict engineering review pass. This is a **meta-reviewer**: it reads findings from other
|
|
27
|
+
reviewers (or the raw diff when run standalone) and applies strict engineering judgment.
|
|
28
|
+
It elevates understated findings, adds architectural commentary, and catches issues that
|
|
29
|
+
domain reviewers may have let through. Style: direct, no-fluff, engineering-focused.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Workflow
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
review-strict Progress:
|
|
37
|
+
- [ ] Step 1: Read Job Context (if CONTEXT_PATH provided)
|
|
38
|
+
- [ ] Step 2: Determine input mode (meta or standalone)
|
|
39
|
+
- [ ] Step 3: If standalone — determine git scope and collect diff
|
|
40
|
+
- [ ] Step 4: If meta — ingest findings from other reviewers
|
|
41
|
+
- [ ] Step 5: Apply strict principles to findings or diff
|
|
42
|
+
- [ ] Step 6: Elevate understated findings
|
|
43
|
+
- [ ] Step 7: Add new findings not caught by other reviewers
|
|
44
|
+
- [ ] Step 8: Check single source of truth violations
|
|
45
|
+
- [ ] Step 9: Emit enhanced findings + strict commentary
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Input Contract
|
|
51
|
+
|
|
52
|
+
| Field | Type | Required | Description |
|
|
53
|
+
|-------|------|----------|-------------|
|
|
54
|
+
| `findings` | string | no | Consolidated findings from other reviewers (markdown). When present, operate in meta mode. |
|
|
55
|
+
| `branch` | string | no | Branch to review. Defaults to current branch. Required in standalone mode. |
|
|
56
|
+
| `commit_range` | string | no | Explicit range (e.g., `abc123..HEAD`). Overrides merge-base in standalone mode. |
|
|
57
|
+
| `context_doc` | string | no | Path to job context document (e.g., `<JOBS_ROOT>/<job>/ai/context.md`). |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Mode Detection
|
|
62
|
+
|
|
63
|
+
**Meta mode** (preferred when dispatched by review-orchestrator `--strict`):
|
|
64
|
+
- Input includes pre-existing findings from domain reviewers
|
|
65
|
+
- Read those findings, then read the diff for context
|
|
66
|
+
- Operate on both: elevate weak findings, add new ones
|
|
67
|
+
|
|
68
|
+
**Standalone mode** (when invoked directly without pre-existing findings):
|
|
69
|
+
- No findings provided
|
|
70
|
+
- Determine git scope via `skills/shared/git-merge-base.md`
|
|
71
|
+
- Collect diff and apply full strict checklist independently
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Scope Detection (standalone mode)
|
|
76
|
+
|
|
77
|
+
See shared script: `skills/shared/git-merge-base.md`
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Default mode — all changes from merge-base to working tree
|
|
81
|
+
git diff --name-only "${BASE_SHA}"
|
|
82
|
+
git diff "${BASE_SHA}"
|
|
83
|
+
|
|
84
|
+
# Explicit range mode
|
|
85
|
+
git diff --name-only <FROM_SHA>..<TO_SHA>
|
|
86
|
+
git diff <FROM_SHA>..<TO_SHA>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Strict Principles
|
|
92
|
+
|
|
93
|
+
### Elevation Rules (meta mode)
|
|
94
|
+
|
|
95
|
+
When reading findings from other reviewers, elevate severity when:
|
|
96
|
+
|
|
97
|
+
| Condition | Elevate to |
|
|
98
|
+
|-----------|-----------|
|
|
99
|
+
| Finding labeled `minor` but could cause a bug under specific conditions | `major` |
|
|
100
|
+
| Finding labeled `major` but blocks correctness or data integrity in any realistic scenario | `blocker` |
|
|
101
|
+
| Finding labeled `info` but represents a design flaw (not just a suggestion) | `minor` or `major` |
|
|
102
|
+
| Finding is vague ("consider refactoring X") without a concrete fix | Downgrade to `info` or rewrite with concrete fix |
|
|
103
|
+
|
|
104
|
+
Every elevation must cite the line or code evidence that justifies the change. No elevation without evidence.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Core Strict Checks
|
|
109
|
+
|
|
110
|
+
**No ducktape fixes**
|
|
111
|
+
- A fix that masks a symptom rather than addressing the root cause — flag as `major`
|
|
112
|
+
- Example: `setTimeout(fn, 0)` to defer a race condition instead of fixing the race — flag as `major`; demand root cause fix
|
|
113
|
+
- Example: `|| []` to avoid a null check instead of ensuring the upstream always returns an array — flag as `minor` if trivial, `major` if the null case indicates a real upstream bug
|
|
114
|
+
|
|
115
|
+
**No magic timeouts**
|
|
116
|
+
- `setTimeout(fn, 0)`, `setTimeout(fn, 100)`, `setTimeout(fn, 500)` without a comment explaining exactly why — always flag as `major`
|
|
117
|
+
- Comment must explain: what is being deferred, why, and what the correct fix would be if time allowed
|
|
118
|
+
- `setInterval` without a cleanup mechanism — `major`
|
|
119
|
+
|
|
120
|
+
**No `any` and no unsafe casts**
|
|
121
|
+
- `any` in new code — `major`
|
|
122
|
+
- `as any` — `major`
|
|
123
|
+
- `as unknown as T` without an explanatory comment — `major`
|
|
124
|
+
- `@ts-ignore` without an explanatory comment — `major`
|
|
125
|
+
|
|
126
|
+
**TODO comments in merged code**
|
|
127
|
+
- `// TODO` / `// FIXME` / `// HACK` present in the diff — flag as `minor` with a note: "file a ticket or resolve before merge"
|
|
128
|
+
- `// TODO: remove before deploy` in production-bound code — **blocker**
|
|
129
|
+
|
|
130
|
+
**No architectural shortcuts**
|
|
131
|
+
- Logic in the wrong layer: UI layer calling APIs directly, controller containing business rules, view accessing store internals — `major`
|
|
132
|
+
- Challenge with: "why is this in this layer?" — must have a concrete answer
|
|
133
|
+
- Cross-cutting concerns scattered in multiple places instead of one — `major` (single source of truth violation)
|
|
134
|
+
|
|
135
|
+
**Single source of truth**
|
|
136
|
+
- Same rule or check duplicated in two or more places — flag as `major`
|
|
137
|
+
- Example: input validation logic in both the controller and the service — pick one authoritative location
|
|
138
|
+
- Example: same constant defined in two files — centralize
|
|
139
|
+
|
|
140
|
+
**MobX conventions (when MobX is in the diff)**
|
|
141
|
+
- Inter-store callbacks (`onChangeX`, `handleX`, `syncX`, `onFireX`) that are `public` — flag as `major` ("should be `private`; public only if called from JSX")
|
|
142
|
+
- `useCallback` or `useMemo` added without a demonstrable need (no expensive computation, no stable reference requirement) — flag as `minor`
|
|
143
|
+
- MobX `autorun` or `reaction` without a disposal mechanism — flag as `major` (memory leak)
|
|
144
|
+
|
|
145
|
+
**Conventions**
|
|
146
|
+
- `currentState` naming: observable state fields named with `current` prefix when they represent present value — flag inconsistency as `minor`
|
|
147
|
+
- Interface names without `I` prefix (`UserService` as an interface instead of `IUserService`) — flag as `minor`
|
|
148
|
+
|
|
149
|
+
**No scope expansion**
|
|
150
|
+
- Large refactors outside the diff scope: note them as `info` with "out of scope — file separately"
|
|
151
|
+
- Never propose a rewrite of unrelated code in the same response
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Architectural Commentary
|
|
156
|
+
|
|
157
|
+
After findings, add a brief "Not Today" section for:
|
|
158
|
+
- Architectural shortcuts visible in the diff that are not bugs but will hurt maintainability
|
|
159
|
+
- Technical debt introduced intentionally or unintentionally
|
|
160
|
+
- Patterns that contradict the project's stated architecture
|
|
161
|
+
|
|
162
|
+
Use the phrase "not today" sparingly — only when a shortcut was taken that needs to be acknowledged.
|
|
163
|
+
Format: `> **Not today:** [what was shortcutted and why it matters long-term]`
|
|
164
|
+
|
|
165
|
+
This section is non-blocking (info-level). It is opinion, not a finding. Keep it to ≤3 items.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Iron Laws
|
|
170
|
+
|
|
171
|
+
| Rule | Rationale |
|
|
172
|
+
|------|-----------|
|
|
173
|
+
| Every finding must cite code evidence (file:line or diff hunk) | "Strictly speaking" without evidence = `info` only |
|
|
174
|
+
| No elevation without a concrete reason stated | Elevation is a claim; claims need backing |
|
|
175
|
+
| No scope expansion — large refactors outside the diff = "out of scope, file separately" | Scope creep in reviews is as harmful as in implementation |
|
|
176
|
+
| Severity of a finding is per-finding, never averaged or influenced by other findings | Each finding stands on its own |
|
|
177
|
+
| `setTimeout(0)` — always flag, no exceptions | There is always a better solution |
|
|
178
|
+
| `any` in new code — always flag, no exceptions | Type safety is non-negotiable |
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Orchestrated Review Contract
|
|
183
|
+
|
|
184
|
+
When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Finding Format
|
|
189
|
+
|
|
190
|
+
### Class scope — required for `blocker` and `major`
|
|
191
|
+
|
|
192
|
+
Every `blocker` and `major` finding must carry `class_scope`: **every** site that
|
|
193
|
+
holds the shape you found, and **how you enumerated them** — the grep or query
|
|
194
|
+
you ran, or the guard that derives the set.
|
|
195
|
+
|
|
196
|
+
A finding anchored to one `file:line` is a claim about one site. The recorded
|
|
197
|
+
history of this repository is that a fix then repairs that site and leaves its
|
|
198
|
+
siblings: one writer of five, one operator instruction of four, six readers of
|
|
199
|
+
eight. Each was found by the *next* review round, which is why reviews here have
|
|
200
|
+
run to seven and four rounds instead of one.
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
class_scope:
|
|
204
|
+
sites: ["src/lib/shell-config.ts:60", "src/session/store.ts:133"]
|
|
205
|
+
enumeration_method: "grep for the config-path resolvers; 7 writers, 2 unguarded"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
"I checked the others" is not an enumeration method. A single-entry `sites` list
|
|
209
|
+
is a claim that the class has exactly one member — make it deliberately, because
|
|
210
|
+
`review-finding.schema.json` accepts it and the next round tests it.
|
|
211
|
+
|
|
212
|
+
`minor` and `info` may omit it: enumerating the class for every low-severity
|
|
213
|
+
observation is theatre, not rigour.
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
### [F-001] Title
|
|
217
|
+
|
|
218
|
+
- **Severity**: blocker | major | minor | info
|
|
219
|
+
- **File**: path/to/file.ts:line
|
|
220
|
+
- **Problem**: what is wrong
|
|
221
|
+
- **Why it matters**: correctness / testability / conventions / maintainability
|
|
222
|
+
- **Fix**: concrete suggestion
|
|
223
|
+
- **Elevated from**: minor → major (or: new finding) <!-- only in meta mode -->
|
|
224
|
+
- **Patch** (optional):
|
|
225
|
+
```diff
|
|
226
|
+
- old line
|
|
227
|
+
+ new line
|
|
228
|
+
```
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Output Contract
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
STATUS: DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
- `DONE` — no blockers or majors after strict pass
|
|
240
|
+
- `DONE_WITH_CONCERNS` — one or more blocker or major findings
|
|
241
|
+
- `NEEDS_CONTEXT` — cannot assess intent without context doc; state what is missing
|
|
242
|
+
- `BLOCKED` — cannot access diff or findings input; state reason
|
|
243
|
+
|
|
244
|
+
```markdown
|
|
245
|
+
# Strict Review Report
|
|
246
|
+
|
|
247
|
+
## Verdict: APPROVE | APPROVE_WITH_SUGGESTIONS | REQUEST_CHANGES
|
|
248
|
+
|
|
249
|
+
## Summary
|
|
250
|
+
<2-4 sentences: overall engineering quality, key concerns, whether findings from other
|
|
251
|
+
reviewers were understated.>
|
|
252
|
+
|
|
253
|
+
## Review Scope
|
|
254
|
+
- Branch: `<BRANCH>`
|
|
255
|
+
- Parent ref: `<PARENT>`
|
|
256
|
+
- Merge-base: `<BASE_SHA>`
|
|
257
|
+
- Mode: `<meta | standalone>`
|
|
258
|
+
- Scope mode: `<default-with-uncommitted | explicit-hash-range>`
|
|
259
|
+
- Input findings ingested: <N> (meta mode only)
|
|
260
|
+
|
|
261
|
+
## Stats
|
|
262
|
+
- blocker: N (N elevated)
|
|
263
|
+
- major: N (N elevated, N new)
|
|
264
|
+
- minor: N
|
|
265
|
+
- info: N
|
|
266
|
+
|
|
267
|
+
## Blockers (must fix before merge)
|
|
268
|
+
<[F-NNN] findings>
|
|
269
|
+
|
|
270
|
+
## Major Issues
|
|
271
|
+
<[F-NNN] findings — mark elevated ones clearly>
|
|
272
|
+
|
|
273
|
+
## Minor & Info
|
|
274
|
+
<[F-NNN] findings>
|
|
275
|
+
|
|
276
|
+
## Not Today
|
|
277
|
+
> **Not today:** [architectural shortcut 1]
|
|
278
|
+
> **Not today:** [architectural shortcut 2]
|
|
279
|
+
|
|
280
|
+
## Positive Notes
|
|
281
|
+
<Optional. What held up to strict scrutiny.>
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Scope Boundaries
|
|
287
|
+
|
|
288
|
+
| Concern | This skill | Use instead |
|
|
289
|
+
|---------|------------|-------------|
|
|
290
|
+
| Elevating/validating findings from domain reviewers | YES | — |
|
|
291
|
+
| Strict engineering commentary on diff | YES | — |
|
|
292
|
+
| `setTimeout`, `any`, ducktape, SSOT violations | YES | — |
|
|
293
|
+
| MobX conventions (inter-store access, disposal) | YES | — |
|
|
294
|
+
| First-pass logic review | NO | `review-logic` |
|
|
295
|
+
| First-pass frontend patterns | NO | `review-frontend` |
|
|
296
|
+
| First-pass backend patterns | NO | `review-backend` |
|
|
297
|
+
| Large out-of-scope refactors | NO | file separately |
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Job Context Awareness
|
|
302
|
+
|
|
303
|
+
When dispatched by `job-orchestrator` or called with an explicit context path, the prompt MAY include:
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
JOB_NAME: <job-name>
|
|
307
|
+
CONTEXT_PATH: <JOBS_ROOT>/<job-name>/ai/context.md
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
If provided and the file exists, read the context document **before** applying strict principles.
|
|
311
|
+
Use it to understand:
|
|
312
|
+
- Intentional architectural decisions (do not flag agreed-upon patterns as shortcuts)
|
|
313
|
+
- Which libraries, patterns, and conventions were explicitly chosen
|
|
314
|
+
- Acceptance criteria (to detect spec gaps if running standalone)
|
|
315
|
+
|
|
316
|
+
If absent, proceed normally — context is optional and non-blocking.
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Red Flags
|
|
321
|
+
|
|
322
|
+
| Rationalization | Why it is wrong |
|
|
323
|
+
|----------------|-----------------|
|
|
324
|
+
| "The other reviewer already caught it, I don't need to address it" | Meta mode means you own the final assessment; weak findings stay weak unless you act |
|
|
325
|
+
| "setTimeout(0) is a common pattern" | Common patterns can still be wrong; demand the root cause fix |
|
|
326
|
+
| "I'll add a 'Not Today' for everything I disagree with" | Not Today is for real shortcuts, not personal preference; ≤3 items |
|
|
327
|
+
| "Elevating to blocker feels harsh" | Harsh is blocking a production incident; elevate when the evidence supports it |
|
|
328
|
+
| "The `any` is in a test file" | Type safety in tests matters; typed mocks prevent false-green tests |
|