@taurgis/bonsai 3.1.0 → 3.2.2

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 (164) hide show
  1. package/README.md +21 -4
  2. package/agents/agents/salesforce-docs-researcher.agent.md +14 -1
  3. package/agents/instructions/salesforce-research.instructions.md +2 -1
  4. package/bin/cli.mjs +9 -17
  5. package/dist/base-command.d.ts +37 -10
  6. package/dist/base-command.js +113 -46
  7. package/dist/commands/config/base.js +11 -2
  8. package/dist/commands/config/get.js +8 -12
  9. package/dist/commands/config/index.js +2 -2
  10. package/dist/commands/config/list.js +10 -16
  11. package/dist/commands/config/set.d.ts +2 -1
  12. package/dist/commands/config/set.js +34 -27
  13. package/dist/commands/config/unset.d.ts +2 -1
  14. package/dist/commands/config/unset.js +25 -24
  15. package/dist/commands/fetch.d.ts +7 -15
  16. package/dist/commands/fetch.js +58 -401
  17. package/dist/commands/import.d.ts +4 -9
  18. package/dist/commands/import.js +56 -280
  19. package/dist/commands/inspect.d.ts +7 -1
  20. package/dist/commands/inspect.js +103 -52
  21. package/dist/commands/list.d.ts +13 -1
  22. package/dist/commands/list.js +79 -32
  23. package/dist/commands/prune.d.ts +4 -1
  24. package/dist/commands/prune.js +56 -65
  25. package/dist/commands/status.d.ts +3 -2
  26. package/dist/commands/status.js +52 -79
  27. package/dist/hooks/command-not-found/suggest.d.ts +1 -0
  28. package/dist/hooks/command-not-found/suggest.js +66 -39
  29. package/dist/lib/argv.d.ts +24 -3
  30. package/dist/lib/argv.js +124 -53
  31. package/dist/lib/batch.d.ts +41 -0
  32. package/dist/lib/batch.js +39 -0
  33. package/dist/lib/cache-view.d.ts +21 -0
  34. package/dist/lib/cache-view.js +30 -0
  35. package/dist/lib/cli-emit.d.ts +28 -0
  36. package/dist/lib/cli-emit.js +44 -0
  37. package/dist/lib/cli-error-policy.d.ts +57 -0
  38. package/dist/lib/cli-error-policy.js +74 -0
  39. package/dist/lib/cli-flag-manifest.d.ts +5 -0
  40. package/dist/lib/cli-flag-manifest.js +8 -0
  41. package/dist/lib/cli-presentation.d.ts +39 -0
  42. package/dist/lib/cli-presentation.js +50 -0
  43. package/dist/lib/cli-result-types.d.ts +88 -0
  44. package/dist/lib/cli-result-types.js +2 -0
  45. package/dist/lib/config/index.d.ts +22 -4
  46. package/dist/lib/config/index.js +59 -4
  47. package/dist/lib/config/resolve.d.ts +21 -0
  48. package/dist/lib/config/resolve.js +55 -6
  49. package/dist/lib/config-persist.d.ts +28 -0
  50. package/dist/lib/config-persist.js +29 -0
  51. package/dist/lib/envelope.d.ts +41 -3
  52. package/dist/lib/envelope.js +147 -4
  53. package/dist/lib/help-preflight.d.ts +5 -8
  54. package/dist/lib/help-preflight.js +13 -32
  55. package/dist/lib/json-meta.d.ts +0 -2
  56. package/dist/lib/json-meta.js +21 -25
  57. package/dist/lib/limit-flag.d.ts +11 -1
  58. package/dist/lib/limit-flag.js +19 -6
  59. package/dist/lib/parse-error-ux.d.ts +5 -0
  60. package/dist/lib/parse-error-ux.js +73 -0
  61. package/dist/lib/prune-flags.d.ts +28 -0
  62. package/dist/lib/prune-flags.js +74 -0
  63. package/dist/lib/research/artifact-index.d.ts +11 -2
  64. package/dist/lib/research/artifact-index.js +7 -4
  65. package/dist/lib/research/browser.d.ts +41 -2
  66. package/dist/lib/research/browser.js +139 -50
  67. package/dist/lib/research/capture.d.ts +24 -2
  68. package/dist/lib/research/capture.js +24 -4
  69. package/dist/lib/research/cli-io.d.ts +33 -0
  70. package/dist/lib/research/cli-io.js +27 -0
  71. package/dist/lib/research/compress.d.ts +7 -0
  72. package/dist/lib/research/compress.js +7 -3
  73. package/dist/lib/research/docs/capabilities.d.ts +15 -0
  74. package/dist/lib/research/docs/capabilities.js +5 -0
  75. package/dist/lib/research/docs/clean-dom.d.ts +2 -0
  76. package/dist/lib/research/docs/clean-dom.js +2 -0
  77. package/dist/lib/research/docs/code-blocks.d.ts +2 -0
  78. package/dist/lib/research/docs/code-blocks.js +2 -0
  79. package/dist/lib/research/docs/detect.d.ts +4 -0
  80. package/dist/lib/research/docs/detect.js +4 -0
  81. package/dist/lib/research/docs/machine-readable.d.ts +18 -0
  82. package/dist/lib/research/docs/machine-readable.js +10 -0
  83. package/dist/lib/research/docs/markdown-source.d.ts +20 -0
  84. package/dist/lib/research/docs/markdown-source.js +19 -2
  85. package/dist/lib/research/docs/quality-gates.d.ts +5 -0
  86. package/dist/lib/research/docs/quality-gates.js +4 -0
  87. package/dist/lib/research/docs/rsc.d.ts +9 -2
  88. package/dist/lib/research/docs/rsc.js +5 -2
  89. package/dist/lib/research/docs/section-artifacts.d.ts +12 -0
  90. package/dist/lib/research/docs/section-artifacts.js +12 -0
  91. package/dist/lib/research/docs/sections.d.ts +18 -0
  92. package/dist/lib/research/docs/sections.js +17 -1
  93. package/dist/lib/research/docs/source-map.d.ts +28 -0
  94. package/dist/lib/research/docs/source-map.js +27 -0
  95. package/dist/lib/research/docs/validate.d.ts +35 -2
  96. package/dist/lib/research/docs/validate.js +47 -2
  97. package/dist/lib/research/extract.d.ts +16 -0
  98. package/dist/lib/research/extract.js +12 -1
  99. package/dist/lib/research/fetch-command-service.d.ts +36 -0
  100. package/dist/lib/research/fetch-command-service.js +310 -0
  101. package/dist/lib/research/fetch-result.d.ts +114 -0
  102. package/dist/lib/research/fetch-result.js +212 -0
  103. package/dist/lib/research/fetcher.d.ts +46 -8
  104. package/dist/lib/research/fetcher.js +58 -30
  105. package/dist/lib/research/freshness.d.ts +54 -11
  106. package/dist/lib/research/freshness.js +91 -31
  107. package/dist/lib/research/import-command-service.d.ts +56 -0
  108. package/dist/lib/research/import-command-service.js +381 -0
  109. package/dist/lib/research/keywords.js +5 -1
  110. package/dist/lib/research/markdown.d.ts +12 -1
  111. package/dist/lib/research/markdown.js +13 -5
  112. package/dist/lib/research/persist-artifact.d.ts +23 -0
  113. package/dist/lib/research/persist-artifact.js +27 -0
  114. package/dist/lib/research/prompt-injection.d.ts +8 -0
  115. package/dist/lib/research/prompt-injection.js +42 -13
  116. package/dist/lib/research/proxy.d.ts +14 -8
  117. package/dist/lib/research/proxy.js +14 -10
  118. package/dist/lib/research/revalidate.d.ts +49 -20
  119. package/dist/lib/research/revalidate.js +80 -15
  120. package/dist/lib/research/schema.d.ts +7 -0
  121. package/dist/lib/research/schema.js +2 -0
  122. package/dist/lib/research/secret-scan.d.ts +6 -0
  123. package/dist/lib/research/secret-scan.js +8 -0
  124. package/dist/lib/research/secure-write.d.ts +11 -1
  125. package/dist/lib/research/secure-write.js +38 -7
  126. package/dist/lib/research/storage.d.ts +5 -1
  127. package/dist/lib/research/storage.js +8 -3
  128. package/dist/lib/research/summarize.d.ts +15 -0
  129. package/dist/lib/research/summarize.js +11 -0
  130. package/dist/lib/research/url.d.ts +9 -6
  131. package/dist/lib/research/url.js +33 -21
  132. package/dist/lib/text.d.ts +7 -2
  133. package/dist/lib/text.js +13 -2
  134. package/dist/lib/value-flags.d.ts +14 -0
  135. package/dist/lib/value-flags.js +28 -0
  136. package/dist/sites/coveo.d.ts +10 -0
  137. package/dist/sites/coveo.js +10 -0
  138. package/dist/sites/index.d.ts +16 -0
  139. package/dist/sites/index.js +16 -4
  140. package/dist/sites/markdown-twin.d.ts +31 -0
  141. package/dist/sites/markdown-twin.js +56 -0
  142. package/dist/sites/salesforce/fetch-page.d.ts +8 -2
  143. package/dist/sites/salesforce/fetch-page.js +14 -3
  144. package/dist/sites/salesforce/help-tooling-markdown.d.ts +30 -0
  145. package/dist/sites/salesforce/help-tooling-markdown.js +74 -0
  146. package/dist/sites/salesforce/index.d.ts +1 -0
  147. package/dist/sites/salesforce/index.js +1 -0
  148. package/dist/sites/salesforce-developer/fetch-page.d.ts +6 -1
  149. package/dist/sites/salesforce-developer/fetch-page.js +6 -1
  150. package/dist/sites/salesforce-developer/index.d.ts +1 -0
  151. package/dist/sites/salesforce-developer/index.js +1 -0
  152. package/dist/sites/salesforce-developer/route-markdown.d.ts +18 -6
  153. package/dist/sites/salesforce-developer/route-markdown.js +29 -67
  154. package/dist/sites/salesforce-doc-fetch.d.ts +39 -5
  155. package/dist/sites/salesforce-doc-fetch.js +52 -7
  156. package/dist/sites/salesforce-dom-probe.d.ts +20 -2
  157. package/dist/sites/salesforce-dom-probe.js +20 -2
  158. package/dist/sites/types.d.ts +14 -8
  159. package/dist/sites/types.js +3 -0
  160. package/oclif.manifest.json +192 -87
  161. package/package.json +19 -7
  162. package/agents/agents/official-docs-researcher.agent.md +0 -87
  163. package/agents/instructions/web-research.instructions.md +0 -44
  164. package/agents/skills/web-research/SKILL.md +0 -118
