| name | documentation_robotics_viewer-architecture |
| description | Display architectural overview and critical file locations |
| user_invocable | true |
| args | null |
| generated | true |
| generation_timestamp | "2026-02-23T16:05:21.369Z" |
| generation_version | 2.0 |
| source_project | documentation_robotics_viewer |
| source_codebase_hash | 00a2f9723e9a7f64 |
Documentation Robotics Viewer - Architecture Reference
Quick-reference skill for documentation_robotics_viewer architecture overview and critical file locations.
Usage
/documentation_robotics_viewer-architecture
Purpose
Displays a comprehensive architectural overview of the documentation_robotics_viewer project, including:
- Architectural style (Layered Architecture with Hexagonal/Ports & Adapters)
- Layer boundaries (core vs. app separation rules)
- Critical data pipeline (YAML → React Flow transformation)
- Most critical files to understand/modify
- Tech stack summary (React 19, TypeScript 5.9, Vite 6.4, Playwright 1.57)
- Key patterns (React Flow nodes, Zustand stores, accessibility)
Architecture Overview
Architectural Style
Layered Architecture with Hexagonal/Ports & Adapters Pattern
┌─────────────────────────────────────────────────────────────┐
│ Application Layer │
│ (src/apps/embedded/) │
│ Routes, Components, Stores, App-specific Logic │
│ CAN import from core layer │
├─────────────────────────────────────────────────────────────┤
│ Core Layer │
│ (src/core/) │
│ Reusable, Framework-agnostic │
│ NEVER imports from app layer │
│ │
│ ├─ nodes/ Custom React Flow nodes (15+ types) │
│ ├─ edges/ Custom edge types │
│ ├─ layout/ Layout engines (Dagre, ELK, D3, Graphviz)│
│ ├─ services/ Data transformers, parsers │
│ ├─ stores/ Global Zustand stores │
│ └─ components/ Base UI (GraphViewer, panels) │
├─────────────────────────────────────────────────────────────┤
│ External Infrastructure │
│ DR CLI Server (REST + WebSocket) │
└─────────────────────────────────────────────────────────────┘
Critical Data Pipeline
YAML/JSON Files
↓
yamlParser.ts / jsonSchemaParser.ts
↓
ModelStore (Zustand)
↓
nodeTransformer.ts (MetaModel → React Flow)
↓
Layout Engines (calculate positions)
↓
GraphViewer.tsx (viewport culling)
↓
React Flow Canvas
Directory Structure
src/
├── core/ # Framework-agnostic reusable code
│ ├── nodes/ # 15+ custom node types
│ │ ├── business/ # BusinessFunction, BusinessService, BusinessCapability
│ │ ├── motivation/ # Goal, Stakeholder, Constraint, Driver, etc.
│ │ ├── c4/ # Container, Component, ExternalActor
│ │ └── index.ts # ★ Node registry (nodeTypes map)
│ ├── edges/ # Custom edge types
│ ├── layout/
│ │ ├── engines/ # Dagre, ELK, D3Force, Graphviz
│ │ └── business/ # Business-specific layouts
│ ├── services/
│ │ ├── nodeTransformer.ts # ★★★ Core transformation pipeline
│ │ ├── dataLoader.ts # Data loading orchestration
│ │ ├── yamlParser.ts # YAML instance parsing
│ │ └── jsonSchemaParser.ts # JSON Schema parsing
│ ├── stores/ # Global Zustand stores
│ │ ├── modelStore.ts # Main model data
│ │ ├── layerStore.ts # Layer visibility
│ │ └── elementStore.ts # Element selection
│ └── components/
│ ├── GraphViewer.tsx # ★★ Main canvas (viewport culling)
│ └── base/ # BaseInspectorPanel, BaseControlPanel
├── apps/embedded/ # TanStack Router app
│ ├── routes/ # Route components
│ ├── components/ # App-specific components
│ ├── stores/ # App-specific stores (authStore, chatStore)
│ └── services/ # App-specific graph builders
└── catalog/ # Storybook (578 stories, 97 files)
Most Critical Files
🔥 Top Priority (Understand These First)
-
src/core/services/nodeTransformer.ts (873 lines)
- THE CORE PIPELINE - Transforms MetaModel → React Flow nodes/edges
- Three critical functions:
getNodeTypeForElement() - Maps element type to node type
extractNodeData() - Extracts node data from elements
precalculateDimensions() - Calculates node sizes
- MUST MODIFY when adding new node types
-
src/core/components/GraphViewer.tsx
- Main React Flow canvas
- Viewport culling (40-60% edge reduction)
- Two-pass layout orchestration
-
src/core/nodes/index.ts
- Node type registry (
nodeTypes map)
- Plugin architecture - Register all custom nodes here
📋 Secondary (Frequently Modified)
-
src/core/layout/engines/ - Layout algorithm implementations
DagreLayoutEngine.ts - Hierarchical layouts
ElkLayoutEngine.ts - Advanced Eclipse Layout Kernel
D3ForceLayoutEngine.ts - Physics simulations
GraphvizLayoutEngine.ts - DOT language via WASM
-
src/core/stores/modelStore.ts - Main data store
- MetaModel loading
- Element/layer/relationship state
-
src/apps/embedded/routes/ - Route components
- Uses
SharedLayout (3-column pattern)
- Left sidebar (layers), Main (graph), Right sidebar (inspector)
🧰 Utilities & Services
-
src/core/services/yamlParser.ts - YAML instance parsing
- Resolves dot-notation IDs (
business.function.name) to UUIDs
-
src/core/services/crossLayerReferenceExtractor.ts
- Extracts cross-layer relationships
- Builds dependency graph
Tech Stack
- Language: TypeScript 5.9.3 (100% strict mode)
- Framework: React 19.2.0
- Build: Vite 6.4.0
- Graph Library: @xyflow/react 12.9.3 (React Flow)
- State: Zustand 5.0.8 (NO React Context)
- Routing: @tanstack/react-router
- UI: Flowbite React + Tailwind CSS v4
- Testing: Playwright 1.57.0 (1170 tests + 578 Storybook stories)
- Layout Engines: dagre, elkjs, d3-force, @hpcc-js/wasm (GraphViz)
Key Architectural Rules
✅ DO
- Core layer - Reusable, framework-agnostic, NO app imports
- App layer - CAN import from core
- Read first - NEVER modify code you haven't read
- Edit, don't create - ALWAYS prefer editing existing files
- Follow patterns - Look at similar implementations before starting
- Use TypeScript strictly - All files strongly typed
- Test thoroughly - Run
npm test before completing tasks
❌ DON'T
- Core importing from app layer (violates architecture boundary)
- Creating new files unnecessarily (causes file bloat)
- Using React Context (use Zustand stores instead)
- Using CSS modules (use Tailwind utilities)
- Using dot notation for Flowbite (
List.Item → ListItem)
- Modifying nodes without updating nodeTransformer.ts
Critical Patterns
React Flow Node Pattern (MUST FOLLOW)
export const YOUR_NODE_WIDTH = 180;
export const YOUR_NODE_HEIGHT = 100;
export const YourNode = memo(({ data, id: _id }: { data: YourNodeData; id?: string }) => {
return (
<div
role="article"
aria-label={`Your Type: ${data.label}`}
style={{
width: YOUR_NODE_WIDTH, // ★ Use exported constant
height: YOUR_NODE_HEIGHT, // ★ Use exported constant
// ... inline styles (NOT Tailwind)
}}
>
{/* ★ ALWAYS include 4 Handles */}
<Handle type="target" position={Position.Top} id="top" />
<Handle type="source" position={Position.Bottom} id="bottom" />
<Handle type="target" position={Position.Left} id="left" />
<Handle type="source" position={Position.Right} id="right" />
{/* content */}
</div>
);
});
YourNode.displayName = 'YourNode';
export const nodeTypes = {
yourType: YourNode,
};
Zustand Store Pattern
import { create } from 'zustand';
export const useYourStore = create<YourState>((set, get) => ({
items: [],
addItem: (item) => set((state) => ({
items: [...state.items, item]
})),
getItemById: (id) => get().items.find(i => i.id === id),
}));
const { items, addItem } = useYourStore();
Common Commands
npm run dev
npm test
npm run test:e2e
npm run test:storybook
npm run storybook:dev
npm run storybook:build
npm run test:storybook:a11y
npm run build
Examples
Example 1: Understanding the Data Flow
cat src/core/services/yamlParser.ts
cat src/core/services/dataLoader.ts
cat src/core/services/nodeTransformer.ts
ls src/core/layout/engines/
cat src/core/components/GraphViewer.tsx
Example 2: Adding a New Node Type
cat src/core/nodes/motivation/GoalNode.tsx
cat src/core/nodes/index.ts
cat src/core/services/nodeTransformer.ts
npm test -- tests/unit/nodes/
npm run storybook:dev
Example 3: Debugging Layout Issues
cat src/core/layout/engines/DagreLayoutEngine.ts
grep -n "precalculateDimensions" src/core/services/nodeTransformer.ts
cat src/core/nodes/motivation/GoalNode.tsx | grep "export const.*WIDTH\|HEIGHT"
Example 4: Understanding State Management
ls src/core/stores/
ls src/apps/embedded/stores/
cat src/core/stores/modelStore.ts
grep -r "useModelStore" src/apps/embedded/components/
Quick Troubleshooting
| Symptom | Check These Files |
|---|
| Node not rendering | nodeTransformer.ts (all 3 functions), nodes/index.ts |
| Layout overlaps | Layout engine calculate(), precalculateDimensions() |
| Edges not connecting | Handle IDs in node component, edge source/target |
| State not updating | Zustand store actions, React component hooks |
| Tests failing | Test fixtures, mock data in tests/fixtures/ |
Documentation
- Main:
README.md
- Architecture:
documentation/architecture-overview.md
- DR CLI Integration:
documentation/DR_CLI_INTEGRATION_GUIDE.md
- YAML Models:
documentation/YAML_MODELS.md
- Accessibility:
documentation/ACCESSIBILITY.md
- Project Instructions:
CLAUDE.md (this file powers this skill)
This skill was automatically generated from project architecture analysis.