diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bad08b..64540c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,45 @@ All notable changes to Armature are documented here. +## v0.10.0 — Panel Manifest + Lifecycle + +First version in the Panels series. Adds the plumbing layer for +composable companion views — a new rendering tier between surfaces +(full-page) and block renderers (inline). No presentation UI ships +in this version; floating and docked chrome arrive in v0.10.1–v0.10.2. + +**Manifest: `panels` field (provider + consumer)** + +- Provider form: packages declare panels as a map of `{ entry, title, + icon, description, min_width, min_height, default_width, default_height }` +- Consumer form: surfaces declare panel dependencies as an array of + `"package.panel"` strings (soft dependency — install succeeds even + if provider is missing) +- Validation enforces required `entry` and `title` for providers, + `pkg.panel` dot-format for consumers + +**Backend: panel resolution at surface load** + +- `PanelMeta` struct carries resolved panel metadata +- `resolvePanels()` resolves consumer references against installed and + enabled provider packages at surface render time +- `window.__PANELS__` injected into base template for extension surfaces +- Soft-dependency warning logged at install time for unresolved consumers + +**Frontend: `sw.panels` SDK module** + +- `sw.panels.open(panelId, opts)` — lazy-loads panel JS via dynamic + `import()`, mounts into container, caches module for reuse +- `sw.panels.close(panelId)` — calls cleanup, removes container +- `sw.panels.toggle(panelId, opts)` — open if closed, close if open +- `sw.panels.isOpen(panelId)` / `sw.panels.isAvailable(panelId)` — boolean queries +- `sw.panels.list()` / `sw.panels.active()` — registered and open panel IDs +- Events: `panels.opened` and `panels.closed` emitted on lifecycle transitions +- Mount context: `{ sw, params, panelId, close, resize }` +- Unstyled container (position:fixed div) — v0.10.1 adds FloatingPanel chrome + +**Tests:** 10 new — 6 manifest validation, 4 panel resolution + ## v0.9.9 — Surface Access via Roles Surfaces can now gate access by team role. A manifest declaring diff --git a/ROADMAP.md b/ROADMAP.md index e4326eb..3fd4e3a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,7 +1,5 @@ # Armature — Roadmap -## Current: v0.9.x — Workflow Redesign + Multi-Surface Packages - Self-hosted extensible platform kernel. Auth, identity, packages, Starlark sandbox, storage, realtime, and ops are kernel primitives. Everything else is an extension. @@ -73,97 +71,37 @@ All completed work is documented in `CHANGELOG.md`. --- -## Planned - ### v0.9.x — Multi-Surface Packages + Workflow Redesign -**v0.9.0 — Multi-Surface Packages** *(completed)* - -Packages declare a `surfaces` array with per-path access controls, -titles, and layouts. Unified route tree dispatches between surface -rendering and ext API calls. `sw.navigate()` for client-side sub-path -routing. Design doc: `docs/DESIGN-multi-surface.md`. - -**v0.9.1 — Server-Side Sub-Path Routing** *(completed)* - -Consolidated root and catch-all route handlers into a unified dispatcher. -Added `aggregateAccess()` for early auth short-circuit on all-authenticated -packages. SDK seeds initial history state for back-button resilience. -8 handler integration tests + 5 aggregateAccess unit tests. - -**v0.9.2 — Starlark Converter Consolidation + Snapshot Cleanup** *(completed)* - -Consolidated duplicate Go↔Starlark converters into `sandbox/convert.go` -(4 exported functions) and snapshot parsers into `models/snapshot.go`. -Standardized on wrapped snapshot format. ~350 lines of duplication removed. -Design doc: `docs/DESIGN-workflow-redesign.md`. - -**v0.9.3 — Team User Roles** *(completed)* - -Many-to-many `team_user_roles` table. `RequireRole()` middleware. -Manifest `requires_roles` field (advisory). Starlark `teams` module -with `get_member_roles()` and `has_role()`. Team-admin UI with role -badge chips and assignment dropdown. 10 new tests. - -**v0.9.4 — Package Adoption + Roles** *(completed)* - -`adoptable` manifest field + `team_role_catalog` table. When a team -adopts an adoptable package, the package's `requires_roles` auto-populate -into the team's role catalog. Adopted packages reference the original via -`adopted_from` column (shared assets, no disk duplication). -`AdoptTeamWorkflow` deprecated in favor of package-level adoption. -4 new endpoints, migration 017, 11 new tests. - -**v0.9.5 — Typed Forms → SDK Primitive** *(completed)* - -Extracted `TypedFormTemplate`, `FormField`, `FormFieldset`, etc. from -`models/workflow.go` into a standalone `forms` package. REST endpoint -`POST /api/v1/forms/validate`. Starlark `forms.validate()` module. -FE SDK: `sw.forms.render()`, `sw.forms.validate()`, `sw.forms.validateRemote()`. -Manifest `form_template` accepted at package level. 16 new tests. - -**v0.9.6 — Deprecate `stage_type`, Collapse `stage_mode`** *(completed)* - -`stage_type` deprecated (no longer validated, defaults to "simple"). -`stage_mode` collapsed from 4→3 values: form / delegated / automated. -"review" mapped to "form" on input; review surface removed (~110 lines). -Migration 018. 4 package manifests updated. - -**v0.9.7 — Full Read/Write Workflow Starlark Module** *(completed)* - -`WorkflowEngine` interface extracted in sandbox package to break -circular import. Four write builtins added: `workflow.start()`, -`workflow.advance()`, `workflow.cancel()`, `workflow.submit_signoff()`. -`instanceToDict` and `signoffToDict` helpers shared by read+write paths. -6 new tests. - -**v0.9.8 — Conditional Routing → SDK Primitive** *(completed)* - -`routing.evaluate(rules, data)` Starlark builtin — a generic decision -engine reusable by any extension. 10 operators (exists, not_exists, eq, -neq, gt, lt, gte, lte, in, contains), first-match-wins, returns target -string or None. Always available (pure computation, no permission). -8 new tests. - -**v0.9.9 — Surface Access via Roles** *(completed)* - -`role:ROLENAME` surface access level. User must hold the role in any -team (any-team semantics, no URL context needed). `evaluateAccess` -promoted to Engine method for store access. `HasRoleInAnyTeam` store -method queries both primary and additional roles. Admin bypass, fail- -closed on nil store. 10 new tests. +| Version | Title | +|---------|-------| +| v0.9.0 | Multi-Surface Packages | +| v0.9.1 | Server-Side Sub-Path Routing | +| v0.9.2 | Converter Consolidation | +| v0.9.3 | Team User Roles | +| v0.9.4 | Package Adoption + Roles | +| v0.9.5 | Typed Forms SDK | +| v0.9.6 | Stage Mode Collapse | +| v0.9.7 | Workflow Starlark Write Ops | +| v0.9.8 | Routing SDK Primitive | +| v0.9.9 | Surface Access via Roles | --- -### v0.10.x — Panels + Composable Layout +## Current: v0.10.x — Panels + Composable Layout Panels are a new kernel rendering tier between surfaces (full-page) and block renderers (inline). They solve composable companion views — e.g., a notes reference panel inside chat. Design doc: `docs/DESIGN-panels.md`. +**v0.10.0 — Panel Manifest + Lifecycle** *(completed)* + +Manifest `panels` field (provider map + consumer array, soft dependency). +`resolvePanels()` at surface load. `sw.panels` SDK module with full +lifecycle API. Lazy JS loading with module caching. 10 new tests. + | Version | Title | |---------|-------| -| v0.10.0 | Panel Manifest + Lifecycle | | v0.10.1 | FloatingPanel Primitive | | v0.10.2 | Docked Panels + Mode Transitions | | v0.10.3 | Panel Communication Patterns |