@taurgis/bonsai 3.2.2 → 4.1.0

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 (100) hide show
  1. package/README.md +25 -2
  2. package/agents/agents/official-docs-researcher.agent.md +102 -0
  3. package/agents/agents/salesforce-docs-researcher.agent.md +17 -15
  4. package/agents/hooks/README.md +18 -2
  5. package/agents/hooks/claude-code/hooks/bonsai-web-fetch.sh +1 -1
  6. package/agents/hooks/codex/hooks/bonsai-user-prompt-context.sh +1 -1
  7. package/agents/hooks/codex/hooks/bonsai-web-fetch.sh +1 -1
  8. package/agents/hooks/cursor/hooks/bonsai-web-fetch.sh +1 -1
  9. package/agents/hooks/github-copilot/bonsai-web-fetch.sh +1 -1
  10. package/agents/instructions/salesforce-research.instructions.md +5 -4
  11. package/agents/instructions/web-research.instructions.md +45 -0
  12. package/agents/skills/web-research/SKILL.md +139 -0
  13. package/bin/cli.mjs +7 -4
  14. package/dist/base-command.d.ts +42 -0
  15. package/dist/base-command.js +106 -6
  16. package/dist/commands/config/base.d.ts +2 -7
  17. package/dist/commands/config/base.js +4 -17
  18. package/dist/commands/config/get.js +2 -2
  19. package/dist/commands/config/list.js +2 -2
  20. package/dist/commands/config/set.js +2 -2
  21. package/dist/commands/config/unset.js +2 -2
  22. package/dist/commands/context.d.ts +20 -0
  23. package/dist/commands/context.js +65 -0
  24. package/dist/commands/fetch.js +4 -0
  25. package/dist/commands/inspect.js +11 -2
  26. package/dist/commands/list.d.ts +23 -11
  27. package/dist/commands/list.js +110 -121
  28. package/dist/commands/prune.d.ts +2 -0
  29. package/dist/commands/prune.js +35 -4
  30. package/dist/commands/search.d.ts +43 -0
  31. package/dist/commands/search.js +233 -0
  32. package/dist/commands/setup.d.ts +27 -0
  33. package/dist/commands/setup.js +148 -0
  34. package/dist/commands/status.js +10 -0
  35. package/dist/commands.d.ts +6 -0
  36. package/dist/commands.js +6 -0
  37. package/dist/hooks/command-not-found/suggest.d.ts +1 -1
  38. package/dist/hooks/command-not-found/suggest.js +12 -2
  39. package/dist/lib/argv.d.ts +5 -0
  40. package/dist/lib/argv.js +30 -5
  41. package/dist/lib/cli-flag-manifest.d.ts +7 -0
  42. package/dist/lib/cli-flag-manifest.js +7 -0
  43. package/dist/lib/cli-presentation.d.ts +25 -4
  44. package/dist/lib/cli-presentation.js +34 -4
  45. package/dist/lib/cli-result-types.d.ts +84 -1
  46. package/dist/lib/color.d.ts +2 -0
  47. package/dist/lib/color.js +6 -0
  48. package/dist/lib/common-metadata-filter-flags.d.ts +14 -0
  49. package/dist/lib/common-metadata-filter-flags.js +37 -0
  50. package/dist/lib/config/index.d.ts +2 -2
  51. package/dist/lib/config/index.js +2 -2
  52. package/dist/lib/config/io.d.ts +9 -0
  53. package/dist/lib/config/io.js +71 -21
  54. package/dist/lib/config/schema.d.ts +2 -0
  55. package/dist/lib/config/schema.js +7 -0
  56. package/dist/lib/envelope.js +11 -4
  57. package/dist/lib/next-command.d.ts +15 -0
  58. package/dist/lib/next-command.js +40 -0
  59. package/dist/lib/prune-flags.d.ts +2 -0
  60. package/dist/lib/prune-flags.js +18 -6
  61. package/dist/lib/research/artifact-index.js +7 -1
  62. package/dist/lib/research/artifact.js +20 -2
  63. package/dist/lib/research/browser.d.ts +12 -0
  64. package/dist/lib/research/browser.js +63 -8
  65. package/dist/lib/research/cli-io.d.ts +7 -0
  66. package/dist/lib/research/context-dashboard.d.ts +19 -0
  67. package/dist/lib/research/context-dashboard.js +43 -0
  68. package/dist/lib/research/fetch-command-service.js +90 -23
  69. package/dist/lib/research/fetch-result.d.ts +1 -0
  70. package/dist/lib/research/fetch-result.js +4 -0
  71. package/dist/lib/research/fetcher.js +3 -1
  72. package/dist/lib/research/import-command-service.js +22 -1
  73. package/dist/lib/research/list-row.d.ts +15 -0
  74. package/dist/lib/research/list-row.js +31 -0
  75. package/dist/lib/research/metadata-filters.d.ts +39 -0
  76. package/dist/lib/research/metadata-filters.js +71 -0
  77. package/dist/lib/research/metadata-flags.d.ts +34 -0
  78. package/dist/lib/research/metadata-flags.js +45 -0
  79. package/dist/lib/research/prompt-injection.d.ts +2 -1
  80. package/dist/lib/research/prompt-injection.js +18 -2
  81. package/dist/lib/research/resolve-target.d.ts +2 -0
  82. package/dist/lib/research/resolve-target.js +1 -1
  83. package/dist/lib/research/schema.d.ts +2 -0
  84. package/dist/lib/research/schema.js +4 -0
  85. package/dist/lib/research/search-match.d.ts +39 -0
  86. package/dist/lib/research/search-match.js +134 -0
  87. package/dist/lib/research/storage.d.ts +4 -7
  88. package/dist/lib/research/storage.js +26 -25
  89. package/dist/lib/scope-flags.d.ts +19 -0
  90. package/dist/lib/scope-flags.js +27 -0
  91. package/dist/lib/setup/agents.d.ts +16 -0
  92. package/dist/lib/setup/agents.js +20 -0
  93. package/dist/lib/setup/bin-command.d.ts +14 -0
  94. package/dist/lib/setup/bin-command.js +42 -0
  95. package/dist/lib/setup/hook-file-io.d.ts +37 -0
  96. package/dist/lib/setup/hook-file-io.js +80 -0
  97. package/dist/lib/text.d.ts +20 -8
  98. package/dist/lib/text.js +32 -9
  99. package/oclif.manifest.json +406 -13
  100. package/package.json +2 -1
