refactor(web): split koolook_sidebar.js into 7 sidebar modules (#51)
* refactor(web): split koolook_sidebar.js into 7 sidebar modules
Pure mechanical split — zero behavior change. Implements the design from
issue #49 (common-case layout with patchCanvasMenu extracted).
Old: web/koolook_sidebar.js (1973 lines, monolithic)
New: web/koolook_sidebar.js (48-line entry) + 7 modules in web/sidebar/
- constants.js (130) — REPOS, TAB_*, storage keys, event names, URLs,
ensureStyle, toast, compareNames
- picks_store.js (117) — localStorage user picks: load/save/add (tri-state)
/remove/notify/seed/export
- workflows_store.js (347) — workflowsCache + persistMutation + snapshotCache
+ commit + persist*/load*/seed* + in-memory ops; cache is module-private
- canvas_io.js (192) — serialize*/canvasIsNonEmpty/loadWorkflowOntoCanvas
/insertNode/getSelectedNodeTypes
- modals.js (384) — makeModalShell + showInputModal/showConfirmModal
/showSaveWorkflowModal/showContextMenu
- canvas_menu.js (45) — patchCanvasMenu (idempotent LGraphCanvas patch)
- tree.js (825) — pathStates (module-private) + gatherers + DOM row
factories + buildFolder + workflow/dir context menus + rebuildTree
+ renderPanel
Encapsulation invariants verified:
- workflowsCache: zero references outside workflows_store.js
- pathStates: zero references outside tree.js
- All 8 files pass node --check
- CSS string byte-identical to original
- URL constants resolve to same targets after the extra `..` adjustment
Documentation updated: dev-iteration-loop.md and workflows-sidebar.md
now point pathStates references at web/sidebar/tree.js. Other doc
references to koolook_sidebar.js as the entry remain accurate.
Closes #49.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* refactor(web): drop unreachable defensive guard in gatherWorkflows
Review feedback on #51: the `if (!dir) continue;` after `dirOf(dirName)`
is unreachable — `listDirectoryNames()` enumerates the same module-private
`workflowsCache.directories` keys that `dirOf()` reads, synchronously,
within a single event-loop turn. Removing the guard restores strict
"byte-identical move" semantics for the file-split refactor.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>