@polderlabs/bizar 4.4.9 → 4.4.10
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.
- package/config/skills/glyph/SKILL.md +74 -58
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: glyph
|
|
3
|
-
description: Create
|
|
4
|
-
version:
|
|
3
|
+
description: Create visual glyphs at `artifacts/<slug>/` for plans, recaps, design proposals, postmortems, handoffs. Glyphs should be compact and visual — one screen, dense info, no walls of text. This skill enforces that.
|
|
4
|
+
version: 4
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Glyphs
|
|
@@ -15,7 +15,7 @@ artifacts/<slug>/
|
|
|
15
15
|
└── comments.json ← free-placed pins (mutable)
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
Two locations
|
|
18
|
+
Two locations: `<projectRoot>/.bizar/artifacts/` (preferred) and `~/.config/opencode/artifacts/` (global).
|
|
19
19
|
|
|
20
20
|
## Frontmatter
|
|
21
21
|
|
|
@@ -28,104 +28,121 @@ kind: plan | postmortem | recap | design
|
|
|
28
28
|
---
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
## The
|
|
31
|
+
## The 6 rules — read this first, every time
|
|
32
|
+
|
|
33
|
+
These are non-negotiable. The existing 357-line v3-to-v4-consolidation glyph is a cautionary tale — don't write that one.
|
|
34
|
+
|
|
35
|
+
### Rule 1 — One screen
|
|
36
|
+
|
|
37
|
+
A glyph MUST fit on one screen of the dashboard (≈ 1000px tall at desktop width). Long glyphs are skimmed and abandoned. If you can't fit the work in 5-10 blocks, you're covering too much. Break the work into multiple glyphs, one per phase.
|
|
38
|
+
|
|
39
|
+
### Rule 2 — One idea per block
|
|
40
|
+
|
|
41
|
+
If a block covers two ideas, split it. Each block is a single visual unit. The dashboard groups blocks into sections by id prefix — use that.
|
|
42
|
+
|
|
43
|
+
### Rule 3 — RichText is glue, not body
|
|
44
|
+
|
|
45
|
+
RichText is for 1-3 sentence transitions between visual blocks. NEVER use RichText for the actual content. If you find yourself writing 4+ sentences in a RichText, switch to:
|
|
46
|
+
|
|
47
|
+
- **A table** if you're listing things with attributes
|
|
48
|
+
- **A decision** if you're explaining why one option won
|
|
49
|
+
- **A file tree** if you're listing changes
|
|
50
|
+
- **A stat** if you're highlighting a number
|
|
51
|
+
- **A workflow** if you're describing a sequence
|
|
52
|
+
|
|
53
|
+
### Rule 4 — Lead with visuals
|
|
54
|
+
|
|
55
|
+
The first block after the title/headline should be a visual: a Stat, a Callout, or a Table. Never open with a long RichText. The user decides in 5 seconds whether to keep scrolling based on the visual.
|
|
56
|
+
|
|
57
|
+
### Rule 5 — One headline callout
|
|
58
|
+
|
|
59
|
+
Use `<Callout tone="success|danger">` once, near the top, as the TL;DR. Everything else supports it.
|
|
60
|
+
|
|
61
|
+
### Rule 6 — Truncate hints, not bodies
|
|
62
|
+
|
|
63
|
+
Stat `hint` props should be 1 short clause. Long hints mean the value needs to be a different block.
|
|
64
|
+
|
|
65
|
+
## The block vocabulary — minimal reference
|
|
32
66
|
|
|
33
67
|
| Block | What it shows | Required `data` |
|
|
34
68
|
| --- | --- | --- |
|
|
35
|
-
| `<RichText>` |
|
|
36
|
-
| `<Callout tone
|
|
37
|
-
| `<Stat label value trend hint />` | Big number
|
|
38
|
-
| `<Checklist items
|
|
69
|
+
| `<RichText>` | 1-3 sentences of glue | none |
|
|
70
|
+
| `<Callout tone>` | Boxed TL;DR | none (tone defaults to info) |
|
|
71
|
+
| `<Stat label value trend hint />` | Big number + label | `label`, `value` |
|
|
72
|
+
| `<Checklist items />` | Checkbox list | `items: [{id,label,checked}]` |
|
|
39
73
|
| `<Table columns rows />` | Tabular data | `columns: []`, `rows: [[]]` |
|
|
40
|
-
| `<CodeTabs tabs />` | Tabbed code
|
|
74
|
+
| `<CodeTabs tabs />` | Tabbed code | `tabs: [{id,label,language,code}]` |
|
|
41
75
|
| `<Decision title question options />` | Multi-option choice | `options: [{id,label,detail,recommended?}]` |
|
|
42
76
|
| `<OpenQuestions questions />` | Unanswered questions | `questions: [{id,label,kind,options?}]` |
|
|
43
|
-
| `<FileTree title entries />` | File-by-file
|
|
44
|
-
| `<Diff before after filename language mode />` | Before/after
|
|
77
|
+
| `<FileTree title entries />` | File-by-file changes | `entries: [{path,change,note?}]` |
|
|
78
|
+
| `<Diff before after filename language mode />` | Before/after | `before`, `after` |
|
|
45
79
|
| `<Workflow steps connections />` | Node graph | `steps: [{id,label,type}]` |
|
|
46
80
|
| `<Mockup title x y w h html />` | Inline UI mockup | `html` |
|
|
47
81
|
| `<Diagram title dataHtml dataCss />` | Inline SVG | `dataHtml` |
|
|
48
82
|
|
|
49
|
-
Every block needs a unique `id`.
|
|
83
|
+
Every block needs a unique `id`. RichText + Callout use open/close tags (markdown body); everything else is self-closing.
|
|
50
84
|
|
|
51
85
|
## Skeleton
|
|
52
86
|
|
|
53
87
|
```mdx
|
|
54
88
|
<RichText id="overview">
|
|
55
|
-
## What this
|
|
89
|
+
## What this is
|
|
56
90
|
|
|
57
|
-
|
|
91
|
+
One sentence the reader can't miss.
|
|
58
92
|
</RichText>
|
|
59
93
|
|
|
60
|
-
<Stat id="headline" label="X" value="7" trend="flat" />
|
|
94
|
+
<Stat id="headline" label="X shipped" value="7" trend="flat" hint="across v3.22 → v4.4.7" />
|
|
61
95
|
|
|
62
|
-
<Callout id="
|
|
63
|
-
One
|
|
96
|
+
<Callout id="tldr" tone="success">
|
|
97
|
+
One-sentence TL;DR.
|
|
64
98
|
</Callout>
|
|
65
99
|
|
|
100
|
+
<Table
|
|
101
|
+
id="releases"
|
|
102
|
+
columns={["v", "what", "fix"]}
|
|
103
|
+
rows={[
|
|
104
|
+
["3.22", "unified", "—"],
|
|
105
|
+
["4.4.1", "bg fix", "process exit crash"],
|
|
106
|
+
]}
|
|
107
|
+
/>
|
|
108
|
+
|
|
66
109
|
<FileTree
|
|
67
110
|
id="files"
|
|
68
111
|
title="Files changed"
|
|
69
112
|
entries={[
|
|
70
|
-
{ path: "
|
|
71
|
-
{ path: "src/bar.ts", change: "added" },
|
|
72
|
-
]}
|
|
73
|
-
/>
|
|
74
|
-
|
|
75
|
-
<Workflow
|
|
76
|
-
id="flow"
|
|
77
|
-
steps={[
|
|
78
|
-
{ id: "s1", label: "Step 1", type: "task" },
|
|
79
|
-
{ id: "s2", label: "Step 2", type: "task" },
|
|
80
|
-
]}
|
|
81
|
-
connections={[
|
|
82
|
-
{ from: "s1", to: "s2" },
|
|
113
|
+
{ path: "cli/provision.mjs", change: "added", note: "unified provisioner" },
|
|
83
114
|
]}
|
|
84
115
|
/>
|
|
85
116
|
```
|
|
86
117
|
|
|
87
118
|
## The 5 things that break a glyph
|
|
88
119
|
|
|
89
|
-
|
|
120
|
+
These shipped as bugs. Read before writing.
|
|
90
121
|
|
|
91
122
|
### 1. Backticks inside attribute strings
|
|
92
123
|
|
|
93
|
-
The parser scans for `` ` ``
|
|
124
|
+
The parser scans for `` ` `` and breaks. Use straight quotes or rephrase:
|
|
94
125
|
|
|
95
126
|
```
|
|
96
127
|
WRONG: Run `bizar install` to bootstrap.
|
|
97
128
|
RIGHT: Run 'bizar install' to bootstrap.
|
|
98
|
-
RIGHT: Run the installer to bootstrap.
|
|
99
129
|
```
|
|
100
130
|
|
|
101
|
-
### 2.
|
|
131
|
+
### 2. Braces inside string values
|
|
102
132
|
|
|
103
|
-
`{`
|
|
133
|
+
The brace counter doesn't know about strings. `{` / `}` in notes still bump depth. Keep note strings brace-free.
|
|
104
134
|
|
|
105
|
-
|
|
135
|
+
### 3. `FileTree` `change` must be exact
|
|
106
136
|
|
|
107
|
-
|
|
137
|
+
`added | modified | removed | renamed`. Empty string or `null` crashes on `t.bg`. Default to `modified` with a `note` when unclear.
|
|
108
138
|
|
|
109
|
-
|
|
139
|
+
### 4. Duplicate block ids
|
|
110
140
|
|
|
111
|
-
|
|
112
|
-
WRONG: change: null, change: "", change: "Modified"
|
|
113
|
-
RIGHT: change: "modified"
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
When in doubt, use `modified` with a `note` that explains why.
|
|
117
|
-
|
|
118
|
-
### 4. Two blocks with the same id
|
|
141
|
+
Comment pins and error reporting key off ids. Two blocks with the same id collide.
|
|
119
142
|
|
|
120
|
-
|
|
143
|
+
### 5. `## Heading <768px`
|
|
121
144
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
```
|
|
125
|
-
WRONG: ## Mobile <768px ← <7 looks like a malformed tag
|
|
126
|
-
RIGHT: ## Mobile (under 768px)
|
|
127
|
-
RIGHT: ## Mobile: under 768px
|
|
128
|
-
```
|
|
145
|
+
The parser sees `<7` as a malformed JSX tag. Use parentheses or colons.
|
|
129
146
|
|
|
130
147
|
## Validate before shipping
|
|
131
148
|
|
|
@@ -134,14 +151,13 @@ node -e "import('./bizar-dash/src/server/glyphs/mdx-compiler.mjs').then(m => { \
|
|
|
134
151
|
const fs = require('node:fs'); \
|
|
135
152
|
const out = m.compileGlyphMdxSync(fs.readFileSync('artifacts/<slug>/artifact.mdx','utf8')); \
|
|
136
153
|
console.log('blocks:', out.blocks.length, 'errors:', out.errors.length); \
|
|
137
|
-
out.errors.forEach(e => console.error(' line', e.line, ':', e.message)); \
|
|
138
154
|
})"
|
|
139
155
|
```
|
|
140
156
|
|
|
141
|
-
|
|
157
|
+
Also check yourself: does it fit on one screen? Are there any 4-sentence RichText blocks? Are the stats/tables/file trees doing the heavy lifting? If not, rewrite.
|
|
142
158
|
|
|
143
159
|
## See also
|
|
144
160
|
|
|
145
161
|
- `bizar-dash/src/server/glyphs/mdx-compiler.mjs` — parser
|
|
146
|
-
- `bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx` — React renderer (has
|
|
147
|
-
- `bizar-dash/src/web/views/glyphs/components.tsx` — block
|
|
162
|
+
- `bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx` — React renderer (has error banner)
|
|
163
|
+
- `bizar-dash/src/web/views/glyphs/components.tsx` — block implementations
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polderlabs/bizar",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.10",
|
|
4
4
|
"description": "Norse-pantheon multi-agent system for opencode — 13 agents across 4 cost tiers with cost-aware routing, plans, and a configurable agent harness. v4 ships as a single npm package bundling the dashboard server, opencode plugin, and typed SDK.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|