feat(agent): subagent tool paralel + auto-load AGENTS.md + verify cek setelah edit
Lanjutan audit alur AI agent (round 2), mengisi celah yang tersisa dari
perpbaikan paralel tool di loop utama (74b1ad4) agar lebih mirip Claude Code.
- feat(subagent): eksekusi batch tool read-only paralel di subagent engine
(engine.rs). Tool::run sinkron, jadi pakai scoped OS thread (bounded
window 8); hasil dipertahankan dalam urutan panggilan asli. Batch dengan
tool mutating jatuh balik ke jalur sequential aman.
- feat(agent): auto-load AGENTS.md/CLAUDE.md/.cursorrules ke system prompt
tiap turn (seperti Claude Code load AGENTS.md saat startup). Fungsi
main_agent_prompt_with_project_context menempel blok PROJECT CONTEXT;
dibaca dari workspace root pertama & dibatasi 12k char.
- feat(prompt): arahan VERIFY AFTER EDIT — setelah edit/write, agent wajib
jalankan cargo check/clippy/test (atau lint/test sesuai stack) via bash
sebelum mengakhiri turn; perbaiki error yang terlihat, jangan klaim
'compiles/works' tanpa hasil nyata.
- feat(infra): build_rich_context kini membaca AGENTS.md & CLAUDE.md juga
(untuk explore_codebase/scout).
- test: +3 subagent engine (order paralel, kecepatan konkuren, fallback
mutating), +2 domain prompt (konteks proyek & fallback kosong).
This commit is contained in:
@@ -41,10 +41,43 @@ architectural plans and `todowrite` to maintain granular task checklists.
|
||||
4. TOOL EXECUTION: Execute individual tools (file edits, terminal commands) \
|
||||
within or guided by your workflows. If an error occurs, analyse and fix it.
|
||||
|
||||
VERIFY AFTER EDIT (CLAUDE-CODE STYLE):
|
||||
- After modifying code (edit/write), run the repo's check command via `bash` \
|
||||
before ending the turn: `cargo check` / `cargo clippy` / `cargo test` for Rust, \
|
||||
or the equivalent lint/test (`bun run lint && bun run test`, `npm test`, etc.) \
|
||||
for other stacks. Pick the project's actual verify command (see PROJECT \
|
||||
CONTEXT / AGENTS.md when present).
|
||||
- If the check fails, fix the errors you can see and re-run; only end the turn \
|
||||
after the check passes or you cannot resolve a failure yourself (then report it \
|
||||
explicitly).
|
||||
- Do NOT claim code compiles or works without running a real check.
|
||||
|
||||
Respond conversationally, concisely, and helpfully."
|
||||
.to_string()
|
||||
}
|
||||
|
||||
/// Build the main-agent system prompt including an injected block of project
|
||||
/// context (AGENTS.md / CLAUDE.md / project rules).
|
||||
///
|
||||
/// Like Claude Code, which loads AGENTS.md at startup so the model starts with
|
||||
/// the repo's conventions, this wraps [`main_agent_prompt`] and appends a
|
||||
/// clearly-delimited `## PROJECT CONTEXT` section carrying the rules the user
|
||||
/// keeps next to their code. When `project_context` is empty the returned
|
||||
/// prompt is identical to [`main_agent_prompt`], so callers can fall back
|
||||
/// safely.
|
||||
pub fn main_agent_prompt_with_project_context(project_context: &str) -> String {
|
||||
let base = main_agent_prompt();
|
||||
let context = project_context.trim();
|
||||
if context.is_empty() {
|
||||
return base;
|
||||
}
|
||||
format!(
|
||||
"{base}\n\n\
|
||||
## PROJECT CONTEXT (repo rules — follow these conventions)\n\
|
||||
{context}"
|
||||
)
|
||||
}
|
||||
|
||||
/// Build a subagent directive prompt.
|
||||
///
|
||||
/// The directive is embedded in a system message that also communicates the
|
||||
@@ -119,6 +152,25 @@ mod tests {
|
||||
assert!(prompt.contains("WORKFLOW FIRST"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn project_context_prompt_appends_context_and_keeps_base() {
|
||||
let base = main_agent_prompt();
|
||||
let with_ctx = main_agent_prompt_with_project_context("## AGENTS.md\nUse cargo clippy.");
|
||||
assert!(with_ctx.contains("Zesdex"), "base prompt must be preserved");
|
||||
assert!(with_ctx.contains("PROJECT CONTEXT"));
|
||||
assert!(with_ctx.contains("Use cargo clippy."));
|
||||
assert!(with_ctx.contains(&base));
|
||||
// The base section should appear before the context section.
|
||||
assert!(with_ctx.find("PROJECT CONTEXT").unwrap() > with_ctx.find("Zesdex").unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_project_context_returns_base_prompt() {
|
||||
let base = main_agent_prompt();
|
||||
assert_eq!(main_agent_prompt_with_project_context(""), base);
|
||||
assert_eq!(main_agent_prompt_with_project_context(" "), base);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn subagent_directive_includes_directive_text() {
|
||||
let prompt = subagent_directive("test directive", "/home", "/home/project");
|
||||
|
||||
@@ -58,6 +58,9 @@ pub use agent::*;
|
||||
// Sub-module items need explicit re-exports
|
||||
pub use agent::defaults::*;
|
||||
pub use agent::progress::AgentProgress;
|
||||
pub use agent::prompt::{compaction_prompt, main_agent_prompt, subagent_directive};
|
||||
pub use agent::prompt::{
|
||||
compaction_prompt, main_agent_prompt, main_agent_prompt_with_project_context,
|
||||
subagent_directive,
|
||||
};
|
||||
pub use subagent::*;
|
||||
pub use workflow::*;
|
||||
|
||||
Reference in New Issue
Block a user