@@ -4,19 +4,19 @@
4
4
  "aliases": [],
5
5
  "args": {
6
6
  "url": {
7
- "description": "the full HTTP/HTTPS URL of the web page to research",
7
+ "description": "HTTP(S) URL to research",
8
8
  "name": "url",
9
9
  "required": true
10
10
  }
11
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.\n\nUsually invoked via the shorthand `bonsai <url>` rather than `bonsai fetch <url>`.",
12
+ "description": "Fetch a URL, convert the main content to Markdown, and cache compressed and detailed variants.\n\nUsually invoked as `bonsai <url>`; run `bonsai help fetch` for URL-form flags.",
13
13
  "examples": [
14
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"
15
+ "description": "cache docs with detailed output, topic, tags, and TTL",
16
+ "command": "<%= config.bin %> https://docs.nestjs.com/ --topic \"Backend Frameworks\" --tags \"Node\" --tags \"NestJS\" --format detailed --ttl 7d"
17
17
  },
18
18
  {
19
- "description": "research a volatile page with compressed output and short TTL, returned as JSON",
19
+ "description": "cache a volatile page with compressed JSON output",
20
20
  "command": "<%= config.bin %> https://news.ycombinator.com/ --format compressed --ttl 2h --json"
21
21
  }
22
22
  ],
