aw-spec-cli 0.1.2 → 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.
Files changed (77) hide show
  1. package/README.md +291 -0
  2. package/assets/docs/ModularMonolith/ModularMonolith.Reference.pack.txt +25248 -0
  3. package/assets/docs/ModularMonolith/ModularMonolith.pack.txt +5726 -0
  4. package/assets/docs/ModularMonolith/pack-foundation.ps1 +145 -0
  5. package/assets/docs/ModularMonolith/pack-foundation.sh +196 -0
  6. package/assets/docs/ModularMonolith/pack-reference-foundation.ps1 +157 -0
  7. package/assets/docs/ModularMonolith/pack-reference-foundation.sh +209 -0
  8. package/assets/docs/ModularMonolith/unpack-foundation.ps1 +126 -0
  9. package/assets/docs/ModularMonolith/unpack-foundation.sh +217 -0
  10. package/assets/docs/ModularMonolith/unpack-reference-foundation.ps1 +129 -0
  11. package/assets/docs/ModularMonolith/unpack-reference-foundation.sh +218 -0
  12. package/assets/docs/UI.Visualization/PACKAGING.md +191 -0
  13. package/assets/docs/UI.Visualization/UI.Visualization.Reference.pack.txt +11768 -0
  14. package/assets/docs/UI.Visualization/UI.Visualization.pack.txt +11214 -0
  15. package/assets/docs/UI.Visualization/pack-foundation.ps1 +165 -0
  16. package/assets/docs/UI.Visualization/pack-foundation.sh +206 -0
  17. package/assets/docs/UI.Visualization/pack-reference-foundation.ps1 +159 -0
  18. package/assets/docs/UI.Visualization/pack-reference-foundation.sh +205 -0
  19. package/assets/docs/UI.Visualization/unpack-foundation.ps1 +126 -0
  20. package/assets/docs/UI.Visualization/unpack-foundation.sh +217 -0
  21. package/assets/docs/UI.Visualization/unpack-reference-foundation.ps1 +129 -0
  22. package/assets/docs/UI.Visualization/unpack-reference-foundation.sh +218 -0
  23. package/assets/docs/VerticalSlice/VerticalSlice.Reference.pack.txt +19318 -0
  24. package/assets/docs/VerticalSlice/pack-reference-foundation.ps1 +157 -0
  25. package/assets/docs/VerticalSlice/pack-reference-foundation.sh +209 -0
  26. package/assets/docs/VerticalSlice/unpack-reference-foundation.ps1 +129 -0
  27. package/assets/docs/VerticalSlice/unpack-reference-foundation.sh +218 -0
  28. package/assets/docs/components/Email/README.md +7 -0
  29. package/assets/docs/components/Email/ReferenceEndpoints/SendEmailEndpoint.cs +84 -0
  30. package/assets/docs/components/Email/integration.md +57 -17
  31. package/assets/docs/components/Jobs/integration.md +29 -15
  32. package/assets/docs/components/QrGenerator/README.md +7 -0
  33. package/assets/docs/components/QrGenerator/ReferenceEndpoints/GenerateQrEndpoint.cs +57 -0
  34. package/assets/docs/components/QrGenerator/integration.md +51 -6
  35. package/assets/docs/components/README.md +19 -2
  36. package/assets/docs/domainspecs/UIVisualization/chart-bubble.md +70 -0
  37. package/assets/docs/domainspecs/UIVisualization/chart-dimred.md +58 -0
  38. package/assets/docs/domainspecs/UIVisualization/chart-heatmap.md +62 -0
  39. package/assets/docs/domainspecs/UIVisualization/chart-network.md +69 -0
  40. package/assets/docs/domainspecs/UIVisualization/chart-parallel.md +75 -0
  41. package/assets/docs/domainspecs/UIVisualization/chart-scurve.md +66 -0
  42. package/assets/docs/domainspecs/UIVisualization/chart-survival.md +69 -0
  43. package/assets/docs/domainspecs/UIVisualization/chart-trellis.md +68 -0
  44. package/assets/docs/domainspecs/UIVisualization/chart-violin.md +61 -0
  45. package/assets/docs/domainspecs/UIVisualization/chart-volcano.md +63 -0
  46. package/assets/docs/domainspecs/UIVisualization/charting-standards.domain.md +80 -0
  47. package/assets/docs/domainspecs/UIVisualization/clean-architecture.domain.md +87 -0
  48. package/assets/docs/domainspecs/UIVisualization/coding-standards.domain.md +47 -0
  49. package/assets/docs/domainspecs/UIVisualization/comandrulemap.md +130 -0
  50. package/assets/docs/domainspecs/UIVisualization/component-contracts.domain.md +67 -0
  51. package/assets/docs/domainspecs/UIVisualization/data-source.domain.md +68 -0
  52. package/assets/docs/domainspecs/UIVisualization/domain-requirements.md +110 -0
  53. package/assets/docs/domainspecs/UIVisualization/folder-structure.domain.md +55 -0
  54. package/assets/docs/domainspecs/UIVisualization/state-management.domain.md +67 -0
  55. package/assets/docs/domainspecs/UIVisualization/testing.domain.md +52 -0
  56. package/assets/docs/domainspecs/UIVisualization/ui-viz-terms.md +39 -0
  57. package/assets/docs/domainspecs/healthcare/comandrulemap.md +47 -0
  58. package/assets/docs/domainspecs/pharma/comandrulemap.md +50 -0
  59. package/dist/commands/init.d.ts.map +1 -1
  60. package/dist/commands/init.js +54 -7
  61. package/dist/commands/init.js.map +1 -1
  62. package/dist/commands/update.d.ts +3 -0
  63. package/dist/commands/update.d.ts.map +1 -0
  64. package/dist/commands/update.js +142 -0
  65. package/dist/commands/update.js.map +1 -0
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/utils/manifest.d.ts +31 -0
  69. package/dist/utils/manifest.d.ts.map +1 -0
  70. package/dist/utils/manifest.js +91 -0
  71. package/dist/utils/manifest.js.map +1 -0
  72. package/dist/utils/update-engine.d.ts +52 -0
  73. package/dist/utils/update-engine.d.ts.map +1 -0
  74. package/dist/utils/update-engine.js +203 -0
  75. package/dist/utils/update-engine.js.map +1 -0
  76. package/package.json +5 -2
  77. package/assets/docs/requirement-spec.txt +0 -15
