feat(skills): capacités agent découvrables via idea_list_agents

Ajoute SkillKind (Workflow/Reference) sur Skill, extrait le use case
ResolveAgentCapabilities à partir des SkillRef assignés, et enrichit
idea_list_agents d'un champ additif capabilities (name, description,
kind) — remplace l'exposition de SkillRef opaques par un inventaire de
capacités interrogeable, source commune avec le bloc « Skills
disponibles » injecté au lancement (#119).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 00:26:56 +02:00
parent 5efb026a80
commit 92b17e9a69
18 changed files with 467 additions and 83 deletions

View File

@ -827,6 +827,43 @@ async fn list_reconstructs_agents_from_manifest() {
assert_eq!(out.agents, vec![a]);
}
#[tokio::test]
async fn list_resolves_agent_capabilities_additively() {
let mut a = scratch_agent(aid(1), "Backend", "agents/backend.md", pid(9));
let skill_id = SkillId::from_uuid(uuid::Uuid::from_u128(77));
a.assign_skill(domain::SkillRef::new(skill_id, domain::SkillScope::Global));
let contexts = FakeContexts::with_agent(&a, "ctx");
let skills = FakeSkills::with(vec![Skill::new(
skill_id,
"review",
MarkdownDoc::new("# Review workflow\n\nbody"),
domain::SkillScope::Global,
)
.unwrap()
.with_description(Some("Reviews changes".to_owned()))
.with_kind(domain::SkillKind::Reference)]);
let resolver = Arc::new(application::ResolveAgentCapabilities::new(Arc::new(skills)));
let list = ListAgents::with_capabilities(Arc::new(contexts), resolver);
let out = list
.execute(ListAgentsInput { project: project() })
.await
.unwrap();
assert_eq!(out.agents, vec![a.clone()]);
let entries = out.discovery_entries();
assert_eq!(entries.len(), 1);
assert_eq!(entries[0].agent.id, a.id);
assert_eq!(entries[0].agent.skills.len(), 1);
assert_eq!(entries[0].capabilities.len(), 1);
assert_eq!(entries[0].capabilities[0].name, "review");
assert_eq!(entries[0].capabilities[0].description, "Reviews changes");
assert_eq!(
entries[0].capabilities[0].kind,
domain::SkillKind::Reference
);
}
#[tokio::test]
async fn read_then_update_context_roundtrips() {
let a = scratch_agent(aid(1), "Backend", "agents/backend.md", pid(9));