@@ -28,9 +28,18 @@
28
28
  "allowNo": false,
29
29
  "type": "boolean"
30
30
  },
31
+ "read-only": {
32
+ "aliases": [
33
+ "plan"
34
+ ],
35
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
36
+ "name": "read-only",
37
+ "allowNo": false,
38
+ "type": "boolean"
39
+ },
31
40
  "topic": {
32
41
  "char": "t",
33
- "description": "the main category/topic of the research for metadata tagging",
42
+ "description": "main research topic for metadata",
34
43
  "name": "topic",
35
44
  "hasDynamicHelp": false,
36
45
  "multiple": false,
@@ -46,7 +55,7 @@
46
55
  },
47
56
  "format": {
48
57
  "char": "f",
49
- "description": "desired data density",
58
+ "description": "output format",
50
59
  "name": "format",
51
60
  "default": "compressed",
52
61
  "hasDynamicHelp": false,
@@ -72,39 +81,39 @@
72
81
  },
73
82
  "ttl": {
74
83
  "char": "l",
75
- "description": "predicted lifespan: number + h/d/w/m/y (m = months), e.g. \"2h\", \"7d\", \"6m\"",
84
+ "description": "TTL duration for freshness (e.g. \"2h\", \"7d\", \"6m\")",
76
85
  "name": "ttl",
77
86
  "hasDynamicHelp": false,
78
87
  "multiple": false,
79
88
  "type": "option"
80
89
  },
81
90
  "max-age": {
82
- "description": "maximum age of cache to accept (e.g., \"1d\", \"30d\")",
91
+ "description": "maximum cache age to accept (e.g. \"2h\", \"7d\", \"6m\")",
83
92
  "name": "max-age",
84
93
  "hasDynamicHelp": false,
85
94
  "multiple": false,
86
95
  "type": "option"
87
96
  },
88
97
  "force": {
89
- "description": "force a fresh fetch, ignoring any cached entries",
98
+ "description": "fetch fresh content, ignoring cached entries",
90
99
  "name": "force",
91
100
  "allowNo": false,
92
101
  "type": "boolean"
93
102
  },
94
103
  "dry-run": {
95
- "description": "perform validation and fetch without saving to local cache",
104
+ "description": "fetch and validate without writing cache",
96
105
  "name": "dry-run",
97
106
  "allowNo": false,
98
107
  "type": "boolean"
99
108
  },
100
109
  "allow-stale": {
101
- "description": "allow serving stale cache if the remote server is unreachable",
110
+ "description": "suppress exit code 5 when stale cache is served within grace after failed revalidation",
102
111
  "name": "allow-stale",
103
112
  "allowNo": false,
104
113
  "type": "boolean"
105
114
  },
106
115
  "rendered": {
107
- "description": "force using a browser-rendered scraping path for dynamic pages",
116
+ "description": "use browser-rendered capture for dynamic pages",
108
117
  "name": "rendered",
109
118
  "allowNo": false,
110
119
  "type": "boolean"
@@ -129,7 +138,7 @@
129
138
  "pluginName": "@taurgis/bonsai",
130
139
  "pluginType": "core",
131
140
  "strict": false,
132
- "summary": "An advanced, locally cached web research tool optimized for LLM ingestion.",
141
+ "summary": "Fetch and cache URL research Markdown",
133
142
  "enableJsonFlag": true,
134
143
  "stdoutIsPrimaryData": true
135
144
  },
@@ -137,27 +146,27 @@
137
146
  "aliases": [],
