Skip to content

v0.11.0

Choose a tag to compare

@lyriks-dev lyriks-dev released this 19 Jul 15:04

Canonical project state variables become first-class. A project can own stable state identities, now authored directly in the dashboard's state registry and referenced from surfaces by id, with coherence diagnostics flagging stale or incompatible links across features. The dashboard also gains searchable behavior inventories, agrees a port with the MCP automatically (the default moves off 3000 to 43171), runs cleanly embedded in a Lyriks host, and lets entity enum fields reference reusable value sets. Codebase adoption now steers an extractor toward the right taxonomy and an honest hard-vs-soft split, and gains outline_repo, a bounded map of the source tree so a feature split starts from real structure. No breaking changes: legacy surface state stays readable and no snapshots are rewritten.

Added

  • Canonical project state variables connect behavior across features. Projects can now own stable state identities with explicit owners, readers, writers, and optional links to entity fields or Builder nodes. New MCP tools create, update, link, list, and remove them; add_state_definition can project a canonical variable onto a surface by id; project aggregates and spec-gap diagnostics report stale or incompatible data-field links. Legacy surface state remains readable and is grouped by path without rewriting snapshots.
  • Behavior inventories now roll up from actions to features and projects. The dashboard exposes searchable project and feature views for actions, surfaces, states, surface rules, and personas, with shared context sidebars and compact action statistics. Action rollups preserve feature/surface provenance and identify reusable cross-feature concepts such as state paths, events, resources, roles, parameters, value sets, and effect types.
  • outline_repo gives codebase adoption a map of the source. A new MCP tool returns a bounded outline of the repository's source tree - directories, a file count per directory, and a file-type histogram - with node_modules, build output, caches, and dot-directories skipped and the walk capped by depth and maxEntries. The server reads the tree from disk itself (the same access behind attach_source_path), so an LLM can ground a feature split in real structure even on a host that gives it no filesystem tools of its own. It surfaces structure only and never decides the taxonomy - you still name the features and confirm the split. Scope a monorepo package with subPath. The bundled unspa-adopt skill and the unspa adopt prompt now point at it.

Changed

  • The dashboard and MCP now agree on a port automatically, and the default moved off 3000. unspa dashboard (and npm run dev) start on the uncommon default 43171 - so they no longer fight the usual 3000 / 5173 / 8080 - and advance to the next free port if it's taken, printing the URL they bound. The running dashboard publishes that URL to ~/.unspa-hub/.dashboard.json, and the MCP sync-notifier reads it before falling back to probing loopback ports, so live edit refresh (and activity toasts) work with zero config even when a WSL2 / Docker relay squats the old ports. Pin a specific port with a loopback UNSPA_SYNC_URL if you run the dashboard somewhere unusual.
  • Entity enum fields can reference reusable value sets. Entity and entity-field MCP tools now accept valueSetId, allowing canonical state and data-field coherence checks to compare shared enum vocabularies.
  • The dashboard can run cleanly inside a Lyriks host. ?embed=1 hides the complete header and other standalone chrome, suppresses onboarding, toasts, and floating widgets, and applies the Lyriks skin without overwriting the browser's saved theme. Global host context (embed, optional user history attribution, and brand) now persists automatically across every same-origin navigation, while page-local deep-link state remains scoped to its page. Independently, ?brand=lyriks keeps the header visible but replaces its Unspaghettit lockup with the official Lyriks v3 logo, wordmark, and a "Behavior editor" product label. Vite now selects the first available development port instead of requiring port 8173.
  • Codebase adoption steers taxonomy and hard-vs-soft faithfully. The unspa adopt prompt and the bundled unspa-adopt skill now tell the extractor to record the product's pillars as the project's core features (declare_core_feature + set_feature_core) instead of re-deriving the taxonomy from folder names on every pass, and to model a constraint as an invariant only when the code truly enforces it (it rejects or throws). An advisory check that merely warns and proceeds becomes a non-blocking rule, not a hard invariant that would claim a guarantee the code never made. Both fixes close the fidelity gaps that a real code-to-spec extraction surfaced.