@taurgis/bonsai 1.0.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 (159) hide show
  1. package/README.md +239 -0
  2. package/agents/agents/official-docs-researcher.agent.md +98 -0
  3. package/agents/instructions/web-research.instructions.md +29 -0
  4. package/agents/skills/web-research/SKILL.md +126 -0
  5. package/bin/cli.mjs +22 -0
  6. package/dist/base-command.d.ts +14 -0
  7. package/dist/base-command.js +56 -0
  8. package/dist/commands/config/base.d.ts +23 -0
  9. package/dist/commands/config/base.js +46 -0
  10. package/dist/commands/config/get.d.ts +20 -0
  11. package/dist/commands/config/get.js +48 -0
  12. package/dist/commands/config/list.d.ts +17 -0
  13. package/dist/commands/config/list.js +48 -0
  14. package/dist/commands/config/set.d.ts +31 -0
  15. package/dist/commands/config/set.js +94 -0
  16. package/dist/commands/config/unset.d.ts +21 -0
  17. package/dist/commands/config/unset.js +65 -0
  18. package/dist/commands/fetch.d.ts +38 -0
  19. package/dist/commands/fetch.js +311 -0
  20. package/dist/commands/import.d.ts +38 -0
  21. package/dist/commands/import.js +313 -0
  22. package/dist/commands/index.d.ts +35 -0
  23. package/dist/commands/index.js +306 -0
  24. package/dist/commands/inspect.d.ts +13 -0
  25. package/dist/commands/inspect.js +82 -0
  26. package/dist/commands/list.d.ts +25 -0
  27. package/dist/commands/list.js +143 -0
  28. package/dist/commands/prune.d.ts +24 -0
  29. package/dist/commands/prune.js +141 -0
  30. package/dist/commands/research/config/base.d.ts +23 -0
  31. package/dist/commands/research/config/base.js +46 -0
  32. package/dist/commands/research/config/get.d.ts +20 -0
  33. package/dist/commands/research/config/get.js +45 -0
  34. package/dist/commands/research/config/list.d.ts +17 -0
  35. package/dist/commands/research/config/list.js +42 -0
  36. package/dist/commands/research/config/set.d.ts +31 -0
  37. package/dist/commands/research/config/set.js +94 -0
  38. package/dist/commands/research/config/unset.d.ts +21 -0
  39. package/dist/commands/research/config/unset.js +59 -0
  40. package/dist/commands/research/import.d.ts +38 -0
  41. package/dist/commands/research/import.js +313 -0
  42. package/dist/commands/research/inspect.d.ts +13 -0
  43. package/dist/commands/research/inspect.js +86 -0
  44. package/dist/commands/research/list.d.ts +25 -0
  45. package/dist/commands/research/list.js +143 -0
  46. package/dist/commands/research/prune.d.ts +24 -0
  47. package/dist/commands/research/prune.js +141 -0
  48. package/dist/commands/research/search.d.ts +32 -0
  49. package/dist/commands/research/search.js +334 -0
  50. package/dist/commands/research/status.d.ts +17 -0
  51. package/dist/commands/research/status.js +108 -0
  52. package/dist/commands/research.d.ts +36 -0
  53. package/dist/commands/research.js +304 -0
  54. package/dist/commands/search.d.ts +32 -0
  55. package/dist/commands/search.js +334 -0
  56. package/dist/commands/status.d.ts +17 -0
  57. package/dist/commands/status.js +95 -0
  58. package/dist/commands.d.ts +24 -0
  59. package/dist/commands.js +24 -0
  60. package/dist/lib/config/index.d.ts +18 -0
  61. package/dist/lib/config/index.js +33 -0
  62. package/dist/lib/config/io.d.ts +8 -0
  63. package/dist/lib/config/io.js +75 -0
  64. package/dist/lib/config/resolve.d.ts +15 -0
  65. package/dist/lib/config/resolve.js +20 -0
  66. package/dist/lib/config/schema.d.ts +28 -0
  67. package/dist/lib/config/schema.js +32 -0
  68. package/dist/lib/research/artifact.d.ts +21 -0
  69. package/dist/lib/research/artifact.js +217 -0
  70. package/dist/lib/research/browser.d.ts +74 -0
  71. package/dist/lib/research/browser.js +359 -0
  72. package/dist/lib/research/cache-key.d.ts +5 -0
  73. package/dist/lib/research/cache-key.js +10 -0
  74. package/dist/lib/research/capture.d.ts +29 -0
  75. package/dist/lib/research/capture.js +181 -0
  76. package/dist/lib/research/compress.d.ts +5 -0
  77. package/dist/lib/research/compress.js +17 -0
  78. package/dist/lib/research/docs/__fixtures__/sphinx-searchindex.d.ts +1 -0
  79. package/dist/lib/research/docs/__fixtures__/sphinx-searchindex.js +2 -0
  80. package/dist/lib/research/docs/capabilities.d.ts +43 -0
  81. package/dist/lib/research/docs/capabilities.js +9 -0
  82. package/dist/lib/research/docs/clean-dom.d.ts +4 -0
  83. package/dist/lib/research/docs/clean-dom.js +41 -0
  84. package/dist/lib/research/docs/code-blocks.d.ts +5 -0
  85. package/dist/lib/research/docs/code-blocks.js +69 -0
  86. package/dist/lib/research/docs/detect.d.ts +6 -0
  87. package/dist/lib/research/docs/detect.js +239 -0
  88. package/dist/lib/research/docs/machine-readable.d.ts +21 -0
  89. package/dist/lib/research/docs/machine-readable.js +73 -0
  90. package/dist/lib/research/docs/markdown-source.d.ts +17 -0
  91. package/dist/lib/research/docs/markdown-source.js +194 -0
  92. package/dist/lib/research/docs/quality-gates.d.ts +9 -0
  93. package/dist/lib/research/docs/quality-gates.js +65 -0
  94. package/dist/lib/research/docs/remote-search-runner.d.ts +21 -0
  95. package/dist/lib/research/docs/remote-search-runner.js +54 -0
  96. package/dist/lib/research/docs/remote-search.d.ts +14 -0
  97. package/dist/lib/research/docs/remote-search.js +101 -0
  98. package/dist/lib/research/docs/rsc.d.ts +10 -0
  99. package/dist/lib/research/docs/rsc.js +30 -0
  100. package/dist/lib/research/docs/search-index.d.ts +13 -0
  101. package/dist/lib/research/docs/search-index.js +176 -0
  102. package/dist/lib/research/docs/section-artifacts.d.ts +12 -0
  103. package/dist/lib/research/docs/section-artifacts.js +75 -0
  104. package/dist/lib/research/docs/sections.d.ts +12 -0
  105. package/dist/lib/research/docs/sections.js +67 -0
  106. package/dist/lib/research/docs/source-map.d.ts +19 -0
  107. package/dist/lib/research/docs/source-map.js +87 -0
  108. package/dist/lib/research/docs/validate.d.ts +15 -0
  109. package/dist/lib/research/docs/validate.js +63 -0
  110. package/dist/lib/research/extract.d.ts +11 -0
  111. package/dist/lib/research/extract.js +83 -0
  112. package/dist/lib/research/fetcher.d.ts +29 -0
  113. package/dist/lib/research/fetcher.js +192 -0
  114. package/dist/lib/research/freshness.d.ts +21 -0
  115. package/dist/lib/research/freshness.js +82 -0
  116. package/dist/lib/research/markdown.d.ts +6 -0
  117. package/dist/lib/research/markdown.js +66 -0
  118. package/dist/lib/research/regression.d.ts +23 -0
  119. package/dist/lib/research/regression.js +93 -0
  120. package/dist/lib/research/resolve-target.d.ts +18 -0
  121. package/dist/lib/research/resolve-target.js +20 -0
  122. package/dist/lib/research/revalidate.d.ts +32 -0
  123. package/dist/lib/research/revalidate.js +152 -0
  124. package/dist/lib/research/schema.d.ts +47 -0
  125. package/dist/lib/research/schema.js +1 -0
  126. package/dist/lib/research/secret-scan.d.ts +5 -0
  127. package/dist/lib/research/secret-scan.js +37 -0
  128. package/dist/lib/research/secure-write.d.ts +16 -0
  129. package/dist/lib/research/secure-write.js +17 -0
  130. package/dist/lib/research/storage.d.ts +52 -0
  131. package/dist/lib/research/storage.js +182 -0
  132. package/dist/lib/research/store-roots.d.ts +29 -0
  133. package/dist/lib/research/store-roots.js +28 -0
  134. package/dist/lib/research/token-estimate.d.ts +5 -0
  135. package/dist/lib/research/token-estimate.js +7 -0
  136. package/dist/lib/research/url.d.ts +24 -0
  137. package/dist/lib/research/url.js +121 -0
  138. package/dist/sites/index.d.ts +4 -0
  139. package/dist/sites/index.js +28 -0
  140. package/dist/sites/salesforce/browser-search.d.ts +7 -0
  141. package/dist/sites/salesforce/browser-search.js +82 -0
  142. package/dist/sites/salesforce/coveo.d.ts +23 -0
  143. package/dist/sites/salesforce/coveo.js +161 -0
  144. package/dist/sites/salesforce/fetch-page.d.ts +6 -0
  145. package/dist/sites/salesforce/fetch-page.js +42 -0
  146. package/dist/sites/salesforce/index.d.ts +2 -0
  147. package/dist/sites/salesforce/index.js +16 -0
  148. package/dist/sites/salesforce/token.d.ts +26 -0
  149. package/dist/sites/salesforce/token.js +154 -0
  150. package/dist/sites/salesforce-developer/fetch-page.d.ts +3 -0
  151. package/dist/sites/salesforce-developer/fetch-page.js +18 -0
  152. package/dist/sites/salesforce-developer/index.d.ts +2 -0
  153. package/dist/sites/salesforce-developer/index.js +12 -0
  154. package/dist/sites/salesforce-doc-fetch.d.ts +14 -0
  155. package/dist/sites/salesforce-doc-fetch.js +321 -0
  156. package/dist/sites/types.d.ts +27 -0
  157. package/dist/sites/types.js +1 -0
  158. package/oclif.manifest.json +845 -0
  159. package/package.json +78 -0