@@ -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]]
@@ -104,6 +104,51 @@ domain-specific ones to load **in addition** for a healthcare project.
104
104
  - docs/domainspecs/healthcare/api-versioning.domain.md
105
105
  - docs/domainspecs/healthcare/ai-rules.domain.md
106
106
 
107
+ ## /aw-spec-fast-implement
108
+
109
+ > Fast path that collapses plan + tasks + analyze + implement into one pass. This list is the
110
+ > **deduplicated union** of those four commands' headings above (here, equal to `/aw-spec-plan`).
111
+ > Load it **once** for the whole pass — do not reload per phase.
112
+
113
+ - docs/domainspecs/healthcare/folder-structure.domain.md
114
+ - docs/domainspecs/healthcare/cqrs.domain.md
115
+ - docs/domainspecs/healthcare/vertical-slices.domain.md
116
+ - docs/domainspecs/healthcare/persistence.domain.md
117
+ - docs/domainspecs/healthcare/testing.domain.md
118
+ - docs/domainspecs/healthcare/eventing.domain.md
119
+ - docs/domainspecs/healthcare/domain-driven-design.domain.md
120
+ - docs/domainspecs/healthcare/fhir.md
121
+ - docs/domainspecs/healthcare/hl7.md
122
+ - docs/domainspecs/healthcare/dicom.md
123
+ - docs/domainspecs/healthcare/terminology.md
124
+ - docs/domainspecs/healthcare/hipaa.md
125
+ - docs/domainspecs/healthcare/consent.md
126
+ - docs/domainspecs/healthcare/zero-trust.domain.md
127
+ - docs/domainspecs/healthcare/authorization.domain.md
128
+ - docs/domainspecs/healthcare/auditing.domain.md
129
+ - docs/domainspecs/healthcare/data-classification.domain.md
130
+ - docs/domainspecs/healthcare/coding-standards.domain.md
131
+ - docs/domainspecs/healthcare/dependency-policy.domain.md
132
+ - docs/domainspecs/healthcare/api-versioning.domain.md
133
+ - docs/domainspecs/healthcare/ai-rules.domain.md
134
+
135
+ ## /aw-spec-minimal-implementation
136
+
137
+ > Single-step set for healthcare — the **per-domain knob** (edit freely). `/aw-spec-minimal-implementation`
138
+ > loads these to interpret and implement the requirement in one pass; genuinely-external runtime
139
+ > services (terminology server, FHIR endpoint) are stubbed behind ports. For an audited build use
140
+ > `## /aw-spec-fast-implement`.
141
+
142
+ - docs/domainspecs/healthcare/clinical-terms.md
143
+ - docs/domainspecs/healthcare/domain-driven-design.domain.md
144
+ - docs/domainspecs/healthcare/folder-structure.domain.md
145
+ - docs/domainspecs/healthcare/vertical-slices.domain.md
146
+ - docs/domainspecs/healthcare/fhir.md
147
+ - docs/domainspecs/healthcare/hl7.md
148
+ - docs/domainspecs/healthcare/terminology.md
149
+ - docs/domainspecs/healthcare/hipaa.md
150
+ - docs/domainspecs/healthcare/ai-rules.domain.md
151
+
107
152
  ---