138
147
  "args": {
139
148
  "url": {
140
- "description": "the single source URL of the page (only for single-source import)",
149
+ "description": "single source URL for single-source import",
141
150
  "name": "url",
142
151
  "required": false
143
152
  }
144
153
  },
145
- "description": "Accepts a synthesized Markdown note via stdin and registers it under the single target URL or multiple source URLs.",
154
+ "description": "Store supplied Markdown under one URL or a multi-source research note, using the same freshness and storage metadata as fetched pages.",
146
155
  "examples": [
147
156
  {
148
- "description": "import detailed research for a single URL via stdin",
149
- "command": "echo \"# My Article\" | <%= config.bin %> import https://example.com/docs --stdin"
157
+ "description": "import detailed research for one URL from stdin",
158
+ "command": "printf \"# My Article\\n\" | <%= config.bin %> import https://example.com/docs --stdin --ttl 7d"
150
159
  },
151
160
  {
152
- "description": "import research synthesized from multiple source URLs",
161
+ "description": "import a research note synthesized from multiple source URLs",
153
162
  "command": "echo \"# Synthesized\" | <%= config.bin %> import --stdin --topic \"React docs\" --source-url https://react.dev/a --source-url https://react.dev/b"
154
163
  },
155
164
  {
156
- "description": "import research from a local Markdown file",
165
+ "description": "import research from a Markdown file",
157
166
  "command": "<%= config.bin %> import https://example.com/docs --file path/to/notes.md"
158
167
  },
159
168
  {
160
- "description": "import research from stdin using the standard file placeholder",
169
+ "description": "import research from stdin with the file placeholder",
161
170
  "command": "cat notes.md | <%= config.bin %> import https://example.com/docs --file -"
162
171
  }
163
172
  ],
@@ -169,6 +178,15 @@
169
178
  "allowNo": false,
170
179
  "type": "boolean"
171
180
  },
181
+ "read-only": {
182
+ "aliases": [
183
+ "plan"
184
+ ],
185
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
186
+ "name": "read-only",
187
+ "allowNo": false,
188
+ "type": "boolean"
189
+ },
172
190
  "stdin": {
173
191
  "description": "read Markdown from stdin",
174
192
  "name": "stdin",
@@ -176,14 +194,15 @@
176
194
  "type": "boolean"
177
195
  },
178
196
  "file": {
179
- "description": "path to a Markdown file containing research notes to import, or \"-\" for stdin",
197
+ "char": "f",
198
+ "description": "Markdown file to import, or \"-\" for stdin",
180
199
  "name": "file",
181
200
  "hasDynamicHelp": false,
182
201
  "multiple": false,
183
202
  "type": "option"
184
203
  },
185
204
  "input-format": {
186
- "description": "format of the input provided",
205
+ "description": "input content format",
187
206
  "name": "input-format",
188
207
  "default": "detailed",
189
208
  "hasDynamicHelp": false,
@@ -196,7 +215,7 @@
196
215
  },
197
216
  "topic": {
198
217
  "char": "t",
199
- "description": "the main topic for this research note",
218
+ "description": "main topic for this research note",
200
219
  "name": "topic",
201
220
  "hasDynamicHelp": false,
202
221
  "multiple": false,
@@ -224,7 +243,7 @@
224
243
  "type": "option"
225
244
  },
226
245
  "source-url": {
227
- "description": "repeated source URLs for multi-source import",
246
+ "description": "source URLs for multi-source import (can be repeated)",
228
247
  "name": "source-url",
229
248
  "hasDynamicHelp": false,
230
249
  "multiple": true,
@@ -232,12 +251,18 @@
232
251
  },
233
252
  "ttl": {
234
253
  "char": "l",
235
- "description": "predicted lifespan of the data (e.g. \"24h\", \"7d\")",
254
+ "description": "TTL duration for imported note freshness (e.g. \"2h\", \"7d\", \"6m\")",
236
255
  "name": "ttl",
237
256
  "hasDynamicHelp": false,
238
257
  "multiple": false,
239
258
  "type": "option"
240
259
  },
260
+ "dry-run": {
261
+ "description": "validate import without writing cache",
262
+ "name": "dry-run",
263
+ "allowNo": false,
264
+ "type": "boolean"
265
+ },
241
266
  "storage": {
242
267
  "description": "override where this note is cached (secrets always stored globally)",
243
268
  "name": "storage",
@@ -257,7 +282,7 @@
257
282
  "pluginName": "@taurgis/bonsai",
258
283
  "pluginType": "core",
259
284
  "strict": true,
260
- "summary": "Import agent-supplied clean Markdown notes into the local cache.",
285
+ "summary": "Import agent-supplied Markdown into cache",
261
286
  "enableJsonFlag": true,
262
287
  "stdoutIsPrimaryData": true
263
288
  },
@@ -265,19 +290,19 @@
265
290
  "aliases": [],
266
291
  "args": {
267
292
  "url": {
268
- "description": "the URL to inspect",
293
+ "description": "URL to inspect",
269
294
  "name": "url",
270
295
  "required": true
271
296
  }
272
297
  },
