aw-spec-cli 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +291 -0
- package/assets/docs/UI.Visualization/PACKAGING.md +191 -0
- package/assets/docs/UI.Visualization/UI.Visualization.Reference.pack.txt +11768 -0
- package/assets/docs/UI.Visualization/UI.Visualization.pack.txt +11214 -0
- package/assets/docs/UI.Visualization/pack-foundation.ps1 +165 -0
- package/assets/docs/UI.Visualization/pack-foundation.sh +206 -0
- package/assets/docs/UI.Visualization/pack-reference-foundation.ps1 +159 -0
- package/assets/docs/UI.Visualization/pack-reference-foundation.sh +205 -0
- package/assets/docs/UI.Visualization/unpack-foundation.ps1 +126 -0
- package/assets/docs/UI.Visualization/unpack-foundation.sh +217 -0
- package/assets/docs/UI.Visualization/unpack-reference-foundation.ps1 +129 -0
- package/assets/docs/UI.Visualization/unpack-reference-foundation.sh +218 -0
- package/assets/docs/domainspecs/UIVisualization/chart-bubble.md +70 -0
- package/assets/docs/domainspecs/UIVisualization/chart-dimred.md +58 -0
- package/assets/docs/domainspecs/UIVisualization/chart-heatmap.md +62 -0
- package/assets/docs/domainspecs/UIVisualization/chart-network.md +69 -0
- package/assets/docs/domainspecs/UIVisualization/chart-parallel.md +75 -0
- package/assets/docs/domainspecs/UIVisualization/chart-scurve.md +66 -0
- package/assets/docs/domainspecs/UIVisualization/chart-survival.md +69 -0
- package/assets/docs/domainspecs/UIVisualization/chart-trellis.md +68 -0
- package/assets/docs/domainspecs/UIVisualization/chart-violin.md +61 -0
- package/assets/docs/domainspecs/UIVisualization/chart-volcano.md +63 -0
- package/assets/docs/domainspecs/UIVisualization/charting-standards.domain.md +80 -0
- package/assets/docs/domainspecs/UIVisualization/clean-architecture.domain.md +87 -0
- package/assets/docs/domainspecs/UIVisualization/coding-standards.domain.md +47 -0
- package/assets/docs/domainspecs/UIVisualization/comandrulemap.md +130 -0
- package/assets/docs/domainspecs/UIVisualization/component-contracts.domain.md +67 -0
- package/assets/docs/domainspecs/UIVisualization/data-source.domain.md +68 -0
- package/assets/docs/domainspecs/UIVisualization/domain-requirements.md +110 -0
- package/assets/docs/domainspecs/UIVisualization/folder-structure.domain.md +55 -0
- package/assets/docs/domainspecs/UIVisualization/state-management.domain.md +67 -0
- package/assets/docs/domainspecs/UIVisualization/testing.domain.md +52 -0
- package/assets/docs/domainspecs/UIVisualization/ui-viz-terms.md +39 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +54 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +142 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/manifest.d.ts +31 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +91 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/update-engine.d.ts +52 -0
- package/dist/utils/update-engine.d.ts.map +1 -0
- package/dist/utils/update-engine.js +203 -0
- package/dist/utils/update-engine.js.map +1 -0
- package/package.json +1 -1
- package/assets/docs/requirement-spec.txt +0 -15
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Component Contracts (Adapters) — UI Visualization Domain
|
|
2
|
+
|
|
3
|
+
> The props-driven contract and the adapter pattern. NON-NEGOTIABLE.
|
|
4
|
+
> Commands: `/aw-spec-plan`, `/aw-spec-tasks`, `/aw-spec-implement`.
|
|
5
|
+
|
|
6
|
+
## Props-driven, domain-agnostic
|
|
7
|
+
|
|
8
|
+
Every generic chart is **fully data-driven**: the caller supplies data, labels, colours, axis
|
|
9
|
+
types, and thresholds. A generic chart has **no** knowledge of the domain — the same `BubbleChart`
|
|
10
|
+
serves drug potency, portfolio risk, and product effort/impact.
|
|
11
|
+
|
|
12
|
+
Contract for a generic chart's props:
|
|
13
|
+
- **Data first** — required positional-feel props (`matrix`, `series`, `curves`, `arms`,
|
|
14
|
+
`points`, `panels`, `nodes`/`edges`, `groups`, `dimensions`/`traces`).
|
|
15
|
+
- **Labels explicit** — axis/legend/unit labels are required where the chart can't sensibly
|
|
16
|
+
default them; never hard-code a domain word.
|
|
17
|
+
- **Colours optional** — default from the shared palette; accept overrides per series.
|
|
18
|
+
- **`height?` optional** — omit for responsive fill (see [[charting-standards.domain]]).
|
|
19
|
+
- **`meta`/`metadata`** — open `Record<string,…>` for tooltip enrichment, never typed to a domain.
|
|
20
|
+
|
|
21
|
+
## The adapter pattern
|
|
22
|
+
|
|
23
|
+
A **thin adapter** is the only place domain types meet a chart. It maps a project type into the
|
|
24
|
+
generic chart's props and adds domain labels/colours. Adapters live in `components/charts/`
|
|
25
|
+
(NOT in `generic/`).
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
// Adapter: domain TrialArm[] → SurvivalCurveChart
|
|
29
|
+
'use client'
|
|
30
|
+
import { SurvivalCurveChart } from '@/components/charts/generic'
|
|
31
|
+
import type { TrialArm } from '@/lib/types/pharma'
|
|
32
|
+
|
|
33
|
+
export default function KaplanMeierChart({ arms, height }: { arms: TrialArm[]; height?: number }) {
|
|
34
|
+
return (
|
|
35
|
+
<SurvivalCurveChart
|
|
36
|
+
arms={arms.map(a => ({
|
|
37
|
+
label: a.name, color: a.color, medianTime: a.medianSurvival,
|
|
38
|
+
points: a.points.map(p => ({ time: p.time, survival: p.survival,
|
|
39
|
+
ciLower: p.ciLower, ciUpper: p.ciUpper, nAtRisk: p.nAtRisk })),
|
|
40
|
+
}))}
|
|
41
|
+
timeLabel="Days" survivalLabel="Survival (%)" medianLabel="mOS"
|
|
42
|
+
curveType="OS" pValue="< 0.001" showCI height={height}
|
|
43
|
+
/>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## When to skip the adapter
|
|
49
|
+
|
|
50
|
+
If a page already holds data in a generic shape (or the project is itself generic), call the
|
|
51
|
+
generic chart directly from the page with inline props — no adapter needed. Adapters exist to
|
|
52
|
+
keep **domain vocabulary out of pages** and **out of the generic ring**.
|
|
53
|
+
|
|
54
|
+
## Rules
|
|
55
|
+
|
|
56
|
+
- One adapter per (domain-type → chart) pairing; name it for the domain concept
|
|
57
|
+
(`CompoundScatterPlot`, `BiomarkerHeatmap`), not the chart.
|
|
58
|
+
- Adapters are **pure mapping** — no data fetching, no store mutation; they receive data as props.
|
|
59
|
+
- Never widen a generic chart's props with a domain field — add the field to `meta`/`metadata`
|
|
60
|
+
instead, or map it to an existing generic prop.
|
|
61
|
+
- Keep generic props **serialisable** (numbers, strings, arrays) so re-render diffing stays cheap
|
|
62
|
+
(see [[charting-standards.domain]]).
|
|
63
|
+
|
|
64
|
+
## Related
|
|
65
|
+
- [[charting-standards.domain]] — the base every chart builds on
|
|
66
|
+
- [[clean-architecture.domain]] — adapter is the dependency seam
|
|
67
|
+
- All `chart-*` files specify each chart's exact prop contract.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Data Source Abstraction — UI Visualization Domain
|
|
2
|
+
|
|
3
|
+
> How chart data enters the app. NON-NEGOTIABLE.
|
|
4
|
+
> Commands: `/aw-spec-plan`, `/aw-spec-tasks`, `/aw-spec-implement`.
|
|
5
|
+
|
|
6
|
+
## Three source modes, one contract
|
|
7
|
+
|
|
8
|
+
The same dataset shape feeds the charts regardless of origin — the **repository/specification**
|
|
9
|
+
analog for the front-end:
|
|
10
|
+
|
|
11
|
+
| Mode | Phase | Origin | Wiring |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| `sample` | 1 | hard-coded `lib/sample-data` | default; renders on first paint |
|
|
14
|
+
| `excel` | 1 | client-side `.xlsx` upload (SheetJS) | `ExcelDropZone` → parser → `loadExcel` command |
|
|
15
|
+
| `api` | 2 | REST endpoint | `ApiDataSource` → `loadExcel`-shaped result |
|
|
16
|
+
|
|
17
|
+
Charts never know the source — they consume the store dataset. Swapping `sample`→`excel`→`api`
|
|
18
|
+
changes **no chart code** (see [[clean-architecture.domain]], [[state-management.domain]]).
|
|
19
|
+
|
|
20
|
+
## Excel ingest
|
|
21
|
+
|
|
22
|
+
- Parsing is **client-side only** (no server) via dynamic `import('xlsx')`.
|
|
23
|
+
- A generic parser returns raw rows per sheet (`Record<string, ParsedWorkbook>`); a
|
|
24
|
+
**project parser** maps those rows into the domain dataset and dispatches `loadExcel`.
|
|
25
|
+
- The drop-zone validates extension (`.xlsx/.xls`), shows parse state, and reports row counts.
|
|
26
|
+
- Sheet/column names are a **documented contract** shipped with the template
|
|
27
|
+
(`public/sample-data.xlsx` is the canonical example).
|
|
28
|
+
|
|
29
|
+
## Canonical example (agent reference)
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
// lib/excel/parse-excel.ts — generic: workbook → rows per sheet
|
|
33
|
+
import type { ExcelRow } from '@/lib/types'
|
|
34
|
+
export type ParsedWorkbook = Record<string, ExcelRow[]>
|
|
35
|
+
|
|
36
|
+
export async function parseExcelFile(file: File): Promise<ParsedWorkbook> {
|
|
37
|
+
const XLSX = await import('xlsx')
|
|
38
|
+
const wb = XLSX.read(await file.arrayBuffer(), { type: 'array' })
|
|
39
|
+
return Object.fromEntries(
|
|
40
|
+
wb.SheetNames.map(n => [n, XLSX.utils.sheet_to_json<ExcelRow>(wb.Sheets[n], { defval: null })]),
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
// ExcelDropZone wires parse → command
|
|
47
|
+
const wb = await parseExcelFile(file) // generic rows
|
|
48
|
+
const dataset = mapWorkbookToDomain(wb) // project mapping
|
|
49
|
+
loadExcel(dataset) // store command (see [[state-management.domain]])
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Phase-2 API source (forward contract)
|
|
53
|
+
|
|
54
|
+
- Add `lib/data-source/ApiDataSource.ts` that fetches and returns the **same dataset shape** the
|
|
55
|
+
Excel mapper produces, then calls `loadExcel` (or `setSourceMode('api', …)`).
|
|
56
|
+
- Set `NEXT_PUBLIC_API_URL`; no chart or adapter changes.
|
|
57
|
+
|
|
58
|
+
## Rules
|
|
59
|
+
|
|
60
|
+
- No server-side Excel handling in Phase 1; keep ingest in the browser.
|
|
61
|
+
- The dataset shape is the single contract between source and charts — version it deliberately.
|
|
62
|
+
- Never parse domain meaning inside `components/charts/generic/` — mapping lives in the project
|
|
63
|
+
parser / adapter (see [[component-contracts.domain]]).
|
|
64
|
+
|
|
65
|
+
## Related
|
|
66
|
+
- [[state-management.domain]] — `loadExcel` command
|
|
67
|
+
- [[component-contracts.domain]] — adapters consume the dataset
|
|
68
|
+
- [[clean-architecture.domain]]
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# DOMAIN REQUIREMENTS (project-specific)
|
|
2
|
+
|
|
3
|
+
> Project-specific input for the **UI Data-Visualization** domain, **updated independently per
|
|
4
|
+
> project**. The engineering constitution stays domain-agnostic and supreme; this file holds the
|
|
5
|
+
> per-project chart enumeration and the headline tech profile. Detailed charting *rules* are
|
|
6
|
+
> expanded in the sibling files in this folder.
|
|
7
|
+
>
|
|
8
|
+
> This domain targets a **Next.js / React / Plotly** front-end (not the .NET backend). It composes
|
|
9
|
+
> with the technology base where applicable and overrides the runtime/stack sections below.
|
|
10
|
+
>
|
|
11
|
+
> Replace `<SampleProjectName>` and trim the **Chart Selection** list to the charts the project
|
|
12
|
+
> actually needs.
|
|
13
|
+
|
|
14
|
+
=====================================================================
|
|
15
|
+
[DOMAIN: Chart Catalog / Features]
|
|
16
|
+
=====================================================================
|
|
17
|
+
The visualization domain is organised as **one feature per chart type**. Each chart is a
|
|
18
|
+
**domain-agnostic, props-driven component** in the generic library, optionally wrapped by a thin
|
|
19
|
+
**adapter** that maps project data into its props (see [[clean-architecture.domain]],
|
|
20
|
+
[[component-contracts.domain]]). The 10 built-in charts:
|
|
21
|
+
|
|
22
|
+
- **Heatmap** — value matrix, colour-mapped by intensity. See [[chart-heatmap]].
|
|
23
|
+
- **BubbleChart** — multi-dimensional scatter (x · y · size · colour). See [[chart-bubble]].
|
|
24
|
+
- **SCurveChart** — sigmoidal / logistic growth with inflection markers. See [[chart-scurve]].
|
|
25
|
+
- **SurvivalCurveChart** — Kaplan-Meier step curves with CI shading. See [[chart-survival]].
|
|
26
|
+
- **VolcanoPlot** — magnitude vs. significance with threshold quadrants. See [[chart-volcano]].
|
|
27
|
+
- **DimRedPlot** — 2-D scatter of PCA / t-SNE / UMAP coordinates. See [[chart-dimred]].
|
|
28
|
+
- **ParallelCoordinatesPlot** — multi-axis polylines, one per observation. See [[chart-parallel]].
|
|
29
|
+
- **ViolinPlot** — KDE distribution + box per group. See [[chart-violin]].
|
|
30
|
+
- **NetworkGraph** — node-edge graph with built-in spring layout. See [[chart-network]].
|
|
31
|
+
- **TrellisGrid** — small multiples, same chart type per panel. See [[chart-trellis]].
|
|
32
|
+
|
|
33
|
+
=====================================================================
|
|
34
|
+
[DOMAIN: Chart Selection — REQUIRED INPUT]
|
|
35
|
+
=====================================================================
|
|
36
|
+
> **The developer specifies which charts the project needs when giving the requirement.**
|
|
37
|
+
|
|
38
|
+
- The requirement names a **subset** of the catalog (e.g. *"Heatmap, Volcano and Survival"*) or
|
|
39
|
+
says **"all plots"** to include every chart.
|
|
40
|
+
- A skill reads the selection and loads **only** the matching `chart-*` rule files
|
|
41
|
+
(see [[comandrulemap]]). Unselected charts are **not** scaffolded — their page route, adapter,
|
|
42
|
+
nav entry, and example data are omitted.
|
|
43
|
+
- Selection keywords are case-insensitive and accept either the **component name**
|
|
44
|
+
(`BubbleChart`) or the **friendly name** (`Bubble`, `bubble chart`). "all" / "all plots" /
|
|
45
|
+
"all charts" select the full catalog.
|
|
46
|
+
- Default when unspecified: **ask the developer**; do not assume "all".
|
|
47
|
+
|
|
48
|
+
| Selection token (any) | Rule file | Component |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| heatmap | [[chart-heatmap]] | `Heatmap` |
|
|
51
|
+
| bubble · bubble chart | [[chart-bubble]] | `BubbleChart` |
|
|
52
|
+
| s-curve · scurve · sigmoid · dose-response | [[chart-scurve]] | `SCurveChart` |
|
|
53
|
+
| survival · kaplan-meier · km · retention | [[chart-survival]] | `SurvivalCurveChart` |
|
|
54
|
+
| volcano | [[chart-volcano]] | `VolcanoPlot` |
|
|
55
|
+
| dimred · pca · tsne · umap · dimensionality | [[chart-dimred]] | `DimRedPlot` |
|
|
56
|
+
| parallel · parallel-coords · parcoords | [[chart-parallel]] | `ParallelCoordinatesPlot` |
|
|
57
|
+
| violin · distribution | [[chart-violin]] | `ViolinPlot` |
|
|
58
|
+
| network · graph · node-edge | [[chart-network]] | `NetworkGraph` |
|
|
59
|
+
| trellis · facet · small-multiples | [[chart-trellis]] | `TrellisGrid` |
|
|
60
|
+
|
|
61
|
+
=====================================================================
|
|
62
|
+
[DOMAIN: subsection pointers]
|
|
63
|
+
=====================================================================
|
|
64
|
+
[DOMAIN: Folder Structure Profile] -> docs/domainspecs/UIVisualization/folder-structure.domain.md
|
|
65
|
+
[DOMAIN: Clean Architecture / Layering] -> docs/domainspecs/UIVisualization/clean-architecture.domain.md
|
|
66
|
+
[DOMAIN: State / Data Flow (CQRS analog)] -> docs/domainspecs/UIVisualization/state-management.domain.md
|
|
67
|
+
[DOMAIN: Data Source Abstraction] -> docs/domainspecs/UIVisualization/data-source.domain.md
|
|
68
|
+
[DOMAIN: Charting Standards (base wrap)] -> docs/domainspecs/UIVisualization/charting-standards.domain.md
|
|
69
|
+
[DOMAIN: Component Contracts (adapters)] -> docs/domainspecs/UIVisualization/component-contracts.domain.md
|
|
70
|
+
[DOMAIN: Coding Standards Profile] -> docs/domainspecs/UIVisualization/coding-standards.domain.md
|
|
71
|
+
[DOMAIN: Testing Profile] -> docs/domainspecs/UIVisualization/testing.domain.md
|
|
72
|
+
[DOMAIN: Ubiquitous Language] -> docs/domainspecs/UIVisualization/ui-viz-terms.md
|
|
73
|
+
[DOMAIN: Per-chart rules] -> docs/domainspecs/UIVisualization/chart-<name>.md (load per selection)
|
|
74
|
+
|
|
75
|
+
=====================================================================
|
|
76
|
+
[DOMAIN: Tech Profile (overrides technology stack section)]
|
|
77
|
+
=====================================================================
|
|
78
|
+
- **Framework:** Next.js 16 (App Router, Turbopack); React 19; TypeScript 5 strict.
|
|
79
|
+
- **Charting:** Plotly.js (`plotly.js-dist-min`) loaded via a single SSR-safe base wrapper
|
|
80
|
+
(`PlotlyChart`) using dynamic import (see [[charting-standards.domain]]).
|
|
81
|
+
- **State:** Zustand 5 (see [[state-management.domain]]).
|
|
82
|
+
- **Data ingest:** SheetJS (`xlsx`) client-side; optional REST `ApiDataSource` for Phase 2
|
|
83
|
+
(see [[data-source.domain]]).
|
|
84
|
+
- **Styling:** Tailwind CSS 3 + dark "glass" theme (see [[charting-standards.domain]]).
|
|
85
|
+
- **Scaffold source:** `templates/AppWeaver.UI.Visualization` (generic) and
|
|
86
|
+
`templates/features/UIVisualization.PharmaReference` (reference); packed under
|
|
87
|
+
`docs/UI.Visualization/` (see PACKAGING.md there).
|
|
88
|
+
|
|
89
|
+
=====================================================================
|
|
90
|
+
[DOMAIN: Platform Topology]
|
|
91
|
+
=====================================================================
|
|
92
|
+
- Target runtime: static-export or Node SSR (Vercel, container, or any static host). No backend
|
|
93
|
+
required for Phase 1 — charts render from sample/Excel data fully client-side.
|
|
94
|
+
- Phase 2 wires a REST API behind the `data-source` abstraction with **zero chart changes**
|
|
95
|
+
(see [[data-source.domain]]).
|
|
96
|
+
- Performance targets: first chart interactive < 1.5 s on a warm cache; a single Plotly chart
|
|
97
|
+
re-render < 100 ms for typical (≤ 5k-point) datasets.
|
|
98
|
+
|
|
99
|
+
=====================================================================
|
|
100
|
+
[DOMAIN: Governance Overrides]
|
|
101
|
+
=====================================================================
|
|
102
|
+
- The **generic chart library is closed for domain logic** — additions/edits there require review
|
|
103
|
+
by a UI Principal Engineer (no project- or domain-specific code in `components/charts/generic/`).
|
|
104
|
+
- New chart types beyond the 10-chart catalog require a constitution amendment + a new
|
|
105
|
+
`chart-<name>.md` rule file authored to the same contract.
|
|
106
|
+
|
|
107
|
+
## Related
|
|
108
|
+
- [[folder-structure.domain]] · [[clean-architecture.domain]] · [[state-management.domain]] ·
|
|
109
|
+
[[data-source.domain]] · [[charting-standards.domain]] · [[component-contracts.domain]] ·
|
|
110
|
+
[[coding-standards.domain]] · [[testing.domain]] · [[ui-viz-terms]] · [[comandrulemap]]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Folder Structure — UI Visualization Domain
|
|
2
|
+
|
|
3
|
+
> Next.js App-Router layout for the visualization front-end. NON-NEGOTIABLE.
|
|
4
|
+
> Commands: `/aw-spec-plan`, `/aw-spec-tasks`, `/aw-spec-implement`. Replace `<SampleProjectName>`.
|
|
5
|
+
|
|
6
|
+
## Layout
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
<SampleProjectName>/ (sentinel: AppWeaver.UI.Visualization)
|
|
10
|
+
package.json · tsconfig.json · next.config.ts · tailwind.config.ts
|
|
11
|
+
public/ static assets + sample-data.xlsx
|
|
12
|
+
scripts/ generate-sample-excel.mjs (optional)
|
|
13
|
+
src/
|
|
14
|
+
app/ App Router — one route folder per SELECTED chart
|
|
15
|
+
layout.tsx root layout: <TopNav/> + bg-mesh
|
|
16
|
+
globals.css theme tokens, glass/gradient classes, animations
|
|
17
|
+
page.tsx catalog/dashboard landing
|
|
18
|
+
<chart-route>/page.tsx e.g. heatmap/ bubble/ volcano/ … (only selected)
|
|
19
|
+
components/
|
|
20
|
+
charts/
|
|
21
|
+
PlotlyChart.tsx SSR-safe Plotly base wrapper (see [[charting-standards.domain]])
|
|
22
|
+
generic/ ← DOMAIN-AGNOSTIC chart library (closed to domain logic)
|
|
23
|
+
index.ts barrel export
|
|
24
|
+
Heatmap.tsx · BubbleChart.tsx · SCurveChart.tsx · SurvivalCurveChart.tsx
|
|
25
|
+
VolcanoPlot.tsx · DimRedPlot.tsx · ParallelCoordinatesPlot.tsx
|
|
26
|
+
ViolinPlot.tsx · NetworkGraph.tsx · TrellisGrid.tsx
|
|
27
|
+
<DomainAdapter>.tsx thin adapters (project-specific) (see [[component-contracts.domain]])
|
|
28
|
+
layout/TopNav.tsx horizontal tab nav (one tab per selected chart)
|
|
29
|
+
excel-loader/ExcelDropZone.tsx drag-drop ingest (see [[data-source.domain]])
|
|
30
|
+
data-table/ · ui/ optional supporting components
|
|
31
|
+
lib/
|
|
32
|
+
types/ shared + domain data types
|
|
33
|
+
utils.ts cn(), formatters, curve generators
|
|
34
|
+
excel/ workbook parser (see [[data-source.domain]])
|
|
35
|
+
store/
|
|
36
|
+
data-store.ts Zustand store (see [[state-management.domain]])
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Rules
|
|
40
|
+
|
|
41
|
+
- The **generic chart library** lives only in `components/charts/generic/` and is
|
|
42
|
+
**domain-agnostic** — no project types, no business logic, no hard-coded labels
|
|
43
|
+
(see [[clean-architecture.domain]], [[component-contracts.domain]]).
|
|
44
|
+
- **One route folder per selected chart** under `src/app/`; unselected charts have **no**
|
|
45
|
+
route, no nav tab, no example data (see [[domain-requirements]] chart-selection).
|
|
46
|
+
- Domain **adapters** sit in `components/charts/` (NOT inside `generic/`) and map project data
|
|
47
|
+
to generic props.
|
|
48
|
+
- Cross-cutting files (`PlotlyChart.tsx`, `globals.css`, `TopNav.tsx`, `data-store.ts`,
|
|
49
|
+
the base config files) MUST stay where the AppWeaver template places them.
|
|
50
|
+
- `@/*` path alias maps to `./src/*` — import charts as
|
|
51
|
+
`@/components/charts/generic`.
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
- [[clean-architecture.domain]] · [[component-contracts.domain]] · [[charting-standards.domain]] ·
|
|
55
|
+
[[state-management.domain]] · [[data-source.domain]]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# State Management (CQRS analog) — UI Visualization Domain
|
|
2
|
+
|
|
3
|
+
> The front-end read/write separation. NON-NEGOTIABLE.
|
|
4
|
+
> Commands: `/aw-spec-plan`, `/aw-spec-tasks`, `/aw-spec-implement`.
|
|
5
|
+
|
|
6
|
+
## Read / write separation
|
|
7
|
+
|
|
8
|
+
CQRS maps to the client store as **queries = selectors** and **commands = actions**:
|
|
9
|
+
|
|
10
|
+
- **Queries (reads)** — components read slices of the Zustand store via the hook
|
|
11
|
+
(`const { compounds } = useDataStore()`). Reads are pure; no side effects in render.
|
|
12
|
+
- **Commands (writes)** — every mutation is a **named store action**, never a raw `set` from a
|
|
13
|
+
component. Actions: `loadExcel(partial)`, `resetToSample()`, `toggleCurve(id)`,
|
|
14
|
+
`setSourceMode(mode, fileName)`.
|
|
15
|
+
|
|
16
|
+
A component MUST NOT mutate store state directly — it dispatches an action, exactly as a backend
|
|
17
|
+
endpoint dispatches a command via the mediator instead of touching the `DbContext`.
|
|
18
|
+
|
|
19
|
+
## Store shape
|
|
20
|
+
|
|
21
|
+
- A single `useDataStore` (Zustand) holds: the active **dataset** (the project's chart data), the
|
|
22
|
+
**source mode** (`'sample' | 'excel' | 'api'`), and any **view state** (e.g. selected series ids).
|
|
23
|
+
- The store seeds from **sample data** so charts render on first paint with zero backend
|
|
24
|
+
(see [[data-source.domain]]).
|
|
25
|
+
- Loading new data is a single command that swaps the dataset and flips `sourceMode` — charts
|
|
26
|
+
re-render reactively with no per-chart wiring.
|
|
27
|
+
|
|
28
|
+
## Canonical example (agent reference)
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
// store/data-store.ts
|
|
32
|
+
'use client'
|
|
33
|
+
import { create } from 'zustand'
|
|
34
|
+
import { SAMPLE } from '@/lib/sample-data'
|
|
35
|
+
|
|
36
|
+
type SourceMode = 'sample' | 'excel' | 'api'
|
|
37
|
+
|
|
38
|
+
interface DataStore {
|
|
39
|
+
dataset: typeof SAMPLE
|
|
40
|
+
sourceMode: SourceMode
|
|
41
|
+
// commands (writes) — the ONLY way to mutate
|
|
42
|
+
loadExcel: (partial: Partial<typeof SAMPLE>) => void
|
|
43
|
+
resetToSample: () => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const useDataStore = create<DataStore>((set) => ({
|
|
47
|
+
dataset: SAMPLE,
|
|
48
|
+
sourceMode: 'sample',
|
|
49
|
+
loadExcel: (partial) =>
|
|
50
|
+
set(s => ({ dataset: { ...s.dataset, ...partial }, sourceMode: 'excel' })),
|
|
51
|
+
resetToSample: () => set({ dataset: SAMPLE, sourceMode: 'sample' }),
|
|
52
|
+
}))
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Rules
|
|
56
|
+
|
|
57
|
+
- One store module (`store/data-store.ts`). Split into slices only when it exceeds ~150 lines.
|
|
58
|
+
- Actions are the command surface — name them as verbs; keep them pure-ish (compute → `set`).
|
|
59
|
+
- Cross-component data load may also broadcast a `window` `CustomEvent`
|
|
60
|
+
(`appweaver:excel-loaded`) — the front-end analog of a **domain event**.
|
|
61
|
+
- No data fetching inside the store for Phase 1; the **data-source** layer owns ingest and hands
|
|
62
|
+
the result to a command (see [[data-source.domain]]).
|
|
63
|
+
|
|
64
|
+
## Related
|
|
65
|
+
- [[data-source.domain]] — where datasets come from
|
|
66
|
+
- [[clean-architecture.domain]] — the data layer feeds pages, never imports charts
|
|
67
|
+
- [[component-contracts.domain]]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Testing — UI Visualization Domain
|
|
2
|
+
|
|
3
|
+
> Test profile for the viz front-end. Commands: `/aw-spec-plan`, `/aw-spec-tasks`, `/aw-spec-implement`.
|
|
4
|
+
|
|
5
|
+
## What to test (priority order)
|
|
6
|
+
|
|
7
|
+
1. **Adapters** (highest value) — pure mapping functions: domain type → generic props. Assert the
|
|
8
|
+
produced `series`/`arms`/`curves`/`matrix` and labels match the input. No DOM needed.
|
|
9
|
+
2. **Data layer** — the Excel parser and any workbook→domain mapper: given a fixture workbook (or
|
|
10
|
+
row array), assert the parsed dataset (counts, fields, null handling, derived curves).
|
|
11
|
+
3. **Store actions** — `loadExcel`, `resetToSample`, `toggleCurve` change state as specified
|
|
12
|
+
(see [[state-management.domain]]).
|
|
13
|
+
4. **Smoke render** — each selected chart renders without throwing when given representative data
|
|
14
|
+
(mock `plotly.js-dist-min` so no real canvas is needed).
|
|
15
|
+
|
|
16
|
+
## How
|
|
17
|
+
|
|
18
|
+
- **Vitest** (or Jest) + **@testing-library/react** for component smoke tests.
|
|
19
|
+
- **Mock Plotly**: `vi.mock('plotly.js-dist-min', () => ({ react: vi.fn(), purge: vi.fn() }))` —
|
|
20
|
+
assert the wrapper called `react` with the expected trace count, not pixels.
|
|
21
|
+
- Adapters and parsers are plain functions — unit-test them directly, no mocks.
|
|
22
|
+
- A `build` (type-check + `next build`) is the compile-time gate; keep it green.
|
|
23
|
+
|
|
24
|
+
## Example (agent reference)
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { describe, it, expect } from 'vitest'
|
|
28
|
+
import { compoundsToBubbleSeries } from '@/components/charts/CompoundScatterPlot'
|
|
29
|
+
|
|
30
|
+
it('groups compounds by target into series with log-scaled y', () => {
|
|
31
|
+
const series = compoundsToBubbleSeries([
|
|
32
|
+
{ name: 'A', target: 'EGFR', molecularWeight: 393, ic50_nM: 10, selectivityRatio: 40 },
|
|
33
|
+
])
|
|
34
|
+
expect(series).toHaveLength(1)
|
|
35
|
+
expect(series[0].seriesLabel).toBe('EGFR')
|
|
36
|
+
expect(series[0].points[0].y).toBeCloseTo(1) // log10(10)
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
> Tip: export the mapping function from the adapter (e.g. `compoundsToBubbleSeries`) so it is
|
|
41
|
+
> unit-testable without rendering.
|
|
42
|
+
|
|
43
|
+
## Rules
|
|
44
|
+
|
|
45
|
+
- Don't assert on Plotly's internal DOM — assert on the **inputs** you hand Plotly.
|
|
46
|
+
- One fixture workbook per project lives beside the parser tests; mirror the shipped
|
|
47
|
+
`public/sample-data.xlsx` columns.
|
|
48
|
+
- Only test charts that are **selected** for the project (see [[domain-requirements]]).
|
|
49
|
+
|
|
50
|
+
## Related
|
|
51
|
+
- [[component-contracts.domain]] · [[state-management.domain]] · [[data-source.domain]] ·
|
|
52
|
+
[[coding-standards.domain]]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Ubiquitous Language — UI Visualization Domain
|
|
2
|
+
|
|
3
|
+
> Shared vocabulary for the visualization front-end. Commands: `/aw-spec-specify`, `/aw-spec-clarify`.
|
|
4
|
+
|
|
5
|
+
## Core terms
|
|
6
|
+
|
|
7
|
+
- **Generic chart** — a domain-agnostic, props-driven Plotly component in
|
|
8
|
+
`components/charts/generic/`. Knows nothing about any project domain. The 10 in the catalog.
|
|
9
|
+
- **Adapter** — a thin component mapping a project/domain type into a generic chart's props; lives
|
|
10
|
+
in `components/charts/` (not `generic/`). The only place domain vocabulary meets a chart.
|
|
11
|
+
- **Base wrapper** — `PlotlyChart`; the single SSR-safe Plotly mount every chart renders through.
|
|
12
|
+
- **Data source** — origin of chart data: `sample` (hard-coded), `excel` (client upload), or
|
|
13
|
+
`api` (Phase-2 REST). The store's `sourceMode`.
|
|
14
|
+
- **Dataset** — the project's chart-ready data held in the store; the contract between data source
|
|
15
|
+
and charts.
|
|
16
|
+
- **Command (action)** — a named store mutation (`loadExcel`, `resetToSample`, `toggleCurve`).
|
|
17
|
+
- **Query (selector)** — a read of store state from a component via `useDataStore`.
|
|
18
|
+
- **Chart selection** — the developer-specified subset of the catalog to scaffold (or "all plots").
|
|
19
|
+
- **Fill-height** — responsive sizing: a chart with no `height` fills its flex parent.
|
|
20
|
+
- **Series / arm / curve / panel / trace** — per-chart data groupings (see each `chart-*` file).
|
|
21
|
+
- **meta / metadata** — open key/value bag for tooltip enrichment; never a typed domain field.
|
|
22
|
+
|
|
23
|
+
## Chart friendly-name ↔ component
|
|
24
|
+
|
|
25
|
+
| Friendly name(s) | Component |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Heatmap | `Heatmap` |
|
|
28
|
+
| Bubble / Bubble chart | `BubbleChart` |
|
|
29
|
+
| S-Curve / Sigmoid / Dose-Response | `SCurveChart` |
|
|
30
|
+
| Survival / Kaplan-Meier / KM / Retention | `SurvivalCurveChart` |
|
|
31
|
+
| Volcano | `VolcanoPlot` |
|
|
32
|
+
| Dim. Reduction / PCA / t-SNE / UMAP | `DimRedPlot` |
|
|
33
|
+
| Parallel Coords / parcoords | `ParallelCoordinatesPlot` |
|
|
34
|
+
| Violin / Distribution | `ViolinPlot` |
|
|
35
|
+
| Network / Graph / Node-Edge | `NetworkGraph` |
|
|
36
|
+
| Trellis / Facet / Small-multiples | `TrellisGrid` |
|
|
37
|
+
|
|
38
|
+
## Related
|
|
39
|
+
- [[domain-requirements]] · [[component-contracts.domain]] · [[charting-standards.domain]]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,WAAW,SAwGpB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import inquirer from 'inquirer';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
3
7
|
import { copyAssets } from '../utils/copy-assets.js';
|
|
4
8
|
import { resolveAssetsPath } from '../utils/paths.js';
|
|
9
|
+
import { createManifest } from '../utils/manifest.js';
|
|
10
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
11
|
export const initCommand = new Command('init')
|
|
6
12
|
.description('Initialize a new AppWeaver Spec project in the current directory')
|
|
7
13
|
.argument('[directory]', 'Target directory (default: current directory)', '.')
|
|
@@ -10,7 +16,41 @@ export const initCommand = new Command('init')
|
|
|
10
16
|
.option('--dry-run', 'Show what would be done without making changes')
|
|
11
17
|
.action(async (directory, options) => {
|
|
12
18
|
const targetDir = directory === '.' ? process.cwd() : directory;
|
|
13
|
-
|
|
19
|
+
const manifestPath = path.join(targetDir, '.aw-spec', 'manifest.json');
|
|
20
|
+
// Check for existing project
|
|
21
|
+
const existingManifest = await fs.pathExists(manifestPath);
|
|
22
|
+
if (existingManifest && !options.dryRun) {
|
|
23
|
+
console.log(chalk.yellow('\n\u26A0\uFE0F Existing AppWeaver Spec project detected.'));
|
|
24
|
+
console.log(chalk.gray(` Manifest found at: ${manifestPath}`));
|
|
25
|
+
if (options.yes) {
|
|
26
|
+
console.log(chalk.yellow(' Use `aw-spec update` to update this project.'));
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
const { action } = await inquirer.prompt([
|
|
30
|
+
{
|
|
31
|
+
type: 'list',
|
|
32
|
+
name: 'action',
|
|
33
|
+
message: 'What would you like to do?',
|
|
34
|
+
choices: [
|
|
35
|
+
{ name: 'Update existing project (recommended)', value: 'update' },
|
|
36
|
+
{ name: 'Re-initialize (overwrite with fresh copy)', value: 'reinit' },
|
|
37
|
+
{ name: 'Cancel', value: 'cancel' },
|
|
38
|
+
],
|
|
39
|
+
default: 'update',
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
if (action === 'update') {
|
|
43
|
+
console.log(chalk.gray(' Run `aw-spec update` to update this project.'));
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
46
|
+
else if (action === 'cancel') {
|
|
47
|
+
console.log(chalk.gray('\nInitialization cancelled.'));
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
// action === 'reinit' continues below
|
|
51
|
+
console.log(chalk.yellow('\n Re-initializing (will overwrite existing files)...\n'));
|
|
52
|
+
}
|
|
53
|
+
console.log(`\n\uD83D\uDD27 Initializing AppWeaver Spec project in: ${targetDir}\n`);
|
|
14
54
|
// Determine agent
|
|
15
55
|
let agent = options.agent;
|
|
16
56
|
// If --yes flag and no explicit agent, use default (claude) without prompting
|
|
@@ -38,11 +78,11 @@ export const initCommand = new Command('init')
|
|
|
38
78
|
const assetsPath = await resolveAssetsPath();
|
|
39
79
|
const agentFolder = agent === 'claude' ? '.claude' : agent === 'kilocode' ? '.kilocode' : '.agents';
|
|
40
80
|
if (options.dryRun) {
|
|
41
|
-
console.log('
|
|
42
|
-
console.log(`
|
|
43
|
-
console.log(`
|
|
44
|
-
console.log(`
|
|
45
|
-
console.log(`
|
|
81
|
+
console.log('\uD83D\uDCCB Dry run - would copy the following:');
|
|
82
|
+
console.log(` \u2713 ${assetsPath}/.aw-spec -> ${targetDir}/.aw-spec`);
|
|
83
|
+
console.log(` \u2713 ${assetsPath}/docs -> ${targetDir}/docs`);
|
|
84
|
+
console.log(` \u2713 ${assetsPath}/${agentFolder} -> ${targetDir}/${agentFolder}`);
|
|
85
|
+
console.log(` \u2713 ${assetsPath}/docs/VerticalSlice -> ${targetDir}/docs/VerticalSlice`);
|
|
46
86
|
return;
|
|
47
87
|
}
|
|
48
88
|
// Copy assets
|
|
@@ -52,7 +92,14 @@ export const initCommand = new Command('init')
|
|
|
52
92
|
agent: agent,
|
|
53
93
|
overwrite: options.yes,
|
|
54
94
|
});
|
|
55
|
-
|
|
95
|
+
// Create manifest after successful copy
|
|
96
|
+
console.log('\n\uD83D\uDD0D Creating manifest...');
|
|
97
|
+
const packageJson = await fs.readJSON(path.resolve(__dirname, '../../package.json'));
|
|
98
|
+
const manifest = await createManifest(assetsPath, targetDir, packageJson.version);
|
|
99
|
+
await fs.ensureDir(path.dirname(manifestPath));
|
|
100
|
+
await fs.writeJSON(manifestPath, manifest, { spaces: 2 });
|
|
101
|
+
console.log(chalk.green(` \u2713 Manifest created (${Object.keys(manifest.files).length} files tracked)`));
|
|
102
|
+
console.log('\n\u2705 Project initialized successfully!');
|
|
56
103
|
console.log('\nNext steps:');
|
|
57
104
|
console.log(' aw-spec doctor # Verify the installation');
|
|
58
105
|
console.log(' aw-spec specify "Your feature description" # Start spec-driven development');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,aAAa,SA6ItB,CAAC"}
|