@taurgis/bonsai 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +53 -0
  2. package/agents/agents/official-docs-researcher.agent.md +10 -1
  3. package/agents/agents/salesforce-docs-researcher.agent.md +10 -1
  4. package/agents/instructions/salesforce-research.instructions.md +4 -2
  5. package/agents/instructions/web-research.instructions.md +4 -2
  6. package/agents/skills/web-research/SKILL.md +8 -3
  7. package/bin/cli.mjs +30 -13
  8. package/dist/base-command.d.ts +3 -0
  9. package/dist/base-command.js +40 -7
  10. package/dist/commands/config/base.d.ts +2 -0
  11. package/dist/commands/config/base.js +15 -1
  12. package/dist/commands/config/get.d.ts +1 -1
  13. package/dist/commands/config/get.js +4 -5
  14. package/dist/commands/config/index.d.ts +12 -0
  15. package/dist/commands/config/index.js +34 -0
  16. package/dist/commands/config/list.js +2 -2
  17. package/dist/commands/config/set.js +18 -12
  18. package/dist/commands/config/unset.d.ts +1 -1
  19. package/dist/commands/config/unset.js +9 -6
  20. package/dist/commands/fetch.js +44 -34
  21. package/dist/commands/import.d.ts +3 -0
  22. package/dist/commands/import.js +82 -52
  23. package/dist/commands/inspect.d.ts +4 -0
  24. package/dist/commands/inspect.js +24 -19
  25. package/dist/commands/list.d.ts +2 -2
  26. package/dist/commands/list.js +23 -15
  27. package/dist/commands/prune.d.ts +1 -1
  28. package/dist/commands/prune.js +30 -13
  29. package/dist/commands/search.d.ts +4 -0
  30. package/dist/commands/search.js +83 -21
  31. package/dist/commands/status.d.ts +6 -0
  32. package/dist/commands/status.js +50 -24
  33. package/dist/commands.d.ts +2 -0
  34. package/dist/commands.js +2 -0
  35. package/dist/hooks/command-not-found/suggest.js +37 -8
  36. package/dist/lib/argv.d.ts +10 -0
  37. package/dist/lib/argv.js +53 -0
  38. package/dist/lib/envelope.d.ts +36 -0
  39. package/dist/lib/envelope.js +76 -0
  40. package/dist/lib/json-meta.d.ts +10 -0
  41. package/dist/lib/json-meta.js +98 -0
  42. package/dist/lib/research/revalidate.js +3 -1
  43. package/dist/lib/research/schema.d.ts +5 -2
  44. package/dist/lib/research/schema.js +12 -1
  45. package/dist/lib/text.d.ts +2 -0
  46. package/dist/lib/text.js +2 -0
  47. package/dist/sites/algolia.d.ts +9 -0
  48. package/dist/sites/algolia.js +26 -0
  49. package/dist/sites/auto.d.ts +8 -0
  50. package/dist/sites/auto.js +30 -0
  51. package/dist/sites/index.js +17 -1
  52. package/dist/sites/nextjs/index.d.ts +2 -0
  53. package/dist/sites/nextjs/index.js +52 -0
  54. package/dist/sites/react/index.d.ts +2 -0
  55. package/dist/sites/react/index.js +17 -0
  56. package/dist/sites/tailwind/index.d.ts +2 -0
  57. package/dist/sites/tailwind/index.js +17 -0
  58. package/dist/sites/vue/index.d.ts +2 -0
  59. package/dist/sites/vue/index.js +17 -0
  60. package/oclif.manifest.json +149 -76
  61. package/package.json +8 -2
@@ -4,7 +4,7 @@
4
4
  "aliases": [],
