gm-copilot-cli 2.0.727 → 2.0.1064

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.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: gm-jetbrains
3
+ description: AI-native software engineering via skill-driven orchestration on jetbrains; bootstraps plugkit for task execution and session isolation
4
+ allowed-tools: Skill
5
+ ---
6
+
7
+ # GM — jetbrains Platform
8
+
9
+ AI-native software engineering orchestrated via skill chain: PLAN → EXECUTE → EMIT → VERIFY → UPDATE-DOCS.
10
+
11
+ **Bootstrap pattern**: `bun x gm-plugkit@latest --daemon` downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Call once at session start; idempotent on subsequent calls. All execution routes through the file-spool: write to `.gm/exec-spool/in/<lang>/<N>.<ext>` or `in/<verb>/<N>.txt`, poll `out/<N>.json` for results.
12
+
13
+ **Session-ID threading (no session-start hook)**: At skill invoke time, generate or detect SESSION_ID (env var `SESSION_ID` or `uuid()`). Pass `sessionId: "<id>"` in every rs-exec RPC body (spawn, tail, watch, etc.) and every spool-written task body. All task-scoped cleanup (deleteTask, getTask, appendOutput, killSessionTasks) requires matching sessionId. Absence is forbidden — hard reject by rs-exec handler.
14
+
15
+ **Spool dispatch surface**: Write to `.gm/exec-spool/in/<lang>/<N>.<ext>` (languages: nodejs, python, bash, typescript, go, rust, c, cpp, java, deno) or `in/<verb>/<N>.txt` (verbs: codesearch, recall, memorize, wait, sleep, status, close, browser, runner, etc.). Watcher executes and streams `out/<N>.out` (stdout) + `out/<N>.err` (stderr) line-by-line, then `out/<N>.json` metadata (exitCode, durationMs, timedOut, startedAt, endedAt) at completion.
16
+
17
+ **End-to-end skill chaining (skills-based platforms)**: When gm SKILL.md includes `end-to-end: true`, adapter detects signal and parses stdout for trailing JSON: `{"nextSkill": "...", "context": {...}, "phase": "..."}`. If nextSkill is non-null, invoke `Skill(skill="gm:<nextSkill>")` with context dict, repeat until null. This auto-chains 5 invocations into 1 user invocation.
18
+
19
+ Every task returns complete: taskId, exitCode, durationMs, timedOut, stdout, stderr. Background tasks return immediately with task_id; continue with `in/status/<N>.txt` (tail), `in/watch/<N>.txt` (watch), or `in/close/<N>.txt` (close).
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: gm-kilo
3
+ description: AI-native software engineering via skill-driven orchestration on kilo; bootstraps plugkit for task execution and session isolation
4
+ allowed-tools: Skill
5
+ ---
6
+
7
+ # GM — kilo Platform
8
+
9
+ AI-native software engineering orchestrated via skill chain: PLAN → EXECUTE → EMIT → VERIFY → UPDATE-DOCS.
10
+
11
+ **Bootstrap pattern**: `bun x gm-plugkit@latest --daemon` downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Call once at session start; idempotent on subsequent calls. All execution routes through the file-spool: write to `.gm/exec-spool/in/<lang>/<N>.<ext>` or `in/<verb>/<N>.txt`, poll `out/<N>.json` for results.
12
+
13
+ **Session-ID threading (no session-start hook)**: At skill invoke time, generate or detect SESSION_ID (env var `SESSION_ID` or `uuid()`). Pass `sessionId: "<id>"` in every rs-exec RPC body (spawn, tail, watch, etc.) and every spool-written task body. All task-scoped cleanup (deleteTask, getTask, appendOutput, killSessionTasks) requires matching sessionId. Absence is forbidden — hard reject by rs-exec handler.
14
+
15
+ **Spool dispatch surface**: Write to `.gm/exec-spool/in/<lang>/<N>.<ext>` (languages: nodejs, python, bash, typescript, go, rust, c, cpp, java, deno) or `in/<verb>/<N>.txt` (verbs: codesearch, recall, memorize, wait, sleep, status, close, browser, runner, etc.). Watcher executes and streams `out/<N>.out` (stdout) + `out/<N>.err` (stderr) line-by-line, then `out/<N>.json` metadata (exitCode, durationMs, timedOut, startedAt, endedAt) at completion.
16
+
17
+ **End-to-end skill chaining (skills-based platforms)**: When gm SKILL.md includes `end-to-end: true`, adapter detects signal and parses stdout for trailing JSON: `{"nextSkill": "...", "context": {...}, "phase": "..."}`. If nextSkill is non-null, invoke `Skill(skill="gm:<nextSkill>")` with context dict, repeat until null. This auto-chains 5 invocations into 1 user invocation.
18
+
19
+ Every task returns complete: taskId, exitCode, durationMs, timedOut, stdout, stderr. Background tasks return immediately with task_id; continue with `in/status/<N>.txt` (tail), `in/watch/<N>.txt` (watch), or `in/close/<N>.txt` (close).
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: gm-oc
3
+ description: AI-native software engineering via skill-driven orchestration on oc; bootstraps plugkit for task execution and session isolation
4
+ allowed-tools: Skill
5
+ ---
6
+
7
+ # GM — oc Platform
8
+
9
+ AI-native software engineering orchestrated via skill chain: PLAN → EXECUTE → EMIT → VERIFY → UPDATE-DOCS.
10
+
11
+ **Bootstrap pattern**: `bun x gm-plugkit@latest --daemon` downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Call once at session start; idempotent on subsequent calls. All execution routes through the file-spool: write to `.gm/exec-spool/in/<lang>/<N>.<ext>` or `in/<verb>/<N>.txt`, poll `out/<N>.json` for results.
12
+
13
+ **Session-ID threading (no session-start hook)**: At skill invoke time, generate or detect SESSION_ID (env var `SESSION_ID` or `uuid()`). Pass `sessionId: "<id>"` in every rs-exec RPC body (spawn, tail, watch, etc.) and every spool-written task body. All task-scoped cleanup (deleteTask, getTask, appendOutput, killSessionTasks) requires matching sessionId. Absence is forbidden — hard reject by rs-exec handler.
14
+
15
+ **Spool dispatch surface**: Write to `.gm/exec-spool/in/<lang>/<N>.<ext>` (languages: nodejs, python, bash, typescript, go, rust, c, cpp, java, deno) or `in/<verb>/<N>.txt` (verbs: codesearch, recall, memorize, wait, sleep, status, close, browser, runner, etc.). Watcher executes and streams `out/<N>.out` (stdout) + `out/<N>.err` (stderr) line-by-line, then `out/<N>.json` metadata (exitCode, durationMs, timedOut, startedAt, endedAt) at completion.
16
+
17
+ **End-to-end skill chaining (skills-based platforms)**: When gm SKILL.md includes `end-to-end: true`, adapter detects signal and parses stdout for trailing JSON: `{"nextSkill": "...", "context": {...}, "phase": "..."}`. If nextSkill is non-null, invoke `Skill(skill="gm:<nextSkill>")` with context dict, repeat until null. This auto-chains 5 invocations into 1 user invocation.
18
+
19
+ Every task returns complete: taskId, exitCode, durationMs, timedOut, stdout, stderr. Background tasks return immediately with task_id; continue with `in/status/<N>.txt` (tail), `in/watch/<N>.txt` (watch), or `in/close/<N>.txt` (close).
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: gm-vscode
3
+ description: AI-native software engineering via skill-driven orchestration on vscode; bootstraps plugkit for task execution and session isolation
4
+ allowed-tools: Skill
5
+ ---
6
+
7
+ # GM — vscode Platform
8
+
9
+ AI-native software engineering orchestrated via skill chain: PLAN → EXECUTE → EMIT → VERIFY → UPDATE-DOCS.
10
+
11
+ **Bootstrap pattern**: `bun x gm-plugkit@latest --daemon` downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Call once at session start; idempotent on subsequent calls. All execution routes through the file-spool: write to `.gm/exec-spool/in/<lang>/<N>.<ext>` or `in/<verb>/<N>.txt`, poll `out/<N>.json` for results.
12
+
13
+ **Session-ID threading (no session-start hook)**: At skill invoke time, generate or detect SESSION_ID (env var `SESSION_ID` or `uuid()`). Pass `sessionId: "<id>"` in every rs-exec RPC body (spawn, tail, watch, etc.) and every spool-written task body. All task-scoped cleanup (deleteTask, getTask, appendOutput, killSessionTasks) requires matching sessionId. Absence is forbidden — hard reject by rs-exec handler.
14
+
15
+ **Spool dispatch surface**: Write to `.gm/exec-spool/in/<lang>/<N>.<ext>` (languages: nodejs, python, bash, typescript, go, rust, c, cpp, java, deno) or `in/<verb>/<N>.txt` (verbs: codesearch, recall, memorize, wait, sleep, status, close, browser, runner, etc.). Watcher executes and streams `out/<N>.out` (stdout) + `out/<N>.err` (stderr) line-by-line, then `out/<N>.json` metadata (exitCode, durationMs, timedOut, startedAt, endedAt) at completion.
16
+
17
+ **End-to-end skill chaining (skills-based platforms)**: When gm SKILL.md includes `end-to-end: true`, adapter detects signal and parses stdout for trailing JSON: `{"nextSkill": "...", "context": {...}, "phase": "..."}`. If nextSkill is non-null, invoke `Skill(skill="gm:<nextSkill>")` with context dict, repeat until null. This auto-chains 5 invocations into 1 user invocation.
18
+
19
+ Every task returns complete: taskId, exitCode, durationMs, timedOut, stdout, stderr. Background tasks return immediately with task_id; continue with `in/status/<N>.txt` (tail), `in/watch/<N>.txt` (watch), or `in/close/<N>.txt` (close).
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: gm-zed
3
+ description: AI-native software engineering via skill-driven orchestration on zed; bootstraps plugkit for task execution and session isolation
4
+ allowed-tools: Skill
5
+ ---
6
+
7
+ # GM — zed Platform
8
+
9
+ AI-native software engineering orchestrated via skill chain: PLAN → EXECUTE → EMIT → VERIFY → UPDATE-DOCS.
10
+
11
+ **Bootstrap pattern**: `bun x gm-plugkit@latest --daemon` downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Call once at session start; idempotent on subsequent calls. All execution routes through the file-spool: write to `.gm/exec-spool/in/<lang>/<N>.<ext>` or `in/<verb>/<N>.txt`, poll `out/<N>.json` for results.
12
+
13
+ **Session-ID threading (no session-start hook)**: At skill invoke time, generate or detect SESSION_ID (env var `SESSION_ID` or `uuid()`). Pass `sessionId: "<id>"` in every rs-exec RPC body (spawn, tail, watch, etc.) and every spool-written task body. All task-scoped cleanup (deleteTask, getTask, appendOutput, killSessionTasks) requires matching sessionId. Absence is forbidden — hard reject by rs-exec handler.
14
+
15
+ **Spool dispatch surface**: Write to `.gm/exec-spool/in/<lang>/<N>.<ext>` (languages: nodejs, python, bash, typescript, go, rust, c, cpp, java, deno) or `in/<verb>/<N>.txt` (verbs: codesearch, recall, memorize, wait, sleep, status, close, browser, runner, etc.). Watcher executes and streams `out/<N>.out` (stdout) + `out/<N>.err` (stderr) line-by-line, then `out/<N>.json` metadata (exitCode, durationMs, timedOut, startedAt, endedAt) at completion.
16
+
17
+ **End-to-end skill chaining (skills-based platforms)**: When gm SKILL.md includes `end-to-end: true`, adapter detects signal and parses stdout for trailing JSON: `{"nextSkill": "...", "context": {...}, "phase": "..."}`. If nextSkill is non-null, invoke `Skill(skill="gm:<nextSkill>")` with context dict, repeat until null. This auto-chains 5 invocations into 1 user invocation.
18
+
19
+ Every task returns complete: taskId, exitCode, durationMs, timedOut, stdout, stderr. Background tasks return immediately with task_id; continue with `in/status/<N>.txt` (tail), `in/watch/<N>.txt` (watch), or `in/close/<N>.txt` (close).
@@ -3,24 +3,25 @@ name: governance
3
3
  description: Governance reference invoked by PLAN/EXECUTE/EMIT/VERIFY. Separates route discovery (PLAN) from weak-prior handoff (EXECUTE) from earned-emission legitimacy (EMIT/VERIFY). Encodes 16-failure taxonomy, 4 state planes, ΔS/λ/ε/Coverage metrics, governance stress suite.
