Skip to content

Commit e5d6f92

Browse files
committed
docs: fix tutorial syntax (# comments, bare paths, def entry), update CI with multi-platform matrix
1 parent c4e9c79 commit e5d6f92

8 files changed

Lines changed: 157 additions & 245 deletions

File tree

.github/workflows/ci.yml

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,49 @@ name: CI
33
on:
44
push:
55
branches: [master, main]
6+
tags: ["v*"]
67
pull_request:
78
branches: [master, main]
89

910
jobs:
11+
# ── 编译 + 静态检查 ──────────────────────────────────────────────────────
1012
build:
11-
runs-on: ubuntu-latest
13+
strategy:
14+
matrix:
15+
os: [ubuntu-latest, macos-latest]
16+
runs-on: ${{ matrix.os }}
1217
steps:
1318
- uses: actions/checkout@v4
14-
1519
- uses: actions/setup-go@v5
1620
with:
1721
go-version: "1.24"
18-
1922
- run: go build ./...
2023
- run: go vet ./...
2124
- run: go test ./... -count=1
25+
26+
# ── 多平台交叉编译(仅 tag 时生成 release 产物)─────────────────────────
27+
release:
28+
if: startsWith(github.ref, 'refs/tags/v')
29+
runs-on: ubuntu-latest
30+
steps:
31+
- uses: actions/checkout@v4
32+
- uses: actions/setup-go@v5
33+
with:
34+
go-version: "1.24"
35+
36+
- name: Cross-compile
37+
run: |
38+
mkdir -p dist
39+
for GOOS in linux darwin; do
40+
for GOARCH in amd64 arm64; do
41+
echo "Building $GOOS/$GOARCH..."
42+
GOOS=$GOOS GOARCH=$GOARCH go build -ldflags="-s -w" -o dist/kvlang-$GOOS-$GOARCH ./cmd/kvlang/
43+
done
44+
done
45+
ls -lh dist/
46+
47+
- name: Create Release
48+
uses: softprops/action-gh-release@v2
49+
with:
50+
files: dist/*
51+
generate_release_notes: true

doc/kvlang/草稿/repo.md

Lines changed: 44 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -1,198 +1,65 @@
11
# kvlang GitHub 项目优化评估
22

3-
> 按 7 维度逐一评估现状,给出可执行改进项。目标:提高 star 数。
4-
>
5-
> 每个维度 0-10 分,10 = 顶尖开源项目水准。
3+
> 按 7 维度评估,已完成标记 ✅,剩余待办按优先级排列。
64
75
---
86

9-
## 1. 文档/规范(当前 3/10 → 目标 7/10)
7+
## 1. 文档/规范(3→5/10)
108

11-
### 现状
12-
|||
13-
|----|-----|
14-
| README.md(含快速开始、语言速览) | LICENSE 文件 |
15-
| grammar.bnf(形式语法) | 英文 README(当前仅中文) |
16-
| 设计文档 20+ 篇(doc/) | 架构图(组件关系、数据流) |
17-
| | 语言教程(step-by-step) |
18-
| | API 文档 |
9+
- [x] LICENSE (MIT)
10+
- [x] 英文 README + mermaid 架构图 + CI badge
11+
- [x] 5 分钟入门教程(tutorial/ 6 步)
12+
- [ ] **LANGUAGE_SPEC.md**:从 grammar.bnf 扩展语义说明
13+
- [ ] **API 参考**:builtin 函数一览表(参数、返回值、示例)
1914

20-
### 改进项(按优先级
15+
## 2. 测试覆盖 & CI(2→5/10
2116

22-
**P0 — 已完成**:
23-
- [x] **添加 LICENSE**(MIT)
24-
- [x] **README 加英文版** + mermaid 架构图
25-
- [x] **GitHub Actions CI** + badge
26-
- [x] **打 tag v0.1.0** + CHANGELOG
17+
- [x] GitHub Actions CI(build/vet/test,linux + macos)
18+
- [x] CI badge
19+
- [x] 多平台 Release CI(tag 触发,linux/darwin amd64/arm64)
20+
- [ ] **补核心包单元测试**:kvcpu、lower、vthread、parser
21+
- [ ] **make cover** 覆盖率报告
2722

28-
**P1**:
29-
- [x] **CONTRIBUTING.md**
30-
- [x] **Issue 模板**(bug report + feature request)
31-
- [x] **ROADMAP.md**
32-
- [x] **5 分钟入门教程**`tutorial/` 目录,6 步渐进)
23+
## 3. 可复现构建(6→7/10)
3324

34-
---
35-
36-
## 2. 测试覆盖 & CI(当前 2/10 → 目标 7/10)
37-
38-
### 现状
39-
|||
40-
|----|-----|
41-
| 4 个 `*_test.go`(link_test, op, parser) | CI pipeline(GitHub Actions) |
42-
| `example/run.py` 集成测试 175 用例 | `go test -cover` 覆盖率报告 |
43-
| `make test` 命令 | CI badge(README 中显示绿色 passing) |
44-
| | 单元测试覆盖核心逻辑(kvcpu, lower, vthread) |
45-
46-
### 改进项
47-
48-
**P0**:
49-
- [ ] **GitHub Actions CI**`.github/workflows/ci.yml`,包含:
50-
```yaml
51-
- go build ./...
52-
- go vet ./...
53-
- go test ./... -coverprofile=coverage.out
54-
- python3 example/run.py # 集成测试
55-
services: redis:7-alpine
56-
```
57-
- [ ] **CI badge** 放在 README 顶部
58-
59-
**P1**:
60-
- [ ] **补核心包单元测试**:`internal/kvcpu/`, `internal/lower/`, `internal/vthread/`, `internal/parser/`
61-
- [ ] **`make cover`** 生成覆盖率 HTML
62-
63-
---
25+
- [x] tag v0.1.0 + CHANGELOG
26+
- [x] 多平台交叉编译(CI release job)
27+
- [ ] **go install 验证**:确认 go install ... @latest 可用
6428

65-
## 3. 可复现构建(当前 6/10 → 目标 8/10)
29+
## 4. 依赖复杂度(保持 7/10)
6630

67-
### 现状
68-
| 有 | 缺 |
69-
|----|-----|
70-
| `go.mod`(仅 2 直接依赖) | 版本号/tag(`git tag`) |
71-
| `Makefile`(build/test/vet/clean) | 二进制 release(GitHub Releases) |
72-
| `.gitignore` 完整 | 多平台构建(当前仅 Linux) |
73-
| `GOPROXY` 国内镜像配置 | |
31+
- [x] README 显式标注"仅 2 运行时依赖"
32+
- 无需改动。极简依赖是卖点。
7433

75-
### 改进项
76-
77-
**P0**:
78-
- [ ] **打版本 tag**:`git tag v0.1.0 && git push --tags`。有 tag 才有 release,有 release 才有下载量/star 转化。
79-
- [ ] **`make build-all`**:`GOOS=linux/darwin GOARCH=amd64/arm64` 四平台交叉编译
80-
81-
**P1**:
82-
- [ ] **GitHub Release CI**:tag push 自动构建四平台二进制并发布
83-
- [ ] **`go install` 支持**:`go install github.com/array2d/kvlang/cmd/kvlang@latest`
84-
85-
---
34+
## 5. 示例/入门(4→6/10)
8635

87-
## 4. 依赖复杂度(当前 7/10 → 保持 7/10)
88-
89-
### 现状
90-
- 2 个直接依赖:`gorilla/websocket` + `redis/go-redis/v9`
91-
- 间接依赖仅 2 个(xxhash, atomic)
92-
- **优势:极度精简**,这是亮点
93-
94-
### 建议
95-
- **README 中显式标出**:"仅 2 个运行时依赖"作为卖点
96-
- Redis 是唯一外部服务依赖。README 中注明如何 3 行 CI 配置 Redis
97-
- 考虑未来可选:`go build -tags nomqtt` 去掉 websocket 依赖
98-
99-
---
100-
101-
## 5. 示例/入门(当前 4/10 → 目标 8/10)
102-
103-
### 现状
104-
| 有 | 缺 |
105-
|----|-----|
106-
| 179 个 `.kv` 示例文件 | 结构化教程(入门→进阶) |
107-
| 覆盖 arith/cast/compare/logic/call/controlflow/algo | 每个示例的说明文档 |
108-
| P0-P3 分级测试 | 与应用场景关联的 demo(如 HTTP API) |
109-
110-
### 改进项
111-
112-
**P0**:
113-
- [ ] **创建一个独立 tutorial 目录**:
114-
```
115-
tutorial/
116-
01-hello-world/ # print("hello")
117-
02-variables/ # 赋值与读取
118-
03-arithmetic/ # 加减乘除
119-
04-functions/ # def / call
120-
05-control-flow/ # if / loop
121-
06-recursion/ # fibonacci
122-
```
123-
每个目录含 `main.kv` + `README.md`(中英双语)
124-
125-
**P1**:
126-
- [ ] **README 中嵌入可运行的 demo gif/asciicast**
127-
- [ ] **Playground 链接**(若有在线环境)
128-
129-
---
36+
- [x] tutorial/ 6 步渐进教程
37+
- [ ] **demo gif/asciicast**:README 中嵌入终端录制
38+
- [ ] **在线 playground**(GitHub Pages + WASM?)
13039

131-
## 6. 安全/沙箱友好(当前 ?/10 → 目标 6/10)
40+
## 6. 安全/沙箱友好(?→4/10)
13241

133-
### 分析
134-
kvlang 的 KV 路径寻址天然适合沙箱:
135-
- 所有 I/O 走 `kvspace`(可限制路径前缀)
136-
- 无直接文件系统/网络访问(除非通过 `term_ws.go` 等 device 抽象)
137-
- 指令集有限,无任意代码执行
42+
- [ ] **SECURITY.md**:文档化沙箱模型(KV 路径隔离、无 FS/网络直访)
43+
- [ ] **资源限制文档**:最大 vthread 数、递归深度
13844

139-
### 改进项
45+
## 7. 维护活跃度(3→7/10)
14046

141-
- [ ] **文档化安全模型**:在 README/SECURITY.md 中说明沙箱边界
142-
- [ ] **`--sandbox` flag**:限制访问路径前缀(如只允许 `/vt/<id>` 下操作)
143-
- [ ] **资源限制**:最大 vthread 数、最大递归深度(已有 TCO,但显式说明)
47+
- [x] tag v0.1.0 + CHANGELOG
48+
- [x] CONTRIBUTING.md
49+
- [x] Issue 模板(bug report + feature request)
50+
- [x] ROADMAP.md
51+
- [ ] **定期 release**:每 2-4 周打 tag
14452

14553
---
14654

147-
## 7. 维护活跃度(当前 3/10 → 目标 6/10)
148-
149-
### 现状
150-
| 有 | 缺 |
151-
|----|-----|
152-
| 频繁 commit(日更) | 版本 tag / release |
153-
| 设计文档持续更新 | CHANGELOG |
154-
| | CONTRIBUTING.md |
155-
| | Issue/PR 模板 |
156-
| | 项目 roadmap |
157-
158-
### 改进项
159-
160-
**P0**:
161-
- [ ] **打第一个 release tag**(v0.1.0)
162-
- [ ] **CHANGELOG.md**:按版本记录变更
163-
164-
**P1**:
165-
- [ ] **CONTRIBUTING.md**:如何贡献代码、运行测试、提交 PR
166-
- [ ] **Issue 模板**:`.github/ISSUE_TEMPLATE/bug_report.md`
167-
- [ ] **ROADMAP.md**:未来 3 个月的计划
168-
169-
---
170-
171-
## 优先执行顺序
172-
173-
按 **star 转化率 × 实施成本** 排序:
174-
175-
| 优先级 | 项目 | 预计耗时 | 影响 |
176-
|--------|------|---------|------|
177-
| **1** | 添加 LICENSE (MIT) | 1 min | ⭐⭐⭐⭐⭐ |
178-
| **2** | GitHub Actions CI + badge | 30 min | ⭐⭐⭐⭐⭐ |
179-
| **3** | 英文 README + 架构图 | 1 h | ⭐⭐⭐⭐ |
180-
| **4** | 打 tag v0.1.0 + CHANGELOG | 10 min | ⭐⭐⭐⭐ |
181-
| **5** | 5 分钟入门教程(tutorial/) | 2 h | ⭐⭐⭐ |
182-
| **6** | 补核心包单元测试 | 4 h | ⭐⭐⭐ |
183-
| **7** | 多平台构建 + Release CI | 1 h | ⭐⭐ |
184-
| **8** | CONTRIBUTING / Issue 模板 | 30 min | ⭐⭐ |
185-
186-
---
187-
188-
## 竞品对标
189-
190-
| | kvlang | Lua | Wren | Scheme (chibi) |
191-
|--|--------|-----|------|----------------|
192-
| 核心依赖 | 2 | 0 (纯 C) | 0 | 0 |
193-
| 存储模型 | KV 路径树(Redis) | 栈+表 | 栈+对象 | 栈+链表 |
194-
| 并发模型 | vthread 协程 | 单线程 | 单线程 | 单线程 |
195-
| 定位 | 分布式原生 VM | 嵌入式脚本 | 嵌入式脚本 | 嵌入式脚本 |
196-
| **差异化** | **数据和指令同一棵树,天然可持久化/可共享/可分布式** | | | |
197-
198-
kvlang 的核心卖点不是"又一个脚本语言",而是 **"指令即数据,数据即指令"的 KV 树模型**。README 和文档应围绕这个差异化展开。
55+
## 剩余待办(按优先级)
56+
57+
| # | 项目 | 耗时 | 影响 |
58+
|---|------|------|------|
59+
| 1 | LANGUAGE_SPEC.md 语言规范 | 2 h | 4/5 |
60+
| 2 | 补核心包单元测试 | 4 h | 3/5 |
61+
| 3 | make cover 覆盖率报告 | 15 min | 3/5 |
62+
| 4 | demo gif / asciicast | 1 h | 3/5 |
63+
| 5 | SECURITY.md 安全模型 | 30 min | 2/5 |
64+
| 6 | API 参考(builtin 一览表) | 1 h | 2/5 |
65+
| 7 | go install 验证 | 5 min | 2/5 |

tutorial/01-hello/main.kv

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
// 01-hello: your first kvlang program
2-
// Run: kvlang tutorial/01-hello/main.kv
1+
# 01-hello: your first kvlang program
2+
# Run: kvlang tutorial/01-hello/main.kv
33

4-
str.set("kvlangrun") -> './term' // activate output
5-
print("hello kvlang")
4+
str.set("kvlangrun") -> ./term
5+
6+
def main() -> () {
7+
print("hello kvlang")
8+
}
9+
main() -> ()

tutorial/02-vars/main.kv

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
// 02-vars: variables and paths
2-
// Run: kvlang tutorial/02-vars/main.kv
1+
# 02-vars: variables and paths
2+
# Run: kvlang tutorial/02-vars/main.kv
33

4-
str.set("kvlangrun") -> './term'
4+
str.set("kvlangrun") -> ./term
55

6-
42 -> './x' // write 42 to path './x'
7-
print("x =", './x') // read from path './x'
6+
def main() -> () {
7+
42 -> ./x // write 42 to path ./x
8+
print("x =", ./x) // read from path ./x
89

9-
'./x' + 8 -> './y' // 42 + 8 = 50
10-
print("y =", './y')
10+
./x + 8 -> ./y // 42 + 8 = 50
11+
print("y =", ./y)
12+
}
13+
main() -> ()

tutorial/03-arith/main.kv

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1-
// 03-arith: arithmetic operations
2-
// Run: kvlang tutorial/03-arith/main.kv
1+
# 03-arith: arithmetic operations
2+
# Run: kvlang tutorial/03-arith/main.kv
33

4-
str.set("kvlangrun") -> './term'
4+
str.set("kvlangrun") -> ./term
55

6-
print("add:", 10 + 3) // 13
7-
print("sub:", 10 - 3) // 7
8-
print("mul:", 10 * 3) // 30
9-
print("div:", 10 / 3) // 3 (int division)
10-
print("fdiv:", 10.0 / 3.0) // 3.333...
6+
def main() -> () {
7+
print("add:", 10 + 3) // 13
8+
print("sub:", 10 - 3) // 7
9+
print("mul:", 10 * 3) // 30
10+
print("div:", 10 / 3) // 3
11+
print("fdiv:", 10.0 / 3.0) // 3.333...
1112

12-
// math builtins
13-
print("pow:", pow(2, 5)) // 32
14-
print("sqrt:", sqrt(144)) // 12
15-
print("abs:", abs(-42)) // 42
16-
print("max:", max(3, 7, 1)) // 7
17-
print("min:", min(3, 7, 1)) // 1
13+
print("pow:", pow(2, 5)) // 32
14+
print("sqrt:", sqrt(144)) // 12
15+
print("abs:", abs(-42)) // 42
16+
print("max:", max(3, 7, 1)) // 7
17+
print("min:", min(3, 7, 1)) // 1
18+
}
19+
main() -> ()

tutorial/04-func/main.kv

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1-
// 04-func: defining and calling functions
2-
// Run: kvlang tutorial/04-func/main.kv
1+
# 04-func: defining and calling functions
2+
# Run: kvlang tutorial/04-func/main.kv
33

4-
str.set("kvlangrun") -> './term'
4+
str.set("kvlangrun") -> ./term
55

66
def add(A: int, B: int) -> (C: int) {
7-
A + B -> './C'
7+
A + B -> ./C
88
}
99

1010
def double(x: int) -> (y: int) {
11-
x * 2 -> './y'
11+
x * 2 -> ./y
1212
}
1313

14-
add(10, 20) -> './a' // 30
15-
print("add(10,20) =", './a')
14+
def main() -> () {
15+
add(10, 20) -> ./a // 30
16+
print("add(10,20) =", ./a)
1617

17-
double('./a') -> './b' // 60
18-
print("double(add(10,20)) =", './b')
18+
double(./a) -> ./b // 60
19+
print("double(add(10,20)) =", ./b)
20+
}
21+
main() -> ()

0 commit comments

Comments
 (0)