ggaction 0.0.13 → 0.0.16

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 (359) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/README.md +41 -12
  3. package/knowledge/action-cards.json +1 -1
  4. package/knowledge/intent-taxonomy.json +1 -1
  5. package/knowledge/mcp-resources.json +1 -1
  6. package/knowledge/task-packet.schema.json +1 -1
  7. package/knowledge/task-resolver.js +1 -1
  8. package/package.json +39 -7
  9. package/src/BasicChartProgram.js +3 -1
  10. package/src/ChartProgram.js +2 -0
  11. package/src/accessibility.js +157 -0
  12. package/src/actions/basic.js +2 -2
  13. package/src/actions/boxPlots/components.js +20 -12
  14. package/src/actions/boxPlots/create.js +4 -5
  15. package/src/actions/boxPlots/edit.js +34 -9
  16. package/src/actions/boxPlots/materialize.js +12 -4
  17. package/src/actions/boxPlots/options.js +48 -16
  18. package/src/actions/canvas/actions.js +3 -3
  19. package/src/actions/canvas/fitting.js +1 -1
  20. package/src/actions/categoryOrder/index.js +21 -12
  21. package/src/actions/charts/area.js +6 -2
  22. package/src/actions/charts/bar.js +3 -2
  23. package/src/actions/charts/beeswarm.js +1 -1
  24. package/src/actions/charts/density.js +7 -3
  25. package/src/actions/charts/ecdf.js +6 -3
  26. package/src/actions/charts/endpoints.js +29 -7
  27. package/src/actions/charts/heatmap.js +3 -2
  28. package/src/actions/charts/histogram.js +5 -4
  29. package/src/actions/charts/horizon.js +4 -2
  30. package/src/actions/charts/interval-regression.js +7 -4
  31. package/src/actions/charts/line.js +4 -2
  32. package/src/actions/charts/parallel.js +9 -3
  33. package/src/actions/charts/pie.js +11 -3
  34. package/src/actions/charts/polar.js +17 -6
  35. package/src/actions/charts/radar.js +9 -3
  36. package/src/actions/charts/radial.js +12 -4
  37. package/src/actions/charts/raincloud.js +2 -2
  38. package/src/actions/charts/rug-strip.js +8 -4
  39. package/src/actions/charts/scatter.js +4 -2
  40. package/src/actions/composition/actions.js +29 -24
  41. package/src/actions/coordinates/actions.js +2 -2
  42. package/src/actions/coordinates/edit.js +76 -0
  43. package/src/actions/data/basicBin2d.js +4 -5
  44. package/src/actions/data/bin.js +3 -3
  45. package/src/actions/data/bin2d.js +63 -193
  46. package/src/actions/data/bin2dMaterialize.js +4 -5
  47. package/src/actions/data/box.js +4 -4
  48. package/src/actions/data/complete.js +26 -0
  49. package/src/actions/data/computed.js +4 -4
  50. package/src/actions/data/create.js +7 -14
  51. package/src/actions/data/density.js +15 -23
  52. package/src/actions/data/derived.js +57 -31
  53. package/src/actions/data/ecdf.js +2 -2
  54. package/src/actions/data/edit.js +551 -0
  55. package/src/actions/data/filter.js +28 -22
  56. package/src/actions/data/fold.js +2 -2
  57. package/src/actions/data/gradientProfile.js +2 -2
  58. package/src/actions/data/horizon.js +2 -2
  59. package/src/actions/data/impute.js +26 -0
  60. package/src/actions/data/index.js +62 -47
  61. package/src/actions/data/interval.js +2 -2
  62. package/src/actions/data/intervalEdit.js +26 -18
  63. package/src/actions/data/normalize.js +27 -0
  64. package/src/actions/data/regression.js +21 -27
  65. package/src/actions/data/revise.js +48 -0
  66. package/src/actions/data/revisionBindings.js +125 -0
  67. package/src/actions/data/shared.js +20 -4
  68. package/src/actions/data/stack.js +2 -2
  69. package/src/actions/data/summary.js +3 -3
  70. package/src/actions/data/timeUnit.js +6 -3
  71. package/src/actions/data/window.js +3 -3
  72. package/src/actions/encodings/angle.js +1 -1
  73. package/src/actions/encodings/appearance.js +4 -4
  74. package/src/actions/encodings/barWidth.js +1 -1
  75. package/src/actions/encodings/channels.js +415 -0
  76. package/src/actions/encodings/color/index.js +3 -2
  77. package/src/actions/encodings/density.js +7 -4
  78. package/src/actions/encodings/histogram.js +4 -3
  79. package/src/actions/encodings/horizon.js +6 -8
  80. package/src/actions/encodings/index.js +4 -0
  81. package/src/actions/encodings/offset.js +22 -15
  82. package/src/actions/encodings/parallel.js +4 -5
  83. package/src/actions/encodings/pathOrder.js +6 -11
  84. package/src/actions/encodings/position/apply.js +53 -7
  85. package/src/actions/encodings/position/index.js +14 -6
  86. package/src/actions/encodings/position/policies/bar.js +9 -0
  87. package/src/actions/encodings/position/resolve.js +24 -7
  88. package/src/actions/encodings/ranged.js +5 -5
  89. package/src/actions/encodings/remove.js +13 -9
  90. package/src/actions/encodings/ruleAppearance.js +2 -24
  91. package/src/actions/encodings/seriesLayout.js +2 -1
  92. package/src/actions/encodings/shared.js +82 -14
  93. package/src/actions/encodings/stroke.js +226 -0
  94. package/src/actions/encodings/strokeDash.js +2 -2
  95. package/src/actions/encodings/text.js +1 -1
  96. package/src/actions/errorBands/create.js +34 -20
  97. package/src/actions/errorBands/edit.js +34 -137
  98. package/src/actions/errorBars/create.js +43 -20
  99. package/src/actions/errorBars/edit.js +29 -125
  100. package/src/actions/facets/actions.js +267 -73
  101. package/src/actions/facets/derive.js +99 -28
  102. package/src/actions/facets/guides.js +4 -5
  103. package/src/actions/facets/replay.js +4 -5
  104. package/src/actions/gradientPlots/components.js +15 -8
  105. package/src/actions/gradientPlots/create.js +4 -5
  106. package/src/actions/gradientPlots/edit.js +18 -9
  107. package/src/actions/gradientPlots/materialize.js +5 -3
  108. package/src/actions/gradientPlots/options.js +10 -2
  109. package/src/actions/gradientPlots/rebind.js +4 -5
  110. package/src/actions/guides/applicability.js +8 -2
  111. package/src/actions/guides/axes/axes.js +23 -4
  112. package/src/actions/guides/axes/axis.js +2 -2
  113. package/src/actions/guides/axes/edit.js +2 -2
  114. package/src/actions/guides/axes/labels.js +67 -21
  115. package/src/actions/guides/axes/lines.js +15 -9
  116. package/src/actions/guides/axes/parallel/lifecycle.js +13 -13
  117. package/src/actions/guides/axes/parallel/resolve.js +6 -2
  118. package/src/actions/guides/axes/parallel.js +5 -5
  119. package/src/actions/guides/axes/remove.js +4 -4
  120. package/src/actions/guides/axes/tickGroups.js +6 -5
  121. package/src/actions/guides/axes/ticks.js +19 -6
  122. package/src/actions/guides/axes/titles.js +21 -13
  123. package/src/actions/guides/grids/grid.js +18 -29
  124. package/src/actions/guides/grids/resolve.js +7 -2
  125. package/src/actions/guides/guides.js +20 -4
  126. package/src/actions/guides/legends/blocks.js +426 -0
  127. package/src/actions/guides/legends/categorical/actions.js +138 -52
  128. package/src/actions/guides/legends/categorical/components.js +55 -45
  129. package/src/actions/guides/legends/categorical/index.js +37 -33
  130. package/src/actions/guides/legends/categorical/layout.js +98 -16
  131. package/src/actions/guides/legends/categorical/options.js +2 -2
  132. package/src/actions/guides/legends/categorical/recipes.js +111 -20
  133. package/src/actions/guides/legends/categorical/resolve.js +12 -8
  134. package/src/actions/guides/legends/categorical/symbols.js +104 -52
  135. package/src/actions/guides/legends/continuous/common.js +76 -20
  136. package/src/actions/guides/legends/continuous/gradient.js +95 -158
  137. package/src/actions/guides/legends/continuous/index.js +2 -0
  138. package/src/actions/guides/legends/continuous/interval.js +21 -16
  139. package/src/actions/guides/legends/continuous/opacity.js +37 -83
  140. package/src/actions/guides/legends/continuous/stroke.js +225 -0
  141. package/src/actions/guides/legends/creation.js +14 -1
  142. package/src/actions/guides/legends/edit.js +159 -60
  143. package/src/actions/guides/legends/focused.js +5 -5
  144. package/src/actions/guides/legends/index.js +2 -0
  145. package/src/actions/guides/legends/lane.js +59 -24
  146. package/src/actions/guides/legends/lifecycle.js +19 -8
  147. package/src/actions/guides/legends/remove.js +17 -8
  148. package/src/actions/guides/legends/sampling.js +140 -0
  149. package/src/actions/guides/legends/size.js +100 -108
  150. package/src/actions/guides/legends/strokeWidth.js +38 -92
  151. package/src/actions/guides/legends/target.js +112 -1
  152. package/src/actions/guides/legends/transition.js +165 -16
  153. package/src/actions/guides/polar/axes/facade.js +8 -8
  154. package/src/actions/guides/polar/axes/labels.js +29 -10
  155. package/src/actions/guides/polar/axes/lines.js +19 -19
  156. package/src/actions/guides/polar/axes/shared.js +16 -0
  157. package/src/actions/guides/polar/axes/ticks.js +10 -16
  158. package/src/actions/guides/polar/axes/titles.js +6 -6
  159. package/src/actions/guides/polar/grids.js +12 -14
  160. package/src/actions/guides/polar/resolve.js +12 -8
  161. package/src/actions/index.js +16 -3
  162. package/src/actions/intervals/revision.js +126 -0
  163. package/src/actions/marks/arc/actions.js +80 -22
  164. package/src/actions/marks/area/actions.js +38 -13
  165. package/src/actions/marks/area/materialize.js +17 -1
  166. package/src/actions/marks/bar/create.js +12 -3
  167. package/src/actions/marks/bar/edit.js +21 -4
  168. package/src/actions/marks/bar/materialize.js +34 -40
  169. package/src/actions/marks/index.js +10 -1
  170. package/src/actions/marks/line/actions.js +40 -17
  171. package/src/actions/marks/line/materialize.js +29 -10
  172. package/src/actions/marks/point/create.js +9 -3
  173. package/src/actions/marks/point/edit.js +19 -7
  174. package/src/actions/marks/point/jitter.js +6 -8
  175. package/src/actions/marks/point/materialize.js +48 -22
  176. package/src/actions/marks/point/packing.js +6 -8
  177. package/src/actions/marks/rect/actions.js +36 -15
  178. package/src/actions/marks/references.js +602 -33
  179. package/src/actions/marks/remove.js +67 -41
  180. package/src/actions/marks/rule/actions.js +51 -14
  181. package/src/actions/marks/shared.js +1 -1
  182. package/src/actions/marks/text/actions.js +79 -14
  183. package/src/actions/marks/text/index.js +4 -0
  184. package/src/actions/marks/text/layout.js +157 -17
  185. package/src/actions/marks/text/removal.js +173 -0
  186. package/src/actions/marks/text/selection.js +72 -0
  187. package/src/actions/marks/tick/actions.js +25 -8
  188. package/src/actions/primitives/createGraphics.js +5 -4
  189. package/src/actions/primitives/editGraphics.js +31 -4
  190. package/src/actions/primitives/graphicProperties.js +6 -0
  191. package/src/actions/primitives/semantic.js +11 -3
  192. package/src/actions/primitives/semanticAction.js +90 -14
  193. package/src/actions/primitives/semanticValidation/dataset.js +2 -4
  194. package/src/actions/primitives/semanticValidation/guide.js +1 -1
  195. package/src/actions/primitives/semanticValidation/index.js +9 -1
  196. package/src/actions/primitives/semanticValidation/layer.js +5 -0
  197. package/src/actions/primitives/semanticValidation/scale.js +28 -7
  198. package/src/actions/regression/components.js +36 -25
  199. package/src/actions/regression/create.js +13 -6
  200. package/src/actions/regression/edit.js +24 -11
  201. package/src/actions/resources/index.js +7 -0
  202. package/src/actions/resources/remove.js +173 -0
  203. package/src/actions/scales/channels.js +212 -0
  204. package/src/actions/scales/consumers/common.js +1 -1
  205. package/src/actions/scales/consumers/families.js +3 -2
  206. package/src/actions/scales/consumers/index.js +19 -2
  207. package/src/actions/scales/consumers/seriesLayout.js +28 -14
  208. package/src/actions/scales/create.js +55 -23
  209. package/src/actions/scales/definitions.js +94 -40
  210. package/src/actions/scales/edit.js +67 -12
  211. package/src/actions/scales/editPolicy.js +81 -11
  212. package/src/actions/scales/index.js +6 -0
  213. package/src/actions/scales/materialize.js +5 -4
  214. package/src/actions/scales/offset.js +48 -0
  215. package/src/actions/scales/parallel.js +71 -0
  216. package/src/actions/scales/preview.js +111 -10
  217. package/src/actions/scales/quantitativeColor.js +4 -5
  218. package/src/actions/selection/actions.js +179 -66
  219. package/src/actions/selection/index.js +3 -0
  220. package/src/actions/textMetrics/index.js +56 -0
  221. package/src/actions/theme/actions.js +70 -15
  222. package/src/actions/theme/composition.js +238 -0
  223. package/src/actions/theme/index.js +9 -2
  224. package/src/actions/theme/reconcile.js +313 -121
  225. package/src/actions/theme/state.js +160 -0
  226. package/src/actions/titles/actions.js +8 -8
  227. package/src/actions/titles/resolve.js +3 -3
  228. package/src/actions/violinPlots/create.js +6 -3
  229. package/src/actions/violinPlots/edit.js +2 -1
  230. package/src/core/action.js +117 -35
  231. package/src/core/compositionState.js +6 -1
  232. package/src/core/diagnostics.js +16 -0
  233. package/src/core/extensionRegistry.js +27 -0
  234. package/src/core/font.js +18 -0
  235. package/src/core/identifiers.js +5 -4
  236. package/src/core/immutable.js +10 -3
  237. package/src/core/optionRequirements.js +8 -0
  238. package/src/core/programState.js +21 -1
  239. package/src/core/resourceReferences.js +341 -0
  240. package/src/core/textMetricProfile.js +28 -0
  241. package/src/core/textMetrics.js +24 -3
  242. package/src/core/validation.js +22 -10
  243. package/src/core/vocabulary.js +16 -3
  244. package/src/diagnostics.js +1 -0
  245. package/src/grammar/bars/aggregate.js +4 -1
  246. package/src/grammar/bars/geometry.js +44 -0
  247. package/src/grammar/bin.js +54 -9
  248. package/src/grammar/complete.js +279 -0
  249. package/src/grammar/computed.js +265 -64
  250. package/src/grammar/coordinates.js +37 -0
  251. package/src/grammar/density.js +239 -37
  252. package/src/grammar/displayLabels.js +57 -0
  253. package/src/grammar/facets/dependencies.js +133 -1
  254. package/src/grammar/facets/guides.js +3 -0
  255. package/src/grammar/facets/index.js +7 -47
  256. package/src/grammar/facets/scales.js +15 -18
  257. package/src/grammar/impute.js +341 -0
  258. package/src/grammar/markLabelSelection.js +57 -0
  259. package/src/grammar/markLabels.js +18 -1
  260. package/src/grammar/normalize.js +366 -0
  261. package/src/grammar/pathSeries.js +26 -8
  262. package/src/grammar/pointShapes.js +13 -4
  263. package/src/grammar/polar.js +90 -8
  264. package/src/grammar/regression/index.js +1 -0
  265. package/src/grammar/regression/parameters.js +23 -0
  266. package/src/grammar/roundedRect.js +180 -0
  267. package/src/grammar/rules.js +1 -0
  268. package/src/grammar/scales/colorConsumers.js +20 -1
  269. package/src/grammar/scales/continuous.js +2 -2
  270. package/src/grammar/scales/definition.js +27 -4
  271. package/src/grammar/scales/index.js +1 -0
  272. package/src/grammar/scales/ordinal.js +12 -3
  273. package/src/grammar/scales/policies.js +2 -2
  274. package/src/grammar/scales/size.js +456 -0
  275. package/src/grammar/scales/types.js +8 -0
  276. package/src/grammar/schemas/concreteGraphic.js +14 -2
  277. package/src/grammar/schemas/graphic.js +15 -0
  278. package/src/grammar/schemas/graphicBounds.js +190 -41
  279. package/src/grammar/schemas/semanticPath.js +7 -2
  280. package/src/grammar/statisticalReference.js +103 -0
  281. package/src/grammar/strokeStyle.js +77 -0
  282. package/src/grammar/summary.js +78 -16
  283. package/src/grammar/timeUnit.js +216 -5
  284. package/src/grammar/transformTopology.js +4 -0
  285. package/src/grammar/transforms.js +394 -28
  286. package/src/grammar/weightedStatistics.js +374 -0
  287. package/src/grammar/window.js +221 -16
  288. package/src/layout/aspect.js +80 -0
  289. package/src/layout/facets.js +59 -5
  290. package/src/layout/labels.js +351 -7
  291. package/src/layout/legend.js +4 -4
  292. package/src/layout/legendItems.js +6 -6
  293. package/src/layout/text.js +10 -9
  294. package/src/layout/title.js +9 -9
  295. package/src/materialization/bars/aggregate.js +25 -2
  296. package/src/materialization/bars/histogram.js +84 -24
  297. package/src/materialization/bars/ranged.js +19 -3
  298. package/src/materialization/bars/resolve.js +7 -4
  299. package/src/materialization/composition.js +3 -1
  300. package/src/materialization/coordinateBounds.js +204 -0
  301. package/src/materialization/dependencies.js +36 -0
  302. package/src/materialization/facetGuides/legacyCategorical.js +3 -0
  303. package/src/materialization/facetGuides/placement.js +9 -3
  304. package/src/materialization/facetGuides/preparation.js +13 -8
  305. package/src/materialization/facetHeaders.js +347 -0
  306. package/src/materialization/facets.js +15 -65
  307. package/src/materialization/guides/layout.js +3 -3
  308. package/src/materialization/guides/resources.js +26 -0
  309. package/src/materialization/legends.js +1 -1
  310. package/src/materialization/marks/index.js +11 -5
  311. package/src/materialization/marks/policies.js +2 -1
  312. package/src/materialization/rect.js +25 -12
  313. package/src/materialization/rectConfig.js +5 -1
  314. package/src/materialization/scaleGuideDependencies.js +10 -0
  315. package/src/materialization/scales/map.js +5 -3
  316. package/src/materialization/scales/policies/binnedPosition.js +2 -2
  317. package/src/materialization/scales/policies/offset.js +50 -8
  318. package/src/materialization/scales/policies/series.js +4 -1
  319. package/src/materialization/scales/resolve.js +22 -6
  320. package/src/materialization/selection/items/arc.js +28 -4
  321. package/src/materialization/selection/items/bar.js +30 -3
  322. package/src/materialization/selection/items/common.js +20 -5
  323. package/src/materialization/selection/items/rect.js +28 -4
  324. package/src/materialization/selection/path.js +1 -1
  325. package/src/materialization/selection/point.js +3 -1
  326. package/src/materialization/text.js +265 -14
  327. package/src/materialization/typography.js +31 -0
  328. package/src/mcp/cli.js +5 -3
  329. package/src/persistence/codec.js +65 -0
  330. package/src/persistence/validation.js +185 -0
  331. package/src/persistence.js +74 -0
  332. package/src/renderers/canvas/circle.js +2 -3
  333. package/src/renderers/canvas/index.js +5 -4
  334. package/src/renderers/canvas/line.js +2 -3
  335. package/src/renderers/canvas/native.js +4 -4
  336. package/src/renderers/canvas/path.js +2 -3
  337. package/src/renderers/canvas/rect.js +2 -3
  338. package/src/renderers/canvas/stroke.js +11 -0
  339. package/src/renderers/nativeBackend.js +10 -0
  340. package/src/renderers/options.js +13 -0
  341. package/src/renderers/pdf.js +25 -54
  342. package/src/renderers/png.js +22 -17
  343. package/src/renderers/svg.js +29 -14
  344. package/src/renderers/text.js +1 -11
  345. package/src/selectors/coordinates.js +3 -1
  346. package/src/selectors/datasets.js +38 -5
  347. package/src/selectors/layers.js +10 -4
  348. package/src/selectors/markOwners.js +46 -0
  349. package/src/selectors/scales.js +6 -4
  350. package/src/theme/defaults.js +103 -1
  351. package/src/version.js +2 -0
  352. package/types/accessibility.d.ts +37 -0
  353. package/types/basic.d.ts +10 -2
  354. package/types/diagnostics.d.ts +15 -0
  355. package/types/index.d.ts +90 -0
  356. package/types/pdf.d.ts +9 -0
  357. package/types/persistence.d.ts +7 -0
  358. package/types/png.d.ts +9 -0
  359. package/types/program.d.ts +944 -118