4
4
  ---
5
5
 
6
- # Governance — Route, Bridge, Legitimacy
6
+ # Governance — Route, bridge, legitimacy
7
7
 
8
- Three roles, three failure surfaces:
9
- 1. **Route discovery** — what family of fault? Owned by `planning`.
10
- 2. **Weak-prior bridge** — plausibility ≠ authorization. Owned by `gm-execute`.
11
- 3. **Legitimacy gate** — did this answer earn its strength? Owned by `gm-emit`/`gm-complete`.
8
+ Three roles, three failure surfaces.
12
9
 
13
- ## Five Refused Collapses
10
+ 1. Route discovery — what family of fault? Owned by `planning`.
11
+ 2. Weak-prior bridge — plausibility is not authorization. Owned by `gm-execute`.
12
+ 3. Legitimacy gate — did this answer earn its strength? Owned by `gm-emit` and `gm-complete`.
14
13
 
15
- 1. Route authorization ("plan looks good" → "code is right")
16
- 2. Candidate → structural repair (local patch presented as architectural fix)
14
+ ## Five refused collapses
15
+
16
+ 1. Route → authorization ("plan looks good" treated as "code is right")
17
+ 2. Candidate → structural repair (local patch shipped as architectural fix)
17
18
  3. Hidden → public law (internal convenience shipped as contract)