5
5
  "args": {
6
6
  "url": {
7
- "description": "The full HTTP/HTTPS URL of the web page to research.",
7
+ "description": "the full HTTP/HTTPS URL of the web page to research",
8
8
  "name": "url",
9
9
  "required": true
10
10
  }
@@ -12,11 +12,11 @@
12
12
  "description": "Scrapes the specified URL, strips HTML boilerplate, converts the semantic payload into clean Markdown format, and caches the result locally using dynamic TTL rules.\n\nUsually invoked via the shorthand `bonsai <url>` rather than `bonsai fetch <url>`.",
13
13
  "examples": [
14
14
  {
15
- "description": "Research a URL with detailed output, tagged with topic and tags",
15
+ "description": "research a URL with detailed output, tagged with topic and tags",
16
16
  "command": "<%= config.bin %> https://docs.nestjs.com/ --topic \"Backend Frameworks\" --tags \"Node\" --tags \"NestJS\" --format detailed --ttl 30d"
17
17
  },
18
18
  {
19
- "description": "Research a volatile page with compressed output and short TTL, returned as JSON",
19
+ "description": "research a volatile page with compressed output and short TTL, returned as JSON",
20
20
  "command": "<%= config.bin %> https://news.ycombinator.com/ --format compressed --ttl 2h --json"
21
21
  }
22
22
  ],
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "topic": {
32
32
  "char": "t",
33
- "description": "The main category/topic of the research for metadata tagging.",
33
+ "description": "the main category/topic of the research for metadata tagging",
34
34
  "name": "topic",
35
35
  "hasDynamicHelp": false,
36
36
  "multiple": false,
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "tags": {
40
40
  "char": "g",
41
- "description": "Taxonomic tags for this research (can be repeated).",
41
+ "description": "taxonomic tags for this research (can be repeated)",
42
42
  "name": "tags",
43
43
  "hasDynamicHelp": false,
44
44
  "multiple": true,
@@ -46,7 +46,7 @@
46
46
  },
47
47
  "format": {
48
48
  "char": "f",
49
- "description": "Desired data density.",
49
+ "description": "desired data density",
50
50
  "name": "format",
51
51
  "default": "compressed",
52
52
  "hasDynamicHelp": false,
@@ -58,7 +58,7 @@
58
58
  "type": "option"
59
59
  },
60
60
  "tier": {
61
- "description": "Freshness tier policy.",
61
+ "description": "freshness tier policy",
62
62
  "name": "tier",
63
63
  "default": "standard",
64
64
  "hasDynamicHelp": false,
@@ -72,45 +72,45 @@
72
72
  },
73
73
  "ttl": {
74
74
  "char": "l",
75
- "description": "Predicted lifespan: number + h/d/w/m/y (m = months), e.g. \"2h\", \"7d\", \"6m\".",
75
+ "description": "predicted lifespan: number + h/d/w/m/y (m = months), e.g. \"2h\", \"7d\", \"6m\"",
76
76
  "name": "ttl",
77
77
  "hasDynamicHelp": false,
78
78
  "multiple": false,
79
79
  "type": "option"
80
80
  },
81
81
  "max-age": {
82
- "description": "Maximum age of cache to accept (e.g., \"1d\", \"30d\").",
82
+ "description": "maximum age of cache to accept (e.g., \"1d\", \"30d\")",
83
83
  "name": "max-age",
84
84
  "hasDynamicHelp": false,
85
85
  "multiple": false,
86
86
  "type": "option"
87
87
  },
88
88
  "force": {
89
- "description": "Force a fresh fetch, ignoring any cached entries.",
89
+ "description": "force a fresh fetch, ignoring any cached entries",
90
90
  "name": "force",
91
91
  "allowNo": false,
92
92
  "type": "boolean"
93
93
  },
94
94
  "dry-run": {
95
- "description": "Perform validation and fetch without saving to local cache.",
95
+ "description": "perform validation and fetch without saving to local cache",
96
96
  "name": "dry-run",
97
97
  "allowNo": false,
98
98
  "type": "boolean"
99
99
  },
100
100
  "allow-stale": {
101
- "description": "Allow serving stale cache if the remote server is unreachable.",
101
+ "description": "allow serving stale cache if the remote server is unreachable",
102
102
  "name": "allow-stale",
103
103
  "allowNo": false,
104
104
  "type": "boolean"
105
105
  },
106
106
  "rendered": {
107
- "description": "Force using a browser-rendered scraping path for dynamic pages.",
107
+ "description": "force using a browser-rendered scraping path for dynamic pages",
108
108
  "name": "rendered",
109
109
  "allowNo": false,
110
110
  "type": "boolean"
111
111
  },
112
112
  "storage": {
113
- "description": "Override where this result is cached (overrides configured default). Secret-bearing pages are always stored globally.",
113
+ "description": "override where this result is cached (secrets always stored globally)",
114
114
  "name": "storage",
115
115
  "hasDynamicHelp": false,
116
116
  "multiple": false,
@@ -137,7 +137,7 @@
137
137
  "aliases": [],
138
138
  "args": {
139
139
  "url": {
140
- "description": "The single source URL of the page (only for single-source import).",
140
+ "description": "the single source URL of the page (only for single-source import)",
141
141
  "name": "url",
142
142
  "required": false
143
143
  }
@@ -145,15 +145,15 @@
145
145
  "description": "Accepts a synthesized Markdown note via stdin and registers it under the single target URL or multiple source URLs.",
146
146
  "examples": [
147
147
  {
148
- "description": "Import detailed research for a single URL via stdin",
148
+ "description": "import detailed research for a single URL via stdin",
149
149
  "command": "echo \"# My Article\" | <%= config.bin %> import https://example.com/docs --stdin"
150
150
  },
151
151
  {
152
- "description": "Import research synthesized from multiple source URLs",
152
+ "description": "import research synthesized from multiple source URLs",
153
153
  "command": "echo \"# Synthesized\" | <%= config.bin %> import --stdin --topic \"React docs\" --source-url https://react.dev/a --source-url https://react.dev/b"
154
154
  },
155
155
  {
156
- "description": "Import research from a local Markdown file",
156
+ "description": "import research from a local Markdown file",
157
157
  "command": "<%= config.bin %> import https://example.com/docs --file path/to/notes.md"
158
158
  }
159
159
  ],
@@ -166,20 +166,20 @@
166
166
  "type": "boolean"
167
167
  },
168
168
  "stdin": {
169
- "description": "Read Markdown from stdin.",
169
+ "description": "read Markdown from stdin",
170
170
  "name": "stdin",
171
171
  "allowNo": false,
172
172
  "type": "boolean"
173
173
  },
174
174
  "file": {
175
- "description": "Path to a Markdown file containing research notes to import.",
175
+ "description": "path to a Markdown file containing research notes to import",
176
176
  "name": "file",
177
177
  "hasDynamicHelp": false,
178
178
  "multiple": false,
179
179
  "type": "option"
180
180
  },
181
181
  "input-format": {
182
- "description": "Format of the input provided.",
182
+ "description": "format of the input provided",
183
183
  "name": "input-format",
184
184
  "default": "detailed",
185
185
  "hasDynamicHelp": false,
@@ -192,7 +192,7 @@
192
192
  },
193
193
  "topic": {
194
194
  "char": "t",
195
- "description": "The main topic for this research note.",
195
+ "description": "the main topic for this research note",
196
196
  "name": "topic",
197
197
  "hasDynamicHelp": false,
198
198
  "multiple": false,
@@ -200,14 +200,14 @@
200
200
  },
201
201
  "tags": {
202
202
  "char": "g",
203
- "description": "Taxonomic tags (can be repeated).",
203
+ "description": "taxonomic tags (can be repeated)",
204
204
  "name": "tags",
205
205
  "hasDynamicHelp": false,
206
206
  "multiple": true,
207
207
  "type": "option"
208
208
  },
209
209
  "tier": {
210
- "description": "Freshness tier policy.",
210
+ "description": "freshness tier policy",
211
211
  "name": "tier",
212
212
  "default": "standard",
213
213
  "hasDynamicHelp": false,
@@ -220,7 +220,7 @@
220
220
  "type": "option"
221
221
  },
222
222
  "source-url": {
223
- "description": "Repeated source URLs for multi-source import.",
223
+ "description": "repeated source URLs for multi-source import",
224
224
  "name": "source-url",
225
225
  "hasDynamicHelp": false,
226
226
  "multiple": true,
@@ -228,14 +228,14 @@
228
228
  },
229
229
  "ttl": {
230
230
  "char": "l",
231
- "description": "Predicted lifespan of the data (e.g. \"24h\", \"7d\").",
231
+ "description": "predicted lifespan of the data (e.g. \"24h\", \"7d\")",
232
232
  "name": "ttl",
233
233
  "hasDynamicHelp": false,
234
234
  "multiple": false,
235
235
  "type": "option"
236
236
  },
237
237
  "storage": {
238
- "description": "Override where this note is cached (overrides configured default). Secret-bearing notes are always stored globally.",
238
+ "description": "override where this note is cached (secrets always stored globally)",
239
239
  "name": "storage",
240
240
  "hasDynamicHelp": false,
241
241
  "multiple": false,
@@ -261,12 +261,22 @@
261
261
  "aliases": [],
262
262
  "args": {
263
263
  "url": {
264
- "description": "The URL to inspect.",
264
+ "description": "the URL to inspect",
265
265
  "name": "url",
266
266
  "required": true
267
267
  }
268
268
  },
269
269
  "description": "Inspects local storage and displays full frontmatter metadata for the URL (without printing the content body).",
270
+ "examples": [
271
+ {
272
+ "description": "inspect cached research metadata for a specific URL",
273
+ "command": "<%= config.bin %> <%= command.id %> https://example.com/docs"
274
+ },
275
+ {
276
+ "description": "output the full metadata as JSON for use by other tools",
277
+ "command": "<%= config.bin %> <%= command.id %> https://example.com/docs --json"
278
+ }
279
+ ],
270
280
  "flags": {
271
281
  "json": {
272
282
  "description": "Format output as json.",
@@ -293,15 +303,15 @@
293
303
  "description": "Lists cached research artifacts, including metadata details like path, source count, freshness, token estimates, and quality metrics without printing full content.",
294
304
  "examples": [
295
305
  {
296
- "description": "List all cached entries",
306
+ "description": "list all cached entries",
297
307
  "command": "<%= config.bin %> list"
298
308
  },
299
309
  {
300
- "description": "List cached entries for a specific topic with JSON output",
310
+ "description": "list cached entries for a specific topic with JSON output",
301
311
  "command": "<%= config.bin %> list --topic \"React Suspense\" --json"
302
312
  },
303
313
  {
304
- "description": "List only fresh entries filtered by tags",
314
+ "description": "list only fresh entries filtered by tags",
305
315
  "command": "<%= config.bin %> list --freshness fresh --tags node --tags url"
306
316
  }
307
317
  ],
@@ -315,7 +325,7 @@
315
325
  },
316
326
  "topic": {
317
327
  "char": "t",
318
- "description": "Filter by exact topic (case-insensitive).",
328
+ "description": "filter by exact topic (case-insensitive)",
319
329
  "name": "topic",
320
330
  "hasDynamicHelp": false,
321
331
  "multiple": false,
@@ -323,14 +333,14 @@
323
333
  },
324
334
  "tags": {
325
335
  "char": "g",
326
- "description": "Filter by tags (must match all tags specified).",
336
+ "description": "filter by tags (must match all tags specified)",
327
337
  "name": "tags",
328
338
  "hasDynamicHelp": false,
329
339
  "multiple": true,
330
340
  "type": "option"
331
341
  },
332
342
  "freshness": {
333
- "description": "Filter by freshness state.",
343
+ "description": "filter by freshness state",
334
344
  "name": "freshness",
335
345
  "hasDynamicHelp": false,
336
346
  "multiple": false,
@@ -342,30 +352,33 @@
342
352
  "type": "option"
343
353
  },
344
354
  "artifact-type": {
345
- "description": "Filter by artifact type.",
355
+ "description": "filter by artifact type",
346
356
  "name": "artifact-type",
347
357
  "hasDynamicHelp": false,
348
358
  "multiple": false,
349
359
  "options": [
350
360
  "source",
351
- "research_note"
361
+ "research_note",
362
+ "index"
352
363
  ],
353
364
  "type": "option"
354
365
  },
355
366
  "capture-method": {
356
- "description": "Filter by capture method.",
367
+ "description": "filter by capture method",
357
368
  "name": "capture-method",
358
369
  "hasDynamicHelp": false,
359
370
  "multiple": false,
360
371
  "options": [
361
372
  "static_fetch",
362
373
  "browser_fallback",
363
- "agent_supplied"
374
+ "agent_supplied",
375
+ "route_markdown",
376
+ "github_source"
364
377
  ],
365
378
  "type": "option"
366
379
  },
367
380
  "limit": {
368
- "description": "Maximum number of results to return (default 50, max 100).",
381
+ "description": "maximum number of results to return (default 50, max 100)",
369
382
  "name": "limit",
370
383
  "default": 50,
371
384
  "hasDynamicHelp": false,
@@ -390,11 +403,11 @@
390
403
  "description": "Prunes cached research entries based on age, inactivity, or artifact type to free up disk space.",
391
404
  "examples": [
392
405
  {
393
- "description": "Perform a dry run of pruning entries older than 90 days",
406
+ "description": "perform a dry run of pruning entries older than 90 days",
394
407
  "command": "<%= config.bin %> prune --older-than 90d --dry-run"
395
408
  },
396
409
  {
397
- "description": "Actually prune entries older than 30 days that are source scrapes",
410
+ "description": "actually prune entries older than 30 days that are source scrapes",
398
411
  "command": "<%= config.bin %> prune --older-than 30d --artifact-type source --yes"
399
412
  }
400
413
  ],
@@ -407,39 +420,41 @@
407
420
  "type": "boolean"
408
421
  },
409
422
  "older-than": {
410
- "description": "Prune entries older than duration (e.g. \"30d\", \"90d\").",
423
+ "description": "prune entries older than duration (e.g. \"30d\", \"90d\")",
411
424
  "name": "older-than",
412
425
  "hasDynamicHelp": false,
413
426
  "multiple": false,
414
427
  "type": "option"
415
428
  },
416
429
  "inactive": {
417
- "description": "Prune entries inactive (unvalidated/unfetched) for duration (e.g. \"14d\", \"30d\").",
430
+ "description": "prune entries inactive (unvalidated/unfetched) for duration (e.g. \"14d\", \"30d\")",
418
431
  "name": "inactive",
419
432
  "hasDynamicHelp": false,
420
433
  "multiple": false,
421
434
  "type": "option"
422
435
  },
423
436
  "artifact-type": {
424
- "description": "Filter pruning to specific artifact type.",
437
+ "description": "filter pruning to specific artifact type",
425
438
  "name": "artifact-type",
426
439
  "hasDynamicHelp": false,
427
440
  "multiple": false,
428
441
  "options": [
429
442
  "source",
430
- "research_note"
443
+ "research_note",
444
+ "index",
445
+ "section"
431
446
  ],
432
447
  "type": "option"
433
448
  },
434
449
  "dry-run": {
435
- "description": "List files that would be deleted without actually deleting them.",
450
+ "description": "list files that would be deleted without actually deleting them",
436
451
  "name": "dry-run",
437
452
  "allowNo": false,
438
453
  "type": "boolean"
439
454
  },
440
455
  "yes": {
441
456
  "char": "y",
442
- "description": "Skip confirmation prompt and prune files.",
457
+ "description": "confirm deletion and prune matched entries (required unless --dry-run)",
443
458
  "name": "yes",
444
459
  "allowNo": false,
445
460
  "type": "boolean"
@@ -460,12 +475,26 @@
460
475
  "aliases": [],
461
476
  "args": {
462
477
  "query": {
463
- "description": "The search query containing terms to match.",
478
+ "description": "the search query containing terms to match",
464
479
  "name": "query",
465
480
  "required": true
466
481
  }
467
482
  },
468
483
  "description": "Scans the local research cache database and ranks matching entries based on topic, tags, source URLs, summary, and content.",
484
+ "examples": [
485
+ {
486
+ "description": "search for cached notes containing specific keywords",
487
+ "command": "<%= config.bin %> <%= command.id %> \"authentication flow\""
488
+ },
489
+ {
490
+ "description": "search with remote docs fallback",
491
+ "command": "<%= config.bin %> <%= command.id %> \"router\" --remote https://react.dev"
492
+ },
493
+ {
494
+ "description": "search local cache with tag filtering",
495
+ "command": "<%= config.bin %> <%= command.id %> \"setup\" --tags node --tags tutorial"
496
+ }
497
+ ],
469
498
  "flags": {
470
499
  "json": {
471
500
  "description": "Format output as json.",
@@ -476,7 +505,7 @@
476
505
  },
477
506
  "topic": {
478
507
  "char": "t",
479
- "description": "Filter results by exact topic (case-insensitive).",
508
+ "description": "filter results by exact topic (case-insensitive)",
480
509
  "name": "topic",
481
510
  "hasDynamicHelp": false,
482
511
  "multiple": false,
@@ -484,14 +513,14 @@
484
513
  },
485
514
  "tags": {
486
515
  "char": "g",
487
- "description": "Filter results by tags (must match all tags specified).",
516
+ "description": "filter results by tags (must match all tags specified)",
488
517
  "name": "tags",
489
518
  "hasDynamicHelp": false,
490
519
  "multiple": true,
491
520
  "type": "option"
492
521
  },
493
522
  "artifact-type": {
494
- "description": "Filter results by artifact type.",
523
+ "description": "filter results by artifact type",
495
524
  "name": "artifact-type",
496
525
  "hasDynamicHelp": false,
497
526
  "multiple": false,
@@ -504,7 +533,7 @@
504
533
  "type": "option"
505
534
  },
506
535
  "limit": {
507
- "description": "Maximum number of results to return (default 10, max 50).",
536
+ "description": "maximum number of results to return (default 10, max 50)",
508
537
  "name": "limit",
509
538
  "default": 10,
510
539
  "hasDynamicHelp": false,
@@ -512,20 +541,20 @@
512
541
  "type": "option"
513
542
  },
514
543
  "include-stale": {
515
- "description": "Include stale expired cache entries in the search results.",
544
+ "description": "include stale expired cache entries in the search results",
516
545
  "name": "include-stale",
517
546
  "allowNo": false,
518
547
  "type": "boolean"
519
548
  },
520
549
  "domain": {
521
- "description": "Search a documentation site directly (e.g. help.salesforce.com) instead of the local cache. Requires a site module that implements search.",
550
+ "description": "search a documentation site directly (requires compatible site module)",
522
551
  "name": "domain",
523
552
  "hasDynamicHelp": false,
524
553
  "multiple": false,
525
554
  "type": "option"
526
555
  },
527
556
  "remote": {
528
- "description": "Discover uncached docs via a site’s public search or index (Algolia DocSearch, MkDocs/Sphinx/Just-the-Docs, llms.txt, sitemap.xml). Pass a docs page URL; falls back to local cache search if no connector applies.",
557
+ "description": "discover uncached docs via public search or index (falls back to local cache)",
529
558
  "name": "remote",
530
559
  "hasDynamicHelp": false,
531
560
  "multiple": false,
@@ -547,12 +576,22 @@
547
576
  "aliases": [],
548
577
  "args": {
549
578
  "url": {
550
- "description": "The URL to check.",
579
+ "description": "the URL to check",
551
580
  "name": "url",
552
581
  "required": true
553
582
  }
554
583
  },
555
584
  "description": "Reports whether the URL is cached, its freshness state, and what action (fetch, revalidate, or cached return) the root fetch command would take.",
585
+ "examples": [
586
+ {
587
+ "description": "check if a URL is already in the cache",
588
+ "command": "<%= config.bin %> <%= command.id %> https://example.com/docs"
589
+ },
590
+ {
591
+ "description": "check status against a specific freshness tier and TTL",
592
+ "command": "<%= config.bin %> <%= command.id %> https://example.com/docs --tier volatile --ttl 2h"
593
+ }
594
+ ],
556
595
  "flags": {
557
596
  "json": {
558
597
  "description": "Format output as json.",
@@ -562,7 +601,7 @@
562
601
  "type": "boolean"
563
602
  },
564
603
  "tier": {
565
- "description": "Freshness tier policy to evaluate against.",
604
+ "description": "freshness tier policy to evaluate against",
566
605
  "name": "tier",
567
606
  "default": "standard",
568
607
  "hasDynamicHelp": false,
@@ -576,14 +615,14 @@
576
615
  },
577
616
  "ttl": {
578
617
  "char": "l",
579
- "description": "Custom TTL duration to evaluate against (e.g. \"2h\", \"7d\").",
618
+ "description": "custom TTL duration to evaluate against (e.g. \"2h\", \"7d\")",
580
619
  "name": "ttl",
581
620
  "hasDynamicHelp": false,
582
621
  "multiple": false,
583
622
  "type": "option"
584
623
  },
585
624
  "max-age": {
586
- "description": "Maximum age of cache to accept (e.g. \"1d\", \"30d\").",
625
+ "description": "maximum age of cache to accept (e.g. \"1d\", \"30d\")",
587
626
  "name": "max-age",
588
627
  "hasDynamicHelp": false,
589
628
  "multiple": false,
@@ -601,23 +640,57 @@
601
640
  "enableJsonFlag": true,
602
641
  "stdoutIsPrimaryData": true
603
642
  },
643
+ "config": {
644
+ "aliases": [],
645
+ "args": {},
646
+ "description": "Show config subcommands for reading and writing Bonsai research cache configuration.",
647
+ "examples": [
648
+ {
649
+ "description": "get a configuration value",
650
+ "command": "<%= config.bin %> <%= command.id %> get storage"
651
+ },
652
+ {
653
+ "description": "set a configuration value for the current project",
654
+ "command": "<%= config.bin %> <%= command.id %> set storage project --local"
655
+ }
656
+ ],
657
+ "flags": {
658
+ "json": {
659
+ "description": "Format output as json.",
660
+ "helpGroup": "GLOBAL",
661
+ "name": "json",
662
+ "allowNo": false,
663
+ "type": "boolean"
664
+ }
665
+ },
666
+ "hasDynamicHelp": false,
667
+ "hiddenAliases": [],
668
+ "id": "config",
669
+ "pluginAlias": "@taurgis/bonsai",
670
+ "pluginName": "@taurgis/bonsai",
671
+ "pluginType": "core",
672
+ "strict": true,
673
+ "summary": "Manage research cache storage configuration (global vs project).",
674
+ "enableJsonFlag": true,
675
+ "stdoutIsPrimaryData": true
676
+ },
604
677
  "config:get": {
605
678
  "aliases": [],
606
679
  "args": {
607
680
  "key": {
608
- "description": "The configuration key to read.",
681
+ "description": "the configuration key to read",
609
682
  "name": "key",
610
- "required": true
683
+ "required": false
611
684
  }
612
685
  },
613
686
  "description": "Print a config value. Without --global/--local, shows the merged effective value (flag > env > project > user > default).\n\nValid keys: storage, summary.",
614
687
  "examples": [
615
688
  {
616
- "description": "Get the effective storage mode",
689
+ "description": "get the effective storage mode",
617
690
  "command": "<%= config.bin %> config get storage"
618
691
  },
619
692
  {
620
- "description": "Read only the project-level value",
693
+ "description": "read only the project-level value",
621
694
  "command": "<%= config.bin %> config get storage --local"
622
695
  }
623
696
  ],
@@ -665,11 +738,11 @@
665
738
  "description": "Show every configuration key with its current value. Use --global/--local to show a single scope.\n\nValid keys: storage, summary.",
666
739
  "examples": [
667
740
  {
668
- "description": "Show all effective config values",
741
+ "description": "show all effective config values",
669
742
  "command": "<%= config.bin %> config list"
670
743
  },
671
744
  {
672
- "description": "Show only project-level config",
745
+ "description": "show only project-level config",
673
746
  "command": "<%= config.bin %> config list --local"
674
747
  }
675
748
  ],
@@ -715,12 +788,12 @@
715
788
  "aliases": [],
716
789
  "args": {
717
790
  "key": {
718
- "description": "The configuration key to set.",
791
+ "description": "the configuration key to set",
719
792
  "name": "key",
720
793
  "required": false
721
794
  },
722
795
  "value": {
723
- "description": "The value to assign.",
796
+ "description": "the value to assign",
724
797
  "name": "value",
725
798
  "required": false
726
799
  }
@@ -728,11 +801,11 @@
728
801
  "description": "Persist a configuration value. Writes user-level config by default; pass --local to write the project-level config (.bonsai.json in cwd).\n\nValid keys: storage, summary. The inline form `<key>=<value>` is also accepted.",
729
802
  "examples": [
730
803
  {
731
- "description": "Store research cache inside the current project",
804
+ "description": "store research cache inside the current project",
732
805
  "command": "<%= config.bin %> config set storage project --local"
733
806
  },
734
807
  {
735
- "description": "Set the user-level default using the inline key=value form",
808
+ "description": "set the user-level default using the inline key=value form",
736
809
  "command": "<%= config.bin %> config set storage=global"
737
810
  }
738
811
  ],
@@ -764,7 +837,7 @@
764
837
  "type": "boolean"
765
838
  },
766
839
  "dry-run": {
767
- "description": "Show what would be written without saving.",
840
+ "description": "show what would be written without saving",
768
841
  "name": "dry-run",
769
842
  "allowNo": false,
770
843
  "type": "boolean"
@@ -784,19 +857,19 @@
784
857
  "aliases": [],
785
858
  "args": {
786
859
  "key": {
787
- "description": "The configuration key to remove.",
860
+ "description": "the configuration key to remove",
788
861
  "name": "key",
789
- "required": true
862
+ "required": false
790
863
  }
791
864
  },
792
865
  "description": "Delete a key from user-level config (default) or project-level config (--local), restoring the built-in default.\n\nValid keys: storage, summary.",
793
866
  "examples": [
794
867
  {
795
- "description": "Remove the user-level storage setting",
868
+ "description": "remove the user-level storage setting",
796
869
  "command": "<%= config.bin %> config unset storage"
797
870
  },
798
871
  {
799
- "description": "Remove the project-level storage setting",
872
+ "description": "remove the project-level storage setting",
800
873
  "command": "<%= config.bin %> config unset storage --local"
801
874
  }
802
875
  ],
@@ -828,7 +901,7 @@
828
901
  "type": "boolean"
829
902
  },
830
903
  "dry-run": {
831
- "description": "Show what would be removed without saving.",
904
+ "description": "show what would be removed without saving",
832
905
  "name": "dry-run",
833
906
  "allowNo": false,
834
907
  "type": "boolean"
@@ -845,5 +918,5 @@
845
918
  "stdoutIsPrimaryData": true
846
919
  }
847
920
  },
848
- "version": "1.0.5"
921
+ "version": "1.0.6"
849
922
  }