From 449e45b5448ba762aa3592df9903711bcbb68aab Mon Sep 17 00:00:00 2001 From: Mikael Labrut <619217+MLKiiwy@users.noreply.github.com> Date: Wed, 23 Sep 2026 09:40:29 +0000 Subject: [PATCH 1/8] docs: move architecture docs into packages/architecture Relocates docs/architecture.md, docs/arch-check.md, and docs/platform/* into packages/architecture/docs/ so architecture documentation lives alongside the code it describes. Updates all cross-references in CLAUDE.md, README.md, PRDs, and epics, and fixes relative links inside the moved files (ADR links, arch-check references) that are now correct now that the docs are co-located with packages/architecture/adrs/. Co-Authored-By: Claude Sonnet 4.6 --- .agents/epics/alistigo-platform-foundation/epic.md | 2 +- .agents/prds/alistigo-artifact-plugins.md | 2 +- .agents/prds/alistigo-platform-foundation.md | 4 ++-- CLAUDE.md | 2 +- README.md | 4 ++-- {docs => packages/architecture/docs}/arch-check.md | 0 {docs => packages/architecture/docs}/architecture.md | 2 +- {docs => packages/architecture/docs}/platform/README.md | 2 +- .../architecture/docs}/platform/artifact-contract.md | 4 ++-- .../architecture/docs}/platform/layer-diagram.md | 2 +- .../architecture/docs}/platform/plugin-types.md | 6 +++--- .../architecture/docs}/platform/skill-pattern.md | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) rename {docs => packages/architecture/docs}/arch-check.md (100%) rename {docs => packages/architecture/docs}/architecture.md (99%) rename {docs => packages/architecture/docs}/platform/README.md (93%) rename {docs => packages/architecture/docs}/platform/artifact-contract.md (97%) rename {docs => packages/architecture/docs}/platform/layer-diagram.md (99%) rename {docs => packages/architecture/docs}/platform/plugin-types.md (93%) rename {docs => packages/architecture/docs}/platform/skill-pattern.md (97%) diff --git a/.agents/epics/alistigo-platform-foundation/epic.md b/.agents/epics/alistigo-platform-foundation/epic.md index 5bada175..ab70a310 100644 --- a/.agents/epics/alistigo-platform-foundation/epic.md +++ b/.agents/epics/alistigo-platform-foundation/epic.md @@ -103,7 +103,7 @@ PLATFORM INFRA artifact-manager, artifact-config-format, sentry-plugin, posthog- 4. List artifact loads with LoadingScreen → badge visible top-right → modal works 5. Playground AI API tab sends `addElement`, call log shows result 6. ADR 0018 in `docs/adrs/` with entry in README.md index -7. `docs/platform/` contains 4 documents +7. `packages/architecture/docs/platform/` contains 4 documents ## Estimated Effort diff --git a/.agents/prds/alistigo-artifact-plugins.md b/.agents/prds/alistigo-artifact-plugins.md index 1dfd7bfd..f1d8690c 100644 --- a/.agents/prds/alistigo-artifact-plugins.md +++ b/.agents/prds/alistigo-artifact-plugins.md @@ -93,7 +93,7 @@ Two existing ADRs already chose the underlying tools and are **not** being revis ## References -- Architecture: `docs/architecture.md`, `docs/milestones.md` +- Architecture: `packages/architecture/docs/architecture.md`, `docs/milestones.md` - ADRs: `docs/adrs/0008-error-monitoring.md`, `docs/adrs/0010-product-analytics.md`, `docs/adrs/0011-jsdelivr-versioning-strategy.md` - Related PRD (naming conflict, see above): `.agents/prds/alistigo-ai-m3.md` - Config-format precedent: `.agents/prds/alistigo-ai-m2.md` diff --git a/.agents/prds/alistigo-platform-foundation.md b/.agents/prds/alistigo-platform-foundation.md index a363a144..07782e8b 100644 --- a/.agents/prds/alistigo-platform-foundation.md +++ b/.agents/prds/alistigo-platform-foundation.md @@ -59,9 +59,9 @@ since the entire repo is alistigo. | F8 | `@alistigo/ai-chat-async-api` package: `` tag parser + executor + AsyncAPI-subset definition | | F9 | List artifact publishes its API definition (`api.json`) | | F10 | Playground "AI API" tab: load artifact API definition, send actions, show call log | -| F11 | `docs/architecture.md` rewritten for platform scope | +| F11 | `packages/architecture/docs/architecture.md` rewritten for platform scope | | F12 | `docs/milestones.md` gains P0 milestone; M1-M6 become "List Artifact Milestones" | -| F13 | `docs/platform/` created with artifact-contract, skill-pattern, plugin-types, layer-diagram | +| F13 | `packages/architecture/docs/platform/` created with artifact-contract, skill-pattern, plugin-types, layer-diagram | | F14 | `docs/domain/` subdocs gain "List Artifact domain only" scope banners | | F15 | All existing Gherkin scenarios pass after the refactor | diff --git a/CLAUDE.md b/CLAUDE.md index dedeb82f..9c1f26fe 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,7 +39,7 @@ All QA tools follow the `qa:*` prefix convention: ```sh pnpm qa # Run all qa:* checks in parallel (via Nx) pnpm qa:lint # Biome lint across the workspace -pnpm qa:arch-check # Architectural linting (dependency-cruiser) — see docs/arch-check.md +pnpm qa:arch-check # Architectural linting (dependency-cruiser) — see packages/architecture/docs/arch-check.md pnpm qa:dead-code # Fallow: unused files, exports, dead code (full repo scan) pnpm qa:audit # Fallow: fast changed-file risk gate (pre-push / CI) ``` diff --git a/README.md b/README.md index 0ebda053..63507d6b 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ All static analysis and linting tools follow the `qa:*` prefix — keeping QA co |--------|------|----------------| | `pnpm qa` | All QA tools | Run all `qa:*` checks (lint + arch-check + dead-code + audit + stories) | | `pnpm qa:lint` | [Biome](https://biomejs.dev/) | Code style, formatting, and lint rules across all packages | -| `pnpm qa:arch-check` | [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) | Architectural boundary violations — see `docs/arch-check.md` | +| `pnpm qa:arch-check` | [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) | Architectural boundary violations — see `packages/architecture/docs/arch-check.md` | | `pnpm qa:dead-code` | [Fallow](https://github.com/fallow-rs/fallow) | Unused files, exports, and dead code (full repo scan) | | `pnpm qa:audit` | [Fallow](https://github.com/fallow-rs/fallow) | Changed-file risk gate — fast audit for pre-push and CI | | `pnpm qa:stories-check` | custom script | Every component has a co-located `.stories.tsx` (ADR 0012) | @@ -72,7 +72,7 @@ All `qa:*` checks run automatically: | Doc | What it covers | |-----|----------------| | [docs/sdlc.md](docs/sdlc.md) | AI-augmented SDLC philosophy — lifecycle stages, AI touchpoints per stage, human review gates, agent orchestration patterns | -| [docs/arch-check.md](docs/arch-check.md) | Architectural boundary rules enforced | +| [packages/architecture/docs/arch-check.md](packages/architecture/docs/arch-check.md) | Architectural boundary rules enforced | | [docs/adrs/](docs/adrs/) | Architecture Decision Records — why the repo is shaped the way it is |§§§§§§§§§§§§§§§§§ ## Continuous Deployment diff --git a/docs/arch-check.md b/packages/architecture/docs/arch-check.md similarity index 100% rename from docs/arch-check.md rename to packages/architecture/docs/arch-check.md diff --git a/docs/architecture.md b/packages/architecture/docs/architecture.md similarity index 99% rename from docs/architecture.md rename to packages/architecture/docs/architecture.md index 7a78dc62..e5609ad2 100644 --- a/docs/architecture.md +++ b/packages/architecture/docs/architecture.md @@ -1,6 +1,6 @@ # Alistigo — Architecture -> **Platform scope (P0+):** Alistigo is a platform for AI artifacts. The list artifact (`@alistigo/artifact-list`) is the reference implementation. For platform-level architecture see [`docs/platform/`](platform/README.md) and [ADR 0018](adrs/0018-alistigo-platform.md). +> **Platform scope (P0+):** Alistigo is a platform for AI artifacts. The list artifact (`@alistigo/artifact-list`) is the reference implementation. For platform-level architecture see [`docs/platform/`](platform/README.md) and [ADR 0018](../adrs/0018-alistigo-platform.md). This document describes the technical architecture for the Alistigo platform and its reference implementation (the list artifact): stack, layering, runtime model, evolution path, and the non-negotiable principles that drive design choices. diff --git a/docs/platform/README.md b/packages/architecture/docs/platform/README.md similarity index 93% rename from docs/platform/README.md rename to packages/architecture/docs/platform/README.md index 5a615fec..e6bd958c 100644 --- a/docs/platform/README.md +++ b/packages/architecture/docs/platform/README.md @@ -7,7 +7,7 @@ consistent quality floor and minimal boilerplate. The **list artifact** (`@alistigo/artifact-list`) is the reference implementation. All platform concepts are demonstrated there first. -See [ADR 0018](../adrs/0018-alistigo-platform.md) for the decision record capturing +See [ADR 0018](../../adrs/0018-alistigo-platform.md) for the decision record capturing this scope change. --- diff --git a/docs/platform/artifact-contract.md b/packages/architecture/docs/platform/artifact-contract.md similarity index 97% rename from docs/platform/artifact-contract.md rename to packages/architecture/docs/platform/artifact-contract.md index 7d5a2985..2623cca1 100644 --- a/docs/platform/artifact-contract.md +++ b/packages/architecture/docs/platform/artifact-contract.md @@ -119,7 +119,7 @@ const ctx = await startArtifact({ }); ``` -See [ADR 0016](../adrs/0016-artifact-plugin-system.md) for the full plugin interface. +See [ADR 0016](../../adrs/0016-artifact-plugin-system.md) for the full plugin interface. --- @@ -137,7 +137,7 @@ Every artifact operates on exactly two documents: Config fields common to all artifacts: `app` (required), `lang` (optional). Artifact- specific fields are in the artifact's leaf config-format package. -See `docs/architecture.md §12` for the full spec. +See `../architecture.md §12` for the full spec. --- diff --git a/docs/platform/layer-diagram.md b/packages/architecture/docs/platform/layer-diagram.md similarity index 99% rename from docs/platform/layer-diagram.md rename to packages/architecture/docs/platform/layer-diagram.md index 955e6070..5c101a7d 100644 --- a/docs/platform/layer-diagram.md +++ b/packages/architecture/docs/platform/layer-diagram.md @@ -86,7 +86,7 @@ Full layer diagram with all package names as of P0 (2026-07-27). 5. **Platform Infra packages are loaded at CDN runtime, not bundled into artifacts.** 6. **Dev Tools are never imported by shipped packages.** -These rules are enforced by `dependency-cruiser` (see `docs/arch-check.md`). +These rules are enforced by `dependency-cruiser` (see `../arch-check.md`). --- diff --git a/docs/platform/plugin-types.md b/packages/architecture/docs/platform/plugin-types.md similarity index 93% rename from docs/platform/plugin-types.md rename to packages/architecture/docs/platform/plugin-types.md index 6c390cce..1ac7a36c 100644 --- a/docs/platform/plugin-types.md +++ b/packages/architecture/docs/platform/plugin-types.md @@ -1,7 +1,7 @@ # Plugin Type Taxonomy All `@alistigo` plugins implement the `AlistigoPlugin` interface from -`@alistigo/artifact-plugin-api` (see [ADR 0016](../adrs/0016-artifact-plugin-system.md)). +`@alistigo/artifact-plugin-api` (see [ADR 0016](../../adrs/0016-artifact-plugin-system.md)). The plugin type determines what the plugin does, not how it's wired — the interface is the same for all types. @@ -82,7 +82,7 @@ plugin in order and uses the first one that returns `true`. **Fallback:** `InMemoryStore` — used when no storage plugin is available; data is lost on reload. -See [ADR 0017](../adrs/0017-storage-plugin-system.md) for the storage plugin system design. +See [ADR 0017](../../adrs/0017-storage-plugin-system.md) for the storage plugin system design. --- @@ -116,4 +116,4 @@ All plugins are: - Loaded at runtime from jsDelivr CDN using the `@0` major-version-pin convention (ADR 0011) - Never bundled into the artifact at build time (enabling/disabling is a config change) -See [ADR 0016](../adrs/0016-artifact-plugin-system.md) for distribution details. +See [ADR 0016](../../adrs/0016-artifact-plugin-system.md) for distribution details. diff --git a/docs/platform/skill-pattern.md b/packages/architecture/docs/platform/skill-pattern.md similarity index 97% rename from docs/platform/skill-pattern.md rename to packages/architecture/docs/platform/skill-pattern.md index 880c891b..02b3841e 100644 --- a/docs/platform/skill-pattern.md +++ b/packages/architecture/docs/platform/skill-pattern.md @@ -3,7 +3,7 @@ Every `@alistigo` artifact ships an agent skill that teaches AI chat (Claude and other LLM agents) what the artifact is, when to use it, and how to interact with it. -See [ADR 0015](../adrs/0015-agent-skills-standard.md) for the agentskills.io standard +See [ADR 0015](../../adrs/0015-agent-skills-standard.md) for the agentskills.io standard that all Alistigo skills follow. --- From 69c86c2102a46c74d2b1e62dd863d04f21d0be55 Mon Sep 17 00:00:00 2001 From: Mikael Labrut <619217+MLKiiwy@users.noreply.github.com> Date: Wed, 23 Sep 2026 10:16:02 +0000 Subject: [PATCH 2/8] docs: create canonical what-is-alistigo, delete PRDs, wire website MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add packages/architecture/docs/what-is-alistigo.md: single source of truth synthesizing all PRD content (problem, platform, how it works, milestones, principles) - Delete all 13 PRDs from .agents/prds/ — content now lives in what-is-alistigo.md and docs/milestones.md - Trim docs/README.md to a lean index; remove Vision/Principles/Milestone sections now superseded by the canonical doc - Remove the PRD-reference callout from docs/milestones.md - Add @alistigo/architecture as workspace:* dependency to the website; set implicitDependencies in project.json for Nx cache invalidation - Wire website About sidebar → about/what-is-alistigo using default MDX import (import ArchDoc from '@alistigo/architecture/docs/what-is-alistigo.md') to avoid the reserved Content identifier conflict in Astro 5 / MDX Co-Authored-By: Claude Sonnet 4.6 --- .agents/prds/alistigo-ai-m1.md | 97 -------------- .agents/prds/alistigo-ai-m2.md | 125 ------------------ .agents/prds/alistigo-ai-m3.md | 74 ----------- .agents/prds/alistigo-ai-m4.md | 43 ------ .agents/prds/alistigo-ai-m5.md | 53 -------- .agents/prds/alistigo-ai-m6.md | 33 ----- .agents/prds/alistigo-artifact-plugins.md | 99 -------------- .agents/prds/alistigo-platform-foundation.md | 110 --------------- .../prds/artifact-claude-capabilities-demo.md | 50 ------- .agents/prds/claude-storage-explorer.md | 96 -------------- .../list-shared-view-and-checkbox-plugin.md | 81 ------------ .agents/prds/personal-website.md | 83 ------------ .agents/prds/storage-as-plugin.md | 94 ------------- docs/README.md | 53 ++------ docs/milestones.md | 12 -- .../architecture/docs/what-is-alistigo.md | 86 ++++++++++++ packages/architecture/package.json | 4 +- pnpm-lock.yaml | 3 + websites/alistigo/astro.config.ts | 6 + websites/alistigo/package.json | 1 + websites/alistigo/project.json | 1 + .../content/docs/about/what-is-alistigo.mdx | 7 + 22 files changed, 117 insertions(+), 1094 deletions(-) delete mode 100644 .agents/prds/alistigo-ai-m1.md delete mode 100644 .agents/prds/alistigo-ai-m2.md delete mode 100644 .agents/prds/alistigo-ai-m3.md delete mode 100644 .agents/prds/alistigo-ai-m4.md delete mode 100644 .agents/prds/alistigo-ai-m5.md delete mode 100644 .agents/prds/alistigo-ai-m6.md delete mode 100644 .agents/prds/alistigo-artifact-plugins.md delete mode 100644 .agents/prds/alistigo-platform-foundation.md delete mode 100644 .agents/prds/artifact-claude-capabilities-demo.md delete mode 100644 .agents/prds/claude-storage-explorer.md delete mode 100644 .agents/prds/list-shared-view-and-checkbox-plugin.md delete mode 100644 .agents/prds/personal-website.md delete mode 100644 .agents/prds/storage-as-plugin.md create mode 100644 packages/architecture/docs/what-is-alistigo.md create mode 100644 websites/alistigo/src/content/docs/about/what-is-alistigo.mdx diff --git a/.agents/prds/alistigo-ai-m1.md b/.agents/prds/alistigo-ai-m1.md deleted file mode 100644 index a46944dd..00000000 --- a/.agents/prds/alistigo-ai-m1.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -name: alistigo-ai-m1 -description: Base list artifact — a standard, reusable list widget that AI can produce and customize instead of building a list app from scratch every time -status: active -created: 2026-05-13T14:17:50Z ---- - -# PRD: alistigo-ai-m1 — Base List Artifact - -## Executive Summary - -Alistigo gives AI a standard, reusable list widget it can hand to users as an artifact — instead of generating a new ad-hoc list app from scratch each time. The first milestone delivers the base list: view, add, remove, and persist elements across sessions. - -## Problem Statement - -Today, when a user asks an AI to create a shareable list artifact, the AI writes a full application from scratch — picking a UI library, wiring state management, handling persistence. This has three problems: - -1. **Token cost.** Writing an entire app takes a lot of tokens — for something as common as a list. -2. **Non-determinism.** Because AI is non-deterministic, every generated list app looks and behaves differently. There is no consistent user experience. -3. **Limited features.** A generated app only has what the AI happened to include. No shared feature baseline, no way to extend it. - -Alistigo solves this by offering a **standard list artifact** the AI can produce by describing a document — not by writing an app. The AI stays in its lane (data and intent); Alistigo handles the rendering, interaction, and persistence. Future milestones let the AI customize the artifact via plugins and themes without touching the core. - -## User Stories - -User stories are defined as Gherkin scenarios in `packages/alistigo-features/`. All scenarios tagged `@m1` are in scope for this milestone. - -**Location:** `packages/alistigo-features/features/core/` - -| Feature file | What it covers | -|---|---| -| `display-list.feature` | Rendering an empty or populated list | -| `add-element.feature` | Appending a new text element | -| `delete-element.feature` | Removing an element by identity | -| `persist.feature` | State surviving a session reload | - -A milestone is done when all `@m1` scenarios pass green via the acceptance runner and the Playwright bridge. - -## Functional Requirements - -| # | Requirement | -|---|-------------| -| F1 | An AI can produce a list by describing a document — no app code required | -| F2 | The widget renders the list and its elements | -| F3 | A user can add a text element to the list | -| F4 | A user can remove any element from the list | -| F5 | The list state persists across page reloads | -| F6 | A user or AI can export the current list as a document | -| F7 | An acceptance runner reads the Gherkin `.feature` files and validates all `@m1` scenarios programmatically | -| F8 | The list artifact can be shared to other users via the host AI chat's native artifact/widget sharing mechanism — the recipient gets the same document and can interact with it | -| F9 | The document format is JSON-LD, using schema.org types wherever they exist (e.g. `ItemList`, `ListItem`). Custom Alistigo properties extend the schema.org vocabulary rather than replacing it — no wheel reinvention | -| F10 | Alistigo publishes a machine-readable skill / integration guide (e.g. an `llms.txt`, an MCP tool description, or a structured prompt) that teaches any AI how to produce a valid Alistigo document and embed the widget. This guide is publicly hosted and web-discoverable so AI systems can ingest it. Once ingested, an AI asked to "create a list" should reach for Alistigo automatically — no custom prompt engineering required from the user | - -## Non-Functional Requirements - -| # | Requirement | -|---|-------------| -| N1 | The widget is embeddable — it runs as a self-contained unit inside a host page | -| N2 | No backend is required for any M1 feature | -| N3 | The document format is human-readable and LLM-producible from prose | -| N4 | The same document always produces the same list — deterministic rendering | -| N5 | The document contains a full interaction log recording every action (add, delete, rename, …) with the actor (`user`, `llm`, `host`, `system`) and a timestamp — so any party can reconstruct what happened and who did it | -| N6 | All entities and domain concepts (List, Element, Event, Command, …) are defined following Domain-Driven Design — bounded contexts, ubiquitous language, entities with stable identities, value objects for immutable data | - -## Success Criteria - -- All `@m1` Gherkin scenarios in `packages/alistigo-features/features/core/` pass green. -- The widget works in a real browser: add elements, delete elements, reload — state is preserved. -- The exported document is valid and can be used to reconstruct the list. - -## Constraints & Assumptions - -- M1 covers only text elements — no checkboxes, priorities, due dates, images, or categories. -- Element order is preserved but not user-sortable in M1. -- Duplicate elements (same text, different identity) are allowed. -- Single list per session in M1; multi-list support is deferred. - -## Out of Scope - -- Plugin system and specialised list types (todo, grocery, wishlist) — M2+ -- AI customization via plugins or themes — M2+ -- Host integration / communication protocol — M4 -- Backend sync — post-1.0 - -## Dependencies - -- `packages/alistigo-features/` — Gherkin acceptance specs -- `packages/alistigo-document-format/` — document schema and types (scaffolded) -- `packages/alistigo-document-editor/` — command handlers and projector (scaffolded) - -## References - -- Architecture constraints (C1–C8): [`projects/alistigo-ai/architecture.md`](../../projects/alistigo-ai/architecture.md) -- UI library & i18n stack (ADR 0001): [`projects/alistigo-ai/adrs/0001-ui-library.md`](../../projects/alistigo-ai/adrs/0001-ui-library.md) -- Domain ubiquitous language: [`projects/alistigo-ai/domain/glossary.md`](../../projects/alistigo-ai/domain/glossary.md) -- Research & decisions log: [`projects/alistigo-ai/notes.md`](../../projects/alistigo-ai/notes.md) -- Implementation tasks: [`ai/epics/alistigo-ai-m1/`](../epics/alistigo-ai-m1/) diff --git a/.agents/prds/alistigo-ai-m2.md b/.agents/prds/alistigo-ai-m2.md deleted file mode 100644 index bc81838e..00000000 --- a/.agents/prds/alistigo-ai-m2.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -name: alistigo-ai-m2 -description: Artifact Playground & Common Architecture — generic harness, config format packages, and artifact manager -status: backlog -created: 2026-06-11T14:20:20Z ---- - -# PRD: Alistigo AI — M2 Artifact Playground & Common Architecture (v0.3.0) - -**Status:** Backlog -**Milestone:** M2 -**Depends on:** M1 (v0.2.0) - -## Executive Summary - -M1 ships a single hardwired list artifact in a single hardwired app. M2 extracts the -plumbing into a **reusable platform**: a generic Artifact Playground that can host *any* -`@alistigo` artifact, a config format system so artifacts are consistently configurable, -and an artifact manager that resolves artifact names to CDN URLs and boots them. This is -foundational infrastructure — every future artifact plugs into this system without -repeating the iframe/host wiring. - -## Problem Statement - -M1 couples the list UI, the embedding harness, and the app entrypoint together. Building -a second artifact would mean copying all of that scaffolding. M2 decouples them so the -platform is built once and artifacts are independently deliverable. - -## User Stories - -- As a **developer**, I can open the Artifact Playground, select an artifact type and - language, and see it running inside a Claude-like iframe — so I can develop and test - artifacts in a realistic embedding context. -- As a **developer**, I can click "Reload" to force-refresh the iframe, and "Clear Data" - to wipe localStorage — so I can iterate quickly without manual browser steps. -- As a **developer**, I can toggle the list artifact's `readonly` mode — so I can verify - the display-only rendering path without modifying code. -- As a **developer**, the playground iframe respects the same sandbox constraints as - Claude's real artifact iframe — so behavior in the playground matches production. - -## Functional Requirements - -| Req | Description | -|-----|-------------| -| F1 | Rename `packages/alistigo-artifact` → `packages/alistigo-artifact-list` (npm: `@alistigo/artifact-list`); update all references | -| F2 | Rename `apps/alistigo-list-embedded-app` → `apps/alistigo-artifact-playground` | -| F3 | `@alistigo/artifact-config-list-format`: JSON Schema + TS types for list-specific config; includes `readonly` (boolean, default false) | -| F4 | `@alistigo/artifact-config-format`: base config schema (`{ "app": "", ... }`) + discriminated union combining all known per-artifact schemas; validates a config document against the full schema; depends on `@alistigo/artifact-config-list-format` | -| F5 | `@alistigo/artifact-manager`: reads config JSON from host page, validates via `@alistigo/artifact-config-format`, resolves `config.app` to CDN UMD URL, injects `