cangming-ai-dev-kit 0.1.1 → 0.2.0
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.
- checksums.yaml +4 -4
- data/core/skills/gem-dev-workflow/SKILL.md +125 -0
- data/domains/flutter/references/common_errors.md +34 -0
- data/domains/flutter/references/flutter_commands.md +88 -0
- data/domains/flutter/references/flutter_project_structure.md +45 -0
- data/domains/flutter/references/widget_rules.md +66 -0
- data/domains/flutter/scripts/build_flutter.sh +17 -0
- data/domains/flutter/scripts/lint_flutter.sh +17 -0
- data/domains/flutter/scripts/test_flutter.sh +13 -0
- data/domains/flutter/scripts/verify_flutter.sh +47 -0
- data/domains/flutter/skills/flutter-code/SKILL.md +60 -0
- data/domains/flutter/skills/flutter-plan/SKILL.md +51 -0
- data/domains/flutter/skills/flutter-verify/SKILL.md +57 -0
- data/lib/cangming_ai_dev_kit/verifier.rb +16 -0
- data/lib/cangming_ai_dev_kit/version.rb +1 -1
- metadata +14 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 03244c61f29921b849fdaff2c42b96372f4a610292a047ddbb8c5690d7297b52
|
|
4
|
+
data.tar.gz: 0c3eade19ade8cac3c36b763de9c24c98c81f9758ace28496f0e8e619411128c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4082b3d598cc216203bbebfa8c380d08f5c4c4e86790c9fabb6a490127a8da8fff405f9c247b45d1af705b392737f6fb25bc9187c236985f8205f35141046ed8
|
|
7
|
+
data.tar.gz: 834dc50997173243deb5a071ae2898eacea1dde22d0da2feb0f7c19652d38401dfa8b2f823eab1c9c761bdda0267214e8257637c0cbb59d1db7111c9cdc1dfe8
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# gem-dev-workflow — cangming-ai-dev-kit 开发工作流
|
|
2
|
+
|
|
3
|
+
## description
|
|
4
|
+
cangming-ai-dev-kit 插件的完整开发与发布工作流,包括 skills 编辑、Gem 打包、RubyGems 发布、版本管理。
|
|
5
|
+
|
|
6
|
+
## when to use
|
|
7
|
+
- 修改 core/ domains/ 下的 skills / references / scripts
|
|
8
|
+
- 修改 lib/ exe/ 下的 Ruby CLI 代码
|
|
9
|
+
- 修改 gemspec、版本号、README
|
|
10
|
+
- 发布新版本到 RubyGems.org
|
|
11
|
+
- 提交代码到 GitHub
|
|
12
|
+
|
|
13
|
+
## workflow
|
|
14
|
+
|
|
15
|
+
### 1. 修改阶段
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart LR
|
|
19
|
+
A[编辑 SKILL.md] --> B[编辑 Ruby CLI]
|
|
20
|
+
B --> C[编辑 references/scripts]
|
|
21
|
+
C --> D[本地验证]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- **skills**: `core/skills/*/SKILL.md` 或 `domains/*/skills/*/SKILL.md`
|
|
25
|
+
- **references**: `core/references/` 或 `domains/*/references/`
|
|
26
|
+
- **scripts**: `core/scripts/` 或 `domains/*/scripts/`
|
|
27
|
+
- **Ruby CLI**: `lib/cangming_ai_dev_kit/` 或 `exe/cangming-dev-kit`
|
|
28
|
+
|
|
29
|
+
### 2. 本地验证
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 1. 验证项目结构完整性
|
|
33
|
+
cangming-dev-kit verify
|
|
34
|
+
|
|
35
|
+
# 2. 验证 sync 能正确同步 skills
|
|
36
|
+
bash scripts/sync_skills_to_adapters.sh --dry-run
|
|
37
|
+
|
|
38
|
+
# 3. 实际同步(清空并重新生成)
|
|
39
|
+
bash scripts/sync_skills_to_adapters.sh
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. 构建与安装测试
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 1. 构建 gem
|
|
46
|
+
gem build cangming-ai-dev-kit.gemspec
|
|
47
|
+
|
|
48
|
+
# 2. 本地安装测试
|
|
49
|
+
gem install --user-install ./cangming-ai-dev-kit-<VERSION>.gem
|
|
50
|
+
|
|
51
|
+
# 3. 验证 CLI
|
|
52
|
+
cangming-dev-kit version
|
|
53
|
+
cangming-dev-kit sync --dry-run
|
|
54
|
+
cangming-dev-kit verify
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 4. 版本管理
|
|
58
|
+
|
|
59
|
+
| 场景 | 版本变动 | 示例 |
|
|
60
|
+
|------|---------|------|
|
|
61
|
+
| Bug 修复 / 小调整 | PATCH +1 | 0.1.0 → 0.1.1 |
|
|
62
|
+
| 新增功能(兼容) | MINOR +1 | 0.1.0 → 0.2.0 |
|
|
63
|
+
| 破坏性变更 | MAJOR +1 | 0.1.0 → 1.0.0 |
|
|
64
|
+
|
|
65
|
+
**修改位置**:
|
|
66
|
+
- `lib/cangming_ai_dev_kit/version.rb` — `VERSION` 常量
|
|
67
|
+
- `cangming-ai-dev-kit.gemspec` — 如果有文件增删,同步更新 `spec.files`
|
|
68
|
+
|
|
69
|
+
### 5. 发布
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# 1. 推送到 RubyGems.org
|
|
73
|
+
gem push cangming-ai-dev-kit-<VERSION>.gem
|
|
74
|
+
|
|
75
|
+
# 2. 验证安装
|
|
76
|
+
gem install cangming-ai-dev-kit --user-install
|
|
77
|
+
|
|
78
|
+
# 3. 提交 git 并打 tag
|
|
79
|
+
git add -A
|
|
80
|
+
git commit -m "feat: ... (v<VERSION>)"
|
|
81
|
+
git tag v<VERSION>
|
|
82
|
+
git push && git push --tags
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 6. 发布后检查清单
|
|
86
|
+
|
|
87
|
+
- [ ] `gem install cangming-ai-dev-kit` 成功
|
|
88
|
+
- [ ] `cangming-dev-kit version` 输出正确版本
|
|
89
|
+
- [ ] `cangming-dev-kit sync --dry-run` 发现所有 skills
|
|
90
|
+
- [ ] `cangming-dev-kit verify` 全部 PASS
|
|
91
|
+
- [ ] GitHub 已推送并打 tag
|
|
92
|
+
- [ ] RubyGems.org 页面可访问
|
|
93
|
+
|
|
94
|
+
## 目录结构速查
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
cangming-ai-dev-kit/
|
|
98
|
+
├── core/skills/ # 通用开发 skills(plan / code / review / verify)
|
|
99
|
+
├── core/references/ # 通用参考文档
|
|
100
|
+
├── core/scripts/ # 通用检测/验证脚本
|
|
101
|
+
├── domains/*/skills/ # 领域 skills(harmony-plan / harmony-code / ...)
|
|
102
|
+
├── domains/*/references/ # 领域知识文档
|
|
103
|
+
├── domains/*/scripts/ # 领域构建/测试脚本
|
|
104
|
+
├── lib/ # Ruby Gem 核心代码
|
|
105
|
+
├── exe/ # CLI 可执行入口
|
|
106
|
+
├── adapters/ # 适配器骨架(源码,skills/ 目录由 sync 生成)
|
|
107
|
+
├── scripts/ # Shell wrapper 委托给 CLI
|
|
108
|
+
└── marketplace/ # 私有 marketplace 示例
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 注意事项
|
|
112
|
+
|
|
113
|
+
- **skills 目录** `adapters/*/skills/` 由 `sync` 命令自动生成,**不要手动编辑**,修改源文件后重新 sync 即可
|
|
114
|
+
- **gemspec 同步**: 新增文件时必须在 `cangming-ai-dev-kit.gemspec` 的 `spec.files` 中添加对应路径
|
|
115
|
+
- **零依赖**: 保持纯 Ruby stdlib,不引入外部 gem 依赖
|
|
116
|
+
- **Ruby >= 2.6**: 兼容 macOS 系统 Ruby,不使用过新的语法特性
|
|
117
|
+
- **shell 脚本**: 保持可执行 (`chmod +x`),在 `.gemspec` 中登记
|
|
118
|
+
|
|
119
|
+
## done criteria
|
|
120
|
+
|
|
121
|
+
- [ ] 所有修改已在本地验证通过(verify / sync --dry-run)
|
|
122
|
+
- [ ] gem 构建成功
|
|
123
|
+
- [ ] 新版本 gem 本地安装测试通过
|
|
124
|
+
- [ ] RubyGems.org 已发布
|
|
125
|
+
- [ ] GitHub 已提交并打 tag
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Flutter 常见错误与排查
|
|
2
|
+
|
|
3
|
+
## 编译错误
|
|
4
|
+
|
|
5
|
+
| 错误 | 原因 | 解决 |
|
|
6
|
+
|------|------|------|
|
|
7
|
+
| `The method 'X' isn't defined for the type 'Y'` | 方法不存在或 import 缺失 | 检查 import、拼写、版本兼容性 |
|
|
8
|
+
| `Undefined name` | 变量未声明或 import 缺失 | 检查作用域和 import |
|
|
9
|
+
| `Expected a value of type 'X' but got 'Y'` | 类型不匹配 | 检查 null safety 和类型转换 |
|
|
10
|
+
| `The argument type 'X' can't be assigned` | 参数类型不匹配 | 检查函数签名 |
|
|
11
|
+
| `'const' can't be used with non-const constructor` | const 误用 | 去掉 const 或确认构造方法为 const |
|
|
12
|
+
| `Only static members can be accessed in initializers` | 在初始化列表访问了实例成员 | 改为 static 或使用 late |
|
|
13
|
+
| `The non-nullable variable must be assigned` | late 变量未初始化 | 确保赋值路径完整 |
|
|
14
|
+
|
|
15
|
+
## 运行时错误
|
|
16
|
+
|
|
17
|
+
| 错误 | 原因 | 解决 |
|
|
18
|
+
|------|------|------|
|
|
19
|
+
| `setState() called after dispose()` | 在 widget 销毁后调了 setState | 检查 `mounted` 属性 |
|
|
20
|
+
| `Could not find the correct Provider` | Provider 未在 widget 树上层注册 | 检查 MultiProvider 配置 |
|
|
21
|
+
| `Vertical viewport was given unbounded height` | Column 嵌套 ListView 未限制高度 | 用 `Expanded` / `SizedBox` 包裹 |
|
|
22
|
+
| `A RenderFlex overflowed by X pixels` | 布局超出屏幕 | 用 `Flexible` / `Expanded` / 滚动 |
|
|
23
|
+
| `NoSuchMethodError: The method 'X' was called on null` | 空值访问 | 检查 null safety 和初始化 |
|
|
24
|
+
| `A build function returned null` | build() 返回了 null | build() 必须返回 widget |
|
|
25
|
+
|
|
26
|
+
## Flutter CLI 错误
|
|
27
|
+
|
|
28
|
+
| 错误 | 原因 | 解决 |
|
|
29
|
+
|------|------|------|
|
|
30
|
+
| `Flutter: command not found` | Flutter 未加入 PATH | 检查 Flutter SDK 安装和 PATH |
|
|
31
|
+
| `Waiting for another flutter command` | 前一个 flutter 命令卡住 | `killall flutter` 或重启终端 |
|
|
32
|
+
| `Your Flutter SDK version is X but requires Y` | SDK 版本不匹配 | `flutter upgrade` 或降级依赖 |
|
|
33
|
+
| `A dependency may need to be resolved` | 版本冲突 | `flutter pub deps` 查看依赖树 |
|
|
34
|
+
| `Unable to load asset` | 资源路径错误 | 检查 pubspec.yaml assets 声明 |
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Flutter 常用命令
|
|
2
|
+
|
|
3
|
+
## 项目生命周期
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# 创建项目
|
|
7
|
+
flutter create --org com.example --project-name my_app .
|
|
8
|
+
|
|
9
|
+
# 获取依赖
|
|
10
|
+
flutter pub get
|
|
11
|
+
|
|
12
|
+
# 升级依赖
|
|
13
|
+
flutter pub upgrade
|
|
14
|
+
|
|
15
|
+
# 清理构建缓存
|
|
16
|
+
flutter clean
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 验证
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 静态分析
|
|
23
|
+
flutter analyze
|
|
24
|
+
|
|
25
|
+
# 运行测试
|
|
26
|
+
flutter test
|
|
27
|
+
|
|
28
|
+
# 测试覆盖率(需装 lcov)
|
|
29
|
+
flutter test --coverage
|
|
30
|
+
genhtml coverage/lcov.info -o coverage/html
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 构建
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Android APK
|
|
37
|
+
flutter build apk --debug
|
|
38
|
+
flutter build apk --release
|
|
39
|
+
|
|
40
|
+
# Android AppBundle
|
|
41
|
+
flutter build appbundle --release
|
|
42
|
+
|
|
43
|
+
# iOS(需 macOS)
|
|
44
|
+
flutter build ios --debug --no-codesign
|
|
45
|
+
flutter build ios --release
|
|
46
|
+
|
|
47
|
+
# Web
|
|
48
|
+
flutter build web
|
|
49
|
+
|
|
50
|
+
# macOS 桌面
|
|
51
|
+
flutter build macos
|
|
52
|
+
|
|
53
|
+
# Linux 桌面
|
|
54
|
+
flutter build linux
|
|
55
|
+
|
|
56
|
+
# Windows 桌面
|
|
57
|
+
flutter build windows
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 设备
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 列出设备
|
|
64
|
+
flutter devices
|
|
65
|
+
|
|
66
|
+
# 运行到指定设备
|
|
67
|
+
flutter run -d <device_id>
|
|
68
|
+
|
|
69
|
+
# 运行到 Chrome
|
|
70
|
+
flutter run -d chrome
|
|
71
|
+
|
|
72
|
+
# 热重载(运行时按 r)
|
|
73
|
+
# 热重启(运行时按 R)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Package 管理
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 添加依赖
|
|
80
|
+
flutter pub add provider
|
|
81
|
+
flutter pub add --dev flutter_lints
|
|
82
|
+
|
|
83
|
+
# 移除依赖
|
|
84
|
+
flutter pub remove provider
|
|
85
|
+
|
|
86
|
+
# 查看过时的依赖
|
|
87
|
+
flutter pub outdated
|
|
88
|
+
```
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Flutter 项目结构
|
|
2
|
+
|
|
3
|
+
## 推荐结构(中型项目)
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
my_app/
|
|
7
|
+
├── lib/
|
|
8
|
+
│ ├── main.dart # 入口,runApp
|
|
9
|
+
│ ├── app.dart # MaterialApp / CupertinoApp 配置
|
|
10
|
+
│ ├── models/ # 数据模型
|
|
11
|
+
│ │ ├── user.dart
|
|
12
|
+
│ │ └── todo.dart
|
|
13
|
+
│ ├── pages/ # 页面(全屏级 widget)
|
|
14
|
+
│ │ ├── home_page.dart
|
|
15
|
+
│ │ └── settings_page.dart
|
|
16
|
+
│ ├── widgets/ # 可复用 widget
|
|
17
|
+
│ │ ├── app_drawer.dart
|
|
18
|
+
│ │ └── loading_indicator.dart
|
|
19
|
+
│ ├── services/ # API / 本地存储
|
|
20
|
+
│ │ ├── api_client.dart
|
|
21
|
+
│ │ └── storage_service.dart
|
|
22
|
+
│ ├── providers/ # 状态管理
|
|
23
|
+
│ │ └── todo_provider.dart
|
|
24
|
+
│ └── utils/ # 工具函数
|
|
25
|
+
│ └── validators.dart
|
|
26
|
+
├── test/
|
|
27
|
+
│ ├── widget_test.dart
|
|
28
|
+
│ ├── models/
|
|
29
|
+
│ │ └── todo_test.dart
|
|
30
|
+
│ └── services/
|
|
31
|
+
│ └── api_client_test.dart
|
|
32
|
+
├── pubspec.yaml
|
|
33
|
+
├── analysis_options.yaml
|
|
34
|
+
└── README.md
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 关键文件说明
|
|
38
|
+
|
|
39
|
+
| 文件 | 用途 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| `pubspec.yaml` | 依赖声明、应用元信息 |
|
|
42
|
+
| `analysis_options.yaml` | lint 规则配置 |
|
|
43
|
+
| `lib/main.dart` | 程序入口 |
|
|
44
|
+
| `lib/app.dart` | 主题、路由、全局配置 |
|
|
45
|
+
| `test/` | 镜像 lib/ 结构的测试目录 |
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Flutter Widget 开发规则
|
|
2
|
+
|
|
3
|
+
## 组件拆分原则
|
|
4
|
+
|
|
5
|
+
- **一屏一个页面 widget**: pages/home_page.dart
|
|
6
|
+
- **页面内拆为小组件**: widgets/todo_item.dart
|
|
7
|
+
- **只复用的才抽成独立文件**: 3 处以上使用或 props > 5 个
|
|
8
|
+
|
|
9
|
+
## StatelessWidget vs StatefulWidget
|
|
10
|
+
|
|
11
|
+
```dart
|
|
12
|
+
// 无内部状态 → StatelessWidget
|
|
13
|
+
class MyButton extends StatelessWidget {
|
|
14
|
+
const MyButton({super.key, required this.label});
|
|
15
|
+
final String label;
|
|
16
|
+
// ...
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// 有内部状态 → StatefulWidget
|
|
20
|
+
class Counter extends StatefulWidget {
|
|
21
|
+
const Counter({super.key});
|
|
22
|
+
@override
|
|
23
|
+
State<Counter> createState() => _CounterState();
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## build() 方法规范
|
|
28
|
+
|
|
29
|
+
- **保持 build() 简洁**:条件逻辑拆为 `_buildXxx()` 方法
|
|
30
|
+
- **不调用副作用**:不调 API、不写文件
|
|
31
|
+
- **build() 内不要 setState**
|
|
32
|
+
|
|
33
|
+
```dart
|
|
34
|
+
// 好的写法
|
|
35
|
+
@override
|
|
36
|
+
Widget build(BuildContext context) {
|
|
37
|
+
return Scaffold(
|
|
38
|
+
body: _isLoading ? _buildLoading() : _buildContent(),
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Widget _buildLoading() => const Center(child: CircularProgressIndicator());
|
|
43
|
+
Widget _buildContent() => ListView.builder(/* ... */);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 列表性能
|
|
47
|
+
|
|
48
|
+
- **用 ListView.builder**(懒加载),不用 `ListView(children:[...])`
|
|
49
|
+
- **固定高度的列表项用 ListView.builder + itemExtent**
|
|
50
|
+
- **包含多种 layout 的列表用 CustomScrollView + SliverList**
|
|
51
|
+
|
|
52
|
+
## 状态管理选型
|
|
53
|
+
|
|
54
|
+
| 场景 | 方案 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| 单页面内状态 | `setState` + StatefulWidget |
|
|
57
|
+
| 跨页面共享状态 | Provider |
|
|
58
|
+
| 复杂异步状态 | Riverpod |
|
|
59
|
+
| 大型项目 | Riverpod 或 Bloc |
|
|
60
|
+
| 简单全局状态 | ChangeNotifierProvider |
|
|
61
|
+
|
|
62
|
+
## 自适应布局
|
|
63
|
+
|
|
64
|
+
- 使用 `MediaQuery`、`LayoutBuilder` 响应屏幕变化
|
|
65
|
+
- 使用 `Expanded`、`Flexible` 弹性布局
|
|
66
|
+
- Web 端用 `Platform.isWeb` 区分平台行为
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# flutter 项目构建
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(git rev-parse --show-toplevel 2>/dev/null || echo .)"
|
|
6
|
+
|
|
7
|
+
if [ ! -f pubspec.yaml ]; then
|
|
8
|
+
echo "NOT_A_FLUTTER_PROJECT: 当前目录不是 Flutter 项目"
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
echo "=== flutter build apk --debug ==="
|
|
13
|
+
if command -v flutter &>/dev/null; then
|
|
14
|
+
flutter build apk --debug 2>&1 || echo "BUILD_FAILED(非 Android 环境可跳过)"
|
|
15
|
+
else
|
|
16
|
+
echo "SKIP: flutter 未安装"
|
|
17
|
+
fi
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# flutter 项目 lint 检查
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(git rev-parse --show-toplevel 2>/dev/null || echo .)"
|
|
6
|
+
|
|
7
|
+
if [ ! -f pubspec.yaml ]; then
|
|
8
|
+
echo "NOT_A_FLUTTER_PROJECT: 当前目录不是 Flutter 项目"
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
echo "=== flutter pub get ==="
|
|
13
|
+
flutter pub get 2>&1 || true
|
|
14
|
+
|
|
15
|
+
echo ""
|
|
16
|
+
echo "=== flutter analyze ==="
|
|
17
|
+
flutter analyze 2>&1
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# flutter 项目测试
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(git rev-parse --show-toplevel 2>/dev/null || echo .)"
|
|
6
|
+
|
|
7
|
+
if [ ! -f pubspec.yaml ]; then
|
|
8
|
+
echo "NOT_A_FLUTTER_PROJECT: 当前目录不是 Flutter 项目"
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
echo "=== flutter test ==="
|
|
13
|
+
flutter test 2>&1
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# flutter 完整验证:lint → test → build
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(git rev-parse --show-toplevel 2>/dev/null || echo .)"
|
|
6
|
+
|
|
7
|
+
if [ ! -f pubspec.yaml ]; then
|
|
8
|
+
echo "NOT_A_FLUTTER_PROJECT: 当前目录不是 Flutter 项目"
|
|
9
|
+
echo "FLUTTER_VERIFY_SKIP"
|
|
10
|
+
exit 0
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
PASS=0
|
|
14
|
+
FAIL=0
|
|
15
|
+
|
|
16
|
+
echo "===== 1/3 flutter pub get + analyze ====="
|
|
17
|
+
if bash "$(dirname "$0")/lint_flutter.sh"; then
|
|
18
|
+
echo " PASS"
|
|
19
|
+
PASS=$((PASS + 1))
|
|
20
|
+
else
|
|
21
|
+
echo " FAIL"
|
|
22
|
+
FAIL=$((FAIL + 1))
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
echo ""
|
|
26
|
+
echo "===== 2/3 flutter test ====="
|
|
27
|
+
if bash "$(dirname "$0")/test_flutter.sh"; then
|
|
28
|
+
echo " PASS"
|
|
29
|
+
PASS=$((PASS + 1))
|
|
30
|
+
else
|
|
31
|
+
echo " FAIL"
|
|
32
|
+
FAIL=$((FAIL + 1))
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
echo ""
|
|
36
|
+
echo "===== 3/3 flutter build ====="
|
|
37
|
+
if bash "$(dirname "$0")/build_flutter.sh"; then
|
|
38
|
+
echo " PASS"
|
|
39
|
+
PASS=$((PASS + 1))
|
|
40
|
+
else
|
|
41
|
+
echo " FAIL"
|
|
42
|
+
FAIL=$((FAIL + 1))
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
echo ""
|
|
46
|
+
echo "====== FLUTTER_VERIFY_RESULT: PASS=$PASS FAIL=$FAIL ======"
|
|
47
|
+
[ "$FAIL" -eq 0 ] || exit 1
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# flutter-code — Flutter 开发规则
|
|
2
|
+
|
|
3
|
+
## description
|
|
4
|
+
Flutter/Dart 编码规范:widget 拆分、状态管理、分层架构、测试。
|
|
5
|
+
|
|
6
|
+
## when to use
|
|
7
|
+
- 编写 Flutter widget 和页面
|
|
8
|
+
- 实现状态管理逻辑
|
|
9
|
+
- 编写 Dart 数据模型和 service
|
|
10
|
+
- 添加或更新测试
|
|
11
|
+
|
|
12
|
+
## workflow
|
|
13
|
+
1. 按计划创建文件结构
|
|
14
|
+
2. 先写数据模型和 service 层
|
|
15
|
+
3. 再写 widget 和页面
|
|
16
|
+
4. 同步编写 widget test
|
|
17
|
+
5. 验证:`flutter analyze` + `flutter test`
|
|
18
|
+
|
|
19
|
+
## coding rules
|
|
20
|
+
|
|
21
|
+
### 分层架构
|
|
22
|
+
```
|
|
23
|
+
lib/
|
|
24
|
+
├── main.dart # 入口
|
|
25
|
+
├── app.dart # MaterialApp 配置
|
|
26
|
+
├── models/ # 数据模型(不可变,使用 copyWith)
|
|
27
|
+
├── pages/ # 页面级 widget(StatefulWidget)
|
|
28
|
+
├── widgets/ # 可复用 widget(优先 StatelessWidget)
|
|
29
|
+
├── services/ # API / 本地存储
|
|
30
|
+
└── providers/ # 状态管理(Provider / Riverpod)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Widget 原则
|
|
34
|
+
- **无状态用 StatelessWidget**,不需要 setState
|
|
35
|
+
- **有状态用 StatefulWidget**,只在必要层级使用
|
|
36
|
+
- 不把复杂逻辑塞进 `build()`,拆成 `_buildHeader()`、`_buildBody()` 等方法
|
|
37
|
+
- 列表用 `ListView.builder`,不用 `ListView(children:[...])`
|
|
38
|
+
|
|
39
|
+
### 状态管理
|
|
40
|
+
- 简单页面:`setState` + StatefulWidget
|
|
41
|
+
- 跨页面/复杂状态:Provider 或 Riverpod
|
|
42
|
+
- 状态定义在 model 中,逻辑在 service/provider 中
|
|
43
|
+
|
|
44
|
+
### Dart 规范
|
|
45
|
+
- 使用 `required` 命名参数
|
|
46
|
+
- 使用 `const` 构造函数
|
|
47
|
+
- 避免 `dynamic`,用具体类型
|
|
48
|
+
- 使用 `copyWith` 模式更新不可变 model
|
|
49
|
+
- import 使用 `package:my_app/xxx.dart` 绝对路径
|
|
50
|
+
|
|
51
|
+
### 测试要求
|
|
52
|
+
- 每个 widget 至少有一个 smoke test(能渲染)
|
|
53
|
+
- 业务逻辑写 unit test
|
|
54
|
+
- 修改后 `flutter test` 全部通过
|
|
55
|
+
|
|
56
|
+
## done criteria
|
|
57
|
+
- [ ] `flutter analyze` 无 issue
|
|
58
|
+
- [ ] `flutter test` 全部通过
|
|
59
|
+
- [ ] 分层结构符合规范
|
|
60
|
+
- [ ] widget 拆解合理,无巨型 build()
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# flutter-plan — Flutter 项目计划
|
|
2
|
+
|
|
3
|
+
## description
|
|
4
|
+
为 Flutter/Dart 项目制定开发计划,涵盖 widget 树设计、状态管理、路由、数据层。
|
|
5
|
+
|
|
6
|
+
## when to use
|
|
7
|
+
- 开始一个新的 Flutter 页面或功能
|
|
8
|
+
- 重构现有的 Flutter widget 结构
|
|
9
|
+
- 涉及状态管理方案选型(setState / Provider / Riverpod / Bloc)
|
|
10
|
+
- 需要添加 package 依赖
|
|
11
|
+
|
|
12
|
+
## workflow
|
|
13
|
+
1. 确认页面结构和 widget 拆解方案
|
|
14
|
+
2. 确定状态管理方式(简单用 setState,复杂用 Provider/Riverpod)
|
|
15
|
+
3. 规划数据模型和 API/本地存储层
|
|
16
|
+
4. 确认路由方案(MaterialPageRoute / go_router)
|
|
17
|
+
5. 列出需要新增的 package
|
|
18
|
+
6. 输出计划并获得确认
|
|
19
|
+
|
|
20
|
+
## output format
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
## Flutter 计划:{功能名称}
|
|
24
|
+
|
|
25
|
+
### 页面结构
|
|
26
|
+
- Page1 → 组件A / 组件B
|
|
27
|
+
- Page2 → ...
|
|
28
|
+
|
|
29
|
+
### 状态管理
|
|
30
|
+
{setState / Provider / Riverpod / Bloc}
|
|
31
|
+
|
|
32
|
+
### 数据模型
|
|
33
|
+
{模型字段和关系}
|
|
34
|
+
|
|
35
|
+
### 依赖变更
|
|
36
|
+
- 新增: {package}: {版本}
|
|
37
|
+
- 无需新增
|
|
38
|
+
|
|
39
|
+
### 改动清单
|
|
40
|
+
- lib/pages/xxx_page.dart (新增)
|
|
41
|
+
- lib/models/xxx.dart (新增)
|
|
42
|
+
- lib/widgets/xxx.dart (新增)
|
|
43
|
+
- test/xxx_test.dart (新增/更新)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## done criteria
|
|
47
|
+
- [ ] 页面结构和 widget 拆解已确认
|
|
48
|
+
- [ ] 状态管理方案已选定
|
|
49
|
+
- [ ] 数据模型已定义
|
|
50
|
+
- [ ] 路由方案已确认
|
|
51
|
+
- [ ] 依赖变更已列出
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# flutter-verify — Flutter 项目验证
|
|
2
|
+
|
|
3
|
+
## description
|
|
4
|
+
Flutter 项目的 lint / test / build 验证流程。
|
|
5
|
+
|
|
6
|
+
## when to use
|
|
7
|
+
- 修改代码后准备提交前
|
|
8
|
+
- CI 流程触发时
|
|
9
|
+
- 升级 Flutter SDK 或 package 后
|
|
10
|
+
|
|
11
|
+
## workflow
|
|
12
|
+
|
|
13
|
+
### 1. 静态分析
|
|
14
|
+
```bash
|
|
15
|
+
cd <project>
|
|
16
|
+
flutter analyze
|
|
17
|
+
```
|
|
18
|
+
**通过标准**: `No issues found!`
|
|
19
|
+
|
|
20
|
+
### 2. 测试
|
|
21
|
+
```bash
|
|
22
|
+
flutter test
|
|
23
|
+
```
|
|
24
|
+
**通过标准**: All tests passed
|
|
25
|
+
|
|
26
|
+
### 3. 构建
|
|
27
|
+
```bash
|
|
28
|
+
# Android
|
|
29
|
+
flutter build apk --debug
|
|
30
|
+
|
|
31
|
+
# iOS (macOS only)
|
|
32
|
+
flutter build ios --debug --no-codesign
|
|
33
|
+
|
|
34
|
+
# Web
|
|
35
|
+
flutter build web
|
|
36
|
+
```
|
|
37
|
+
**通过标准**: Build successful
|
|
38
|
+
|
|
39
|
+
### 4. 完整验证
|
|
40
|
+
```bash
|
|
41
|
+
bash domains/flutter/scripts/verify_flutter.sh
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 常见问题
|
|
45
|
+
|
|
46
|
+
| 问题 | 排查方向 |
|
|
47
|
+
|------|---------|
|
|
48
|
+
| `flutter analyze` 报类型错误 | 检查 null safety、缺少 import |
|
|
49
|
+
| 测试超时 | 检查 `pump()` / `pumpAndSettle()` 使用 |
|
|
50
|
+
| build 失败 | `flutter clean` 后重试 |
|
|
51
|
+
| package 找不到 | `flutter pub get` 重新拉取 |
|
|
52
|
+
|
|
53
|
+
## done criteria
|
|
54
|
+
- [ ] `flutter analyze` 无 issue
|
|
55
|
+
- [ ] `flutter test` 全部通过
|
|
56
|
+
- [ ] 目标平台的构建成功(apk / ios / web 至少一个)
|
|
57
|
+
- [ ] 不允许跳过或伪造验证结果
|
|
@@ -46,6 +46,18 @@ module CangmingAiDevKit
|
|
|
46
46
|
{ type: :file, path: "domains/harmony/references/hvigor_ohpm_hdc_commands.md" },
|
|
47
47
|
{ type: :file, path: "domains/harmony/references/common_compile_errors.md" },
|
|
48
48
|
|
|
49
|
+
# flutter
|
|
50
|
+
{ type: :dir, path: "domains/flutter/skills" },
|
|
51
|
+
{ type: :dir, path: "domains/flutter/references" },
|
|
52
|
+
{ type: :dir, path: "domains/flutter/scripts" },
|
|
53
|
+
{ type: :file, path: "domains/flutter/skills/flutter-plan/SKILL.md" },
|
|
54
|
+
{ type: :file, path: "domains/flutter/skills/flutter-code/SKILL.md" },
|
|
55
|
+
{ type: :file, path: "domains/flutter/skills/flutter-verify/SKILL.md" },
|
|
56
|
+
{ type: :file, path: "domains/flutter/references/flutter_project_structure.md" },
|
|
57
|
+
{ type: :file, path: "domains/flutter/references/flutter_commands.md" },
|
|
58
|
+
{ type: :file, path: "domains/flutter/references/common_errors.md" },
|
|
59
|
+
{ type: :file, path: "domains/flutter/references/widget_rules.md" },
|
|
60
|
+
|
|
49
61
|
# plugin JSONs
|
|
50
62
|
{ type: :file, path: "adapters/claude-code/.claude-plugin/plugin.json" },
|
|
51
63
|
{ type: :file, path: "adapters/codex/.codex-plugin/plugin.json" },
|
|
@@ -67,6 +79,10 @@ module CangmingAiDevKit
|
|
|
67
79
|
domains/harmony/scripts/test_harmony.sh
|
|
68
80
|
domains/harmony/scripts/build_hap.sh
|
|
69
81
|
domains/harmony/scripts/verify_harmony.sh
|
|
82
|
+
domains/flutter/scripts/lint_flutter.sh
|
|
83
|
+
domains/flutter/scripts/test_flutter.sh
|
|
84
|
+
domains/flutter/scripts/build_flutter.sh
|
|
85
|
+
domains/flutter/scripts/verify_flutter.sh
|
|
70
86
|
].freeze
|
|
71
87
|
|
|
72
88
|
JSON_PATHS = %w[
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cangming-ai-dev-kit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- cangming
|
|
@@ -13,7 +13,7 @@ dependencies: []
|
|
|
13
13
|
description: |
|
|
14
14
|
cangming-ai-dev-kit provides cross-agent development skills
|
|
15
15
|
(plan-first, safe-code-change, code-review, verify-before-done),
|
|
16
|
-
domain-specific knowledge (HarmonyOS/ArkTS/ArkUI), and shell scripts.
|
|
16
|
+
domain-specific knowledge (Flutter/Dart, HarmonyOS/ArkTS/ArkUI), and shell scripts.
|
|
17
17
|
Install with `gem install` and use the CLI to sync skills to Claude Code or Codex.
|
|
18
18
|
email:
|
|
19
19
|
executables:
|
|
@@ -35,9 +35,21 @@ files:
|
|
|
35
35
|
- core/scripts/summarize_context.sh
|
|
36
36
|
- core/scripts/verify_project.sh
|
|
37
37
|
- core/skills/code-review/SKILL.md
|
|
38
|
+
- core/skills/gem-dev-workflow/SKILL.md
|
|
38
39
|
- core/skills/plan-first/SKILL.md
|
|
39
40
|
- core/skills/safe-code-change/SKILL.md
|
|
40
41
|
- core/skills/verify-before-done/SKILL.md
|
|
42
|
+
- domains/flutter/references/common_errors.md
|
|
43
|
+
- domains/flutter/references/flutter_commands.md
|
|
44
|
+
- domains/flutter/references/flutter_project_structure.md
|
|
45
|
+
- domains/flutter/references/widget_rules.md
|
|
46
|
+
- domains/flutter/scripts/build_flutter.sh
|
|
47
|
+
- domains/flutter/scripts/lint_flutter.sh
|
|
48
|
+
- domains/flutter/scripts/test_flutter.sh
|
|
49
|
+
- domains/flutter/scripts/verify_flutter.sh
|
|
50
|
+
- domains/flutter/skills/flutter-code/SKILL.md
|
|
51
|
+
- domains/flutter/skills/flutter-plan/SKILL.md
|
|
52
|
+
- domains/flutter/skills/flutter-verify/SKILL.md
|
|
41
53
|
- domains/harmony/references/arkts_syntax.md
|
|
42
54
|
- domains/harmony/references/arkui_rules.md
|
|
43
55
|
- domains/harmony/references/common_compile_errors.md
|