package/CHANGELOG.md CHANGED
@@ -4,6 +4,152 @@ All notable changes to `ggaction` are recorded in this file.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## [0.0.16] - 2026-09-14
8
+
9
+ ### Added
10
+
11
+ - Added `reviseData` for immutable original-data revisions that update dependent
12
+ transforms, chart owners, scales, guides, labels, selections, and retained facets.
13
+ - Added `applyTextMetrics` and `removeTextMetrics` for host-measured text layout
14
+ with immutable exact-font profiles, deterministic fallback, composition
15
+ propagation, and wrapped typography rematerialization.
16
+ - Added browser-safe `ggaction/persistence` with versioned editable-program and
17
+ graphic-only snapshots, tagged value preservation, and strict restoration.
18
+ - Added browser-safe `ggaction/accessibility` with immutable final visual data,
19
+ component roles, aggregate/bin/interval values, series, and composition hierarchy.
20
+ - Added `ggaction/diagnostics` to read structured error codes and resource details
21
+ while preserving the original Error, TypeError, or RangeError identity.
22
+ - Added `renderToPNGBuffer` and `renderToPDFBuffer` for Node memory output.
23
+ PNG encoding is asynchronous; Canvas drawing remains synchronous.
24
+ - Added `release:prepare` for reviewable version, changelog, release-contract,
25
+ provenance, and generated-documentation updates without publishing side effects.
26
+ - Added reproducible runtime benchmarks, exhaustive direct-action negative-input
27
+ contracts, semantic authoring evaluations, and cross-platform/browser checks.
28
+
29
+ ### Changed
30
+
31
+ - **Installation:** Node rendering and MCP dependencies are now optional peers.
32
+ Canvas/SVG users can install only `ggaction`. Node PNG/PDF users must also install
33
+ `@napi-rs/canvas`; MCP users must also install `@modelcontextprotocol/sdk`.
34
+ Missing backends report the required install command and never auto-install.
35
+ - MCP task packets now use schema version 5. Required options are separate from
36
+ example/configured options, exact calls preserve explicit user choices, and
37
+ unresolved request fragments remain visible. Consumers must check packet versions.
38
+ - Reused owned immutable subtrees, avoided unrelated theme traversal, shared
39
+ persistent trace tails, and cached immutable SVG resource hashes. Mutable
40
+ renderer inputs still recompute their hashes.
41
+ - Reduced Basic browser bundle size through built-in factory tree shaking and
42
+ shared validation/materialization code. Existing browser gzip limits remain.
43
+ - Release verification now distributes one canonical candidate artifact across
44
+ independent source, coverage, package, documentation, platform, browser, and
45
+ weighted realistic-test jobs, then requires a strict successful aggregate.
46
+ - Added a strict realistic-test aggregate check and bounded failure evidence for
47
+ test logs, render differences, and browser screenshots. Verification errors
48
+ retain their original failing status.
49
+ - Consolidated architecture prose around ownership and state flow, with exact
50
+ action behavior linked to current contracts and shared metadata owners.
51
+
52
+ ### Fixed
53
+
54
+ - Rejected callable, mutable class-instance, cyclic, and sparse source inputs
55
+ before they could escape immutable ownership or fail during materialization.
56
+ TypeScript source-row declarations now match the runtime data boundary.
57
+ - Rejected unknown options consistently in extension primitives and renderers,
58
+ including PNG, and validated axis coordinate/channel assertions before changes.
59
+ - Corrected padding units for focused scale editors using one canonical registry.
60
+ - Corrected MCP required-option inference, explicit style/scale choices, derived
61
+ owner references, and false-completion reporting for partially understood tasks.
62
+ - Preserved nested facet trace closure and prototype-named keys during snapshot
63
+ round trips, and distinguished live dependencies from reserved optional IDs.
64
+ - Distinguished data and mark identity when revising statistical-reference inputs.
65
+ Inferred grids now follow explicit tick changes without disrupting orientation
66
+ changes that must rematerialize guides in dependency order.
67
+ - Applied the same interval-statistics merge during simultaneous role edits,
68
+ clearing inherited confidence-interval parameters when changing extent.
69
+ - Reused the exact release artifact in installed-package consumers instead of
70
+ silently repacking it, and made development npm/TypeScript invocation portable
71
+ across supported operating systems.
72
+ - Bounded long CSV description memory in realistic test fixtures and synchronized
73
+ their direct action coverage and coordinate options with current contracts.
74
+
75
+ ## [0.0.15] - 2026-09-14
76
+
77
+ ### Added
78
+
79
+ - Added independent field-driven stroke color for Point, Line, Area, Bar, Rect,
80
+ Arc, Rule, and Tick marks, including categorical and continuous scales,
81
+ focused scale editing, legends, selections, facets, and renderer parity.
82
+ - Added logarithmic, square-root, power, quantize, quantile, and threshold
83
+ point-size scales with equal-area geometry, focused scale editing, complete
84
+ interval legends, source replay, strict types, and installed-package support.
85
+
86
+ - Added normalization and missing-data workflows with `createNormalizedData`,
87
+ `createCompleteData`, and `createImputedData`. Computed expressions now support
88
+ typed scalar/null results, comparisons, conditions, and short-circuit logic;
89
+ calendar buckets and windows have explicit time and ordering policies.
90
+ - Added immutable derived revision editing: `editDerivedData`, `editComputedData`,
91
+ `editFilteredData`, `editFoldData`, `editSummaryData`, `editBinData`,
92
+ `editTimeUnitData`, `editWindowData`, `editDensityData`, `editStackData`,
93
+ `editRegressionData`, `editIntervalData`, `editECDFData`, `editNormalizedData`,
94
+ `editCompleteData`, and `editImputedData`. An existing descendant rejects an
95
+ edit by default; `dependents: "recompute"` rebuilds the full affected closure.
96
+ - Added focused scale editing with `editXScale`, `editYScale`, `editThetaScale`,
97
+ `editRScale`, `editColorScale`, `editStrokeScale`, `editSizeScale`,
98
+ `editOpacityScale`, `editShapeScale`, `editStrokeWidthScale`,
99
+ `editStrokeDashScale`, `editXOffsetScale`, `editYOffsetScale`, and
100
+ `editParallelScale`. These select the channel owner and replay its consumers.
101
+ - Added `encodeChannels` for atomic multi-channel reassignment; `editCoordinate`
102
+ for Cartesian aspect and Polar frame changes; and `editLegendBlock` for one
103
+ identified block of a composite legend.
104
+ - Added `editMarkLabelSelection`, `editMarkLabelPlacement`, and `removeMarkLabels`.
105
+ Label selection now works on final aggregated items; semantic placement follows
106
+ directed boundaries through source, scale, and layout changes.
107
+ - Added explicit safe removal with `removeData`, `removeScale`, and
108
+ `removeCoordinate`. A live dependency produces an ownership-path error; remove
109
+ or rebind consumers before removing the resource.
110
+ - Added weighted summaries, bins, histogram/KDE authoring and revisions; dynamic
111
+ statistical reference lines/bands; exact sampled legend values; typed display
112
+ label maps; facet-header role/side/alignment controls; custom theme tokens;
113
+ detailed stroke styles, rounded rectangles, and expanded Polar/Parallel facets.
114
+
115
+ ### Changed
116
+
117
+ - Clarified the action/program grammar, relative action hierarchy, and
118
+ decision-level atomicity. Catalog role tags are distinguished from action
119
+ delegation and package exposure.
120
+ - Resource removal actions now record their semantic deletions as `editSemantic`
121
+ children. The full extension primitive accepts whole unused source datasets
122
+ and coordinates while retaining dependency guards and immutable snapshots.
123
+ - Point-size ranges represent area across continuous and discrete families.
124
+ Entering a discrete size family requires a destination domain and range;
125
+ repeated field assignments preserve compatible scale settings.
126
+ - Axis, legend, and facet display labels preserve raw category identity. Mapping
127
+ `"KR"` to `"South Korea"` changes visible text while grouping, selection, and
128
+ domain lookup still use `"KR"`. Numeric and UTC formats must match field type.
129
+ - Custom themes supply defaults while explicit mark styles retain precedence.
130
+ Removing a theme restores baseline defaults and retains explicit overrides.
131
+ - Complete guides can be created progressively without duplicating existing
132
+ compatible components. Polar/Parallel repetition retains source recipes and
133
+ rejects unsupported role substitutions explicitly.
134
+ - Documentation now distinguishes released API snapshots from later development,
135
+ provides an exact address and declaration for every action, and executes every
136
+ maintained tutorial and recipe against the packaged module. See
137
+ [migration notes](https://ggaction.github.io/ggaction/version/#migration-from-v0013).
138
+
139
+ ### Fixed
140
+
141
+ - Prevented typing immediately after a failed search-index prefetch from sending
142
+ an implicit retry. Each explicit retry now sends one request even when the
143
+ first failure arrives before the input event.
144
+ - Corrected the README's canvas margins for its complete 406-row example and
145
+ documented regression defaults beside the example. The hierarchy tutorial now
146
+ refines its high-level chart and demonstrates a subsequent style revision.
147
+ - Corrected default dumbbell axis titles, direct Rose radius refinement, and stale
148
+ current-guide pointers after removal.
149
+ - Corrected executable examples, API defaults and compatibility descriptions,
150
+ missing gallery/tutorial entries, exact-action search, initial ArrowUp selection,
151
+ filter/TOC synchronization, search retries, and narrow-screen type references.
152
+
7
153
  ## [0.0.13] - 2026-09-07
8
154
 
9
155
  ### Added
package/README.md CHANGED
@@ -16,15 +16,14 @@ Every frame is rendered from an immutable `ChartProgram`. The final R² label is
16
16
 
17
17
  ## A grammar of graphical action
18
18
 
19
- Actions are verbs:
19
+ An action expresses a design operation on a chart element. In
20
+ `editLineMark({ strokeWidth: 4 })`, `edit` is the operation, `LineMark` names
21
+ the target concept, and the option supplies the design choice.
20
22
 
21
- `create · transform · encode · edit · select · compose`
22
-
23
- Chart resources are nouns:
24
-
25
- `data · marks · scales · coordinates · guides`
26
-
27
- A `ChartProgram` is the immutable sentence they produce.
23
+ The grammar has two units: **graphical actions** and **chart programs**.
24
+ A program composes action calls in authoring order and retains their resulting
25
+ immutable state. Authors read a linear sequence of decisions; an action may
26
+ delegate to smaller actions recorded in its nested execution trace.
28
27
 
29
28
  The following fragment assumes `cars` is an array of row objects:
30
29
 
@@ -32,7 +31,11 @@ The following fragment assumes `cars` is an array of row objects:
32
31
  import { chart } from "ggaction";
33
32
 
34
33
  const program = chart()
35
- .createCanvas()
34
+ .createCanvas({
35
+ width: 760,
36
+ height: 480,
37
+ margin: { top: 40, right: 190, bottom: 70, left: 80 }
38
+ })
36
39
  .createData({ values: cars })
37
40
  .createScatterPlot({
38
41
  id: "points",
@@ -45,6 +48,12 @@ const program = chart()
45
48
  .createGuides();
46
49
  ```
47
50
 
51
+ Here `createRegression()` infers groups from the point layer, uses a linear
52
+ model, and includes a 95% mean-response interval band. The right margin reserves
53
+ space for the resulting legend. The [regression recipe](https://ggaction.github.io/ggaction/recipes/regression-scatterplot/)
54
+ provides data and rendering setup; [regression options](https://ggaction.github.io/ggaction/api/regression/)
55
+ control grouping, model, interval, and whether a band is drawn.
56
+
48
57
  ## Why actions?
49
58
 
50
59
  - **Progressive** — build and revise a chart one meaningful operation at a time.
@@ -80,6 +89,10 @@ Install the current public release:
80
89
  npm install ggaction
81
90
  ```
82
91
 
92
+ For Node PNG/PDF output, also install `@napi-rs/canvas`. For the MCP server,
93
+ also install `@modelcontextprotocol/sdk`. These are optional peer dependencies;
94
+ browser Canvas/SVG users do not need either package.
95
+
83
96
  Add the Canvas element that the rendering code targets. Its accessible name and
84
97
  fallback text summarize the chart for contexts where Canvas pixels are not
85
98
  available:
@@ -157,7 +170,7 @@ automatic undo stack; the application chooses which to retain or render.
157
170
 
158
171
  Use `createLinePlot`, `createBarPlot`, `createHistogram`, and `createHeatmap` for
159
172
  the other basic Cartesian charts. The `ggaction/basic` entry keeps this common
160
- creation path at or below the current 153,000-byte gzip regression ceiling while
173
+ creation path at or below the current 175,000-byte gzip regression ceiling while
161
174
  each facade still records its mark, encoding, and guide actions as trace
162
175
  children. Import from
163
176
  `ggaction` when you need editing, selection, composition, alternative
@@ -202,11 +215,14 @@ The package is ESM-only and requires Node.js 20 or later.
202
215
  | `ggaction/extension` | Author and register wrapped actions with public low-level primitives |
203
216
  | `ggaction/png` | Render a completed program to a PNG file in Node.js |
204
217
  | `ggaction/pdf` | Render a completed program to a single-page vector PDF file in Node.js |
218
+ | `ggaction/persistence` | Save and restore editable programs or graphic snapshots in Browser or Node |
219
+ | `ggaction/accessibility` | Export final visual data for host-provided accessible tables and descriptions |
220
+ | `ggaction/diagnostics` | Read structured error codes and resource details in Browser or Node |
205
221
  | `ggaction/svg` | Serialize a completed program to browser-safe SVG |
206
222
  | `ggaction-mcp` | Run the local read-only MCP authoring server over stdio in Node.js |
207
223
 
208
224
  All module entries include TypeScript declarations. The default, basic,
209
- extension, and SVG entries are browser-safe; the PNG and PDF adapters are
225
+ extension, diagnostics, accessibility, and SVG entries are browser-safe; the PNG and PDF adapters are
210
226
  Node-only.
211
227
 
212
228
  The installed package also includes the Node-only `ggaction-mcp` executable. It
@@ -231,7 +247,7 @@ the extra discussion required before public API or architecture changes.
231
247
 
232
248
  ## Status and development
233
249
 
234
- > **Status:** `0.0.13` is the current experimental public release. APIs may change before `1.0.0`; changes are recorded in the [changelog](./CHANGELOG.md).
250
+ > **Status:** `0.0.16` is the current experimental public release. APIs may change before `1.0.0`; changes are recorded in the [changelog](./CHANGELOG.md).
235
251
 
236
252
  ```bash
237
253
  npm install
@@ -244,3 +260,16 @@ npm run test:docs
244
260
  ## Related Links
245
261
 
246
262
  - Action-trace demo: [Link](https://ggactionbot.github.io/action-trace-demo/)
263
+
264
+ ### Prepare a release
265
+
266
+ Record changes under `Unreleased` in `CHANGELOG.md` and commit the reviewed work.
267
+ Run `npm run release:prepare -- 0.0.16 --dry-run` to preview version updates.
268
+ Omit `--dry-run` to update versions, promote notes, and generate the release
269
+ contract, documentation, and local notes. Review the Git diff. After committing
270
+ runtime changes, rerun the command to refresh source provenance; existing notes
271
+ and their date are preserved.
272
+
273
+ Preparation does not commit, push, tag, publish, or deploy. Integration and required
274
+ PR checks precede an annotated tag. The protected workflow verifies and publishes
275
+ one candidate from that tag. Generation failures leave an unfinished diff to review.