108
153
 
109
154
  ## Quick reference (command → file count)
@@ -117,3 +162,5 @@ domain-specific ones to load **in addition** for a healthcare project.
117
162
  | /aw-spec-tasks | 13 |
118
163
  | /aw-spec-analyze | 5 |
119
164
  | /aw-spec-implement | 20 |
165
+ | /aw-spec-fast-implement | 21 |
166
+ | /aw-spec-minimal-implementation | 9 |
@@ -121,6 +121,54 @@ domain-specific ones to load **in addition** for a medicinal-product-registratio
121
121
  - docs/domainspecs/pharma/api-versioning.domain.md
122
122
  - docs/domainspecs/pharma/ai-rules.domain.md
123
123
 
124
+ ## /aw-spec-fast-implement
125
+
126
+ > Fast path that collapses plan + tasks + analyze + implement into one pass. This list is the
127
+ > **deduplicated union** of those four commands' headings above (here, equal to `/aw-spec-plan`).
128
+ > Load it **once** for the whole pass — do not reload per phase.
129
+
130
+ - docs/domainspecs/pharma/folder-structure.domain.md
131
+ - docs/domainspecs/pharma/cqrs.domain.md
132
+ - docs/domainspecs/pharma/vertical-slices.domain.md
133
+ - docs/domainspecs/pharma/persistence.domain.md
134
+ - docs/domainspecs/pharma/testing.domain.md
135
+ - docs/domainspecs/pharma/eventing.domain.md
136
+ - docs/domainspecs/pharma/domain-driven-design.domain.md
137
+ - docs/domainspecs/pharma/product-lifecycle.domain.md
138
+ - docs/domainspecs/pharma/ndc.md
139
+ - docs/domainspecs/pharma/idmp.md
140
+ - docs/domainspecs/pharma/fhir.md
141
+ - docs/domainspecs/pharma/hl7.md
142
+ - docs/domainspecs/pharma/terminology.md
143
+ - docs/domainspecs/pharma/atc.md
144
+ - docs/domainspecs/pharma/regulatory-compliance.md
145
+ - docs/domainspecs/pharma/data-provenance.md
146
+ - docs/domainspecs/pharma/zero-trust.domain.md
147
+ - docs/domainspecs/pharma/authorization.domain.md
148
+ - docs/domainspecs/pharma/auditing.domain.md
149
+ - docs/domainspecs/pharma/data-classification.domain.md
150
+ - docs/domainspecs/pharma/coding-standards.domain.md
151
+ - docs/domainspecs/pharma/dependency-policy.domain.md
152
+ - docs/domainspecs/pharma/api-versioning.domain.md
153
+ - docs/domainspecs/pharma/ai-rules.domain.md
154
+
155
+ ## /aw-spec-minimal-implementation
156
+
157
+ > Single-step set for pharma — the **per-domain knob** (edit freely). `/aw-spec-minimal-implementation`
158
+ > loads these to interpret and implement the requirement in one pass; genuinely-external runtime
159
+ > services (terminology server, FHIR endpoint) are stubbed behind ports. For an audited build use
160
+ > `## /aw-spec-fast-implement`.
161
+
162
+ - docs/domainspecs/pharma/pharma-terms.md
163
+ - docs/domainspecs/pharma/domain-driven-design.domain.md
164
+ - docs/domainspecs/pharma/folder-structure.domain.md
165
+ - docs/domainspecs/pharma/cqrs.domain.md
166
+ - docs/domainspecs/pharma/vertical-slices.domain.md
167
+ - docs/domainspecs/pharma/product-lifecycle.domain.md
168
+ - docs/domainspecs/pharma/ndc.md
169
+ - docs/domainspecs/pharma/idmp.md
170
+ - docs/domainspecs/pharma/atc.md
171
+
124
172
  ---
