Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@ DEFAULT_MODEL=anthropic/claude-opus-4-6
# =============================================================================
# codespy uses a tiered model approach to balance review quality and cost:
#
# Smart (DEFAULT_MODEL): Core analysis — defect detection, supply chain,
# scope identification, doc review. Requires strong reasoning.
# Smart (DEFAULT_MODEL): Core analysis — code review (bugs, security, smells),
# supply chain, scope identification, doc review. Requires strong reasoning.
# Recommended: anthropic/claude-opus-4-6 or equivalent.
#
# Mid-tier (EXTRACTION_MODEL + DEDUPLICATION_MODEL): Structured field
Expand Down Expand Up @@ -156,12 +156,12 @@ DEFAULT_MODEL=anthropic/claude-opus-4-6
# Format: SIGNATURE_NAME_SETTING=value
#
# Available signatures:
# - DEFECT_DETECTION (bugs, logic errors, security vulnerabilities)
# - SUPPLY_CHAIN (supply chain security analysis)
# - DOC_REVIEW (documentation review)
# - SCOPE_IDENTIFICATION (code scope detection)
# - DEDUPLICATION (issue deduplication)
# - SUMMARIZATION (PR summary generation)
# - CODE_REVIEW (bugs, security, removed defensive code, code smells)
# - DOC (compares patches against documentation)
# - SCOPE (code scope detection)
# - SUPPLY_CHAIN (supply chain security analysis)
# - DEDUPLICATION (issue deduplication)
# - SUMMARIZATION (PR summary generation)
#
# Available settings per signature:
# - ENABLED (true/false)
Expand All @@ -172,20 +172,20 @@ DEFAULT_MODEL=anthropic/claude-opus-4-6
# - TEMPERATURE (float) - Lower = more deterministic output

# Examples:
# DEFECT_DETECTION_ENABLED=true
# DEFECT_DETECTION_MAX_ITERS=10
# DEFECT_DETECTION_MODEL=anthropic/claude-sonnet-4-5-20250929
# DEFECT_DETECTION_MAX_REASONING_TOKENS=512
# DEFECT_DETECTION_TEMPERATURE=0.1
# CODE_REVIEW_ENABLED=true
# CODE_REVIEW_MAX_ITERS=10
# CODE_REVIEW_MODEL=anthropic/claude-sonnet-4-5-20250929
# CODE_REVIEW_MAX_REASONING_TOKENS=512
# CODE_REVIEW_TEMPERATURE=0.1

# SUPPLY_CHAIN_ENABLED=true

# DOC_REVIEW_ENABLED=true
# DOC_REVIEW_MODEL=anthropic/claude-sonnet-4-5-20250929
# DOC_ENABLED=true
# DOC_MODEL=anthropic/claude-sonnet-4-5-20250929

# SCOPE_IDENTIFICATION_ENABLED=true
# SCOPE_IDENTIFICATION_MAX_ITERS=10
# SCOPE_IDENTIFICATION_MAX_REASONING_TOKENS=1024
# SCOPE_ENABLED=true
# SCOPE_MAX_ITERS=10
# SCOPE_MAX_REASONING_TOKENS=1024

# DEDUPLICATION_ENABLED=true
# DEDUPLICATION_MODEL=anthropic/claude-sonnet-4-5-20250929
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codespy-review.yml.example
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ jobs:
# default-temperature: '0.1'
#
# # Per-signature overrides
# code-and-doc-review-max-iters: '10'
# code-review-max-iters: '10'
#
# # Disable specific signatures
# supply-chain-enabled: 'false'
Expand Down
17 changes: 10 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ export DEFAULT_MODEL=anthropic/claude-opus-4-6
export DEFAULT_MAX_ITERS=20

# Per-signature settings (use signature name, not module name)
export CODE_AND_DOC_REVIEW_MODEL=anthropic/claude-sonnet-4-5-20250929
export CODE_REVIEW_MODEL=anthropic/claude-sonnet-4-5-20250929

# Output settings
export OUTPUT_STDOUT=false
Expand Down Expand Up @@ -642,10 +642,12 @@ output_git: true
│ │ │
│ ┌──────────────────────────▼─────────────────────────────────┐ │
│ │ Parallel Review Modules │ │
│ │ ┌──────────────┐ ┌──────────────────────────────────┐ │ │
│ │ │Supply Chain │ │ Code & Doc Reviewer │ │ │
│ │ │ Auditor │ │ (defects + documentation) │ │ │
│ │ └──────────────┘ └──────────────────────────────────┘ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │ │
│ │ │ Supply Chain │ │ Code │ │ Doc │ │ │
│ │ │ Auditor │ │ Reviewer │ │ Reviewer │ │ │
│ │ │ │ │ (bug+sec+ │ │ │ │ │
│ │ │ │ │ smell) │ │ │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────┘ │ │
│ └──────────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼─────────────────────────────────┐ │
Expand Down Expand Up @@ -688,8 +690,9 @@ The review is powered by DSPy signatures that structure the LLM's analysis:

| Signature | Config Key | Description |
|-----------|------------|-------------|
| **ScopeIdentifierSignature** | `scope_identification` | Identifies code scopes (frontend, backend, infra, microservice in mono repo, etc...) |
| **CodeAndDocReviewSignature** | `code_and_doc_review` | Detects verified bugs, security vulnerabilities, and stale/wrong documentation in a single pass |
| **ScopeIdentifierSignature** | `scope` | Identifies code scopes (frontend, backend, infra, microservice in mono repo, etc...) |
| **CodeReviewSignature** | `code_review` | Detects verified bugs, security vulnerabilities, removed defensive code, and code smells |
| **DocReviewSignature** | `doc` | Detects stale or wrong documentation caused by code changes |
| **SupplyChainSecuritySignature** | `supply_chain` | Analyzes artifacts (Dockerfiles) and dependencies for supply chain security |
| **IssueDeduplicationSignature** | `deduplication` | LLM-powered deduplication of issues across reviewers |
| **MRSummarySignature** | `summarization` | Generates summary, quality assessment, and recommendation |
Expand Down
136 changes: 90 additions & 46 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,59 +99,87 @@ inputs:
default: 'true'

# ==========================================
# SIGNATURE: scope_identification
# SIGNATURE: scope
# ==========================================
scope-identification-enabled:
scope-enabled:
description: 'Enable scope identification signature'
required: false
default: 'true'

scope-identification-model:
scope-model:
description: 'Model for scope identification (empty = use default)'
required: false

scope-identification-max-iters:
scope-max-iters:
description: 'Max iterations for scope identification'
required: false

scope-identification-max-context-size:
scope-max-context-size:
description: 'Max context size for scope identification'
required: false

scope-identification-max-reasoning-tokens:
scope-max-reasoning-tokens:
description: 'Max reasoning tokens for scope identification'
required: false

scope-identification-temperature:
scope-temperature:
description: 'Temperature for scope identification'
required: false

# ==========================================
# SIGNATURE: code_and_doc_review
# SIGNATURE: code_review
# ==========================================
code-and-doc-review-enabled:
description: 'Enable code and doc review signature (bugs, security vulnerabilities, and documentation)'
code-review-enabled:
description: 'Enable code review signature (bugs, security vulnerabilities, code smells)'
required: false
default: 'true'

code-and-doc-review-model:
description: 'Model for code and doc review (empty = use default)'
code-review-model:
description: 'Model for code review (empty = use default)'
required: false

code-and-doc-review-max-iters:
description: 'Max iterations for code and doc review'
code-review-max-iters:
description: 'Max iterations for code review'
required: false

code-and-doc-review-max-context-size:
description: 'Max context size for code and doc review'
code-review-max-context-size:
description: 'Max context size for code review'
required: false

code-and-doc-review-max-reasoning-tokens:
description: 'Max reasoning tokens for code and doc review'
code-review-max-reasoning-tokens:
description: 'Max reasoning tokens for code review'
required: false

code-and-doc-review-temperature:
description: 'Temperature for code and doc review'
code-review-temperature:
description: 'Temperature for code review'
required: false

# ==========================================
# SIGNATURE: doc
# ==========================================
doc-enabled:
description: 'Enable documentation review signature (stale/wrong documentation)'
required: false
default: 'true'

doc-model:
description: 'Model for doc review (empty = use default)'
required: false

