
Ascii Visualizer
- 246 installs
- 213 repo stars
- Updated August 4, 2026
- yonatangross/orchestkit
Render ASCII diagrams and flow sketches in READMEs, CLI output, and agent replies to explain structure without image assets.
About
OrchestKit ascii-visualizer lets agents generate ASCII diagrams and flow sketches for CLI, agent, and content docs—fast, portable visuals in READMEs and terminal output without image pipelines.
- ASCII diagrams
- flow sketches
- terminal-friendly output
- markdown embeds
- zero-asset visuals
Ascii Visualizer by the numbers
- 246 all-time installs (skills.sh)
- +4 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #481 of 1,879 Documentation skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/yonatangross/orchestkit --skill ascii-visualizerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 246 |
|---|---|
| repo stars | ★ 213 |
| Last updated | August 4, 2026 |
| Repository | yonatangross/orchestkit ↗ |
What it does
Render ASCII diagrams and flow sketches in READMEs, CLI output, and agent replies to explain structure without image assets.
Files
ASCII Visualizer
Consistent, readable ASCII diagrams for architecture, workflows, file trees, and data visualizations. All output renders correctly in monospace terminals without external tools.
Core principle: Encode information into structure, not decoration. Every diagram element should communicate something meaningful.
Box-Drawing Character Reference
This block intentionally shows multiple sets together as a key. Authors should use ONE set per real diagram; the single-set lint rule enforces this on production diagrams.
<!-- ascii-lint-disable: single-set,single-arrow-style,density-min -->
default: ┌─┐ │ └─┘ ├─┤ ┬ ┴ ┼
emphasis: ┏━┓ ┃ ┗━┛ ┣━┫ ┳ ┻ ╋
title: ╔═╗ ║ ╚═╝ ╠═╣ ╦ ╩ ╬
soft: ╭─╮ │ ╰─╯
portable: +-+ | +-+ +-+ + + +
Arrows: → ← ↑ ↓ ─> <─ ──> <──
Blocks: █ ▓ ░ ▏▎▍▌▋▊▉
Status: ● ○ ✓ ✗ ⚠ ◆ ◇ ▶ ▷ ↑↓→ ▓▒░ (closed-set vocab — see rules)Set Conventions (D8: intent-driven naming)
Tokens live in tokens.json. Names describe USE not APPEARANCE.
| Set | Characters | Use For |
|---|---|---|
default ─│ | Normal boxes and connectors | Most diagrams |
emphasis ━┃ | Headers, focus, draw the eye | Key components, outer frames |
title ═║ | Document titles | §0-style banners only |
soft ╭╮╰╯ ─│ | Status cards, ambient UI | Diff blocks |
portable `+-\ | ` | NO_COLOR / CI / bare TTY |
Rename codemod (D8): old light/heavy/double/rounded/ascii-fallback → new names above. Old names accepted with warning for one minor release.
Status Glyph Vocabulary
Closed-set v1 of 11 semantic glyphs (●○✓✗⚠◆◇▶▷ ↑↓→ ▓▒░). Single source of truth — see rules/status-glyph-vocabulary.md. Add-a-glyph process in CONTRIBUTING.md.
Diagram Patterns
Architecture Diagrams
┌──────────────┐ ┌──────────────┐
│ Frontend │─────>│ Backend │
│ React 19 │ │ FastAPI │
└──────────────┘ └───────┬──────┘
│
v
┌──────────────┐
│ PostgreSQL │
└──────────────┘File Trees with Annotations
src/
├── api/
│ ├── routes.py [M] +45 -12 !! high-traffic path
│ └── schemas.py [M] +20 -5
├── services/
│ └── billing.py [A] +180 ** new file
└── tests/
└── test_billing.py [A] +120 ** new file
Legend: [A]dd [M]odify [D]elete !! Risk ** NewProgress Bars
[████████░░] 80% Complete
+ Design (2 days)
+ Backend (5 days)
~ Frontend (3 days)
- Testing (pending)Swimlane / Timeline Diagrams
Backend ===[Schema]======[API]===========================[Deploy]====>
| | ^
| +------blocks------+ |
| | |
Frontend ------[Wait]--------[Components]=======[Integration]=+
=== Active work --- Blocked/waiting | DependencyBlast Radius (Concentric Rings)
Ring 3: Tests (8 files)
+-------------------------------+
| Ring 2: Transitive (5) |
| +------------------------+ |
| | Ring 1: Direct (3) | |
| | +--------------+ | |
| | | CHANGED FILE | | |
| | +--------------+ | |
| +------------------------+ |
+-------------------------------+Comparison Tables
BEFORE AFTER
┌────────────┐ ┌────────────┐
│ Monolith │ │ Service A │──┐
│ (all-in-1)│ └────────────┘ │ ┌──────────┐
└────────────┘ ┌────────────┐ ├─>│ Shared │
│ Service B │──┘ │ Queue │
└────────────┘ └──────────┘Reversibility Timeline
Phase 1 [================] FULLY REVERSIBLE (add column)
Phase 2 [================] FULLY REVERSIBLE (new endpoint)
Phase 3 [============....] PARTIALLY (backfill)
--- POINT OF NO RETURN ---
Phase 4 [........????????] IRREVERSIBLE (drop column)Key Rules
| Rule | Description |
|---|---|
| Font | Always monospace — box-drawing requires fixed-width |
| Weight | Standard for normal, Heavy for emphasis, Double for titles |
| Arrows | ─>, ──>, or │ with v/^ for direction |
| Alignment | Right-pad labels to match column widths |
| Annotations | !! for risk, ** for new, [A/M/D] for change type |
| Width | Keep under 80 chars for terminal compatibility |
| Nesting | Max 3 levels of box nesting before readability degrades |
When to Use Each Pattern
| Pattern | Use Case |
|---|---|
| Layered boxes | System architecture, deployment topology |
| Concentric rings | Blast radius, impact analysis |
| Timeline bars | Reversibility, migration phases |
| Swimlanes | Execution order, parallel work streams |
| Annotated trees | File change manifests, directory structures |
| Comparison tables | Cross-layer consistency, before/after |
| Progress bars | Status tracking, completion metrics |
Related Skills
brainstorm— Design exploration where diagrams communicate ideasarchitecture-patterns— System architecture that benefits from ASCII diagramscode-review-playbook— Review comments with inline diagrams
Contributing to ascii-visualizer
Governance for the ASCII design system: char-sets, primitives, status glyph vocabulary, lint rules, render patterns. See designs/ascii-design-system.md for the full design.
Principles (locked)
- Anti-slop: encode information into structure, not decoration. Every
glyph in primitives.json must answer "what does this communicate?" — decoration alone is grounds for rejection.
- Two tiers, not three:
primitives.json(raw Unicode, frozen) →
tokens.json (semantic char-sets). No component-tier tokens.
- Intent naming: char-set names describe USE, not APPEARANCE
(default/emphasis/title/soft/portable — not light/heavy).
- Closed-set vocab: the status glyph vocabulary in
rules/status-glyph-vocabulary.md is closed at v1. Additions are MINOR bumps via the process below.
Adding a glyph (status vocabulary or primitive)
1. Open an issue tagged glyph-proposal with:
- The glyph itself (and its Unicode code point, e.g.
U+2713) - Proposed semantic (
status.check→ "passed / completed") - Collision check vs the existing 11 status glyphs (or 80+ primitives)
- Terminal-render screenshot (iTerm + VS Code minimum)
- One real OrchestKit usage that needs it
2. ascii-visualizer skill owner reviews; one design-system-architect reviewer signs off; one Phase-1 user must voice support. 3. Append to primitives.json (never reorder existing entries). 4. If status glyph: append to rules/status-glyph-vocabulary.md. 5. Bump tokens.json version 1.x.y → 1.x+1.0 (MINOR; additive). 6. Add a snapshot golden under tests/fixtures/ascii/golden/. 7. CHANGELOG entry under ### Design tokens.
Removing or repurposing a glyph = MAJOR bump; see Versioning below.
Adding a char-set
Threshold is high. A new set must express a distinct intent, not a new visual style. Reviewers will reject sets that overlap the existing five.
1. Same issue process as above, tagged char-set-proposal. 2. State the intent in 1 sentence; map it to scenarios where existing sets are wrong (not just suboptimal). 3. Update primitives.json (if new code points needed) AND tokens.json (the semantic alias). 4. Update tokens.schema.json properties.sets.required to include the new name. 5. Run scripts/validate-tokens.sh and npm run test:ascii. 6. Bump tokens.json MINOR.
Adding a render pattern (scripts/render-ascii.sh)
1. Implement the pattern function; follow the existing render_box style. 2. Add to the case "$PATTERN" dispatch. 3. Add 5 goldens (one per char-set) under tests/fixtures/ascii/golden/<pattern>-<set>.golden.txt. 4. Run UPDATE_SNAPSHOTS=1 bash tests/unit/test-ascii-snapshots.sh once, review the diff, commit. 5. No version bump needed — patterns are renderer features, not tokens.
Adding a lint rule (src/hooks/src/quality/ascii-lint.ts)
1. Decide classification: NORMATIVE (correctness) vs ADVISORY (taste). See designs/ascii-design-system.md §A.3. 2. Default severity = warn (D3 locked). Only NORMATIVE rules are eligible to ratchet to block in a future PR after 30d of data. 3. Provide a per-rule disable comment (// ascii-lint-disable: <name>). 4. Add a unit test fixture in tests/fixtures/ascii/ covering both pass and fail cases. 5. Update the lint table in designs/ascii-design-system.md §A.3.
Versioning
tokens.json carries semver MAJOR.MINOR.PATCH:
| change | bump | consumer action |
|---|---|---|
| add char-set | MINOR | none |
| add glyph to vocabulary | MINOR | none |
| widen density override | MINOR | none |
| rename a char-set | MAJOR | rewrite refs |
| remove char-set | MAJOR | pick replacement |
| repurpose a glyph semantic | MAJOR | audit usages |
change tokens.schema.json | MAJOR | re-validate |
| fix typo / clarify description | PATCH | none |
MAJOR releases ship as vN-rc (both names accepted, old name warns) for at least one MINOR cycle before removal.
Validators
scripts/validate-tokens.sh # schema + primitives membership
bash tests/unit/test-ascii-snapshots.sh # golden diff (when implemented)
bash tests/unit/test-ascii-tokens.sh # token-set usage in src/
bash tests/unit/test-ascii-density.sh # info/decoration ratio
bash tests/unit/test-ascii-i18n.sh # CJK/Devanagari alignmentAll four (when shipped in C3) wired into tests/run-all-tests.sh under the unit-test block.
{
"version": "1.0.0",
"_comment": "Frozen Unicode primitives for ASCII design system. APPEND-ONLY after v1.0.0. See CONTRIBUTING.md for the add-a-glyph process. Removals or repurposes require a MAJOR version bump.",
"glyphs": {
"box.light.tl": "┌",
"box.light.tr": "┐",
"box.light.bl": "└",
"box.light.br": "┘",
"box.light.h": "─",
"box.light.v": "│",
"box.light.tee_d": "┬",
"box.light.tee_u": "┴",
"box.light.tee_r": "├",
"box.light.tee_l": "┤",
"box.light.cross": "┼",
"box.heavy.tl": "┏",
"box.heavy.tr": "┓",
"box.heavy.bl": "┗",
"box.heavy.br": "┛",
"box.heavy.h": "━",
"box.heavy.v": "┃",
"box.heavy.tee_d": "┳",
"box.heavy.tee_u": "┻",
"box.heavy.tee_r": "┣",
"box.heavy.tee_l": "┫",
"box.heavy.cross": "╋",
"box.double.tl": "╔",
"box.double.tr": "╗",
"box.double.bl": "╚",
"box.double.br": "╝",
"box.double.h": "═",
"box.double.v": "║",
"box.double.tee_d": "╦",
"box.double.tee_u": "╩",
"box.double.tee_r": "╠",
"box.double.tee_l": "╣",
"box.double.cross": "╬",
"box.rounded.tl": "╭",
"box.rounded.tr": "╮",
"box.rounded.bl": "╰",
"box.rounded.br": "╯",
"box.ascii.tl": "+",
"box.ascii.tr": "+",
"box.ascii.bl": "+",
"box.ascii.br": "+",
"box.ascii.h": "-",
"box.ascii.v": "|",
"box.ascii.tee_d": "+",
"box.ascii.tee_u": "+",
"box.ascii.tee_r": "+",
"box.ascii.tee_l": "+",
"box.ascii.cross": "+",
"arrow.right": "→",
"arrow.left": "←",
"arrow.up": "↑",
"arrow.down": "↓",
"arrow.ascii.right": "->",
"arrow.ascii.left": "<-",
"arrow.ascii.up": "^",
"arrow.ascii.down": "v",
"block.full": "█",
"block.dark": "▓",
"block.med": "▒",
"block.light": "░",
"block.bar.1": "▏",
"block.bar.2": "▎",
"block.bar.3": "▍",
"block.bar.4": "▌",
"block.bar.5": "▋",
"block.bar.6": "▊",
"block.bar.7": "▉",
"block.bar.8": "█",
"status.dot.filled": "●",
"status.dot.hollow": "○",
"status.check": "✓",
"status.cross": "✗",
"status.warn": "⚠",
"status.diamond.filled": "◆",
"status.diamond.hollow": "◇",
"status.triangle.filled": "▶",
"status.triangle.hollow": "▷"
}
}
Rule Categories
1. ASCII Diagrams (ascii) — MEDIUM — 2 rules
Box-drawing characters, layout patterns, and structured diagram templates for terminal output.
| Rule | Impact | File |
|---|---|---|
| ASCII Diagram Fundamentals | MEDIUM | ascii-diagrams.md |
| ASCII Architecture Visualization Patterns | MEDIUM | ascii-architecture.md |
2. Status Glyph Vocabulary (semantics) — HIGH — 1 rule
Closed-set semantic vocabulary for status indicators across skills, hooks, monitors, and rendered output.
| Rule | Impact | File |
|---|---|---|
| Closed-set status glyph vocabulary | HIGH | status-glyph-vocabulary.md |
ASCII Architecture Visualization Patterns
Incorrect — flat text descriptions:
The system has a frontend that talks to a backend API which uses
a database and a cache layer. There's also a message queue for
async processing.Correct — layered architecture diagram:
┌─────────────────────────────────────────────────────┐
│ Load Balancer │
└──────────┬──────────────────────────┬────────────────┘
│ │
┌──────────v──────────┐ ┌───────────v────────────┐
│ API Gateway │ │ API Gateway │
│ (instance 1) │ │ (instance 2) │
└──────────┬──────────┘ └───────────┬────────────┘
│ │
└──────────┬───────────────┘
│
┌─────────────┼────────────────┐
│ │ │
┌───────v──────┐ ┌────v─────┐ ┌───────v──────┐
│ PostgreSQL │ │ Redis │ │ RabbitMQ │
│ (primary) │ │ (cache) │ │ (queue) │
└──────────────┘ └──────────┘ └──────────────┘Blast Radius Visualization
Ring 3: Tests (8 files)
+-------------------------------+
| Ring 2: Transitive (5) |
| +------------------------+ |
| | Ring 1: Direct (3) | |
| | +--------------+ | |
| | | CHANGED FILE | | |
| | +--------------+ | |
| +------------------------+ |
+-------------------------------+
Direct dependents: auth.py, routes.py, middleware.py
Transitive: app.py, config.py, utils.py, cli.py, server.pyReversibility Timeline
REVERSIBILITY TIMELINE
Phase 1 [================] FULLY REVERSIBLE (add column, nullable)
Phase 2 [================] FULLY REVERSIBLE (new endpoint, additive)
Phase 3 [============....] PARTIALLY (backfill data)
--- POINT OF NO RETURN ---
Phase 4 [........????????] IRREVERSIBLE (drop old column)
Phase 5 [================] FULLY REVERSIBLE (frontend toggle)Comparison Tables
CROSS-LAYER CONSISTENCY
Backend Endpoint Frontend Consumer Status
POST /invoices createInvoice() PLANNED
GET /invoices/:id useInvoice(id) PLANNED
GET /invoices InvoiceList.tsx MISSING !!Key Patterns
| Pattern | Use Case |
|---|---|
| Layered boxes | System architecture, deployment topology |
| Concentric rings | Blast radius, impact analysis |
| Timeline bars | Reversibility, migration phases |
| Swimlanes | Execution order, parallel work streams |
| Annotated trees | File change manifests, directory structures |
| Comparison tables | Cross-layer consistency, before/after |
ASCII Diagram Fundamentals
Incorrect — inconsistent characters and alignment:
+-------+ +-------+
| Frontend | -> | Backend |
+-------+ +-------+
|
+--------+
| Database |
+--------+Correct — proper box-drawing characters with alignment:
Box-Drawing Characters:
┌─┐│└─┘ Standard weight
┏━┓┃┗━┛ Heavy weight
├─┤┬┴ Connectors
╔═╗║╚═╝ Double lines┌──────────────┐ ┌──────────────┐
│ Frontend │─────>│ Backend │
│ React 19 │ │ FastAPI │
└──────────────┘ └───────┬──────┘
│
v
┌──────────────┐
│ PostgreSQL │
└──────────────┘Progress Tracking
[████████░░] 80% Complete
+ Design (2 days)
+ Backend (5 days)
~ Frontend (3 days)
- Testing (pending)File Trees
src/
├── api/
│ ├── routes.py [M] +45 -12 !! high-traffic path
│ └── schemas.py [M] +20 -5
├── services/
│ └── billing.py [A] +180 ** new file
└── tests/
└── test_billing.py [A] +120 ** new file
Legend: [A]dd [M]odify [D]elete !! Risk ** NewWorkflow Diagrams
Backend ===[Schema]======[API]===========================[Deploy]====>
| | ^
| +------blocks------+ |
| | |
Frontend ------[Wait]--------[Components]=======[Integration]=+
=== Active work --- Blocked/waiting | DependencyKey Rules
| Rule | Description |
|---|---|
| Font | Always monospace — box-drawing characters require fixed-width |
| Weight | Standard (─│) for normal, Heavy (━┃) for emphasis |
| Arrows | Use ─>, ──>, or │ with v/^ for direction |
| Alignment | Right-pad labels to match column widths |
| Annotations | Use !! for risk, ** for new, [A/M/D] for change type |
Closed Status Glyph Vocabulary (v1)
Eleven glyphs, frozen at v1.0.0. Adding a 12th is a MINOR bump via the process in CONTRIBUTING.md. Removing or repurposing any of the 11 is a MAJOR bump (rare).
Vocabulary
GLYPH SEMANTIC DON'T USE FOR
───── ──────── ─────────────
● active / on / current generic bullet
○ inactive / off / pending decoration
✓ passed / completed decoration
✗ failed / blocked general "no"
⚠ warning / attention hard error
◆ primary / focused random emphasis
◇ secondary / unfocused decoration
▶ running / in-progress generic arrow
▷ paused / awaiting input generic arrow
↑↓→ trend up/down/forward random direction
▓▒░ fill: high/med/low decorationIncorrect — generic decoration
* Build passed
> Tests running
- Linter cleanCorrect — semantic glyphs
✓ Build passed
▶ Tests running
✓ Linter cleanAnti-pattern — repurposing a semantic for decoration
✓ Item 1
✓ Item 2
✓ Item 3A list of items isn't passing/failing — ✓ is reserved for pass/completed states. Use ● for active items and ○ for inactive/pending ones, or plain - for an unmarked list.
Anti-pattern — mixing semantically-loaded glyphs with decoration
■ Phase 1 ✓ Phase 2 ◉ Phase 3■ and ◉ are not in the vocabulary — they read as decoration. Pick exactly one glyph from the table above per slot:
✓ Phase 1 ▶ Phase 2 ○ Phase 3
done running pending{
"skill": "ascii-visualizer",
"version": "1.0.0",
"testCases": [
{
"id": "basic-draw-an-architecture-diagram",
"rule": "",
"query": "Draw an architecture diagram showing our React frontend connecting to a FastAPI backend with Redis cache and PostgreSQL database.",
"expectedBehavior": [
"Produces ASCII box-drawing diagram with standard weight characters",
"Uses directional arrows to show data flow between components",
"Labels each box with component name and technology",
"Keeps diagram under 80 characters wide for terminal compatibility",
"Uses monospace-safe characters only to ensure consistent terminal rendering"
]
},
{
"id": "edge-show-the-blast-radius",
"rule": "",
"query": "Show the blast radius of changing src/api/auth.ts \u2014 which files are directly affected, transitively affected, and which tests need updating?",
"expectedBehavior": [
"Uses concentric rings blast radius pattern",
"Shows CHANGED FILE in center ring",
"Ring 1 shows direct dependents with file count",
"Ring 2 shows transitive dependents affected indirectly by the change",
"Ring 3 shows affected test files",
"Includes legend explaining ring meaning and impact classification"
]
},
{
"id": "negative-generate-a-png-diagram",
"rule": "",
"query": "Generate a PNG diagram of our microservices architecture for the README",
"expectedBehavior": [
"Claude does NOT invoke the ascii-visualizer skill",
"Suggests using Mermaid, PlantUML, or an image generation tool instead",
"ASCII visualizer is for terminal-rendered monospace output, not image files"
]
},
{
"id": "ascii-architecture",
"rule": "ascii-architecture",
"query": "Draw a layered system architecture showing load balancer, API gateways, services, and databases",
"expectedBehavior": [
"Uses structured layered diagram with clear separation between infrastructure tiers",
"Labels each component box with both the component name and its technology stack",
"Shows directional arrows indicating data flow and communication patterns between layers",
"Uses layered architecture diagram with box-drawing characters for structured component visualization"
]
},
{
"id": "ascii-diagrams",
"rule": "ascii-diagrams",
"query": "What box-drawing characters should I use for ASCII diagrams to ensure they render correctly?",
"expectedBehavior": [
"Uses standard weight box-drawing characters for regular boxes and heavy weight for emphasis",
"Keeps diagrams under 80 characters wide for terminal compatibility across environments",
"Uses consistent alignment and spacing to ensure monospace rendering looks correct",
"Applies directional arrow characters to show data flow and dependency relationships"
]
}
]
}{
"$schema": "./tokens.schema.json",
"version": "1.0.0",
"_comment": "Semantic char-set tier. Names describe USE not APPEARANCE (D8). Validator (scripts/validate-tokens.sh) enforces every glyph appears in primitives.json.",
"sets": {
"default": {
"intent": "Standard prose; the default unless another intent applies.",
"corner": { "tl": "┌", "tr": "┐", "bl": "└", "br": "┘" },
"edge": { "h": "─", "v": "│" },
"junction": { "tee_d": "┬", "tee_u": "┴", "tee_r": "├", "tee_l": "┤", "cross": "┼" }
},
"emphasis": {
"intent": "Headers, focus blocks, draw-the-eye framing.",
"corner": { "tl": "┏", "tr": "┓", "bl": "┗", "br": "┛" },
"edge": { "h": "━", "v": "┃" },
"junction": { "tee_d": "┳", "tee_u": "┻", "tee_r": "┣", "tee_l": "┫", "cross": "╋" }
},
"title": {
"intent": "Document titles only; reserved for §0-style banners.",
"corner": { "tl": "╔", "tr": "╗", "bl": "╚", "br": "╝" },
"edge": { "h": "═", "v": "║" },
"junction": { "tee_d": "╦", "tee_u": "╩", "tee_r": "╠", "tee_l": "╣", "cross": "╬" }
},
"soft": {
"intent": "Status cards, ambient UI, diff blocks.",
"corner": { "tl": "╭", "tr": "╮", "bl": "╰", "br": "╯" },
"edge": { "h": "─", "v": "│" },
"junction": { "tee_d": "┬", "tee_u": "┴", "tee_r": "├", "tee_l": "┤", "cross": "┼" }
},
"portable": {
"intent": "Renders anywhere (NO_COLOR, CI logs, bare TTYs, screen-readers).",
"corner": { "tl": "+", "tr": "+", "bl": "+", "br": "+" },
"edge": { "h": "-", "v": "|" },
"junction": { "tee_d": "+", "tee_u": "+", "tee_r": "+", "tee_l": "+", "cross": "+" }
}
},
"arrows": {
"default": { "right": "→", "left": "←", "up": "↑", "down": "↓" },
"portable": { "right": "->", "left": "<-", "up": "^", "down": "v" }
},
"fills": {
"high": "▓",
"med": "▒",
"low": "░",
"full": "█",
"empty": " ",
"bars": ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"]
},
"density_overrides": {
"_comment": "Per-pattern density floor. Default threshold (§A.5) is 0.20.",
"progress-bar": 0.10,
"sparkline": 0.10,
"blast-radius": 0.15
}
}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://orchestkit.dev/schemas/ascii-visualizer/tokens.schema.json",
"title": "ASCII Design System Tokens",
"description": "Semantic char-set tier for OrchestKit ASCII design system. Validates structure; glyph membership in primitives.json is checked by scripts/validate-tokens.sh.",
"type": "object",
"required": ["version", "sets"],
"additionalProperties": false,
"properties": {
"$schema": { "type": "string" },
"version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
"_comment": { "type": "string" },
"sets": {
"type": "object",
"minProperties": 1,
"additionalProperties": { "$ref": "#/$defs/charSet" },
"required": ["default", "emphasis", "title", "soft", "portable"]
},
"arrows": {
"type": "object",
"additionalProperties": {
"type": "object",
"required": ["right", "left", "up", "down"],
"additionalProperties": false,
"properties": {
"right": { "type": "string", "minLength": 1, "maxLength": 4 },
"left": { "type": "string", "minLength": 1, "maxLength": 4 },
"up": { "type": "string", "minLength": 1, "maxLength": 4 },
"down": { "type": "string", "minLength": 1, "maxLength": 4 }
}
}
},
"fills": {
"type": "object",
"additionalProperties": false,
"properties": {
"high": { "type": "string", "minLength": 1, "maxLength": 1 },
"med": { "type": "string", "minLength": 1, "maxLength": 1 },
"low": { "type": "string", "minLength": 1, "maxLength": 1 },
"full": { "type": "string", "minLength": 1, "maxLength": 1 },
"empty": { "type": "string", "minLength": 1, "maxLength": 1 },
"bars": {
"type": "array",
"minItems": 8,
"maxItems": 8,
"items": { "type": "string", "minLength": 1, "maxLength": 1 }
}
}
},
"density_overrides": {
"type": "object",
"additionalProperties": {
"oneOf": [
{ "type": "number", "minimum": 0.0, "maximum": 1.0 },
{ "type": "string" }
]
}
}
},
"$defs": {
"charSet": {
"type": "object",
"required": ["intent", "corner", "edge"],
"additionalProperties": false,
"properties": {
"intent": { "type": "string", "minLength": 10 },
"corner": {
"type": "object",
"required": ["tl", "tr", "bl", "br"],
"additionalProperties": false,
"properties": {
"tl": { "type": "string", "minLength": 1, "maxLength": 1 },
"tr": { "type": "string", "minLength": 1, "maxLength": 1 },
"bl": { "type": "string", "minLength": 1, "maxLength": 1 },
"br": { "type": "string", "minLength": 1, "maxLength": 1 }
}
},
"edge": {
"type": "object",
"required": ["h", "v"],
"additionalProperties": false,
"properties": {
"h": { "type": "string", "minLength": 1, "maxLength": 1 },
"v": { "type": "string", "minLength": 1, "maxLength": 1 }
}
},
"junction": {
"type": "object",
"additionalProperties": false,
"properties": {
"tee_d": { "type": "string", "minLength": 1, "maxLength": 1 },
"tee_u": { "type": "string", "minLength": 1, "maxLength": 1 },
"tee_r": { "type": "string", "minLength": 1, "maxLength": 1 },
"tee_l": { "type": "string", "minLength": 1, "maxLength": 1 },
"cross": { "type": "string", "minLength": 1, "maxLength": 1 }
}
}
}
}
}
}