Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
4707a5a
refactor!: rename `withOverrodeHaltState` → `withOverriddenHaltState`…
mellonis May 20, 2026
d54c5ed
Merge pull request #166 from mellonis/feat/rename-withOverridden-149
mellonis May 20, 2026
46637fc
feat!: paren-based wrapped-state naming (closes #148)
mellonis May 20, 2026
50f052f
chore(scripts): isolate per-library state-id counters in docs:states
mellonis May 20, 2026
2d0610b
Merge pull request #168 from mellonis/feat/paren-naming-148
mellonis May 20, 2026
a8016d5
feat!: cleaner `toMermaid` emit for wrapped states (closes #138, clos…
mellonis May 20, 2026
ef249d0
chore(emit): always emit `idle` entry sentinel; drop `((round))` init…
mellonis May 20, 2026
cb13663
fix(docs:states): exclude `isClonedHalt` nodes from per-algorithm sta…
mellonis May 20, 2026
ea8b8e3
refactor(emit)!: readable command/symbol vocabulary in edge labels
mellonis May 20, 2026
47c8892
refactor(emit)!: distinct unicode markers — ∗ for ifOtherSymbol, ←/→/…
mellonis May 20, 2026
1a6d95d
polish(emit + docs): readable vocabulary, removed hand-drawn diagrams…
mellonis May 20, 2026
c64e148
docs+emit polish: bracketed-tape-block format, multi-tape example, ha…
mellonis May 20, 2026
14448ab
polish(emit): ASCII `*` for ifOtherSymbol; `clonedHalt*` → `haltMarker*`
mellonis May 20, 2026
f389a93
Merge pull request #169 from mellonis/feat/cleaner-wrapper-emit-138
mellonis May 20, 2026
18eb793
chore(release): 7.0.0-alpha.1
mellonis May 20, 2026
0d52695
Merge pull request #170 from mellonis/chore/release-7.0.0-alpha.1
mellonis May 20, 2026
e7e055d
test(graphFormats): cover fromMermaid parser error paths
mellonis May 20, 2026
b07d775
Merge pull request #171 from mellonis/chore/coverage-bump-v7
mellonis May 20, 2026
a29002c
test(coverage): cover remaining reachable v7 branches
mellonis May 20, 2026
1aab2a6
Merge pull request #172 from mellonis/chore/coverage-bump-v7-2
mellonis May 20, 2026
c36b7b6
docs(spec): callable-subtree visualization for #174
mellonis May 21, 2026
2224e07
Merge pull request #177 from mellonis/feat/halt-frame-transitive-clos…
mellonis May 21, 2026
0a218ac
fix(State): nested `.wohs()` collapses inner overrides (#176)
mellonis May 21, 2026
d6ddf16
Merge pull request #178 from mellonis/feat/nested-wohs-collapse-176
mellonis May 21, 2026
15677cf
feat(State): memoize withOverriddenHaltState (#175)
mellonis May 21, 2026
efb46f8
Merge pull request #179 from mellonis/feat/wohs-memoization-175
mellonis May 21, 2026
d7bc40b
chore(graph): add isWrapper/bareStateId/frameId to GraphNode (Phase 1…
mellonis May 21, 2026
6d74f75
feat(graph): callable-subtree emit for withOverriddenHaltState (#174)
mellonis May 21, 2026
1dde21d
Merge pull request #181 from mellonis/feat/callable-subtree-emit-174
mellonis May 21, 2026
54ab833
fix(fromMermaid): tighten `&` ribbon regex to avoid CodeQL polynomial…
mellonis May 21, 2026
6f4883e
Merge pull request #182 from mellonis/fix/codeql-polynomial-regex-174
mellonis May 21, 2026
d27e872
test(coverage): exercise #174's union-find + halt-arrow + stripBracke…
mellonis May 21, 2026
9c80608
Merge pull request #183 from mellonis/chore/coverage-bump-174
mellonis May 21, 2026
0be485b
chore(release): 7.0.0-alpha.2
mellonis May 21, 2026
163c0f8
Merge pull request #184 from mellonis/chore/release-7.0.0-alpha.2
mellonis May 21, 2026
231729f
docs(spec): worked union shapes (A∪B, A∪B∪C, transitive)
mellonis May 21, 2026
401b80a
test(spec): invariant + snapshot tests for the worked union shapes
mellonis May 21, 2026
21ca68f
Merge pull request #185 from mellonis/docs/spec-union-shape-examples
mellonis May 21, 2026
3a71070
feat(state): first-class tag/label support on State + GraphNode + Mer…
mellonis May 21, 2026
6e1be78
Merge pull request #187 from mellonis/feat/state-tags-186
mellonis May 21, 2026
4190c99
chore(release): 7.0.0-alpha.3
mellonis May 21, 2026
86483d2
fix(fromMermaid): tighten classDef/class tag regexes to clear CodeQL …
mellonis May 21, 2026
922e493
Merge pull request #188 from mellonis/chore/release-7.0.0-alpha.3
mellonis May 21, 2026
c463923
Merge pull request #189 from mellonis/fix/codeql-classdef-regex-186
mellonis May 21, 2026
daef995
test(coverage): exercise fromGraph tag application + reverse-order un…
mellonis May 21, 2026
b11e41a
Merge pull request #190 from mellonis/chore/coverage-bump-186
mellonis May 21, 2026
a103807
test(coverage): strip three more dead defensive branches in graphFormats
mellonis May 21, 2026
ba20f14
Merge pull request #191 from mellonis/chore/coverage-bump-186-followup
mellonis May 21, 2026
76d0062
test(coverage): cover remaining defensive paths in fromMermaid + simp…
mellonis May 21, 2026
0ca178b
Merge pull request #192 from mellonis/chore/coverage-bump-186-third
mellonis May 21, 2026
0090c09
chore: add LICENSE to builder and library-binary-numbers-bare packages
mellonis May 21, 2026
d0c25d9
Merge pull request #193 from mellonis/chore/add-missing-licenses
mellonis May 21, 2026
397930f
fix: scope halt-stack to runStepByStep call (closes #196)
mellonis May 23, 2026
9f84746
Merge pull request #197 from mellonis/fix/runStepByStep-stack-reset-196
mellonis May 23, 2026
c1d6e2e
fix: HTML-entity-escape user content in Mermaid labels (#194)
mellonis May 23, 2026
4600558
Merge pull request #198 from mellonis/fix/escape-mermaid-labels-194
mellonis May 23, 2026
bfe70b6
refactor: extract toGraph/fromGraph into utilities/stateGraph (#180)
mellonis May 23, 2026
ded0b41
test: STATE_INTERNAL accessor coverage (#180)
mellonis May 23, 2026
5d0669b
Merge pull request #199 from mellonis/refactor/extract-state-graph-180
mellonis May 23, 2026
ce43e43
feat: State.collectStates — id -> {state, transitionSymbols} (#195)
mellonis May 23, 2026
c1d85ec
docs+test: README section for collectStates + halt-fallback coverage
mellonis May 23, 2026
202c341
docs: CLAUDE.md — collectStates + STATE_INTERNAL accessor pattern
mellonis May 23, 2026
1a2823c
Merge pull request #200 from mellonis/feat/collect-states-195
mellonis May 23, 2026
7d726c1
chore: backfill v7-alpha CHANGELOG entries for side packages
mellonis May 23, 2026
0f7141b
Merge pull request #201 from mellonis/chore/backfill-alpha-changelogs
mellonis May 23, 2026
910f09b
chore(release): 7.0.0-alpha.4
mellonis May 23, 2026
0183c78
Merge pull request #202 from mellonis/chore/release-7.0.0-alpha.4
mellonis May 23, 2026
6fac7ad
test: raise v7 coverage to cover graphFormats + stateGraph gaps
mellonis May 23, 2026
f9290d2
Merge pull request #203 from mellonis/fix/raise-coverage-on-v7
mellonis May 23, 2026
dbe9b14
feat: MachineState.matchedTransition + .-separated transition ids (#205)
mellonis May 24, 2026
aa15f69
docs(machine): document MachineState.matchedTransition (#205)
mellonis May 24, 2026
5012f4e
refactor(State): single #getEntry helper for command/nextState/matche…
mellonis May 24, 2026
64d3210
Merge pull request #206 from mellonis/feat/expose-matched-transition-205
mellonis May 24, 2026
2957cd9
feat(State): haltState.debug → boolean + post-iter timing (#207)
mellonis May 24, 2026
1247932
Merge pull request #208 from mellonis/feat/halt-debug-boolean-207
mellonis May 24, 2026
58b69f2
docs: warn that chained haltState.debug.before silently no-ops in non…
mellonis May 25, 2026
cc06d0b
Merge pull request #209 from mellonis/docs/halt-debug-chained-write-note
mellonis May 25, 2026
714abd5
test: cover patternKinds defensive fallbacks; drop dead typeof check
mellonis May 25, 2026
27826f1
Merge pull request #210 from mellonis/fix/coverage-on-v7-post-205-207
mellonis May 25, 2026
3169542
chore(release): 7.0.0-alpha.5
mellonis May 25, 2026
f8cad28
Merge pull request #211 from mellonis/chore/release-7.0.0-alpha.5
mellonis May 25, 2026
4838b82
test(examples): mirror README's matchedTransition example (#205)
mellonis May 25, 2026
583577c
docs: trim historical bloat + fix stale GraphTransition.id format
mellonis May 25, 2026
fe75285
Merge pull request #212 from mellonis/docs/trim-historical-comments-v7
mellonis May 25, 2026
6f220f1
types: add DebugBreak.cause + internal ResumeDirective (#102)
mellonis May 25, 2026
5608c23
feat(engine): MACHINE_STATE_INTERNAL halt-stack accessor (#102)
mellonis May 25, 2026
ab9e37c
feat(engine): DebugSession skeleton — construct + start + halt event …
mellonis May 25, 2026
3d50420
feat(DebugSession): step event fires once per iter (#102)
mellonis May 25, 2026
98aa7b0
feat(DebugSession): pause event + continue() (#102)
mellonis May 25, 2026
0bce741
feat(DebugSession): stepIn() forces pause on next iter (#102)
mellonis May 25, 2026
dfe9804
feat(DebugSession): stepOver() with click-time frame snapshot (#102)
mellonis May 25, 2026
c884068
feat(DebugSession): stepOut() + empty-stack guard (#102)
mellonis May 25, 2026
6ad98bb
test(DebugSession): lock in one-shot step-mode rule (#102)
mellonis May 25, 2026
842b4d8
feat(DebugSession): iter event + setRunInterval throttle (#102)
mellonis May 25, 2026
83b034a
feat(DebugSession): external pause() with cause: manual (#102)
mellonis May 25, 2026
37f6b81
test(DebugSession): cross-cutting + stop / multi-listener / no-op res…
mellonis May 25, 2026
83c0bc0
refactor(engine): run() is sync + callback-free; migrate tests to Deb…
mellonis May 25, 2026
c574f20
docs: rewrite Debugging section around DebugSession + v7 migration gu…
mellonis May 25, 2026
d387972
docs(plans): step-control implementation plan for #102
mellonis May 25, 2026
19312fb
test(DebugSession): cover stop()-during-throttle + stop()-between-aft…
mellonis May 25, 2026
663019f
fix(DebugSession): await iter listeners — restore v6 onIter coordinat…
mellonis May 25, 2026
a3355b2
feat(DebugSession): clear error on concurrent session; document cause…
mellonis May 28, 2026
aacc11b
test(DebugSession): use performance.now() for throttle timing (monoto…
mellonis May 28, 2026
4736382
refactor(engine): runStepByStep minimal; breakpoint detection + merge…
mellonis May 28, 2026
1eeddeb
docs(CLAUDE): debug section reflects v7 #102 split (runStepByStep pur…
mellonis May 28, 2026
e6f0227
fix(DebugSession): depth-based stepOver/stepOut to mirror DevTools (#…
mellonis May 28, 2026
fc120da
docs: fix bogus A.with(B) → A.wohs(B) in step-controls note (no .with…
mellonis May 28, 2026
8377888
Merge pull request #214 from mellonis/feat/step-control-102
mellonis May 28, 2026
8780303
chore(release): 7.0.0-alpha.6
mellonis May 28, 2026
0b44e44
Merge pull request #216 from mellonis/chore/release-7.0.0-alpha.6
mellonis May 28, 2026
26181cc
docs(machine): note the after-on-halt-state + haltState.debug pause c…
mellonis May 28, 2026
29e1521
Merge pull request #217 from mellonis/docs/halt-after-bp-collapse
mellonis May 29, 2026
2d6cd04
feat(machine): extract CallFrame as a first-class State subclass (#213)
mellonis May 29, 2026
2ea7058
docs(machine): document CallFrame and add the #213 implementation plan
mellonis May 29, 2026
b533219
Merge pull request #218 from mellonis/feat/213-callframe-extends-state
mellonis May 29, 2026
d614dfa
docs(visuals): implementation plan for the extraction (#204)
mellonis May 30, 2026
be77b79
feat(visuals): scaffold @turing-machine-js/visuals package (#204)
mellonis May 30, 2026
44e716f
fix(visuals): add tsconfig.build.json + wire vitest alias + build scr…
mellonis May 30, 2026
ff74620
fix(visuals): declare machine dependency in tsconfig.build.json refer…
mellonis May 30, 2026
9307668
feat(visuals): move highlightOps from machines-demo (#204)
mellonis May 30, 2026
676d115
feat(visuals): move graphUtils + spec (#204)
mellonis May 30, 2026
18794ad
fix(visuals): point graphUtils spec at the new fixture path (#204)
mellonis May 30, 2026
5df9076
feat(visuals): move graph fixture JSONs from machines-demo (#204)
mellonis May 30, 2026
e32734d
feat(visuals): move graphIndexes (#204)
mellonis May 30, 2026
9bd33f6
feat(visuals): move applyHighlight + applyIndicator + spec; extract G…
mellonis May 30, 2026
9852431
docs(visuals): move highlight + breakpoints rules doc (#204)
mellonis May 30, 2026
abfd8b3
docs(visuals): add CHANGELOG with extraction entry (#204)
mellonis May 30, 2026
c942b97
feat(visuals): add Snippet/Frame/TapeSnapshot types + format primitiv…
mellonis May 30, 2026
237070e
feat(visuals): implement recordSnippet + extend Frame with per-tape c…
mellonis May 30, 2026
672f456
feat(visuals): expose read+write on Frame commands for bidirectional …
mellonis May 30, 2026
c7df4f9
docs(visuals): expand CHANGELOG with recordSnippet surface; update pl…
mellonis May 30, 2026
f5eddca
Merge pull request #220 from mellonis/feat/204-visuals-extract
mellonis May 30, 2026
7801a33
release(visuals): 7.0.0-alpha.6 lockstep catch-up publish (#204)
mellonis May 30, 2026
e10c909
chore(visuals): add .npmignore to exclude src/tsconfig/tsbuildinfo fr…
mellonis May 30, 2026
26b1a6c
feat(visuals): add formatStepNotation + formatTape primitives (#204)
mellonis May 30, 2026
90e2bfd
release(visuals): 7.0.0-alpha.6.1 — formatter enhancements
mellonis May 30, 2026
9380992
feat(visuals): add tokenizeStep + ReadToken/WriteToken/StepTokens for…
mellonis May 30, 2026
1d882f3
docs(visuals): update alpha.6.1 plan to reflect tokenizer fold + fina…
mellonis May 30, 2026
4f53642
Merge pull request #221 from mellonis/feat/visuals-alpha7-formatters
mellonis May 30, 2026
3c1a501
docs: surface @turing-machine-js/visuals in CLAUDE.md + READMEs (post…
mellonis May 30, 2026
f7b477c
Merge pull request #222 from mellonis/docs/v7-visuals-package-refresh
mellonis May 30, 2026
6afe7f4
fix(machine): toGraph reach-set tunnels through wrappers to their con…
mellonis May 30, 2026
815c2c7
docs(states): regenerate library-binary-numbers/states.md after #223 fix
mellonis May 30, 2026
a73041b
fix(machine): framed wrappers render inside caller's subgraph too (#2…
mellonis May 30, 2026
93d50d8
docs(states): regenerate library-binary-numbers/states.md — wrapper s…
mellonis May 30, 2026
199b5bc
docs(machine): hedge wrapper-placement prose for framed wrappers (#223)
mellonis May 30, 2026
cbedff1
Merge pull request #224 from mellonis/feat/223-frame-includes-wrapper…
mellonis May 30, 2026
88aa72e
chore(release): 7.0.0-alpha.7
mellonis May 30, 2026
130d4fd
Merge pull request #225 from mellonis/chore/release-7.0.0-alpha.7
mellonis May 30, 2026
87868b5
feat(visuals): createSnippetPlayer — pure-state snippet playback driv…
mellonis May 30, 2026
c75d9f4
refactor(visuals): SnippetPlayer as a class — mirrors DebugSession shape
mellonis May 30, 2026
65bda6f
feat(visuals): tapeViewport — fixed-width centered window over a Tape…
mellonis May 30, 2026
7122bc8
docs(visuals): fix snippet-playback example — declare ops / renderTap…
mellonis May 30, 2026
9e12dd9
docs(visuals): snippet playback example uses AbortController for tear…
mellonis May 30, 2026
2adf5ab
Merge pull request #226 from mellonis/feat/visuals-alpha71-snippet-pl…
mellonis May 30, 2026
0478f69
feat(machine): lift TapeSnapshot + tapeViewport from visuals to engin…
mellonis Jun 2, 2026
fb9810d
refactor(machine): Tape.viewport shares centering loop with tapeViewp…
mellonis Jun 2, 2026
76ce7d6
Merge pull request #228 from mellonis/feat/move-tape-snapshot-to-engine
mellonis Jun 2, 2026
2c5c553
docs: catch up engine + visuals docs to v7.0.0-alpha.8 (#227 closure,…
mellonis Jun 2, 2026
f24f360
Merge pull request #229 from mellonis/docs/post-alpha-8-catchup
mellonis Jun 2, 2026
c7f38ba
docs: round-trip byte-stability scope + minusOne/minusOneFast state c…
mellonis Jun 2, 2026
77d2671
Merge pull request #230 from mellonis/docs/post-alpha-8-catchup
mellonis Jun 2, 2026
af92013
chore(deps): bump root devDeps + npm audit fix for v7.0.0 cut
mellonis Jun 3, 2026
a782cb4
Merge pull request #231 from mellonis/chore/deps-bump
mellonis Jun 3, 2026
6f7e6c7
release: v7.0.0
mellonis Jun 3, 2026
d240fe5
Merge pull request #232 from mellonis/chore/release-7.0.0
mellonis Jun 3, 2026
a4c7b8f
chore(visuals): add LICENSE for stable v7.0.0
mellonis Jun 3, 2026
b7c8416
Merge pull request #233 from mellonis/chore/visuals-license
mellonis Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions CLAUDE.md

Large diffs are not rendered by default.

37 changes: 16 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ This repository contains the following packages:
* [@turing-machine-js/library-binary-numbers](https://github.com/mellonis/turing-machine-js/tree/master/packages/library-binary-numbers) — binary arithmetic on a 5-symbol alphabet (` ^$01`) supporting multiple numbers per tape, with `plusOne`, `minusOne`, `minusOneFast`, `invertNumber`, `normalizeNumber`, and inter-number navigation.
* [@turing-machine-js/library-binary-numbers-bare](https://github.com/mellonis/turing-machine-js/tree/master/packages/library-binary-numbers-bare) — the same arithmetic on a 3-symbol alphabet (` 01`), single-number-per-tape. Side-by-side with the marker-based library to make the alphabet-size vs state-graph-size trade-off visible.
* [@turing-machine-js/builder](https://github.com/mellonis/turing-machine-js/tree/master/packages/builder) — declarative state-table construction. Not actively developed; the same pattern is shown inline in `@turing-machine-js/machine`'s README.
* [@turing-machine-js/visuals](https://github.com/mellonis/turing-machine-js/tree/master/packages/visuals) (v7+) — pure highlight + graph-indexing logic for the engine `Graph`: `applyHighlight` / `applyIndicator` against a renderer-agnostic `HighlightOps` interface, `bareIdOf` / `highlightExpand` for wrapper/bare canonicalization, `formatStepNotation` / `tokenizeStep` / `formatTape` for engine-edge-label rendering (byte-identical to `toMermaid`), `recordSnippet` for prerecorded-playback artifacts. No DOM, no Svelte, no Mermaid — consumers bring their own renderer.

# An example

Expand Down Expand Up @@ -74,35 +75,29 @@ console.log(tape.symbols.join('').trim()); // a*c*a

## How it runs

Just one state — call it **S** — that loops on every cell, writing `*` whenever the head reads `b` and stopping at the trailing blank:

```mermaid
flowchart LR
S(("**S**"))
H((("**halt**")))
S -- "b → *, R" --> S
S -- "_ → keep, L" --> H
S -- "any other → keep, R" --> S
```

*Reading the labels: `read → write, move`. `_` is the blank symbol.*

<details>
<summary>📊 Same diagram, generated by <code>toMermaid()</code> (the engine's actual output)</summary>
Just one state — call it `replaceB` — that loops on every cell, writing `*` whenever the head reads `b` and stopping at the trailing blank. The engine emits its state graph via `toMermaid(toGraph(replaceB, tapeBlock))`:

```mermaid
flowchart TD
%% alphabets: [[" ","a","b","c","*"]]
s0(((halt)))
s1(("replaceB"))
s1 -- "b → */R" --> s1
s1 -- "- → ·/L" --> s0
s1 -- "* → ·/R" --> s1
s1["replaceB"]
idle([idle])
idle -. enter .-> s1
s1 -- "['b'] → ['*']/[R]" --> s1
s1 -- "[B] → [K]/[L]" --> s0
s1 -- "[*] → [K]/[R]" --> s1
```

Engine notation: `read → write/move`; `·` = keep, `*` = `ifOtherSymbol` catch-all, `-` = the blank symbol.
Quick legend for the diagram above — full table at [packages/machine/README.md § Diagram conventions](packages/machine/README.md#diagram-conventions):

</details>
- **Edge format**: `[reads] → [writes]/[moves]` (each `[…]` is a tape-block reading; brackets always, even single-tape).
- **Read cells**: `'X'` (literal, single-quoted), `*` (`ifOtherSymbol` catch-all), `B` (the tape's blank).
- **Write cells**: `'X'` (literal), `K` (keep), `E` (erase = write blank).
- **Movement cells**: `L` / `R` / `S` (left / right / stay).
- **Node shapes**: `(((halt)))` = halt, `["square"]` = regular state or callable-subtree bare, `[[double-walled]]` = `withOverriddenHaltState` wrapper (call site), `idle([idle])` = pre-execution sentinel.
- **Edges**: `-->` regular transition (and wrapper → override target), `==> "call"` = bold call arrow from wrapper to bare (`&` ribbons collapse multi-wrapper-shares-bare), `-. "return" .->` / `-. "halt" .->` from subgraph = frame-level dispatch, `-. enter .->` from `idle` = where execution starts.
- **Subgraph `w_N["callable subtree of NAME"]`** wraps a bare + its body + a halt marker — see [§Subroutine composition](packages/machine/README.md#subroutine-composition-with-withoverriddenhaltstate) in the engine README.

Trace on the input tape `abcba`:

Expand Down
Loading
Loading