doc-max-iters:
description: 'Max iterations for doc review'
required: false

doc-max-context-size:
description: 'Max context size for doc review'
required: false

doc-max-reasoning-tokens:
description: 'Max reasoning tokens for doc review'
required: false

doc-temperature:
description: 'Temperature for doc review'
required: false

# ==========================================
Expand Down Expand Up @@ -317,20 +345,28 @@ runs:
ENABLE_PROMPT_CACHING: ${{ inputs.enable-prompt-caching }}

# Scope identification signature
SCOPE_IDENTIFICATION_ENABLED: ${{ inputs.scope-identification-enabled }}
SCOPE_IDENTIFICATION_MODEL: ${{ inputs.scope-identification-model }}
SCOPE_IDENTIFICATION_MAX_ITERS: ${{ inputs.scope-identification-max-iters }}
SCOPE_IDENTIFICATION_MAX_CONTEXT_SIZE: ${{ inputs.scope-identification-max-context-size }}
SCOPE_IDENTIFICATION_MAX_REASONING_TOKENS: ${{ inputs.scope-identification-max-reasoning-tokens }}
SCOPE_IDENTIFICATION_TEMPERATURE: ${{ inputs.scope-identification-temperature }}
SCOPE_ENABLED: ${{ inputs.scope-enabled }}
SCOPE_MODEL: ${{ inputs.scope-model }}
SCOPE_MAX_ITERS: ${{ inputs.scope-max-iters }}
SCOPE_MAX_CONTEXT_SIZE: ${{ inputs.scope-max-context-size }}
SCOPE_MAX_REASONING_TOKENS: ${{ inputs.scope-max-reasoning-tokens }}
SCOPE_TEMPERATURE: ${{ inputs.scope-temperature }}

# Code and doc review signature
CODE_AND_DOC_REVIEW_ENABLED: ${{ inputs.code-and-doc-review-enabled }}
CODE_AND_DOC_REVIEW_MODEL: ${{ inputs.code-and-doc-review-model }}
CODE_AND_DOC_REVIEW_MAX_ITERS: ${{ inputs.code-and-doc-review-max-iters }}
CODE_AND_DOC_REVIEW_MAX_CONTEXT_SIZE: ${{ inputs.code-and-doc-review-max-context-size }}
CODE_AND_DOC_REVIEW_MAX_REASONING_TOKENS: ${{ inputs.code-and-doc-review-max-reasoning-tokens }}
CODE_AND_DOC_REVIEW_TEMPERATURE: ${{ inputs.code-and-doc-review-temperature }}
# Code review signature
CODE_REVIEW_ENABLED: ${{ inputs.code-review-enabled }}
CODE_REVIEW_MODEL: ${{ inputs.code-review-model }}
CODE_REVIEW_MAX_ITERS: ${{ inputs.code-review-max-iters }}
CODE_REVIEW_MAX_CONTEXT_SIZE: ${{ inputs.code-review-max-context-size }}
CODE_REVIEW_MAX_REASONING_TOKENS: ${{ inputs.code-review-max-reasoning-tokens }}
CODE_REVIEW_TEMPERATURE: ${{ inputs.code-review-temperature }}

# Doc review signature
DOC_ENABLED: ${{ inputs.doc-enabled }}
DOC_MODEL: ${{ inputs.doc-model }}
DOC_MAX_ITERS: ${{ inputs.doc-max-iters }}
DOC_MAX_CONTEXT_SIZE: ${{ inputs.doc-max-context-size }}
DOC_MAX_REASONING_TOKENS: ${{ inputs.doc-max-reasoning-tokens }}
DOC_TEMPERATURE: ${{ inputs.doc-temperature }}

# Supply chain signature
SUPPLY_CHAIN_ENABLED: ${{ inputs.supply-chain-enabled }}
Expand Down Expand Up @@ -385,20 +421,28 @@ runs:
[ -n "$ENABLE_PROMPT_CACHING" ] && DOCKER_ARGS="$DOCKER_ARGS -e ENABLE_PROMPT_CACHING"

