feat: added a twist
This commit is contained in:
290
CLAUDE.md
Normal file
290
CLAUDE.md
Normal file
@@ -0,0 +1,290 @@
|
||||
# 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 1–2, 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 1–2 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 5–6)
|
||||
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
|
||||
Reference in New Issue
Block a user