feat: add project-review workflow (whole-project / single-feature review)
Adds the project-review workflow for code review independent of the git diff. The scope is parsed from the user instruction: 全面/整个项目 -> whole-project (score every source file), otherwise feature + target keyword (locate the code with semantic search + graph queries). - scoring_tools.py: score_review_func gains all_files=True to score every source file in the graph via store.get_all_files() - main.py: score_review_tool gains all_files param; registers the project_review MCP prompt (prompts 6->7) - prompts.py: project_review_prompt(scope, target) with whole-project and feature branches (fixed a precedence bug that truncated the feature text) - skills.py + skills/project-review/: new read-only project-review skill with shared checklists - .opencode/command/code-review-graph-project-review.md: slash command - tests: test_project_review.py (prompt rendering), TestProjectReviewPrompt, skill count assertions 5->6, all_files wiring checks - docs: prompts (6->7) + project-review entries across COMMANDS, CLAUDE, README (+localized), INDEX, architecture, LLM-OPTIMIZED-REFERENCE, CHANGELOG
This commit is contained in:
@@ -7,6 +7,7 @@ from code_review_graph.prompts import (
|
||||
debug_issue_prompt,
|
||||
onboard_developer_prompt,
|
||||
pre_merge_check_prompt,
|
||||
project_review_prompt,
|
||||
review_changes_prompt,
|
||||
unified_review_prompt,
|
||||
)
|
||||
@@ -214,6 +215,58 @@ class TestUnifiedReviewPrompt:
|
||||
assert "FAIL" in _text(result[0])
|
||||
|
||||
|
||||
class TestProjectReviewPrompt:
|
||||
def test_returns_list_with_messages(self):
|
||||
result = project_review_prompt()
|
||||
assert isinstance(result, list)
|
||||
assert len(result) >= 1
|
||||
|
||||
def test_message_has_role_and_content(self):
|
||||
result = project_review_prompt()
|
||||
for msg in result:
|
||||
assert isinstance(msg, Message)
|
||||
assert msg.role == "user"
|
||||
assert _text(msg)
|
||||
|
||||
def test_default_whole_project_scope(self):
|
||||
result = project_review_prompt()
|
||||
text = _text(result[0])
|
||||
assert "whole-project" in text
|
||||
assert "all_files=True" in text
|
||||
|
||||
def test_feature_scope_with_target(self):
|
||||
result = project_review_prompt(scope="feature", target="payment")
|
||||
text = _text(result[0])
|
||||
assert "scope=feature" in text
|
||||
assert "target=payment" in text
|
||||
|
||||
def test_mentions_architecture_scan(self):
|
||||
result = project_review_prompt()
|
||||
text = _text(result[0])
|
||||
assert "get_architecture_overview" in text
|
||||
assert "list_communities" in text
|
||||
|
||||
def test_mentions_high_risk_scan(self):
|
||||
result = project_review_prompt()
|
||||
text = _text(result[0])
|
||||
assert "get_knowledge_gaps" in text
|
||||
assert "get_hub_nodes" in text
|
||||
|
||||
def test_feature_mentions_semantic_search(self):
|
||||
result = project_review_prompt(scope="feature", target="auth")
|
||||
text = _text(result[0])
|
||||
assert "semantic_search_nodes" in text
|
||||
assert "get_impact_radius" in text
|
||||
|
||||
def test_mentions_read_only(self):
|
||||
result = project_review_prompt()
|
||||
assert "READ-ONLY" in _text(result[0])
|
||||
|
||||
def test_mentions_generate_report(self):
|
||||
result = project_review_prompt()
|
||||
assert "generate_report" in _text(result[0])
|
||||
|
||||
|
||||
class TestTokenEfficiencyPreamble:
|
||||
"""All prompts should include the token efficiency preamble."""
|
||||
|
||||
@@ -241,3 +294,7 @@ class TestTokenEfficiencyPreamble:
|
||||
def test_unified_review_has_preamble(self):
|
||||
result = unified_review_prompt()
|
||||
assert "get_minimal_context" in _text(result[0])
|
||||
|
||||
def test_project_review_has_preamble(self):
|
||||
result = project_review_prompt()
|
||||
assert "get_minimal_context" in _text(result[0])
|
||||
|
||||
Reference in New Issue
Block a user