273
- "description": "Inspects local storage and displays full frontmatter metadata for the URL (without printing the content body).",
298
+ "description": "Show frontmatter metadata and section children for cached URLs without printing content.",
274
299
  "examples": [
275
300
  {
276
- "description": "inspect cached research metadata for a specific URL",
301
+ "description": "inspect cached metadata for a URL",
277
302
  "command": "<%= config.bin %> <%= command.id %> https://example.com/docs"
278
303
  },
279
304
  {
280
- "description": "output the full metadata as JSON for use by other tools",
305
+ "description": "inspect cached metadata as JSON",
281
306
  "command": "<%= config.bin %> <%= command.id %> https://example.com/docs --json"
282
307
  }
283
308
  ],
@@ -288,6 +313,15 @@
288
313
  "name": "json",
289
314
  "allowNo": false,
290
315
  "type": "boolean"
316
+ },
317
+ "read-only": {
318
+ "aliases": [
319
+ "plan"
320
+ ],
321
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
322
+ "name": "read-only",
323
+ "allowNo": false,
324
+ "type": "boolean"
291
325
  }
292
326
  },
293
327
  "hasDynamicHelp": false,
@@ -297,29 +331,29 @@
297
331
  "pluginName": "@taurgis/bonsai",
298
332
  "pluginType": "core",
299
333
  "strict": false,
300
- "summary": "Inspect cached research metadata for a URL.",
334
+ "summary": "Inspect cached research metadata for a URL",
301
335
  "enableJsonFlag": true,
302
336
  "stdoutIsPrimaryData": true
303
337
  },
304
338
  "list": {
305
339
  "aliases": [],
306
340
  "args": {},
307
- "description": "Lists cached research artifacts, including metadata details like path, source count, freshness, token estimates, and quality metrics without printing full content.",
341
+ "description": "List page-level cached artifacts with source URLs, topic, tags, freshness, capture method, and token estimates.",
308
342
  "examples": [
309
343
  {
310
- "description": "list all cached entries",
344
+ "description": "list cached entries",
311
345
  "command": "<%= config.bin %> list"
312
346
  },
313
347
  {
314
- "description": "list cached entries for a specific topic with JSON output",
348
+ "description": "list entries for a topic as JSON",
315
349
  "command": "<%= config.bin %> list --topic \"React Suspense\" --json"
316
350
  },
317
351
  {
318
- "description": "list only fresh entries filtered by tags",
352
+ "description": "list fresh entries matching tags",
319
353
  "command": "<%= config.bin %> list --freshness fresh --tags node --tags url"
320
354
  },
321
355
  {
322
- "description": "list entries matching a specific URL glob",
356
+ "description": "list entries matching a URL glob",
323
357
  "command": "<%= config.bin %> list --url \"https://react.dev/*\""
324
358
  }
325
359
  ],
@@ -331,9 +365,18 @@
331
365
  "allowNo": false,
332
366
  "type": "boolean"
333
367
  },
368
+ "read-only": {
369
+ "aliases": [
370
+ "plan"
371
+ ],
372
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
373
+ "name": "read-only",
374
+ "allowNo": false,
375
+ "type": "boolean"
376
+ },
334
377
  "topic": {
335
378
  "char": "t",
336
- "description": "filter by exact topic (case-insensitive)",
379
+ "description": "exact topic (case-insensitive)",
337
380
  "name": "topic",
338
381
  "hasDynamicHelp": false,
339
382
  "multiple": false,
@@ -341,21 +384,21 @@
341
384
  },
342
385
  "tags": {
343
386
  "char": "g",
344
- "description": "filter by tags (must match all tags specified)",
387
+ "description": "tags to require (must match all)",
345
388
  "name": "tags",
346
389
  "hasDynamicHelp": false,
347
390
  "multiple": true,
348
391
  "type": "option"
349
392
  },
350
393
  "url": {
351
- "description": "filter by source URL glob pattern (case-insensitive, supports * wildcard)",
394
+ "description": "source URL glob (case-insensitive, supports * wildcard)",
352
395
  "name": "url",
353
396
  "hasDynamicHelp": false,
354
397
  "multiple": false,
355
398
  "type": "option"
356
399
  },
357
400
  "freshness": {
358
- "description": "filter by freshness state",
401
+ "description": "freshness state",
359
402
  "name": "freshness",
360
403
  "hasDynamicHelp": false,
361
404
  "multiple": false,
@@ -367,7 +410,7 @@
367
410
  "type": "option"
368
411
  },
369
412
  "artifact-type": {
370
- "description": "filter by artifact type",
413
+ "description": "artifact type; section children are omitted from list - use inspect to see them",
371
414
  "name": "artifact-type",
372
415
  "hasDynamicHelp": false,
373
416
  "multiple": false,
@@ -379,7 +422,7 @@
379
422
  "type": "option"
380
423
  },
381
424
  "capture-method": {
382
- "description": "filter by capture method",
425
+ "description": "capture method",
383
426
  "name": "capture-method",
384
427
  "hasDynamicHelp": false,
385
428
  "multiple": false,
@@ -393,7 +436,7 @@
393
436
  "type": "option"
394
437
  },
