From 9cc7deca118d608d787cb2679033d49d61f4b9ce Mon Sep 17 00:00:00 2001
From: th-kim0823
Date: Thu, 7 May 2026 18:06:25 +0900
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(kebab-cli):=20kebab=20ingest-f?=
=?UTF-8?q?ile=20subcommand=20(fb-31)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-Authored-By: Claude Opus 4.7 (1M context)
---
crates/kebab-cli/src/main.rs | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/crates/kebab-cli/src/main.rs b/crates/kebab-cli/src/main.rs
index db0f4b1..74046de 100644
--- a/crates/kebab-cli/src/main.rs
+++ b/crates/kebab-cli/src/main.rs
@@ -193,6 +193,13 @@ enum Cmd {
/// agent hosts (Claude Code / Cursor / OpenAI Agents) to call kebab
/// tools (search / ask / schema / doctor).
Mcp,
+
+ /// Ingest a single file (workspace external paths allowed).
+ /// Bytes are copied into `/_external/.`.
+ IngestFile {
+ /// File path to ingest.
+ path: std::path::PathBuf,
+ },
}
#[derive(Subcommand, Debug)]
@@ -745,6 +752,22 @@ fn run(cli: &Cli) -> anyhow::Result<()> {
}
},
+ Cmd::IngestFile { path } => {
+ let cfg = kebab_config::Config::load(cli.config.as_deref())?;
+ let report = kebab_app::ingest_file_with_config(cfg, path)?;
+ if cli.json {
+ let v = wire::wire_ingest(&report);
+ println!("{}", serde_json::to_string(&v)?);
+ } else {
+ println!(
+ "ingest-file: scanned={} new={} updated={} unchanged={} skipped={} errors={}",
+ report.scanned, report.new, report.updated,
+ report.unchanged, report.skipped, report.errors
+ );
+ }
+ Ok(())
+ }
+
Cmd::Mcp => {
let cfg = kebab_config::Config::load(cli.config.as_deref())?;
kebab_mcp::serve_stdio(cfg, cli.config.clone())