gm-copilot-cli 2.0.727 → 2.0.1063
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/agents/gm.md +1 -3
- package/agents/memorize.md +22 -2
- package/copilot-profile.md +1 -1
- package/hooks/hooks.json +10 -8
- package/hooks/hooks.spec.json +65 -0
- package/index.html +5 -3
- package/manifest.yml +1 -1
- package/package.json +2 -2
- package/skills/browser/SKILL.md +18 -16
- package/skills/code-search/SKILL.md +15 -15
- package/skills/create-lang-plugin/SKILL.md +22 -26
- package/skills/gm/SKILL.md +30 -67
- package/skills/gm-cc/SKILL.md +19 -0
- package/skills/gm-codex/SKILL.md +19 -0
- package/skills/gm-complete/SKILL.md +52 -69
- package/skills/gm-copilot-cli/SKILL.md +19 -0
- package/skills/gm-cursor/SKILL.md +19 -0
- package/skills/gm-emit/SKILL.md +44 -61
- package/skills/gm-execute/SKILL.md +42 -79
- package/skills/gm-gc/SKILL.md +19 -0
- package/skills/gm-jetbrains/SKILL.md +19 -0
- package/skills/gm-kilo/SKILL.md +19 -0
- package/skills/gm-oc/SKILL.md +19 -0
- package/skills/gm-vscode/SKILL.md +19 -0
- package/skills/gm-zed/SKILL.md +19 -0
- package/skills/governance/SKILL.md +24 -23
- package/skills/pages/SKILL.md +42 -92
- package/skills/planning/SKILL.md +53 -86
- package/skills/research/SKILL.md +43 -0
- package/skills/ssh/SKILL.md +15 -9
- package/skills/textprocessing/SKILL.md +40 -0
- package/skills/update-docs/SKILL.md +27 -21
- package/tools.json +1 -1
- package/.github/workflows/publish-npm.yml +0 -44
- package/hooks/post-tool-use-hook.js +0 -34
- package/hooks/pre-tool-use-hook.js +0 -45
- package/hooks/prompt-submit-hook.js +0 -19
|
@@ -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 exec:tail, exec:watch, or exec: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 exec:tail, exec:watch, or exec: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 exec:tail, exec:watch, or exec: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 exec:tail, exec:watch, or exec: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 exec:tail, exec:watch, or exec: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,
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
|
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
|
|
22
|
+
When in doubt, preserve ambiguity. Lawful downgrade beats forced closure.
|
|
22
23
|
|
|
23
|
-
## 7
|
|
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
|
|
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
|
|
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
|
|
66
|
+
## Quality metrics
|
|
66
67
|
|
|
67
68
|
- **ΔS** — witnessed output equals expected. ΔS≠0 = still open.
|
|
68
|
-
-
|
|
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
|
|
73
|
+
All four pass before a mutable flips UNKNOWN → KNOWN.
|
|
73
74
|
|
|
74
|
-
## Stress
|
|
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
|
|
90
|
+
Legal: `illegal_commitment=0`, `evidence_boundary_violation=0`, `lawful_downgrade=available` in all 8, `outlier_visibility=preserved`.
|
|
90
91
|
|
|
91
|
-
## Phase
|
|
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
|
|
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
|
package/skills/pages/SKILL.md
CHANGED
|
@@ -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
|
|
6
|
+
# Pages — GitHub Pages site scaffolder
|
|
7
7
|
|
|
8
|
-
Scaffold a complete GH Pages site
|
|
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
|
|
18
|
+
| Hosting | GitHub Pages | Source set to "GitHub Actions" |
|
|
21
19
|
|
|
22
|
-
##
|
|
20
|
+
## Layout
|
|
23
21
|
|
|
24
22
|
```
|
|
25
23
|
<project>/
|
|
26
|
-
content/
|
|
27
|
-
pages/
|
|
28
|
-
posts/
|
|
29
|
-
data/
|
|
30
|
-
docs/
|
|
31
|
-
index.html
|
|
32
|
-
app.js
|
|
33
|
-
data/
|
|
34
|
-
.github/
|
|
35
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
##
|
|
152
|
+
## Scaffold sequence
|
|
178
153
|
|
|
179
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
175
|
+
`applyDiff(domNode, vnodeOrArray)` — never pass a string. State updates mutate `state` and call `render()`; no reactive system.
|
|
226
176
|
|
|
227
|
-
## Content
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
202
|
+
GH Pages must be set to "GitHub Actions" in Settings → Pages. "Deploy from branch" ignores the deploy-pages action.
|
|
253
203
|
|
|
254
|
-
|
|
204
|
+
`docs/data/` is gitignored; `docs/index.html` and `docs/app.js` are not — they are the committed source files.
|
|
255
205
|
|
|
256
|
-
|
|
206
|
+
`npx flatspace` cold-start is ~10s on first CI run; subsequent runs use the `actions/setup-node` cache.
|
|
257
207
|
|
|
258
|
-
|
|
208
|
+
Pin the webjsx CDN version in importmap (e.g. `@0.0.42`) — `@latest` breaks silently on upstream updates.
|