395
438
  "limit": {
396
- "description": "maximum number of results to return (default 50, max 100)",
439
+ "description": "result count (default 50, max 100)",
397
440
  "name": "limit",
398
441
  "default": 50,
399
442
  "hasDynamicHelp": false,
@@ -408,25 +451,25 @@
408
451
  "pluginName": "@taurgis/bonsai",
409
452
  "pluginType": "core",
410
453
  "strict": true,
411
- "summary": "List cached research artifacts by metadata filters.",
454
+ "summary": "List cached research artifacts by metadata",
412
455
  "enableJsonFlag": true,
413
456
  "stdoutIsPrimaryData": true
414
457
  },
415
458
  "prune": {
416
459
  "aliases": [],
417
460
  "args": {},
418
- "description": "Prunes cached research entries based on age, inactivity, or artifact type to free up disk space.",
461
+ "description": "Delete cached artifacts by content age, idle time, URL glob, or artifact type.",
419
462
  "examples": [
420
463
  {
421
- "description": "perform a dry run of pruning entries older than 90 days",
422
- "command": "<%= config.bin %> prune --older-than 90d --dry-run"
464
+ "description": "preview pruning entries older than 30 days",
465
+ "command": "<%= config.bin %> prune --older-than 30d --dry-run"
423
466
  },
424
467
  {
425
- "description": "actually prune entries older than 30 days that are source scrapes",
468
+ "description": "prune source artifacts older than 30 days",
426
469
  "command": "<%= config.bin %> prune --older-than 30d --artifact-type source --yes"
427
470
  },
428
471
  {
429
- "description": "prune entries matching a URL glob pattern",
472
+ "description": "prune entries matching a URL glob",
430
473
  "command": "<%= config.bin %> prune --url \"https://react.dev/*\" --yes"
431
474
  }
432
475
  ],
@@ -438,29 +481,38 @@
438
481
  "allowNo": false,
439
482
  "type": "boolean"
440
483
  },
484
+ "read-only": {
485
+ "aliases": [
486
+ "plan"
487
+ ],
488
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
489
+ "name": "read-only",
490
+ "allowNo": false,
491
+ "type": "boolean"
492
+ },
441
493
  "older-than": {
442
- "description": "prune entries older than duration (e.g. \"30d\", \"90d\")",
494
+ "description": "content age threshold (fetched_at, else validated_at), e.g. \"30d\"",
443
495
  "name": "older-than",
444
496
  "hasDynamicHelp": false,
445
497
  "multiple": false,
446
498
  "type": "option"
447
499
  },
448
500
  "inactive": {
449
- "description": "prune entries inactive (unvalidated/unfetched) for duration (e.g. \"14d\", \"30d\")",
501
+ "description": "idle time threshold (validated_at, else fetched_at), e.g. \"14d\"",
450
502
  "name": "inactive",
451
503
  "hasDynamicHelp": false,
452
504
  "multiple": false,
453
505
  "type": "option"
454
506
  },
455
507
  "url": {
456
- "description": "filter pruning to source URL glob pattern (case-insensitive, supports * wildcard)",
508
+ "description": "source URL glob (case-insensitive, supports * wildcard)",
457
509
  "name": "url",
458
510
  "hasDynamicHelp": false,
459
511
  "multiple": false,
460
512
  "type": "option"
461
513
  },
462
514
  "artifact-type": {
463
- "description": "filter pruning to specific artifact type",
515
+ "description": "artifact type to prune, including section children",
464
516
  "name": "artifact-type",
465
517
  "hasDynamicHelp": false,
466
518
  "multiple": false,
@@ -473,14 +525,14 @@
473
525
  "type": "option"
474
526
  },
475
527
  "dry-run": {
476
- "description": "list files that would be deleted without actually deleting them",
528
+ "description": "preview files without deleting",
477
529
  "name": "dry-run",
478
530
  "allowNo": false,
479
531
  "type": "boolean"
480
532
  },
481
533
  "yes": {
482
534
  "char": "y",
483
- "description": "confirm deletion and prune matched entries (required unless --dry-run)",
535
+ "description": "confirm deletion (required unless --dry-run)",
484
536
  "name": "yes",
485
537
  "allowNo": false,
486
538
  "type": "boolean"
@@ -493,7 +545,7 @@
493
545
  "pluginName": "@taurgis/bonsai",
494
546
  "pluginType": "core",
495
547
  "strict": true,
496
- "summary": "Clean up old or inactive research cache entries.",
548
+ "summary": "Prune cached research artifacts",
497
549
  "enableJsonFlag": true,
498
550
  "stdoutIsPrimaryData": true
499
551
  },
@@ -501,19 +553,19 @@
501
553
  "aliases": [],
502
554
  "args": {
503
555
  "url": {
504
- "description": "the URL to check",
556
+ "description": "URL to check",
505
557
  "name": "url",
506
558
  "required": true
507
559
  }
508
560
  },
509
- "description": "Reports whether the URL is cached, its freshness state, and what action (fetch, revalidate, or cached return) the root fetch command would take.",
561
+ "description": "Report cache hit/miss state, freshness, and the action the URL shorthand would take.",
510
562
  "examples": [
511
563
  {
512
- "description": "check if a URL is already in the cache",
564
+ "description": "check whether a URL is cached",
513
565
  "command": "<%= config.bin %> <%= command.id %> https://example.com/docs"
514
566
  },
515
567
  {
516
- "description": "check status against a specific freshness tier and TTL",
568
+ "description": "evaluate status with a specific tier and TTL",
517
569
  "command": "<%= config.bin %> <%= command.id %> https://example.com/docs --tier volatile --ttl 2h"
518
570
  }
519
571
  ],
