Files
micronomicon/CLAUDE.md
2026-04-01 00:53:55 +02:00

291 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Micronomicon → µFrame
A self-hosted web IDE for building rich terminal UIs that publish as `.mu` pages to a NomadNet node.
> **Evolution:** Started as a raw Micron text editor (Phases 12, complete).
> Now pivoting to **µFrame** — a declarative DSL that compiles `.uf` files into
> both plain ASCII art and styled Micron `.mu` output from the same source.
## Status
Phases 12 complete (raw Micron editor). Phase 3 (µFrame engine) is next.
## Tech Stack
| Layer | Technology |
|------------|--------------------------------------------------|
| Backend | Python 3.13 + FastAPI + uvicorn |
| µFrame | Pure Python: parser → IR → CharGrid → emitters |
| Frontend | React 19 + Vite + TypeScript |
| UI | shadcn/ui + Tailwind CSS v4 + tw-animate-css |
| Editor | CodeMirror 6 |
| Graph | React Flow (@xyflow/react) + dagre |
| State | Zustand |
| Container | Docker + Compose |
## Directory Layout
```
micronomicon/
Dockerfile
compose.yml
docs/
framework-design-v3.md # µFrame DSL spec + rendering model
dynamic-templates.md # Dynamic page addendum (Phases 56)
backend/
main.py # FastAPI app + static file serving
converter.py # POST /api/compile (µFrame → ASCII + Micron)
pages.py # file management (CRUD /api/pages)
graph.py # link parser (GET /api/graph)
docker_utils.py # container restart (POST /api/restart)
requirements.txt
uframe/ # µFrame engine (Phase 3+)
__init__.py # compile(source, width) → CompileResult
errors.py # ParseError, LayoutError
ir.py # IR node dataclasses
parser.py # .uf DSL → IR tree
grid.py # CharGrid (2D char + style buffer)
chars.py # Unicode lookup tables (box-drawing, braille)
measure.py # bottom-up size computation
layout.py # top-down position assignment
paint.py # IR → CharGrid rendering
borders.py # junction merging post-pass
emit_ascii.py # CharGrid → plain text
emit_micron.py # CharGrid → Micron with style tags
viz.py # gauge, sparkline, status (Phase 4)
table.py # table layout + box-drawn grid (Phase 4)
frontend/
src/
App.tsx
routes/ # DashboardView, EditorView, GraphView
components/
dashboard/ # page list, status badges
editor/
EditorPane.tsx # CodeMirror host
PreviewPane.tsx # ASCII + Micron + Raw preview tabs
ToolBar.tsx # save/publish + backlinks
uframeHighlight.ts # CM6 .uf syntax highlighting (Phase 3+)
uframeCommands.ts # "/" command palette for .uf (Phase 3+)
micronRenderer.ts # Micron → HTML (renders compiled output)
BacklinkIndicator.tsx
shared/
ui/ # shadcn components
stores/ # editorStore, pagesStore (Zustand)
hooks/ # useCompile, useGraph, useUnsavedGuard
lib/ # utils (cn)
```
## Local Development
**Backend:**
```bash
cd backend
source .venv/bin/activate
PAGES_DIR=~/.nomadnetwork/storage/pages \
SOURCES_DIR=~/.micron-editor/sources \
uvicorn main:app --reload --port 8080
```
**Frontend:**
```bash
cd frontend
npm run dev # proxies /api -> localhost:8080
```
Frontend at http://localhost:5173, backend at http://localhost:8080.
## API Endpoints
| Method | Path | Description |
|--------|---------------------|------------------------------------------------------|
| GET | /api/health | Health check |
| POST | /api/compile | Compile `.uf``{ascii, micron, warnings}` |
| GET | /api/pages | List all pages with metadata |
| GET | /api/pages/{name} | Read page source (`.uf` or legacy `.mu`) |
| POST | /api/pages/{name} | Save page — body `{ source, publish: bool }` |
| DELETE | /api/pages/{name} | Delete source and/or .mu file |
| GET | /api/graph | Graph nodes + edges (parsed from links in source) |
| POST | /api/restart | Restart NomadNet Docker container |
## Storage
```
~/.micron-editor/sources/ ← .uf source files (draft + published)
~/.nomadnetwork/storage/pages/ ← Compiled .mu files served by NomadNet
```
On publish: `.uf` is compiled to `.mu` and copied to the NomadNet pages directory.
## Conventions
- Frontend UI components live in `frontend/src/components/ui/` (shadcn)
- Feature components grouped by domain: `dashboard/`, `editor/`, `shared/`
- State management via Zustand stores in `frontend/src/stores/`
- Backend is pure FastAPI; no ORM, flat file storage
- µFrame engine is pure Python stdlib — no external dependencies
## µFrame DSL Reference
Full spec: `docs/framework-design-v3.md`
### Layout primitives
```
page "Title" [width] # root container (default 64)
box [light|heavy|double|rounded] "Title" # bordered panel
row [gap] # horizontal layout
col [width] # column in a row
spacer [lines] # vertical whitespace
pad [t] [r] [b] [l] # inner margin
```
### Content primitives
```
heading [1|2|3] "Text" # styled heading
text "Content with @bold{inline} @color{hex}{modifiers}"
label "Key" "Value" # aligned key-value pair
list [bullet|dash]
item "Entry"
link "Display text" "/dest.mu" # clickable in Micron
divider [light|heavy|double|dash|dot] # horizontal rule
# comment # ignored in output
```
### Data visualization (Phase 4)
```
gauge "Label" $val $max $width warn=N crit=N
sparkline "Label" $values $width # braille patterns
status "Label" [online|offline|degraded] # ●○◐ indicators
table "Title"
columns "Name" 24 | "Hops" 6 | "Status" 10
row "value" | "value" | "value"
```
### Forms (Phase 5)
```
form "name"
field "name" [width] "placeholder"
radio "group" "Opt A" | "Opt B"
checkbox "name" "Label"
button "Label" "/action/path"
```
### Dynamic features (Phase 6)
```
source cpu : shell "cat /proc/loadavg"
on_submit "form_name"
# handle form data
if $val > threshold
# conditional rendering
for item in $collection
# iteration
state "store" "/path.json"
cache 0 # never cache (re-execute per request)
```
### Rendering pipeline
```
.uf source → Parse → IR Tree → Measure → Layout → Paint → CharGrid
├→ ASCII emitter (plain text)
└→ Micron emitter (styled .mu)
```
### Micron syntax (legacy raw editor, still used for compiled output)
```
>H1 >>H2 >>>H3 headings
`!bold`! `*italic`* `_underline`_ formatting
`Fhex text`f `Bhex text`b colors (3-digit hex)
`c text`a `r text`a `l text`a alignment
[label`slug] links
-─ -━ -═ -★ dividers
`= ... `= literal mode
# comment hidden in output
```
## Roadmap
### Phase 1 — Core Editor + Dashboard + Graph ✅
- Split-pane Micron editor with live preview
- Save draft / publish to NomadNet pages dir
- Pages dashboard with status badges
- Page graph (React Flow + dagre)
- NomadNet restart, dark/light theme, keyboard shortcuts
### Phase 2 — Linking + Editor Enhancements ✅
- `[[` page link autocomplete
- Backlink indicator with popover
- Pivot to direct Micron editor (removed Markdown pipeline)
- `/` slash command palette for Micron syntax
- Micron syntax highlighting + HTML preview renderer
- Syntax completeness per micron-composer spec
### Phase 3 — µFrame Core Engine (next)
Build `backend/uframe/` — the rendering pipeline:
1. `errors.py` + `ir.py` — data structures
2. `chars.py` — Unicode lookup tables (box-drawing, blocks, braille)
3. `parser.py``.uf` DSL → IR tree (indentation-based, line-oriented)
4. `grid.py` — CharGrid class (2D char + style buffer)
5. `measure.py` + `layout.py` — size computation + position assignment
6. `paint.py` — IR nodes → CharGrid
7. `borders.py` — junction merging post-pass
8. `emit_ascii.py` + `emit_micron.py` — CharGrid → output strings
9. `__init__.py` — public `compile()` API
10. Update `converter.py``POST /api/compile` endpoint
11. Update `pages.py``.uf` sources, compile-on-publish
12. Update `graph.py` — parse `.uf` for links
### Phase 4 — Data Visualization
- gauge, meter, bar_h, bar_v (block elements)
- sparkline (braille sub-cell rendering)
- heatmap (shade blocks with per-cell color)
- status indicators (●○◐ with color)
- table (box-drawn with header separator)
- Border merging across nested tables
### Phase 5 — Web IDE Integration
- Replace Micron editor with µFrame DSL editor
- CodeMirror `.uf` syntax highlighting + autocomplete
- `useCompile` hook (debounced API calls)
- Triple preview: ASCII | Micron rendered | Raw Micron
- Page storage: `.uf` sources, `.mu` compiled output
- Migration script for legacy `.mu` sources
### Phase 6 — Forms & Interactivity
- Form primitives: field, password, radio, checkbox, button
- ASCII: visual placeholders; Micron: live fields
- @modifier inline syntax
- Variables and `let` bindings
### Phase 7 — Dynamic Pages
- `source` blocks for live data (shell, file, json, python, rns)
- Compile to executable Python scripts with embedded runtime
- `on_submit` form handling via `FIELD_*` env vars
- Conditionals (`if`/`elif`/`else`) and loops (`for`)
- State persistence (`state` + JSON store)
- Cache control headers
- CLI: `uframe compile` / `uframe deploy`
### Phase 8 — Components & Standard Library
- `component` definitions with argument bindings
- Standard library: `std/dashboard`, `std/filebrowser`, `std/board`
- Themes (`.uf-theme` color palette files)
- `uframe check` linter
- Production deployment: systemd + Tailscale
## References
- µFrame design: `docs/framework-design-v3.md`
- µFrame dynamic: `docs/dynamic-templates.md`
- micron-composer: https://github.com/fr33n0w/micron-composer
- micron-parser-js: https://rfnexus.github.io/micron-parser-js/
- NomadNet: https://github.com/markqvist/NomadNet
- md2txt (legacy): https://codeberg.org/randogoth/md2txt