1use clap::{Args, Parser, Subcommand};
16
17#[derive(Debug, Parser)]
19#[command(name = "kindling", version, about, long_about = None)]
20pub struct Cli {
21 #[arg(long, global = true)]
25 pub via_daemon: bool,
26
27 #[command(subcommand)]
28 pub command: Command,
29}
30
31#[derive(Debug, Args, Clone, Default)]
33pub struct CommonOpts {
34 #[arg(long, value_name = "path")]
36 pub db: Option<String>,
37
38 #[arg(long)]
40 pub json: bool,
41}
42
43#[derive(Debug, Subcommand)]
44pub enum Command {
45 Init(InitArgs),
47
48 Log(LogArgs),
50
51 #[command(subcommand)]
53 Capsule(CapsuleCommand),
54
55 Status(StatusArgs),
57
58 Search(SearchArgs),
60
61 List(ListArgs),
63
64 Pin(PinArgs),
66
67 Unpin(UnpinArgs),
69
70 Forget(ForgetArgs),
72
73 Export(ExportArgs),
75
76 Import(ImportArgs),
78
79 Serve(ServeArgs),
81
82 Demo(DemoArgs),
84
85 Browse(BrowseArgs),
87
88 #[command(subcommand)]
90 Spool(SpoolCommand),
91}
92
93#[derive(Debug, Args)]
94pub struct InitArgs {
95 #[arg(long, value_name = "path")]
97 pub db: Option<String>,
98
99 #[arg(long)]
101 pub claude_code: bool,
102
103 #[arg(long)]
105 pub skip_db: bool,
106
107 #[arg(long)]
109 pub json: bool,
110}
111
112#[derive(Debug, Args)]
113pub struct LogArgs {
114 pub content: String,
116
117 #[arg(long, value_name = "kind", default_value = "message")]
119 pub kind: String,
120
121 #[arg(long, value_name = "id")]
123 pub session: Option<String>,
124
125 #[arg(long, value_name = "id")]
127 pub repo: Option<String>,
128
129 #[arg(long, value_name = "id")]
131 pub capsule: Option<String>,
132
133 #[command(flatten)]
134 pub common: CommonOpts,
135}
136
137#[derive(Debug, Subcommand)]
138pub enum CapsuleCommand {
139 Open(CapsuleOpenArgs),
141 Close(CapsuleCloseArgs),
143}
144
145#[derive(Debug, Args)]
146pub struct CapsuleOpenArgs {
147 #[arg(long, value_name = "text")]
149 pub intent: String,
150
151 #[arg(long = "type", value_name = "type", default_value = "session")]
153 pub kind: String,
154
155 #[arg(long, value_name = "id")]
157 pub session: Option<String>,
158
159 #[arg(long, value_name = "id")]
161 pub repo: Option<String>,
162
163 #[command(flatten)]
164 pub common: CommonOpts,
165}
166
167#[derive(Debug, Args)]
168pub struct CapsuleCloseArgs {
169 pub id: String,
171
172 #[arg(long, value_name = "text")]
174 pub summary: Option<String>,
175
176 #[command(flatten)]
177 pub common: CommonOpts,
178}
179
180#[derive(Debug, Args)]
181pub struct StatusArgs {
182 #[command(flatten)]
183 pub common: CommonOpts,
184}
185
186#[derive(Debug, Args)]
187pub struct SearchArgs {
188 pub query: String,
190
191 #[arg(long, value_name = "id")]
193 pub session: Option<String>,
194
195 #[arg(long, value_name = "id")]
197 pub repo: Option<String>,
198
199 #[arg(long, value_name = "n", default_value_t = 10)]
201 pub max: u32,
202
203 #[command(flatten)]
204 pub common: CommonOpts,
205}
206
207#[derive(Debug, Args)]
208pub struct ListArgs {
209 pub entity: String,
211
212 #[arg(long, value_name = "id")]
214 pub session: Option<String>,
215
216 #[arg(long, value_name = "id")]
218 pub repo: Option<String>,
219
220 #[arg(long, value_name = "n", default_value_t = 20)]
222 pub limit: u32,
223
224 #[command(flatten)]
225 pub common: CommonOpts,
226}
227
228#[derive(Debug, Args)]
229pub struct PinArgs {
230 #[arg(value_name = "type")]
232 pub target_type: String,
233
234 pub id: String,
236
237 #[arg(long, value_name = "text")]
239 pub note: Option<String>,
240
241 #[arg(long, value_name = "ms")]
243 pub ttl: Option<i64>,
244
245 #[command(flatten)]
246 pub common: CommonOpts,
247}
248
249#[derive(Debug, Args)]
250pub struct UnpinArgs {
251 pub id: String,
253
254 #[command(flatten)]
255 pub common: CommonOpts,
256}
257
258#[derive(Debug, Args)]
259pub struct ForgetArgs {
260 pub id: String,
262
263 #[command(flatten)]
264 pub common: CommonOpts,
265}
266
267#[derive(Debug, Args)]
268pub struct ExportArgs {
269 pub output: Option<String>,
271
272 #[arg(long, value_name = "id")]
274 pub session: Option<String>,
275
276 #[arg(long, value_name = "id")]
278 pub repo: Option<String>,
279
280 #[arg(long)]
282 pub pretty: bool,
283
284 #[arg(long, value_name = "ms", hide = true)]
288 pub timestamp: Option<i64>,
289
290 #[command(flatten)]
291 pub common: CommonOpts,
292}
293
294#[derive(Debug, Args)]
295pub struct ImportArgs {
296 pub file: String,
298
299 #[arg(long)]
301 pub dry_run: bool,
302
303 #[command(flatten)]
304 pub common: CommonOpts,
305}
306
307#[derive(Debug, Args)]
308pub struct ServeArgs {
309 #[arg(long, value_name = "path")]
311 pub socket: Option<String>,
312
313 #[arg(long, value_name = "secs", default_value_t = 1800)]
315 pub idle_timeout: u64,
316
317 #[arg(long, value_name = "path")]
320 pub kindling_home: Option<String>,
321
322 #[arg(long)]
330 pub daemonize: bool,
331}
332
333#[derive(Debug, Args)]
334pub struct DemoArgs {
335 #[arg(long)]
337 pub reset: bool,
338
339 #[command(flatten)]
340 pub common: CommonOpts,
341}
342
343#[derive(Debug, Subcommand)]
344pub enum SpoolCommand {
345 Status(SpoolStatusArgs),
347}
348
349#[derive(Debug, Args)]
350pub struct SpoolStatusArgs {
351 #[arg(long, value_name = "path")]
353 pub spool_path: String,
354
355 #[arg(long)]
357 pub json: bool,
358}
359
360#[derive(Debug, Args)]
361pub struct BrowseArgs {
362 #[arg(long, value_name = "path")]
364 pub output: Option<String>,
365
366 #[arg(long)]
368 pub no_open: bool,
369
370 #[command(flatten)]
371 pub common: CommonOpts,
372}