@@ -525,10 +577,18 @@
525
577
  "allowNo": false,
526
578
  "type": "boolean"
527
579
  },
580
+ "read-only": {
581
+ "aliases": [
582
+ "plan"
583
+ ],
584
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
585
+ "name": "read-only",
586
+ "allowNo": false,
587
+ "type": "boolean"
588
+ },
528
589
  "tier": {
529
- "description": "freshness tier policy to evaluate against",
590
+ "description": "freshness tier policy to evaluate; when omitted, uses the cached entry's own tier",
530
591
  "name": "tier",
531
- "default": "standard",
532
592
  "hasDynamicHelp": false,
533
593
  "multiple": false,
534
594
  "options": [
@@ -540,14 +600,14 @@
540
600
  },
541
601
  "ttl": {
542
602
  "char": "l",
543
- "description": "custom TTL duration to evaluate against (e.g. \"2h\", \"7d\")",
603
+ "description": "TTL duration to evaluate freshness (e.g. \"2h\", \"7d\", \"6m\")",
544
604
  "name": "ttl",
545
605
  "hasDynamicHelp": false,
546
606
  "multiple": false,
547
607
  "type": "option"
548
608
  },
549
609
  "max-age": {
550
- "description": "maximum age of cache to accept (e.g. \"1d\", \"30d\")",
610
+ "description": "maximum cache age to accept (e.g. \"2h\", \"7d\", \"6m\")",
551
611
  "name": "max-age",
552
612
  "hasDynamicHelp": false,
553
613
  "multiple": false,
@@ -561,7 +621,7 @@
561
621
  "pluginName": "@taurgis/bonsai",
562
622
  "pluginType": "core",
563
623
  "strict": false,
564
- "summary": "Check the cache status of a URL without fetching or writing.",
624
+ "summary": "Check cache status without fetching or writing",
565
625
  "enableJsonFlag": true,
566
626
  "stdoutIsPrimaryData": true
567
627
  },
@@ -575,7 +635,7 @@
575
635
  "command": "<%= config.bin %> <%= command.id %> get storage"
576
636
  },
577
637
  {
578
- "description": "set a configuration value for the current project",
638
+ "description": "set project storage mode",
579
639
  "command": "<%= config.bin %> <%= command.id %> set storage project --local"
580
640
  }
581
641
  ],
@@ -586,6 +646,15 @@
586
646
  "name": "json",
587
647
  "allowNo": false,
588
648
  "type": "boolean"
649
+ },
650
+ "read-only": {
651
+ "aliases": [
652
+ "plan"
653
+ ],
654
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
655
+ "name": "read-only",
656
+ "allowNo": false,
657
+ "type": "boolean"
589
658
  }
590
659
  },
591
660
  "hasDynamicHelp": false,
@@ -595,7 +664,7 @@
595
664
  "pluginName": "@taurgis/bonsai",
596
665
  "pluginType": "core",
597
666
  "strict": true,
598
- "summary": "Manage research cache storage configuration (global vs project).",
667
+ "summary": "Manage research cache configuration",
599
668
  "enableJsonFlag": true,
600
669
  "stdoutIsPrimaryData": true
601
670
  },
@@ -608,7 +677,7 @@
608
677
  "required": false
609
678
  }
610
679
  },