18
- 4. Cleanliness → legitimacy (compiles = evidence-supports)
19
+ 4. Cleanliness → legitimacy (compiles treated as evidence-supports)
19
20
  5. One strong route → universal closure (best answer treated as only answer)
20
21
 
21
- When in doubt: preserve ambiguity. Lawful downgrade beats forced closure.
22
+ When in doubt, preserve ambiguity. Lawful downgrade beats forced closure.
22
23
 
23
- ## 7 Route Families
24
+ ## 7 route families
24
25
 
25
26
  | Family | What breaks | Repair |
26
27
  |---|---|---|
@@ -32,7 +33,7 @@ When in doubt: preserve ambiguity. Lawful downgrade beats forced closure.
32
33
  | boundary | Interfaces, contracts, seams | Re-assert contract from one source |
33
34
  | representation | Data shape, schema, type | Make illegal states unrepresentable |
34
35
 
35
- ## 16 Failure Modes
36
+ ## 16 failure modes
36
37
 
37
38
  | # | Name | Family |
38
39
  |---|---|---|
@@ -53,7 +54,7 @@ When in doubt: preserve ambiguity. Lawful downgrade beats forced closure.
53
54
  | 15 | Deployment deadlock | execution |
54
55
  | 16 | Pre-deploy collapse | execution |