@@ -1,5 +1,54 @@
1
1
  {
2
2
  "commands": {
3
+ "context": {
4
+ "aliases": [],
5
+ "args": {},
6
+ "description": "Print a short summary of the current research cache: total entries, a freshness breakdown, and the most recently touched pages. This is what `bonsai setup` wires into a SessionStart hook, so a session starts with the cache's state already visible.",
7
+ "examples": [
8
+ {
9
+ "description": "preview what a SessionStart hook would show",
10
+ "command": "<%= config.bin %> context"
11
+ },
12
+ {
13
+ "description": "get the dashboard as JSON",
14
+ "command": "<%= config.bin %> context --json"
15
+ }
16
+ ],
17
+ "flags": {
18
+ "json": {
19
+ "description": "Format output as json.",
20
+ "helpGroup": "GLOBAL",
21
+ "name": "json",
22
+ "allowNo": false,
23
+ "type": "boolean"
24
+ },
25
+ "read-only": {
26
+ "aliases": [
27
+ "plan"
28
+ ],
29
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
30
+ "name": "read-only",
31
+ "allowNo": false,
32
+ "type": "boolean"
33
+ },
34
+ "toon": {
35
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
36
+ "name": "toon",
37
+ "allowNo": false,
38
+ "type": "boolean"
39
+ }
40
+ },
41
+ "hasDynamicHelp": false,
42
+ "hiddenAliases": [],
43
+ "id": "context",
44
+ "pluginAlias": "@taurgis/bonsai",
45
+ "pluginName": "@taurgis/bonsai",
46
+ "pluginType": "core",
47
+ "strict": true,
48
+ "summary": "Show a compact cache dashboard for ambient session context",
49
+ "enableJsonFlag": true,
50
+ "stdoutIsPrimaryData": true
51
+ },
3
52
  "fetch": {
4
53
  "aliases": [],
5
54
  "args": {
@@ -18,6 +67,10 @@
18
67
  {
19
68
  "description": "cache a volatile page with compressed JSON output",
20
69
  "command": "<%= config.bin %> https://news.ycombinator.com/ --format compressed --ttl 2h --json"
70
+ },
71
+ {
72
+ "description": "fetch multiple URLs in one batch (space-separated)",
73
+ "command": "<%= config.bin %> https://docs.nestjs.com/ https://docs.nestjs.com/first-steps"
21
74
  }
22
75
  ],
23
76
  "flags": {
@@ -37,9 +90,15 @@
37
90
  "allowNo": false,
38
91
  "type": "boolean"
39
92
  },
93
+ "toon": {
94
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
95
+ "name": "toon",
96
+ "allowNo": false,
97
+ "type": "boolean"
98
+ },
40
99
  "topic": {
41
100
  "char": "t",
42
- "description": "main research topic for metadata",
101
+ "description": "main research topic for metadata (max 200 chars)",
43
102
  "name": "topic",
44
103
  "hasDynamicHelp": false,
45
104
  "multiple": false,
@@ -47,7 +106,7 @@
47
106
  },
48
107
  "tags": {
49
108
  "char": "g",
50
- "description": "taxonomic tags for this research (can be repeated)",
109
+ "description": "taxonomic tags for this research (can be repeated, max 100 chars each)",
51
110
  "name": "tags",
52
111
  "hasDynamicHelp": false,
53
112
  "multiple": true,
@@ -187,6 +246,12 @@
187
246
  "allowNo": false,
188
247
  "type": "boolean"
189
248
  },
249
+ "toon": {
250
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
251
+ "name": "toon",
252
+ "allowNo": false,
253
+ "type": "boolean"
254
+ },
190
255
  "stdin": {
191
256
  "description": "read Markdown from stdin",
192
257
  "name": "stdin",
@@ -215,7 +280,7 @@
215
280
  },
216
281
  "topic": {
217
282
  "char": "t",
218
- "description": "main topic for this research note",
283
+ "description": "main topic for this research note (max 200 chars)",
219
284
  "name": "topic",
220
285
  "hasDynamicHelp": false,
221
286
  "multiple": false,
@@ -223,7 +288,7 @@
223
288
  },
224
289
  "tags": {
225
290
  "char": "g",
226
- "description": "taxonomic tags (can be repeated)",
291
+ "description": "taxonomic tags (can be repeated, max 100 chars each)",
227
292
  "name": "tags",
228
293
  "hasDynamicHelp": false,
229
294
  "multiple": true,
@@ -304,6 +369,10 @@
304
369
  {
305
370
  "description": "inspect cached metadata as JSON",
306
371
  "command": "<%= config.bin %> <%= command.id %> https://example.com/docs --json"
372
+ },
373
+ {
374
+ "description": "inspect multiple URLs in one batch (space-separated)",
375
+ "command": "<%= config.bin %> <%= command.id %> https://example.com/docs https://example.com/api"
307
376
  }
308
377
  ],
309
378
  "flags": {
@@ -322,6 +391,12 @@
322
391
  "name": "read-only",
323
392
  "allowNo": false,
324
393
  "type": "boolean"
394
+ },
395
+ "toon": {
396
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
397
+ "name": "toon",
398
+ "allowNo": false,
399
+ "type": "boolean"
325
400
  }
326
401
  },
327
402
  "hasDynamicHelp": false,
@@ -338,7 +413,7 @@
338
413
  "list": {
339
414
  "aliases": [],
340
415
  "args": {},
341
- "description": "List page-level cached artifacts with source URLs, topic, tags, freshness, capture method, and token estimates.",
416
+ "description": "List page-level cached artifacts by source URL, topic, freshness, and token estimate. Pass --full for every metadata field (cache key, path, artifact type, tags, capture method, quality notes, timestamps).",
342
417
  "examples": [
343
418
  {
344
419
  "description": "list cached entries",
@@ -355,6 +430,10 @@
355
430
  {
356
431
  "description": "list entries matching a URL glob",
357
432
  "command": "<%= config.bin %> list --url \"https://react.dev/*\""
433
+ },
434
+ {
435
+ "description": "list every metadata field instead of the minimal default row",
436
+ "command": "<%= config.bin %> list --full --json"
358
437
  }
359
438
  ],
360
439
  "flags": {
@@ -374,6 +453,12 @@
374
453
  "allowNo": false,
375
454
  "type": "boolean"
376
455
  },
456
+ "toon": {
457
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
458
+ "name": "toon",
459
+ "allowNo": false,
460
+ "type": "boolean"
461
+ },
377
462
  "topic": {
378
463
  "char": "t",
379
464
  "description": "exact topic (case-insensitive)",
@@ -436,12 +521,24 @@
436
521
  "type": "option"
437
522
  },
438
523
  "limit": {
439
- "description": "result count (default 50, max 100)",
524
+ "description": "result count (max 100, default 10)",
440
525
  "name": "limit",
441
- "default": 50,
526
+ "default": 10,
442
527
  "hasDynamicHelp": false,
443
528
  "multiple": false,
444
529
  "type": "option"
530
+ },
531
+ "full": {
532
+ "description": "include every metadata field (cache key, path, artifact type, tags, capture method, quality notes, timestamps); default output is a minimal row (source URLs, topic, freshness, token estimate)",
533
+ "name": "full",
534
+ "allowNo": false,
535
+ "type": "boolean"
536
+ },
537
+ "identity": {
538
+ "hidden": true,
539
+ "name": "identity",
540
+ "allowNo": false,
541
+ "type": "boolean"
445
542
  }
446
543
  },
447
544
  "hasDynamicHelp": false,
@@ -458,7 +555,7 @@
458
555
  "prune": {
459
556
  "aliases": [],
460
557
  "args": {},
461
- "description": "Delete cached artifacts by content age, idle time, URL glob, or artifact type.",
558
+ "description": "Delete cached artifacts by content age, idle time, URL glob, artifact type, topic, or tags.",
462
559
  "examples": [
463
560
  {
464
561
  "description": "preview pruning entries older than 30 days",
@@ -471,6 +568,10 @@
471
568
  {
472
569
  "description": "prune entries matching a URL glob",
473
570
  "command": "<%= config.bin %> prune --url \"https://react.dev/*\" --yes"
571
+ },
572
+ {
573
+ "description": "prune entries tagged as deprecated",
574
+ "command": "<%= config.bin %> prune --tags deprecated --yes"
474
575
  }
475
576
  ],
476
577
  "flags": {
@@ -490,6 +591,12 @@
490
591
  "allowNo": false,
491
592
  "type": "boolean"
492
593
  },
594
+ "toon": {
595
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
596
+ "name": "toon",
597
+ "allowNo": false,
598
+ "type": "boolean"
599
+ },
493
600
  "older-than": {
494
601
  "description": "content age threshold (fetched_at, else validated_at), e.g. \"30d\"",
495
602
  "name": "older-than",
@@ -511,6 +618,22 @@
511
618
  "multiple": false,
512
619
  "type": "option"
513
620
  },
621
+ "topic": {
622
+ "char": "t",
623
+ "description": "exact topic (case-insensitive)",
624
+ "name": "topic",
625
+ "hasDynamicHelp": false,
626
+ "multiple": false,
627
+ "type": "option"
628
+ },
629
+ "tags": {
630
+ "char": "g",
631
+ "description": "tags to require (must match all)",
632
+ "name": "tags",
633
+ "hasDynamicHelp": false,
634
+ "multiple": true,
635
+ "type": "option"
636
+ },
514
637
  "artifact-type": {
515
638
  "description": "artifact type to prune, including section children",
516
639
  "name": "artifact-type",
@@ -549,6 +672,236 @@
549
672
  "enableJsonFlag": true,
550
673
  "stdoutIsPrimaryData": true
551
674
  },
675
+ "search": {
676
+ "aliases": [],
677
+ "args": {},
678
+ "description": "Rank cached page-level artifacts by a --query matched against topic, tags, summary, and compressed content, plus the same metadata filters as `list` (topic, tags, URL, freshness, artifact type, capture method). Reads only the token-cheap indexed summary/compressed text, never the full detailed body, so ranking a large cache stays fast. Pass --full for every metadata field.",
679
+ "examples": [
680
+ {
681
+ "description": "search content and tags for a keyword",
682
+ "command": "<%= config.bin %> search --query \"suspense boundary\""
683
+ },
684
+ {
685
+ "description": "match any of several terms instead of requiring all",
686
+ "command": "<%= config.bin %> search --query \"suspense streaming\" --match-any"
687
+ },
688
+ {
689
+ "description": "combine a query with metadata filters",
690
+ "command": "<%= config.bin %> search --query cache --tags react --freshness fresh"
691
+ },
692
+ {
693
+ "description": "filter by tags/topic alone, ranked like list (no --query)",
694
+ "command": "<%= config.bin %> search --tags node --json"
695
+ }
696
+ ],
697
+ "flags": {
698
+ "json": {
699
+ "description": "Format output as json.",
700
+ "helpGroup": "GLOBAL",
701
+ "name": "json",
702
+ "allowNo": false,
703
+ "type": "boolean"
704
+ },
705
+ "read-only": {
706
+ "aliases": [
707
+ "plan"
708
+ ],
709
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
710
+ "name": "read-only",
711
+ "allowNo": false,
712
+ "type": "boolean"
713
+ },
714
+ "toon": {
715
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
716
+ "name": "toon",
717
+ "allowNo": false,
718
+ "type": "boolean"
719
+ },
720
+ "query": {
721
+ "char": "q",
722
+ "description": "keyword(s) to search across topic, tags, summary, and compressed content (case-insensitive); every term must match somewhere unless --match-any is set",
723
+ "name": "query",
724
+ "hasDynamicHelp": false,
725
+ "multiple": false,
726
+ "type": "option"
727
+ },
728
+ "match-any": {
729
+ "description": "match any query term instead of requiring all of them (OR instead of AND)",
730
+ "name": "match-any",
731
+ "allowNo": false,
732
+ "type": "boolean"
733
+ },
734
+ "topic": {
735
+ "char": "t",
736
+ "description": "exact topic (case-insensitive)",
737
+ "name": "topic",
738
+ "hasDynamicHelp": false,
739
+ "multiple": false,
740
+ "type": "option"
741
+ },
742
+ "tags": {
743
+ "char": "g",
744
+ "description": "tags to require (must match all)",
745
+ "name": "tags",
746
+ "hasDynamicHelp": false,
747
+ "multiple": true,
748
+ "type": "option"
749
+ },
750
+ "url": {
751
+ "description": "source URL glob (case-insensitive, supports * wildcard)",
752
+ "name": "url",
753
+ "hasDynamicHelp": false,
754
+ "multiple": false,
755
+ "type": "option"
756
+ },
757
+ "freshness": {
758
+ "description": "freshness state",
759
+ "name": "freshness",
760
+ "hasDynamicHelp": false,
761
+ "multiple": false,
762
+ "options": [
763
+ "fresh",
764
+ "stale_grace",
765
+ "stale_expired"
766
+ ],
767
+ "type": "option"
768
+ },
769
+ "artifact-type": {
770
+ "description": "artifact type; section children are omitted from search - use inspect to see them",
771
+ "name": "artifact-type",
772
+ "hasDynamicHelp": false,
773
+ "multiple": false,
774
+ "options": [
775
+ "source",
776
+ "research_note",
777
+ "index"
778
+ ],
779
+ "type": "option"
780
+ },
781
+ "capture-method": {
782
+ "description": "capture method",
783
+ "name": "capture-method",
784
+ "hasDynamicHelp": false,
785
+ "multiple": false,
786
+ "options": [
787
+ "static_fetch",
788
+ "browser_fallback",
789
+ "agent_supplied",
790
+ "route_markdown",
791
+ "github_source"
792
+ ],
793
+ "type": "option"
794
+ },
795
+ "limit": {
796
+ "description": "result count (max 100, default 10)",
797
+ "name": "limit",
798
+ "default": 10,
799
+ "hasDynamicHelp": false,
800
+ "multiple": false,
801
+ "type": "option"
802
+ },
803
+ "full": {
804
+ "description": "include every metadata field (cache key, path, artifact type, tags, capture method, quality notes, timestamps) alongside score/matchedFields/snippet; default output is a minimal row (source URLs, topic, freshness, token estimate, score, matchedFields, snippet)",
805
+ "name": "full",
806
+ "allowNo": false,
807
+ "type": "boolean"
808
+ }
809
+ },
810
+ "hasDynamicHelp": false,
811
+ "hiddenAliases": [],
812
+ "id": "search",
813
+ "pluginAlias": "@taurgis/bonsai",
814
+ "pluginName": "@taurgis/bonsai",
815
+ "pluginType": "core",
816
+ "strict": true,
817
+ "summary": "Search cached research artifacts by tags and content",
818
+ "enableJsonFlag": true,
819
+ "stdoutIsPrimaryData": true
820
+ },
821
+ "setup": {
822
+ "aliases": [],
823
+ "args": {
824
+ "agent": {
825
+ "description": "agent to install the hook for (claude-code, codex)",
826
+ "name": "agent",
827
+ "required": true
828
+ }
829
+ },
830
+ "description": "Writes (or repairs) a SessionStart hook entry that runs `bonsai context` at the start of every session, so the agent sees the cache state before doing anything. Project-scoped by default (shareable via version control); pass --global for a user-level, machine-only install. Re-running is idempotent: an unchanged install is a no-op, and a stale executable path is repaired.",
831
+ "examples": [
832
+ {
833
+ "description": "install the hook for this project (Claude Code)",
834
+ "command": "<%= config.bin %> setup claude-code"
835
+ },
836
+ {
837
+ "description": "install the hook for this project (Codex)",
838
+ "command": "<%= config.bin %> setup codex"
839
+ },
840
+ {
841
+ "description": "preview a user-level install without writing anything",
842
+ "command": "<%= config.bin %> setup claude-code --global --dry-run --json"
843
+ }
844
+ ],
845
+ "flags": {
846
+ "json": {
847
+ "description": "Format output as json.",
848
+ "helpGroup": "GLOBAL",
849
+ "name": "json",
850
+ "allowNo": false,
851
+ "type": "boolean"
852
+ },
853
+ "read-only": {
854
+ "aliases": [
855
+ "plan"
856
+ ],
857
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
858
+ "name": "read-only",
859
+ "allowNo": false,
860
+ "type": "boolean"
861
+ },
862
+ "toon": {
863
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
864
+ "name": "toon",
865
+ "allowNo": false,
866
+ "type": "boolean"
867
+ },
868
+ "global": {
869
+ "char": "g",
870
+ "description": "install to the user-level config instead of the project (default: project)",
871
+ "name": "global",
872
+ "allowNo": false,
873
+ "type": "boolean"
874
+ },
875
+ "local": {
876
+ "aliases": [
877
+ "project"
878
+ ],
879
+ "charAliases": [
880
+ "p"
881
+ ],
882
+ "description": "install to the project config (default; explicit form of the default)",
883
+ "name": "local",
884
+ "allowNo": false,
885
+ "type": "boolean"
886
+ },
887
+ "dry-run": {
888
+ "description": "preview the install without writing anything",
889
+ "name": "dry-run",
890
+ "allowNo": false,
891
+ "type": "boolean"
892
+ }
893
+ },
894
+ "hasDynamicHelp": false,
895
+ "hiddenAliases": [],
896
+ "id": "setup",
897
+ "pluginAlias": "@taurgis/bonsai",
898
+ "pluginName": "@taurgis/bonsai",
899
+ "pluginType": "core",
900
+ "strict": true,
901
+ "summary": "Install a SessionStart hook that shows live cache context",
902
+ "enableJsonFlag": true,
903
+ "stdoutIsPrimaryData": true
904
+ },
552
905
  "status": {
553
906
  "aliases": [],
554
907
  "args": {
@@ -567,6 +920,10 @@
567
920
  {
568
921
  "description": "evaluate status with a specific tier and TTL",
569
922
  "command": "<%= config.bin %> <%= command.id %> https://example.com/docs --tier volatile --ttl 2h"
923
+ },
924
+ {
925
+ "description": "check multiple URLs in one batch (space-separated)",
926
+ "command": "<%= config.bin %> <%= command.id %> https://example.com/docs https://example.com/api"
570
927
  }
571
928
  ],
572
929
  "flags": {
@@ -586,6 +943,12 @@
586
943
  "allowNo": false,
587
944
  "type": "boolean"
588
945
  },
946
+ "toon": {
947
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
948
+ "name": "toon",
949
+ "allowNo": false,
950
+ "type": "boolean"
951
+ },
589
952
  "tier": {
590
953
  "description": "freshness tier policy to evaluate; when omitted, uses the cached entry's own tier",
591
954
  "name": "tier",
@@ -655,6 +1018,12 @@
655
1018
  "name": "read-only",
656
1019
  "allowNo": false,
657
1020
  "type": "boolean"
1021
+ },
1022
+ "toon": {
1023
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
1024
+ "name": "toon",
1025
+ "allowNo": false,
1026
+ "type": "boolean"
658
1027
  }
659
1028
  },
660
1029
  "hasDynamicHelp": false,
@@ -677,7 +1046,7 @@
677
1046
  "required": false
678
1047
  }
679
1048
  },
680
- "description": "Print a config value. Without --global/--local, shows the merged effective value, in precedence order: a per-command override flag (e.g. `fetch --storage`) > env var > project file > user file > built-in default.\n\nValid keys: storage, summary.",
1049
+ "description": "Print a config value. Without --global/--local, shows the merged effective value, in precedence order: a per-command override flag (e.g. `fetch --storage`) > env var > project file > user file > built-in default.\n\nValid keys: storage (global|project), summary (conservative|balanced|aggressive).",
681
1050
  "examples": [
682
1051
  {
683
1052
  "description": "get the effective storage mode",
@@ -705,6 +1074,12 @@
705
1074
  "allowNo": false,
706
1075
  "type": "boolean"
707
1076
  },
1077
+ "toon": {
1078
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
1079
+ "name": "toon",
1080
+ "allowNo": false,
1081
+ "type": "boolean"
1082
+ },
708
1083
  "global": {
709
1084
  "char": "g",
710
1085
  "description": "read user-level config only",
@@ -738,7 +1113,7 @@
738
1113
  "config:list": {
739
1114
  "aliases": [],
740
1115
  "args": {},
741
- "description": "Show every configuration key with its current value. Use --global/--local to show a single scope.\n\nValid keys: storage, summary.",
1116
+ "description": "Show every configuration key with its current value. Use --global/--local to show a single scope.\n\nValid keys: storage (global|project), summary (conservative|balanced|aggressive).",
742
1117
  "examples": [
743
1118
  {
744
1119
  "description": "show all effective config values",
@@ -766,6 +1141,12 @@
766
1141
  "allowNo": false,
767
1142
  "type": "boolean"
768
1143
  },
1144
+ "toon": {
1145
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
1146
+ "name": "toon",
1147
+ "allowNo": false,
1148
+ "type": "boolean"
1149
+ },
769
1150
  "global": {
770
1151
  "char": "g",
771
1152
  "description": "show user-level config only",
@@ -810,7 +1191,7 @@
810
1191
  "required": false
811
1192
  }
812
1193
  },
813
- "description": "Persist a configuration value. Writes user-level config by default; pass --local for project-level config (.bonsai.json in cwd).\n\nValid keys: storage, summary. The inline form `<key>=<value>` is also accepted.",
1194
+ "description": "Persist a configuration value. Writes user-level config by default; pass --local for project-level config (.bonsai.json in cwd).\n\nValid keys: storage (global|project), summary (conservative|balanced|aggressive). The inline form `<key>=<value>` is also accepted.",
814
1195
  "examples": [
815
1196
  {
816
1197
  "description": "store research cache in the current project",
@@ -838,6 +1219,12 @@
838
1219
  "allowNo": false,
839
1220
  "type": "boolean"
840
1221
  },
1222
+ "toon": {
1223
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
1224
+ "name": "toon",
1225
+ "allowNo": false,
1226
+ "type": "boolean"
1227
+ },
841
1228
  "global": {
842
1229
  "char": "g",
843
1230
  "description": "write user-level config (default)",
@@ -883,7 +1270,7 @@
883
1270
  "required": false
884
1271
  }
885
1272
  },
886
- "description": "Delete a key from user-level config (default) or project-level config (--local), restoring the built-in default.\n\nValid keys: storage, summary.",
1273
+ "description": "Delete a key from user-level config (default) or project-level config (--local), restoring the built-in default.\n\nValid keys: storage (global|project), summary (conservative|balanced|aggressive).",
887
1274
  "examples": [
888
1275
  {
889
1276
  "description": "remove the user-level storage setting",
@@ -911,6 +1298,12 @@
911
1298
  "allowNo": false,
912
1299
  "type": "boolean"
913
1300
  },
1301
+ "toon": {
1302
+ "description": "emit the same envelope as --json, encoded as TOON (fewer tokens); cannot be combined with --json",
1303
+ "name": "toon",
1304
+ "allowNo": false,
1305
+ "type": "boolean"
1306
+ },
914
1307
  "global": {
915
1308
  "char": "g",
916
1309
  "description": "remove from user-level config (default)",
@@ -948,5 +1341,5 @@
948
1341
  "stdoutIsPrimaryData": true
949
1342
  }
950
1343
  },
951
- "version": "3.2.2"
1344
+ "version": "4.1.0"
952
1345
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taurgis/bonsai",
3
- "version": "3.2.2",
3
+ "version": "4.1.0",
4
4
  "description": "Bonsai is a standalone local research cache CLI for AI agents",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,6 +37,7 @@
37
37
  "@mozilla/readability": "^0.5.0",
38
38
  "@oclif/core": "^4.11.4",
39
39
  "@oclif/plugin-autocomplete": "^3.2.52",
40
+ "@toon-format/toon": "^4.0.0",
40
41
  "linkedom": "^0.18.12",
41
42
  "turndown": "^7.2.0",
42
43
  "undici": "^8.7.0",