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())