55
56
 
56
- ## 4 State Planes
57
+ ## 4 state planes
57
58
 
58
59
  | Plane | Owner | States | Implication |
59
60
  |---|---|---|---|
@@ -62,18 +63,18 @@ When in doubt: preserve ambiguity. Lawful downgrade beats forced closure.
62
63
  | repair_legality | gm-emit | unverified → local_candidate → structural | Local cannot ship as structural |
63
64
  | hidden_decision_posture | gm-complete | open → down_weighted → closed | Close only after CI green |
64
65
 
65
- ## Quality Metrics
66
+ ## Quality metrics
66
67
 
67
68
  - **ΔS** — witnessed output equals expected. ΔS≠0 = still open.
68
- - **λ≥2** — two independent paths agree. λ=1 = still unknown.
69
+ - **λ ≥ 2** — two independent paths agree. λ=1 = still unknown.
69
70
  - **ε** — adjacent invariants hold (types, tests, neighboring callers).
70
- - **Coverage≥0.70** — enough corpus inspected to rule out contradicting evidence.
71
+ - **Coverage 0.70** — enough corpus inspected to rule out contradicting evidence.
71
72
 
72
- All four must pass before mutable flips UNKNOWN→KNOWN.
73
+ All four pass before a mutable flips UNKNOWN KNOWN.
73
74
 
74
- ## Stress Suite (8 Cases)
75
+ ## Stress suite
75
76
 
76
- Run before declaring COMPLETE:
77
+ Run before declaring COMPLETE.
77
78
 
78
79
  | # | Case | Failure if flunked |
79
80
  |---|---|---|
@@ -86,11 +87,11 @@ Run before declaring COMPLETE:
86
87
  | A1 | Authenticity eval partial signals | Surface appearance beats evidence |
87
88
  | D1 | Deploy-gate under CI flake | Treats noise as green |
88
89
 
