# entity-modeler-next

Vue 3 visual entity-modeling / class-diagram editor.
Distributed as a library package (`@g1cloud/entity-modeler-next`) and embedded in `bluework4-tool` (Nuxt/Vue/Mongo).

## Stack

TypeScript · Vue 3 · **Vue Flow** · Pinia (opt-in) · Vite (library mode) · Vitest · views built on `@g1cloud/open-bluesea-core` (BS) components

## Install

```bash
pnpm add @g1cloud/entity-modeler-next
```

Requires the peer dependencies `vue ^3.5.0` and `@g1cloud/bluesea` `>=5.0.0-beta.31 <6.0.0` (installed by the host).

## Usage

```ts
import { EntityModeler } from '@g1cloud/entity-modeler-next'
import '@g1cloud/entity-modeler-next/style.css'  // required — components render unstyled without it
```

## Structure

```
src/
  core/      logical/layout types (separated) · resolve (consistency) · routing · autolayout · propagation · validation · type catalogs. Framework-agnostic
  command/   Command (do/undo) · CommandStack · op/opSync (semantic op emit + CAS concurrency)
  editor/    reactive controller (composable wrapping CommandStack, EDITOR inject key) + axis modules split out of it
             (commandPlans · clipboardImport · hostSync · selection — each takes a minimal injected context)
  view/      Vue Flow components (DiagramCanvas · EntityNode · GroupNode · AssociationEdge · PropertyPanel · ValidationPanel, etc.)
             plus composables (useAttributeEditing · useResizableWidth · useTreeCollapse) and pure helpers
  adapter/   storage-schema mapping (persisted v1/v2 · fromPersisted/toPersisted/toPersistedV2 round-trip)
  agent/     natural-language → op track (symbolicOp · resolver · schema · buildAgentBatch)
  dev/       demo harness (excluded from the library build)
```

Core design: **layout references the logical model by `modelId` (one-way)**. The logical model carries no geo/waypoint/style.

## Scripts

```bash
pnpm dev            # demo harness dev server (src/dev)
pnpm test           # Vitest (unit)
pnpm test:coverage  # Vitest + v8 coverage report (no threshold — report only)
pnpm typecheck      # vue-tsc --noEmit
pnpm build          # library build (dist/)
pnpm verify         # headless GUI probe suite (scripts/verify-*.mjs) — boots the dev harness once, runs all probes
pnpm verify:floor    # raise the per-probe assertion-count floor to current (never lowers)
pnpm check          # CI gate: test && build
```

`check` is the entry point CI calls; `verify` runs the browser probes and is kept separate because it needs a
dev server and takes ~100s.

`verify` also enforces a per-probe **assertion-count floor** (`scripts/probe-assertion-floor.json`): a probe whose
executed-assertion total drops below its floor fails even if every remaining assertion passes — deleting an `ok()`
would otherwise shrink the denominator too and pass as `0/0`. Adding assertions needs no bookkeeping; only a
deliberate reduction requires editing the JSON by hand, and that diff is the review signal.
