KeiSeiKit-1.0/_primitives/_rust/kei-projects-watcher/src/main.rs
Parfii-bot 0be354a920 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

66 lines
1.8 KiB
Rust

//! kei-projects-watcher — CLI binary.
//!
//! Expected install path (referenced by the launchd plist template
//! `kei-projects-watcher.plist.tmpl` shipped by the orchestrator):
//! ${KIT}/_rust/target/release/kei-projects-watcher run
//!
//! Subcommands:
//! run — daemon: watch ~/Projects and re-index on the fly
//! status — print last-indexed-ts of every project as JSON
use std::path::PathBuf;
use std::time::Duration;
use anyhow::{Context, Result};
use clap::{Parser, Subcommand};
use kei_projects_watcher::{cmd_run, cmd_status};
#[derive(Parser)]
#[command(name = "kei-projects-watcher", version)]
struct Cli {
#[command(subcommand)]
cmd: Cmd,
}
#[derive(Subcommand)]
enum Cmd {
/// Run the watcher daemon until SIGINT / SIGTERM.
Run {
#[arg(long)]
db: Option<PathBuf>,
#[arg(long)]
root: Option<PathBuf>,
#[arg(long, default_value_t = 2000)]
debounce_ms: u64,
},
/// Print last-indexed-ts of each project as JSON.
Status {
#[arg(long)]
db: Option<PathBuf>,
},
}
fn home_join(rel: &str) -> Result<PathBuf> {
Ok(dirs::home_dir().context("$HOME not set")?.join(rel))
}
fn default_db(opt: Option<PathBuf>) -> Result<PathBuf> {
opt.map(Ok)
.unwrap_or_else(|| home_join(".claude/agents/projects-index.sqlite"))
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.init();
match Cli::parse().cmd {
Cmd::Run { db, root, debounce_ms } => {
let db = default_db(db)?;
let root = root.map(Ok).unwrap_or_else(|| home_join("Projects"))?;
cmd_run(db, root, Duration::from_millis(debounce_ms)).await
}
Cmd::Status { db } => cmd_status(default_db(db)?),
}
}