125
173
 
126
174
  ## Quick reference (command → file count)
@@ -134,3 +182,5 @@ domain-specific ones to load **in addition** for a medicinal-product-registratio
134
182
  | /aw-spec-tasks | 15 |
135
183
  | /aw-spec-analyze | 7 |
136
184
  | /aw-spec-implement | 24 |
185
+ | /aw-spec-fast-implement | 24 |
186
+ | /aw-spec-minimal-implementation | 9 |
@@ -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;AAOpC,eAAO,MAAM,WAAW,SA2DpB,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"}
@@ -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
- console.log(`\n🔧 Initializing AppWeaver Spec project in: ${targetDir}\n`);
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('📋 Dry run - would copy the following:');
42
- console.log(` ✓ ${assetsPath}/.aw-spec -> ${targetDir}/.aw-spec`);
43
- console.log(` ✓ ${assetsPath}/docs -> ${targetDir}/docs`);
44
- console.log(` ✓ ${assetsPath}/${agentFolder} -> ${targetDir}/${agentFolder}`);
45
- console.log(` ✓ ${assetsPath}/docs/VerticalSlice -> ${targetDir}/docs/VerticalSlice`);
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
- console.log('\n✅ Project initialized successfully!');
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;AAItD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,kEAAkE,CAAC;KAC/E,QAAQ,CAAC,aAAa,EAAE,+CAA+C,EAAE,GAAG,CAAC;KAC7E,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,EAAE,QAAQ,CAAC;KACtF,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAyD,EAAE,EAAE;IAC7F,MAAM,SAAS,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,gDAAgD,SAAS,IAAI,CAAC,CAAC;IAE3E,kBAAkB;IAClB,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,8EAA8E;IAC9E,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,KAAK,GAAG,QAAQ,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBAC9C;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,+CAA+C;oBACxD,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,QAAQ,EAAE;wBACzD,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,aAAa,EAAE;wBAC9D,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,UAAU,EAAE;qBAC3D;oBACD,OAAO,EAAE,QAAQ;iBAClB;aACF,CAAC,CAAC;YACH,KAAK,GAAG,aAAa,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,gBAAgB,SAAS,WAAW,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,YAAY,SAAS,OAAO,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,IAAI,WAAW,OAAO,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,0BAA0B,SAAS,qBAAqB,CAAC,CAAC;QACxF,OAAO;IACT,CAAC;IAED,cAAc;IACd,MAAM,UAAU,CAAC;QACf,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,KAAc;QACrB,SAAS,EAAE,OAAO,CAAC,GAAG;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;AAC/F,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const updateCommand: Command;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -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"}