release: version packages (lockstep) - #249
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/dev
branch
13 times, most recently
from
July 30, 2026 05:32
80da7f6 to
fe5719d
Compare
github-actions
Bot
force-pushed
the
changeset-release/dev
branch
from
July 31, 2026 20:47
fe5719d to
9865223
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to dev, this PR will be updated.
Releases
@chestnutlabs/gcode-colors@0.4.0
Minor Changes
#254
5f59b77Thanks @sobechestnut-dev! - feat: non-extrusion color modes — color-by-power + cut-vs-rapid (DD-012 phase 4, #189)Two new
ColorModes consuming the #189 channels (DD-012 D7):power— ramps each segment's modaltoolPower(laser power / spindle RPM, theSvalue) ontoa color ramp, the CNC/laser counterpart to color-by-speed. Auto-ranged (
toolPowerRange) or explicit;NaN(tool off) or a file parsed without thetoolPowerchannel → fallback, never a fabricated color.Capability-gated on
toolPower(the Three renderer'sisColorModeAvailablegates it).moveKind— cut-vs-rapid: productive moves (ExtrudeorCut) vs rapids (Travel) — the"where the tool is actually working" view. Reads the always-present
kindchannel, so it is alwaysavailable.
Both flow through
createSegmentColorer, so the Three and Canvas-2D renderers get them for free. FDMcoloring is unchanged.
Patch Changes
1029580,8fec7c3]:@chestnutlabs/gcode-dialects@0.4.0
Minor Changes
#258
3f06e5bThanks @sobechestnut-dev! - feat: evidence-based non-extrusion detection — recognize header-less real CNC/laser files (#189)The phase-3 CNC/laser detectors were tuned on synthetic fixtures and matched none of the real
public samples (LaserGRBL, LinuxCNC, GRBL CAM output) — real controller output usually has no
generator header and writes commands mid-line and concatenated (
s3400 m3,g1z-.1).Detection is now evidence-scored, not banner-only:
scoreEvidenceextractor strips comments (so(M3)/; LinuxCNCin a comment can'tcreate a false marker) and matches commands as words anywhere on a line.
$32=1, or the header-less form: a tool-on command (M3/M4) withSpower and no Z-plunge (lasers are planar).M3spindle that plunges into negative Z with no extrusion (a millingfingerprint that separates it from a planar laser); banner optional.
o100 sub).Eon a motion line, so LinuxCNCM67 E0 Q…analog laser poweris no longer mistaken for FDM.
Real-file result: 0/6 → 3/6 detected, each with the correct machine class (laser→laser, mill→mill,
LinuxCNC→linuxcnc); the misses are honest — files with a commented-out or absent spindle carry no
tool-state to infer. Still experimental tier (claims reported
inferred) — detection working onreal files is one input; semantic ground truth (does our
Cut= actual cutting,Sscale) still wantsa real machine or a trusted reference.
#253
13fd5c6Thanks @sobechestnut-dev! - feat: non-extrusion dialect families + validation tiers (DD-012 phase 3, #189)Adds controller detection and the validation-tier honesty mechanism for CNC/laser toolpaths:
@chestnutlabs/gcode-dialects): GRBL laser (LightBurn /$32laser mode /M4+S),GRBL mill and LinuxCNC (
M3spindle,%/banner envelopes). Registered in the batteries worker.cnc.controller,cnc.machineClass,cnc.toolPowerLabel) and avalidation tier (
cnc.validationTier). Per DD-012 D6: an experimental dialect reports itsnon-extrusion claims (
cutMoves/toolPower/cannedCycles) asinferred(neverknown),with a
cnc-dialect-experimentaldisclosure — and only for claims the file actually made (an unusedfeature is never fabricated).
experimental(synthetic fixtures only). A singletier: 'validated'flip per controller promotes its claims to
knownonce confirmed on real hardware (DD-012 §8/§15).Geometry is untouched (dialects only annotate/label). FDM detection is unaffected — CNC dialects do
not match FDM output.
#262
3e244aeThanks @sobechestnut-dev! - feat(dialects): promote grbl-laser experimental → validated on hardware evidence (#189)First hardware-validation pass (DD-012 D8): a real GRBL/LightBurn diode-laser run — 6161 moves incl.
fill + offset-fill, full 0–1000
Spower ramp — confirmed machine-class detection, the Cut-vs-rapidsplit, and the
toolPowerchannel against the physical cut (all claims ✓).grbl-laseris flippedexperimental → validated: for laser files itscutMoves/toolPowerclaims now reportknowninstead of
inferred, and thecnc-dialect-experimentalwarning is no longer emitted.Scope is per-controller:
grbl-millandlinuxcncremainexperimental(claims stayinferred)until a run on real CNC hardware. Evidence recorded in
docs/design/DD-012-hardware-validation-log.md.Patch Changes
1029580,8fec7c3]:@chestnutlabs/gcode-parser@0.4.0
Minor Changes
#252
b2053beThanks @sobechestnut-dev! - feat: canned drilling cycle expansion — G81/G82/G83 (DD-012 phase 2, #189)CNC canned drilling cycles previously produced zero geometry — holes vanished. They now expand to
explicit sub-moves so the drilling is real, classified toolpath:
depth (
Cut), rapid retract.Q, rapid-retract to R between pecks, untilreaching depth; each down-feed is a
Cut.G0–G3motion also cancels.X/Yline drills another hole (retaining Z/R/Q andthe initial plane) — the common CNC hole-pattern form.
Travel, plunges areCut; new capabilitycannedCycles(knownonce a cycle isseen, else
unavailable).FDM output is unchanged (no canned cycles in FDM); the native-golden corpus gains only the additive
cannedCyclescapability, with no geometry change.#253
13fd5c6Thanks @sobechestnut-dev! - feat: non-extrusion dialect families + validation tiers (DD-012 phase 3, #189)Adds controller detection and the validation-tier honesty mechanism for CNC/laser toolpaths:
@chestnutlabs/gcode-dialects): GRBL laser (LightBurn /$32laser mode /M4+S),GRBL mill and LinuxCNC (
M3spindle,%/banner envelopes). Registered in the batteries worker.cnc.controller,cnc.machineClass,cnc.toolPowerLabel) and avalidation tier (
cnc.validationTier). Per DD-012 D6: an experimental dialect reports itsnon-extrusion claims (
cutMoves/toolPower/cannedCycles) asinferred(neverknown),with a
cnc-dialect-experimentaldisclosure — and only for claims the file actually made (an unusedfeature is never fabricated).
experimental(synthetic fixtures only). A singletier: 'validated'flip per controller promotes its claims to
knownonce confirmed on real hardware (DD-012 §8/§15).Geometry is untouched (dialects only annotate/label). FDM detection is unaffected — CNC dialects do
not match FDM output.
#248
1029580Thanks @sobechestnut-dev! - feat: non-extrusionCutmove classification + tool-state modal (DD-012 phase 1, #189)Non-extrusion toolpaths (CNC / laser / plotter) no longer collapse their productive moves into
Travel. The parser now tracks a tool-engaged modal state —M3/M4(spindle/laser on, incl. theM03/M04leading-zero form) engage it,M5disengages — and classifies a move with no extrusionEwhile the tool is engaged as the newMoveKind.Cutbit (a CNC/laser/plotter counterpart toExtrude, composing withArcSegmentlike the other kinds).MoveKind.Cut = 1 << 7(@chestnutlabs/toolpath-core).cutMoves:knownonce a tool-state modal is seen (a CNC/laser/plotter file),unavailablefor FDM.M3/M4, soCutis never set and every movestays
Extrude/Travelexactly as before (verified against the native-golden corpus; the CNCfixtures
demo-easel/demo-mach3are documented intentional adapter-divergences).Modal tool-state value channels (laser power / spindle RPM via
S), canned-cycle expansion, anddialect families follow in later DD-012 phases.
#251
11f317dThanks @sobechestnut-dev! - feat: modal motion continuation — bare coordinate lines repeat the last G0–G3 (DD-012 phase 2, #189)CNC/LinuxCNC-style G-code frequently omits the
Gword on repeated moves (G1 X0 Y0then bareX10 Y0/X20 Y0). The parser previously dropped those lines entirely — a three-move pathproduced a single segment. It now tracks the active
G0–G3motion mode and treats a line whoseleading word is a coordinate axis (
X/Y/Z, with noG/M/Tcommand) as a continuation ofthat mode, so the full toolpath is emitted and classified/colored consistently (incl. inline
Sfor
toolPower).FDM output is byte-identical — slicers always emit the
Gword, so the continuation path nevertriggers (the native-golden corpus is unchanged). This unblocks canned-cycle repeat (next phase).
#250
8fec7c3Thanks @sobechestnut-dev! - feat: opt-in modal tool-power channel (DD-012 phase 1 — theModalChannelmechanism, #189)Adds the shared, opt-in
ModalChannelmechanism DD-012 D3 is built around, and its first channel:toolPower— the modal spindle/laserSvalue while a tool is engaged.ParseOptions.modalChannels?: readonly string[]— request per-segment modal channels by id.Supported id:
'toolPower'. Unknown ids are ignored with amodal-channel-unsupportedwarning.ToolpathSegments.modal?: Readonly<Record<string, Float32Array>>— one Float32 column per requestedchannel, present only when requested. An unset value is
NaN(an honest "no value here"), nevera fabricated
0.toolPoweris the modalS(set onM3/M4and inline on GRBL-laser motionlines) while engaged,
NaNwhen the tool is off (M5).toolPower: surfaced only when the channel is requested —knownonce atool-state modal is seen, else
unavailable.modalChannels⇒ nomodalon the IR, no extra columns, FDMoutput unchanged. The budget-aware SoA writer (DD-003) grows the opt-in columns in lockstep and
accounts their bytes.
Presentation (Watts vs RPM) is a dialect label, not a separate channel (DD-012 D4); #180's
fan/temp/accel color channels reuse this same mechanism in a later phase.
#256
b84bea9Thanks @sobechestnut-dev! - feat: lexer handles multi-command lines, N-word line numbers, and bare S/F (#189)Real CNC/laser G-code (GRBL, LinuxCNC, TinyG, Mach3, Fanuc) is written very differently from FDM
slicer output, and the inherited first-word lexer silently dropped most of it. The lexer now:
G20 G17 G90,G91 G81 …,S3400 M3now all apply. This was the biggest gap:M3spindle-on andG81canned cycles werebeing dropped as params, so mills showed no
Cutmoves and drilled holes vanished.N-word line numbers (N10 G1 X…) — Fanuc/Mach/TinyG number every line, whichpreviously reduced whole files to zero geometry.
S/Flines (standaloneS1000/F600) into modal power/feed — common inGRBL-laser output.
EXCLUDE_OBJECT … POLYGON=…): acommand/param is only taken when a real number follows the letter, so
TinM486 T<count>/M104 T<tool>stays a parameter (not a tool select), and theGinPOLYGONnever becomes a move.Validated against real public sample files: a LinuxCNC arc-spiral went from 16 → 5,506 parsed
segments, a TinyG program from 0 → 344. FDM output is byte-identical — slicers emit one clean
command per line, so the multi-command path never runs for them (the real-G-code native-golden corpus
is unchanged except for fewer spurious
unsupported-commandwarnings;demo-mach3and one adversarialbinary fixture are documented intentional divergences).
Patch Changes
#260
879b60aThanks @sobechestnut-dev! - fix: G0 rapids classify as Travel, not Cut, even while the tool is engaged (#189)The non-extrusion
Cut/Travelclassifier keyed only on tool-state (M3/M4latched), so on arouter — where the spindle stays on across rapids — every
G0reposition was counted as a cuttingmove. DD-012 D2 §4.2 already specifies that rapids stay
Travel; this brings the implementation inline: only a feed move (
G1/G2/G3) with the tool engaged and noEdelta isCut; aG0rapid is
Travelregardless of tool state (a GRBL-laser also gates the beam off duringG0).Surfaced by the CNC/laser validation harness on real files — e.g. the
easelrouter fixture wentfrom 742 cut / 0 rapids to a correct 737 cut / 5 rapids (its 5
G0moves). Geometry is unchanged(only the
kindcolumn shifts); FDM output is byte-identical sinceCutis never evaluated there.Updated dependencies [
3f06e5b,13fd5c6,1029580,8fec7c3,3e244ae]:@chestnutlabs/gcode-renderer-three@0.4.0
Minor Changes
#254
5f59b77Thanks @sobechestnut-dev! - feat: non-extrusion color modes — color-by-power + cut-vs-rapid (DD-012 phase 4, #189)Two new
ColorModes consuming the #189 channels (DD-012 D7):power— ramps each segment's modaltoolPower(laser power / spindle RPM, theSvalue) ontoa color ramp, the CNC/laser counterpart to color-by-speed. Auto-ranged (
toolPowerRange) or explicit;NaN(tool off) or a file parsed without thetoolPowerchannel → fallback, never a fabricated color.Capability-gated on
toolPower(the Three renderer'sisColorModeAvailablegates it).moveKind— cut-vs-rapid: productive moves (ExtrudeorCut) vs rapids (Travel) — the"where the tool is actually working" view. Reads the always-present
kindchannel, so it is alwaysavailable.
Both flow through
createSegmentColorer, so the Three and Canvas-2D renderers get them for free. FDMcoloring is unchanged.
Patch Changes
5f59b77,1029580,8fec7c3]:@chestnutlabs/toolpath-core@0.4.0
Minor Changes
#248
1029580Thanks @sobechestnut-dev! - feat: non-extrusionCutmove classification + tool-state modal (DD-012 phase 1, #189)Non-extrusion toolpaths (CNC / laser / plotter) no longer collapse their productive moves into
Travel. The parser now tracks a tool-engaged modal state —M3/M4(spindle/laser on, incl. theM03/M04leading-zero form) engage it,M5disengages — and classifies a move with no extrusionEwhile the tool is engaged as the newMoveKind.Cutbit (a CNC/laser/plotter counterpart toExtrude, composing withArcSegmentlike the other kinds).MoveKind.Cut = 1 << 7(@chestnutlabs/toolpath-core).cutMoves:knownonce a tool-state modal is seen (a CNC/laser/plotter file),unavailablefor FDM.M3/M4, soCutis never set and every movestays
Extrude/Travelexactly as before (verified against the native-golden corpus; the CNCfixtures
demo-easel/demo-mach3are documented intentional adapter-divergences).Modal tool-state value channels (laser power / spindle RPM via
S), canned-cycle expansion, anddialect families follow in later DD-012 phases.
#250
8fec7c3Thanks @sobechestnut-dev! - feat: opt-in modal tool-power channel (DD-012 phase 1 — theModalChannelmechanism, #189)Adds the shared, opt-in
ModalChannelmechanism DD-012 D3 is built around, and its first channel:toolPower— the modal spindle/laserSvalue while a tool is engaged.ParseOptions.modalChannels?: readonly string[]— request per-segment modal channels by id.Supported id:
'toolPower'. Unknown ids are ignored with amodal-channel-unsupportedwarning.ToolpathSegments.modal?: Readonly<Record<string, Float32Array>>— one Float32 column per requestedchannel, present only when requested. An unset value is
NaN(an honest "no value here"), nevera fabricated
0.toolPoweris the modalS(set onM3/M4and inline on GRBL-laser motionlines) while engaged,
NaNwhen the tool is off (M5).toolPower: surfaced only when the channel is requested —knownonce atool-state modal is seen, else
unavailable.modalChannels⇒ nomodalon the IR, no extra columns, FDMoutput unchanged. The budget-aware SoA writer (DD-003) grows the opt-in columns in lockstep and
accounts their bytes.
Presentation (Watts vs RPM) is a dialect label, not a separate channel (DD-012 D4); #180's
fan/temp/accel color channels reuse this same mechanism in a later phase.
@chestnutlabs/gcode-bgcode@0.4.0
Patch Changes
1029580,8fec7c3]:@chestnutlabs/gcode-containers@0.4.0
Patch Changes
1029580,8fec7c3]:@chestnutlabs/gcode-preview-core@0.4.0
Patch Changes
b2053be,5f59b77,13fd5c6,1029580,11f317d,8fec7c3,879b60a,b84bea9]:@chestnutlabs/gcode-preview-element@0.4.0
Patch Changes
b2053be,5f59b77,13fd5c6,1029580,11f317d,8fec7c3,879b60a,b84bea9]:@chestnutlabs/gcode-preview-react@0.4.0
Patch Changes
b2053be,5f59b77,13fd5c6,1029580,11f317d,8fec7c3,879b60a,b84bea9]:@chestnutlabs/gcode-preview-svelte@0.4.0
Patch Changes
b2053be,5f59b77,13fd5c6,1029580,11f317d,8fec7c3,879b60a,b84bea9]:@chestnutlabs/gcode-preview-vue@0.4.0
Patch Changes
b2053be,5f59b77,13fd5c6,1029580,11f317d,8fec7c3,879b60a,b84bea9]:@chestnutlabs/gcode-renderer-2d@0.4.0
Patch Changes
5f59b77,1029580,8fec7c3]: