aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-ai/src/commands/inline.rs
diff options
context:
space:
mode:
authorMichelle Tilley <michelle@michelletilley.net>2026-04-23 13:43:01 -0700
committerGitHub <noreply@github.com>2026-04-23 13:43:01 -0700
commit461ef4c43589c6ca68176c180fd04f2755c9f036 (patch)
treec646ea272d6016533c4941592f9a22baa2a54488 /crates/atuin-ai/src/commands/inline.rs
parentfeat: Send user-defined context with `TERMINAL.md` (#3443) (diff)
downloadatuin-461ef4c43589c6ca68176c180fd04f2755c9f036.zip
feat: Add skill discovery, loading, and invocation (#3444)
Adds a skills system that lets users define reusable LLM instructions as `SKILL.md` files with YAML frontmatter.
Diffstat (limited to 'crates/atuin-ai/src/commands/inline.rs')
-rw-r--r--crates/atuin-ai/src/commands/inline.rs30
1 files changed, 27 insertions, 3 deletions
diff --git a/crates/atuin-ai/src/commands/inline.rs b/crates/atuin-ai/src/commands/inline.rs
index adedc542..70f26c65 100644
--- a/crates/atuin-ai/src/commands/inline.rs
+++ b/crates/atuin-ai/src/commands/inline.rs
@@ -247,8 +247,15 @@ async fn run_inline_tui(
let in_git_project = ctx.git_root.is_some();
+ // ─── Discover skills ───────────────────────────────────────
+ let project_root = ctx
+ .git_root
+ .clone()
+ .or_else(|| std::env::current_dir().ok());
+ let skill_registry = crate::skills::SkillRegistry::discover(project_root.as_deref()).await;
+
// ─── Build initial ViewState from FSM ───────────────────────
- let initial_view = build_view_state(&fsm, in_git_project);
+ let initial_view = build_view_state(&fsm, in_git_project, &skill_registry);
// ─── Build IoContext ────────────────────────────────────────
let io = IoContext {
@@ -258,6 +265,7 @@ async fn run_inline_tui(
file_tracker,
edit_permissions,
snapshot_store,
+ skill_registry,
};
// ─── Channel + Application ──────────────────────────────────
@@ -324,8 +332,23 @@ impl DriverEventSender {
/// Build a ViewState snapshot from FSM state. Used for the initial view
/// and by the driver for ongoing sync.
-fn build_view_state(fsm: &AgentFsm, in_git_project: bool) -> ViewState {
+fn build_view_state(
+ fsm: &AgentFsm,
+ in_git_project: bool,
+ skill_registry: &crate::skills::SkillRegistry,
+) -> ViewState {
let safe_start = fsm.ctx.view_start_index.min(fsm.ctx.events.len());
+
+ let mut slash_registry = crate::tui::slash::SlashCommandRegistry::default();
+ let mut skill_names = std::collections::HashSet::new();
+ for skill in skill_registry.all() {
+ slash_registry.register(crate::tui::slash::SlashCommand::new(
+ &skill.name,
+ &skill.description,
+ ));
+ skill_names.insert(skill.name.clone());
+ }
+
ViewState {
agent_state: fsm.state.clone(),
visible_events: fsm.ctx.events[safe_start..].to_vec(),
@@ -341,7 +364,8 @@ fn build_view_state(fsm: &AgentFsm, in_git_project: bool) -> ViewState {
slash_command_input: None,
slash_command_search_results: Vec::new(),
exit_action: None,
- slash_registry: Default::default(),
+ slash_registry,
+ skill_names,
}
}