# Scope identification
[ -n "$SCOPE_IDENTIFICATION_ENABLED" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_IDENTIFICATION_ENABLED"
[ -n "$SCOPE_IDENTIFICATION_MODEL" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_IDENTIFICATION_MODEL"
[ -n "$SCOPE_IDENTIFICATION_MAX_ITERS" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_IDENTIFICATION_MAX_ITERS"
[ -n "$SCOPE_IDENTIFICATION_MAX_CONTEXT_SIZE" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_IDENTIFICATION_MAX_CONTEXT_SIZE"
[ -n "$SCOPE_IDENTIFICATION_MAX_REASONING_TOKENS" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_IDENTIFICATION_MAX_REASONING_TOKENS"
[ -n "$SCOPE_IDENTIFICATION_TEMPERATURE" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_IDENTIFICATION_TEMPERATURE"
[ -n "$SCOPE_ENABLED" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_ENABLED"
[ -n "$SCOPE_MODEL" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_MODEL"
[ -n "$SCOPE_MAX_ITERS" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_MAX_ITERS"
[ -n "$SCOPE_MAX_CONTEXT_SIZE" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_MAX_CONTEXT_SIZE"
[ -n "$SCOPE_MAX_REASONING_TOKENS" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_MAX_REASONING_TOKENS"
[ -n "$SCOPE_TEMPERATURE" ] && DOCKER_ARGS="$DOCKER_ARGS -e SCOPE_TEMPERATURE"

# Code review
[ -n "$CODE_REVIEW_ENABLED" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_REVIEW_ENABLED"
[ -n "$CODE_REVIEW_MODEL" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_REVIEW_MODEL"
[ -n "$CODE_REVIEW_MAX_ITERS" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_REVIEW_MAX_ITERS"
[ -n "$CODE_REVIEW_MAX_CONTEXT_SIZE" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_REVIEW_MAX_CONTEXT_SIZE"
[ -n "$CODE_REVIEW_MAX_REASONING_TOKENS" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_REVIEW_MAX_REASONING_TOKENS"
[ -n "$CODE_REVIEW_TEMPERATURE" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_REVIEW_TEMPERATURE"

# Code and doc review
[ -n "$CODE_AND_DOC_REVIEW_ENABLED" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_AND_DOC_REVIEW_ENABLED"
[ -n "$CODE_AND_DOC_REVIEW_MODEL" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_AND_DOC_REVIEW_MODEL"
[ -n "$CODE_AND_DOC_REVIEW_MAX_ITERS" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_AND_DOC_REVIEW_MAX_ITERS"
[ -n "$CODE_AND_DOC_REVIEW_MAX_CONTEXT_SIZE" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_AND_DOC_REVIEW_MAX_CONTEXT_SIZE"
[ -n "$CODE_AND_DOC_REVIEW_MAX_REASONING_TOKENS" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_AND_DOC_REVIEW_MAX_REASONING_TOKENS"
[ -n "$CODE_AND_DOC_REVIEW_TEMPERATURE" ] && DOCKER_ARGS="$DOCKER_ARGS -e CODE_AND_DOC_REVIEW_TEMPERATURE"
# Doc review
[ -n "$DOC_ENABLED" ] && DOCKER_ARGS="$DOCKER_ARGS -e DOC_ENABLED"
[ -n "$DOC_MODEL" ] && DOCKER_ARGS="$DOCKER_ARGS -e DOC_MODEL"
[ -n "$DOC_MAX_ITERS" ] && DOCKER_ARGS="$DOCKER_ARGS -e DOC_MAX_ITERS"
[ -n "$DOC_MAX_CONTEXT_SIZE" ] && DOCKER_ARGS="$DOCKER_ARGS -e DOC_MAX_CONTEXT_SIZE"
[ -n "$DOC_MAX_REASONING_TOKENS" ] && DOCKER_ARGS="$DOCKER_ARGS -e DOC_MAX_REASONING_TOKENS"
[ -n "$DOC_TEMPERATURE" ] && DOCKER_ARGS="$DOCKER_ARGS -e DOC_TEMPERATURE"

# Supply chain
[ -n "$SUPPLY_CHAIN_ENABLED" ] && DOCKER_ARGS="$DOCKER_ARGS -e SUPPLY_CHAIN_ENABLED"
Expand Down
Loading