611
- "description": "Print a config value. Without --global/--local, shows the merged effective value (flag > env > project > user > default).\n\nValid keys: storage, summary.",
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.",
612
681
  "examples": [
613
682
  {
614
683
  "description": "get the effective storage mode",
@@ -627,9 +696,18 @@
627
696
  "allowNo": false,
628
697
  "type": "boolean"
629
698
  },
699
+ "read-only": {
700
+ "aliases": [
701
+ "plan"
702
+ ],
703
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
704
+ "name": "read-only",
705
+ "allowNo": false,
706
+ "type": "boolean"
707
+ },
630
708
  "global": {
631
709
  "char": "g",
632
- "description": "Read from user-level config only.",
710
+ "description": "read user-level config only",
633
711
  "name": "global",
634
712
  "allowNo": false,
635
713
  "type": "boolean"
@@ -641,7 +719,7 @@
641
719
  "charAliases": [
642
720
  "p"
643
721
  ],
644
- "description": "Read from project-level config only.",
722
+ "description": "read project-level config only",
645
723
  "name": "local",
646
724
  "allowNo": false,
647
725
  "type": "boolean"
@@ -654,7 +732,7 @@
654
732
  "pluginName": "@taurgis/bonsai",
655
733
  "pluginType": "core",
656
734
  "strict": true,
657
- "summary": "Get the effective value of a research configuration key.",
735
+ "summary": "Get a research configuration value",
658
736
  "stdoutIsPrimaryData": true
659
737
  },
660
738
  "config:list": {
@@ -679,9 +757,18 @@
679
757
  "allowNo": false,
680
758
  "type": "boolean"
681
759
  },
760
+ "read-only": {
761
+ "aliases": [
762
+ "plan"
763
+ ],
764
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
765
+ "name": "read-only",
766
+ "allowNo": false,
767
+ "type": "boolean"
768
+ },
682
769
  "global": {
683
770
  "char": "g",
684
- "description": "Show user-level config only.",
771
+ "description": "show user-level config only",
685
772
  "name": "global",
686
773
  "allowNo": false,
687
774
  "type": "boolean"
@@ -693,7 +780,7 @@
693
780
  "charAliases": [
694
781
  "p"
695
782
  ],
696
- "description": "Show project-level config only.",
783
+ "description": "show project-level config only",
697
784
  "name": "local",
698
785
  "allowNo": false,
699
786
  "type": "boolean"
@@ -706,7 +793,7 @@
706
793
  "pluginName": "@taurgis/bonsai",
707
794
  "pluginType": "core",
708
795
  "strict": true,
709
- "summary": "List all research configuration keys and their effective values.",
796
+ "summary": "List research configuration values",
710
797
  "stdoutIsPrimaryData": true
711
798
  },
712
799
  "config:set": {
@@ -723,14 +810,14 @@
723
810
  "required": false
724
811
  }
725
812
  },
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, summary. The inline form `<key>=<value>` is also accepted.",
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.",
727
814
  "examples": [
728
815
  {
729
- "description": "store research cache inside the current project",
816
+ "description": "store research cache in the current project",
730
817
  "command": "<%= config.bin %> config set storage project --local"
731
818
  },
732
819
  {
733
- "description": "set the user-level default using the inline key=value form",
820
+ "description": "set the user-level default with key=value",
734
821
  "command": "<%= config.bin %> config set storage=global"
735
822
  }
736
823
  ],
@@ -742,9 +829,18 @@
742
829
  "allowNo": false,
743
830
  "type": "boolean"
744
831
  },
832
+ "read-only": {
833
+ "aliases": [
834
+ "plan"
835
+ ],
836
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
837
+ "name": "read-only",
838
+ "allowNo": false,
839
+ "type": "boolean"
840
+ },
745
841
  "global": {
746
842
  "char": "g",
747
- "description": "Write to user-level config (default).",
843
+ "description": "write user-level config (default)",
748
844
  "name": "global",
749
845
  "allowNo": false,
750
846
  "type": "boolean"
@@ -756,13 +852,13 @@
756
852
  "charAliases": [
757
853
  "p"
758
854
  ],
759
- "description": "Write to project-level config (.bonsai.json in cwd).",
855
+ "description": "write project-level config (.bonsai.json in cwd)",
760
856
  "name": "local",
761
857
  "allowNo": false,
762
858
  "type": "boolean"
763
859
  },
764
860
  "dry-run": {
765
- "description": "show what would be written without saving",
861
+ "description": "preview write without saving",
766
862
  "name": "dry-run",
767
863
  "allowNo": false,
768
864
  "type": "boolean"
@@ -775,7 +871,7 @@
775
871
  "pluginName": "@taurgis/bonsai",
776
872
  "pluginType": "core",
777
873
  "strict": true,
778
- "summary": "Set a research configuration key.",
874
+ "summary": "Set a research configuration key",
779
875
  "stdoutIsPrimaryData": true
780
876
  },
781
877
  "config:unset": {
@@ -806,9 +902,18 @@
806
902
  "allowNo": false,
807
903
  "type": "boolean"
808
904
  },
905
+ "read-only": {
906
+ "aliases": [
907
+ "plan"
908
+ ],
909
+ "description": "(alias: --plan) block filesystem writes/deletes; network fetches still run; also honored via BONSAI_READ_ONLY/BONSAI_PLAN_MODE",
910
+ "name": "read-only",
911
+ "allowNo": false,
912
+ "type": "boolean"
913
+ },
809
914
  "global": {
810
915
  "char": "g",
811
- "description": "Remove from user-level config (default).",
916
+ "description": "remove from user-level config (default)",
812
917
  "name": "global",
813
918
  "allowNo": false,
814
919
  "type": "boolean"
@@ -820,13 +925,13 @@
820
925
  "charAliases": [
821
926
  "p"
822
927
  ],
823
- "description": "Remove from project-level config (.bonsai.json in cwd).",
928
+ "description": "remove from project-level config (.bonsai.json in cwd)",
824
929
  "name": "local",
825
930
  "allowNo": false,
826
931
  "type": "boolean"
827
932
  },
828
933
  "dry-run": {
829
- "description": "show what would be removed without saving",
934
+ "description": "preview removal without saving",
830
935
  "name": "dry-run",
831
936
  "allowNo": false,
832
937
  "type": "boolean"
@@ -839,9 +944,9 @@
839
944
  "pluginName": "@taurgis/bonsai",
840
945
  "pluginType": "core",
841
946
  "strict": true,
842
- "summary": "Remove a research configuration key.",
947
+ "summary": "Remove a research configuration key",
843
948
  "stdoutIsPrimaryData": true
844
949
  }
845
950
  },
846
- "version": "3.1.0"
951
+ "version": "3.2.2"
847
952
  }