Crate renames: - zesdex-entities::seaorm → domain (misleading name, no SeaORM used) - zesdex-dto → merged into zesdex-entities (100% re-exports) - zesdex-libs → zesdex-infra (vague name) Module renames: - app/harness → guard (misleading: safety gatekeeper, not test harness) - runtime/commands → action_dispatch (name clashed with controller/command) - resources → prompts (embedded prompt text, not general resources) - tool/seqthink → sequential_think (unreadable abbreviation) - msglog/query → insert (module only inserts, never queries) Dead code removal: - app/mode/help.rs (orphaned — not declared in mod.rs) - app/mode/loading.rs (orphaned — not declared in mod.rs) File splitting (71 new files, avg ~115 lines/file): - app/runtime/actions/: 1→8 files (was 2030 lines) - view/overlays/: 1→16 files (was 1167 lines) - tool/lsp/: 1→8 per-tool files (was 909 lines) - main.rs: 1→5 files (session, daemon, attach, event_loop) - workflow/engine + hive_mind: 2→10 files - subagent/engine + auto: 2→9 files - lsp/provisioner: 1→5 files - review/: 1→6 files - guard/: 1→2 files (extracted patterns) - state/misc: 1→3 files (input, scroll) - mcp/: 1→3 files (transport, adapter) - stream/json_repair extracted from turn.rs DRY: - Pattern constants (STUB_PATTERNS etc) in guard/patterns shared with subagent - 3 near-identical background spawners → 1 generic + thin wrappers - Shared spawn_subagent_with_drain() extracted - Shared create_session() in main - write_osc52 deduplicated Bug fixes: - archive_message(): sess.db → db (wrong variable name) - execute_one_tool(): wrong parameter name - check_credential_read() function was missing (restored from test expectations)
60 lines
2.5 KiB
Rust
60 lines
2.5 KiB
Rust
//! Review prompt composition: building the system prompt for the
|
|
//! quality-review subagent, embedding git diff, chat history, and
|
|
//! build/test probe results.
|
|
|
|
use crate::app::state::rest::AppStateRest;
|
|
|
|
/// Number of days without update after which a memory is flagged as stale.
|
|
pub(crate) const STALE_AFTER_DAYS: i64 = 60;
|
|
|
|
/// Compose the system prompt for the quality-review subagent.
|
|
pub(crate) fn compose_review_prompt(state: &AppStateRest, probe_note: &str) -> String {
|
|
let diff_output = if let Some(workspace) = state.workspace_roots.first() {
|
|
std::process::Command::new("git")
|
|
.arg("diff")
|
|
.arg("HEAD")
|
|
.current_dir(workspace)
|
|
.output()
|
|
.ok()
|
|
.map(|o| String::from_utf8_lossy(&o.stdout).to_string())
|
|
.unwrap_or_default()
|
|
} else {
|
|
String::new()
|
|
};
|
|
|
|
let history_output = if let Some(rt) = &state.session_runtime {
|
|
let msgs: Vec<String> = rt
|
|
.messages
|
|
.iter()
|
|
.filter(|m| {
|
|
m.role == crate::dto::chat::message::Role::Assistant
|
|
|| m.role == crate::dto::chat::message::Role::User
|
|
})
|
|
.rev()
|
|
.take(10)
|
|
.map(|m| format!("{:?}: {}", m.role, m.content.as_deref().unwrap_or("")))
|
|
.collect();
|
|
let mut rev_msgs = msgs;
|
|
rev_msgs.reverse();
|
|
rev_msgs.join("\n\n")
|
|
} else {
|
|
String::new()
|
|
};
|
|
|
|
let session_dir_disp = state.session_dir.display();
|
|
format!(
|
|
"You are a code quality reviewer and lesson generator. Your goal is to review recent code changes.\n\n\
|
|
Session directory: {session_dir_disp}\n\n\
|
|
--- Build/Test Probe ---\n{probe_note}\n\n\
|
|
--- Recent Chat History (Last 10 messages) ---\n{history_output}\n\n\
|
|
--- Recent Code Diffs (git diff HEAD) ---\n{diff_output}\n\n\
|
|
INSTRUCTIONS:\n\
|
|
1. Compare the 'Recent Chat History' (what the AI promised or discussed) with the 'Recent Code Diffs' (what was actually changed).\n\
|
|
2. Ensure that the AI's promises match the actual code changes.\n\
|
|
3. Evaluate the code quality in the diff (check for best practices, clean code).\n\
|
|
4. Write your findings and learning points as a lesson to a file in `docs/lesson/` (e.g., docs/lesson/lesson_01.md).\n\
|
|
5. Use the `write` tool to save this markdown file.\n\
|
|
6. Your verdict should briefly summarize what lesson was created.",
|
|
)
|
|
}
|