89
- Legal: illegal_commitment=0, evidence_boundary_violation=0, lawful_downgrade=available in all 8, outlier_visibility=preserved.
90
+ Legal: `illegal_commitment=0`, `evidence_boundary_violation=0`, `lawful_downgrade=available` in all 8, `outlier_visibility=preserved`.
90
91
 
91
- ## Phase Application
92
+ ## Phase application
92
93
 
93
94
  - **planning** — tag every `.prd` item with route family + failure-mode IDs
94
- - **gm-execute** — weak prior only; witnessed probe required before authorization
95
+ - **gm-execute** — weak prior only; witnessed probe before authorization
95
96
  - **gm-emit** — legitimacy gate; unearned specificity → lawful downgrade
96
- - **gm-complete** — stress-suite pass; close posture only CI green
97
+ - **gm-complete** — stress-suite pass; close posture only when CI is green
@@ -3,41 +3,37 @@ name: pages
3
3
  description: Scaffold and maintain a GitHub Pages site. Buildless in browser (webjsx + rippleui via CDN), flatspace for content aggregation built during GH Actions. Use when user wants to create or update a GH Pages site.
4
4
  ---
5
5
 
6
- # Pages — GitHub Pages Site Scaffolder
6
+ # Pages — GitHub Pages site scaffolder
7
7
 
8
- Scaffold a complete GH Pages site: **no local build step**, content managed via flatspace flat-file CMS, UI via webjsx + rippleui CDN, GH Actions builds and deploys.
9
-
10
- **Follow full gm skill chain: planning → gm-execute → gm-emit → gm-complete → update-docs.**
8
+ Scaffold a complete GH Pages site with no local build step. Content via flatspace flat-file CMS, UI via webjsx + rippleui CDN, GH Actions builds and deploys. Follow the full chain: `planning → gm-execute → gm-emit → gm-complete → update-docs`.
11
9
 
12
10
  ## Stack
13
11
 
14
12
  | Layer | Tool | How |