@@ -0,0 +1,845 @@
1
+ {
2
+ "commands": {
3
+ "fetch": {
4
+ "aliases": [],
5
+ "args": {
6
+ "url": {
7
+ "description": "The full HTTP/HTTPS URL of the web page to research.",
8
+ "name": "url",
9
+ "required": true
10
+ }
11
+ },
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.",
13
+ "examples": [
14
+ {
15
+ "description": "Research a URL with detailed output, tagged with topic and tags",
16
+ "command": "<%= config.bin %> https://docs.nestjs.com/ --topic \"Backend Frameworks\" --tags \"Node\" --tags \"NestJS\" --format detailed --ttl 30d"
17
+ },
18
+ {
19
+ "description": "Research a volatile page with compressed output and short TTL, returned as JSON",
20
+ "command": "<%= config.bin %> https://news.ycombinator.com/ --format compressed --ttl 2h --json"
21
+ }
22
+ ],
23
+ "flags": {
24
+ "json": {
25
+ "description": "Return the output as a machine-readable JSON object.",
26
+ "name": "json",
27
+ "allowNo": false,
28
+ "type": "boolean"
29
+ },
30
+ "topic": {
31
+ "char": "t",
32
+ "description": "The main category/topic of the research for metadata tagging.",
33
+ "name": "topic",
34
+ "hasDynamicHelp": false,
35
+ "multiple": false,
36
+ "type": "option"
37
+ },
38
+ "tags": {
39
+ "char": "g",
40
+ "description": "Taxonomic tags for this research (can be repeated).",
41
+ "name": "tags",
42
+ "hasDynamicHelp": false,
43
+ "multiple": true,
44
+ "type": "option"
45
+ },
46
+ "format": {
47
+ "char": "f",
48
+ "description": "Desired data density.",
49
+ "name": "format",
50
+ "default": "compressed",
51
+ "hasDynamicHelp": false,
52
+ "multiple": false,
53
+ "options": [
54
+ "compressed",
55
+ "detailed"
56
+ ],
57
+ "type": "option"
58
+ },
59
+ "tier": {
60
+ "description": "Freshness tier policy.",
61
+ "name": "tier",
62
+ "default": "standard",
63
+ "hasDynamicHelp": false,
64
+ "multiple": false,
65
+ "options": [
66
+ "stable",
67
+ "standard",
68
+ "volatile"
69
+ ],
70
+ "type": "option"
71
+ },
72
+ "ttl": {
73
+ "char": "l",
74
+ "description": "Predicted lifespan of the data (e.g., \"2h\", \"7d\", \"3m\").",
75
+ "name": "ttl",
76
+ "hasDynamicHelp": false,
77
+ "multiple": false,
78
+ "type": "option"
79
+ },
80
+ "max-age": {
81
+ "description": "Maximum age of cache to accept (e.g., \"1d\", \"30d\").",
82
+ "name": "max-age",
83
+ "hasDynamicHelp": false,
84
+ "multiple": false,
85
+ "type": "option"
86
+ },
87
+ "force": {
88
+ "description": "Force a fresh fetch, ignoring any cached entries.",
89
+ "name": "force",
90
+ "allowNo": false,
91
+ "type": "boolean"
92
+ },
93
+ "dry-run": {
94
+ "description": "Perform validation and fetch without saving to local cache.",
95
+ "name": "dry-run",
96
+ "allowNo": false,
97
+ "type": "boolean"
98
+ },
99
+ "allow-stale": {
100
+ "description": "Allow serving stale cache if the remote server is unreachable.",
101
+ "name": "allow-stale",
102
+ "allowNo": false,
103
+ "type": "boolean"
104
+ },
105
+ "rendered": {
106
+ "description": "Force using a browser-rendered scraping path for dynamic pages.",
107
+ "name": "rendered",
108
+ "allowNo": false,
109
+ "type": "boolean"
110
+ },
111
+ "storage": {
112
+ "description": "Override where this result is cached (overrides configured default). Secret-bearing pages are always stored globally.",
113
+ "name": "storage",
114
+ "hasDynamicHelp": false,
115
+ "multiple": false,
116
+ "options": [
117
+ "global",
118
+ "project"
119
+ ],
120
+ "type": "option"
121
+ }
122
+ },
123
+ "hasDynamicHelp": false,
124
+ "hidden": true,
125
+ "hiddenAliases": [],
126
+ "id": "fetch",
127
+ "pluginAlias": "@taurgis/bonsai",
128
+ "pluginName": "@taurgis/bonsai",
129
+ "pluginType": "core",
130
+ "strict": true,
131
+ "summary": "An advanced, locally cached web research tool optimized for LLM ingestion.",
132
+ "enableJsonFlag": false,
133
+ "jsonEnvelope": false,
134
+ "stdoutIsPrimaryData": true
135
+ },
136
+ "import": {
137
+ "aliases": [],
138
+ "args": {
139
+ "url": {
140
+ "description": "The single source URL of the page (only for single-source import).",
141
+ "name": "url",
142
+ "required": false
143
+ }
144
+ },
145
+ "description": "Accepts a synthesized Markdown note via stdin and registers it under the single target URL or multiple source URLs.",
146
+ "examples": [
147
+ {
148
+ "description": "Import detailed research for a single URL via stdin",
149
+ "command": "echo \"# My Article\" | <%= config.bin %> import https://example.com/docs --stdin"
150
+ },
151
+ {
152
+ "description": "Import research synthesized from multiple source URLs",
153
+ "command": "echo \"# Synthesized\" | <%= config.bin %> import --stdin --topic \"React docs\" --source-url https://react.dev/a --source-url https://react.dev/b"
154
+ },
155
+ {
156
+ "description": "Import research from a local Markdown file",
157
+ "command": "<%= config.bin %> import https://example.com/docs --file path/to/notes.md"
158
+ }
159
+ ],
160
+ "flags": {
161
+ "json": {
162
+ "description": "Return the output as a machine-readable JSON object.",
163
+ "name": "json",
164
+ "allowNo": false,
165
+ "type": "boolean"
166
+ },
167
+ "stdin": {
168
+ "description": "Read Markdown from stdin.",
169
+ "name": "stdin",
170
+ "allowNo": false,
171
+ "type": "boolean"
172
+ },
173
+ "file": {
174
+ "description": "Path to a Markdown file containing research notes to import.",
175
+ "name": "file",
176
+ "hasDynamicHelp": false,
177
+ "multiple": false,
178
+ "type": "option"
179
+ },
180
+ "input-format": {
181
+ "description": "Format of the input provided.",
182
+ "name": "input-format",
183
+ "default": "detailed",
184
+ "hasDynamicHelp": false,
185
+ "multiple": false,
186
+ "options": [
187
+ "compressed",
188
+ "detailed"
189
+ ],
190
+ "type": "option"
191
+ },
192
+ "topic": {
193
+ "char": "t",
194
+ "description": "The main topic for this research note.",
195
+ "name": "topic",
196
+ "hasDynamicHelp": false,
197
+ "multiple": false,
198
+ "type": "option"
199
+ },
200
+ "tags": {
201
+ "char": "g",
202
+ "description": "Taxonomic tags (can be repeated).",
203
+ "name": "tags",
204
+ "hasDynamicHelp": false,
205
+ "multiple": true,
206
+ "type": "option"
207
+ },
208
+ "tier": {
209
+ "description": "Freshness tier policy.",
210
+ "name": "tier",
211
+ "default": "standard",
212
+ "hasDynamicHelp": false,
213
+ "multiple": false,
214
+ "options": [
215
+ "stable",
216
+ "standard",
217
+ "volatile"
218
+ ],
219
+ "type": "option"
220
+ },
221
+ "source-url": {
222
+ "description": "Repeated source URLs for multi-source import.",
223
+ "name": "source-url",
224
+ "hasDynamicHelp": false,
225
+ "multiple": true,
226
+ "type": "option"
227
+ },
228
+ "ttl": {
229
+ "char": "l",
230
+ "description": "Predicted lifespan of the data (e.g. \"24h\", \"7d\").",
231
+ "name": "ttl",
232
+ "hasDynamicHelp": false,
233
+ "multiple": false,
234
+ "type": "option"
235
+ },
236
+ "storage": {
237
+ "description": "Override where this note is cached (overrides configured default). Secret-bearing notes are always stored globally.",
238
+ "name": "storage",
239
+ "hasDynamicHelp": false,
240
+ "multiple": false,
241
+ "options": [
242
+ "global",
243
+ "project"
244
+ ],
245
+ "type": "option"
246
+ }
247
+ },
248
+ "hasDynamicHelp": false,
249
+ "hiddenAliases": [],
250
+ "id": "import",
251
+ "pluginAlias": "@taurgis/bonsai",
252
+ "pluginName": "@taurgis/bonsai",
253
+ "pluginType": "core",
254
+ "strict": true,
255
+ "summary": "Import agent-supplied clean Markdown notes into the local cache.",
256
+ "enableJsonFlag": false,
257
+ "jsonEnvelope": false,
258
+ "stdoutIsPrimaryData": true
259
+ },
260
+ "inspect": {
261
+ "aliases": [],
262
+ "args": {
263
+ "url": {
264
+ "description": "The URL to inspect.",
265
+ "name": "url",
266
+ "required": true
267
+ }
268
+ },
269
+ "description": "Inspects local storage and displays full frontmatter metadata for the URL (without printing the content body).",
270
+ "flags": {
271
+ "json": {
272
+ "description": "Return the output as a machine-readable JSON object.",
273
+ "name": "json",
274
+ "allowNo": false,
275
+ "type": "boolean"
276
+ }
277
+ },
278
+ "hasDynamicHelp": false,
279
+ "hiddenAliases": [],
280
+ "id": "inspect",
281
+ "pluginAlias": "@taurgis/bonsai",
282
+ "pluginName": "@taurgis/bonsai",
283
+ "pluginType": "core",
284
+ "strict": true,
285
+ "summary": "Inspect cached research metadata for a URL.",
286
+ "enableJsonFlag": false,
287
+ "jsonEnvelope": false,
288
+ "stdoutIsPrimaryData": true
289
+ },
290
+ "list": {
291
+ "aliases": [],
292
+ "args": {},
293
+ "description": "Lists cached research artifacts, including metadata details like path, source count, freshness, token estimates, and quality metrics without printing full content.",
294
+ "examples": [
295
+ {
296
+ "description": "List all cached entries",
297
+ "command": "<%= config.bin %> list"
298
+ },
299
+ {
300
+ "description": "List cached entries for a specific topic with JSON output",
301
+ "command": "<%= config.bin %> list --topic \"React Suspense\" --json"
302
+ },
303
+ {
304
+ "description": "List only fresh entries filtered by tags",
305
+ "command": "<%= config.bin %> list --freshness fresh --tags node --tags url"
306
+ }
307
+ ],
308
+ "flags": {
309
+ "json": {
310
+ "description": "Return the output as a machine-readable JSON object.",
311
+ "name": "json",
312
+ "allowNo": false,
313
+ "type": "boolean"
314
+ },
315
+ "topic": {
316
+ "char": "t",
317
+ "description": "Filter by exact topic (case-insensitive).",
318
+ "name": "topic",
319
+ "hasDynamicHelp": false,
320
+ "multiple": false,
321
+ "type": "option"
322
+ },
323
+ "tags": {
324
+ "char": "g",
325
+ "description": "Filter by tags (must match all tags specified).",
326
+ "name": "tags",
327
+ "hasDynamicHelp": false,
328
+ "multiple": true,
329
+ "type": "option"
330
+ },
331
+ "freshness": {
332
+ "description": "Filter by freshness state.",
333
+ "name": "freshness",
334
+ "hasDynamicHelp": false,
335
+ "multiple": false,
336
+ "options": [
337
+ "fresh",
338
+ "stale_grace",
339
+ "stale_expired"
340
+ ],
341
+ "type": "option"
342
+ },
343
+ "artifact-type": {
344
+ "description": "Filter by artifact type.",
345
+ "name": "artifact-type",
346
+ "hasDynamicHelp": false,
347
+ "multiple": false,
348
+ "options": [
349
+ "source",
350
+ "research_note"
351
+ ],
352
+ "type": "option"
353
+ },
354
+ "capture-method": {
355
+ "description": "Filter by capture method.",
356
+ "name": "capture-method",
357
+ "hasDynamicHelp": false,
358
+ "multiple": false,
359
+ "options": [
360
+ "static_fetch",
361
+ "browser_fallback",
362
+ "agent_supplied"
363
+ ],
364
+ "type": "option"
365
+ },
366
+ "limit": {
367
+ "description": "Maximum number of results to return (default 50, max 100).",
368
+ "name": "limit",
369
+ "default": 50,
370
+ "hasDynamicHelp": false,
371
+ "multiple": false,
372
+ "type": "option"
373
+ }
374
+ },
375
+ "hasDynamicHelp": false,
376
+ "hiddenAliases": [],
377
+ "id": "list",
378
+ "pluginAlias": "@taurgis/bonsai",
379
+ "pluginName": "@taurgis/bonsai",
380
+ "pluginType": "core",
381
+ "strict": true,
382
+ "summary": "List cached research artifacts by metadata filters.",
383
+ "enableJsonFlag": false,
384
+ "jsonEnvelope": false,
385
+ "stdoutIsPrimaryData": true
386
+ },
387
+ "prune": {
388
+ "aliases": [],
389
+ "args": {},
390
+ "description": "Prunes cached research entries based on age, inactivity, or artifact type to free up disk space.",
391
+ "examples": [
392
+ {
393
+ "description": "Perform a dry run of pruning entries older than 90 days",
394
+ "command": "<%= config.bin %> prune --older-than 90d --dry-run"
395
+ },
396
+ {
397
+ "description": "Actually prune entries older than 30 days that are source scrapes",
398
+ "command": "<%= config.bin %> prune --older-than 30d --artifact-type source --yes"
399
+ }
400
+ ],
401
+ "flags": {
402
+ "json": {
403
+ "description": "Return the output as a machine-readable JSON object.",
404
+ "name": "json",
405
+ "allowNo": false,
406
+ "type": "boolean"
407
+ },
408
+ "older-than": {
409
+ "description": "Prune entries older than duration (e.g. \"30d\", \"90d\").",
410
+ "name": "older-than",
411
+ "hasDynamicHelp": false,
412
+ "multiple": false,
413
+ "type": "option"
414
+ },
415
+ "inactive": {
416
+ "description": "Prune entries inactive (unvalidated/unfetched) for duration (e.g. \"14d\", \"30d\").",
417
+ "name": "inactive",
418
+ "hasDynamicHelp": false,
419
+ "multiple": false,
420
+ "type": "option"
421
+ },
422
+ "artifact-type": {
423
+ "description": "Filter pruning to specific artifact type.",
424
+ "name": "artifact-type",
425
+ "hasDynamicHelp": false,
426
+ "multiple": false,
427
+ "options": [
428
+ "source",
429
+ "research_note"
430
+ ],
431
+ "type": "option"
432
+ },
433
+ "dry-run": {
434
+ "description": "List files that would be deleted without actually deleting them.",
435
+ "name": "dry-run",
436
+ "allowNo": false,
437
+ "type": "boolean"
438
+ },
439
+ "yes": {
440
+ "char": "y",
441
+ "description": "Skip confirmation prompt and prune files.",
442
+ "name": "yes",
443
+ "allowNo": false,
444
+ "type": "boolean"
445
+ }
446
+ },
447
+ "hasDynamicHelp": false,
448
+ "hiddenAliases": [],
449
+ "id": "prune",
450
+ "pluginAlias": "@taurgis/bonsai",
451
+ "pluginName": "@taurgis/bonsai",
452
+ "pluginType": "core",
453
+ "strict": true,
454
+ "summary": "Clean up old or inactive research cache entries.",
455
+ "enableJsonFlag": false,
456
+ "jsonEnvelope": false,
457
+ "stdoutIsPrimaryData": true
458
+ },
459
+ "search": {
460
+ "aliases": [],
461
+ "args": {
462
+ "query": {
463
+ "description": "The search query containing terms to match.",
464
+ "name": "query",
465
+ "required": true
466
+ }
467
+ },
468
+ "description": "Scans the local research cache database and ranks matching entries based on topic, tags, source URLs, summary, and content.",
469
+ "flags": {
470
+ "json": {
471
+ "description": "Return the output as a machine-readable JSON object.",
472
+ "name": "json",
473
+ "allowNo": false,
474
+ "type": "boolean"
475
+ },
476
+ "topic": {
477
+ "char": "t",
478
+ "description": "Filter results by exact topic (case-insensitive).",
479
+ "name": "topic",
480
+ "hasDynamicHelp": false,
481
+ "multiple": false,
482
+ "type": "option"
483
+ },
484
+ "tags": {
485
+ "char": "g",
486
+ "description": "Filter results by tags (must match all tags specified).",
487
+ "name": "tags",
488
+ "hasDynamicHelp": false,
489
+ "multiple": true,
490
+ "type": "option"
491
+ },
492
+ "artifact-type": {
493
+ "description": "Filter results by artifact type.",
494
+ "name": "artifact-type",
495
+ "hasDynamicHelp": false,
496
+ "multiple": false,
497
+ "options": [
498
+ "source",
499
+ "research_note",
500
+ "index",
501
+ "section"
502
+ ],
503
+ "type": "option"
504
+ },
505
+ "limit": {
506
+ "description": "Maximum number of results to return (default 10, max 50).",
507
+ "name": "limit",
508
+ "default": 10,
509
+ "hasDynamicHelp": false,
510
+ "multiple": false,
511
+ "type": "option"
512
+ },
513
+ "include-stale": {
514
+ "description": "Include stale expired cache entries in the search results.",
515
+ "name": "include-stale",
516
+ "allowNo": false,
517
+ "type": "boolean"
518
+ },
519
+ "domain": {
520
+ "description": "Search a documentation site directly (e.g. help.salesforce.com) instead of the local cache. Requires a site module that implements search.",
521
+ "name": "domain",
522
+ "hasDynamicHelp": false,
523
+ "multiple": false,
524
+ "type": "option"
525
+ },
526
+ "remote": {
527
+ "description": "Discover uncached docs via a site’s public search (Algolia DocSearch, MkDocs/Sphinx/Just-the-Docs index). Pass a docs page URL; falls back to local cache search if no connector applies.",
528
+ "name": "remote",
529
+ "hasDynamicHelp": false,
530
+ "multiple": false,
531
+ "type": "option"
532
+ }
533
+ },
534
+ "hasDynamicHelp": false,
535
+ "hiddenAliases": [],
536
+ "id": "search",
537
+ "pluginAlias": "@taurgis/bonsai",
538
+ "pluginName": "@taurgis/bonsai",
539
+ "pluginType": "core",
540
+ "strict": true,
541
+ "summary": "Search locally cached research artifacts by keywords.",
542
+ "enableJsonFlag": false,
543
+ "jsonEnvelope": false,
544
+ "stdoutIsPrimaryData": true
545
+ },
546
+ "status": {
547
+ "aliases": [],
548
+ "args": {
549
+ "url": {
550
+ "description": "The URL to check.",
551
+ "name": "url",
552
+ "required": true
553
+ }
554
+ },
555
+ "description": "Reports whether the URL is cached, its freshness state, and what action (fetch, revalidate, or cached return) the root fetch command would take.",
556
+ "flags": {
557
+ "json": {
558
+ "description": "Return the output as a machine-readable JSON object.",
559
+ "name": "json",
560
+ "allowNo": false,
561
+ "type": "boolean"
562
+ },
563
+ "tier": {
564
+ "description": "Freshness tier policy to evaluate against.",
565
+ "name": "tier",
566
+ "default": "standard",
567
+ "hasDynamicHelp": false,
568
+ "multiple": false,
569
+ "options": [
570
+ "stable",
571
+ "standard",
572
+ "volatile"
573
+ ],
574
+ "type": "option"
575
+ },
576
+ "ttl": {
577
+ "char": "l",
578
+ "description": "Custom TTL duration to evaluate against (e.g. \"2h\", \"7d\").",
579
+ "name": "ttl",
580
+ "hasDynamicHelp": false,
581
+ "multiple": false,
582
+ "type": "option"
583
+ },
584
+ "max-age": {
585
+ "description": "Maximum age of cache to accept (e.g. \"1d\", \"30d\").",
586
+ "name": "max-age",
587
+ "hasDynamicHelp": false,
588
+ "multiple": false,
589
+ "type": "option"
590
+ }
591
+ },
592
+ "hasDynamicHelp": false,
593
+ "hiddenAliases": [],
594
+ "id": "status",
595
+ "pluginAlias": "@taurgis/bonsai",
596
+ "pluginName": "@taurgis/bonsai",
597
+ "pluginType": "core",
598
+ "strict": true,
599
+ "summary": "Check the cache status of a URL without fetching or writing.",
600
+ "enableJsonFlag": false,
601
+ "jsonEnvelope": false,
602
+ "stdoutIsPrimaryData": true
603
+ },
604
+ "config:get": {
605
+ "aliases": [],
606
+ "args": {
607
+ "key": {
608
+ "description": "The configuration key to read.",
609
+ "name": "key",
610
+ "required": true
611
+ }
612
+ },
613
+ "description": "Print a config value. Without --global/--local, shows the merged effective value (flag > env > project > user > default).\n\nValid keys: storage.",
614
+ "examples": [
615
+ {
616
+ "description": "Get the effective storage mode",
617
+ "command": "<%= config.bin %> config get storage"
618
+ },
619
+ {
620
+ "description": "Read only the project-level value",
621
+ "command": "<%= config.bin %> config get storage --local"
622
+ }
623
+ ],
624
+ "flags": {
625
+ "json": {
626
+ "description": "Return the output as a machine-readable JSON object.",
627
+ "name": "json",
628
+ "allowNo": false,
629
+ "type": "boolean"
630
+ },
631
+ "global": {
632
+ "char": "g",
633
+ "description": "Read from user-level config only.",
634
+ "name": "global",
635
+ "allowNo": false,
636
+ "type": "boolean"
637
+ },
638
+ "local": {
639
+ "aliases": [
640
+ "project"
641
+ ],
642
+ "charAliases": [
643
+ "p"
644
+ ],
645
+ "description": "Read from project-level config only.",
646
+ "name": "local",
647
+ "allowNo": false,
648
+ "type": "boolean"
649
+ }
650
+ },
651
+ "hasDynamicHelp": false,
652
+ "hiddenAliases": [],
653
+ "id": "config:get",
654
+ "pluginAlias": "@taurgis/bonsai",
655
+ "pluginName": "@taurgis/bonsai",
656
+ "pluginType": "core",
657
+ "strict": true,
658
+ "summary": "Get the effective value of a research configuration key.",
659
+ "stdoutIsPrimaryData": true
660
+ },
661
+ "config:list": {
662
+ "aliases": [],
663
+ "args": {},
664
+ "description": "Show every configuration key with its current value. Use --global/--local to show a single scope.\n\nValid keys: storage.",
665
+ "examples": [
666
+ {
667
+ "description": "Show all effective config values",
668
+ "command": "<%= config.bin %> config list"
669
+ },
670
+ {
671
+ "description": "Show only project-level config",
672
+ "command": "<%= config.bin %> config list --local"
673
+ }
674
+ ],
675
+ "flags": {
676
+ "json": {
677
+ "description": "Return the output as a machine-readable JSON object.",
678
+ "name": "json",
679
+ "allowNo": false,
680
+ "type": "boolean"
681
+ },
682
+ "global": {
683
+ "char": "g",
684
+ "description": "Show user-level config only.",
685
+ "name": "global",
686
+ "allowNo": false,
687
+ "type": "boolean"
688
+ },
689
+ "local": {
690
+ "aliases": [
691
+ "project"
692
+ ],
693
+ "charAliases": [
694
+ "p"
695
+ ],
696
+ "description": "Show project-level config only.",
697
+ "name": "local",
698
+ "allowNo": false,
699
+ "type": "boolean"
700
+ }
701
+ },
702
+ "hasDynamicHelp": false,
703
+ "hiddenAliases": [],
704
+ "id": "config:list",
705
+ "pluginAlias": "@taurgis/bonsai",
706
+ "pluginName": "@taurgis/bonsai",
707
+ "pluginType": "core",
708
+ "strict": true,
709
+ "summary": "List all research configuration keys and their effective values.",
710
+ "stdoutIsPrimaryData": true
711
+ },
712
+ "config:set": {
713
+ "aliases": [],
714
+ "args": {
715
+ "key": {
716
+ "description": "The configuration key to set.",
717
+ "name": "key",
718
+ "required": false
719
+ },
720
+ "value": {
721
+ "description": "The value to assign.",
722
+ "name": "value",
723
+ "required": false
724
+ }
725
+ },
726
+ "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. The inline form `<key>=<value>` is also accepted.",
727
+ "examples": [
728
+ {
729
+ "description": "Store research cache inside the current project",
730
+ "command": "<%= config.bin %> config set storage project --local"
731
+ },
732
+ {
733
+ "description": "Set the user-level default using the inline key=value form",
734
+ "command": "<%= config.bin %> config set storage=global"
735
+ }
736
+ ],
737
+ "flags": {
738
+ "json": {
739
+ "description": "Return the output as a machine-readable JSON object.",
740
+ "name": "json",
741
+ "allowNo": false,
742
+ "type": "boolean"
743
+ },
744
+ "global": {
745
+ "char": "g",
746
+ "description": "Write to user-level config (default).",
747
+ "name": "global",
748
+ "allowNo": false,
749
+ "type": "boolean"
750
+ },
751
+ "local": {
752
+ "aliases": [
753
+ "project"
754
+ ],
755
+ "charAliases": [
756
+ "p"
757
+ ],
758
+ "description": "Write to project-level config (.bonsai.json in cwd).",
759
+ "name": "local",
760
+ "allowNo": false,
761
+ "type": "boolean"
762
+ },
763
+ "dry-run": {
764
+ "description": "Show what would be written without saving.",
765
+ "name": "dry-run",
766
+ "allowNo": false,
767
+ "type": "boolean"
768
+ }
769
+ },
770
+ "hasDynamicHelp": false,
771
+ "hiddenAliases": [],
772
+ "id": "config:set",
773
+ "pluginAlias": "@taurgis/bonsai",
774
+ "pluginName": "@taurgis/bonsai",
775
+ "pluginType": "core",
776
+ "strict": true,
777
+ "summary": "Set a research configuration key.",
778
+ "stdoutIsPrimaryData": true
779
+ },
780
+ "config:unset": {
781
+ "aliases": [],
782
+ "args": {
783
+ "key": {
784
+ "description": "The configuration key to remove.",
785
+ "name": "key",
786
+ "required": true
787
+ }
788
+ },
789
+ "description": "Delete a key from user-level config (default) or project-level config (--local), restoring the built-in default.\n\nValid keys: storage.",
790
+ "examples": [
791
+ {
792
+ "description": "Remove the user-level storage setting",
793
+ "command": "<%= config.bin %> config unset storage"
794
+ },
795
+ {
796
+ "description": "Remove the project-level storage setting",
797
+ "command": "<%= config.bin %> config unset storage --local"
798
+ }
799
+ ],
800
+ "flags": {
801
+ "json": {
802
+ "description": "Return the output as a machine-readable JSON object.",
803
+ "name": "json",
804
+ "allowNo": false,
805
+ "type": "boolean"
806
+ },
807
+ "global": {
808
+ "char": "g",
809
+ "description": "Remove from user-level config (default).",
810
+ "name": "global",
811
+ "allowNo": false,
812
+ "type": "boolean"
813
+ },
814
+ "local": {
815
+ "aliases": [
816
+ "project"
817
+ ],
818
+ "charAliases": [
819
+ "p"
820
+ ],
821
+ "description": "Remove from project-level config (.bonsai.json in cwd).",
822
+ "name": "local",
823
+ "allowNo": false,
824
+ "type": "boolean"
825
+ },
826
+ "dry-run": {
827
+ "description": "Show what would be removed without saving.",
828
+ "name": "dry-run",
829
+ "allowNo": false,
830
+ "type": "boolean"
831
+ }
832
+ },
833
+ "hasDynamicHelp": false,
834
+ "hiddenAliases": [],
835
+ "id": "config:unset",
836
+ "pluginAlias": "@taurgis/bonsai",
837
+ "pluginName": "@taurgis/bonsai",
838
+ "pluginType": "core",
839
+ "strict": true,
840
+ "summary": "Remove a research configuration key.",
841
+ "stdoutIsPrimaryData": true
842
+ }
843
+ },
844
+ "version": "1.0.0"
845
+ }