Codify attribution before the sidebar gets more visibility. NOTICE is the
single human-readable source of truth — copyright statement, plain-English
attribution request with a copy-pasteable credit line, pointer to LICENSE
and forks/THIRD_PARTY.md so it shows the project respects others'
attribution too.
SPDX-FileCopyrightText / SPDX-License-Identifier headers added at the top
of every web/*.js (entry point + sidebar/ + ai_pipeline) so license
scanners (GitHub, FOSSA, reuse-tool) parse each file correctly and
stripped-attribution forks become an obviously deliberate act rather than
"I forgot to copy a file."
GPL-3.0-only matches the LICENSE file (no "or later" wording in it). Year
range 2025-2026 spans first commit (2025-09-28) to today.
Comment-only change — no runtime impact.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(sidebar): merge preset HEAD route into GET handler
PR #68 shipped koolook_routes.py with @routes.get + @routes.head on the
same path. aiohttp's add_get auto-registers HEAD by default, so the
explicit @routes.head collided with the auto-synthesized HEAD and
crashed ComfyUI startup with "Added route will never be executed,
method HEAD is already registered".
Trying allow_head=False on the GET to opt out triggered a second crash:
ComfyUI's server.py mirrors every PromptServer route into a parallel
/api/... table via api_routes.route(method, path)(handler, **kwargs),
and RouteTableDef.route's inner closure rejects unknown kwargs with
TypeError. So no kwarg-based opt-out is viable.
Drop the dedicated HEAD handler. Aiohttp's auto-HEAD-from-GET delivers
HEAD probes to get_preset; we branch on request.method to skip the
file read for HEAD — preserving the cheap-existence optimization the
client's presetExists relies on for multi-MB JSON over Dropbox / iCloud
/ NFS-mounted libraries. CHANGELOG [Unreleased] updated to match.
This bug never reached users — koolook_routes.py was added in #68
(post-v0.2.0) and was never published to Comfy Registry.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(sidebar): Tools row + starter preset replaces curated_defaults
Two coordinated UX changes for fresh-install distribution + admin
ergonomics — designed together and shipped as one unit.
1. New "Tools" row sits between the Snapshot row and the search field.
Moves the Export and "Install missing for picks" buttons up out of
the Nodes row (admin/advanced operations don't belong in the
everyday + Add toolbar). Adds a new "Drop placeholders onto canvas"
button — the security_level=normal escape hatch for installing
missing packs: instantiates one placeholder per missing pack on a
fresh canvas tab so ComfyUI/Manager's standard "Install Missing
Custom Nodes" detection takes over via Manager's UI flow (which
uses different gates than our programmatic /customnode/install/
git_url call). Nodes row keeps only the everyday + button.
2. curated_defaults.json retired in favor of starter_preset.json.
Fresh installs no longer get picks seeded directly into localStorage
on first load. Instead the bundled web/starter_preset.json (full
snapshot format — picks + workflows + tags + archive) is copied
into the user's snapshot library directory as starter.json. The
user opens Snapshot -> Load -> starter to apply in one click.
Unifies fresh-install distribution with the per-user snapshot
library (#68); maintainer flow becomes "build state in ComfyUI ->
click the (down-arrow) Tools-row button -> paste over
web/starter_preset.json -> commit." Existing users with non-empty
picks are explicitly skipped by the new seeder, so their state is
untouched.
Removed: seedDefaultsIfNeeded, exportPicks, web/curated_defaults.json,
SEEDED_KEY, DEFAULTS_URL.
Added: seedStarterPresetIfNeeded, exportStarterPreset (snapshot.js),
STARTER_SEEDED_KEY, STARTER_URL, STARTER_PRESET_FILENAME,
discoverMissingPacks (installer.js), dropPlaceholdersForPacks
(canvas_io.js), web/starter_preset.json.
Docs: CLAUDE.md "Curated Nodes sidebar — distributed defaults" ->
"Kforge Labs sidebar — starter preset distribution".
docs/maintainers/curated-sidebar.md rewritten.
CHANGELOG.md [Unreleased] updated.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds an "Install missing for picks" toolbar button to the Nodes section.
On click it walks the user's curated picks against Manager's
/customnode/getmappings, buckets them into already-installed /
will-install / unresolved, queues each unique git URL through
/customnode/install/git_url, polls /manager/queue/status to drive a
progress bar, and prompts to reboot — collapsing what was previously
a per-node "open node, let Manager prompt, click install, restart"
loop into a single confirm-and-go flow.
New `web/sidebar/installer.js` holds the Manager-API client (detect /
mappings / queue / poll / reboot) plus the picks → installs resolver.
The modal in `web/sidebar/modals.js` drives the four-phase UI
(discovery → confirm → progress → result) and surfaces 403s as
actionable language ("your security level forbids git-URL installs")
rather than raw HTTP. Falls back to a clipboard URL list (with a
`comfy node install` hint) if Manager isn't reachable.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>