15
- |-------|------|-----|
13
+ |---|---|---|
16
14
  | UI rendering | [webjsx](https://webjsx.org) | ES module via importmap, `applyDiff` for DOM updates |
17
15
  | Styling | [rippleui](https://ripple-ui.com) | CDN `<link>` — Tailwind-based component classes |
18
16
  | Content CMS | [flatspace](https://npmjs.com/package/flatspace) | Aggregates `content/` → `docs/data/*.json` at build time |
19
17
  | Build | GH Actions | `npx flatspace` runs in CI, commits output to `docs/` |
20
- | Hosting | GitHub Pages | Source: `docs/` branch, or GH Actions deploy |
18
+ | Hosting | GitHub Pages | Source set to "GitHub Actions" |
21
19
 
22
- ## Directory Layout
20
+ ## Layout
23
21
 
24
22
  ```
25
23
  <project>/
26
- content/ # Source content (markdown, json, yaml)
27
- pages/ # Static pages (index.md, about.md, ...)
28
- posts/ # Blog posts or articles
29
- data/ # Structured data files
30
- docs/ # GH Pages root (gitignored build output except index.html)
31
- index.html # Entry point — committed, never regenerated
32
- app.js # Main webjsx app — committed
33
- data/ # flatspace output gitignored, built by CI
34
- .github/
35
- workflows/
36
- pages.yml # Build + deploy workflow
37
- flatspace.config.js # flatspace aggregation config
24
+ content/
25
+ pages/
26
+ posts/
27
+ data/
28
+ docs/
29
+ index.html # committed, never regenerated
30
+ app.js # committed
31
+ data/ # flatspace output, gitignored
32
+ .github/workflows/pages.yml
33
+ flatspace.config.js
38
34
  ```
39
35
 
40
- ## index.html — Buildless Entry
36
+ ## index.html
41
37
 
42
38
  ```html
43
39
  <!DOCTYPE html>
@@ -63,28 +59,19 @@ Scaffold a complete GH Pages site: **no local build step**, content managed via
63
59
  </html>
64
60
  ```
65
61
 
66
- ## app.js — webjsx App Pattern
62
+ ## app.js
67
63
 
68
64
  ```js
69
65
  import { applyDiff } from 'webjsx';
70
66
 
71
67
  const h = (tag, props, ...children) => ({ tag, props: props || {}, children });
72
-
73
68
  const state = { page: null, data: {} };
74
69
 
75
- async function loadData(path) {
76
- const res = await fetch(path);
77
- return res.json();
78
- }
79
-
80
- function render() {
81
- applyDiff(document.getElementById('root'), App(state));
82
- }
70
+ async function loadData(path) { return (await fetch(path)).json(); }
71
+ function render() { applyDiff(document.getElementById('root'), App(state)); }
83
72
 
84
73
  function App(s) {
85
- if (!s.page) return h('div', { class: 'flex justify-center p-8' },
86
- h('span', { class: 'spinner' })
87
- );
74
+ if (!s.page) return h('div', { class: 'flex justify-center p-8' }, h('span', { class: 'spinner' }));
88
75
  return h('div', { class: 'max-w-4xl mx-auto p-4' },
89
76
  h('nav', { class: 'navbar bg-backgroundSecondary mb-6' },
90
77
  h('span', { class: 'navbar-brand text-xl font-bold' }, s.page.title)
@@ -100,11 +87,7 @@ function Section(section) {
100
87
  );
101
88
  }
102
89
 
103
- async function main() {
104
- state.page = await loadData('./data/index.json');
105
- render();
106
- }
107
-
90
+ async function main() { state.page = await loadData('./data/index.json'); render(); }
108
91
  main();
109
92
  ```
110
93
 
@@ -122,11 +105,10 @@ module.exports = {
122
105
  };
123
106
  ```
124
107
 
125
- ## GH Actions Workflow — pages.yml
108
+ ## pages.yml
126
109
 
127
110
  ```yaml
128
111
  name: Deploy GitHub Pages
129
-
130
112
  on:
131
113
  push:
132
114
  branches: [main]
@@ -142,14 +124,10 @@ jobs:
142
124
  runs-on: ubuntu-latest
143
125
  steps:
144
126
  - uses: actions/checkout@v4
145
-
146
127
  - uses: actions/setup-node@v4
147
- with:
148
- node-version: '20'
149
-
128
+ with: { node-version: '20' }
150
129
  - name: Build content with flatspace
151
130
  run: npx flatspace
152
-
153
131
  - name: Commit built data
154
132
  run: |
155
133
  git config user.name "github-actions[bot]"
@@ -157,11 +135,8 @@ jobs:
157
135
  git add docs/data/
158
136
  git diff --staged --quiet || git commit -m "chore: build content [skip ci]"
159
137
  git push
160
-
161
- - name: Upload Pages artifact
162
- uses: actions/upload-pages-artifact@v3
163
- with:
164
- path: docs/
138
+ - uses: actions/upload-pages-artifact@v3
139
+ with: { path: docs/ }
165
140
 
166
141
  deploy:
167
142
  needs: build
@@ -174,26 +149,14 @@ jobs:
174
149
  uses: actions/deploy-pages@v4
175
150
  ```
176
151
 
177
- ## Scaffolding Steps
152
+ ## Scaffold sequence
178
153
 
179
- When user says "set up pages" or "create GH pages site":
154
+ Read existing `docs/` and `content/` if present — never clobber existing content. Create the directory structure. Write `docs/index.html`, `docs/app.js`, `flatspace.config.js`, `.github/workflows/pages.yml`, `content/pages/index.md` with minimal frontmatter (`title`, `sections` array). Add `docs/data/` to `.gitignore`. Verify GH Pages setting is "GitHub Actions" in repo Settings — remind the user if you can't verify.
180
155
 
181
- 1. **Read** existing `docs/` and `content/` if present — never clobber existing content
182
- 2. **Create** directory structure above
183
- 3. **Write** `docs/index.html` with correct site title
184
- 4. **Write** `docs/app.js` with webjsx app skeleton
185
- 5. **Write** `flatspace.config.js`
186
- 6. **Write** `.github/workflows/pages.yml`
187
- 7. **Write** `content/pages/index.md` with minimal frontmatter (`title`, `sections` array)
188
- 8. **Add** `docs/data/` to `.gitignore` (built by CI, not committed by humans)
189
- 9. **Verify** GH Pages setting is "GitHub Actions" in repo Settings — remind user if can't verify
190
-
191
- ## rippleui Component Classes Quick Reference
192
-
193
- Use these directly in JSX className strings — no config needed:
156
+ ## rippleui classes
194
157
 
195
158
  | Component | Class |
196
- |-----------|-------|
159
+ |---|---|
197
160
  | Button | `btn btn-primary`, `btn btn-secondary`, `btn btn-ghost` |
198
161
  | Card | `card p-4` |
199
162
  | Input | `input input-primary` |
@@ -203,30 +166,18 @@ Use these directly in JSX className strings — no config needed:
203
166
  | Spinner | `spinner` |
204
167
  | Divider | `divider` |
205
168
 
206
- Background: `bg-backgroundPrimary`, `bg-backgroundSecondary`. Text: `text-content1`, `text-content2`.
207
-
208
- **CSS variable warning**: rippleui color vars (e.g. `--gray-2`) are raw space-separated RGB tuples — not valid CSS colors. Never use them in `rgb()` directly from JS. Use the component classes instead.
209
-
210
- ## webjsx Patterns
211
-
212
- **No JSX transpile needed** — use `h()` factory or import from CDN with importmap and write JSX in `.jsx` files served directly (Chrome supports importmap natively).
213
-
214
- For `.js` files without transpile, use the `h` factory pattern shown above.
169
+ Background `bg-backgroundPrimary`, `bg-backgroundSecondary`. Text `text-content1`, `text-content2`. rippleui CSS color vars (e.g. `--gray-2`) are raw space-separated RGB tuples — invalid in `rgb()` directly. Use the component classes instead.
215
170
 
216
- For `.jsx` with native importmap (no build):
217
- ```js
218
- /** @jsxImportSource webjsx */
219
- import { applyDiff } from 'webjsx';
220
- ```
221
- Only works if server sets correct MIME type for `.jsx` — GH Pages does not. Use `.js` + `h()` factory.
171
+ ## webjsx
222
172
 
223
- **applyDiff signature**: `applyDiff(domNode, vnodeOrArray)` never pass a string, always pass a vnode from `h()`.
173
+ No JSX transpile needed. Use the `h()` factory in `.js` files served directly. `.jsx` with native importmap requires the server to set the correct MIME type, which GH Pages does not — stay in `.js` + `h()`.
224
174
 
225
- **State updates**: mutate `state`, call `render()` no reactive system, explicit re-render on every change.
175
+ `applyDiff(domNode, vnodeOrArray)` — never pass a string. State updates mutate `state` and call `render()`; no reactive system.
226
176
 
227
- ## Content Format (flatspace input)
177
+ ## Content format
228
178
 
229
179
  Markdown with YAML frontmatter:
180
+
230
181
  ```markdown
231
182
  ---
232
183
  title: Home
@@ -240,19 +191,18 @@ sections:
240
191
  Full markdown body here.
241
192
  ```
242
193
 
243
- flatspace outputs `docs/data/pages/index.json`:
194
+ Output `docs/data/pages/index.json`:
195
+
244
196
  ```json
245
197
  { "title": "Home", "sections": [...], "body": "<p>Full markdown body here.</p>", "slug": "index" }
246
198
  ```
247
199
 
248
- ## Known Gotchas
249
-
250
- **GH Pages must be set to "GitHub Actions"** in Settings → Pages. "Deploy from branch" ignores the deploy-pages action entirely.
200
+ ## Gotchas
251
201
 
252
- **docs/data/ must be in .gitignore** but `docs/index.html` and `docs/app.js` must NOT be ignored they are the committed source files.
202
+ GH Pages must be set to "GitHub Actions" in Settings Pages. "Deploy from branch" ignores the deploy-pages action.
253
203
 
254
- **flatspace npx cold start**: first CI run downloads flatspace takes ~10s extra. Subsequent runs use cache if `actions/setup-node` cache is configured.
204
+ `docs/data/` is gitignored; `docs/index.html` and `docs/app.js` are notthey are the committed source files.
255
205
 
256
- **importmap browser support**: all modern browsers support importmap. No IE, no Safari < 16.4. For GH Pages this is fine.
206
+ `npx flatspace` cold-start is ~10s on first CI run; subsequent runs use the `actions/setup-node` cache.
257
207
 
258
- **webjsx CDN version**: pin to explicit version in importmap (e.g. `@0.0.42`) — avoid `@latest` to prevent silent breakage on upstream updates.
208
+ Pin the webjsx CDN version in importmap (e.g. `@0.0.42`) — `@latest` breaks silently on upstream updates.