cangming-ai-dev-kit 0.1.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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/adapters/claude-code/.claude-plugin/plugin.json +20 -0
  3. data/adapters/claude-code/agents/coder.md +22 -0
  4. data/adapters/claude-code/agents/planner.md +24 -0
  5. data/adapters/claude-code/agents/reviewer.md +23 -0
  6. data/adapters/claude-code/hooks/hooks.json +16 -0
  7. data/adapters/codex/.codex-plugin/plugin.json +26 -0
  8. data/adapters/codex/AGENTS.md.template +45 -0
  9. data/core/references/review_checklist.md +48 -0
  10. data/core/references/verify_rules.md +48 -0
  11. data/core/references/workflow.md +65 -0
  12. data/core/scripts/detect_project_type.sh +49 -0
  13. data/core/scripts/summarize_context.sh +55 -0
  14. data/core/scripts/verify_project.sh +61 -0
  15. data/core/skills/code-review/SKILL.md +71 -0
  16. data/core/skills/plan-first/SKILL.md +56 -0
  17. data/core/skills/safe-code-change/SKILL.md +48 -0
  18. data/core/skills/verify-before-done/SKILL.md +71 -0
  19. data/domains/harmony/references/arkts_syntax.md +90 -0
  20. data/domains/harmony/references/arkui_rules.md +81 -0
  21. data/domains/harmony/references/common_compile_errors.md +40 -0
  22. data/domains/harmony/references/harmony_project_structure.md +56 -0
  23. data/domains/harmony/references/hvigor_ohpm_hdc_commands.md +40 -0
  24. data/domains/harmony/scripts/build_hap.sh +39 -0
  25. data/domains/harmony/scripts/lint_harmony.sh +39 -0
  26. data/domains/harmony/scripts/test_harmony.sh +32 -0
  27. data/domains/harmony/scripts/verify_harmony.sh +92 -0
  28. data/domains/harmony/skills/harmony-code/SKILL.md +73 -0
  29. data/domains/harmony/skills/harmony-plan/SKILL.md +68 -0
  30. data/domains/harmony/skills/harmony-verify/SKILL.md +68 -0
  31. data/exe/cangming-dev-kit +6 -0
  32. data/lib/cangming_ai_dev_kit/adapter.rb +68 -0
  33. data/lib/cangming_ai_dev_kit/cli.rb +88 -0
  34. data/lib/cangming_ai_dev_kit/commands/init.rb +53 -0
  35. data/lib/cangming_ai_dev_kit/commands/sync.rb +25 -0
  36. data/lib/cangming_ai_dev_kit/commands/verify.rb +32 -0
  37. data/lib/cangming_ai_dev_kit/syncer.rb +102 -0
  38. data/lib/cangming_ai_dev_kit/verifier.rb +134 -0
  39. data/lib/cangming_ai_dev_kit/version.rb +5 -0
  40. data/lib/cangming_ai_dev_kit.rb +7 -0
  41. data/marketplace/.claude-plugin/marketplace.json +21 -0
  42. metadata +88 -0
@@ -0,0 +1,48 @@
1
+ # safe-code-change — 安全地修改代码
2
+
3
+ ## description
4
+ 以小步迭代的方式安全地修改代码,最小化引入缺陷的风险。
5
+
6
+ ## when to use
7
+ - 修改已有代码
8
+ - 修复 bug
9
+ - 重构
10
+ - 新增功能
11
+
12
+ ## workflow
13
+ 1. 确认计划已批准
14
+ 2. 一次只改一个逻辑单元
15
+ 3. 每次修改后检查 diff
16
+ 4. 运行相关测试
17
+ 5. 如果失败:回滚或记录原因
18
+ 6. 提交前再次审查 diff
19
+
20
+ ## 规则
21
+
22
+ ### 小步修改
23
+ - 一次改一个文件,或一组紧密关联的文件
24
+ - 每次 diff 不超过 100 行(合理范围内)
25
+ - 修改后立即检查影响
26
+
27
+ ### 不引入无关依赖
28
+ - 不要为了省事引入新的第三方库
29
+ - 优先使用项目已有的依赖
30
+
31
+ ### 不破坏现有 API
32
+ - 不改动已有公开函数签名(除非计划中明确)
33
+ - 如需修改,先标记废弃再替换
34
+
35
+ ### 保持项目风格
36
+ - 遵守项目已有的代码风格
37
+ - 如果项目有 .eslintrc / tsconfig,确保不违反
38
+
39
+ ### 失败处理
40
+ - 如果修改导致测试失败,优先修复
41
+ - 如果无法修复,回滚并记录原因
42
+
43
+ ## done criteria
44
+ - [ ] 修改范围符合计划
45
+ - [ ] diff 已审查
46
+ - [ ] 测试通过
47
+ - [ ] 无新增 lint 错误
48
+ - [ ] 未引入无关依赖
@@ -0,0 +1,71 @@
1
+ # verify-before-done — 完成前必须验证
2
+
3
+ ## description
4
+ 在宣布任务完成之前,运行所有验证脚本确保质量。不允许跳过或伪造验证结果。
5
+
6
+ ## when to use
7
+ - 每次代码修改完成后
8
+ - 宣布任务完成之前
9
+ - PR 提交之前
10
+ - Agent 对话结束之前
11
+
12
+ ## workflow
13
+ 1. 运行 `bash core/scripts/detect_project_type.sh` 识别项目类型
14
+ 2. 根据项目类型运行对应的 verify 脚本
15
+ 3. 记录每条命令及其输出
16
+ 4. 验证全部通过后才能宣布完成
17
+ 5. 如果验证失败 → 修复问题 → 重新验证
18
+
19
+ ## verify 命令
20
+
21
+ ```bash
22
+ # 通用验证
23
+ bash core/scripts/verify_project.sh
24
+
25
+ # HarmonyOS 专项验证
26
+ bash domains/harmony/scripts/verify_harmony.sh
27
+
28
+ # MVP 项目自验证
29
+ bash scripts/verify_mvp.sh
30
+ ```
31
+
32
+ ## output format
33
+
34
+ ```markdown
35
+ ## 验证报告
36
+
37
+ ### 项目类型
38
+ {项目类型}
39
+
40
+ ### 执行命令
41
+
42
+ 1. `{command_1}`
43
+ 输出:
44
+ ```
45
+ {output}
46
+ ```
47
+ 结果:{PASS/FAIL}
48
+
49
+ 2. `{command_2}`
50
+ 输出:
51
+ ```
52
+ {output}
53
+ ```
54
+ 结果:{PASS/FAIL}
55
+
56
+ ### 最终结果
57
+ {全部 PASS / 存在失败项}
58
+ ```
59
+
60
+ ## done criteria
61
+ - [ ] 项目类型已识别
62
+ - [ ] 验证脚本已执行
63
+ - [ ] 所有命令已记录
64
+ - [ ] 全部 PASS → 可宣布完成
65
+ - [ ] 存在 FAIL → 继续修复,不完成
66
+
67
+ ## 禁止行为
68
+ - ❌ 不执行验证就宣布完成
69
+ - ❌ 命令失败但说"通过"
70
+ - ❌ 跳过不存在的命令但不记录
71
+ - ❌ 伪造命令输出
@@ -0,0 +1,90 @@
1
+ # ArkTS 语法规则
2
+
3
+ ArkTS 是 HarmonyOS 原生开发语言,基于 TypeScript 的子集。
4
+
5
+ ## 基本规则
6
+
7
+ - ArkTS 是静态类型语言,所有变量必须有类型
8
+ - 使用 `let` 和 `const`,不使用 `var`
9
+ - 文件名使用小驼峰:`myComponent.ets`
10
+
11
+ ## 类型系统
12
+
13
+ ```typescript
14
+ // 基础类型
15
+ let name: string = 'hello';
16
+ let age: number = 25;
17
+ let isActive: boolean = true;
18
+
19
+ // 数组
20
+ let items: string[] = ['a', 'b', 'c'];
21
+ let numbers: Array<number> = [1, 2, 3];
22
+
23
+ // 联合类型
24
+ let value: string | number = 'hello';
25
+
26
+ // 对象类型
27
+ interface User {
28
+ name: string;
29
+ age?: number; // 可选
30
+ }
31
+ ```
32
+
33
+ ## class 与 interface
34
+
35
+ ```typescript
36
+ // interface
37
+ interface Product {
38
+ id: string;
39
+ name: string;
40
+ price: number;
41
+ }
42
+
43
+ // class
44
+ class ShoppingCart {
45
+ private items: Product[] = [];
46
+
47
+ addItem(item: Product): void {
48
+ this.items.push(item);
49
+ }
50
+
51
+ get total(): number {
52
+ return this.items.reduce((sum, i) => sum + i.price, 0);
53
+ }
54
+ }
55
+ ```
56
+
57
+ ## 装饰器(@)
58
+
59
+ ArkTS 中装饰器用于 UI 状态管理:
60
+
61
+ ```typescript
62
+ @Component
63
+ struct MyComponent {
64
+ @State count: number = 0;
65
+ @Prop title: string;
66
+ @Link parentValue: string;
67
+ }
68
+ ```
69
+
70
+ ## async/await
71
+
72
+ ArkTS 支持 async/await:
73
+
74
+ ```typescript
75
+ async fetchData(): Promise<void> {
76
+ try {
77
+ const data = await httpRequest();
78
+ // 处理数据
79
+ } catch (e) {
80
+ console.error('请求失败', e);
81
+ }
82
+ }
83
+ ```
84
+
85
+ ## 注意事项
86
+
87
+ - 不能使用 JavaScript 动态特性(eval、with 等)
88
+ - 不能使用 `as any` 绕过类型检查
89
+ - 推荐用 `for...of` 替代 `for...in`
90
+ - 使用 `===` 和 `!==`,不使用 `==` 和 `!=`
@@ -0,0 +1,81 @@
1
+ # ArkUI 规则
2
+
3
+ ArkUI 是 HarmonyOS 声明式 UI 框架。
4
+
5
+ ## build() 方法
6
+
7
+ ```typescript
8
+ @Component
9
+ struct MyView {
10
+ build() {
11
+ Column() {
12
+ Text('Hello')
13
+ .fontSize(20)
14
+ .fontWeight(FontWeight.Bold);
15
+ Button('Click')
16
+ .onClick(() => this.handleClick());
17
+ }
18
+ .padding(16)
19
+ .width('100%');
20
+ }
21
+ }
22
+ ```
23
+
24
+ ## 组件拆分原则
25
+
26
+ - 一个文件一个 struct(组件)
27
+ - 公共 UI 拆分为独立 Component
28
+ - 组件通过 @Prop 接收数据
29
+
30
+ ```typescript
31
+ @Component
32
+ struct UserCard {
33
+ @Prop user: UserInfo;
34
+
35
+ build() {
36
+ Row() {
37
+ Image(this.user.avatar)
38
+ .width(40)
39
+ .height(40);
40
+ Column() {
41
+ Text(this.user.name);
42
+ Text(this.user.email)
43
+ .fontSize(12)
44
+ .fontColor(Color.Gray);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ## 状态管理
52
+
53
+ | 装饰器 | 作用域 | 说明 |
54
+ |--------|--------|------|
55
+ | @State | 组件内 | 组件内部可变状态 |
56
+ | @Prop | 父→子 | 单向传递,只读 |
57
+ | @Link | 双向 | 父子组件双向同步 |
58
+ | @Provide | 提供者 | 向子孙组件提供数据 |
59
+ | @Consume | 消费者 | 接收 @Provide 数据 |
60
+ | @StorageLink | 全局 | AppStorage 全局状态 |
61
+ | @LocalStorageLink | 页面 | LocalStorage 页面状态 |
62
+
63
+ ## 布局组件
64
+
65
+ | 组件 | 用途 |
66
+ |------|------|
67
+ | Column | 垂直排列 |
68
+ | Row | 水平排列 |
69
+ | Stack | 层叠布局 |
70
+ | Flex | 弹性布局 |
71
+ | Grid | 网格布局 |
72
+ | List | 列表布局 |
73
+ | Scroll | 可滚动容器 |
74
+
75
+ ## 注意事项
76
+
77
+ - build() 中不要写复杂逻辑(超过 10 行请提取方法)
78
+ - 条件渲染使用 `if`,不支持 switch
79
+ - 循环渲染使用 `ForEach`
80
+ - 使用 `aboutToAppear()` 替代 `ngOnInit` 或 `constructor`
81
+ - TODO SafeArea 需要手动处理
@@ -0,0 +1,40 @@
1
+ # 常见编译错误与排查方向
2
+
3
+ ## ArkTS 编译错误
4
+
5
+ | 错误 | 可能原因 | 排查方向 |
6
+ |------|----------|----------|
7
+ | `Cannot find name` | 变量未声明或未 import | 检查 import 路径 |
8
+ | `Type 'X' is not assignable to type 'Y'` | 类型不匹配 | 检查变量类型声明 |
9
+ | `Property 'X' does not exist on type 'Y'` | 访问了不存在的属性 | 检查接口定义 |
10
+ | `Argument of type 'X' is not assignable to parameter of type 'Y'` | 参数类型错误 | 检查函数签名 |
11
+ | `Object is possibly 'undefined'` | 未做空值检查 | 添加 `?.` 或 `if` 判断 |
12
+ | `Cannot use 'X' as a JSX element` | 组件未正确注册 | 检查 `@Component` 装饰器 |
13
+ | `Decorators are not valid here` | 装饰器位置错误 | 装饰器只能用于 struct/class 成员 |
14
+
15
+ ## ArkUI 运行时错误
16
+
17
+ | 错误 | 可能原因 | 排查方向 |
18
+ |------|----------|----------|
19
+ | 页面白屏/不显示 | build() 抛异常 | 检查 build() 中是否有异常逻辑 |
20
+ | 状态不更新 | @State 未正确使用 | 确认使用 @State 装饰可变变量 |
21
+ | 页面跳转失败 | 路由未注册 | 检查 module.json5 中的 pages 列表 |
22
+ | 图片不显示 | 资源路径错误 | 使用 `$r('app.media.xxx')` 引用资源 |
23
+ | `@Link` 同步失败 | 父组件未传参 | 检查父组件是否正确绑定 |
24
+
25
+ ## Hvigor 构建错误
26
+
27
+ | 错误 | 可能原因 | 排查方向 |
28
+ |------|----------|----------|
29
+ | `ohpm install` 失败 | 网络连接异常 | 检查网络/镜像源配置 |
30
+ | `assembleHap` 失败 | 编译错误 | 先执行 `hvigorw clean` |
31
+ | 签名失败 | 签名证书配置错误 | 检查 build-profile.json5 |
32
+ | 依赖冲突 | 版本不兼容 | `ohpm install` 时注意版本输出 |
33
+
34
+ ## 排查通用步骤
35
+
36
+ 1. 查看具体错误栈和行号
37
+ 2. 运行 `hvigorw clean` 后重试
38
+ 3. 检查 `package.json5` 和 `oh-package.json5` 配置
39
+ 4. 确认 DevEco Studio 和 SDK 版本匹配
40
+ 5. 搜索社区或官方 issue 看是否有已知问题
@@ -0,0 +1,56 @@
1
+ # HarmonyOS 项目结构
2
+
3
+ ## 推荐目录结构
4
+
5
+ ```
6
+ MyHarmonyApp/
7
+ ├── oh-package.json5 # ohpm 依赖配置
8
+ ├── hvigorfile.ts # 构建配置
9
+ ├── build-profile.json5 # 构建配置
10
+ ├── hvigor/ # 构建缓存
11
+ ├── AppScope/ # 应用级资源
12
+ │ ├── app.json5 # 应用配置
13
+ │ └── resources/ # 应用级资源
14
+ ├── entry/
15
+ │ ├── oh-package.json5 # entry 模块依赖
16
+ │ ├── build-profile.json5 # entry 构建配置
17
+ │ └── src/main/
18
+ │ ├── ets/
19
+ │ │ ├── pages/ # 页面文件
20
+ │ │ │ ├── Index.ets
21
+ │ │ │ ├── Home.ets
22
+ │ │ │ └── Detail.ets
23
+ │ │ ├── components/ # 可复用组件
24
+ │ │ │ ├── TitleBar.ets
25
+ │ │ │ └── UserCard.ets
26
+ │ │ ├── model/ # 数据模型
27
+ │ │ │ ├── User.ets
28
+ │ │ │ └── Product.ets
29
+ │ │ ├── service/ # 网络/数据服务
30
+ │ │ │ ├── api.ets
31
+ │ │ │ └── storage.ets
32
+ │ │ └── utils/ # 工具函数
33
+ │ │ └── format.ets
34
+ │ ├── resources/ # entry 资源
35
+ │ └── module.json5 # 模块配置
36
+ └── library/ # 共享库(可选)
37
+ ├── oh-package.json5
38
+ └── src/main/ets/
39
+ ```
40
+
41
+ ## 分层说明
42
+
43
+ | 层 | 职责 | 可依赖 |
44
+ |----|------|--------|
45
+ | pages/ | 页面组合、页面级状态 | components, model, service |
46
+ | components/ | 通用 UI 组件 | model |
47
+ | model/ | 数据模型定义 | 无(纯数据类) |
48
+ | service/ | 网络请求、数据处理 | model |
49
+ | utils/ | 纯工具函数 | 无 |
50
+
51
+ ## 关键配置文件
52
+
53
+ - `AppScope/app.json5` — 应用名称、版本、图标
54
+ - `entry/src/main/module.json5` — 页面注册、权限声明
55
+ - `oh-package.json5` — 三方依赖
56
+ - `build-profile.json5` — 签名、构建配置
@@ -0,0 +1,40 @@
1
+ # hvigor / ohpm / hdc 常用命令
2
+
3
+ ## ohpm(包管理)
4
+
5
+ | 命令 | 说明 |
6
+ |------|------|
7
+ | `ohpm install` | 安装所有依赖 |
8
+ | `ohpm install @ohos/axios` | 安装指定包 |
9
+ | `ohpm uninstall @ohos/axios` | 卸载包 |
10
+ | `ohpm list` | 列出已安装包 |
11
+ | `ohpm cache clean` | 清理缓存 |
12
+
13
+ ## hvigor(构建工具)
14
+
15
+ | 命令 | 说明 |
16
+ |------|------|
17
+ | `./hvigorw assembleHap` | 构建 HAP 包 |
18
+ | `./hvigorw assembleApp` | 构建 APP 包 |
19
+ | `./hvigorw clean` | 清理构建产物 |
20
+ | `./hvigorw lint` | 运行 lint |
21
+ | `./hvigorw test` | 运行测试 |
22
+ | `./hvigorw run` | 运行应用 |
23
+
24
+ ## hdc(设备调试)
25
+
26
+ | 命令 | 说明 |
27
+ |------|------|
28
+ | `hdc list targets` | 列出设备 |
29
+ | `hdc install entry.hap` | 安装 HAP |
30
+ | `hdc uninstall com.example.app` | 卸载应用 |
31
+ | `hdc shell` | 进入设备 shell |
32
+ | `hdc file send local remote` | 推送文件 |
33
+ | `hdc file recv remote local` | 拉取文件 |
34
+ | `hdc hilog` | 查看日志 |
35
+ | `hdc hilog -T xxx` | 按 tag 过滤日志 |
36
+
37
+ ## DevEco Studio
38
+
39
+ 推荐使用 DevEco Studio 进行可视化开发、调试和 profiling。
40
+ 命令行主要用于 CI/CD 流程。
@@ -0,0 +1,39 @@
1
+ #!/bin/bash
2
+ # build_hap.sh — 对 HarmonyOS 项目执行 HAP 构建
3
+ # 用法: bash domains/harmony/scripts/build_hap.sh [项目目录]
4
+
5
+ PROJECT_DIR="${1:-.}"
6
+ cd "$PROJECT_DIR" 2>/dev/null
7
+
8
+ echo "[Harmony Build] 检查项目目录..."
9
+
10
+ # 判断是否为 HarmonyOS 项目
11
+ if [ ! -f "oh-package.json5" ] && [ ! -f "hvigorfile.ts" ]; then
12
+ echo "[Harmony Build] 当前目录不是 HarmonyOS 项目,跳过构建"
13
+ exit 0
14
+ fi
15
+
16
+ echo "[Harmony Build] 检测到 HarmonyOS 项目"
17
+
18
+ # 尝试 hvigorw assembleHap
19
+ if [ -f "./hvigorw" ]; then
20
+ echo "[Harmony Build] 执行 hvigorw assembleHap..."
21
+ ./hvigorw assembleHap 2>&1
22
+ EXIT_CODE=$?
23
+ if [ $EXIT_CODE -eq 0 ]; then
24
+ echo "[Harmony Build] PASS"
25
+ else
26
+ echo "[Harmony Build] FAIL (exit code: $EXIT_CODE)"
27
+ fi
28
+ exit $EXIT_CODE
29
+ fi
30
+
31
+ # 尝试 ohpm build
32
+ if command -v ohpm &> /dev/null; then
33
+ echo "[Harmony Build] 执行 ohpm build (如果有)..."
34
+ ohpm run build 2>/dev/null && echo "[Harmony Build] PASS" || echo "[Harmony Build] SKIP (未配置 build 脚本)"
35
+ exit 0
36
+ fi
37
+
38
+ echo "[Harmony Build] SKIP — 未找到 hvigorw 命令"
39
+ exit 0
@@ -0,0 +1,39 @@
1
+ #!/bin/bash
2
+ # lint_harmony.sh — 对 HarmonyOS 项目执行 lint 检查
3
+ # 用法: bash domains/harmony/scripts/lint_harmony.sh [项目目录]
4
+
5
+ PROJECT_DIR="${1:-.}"
6
+ cd "$PROJECT_DIR" 2>/dev/null
7
+
8
+ echo "[Harmony Lint] 检查项目目录..."
9
+
10
+ # 判断是否为 HarmonyOS 项目
11
+ if [ ! -f "oh-package.json5" ] && [ ! -f "hvigorfile.ts" ]; then
12
+ echo "[Harmony Lint] 当前目录不是 HarmonyOS 项目,跳过 lint"
13
+ exit 0
14
+ fi
15
+
16
+ echo "[Harmony Lint] 检测到 HarmonyOS 项目"
17
+
18
+ # 尝试 hvigorw lint
19
+ if [ -f "./hvigorw" ]; then
20
+ echo "[Harmony Lint] 执行 hvigorw lint..."
21
+ ./hvigorw lint 2>&1
22
+ EXIT_CODE=$?
23
+ if [ $EXIT_CODE -eq 0 ]; then
24
+ echo "[Harmony Lint] PASS"
25
+ else
26
+ echo "[Harmony Lint] FAIL (exit code: $EXIT_CODE)"
27
+ fi
28
+ exit 0
29
+ fi
30
+
31
+ # 尝试 ohpm 或其它 lint 工具
32
+ if command -v ohpm &> /dev/null; then
33
+ echo "[Harmony Lint] 执行 ohpm lint (如果有)..."
34
+ ohpm run lint 2>/dev/null && echo "[Harmony Lint] PASS" || echo "[Harmony Lint] SKIP (未配置 lint 脚本)"
35
+ exit 0
36
+ fi
37
+
38
+ echo "[Harmony Lint] SKIP — 未找到 hvigorw 或 lint 命令"
39
+ exit 0
@@ -0,0 +1,32 @@
1
+ #!/bin/bash
2
+ # test_harmony.sh — 对 HarmonyOS 项目执行测试
3
+ # 用法: bash domains/harmony/scripts/test_harmony.sh [项目目录]
4
+
5
+ PROJECT_DIR="${1:-.}"
6
+ cd "$PROJECT_DIR" 2>/dev/null
7
+
8
+ echo "[Harmony Test] 检查项目目录..."
9
+
10
+ # 判断是否为 HarmonyOS 项目
11
+ if [ ! -f "oh-package.json5" ] && [ ! -f "hvigorfile.ts" ]; then
12
+ echo "[Harmony Test] 当前目录不是 HarmonyOS 项目,跳过测试"
13
+ exit 0
14
+ fi
15
+
16
+ echo "[Harmony Test] 检测到 HarmonyOS 项目"
17
+
18
+ # 尝试 hvigorw test
19
+ if [ -f "./hvigorw" ]; then
20
+ echo "[Harmony Test] 执行 hvigorw test..."
21
+ ./hvigorw test 2>&1
22
+ EXIT_CODE=$?
23
+ if [ $EXIT_CODE -eq 0 ]; then
24
+ echo "[Harmony Test] PASS"
25
+ else
26
+ echo "[Harmony Test] FAIL (exit code: $EXIT_CODE)"
27
+ fi
28
+ exit $EXIT_CODE
29
+ fi
30
+
31
+ echo "[Harmony Test] SKIP — 未找到 hvigorw 命令"
32
+ exit 0
@@ -0,0 +1,92 @@
1
+ #!/bin/bash
2
+ # verify_harmony.sh — HarmonyOS 项目完整验证流程
3
+ # 依次执行: ohpm install → lint → test → build
4
+ # 用法: bash domains/harmony/scripts/verify_harmony.sh [项目目录]
5
+
6
+ PROJECT_DIR="${1:-.}"
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ cd "$PROJECT_DIR" 2>/dev/null
9
+
10
+ echo "===== HarmonyOS 验证 ====="
11
+ echo "项目目录: $(pwd)"
12
+ echo ""
13
+
14
+ # 判断是否为 HarmonyOS 项目
15
+ if [ ! -f "oh-package.json5" ] && [ ! -f "hvigorfile.ts" ]; then
16
+ echo "[Verify] 当前目录不是 HarmonyOS 项目,跳过验证"
17
+ echo "===== 验证结束 ====="
18
+ exit 0
19
+ fi
20
+
21
+ PASS_COUNT=0
22
+ FAIL_COUNT=0
23
+ SKIP_COUNT=0
24
+
25
+ # 1. ohpm install
26
+ echo "--- 步骤 1/4: ohpm install ---"
27
+ if command -v ohpm &> /dev/null; then
28
+ echo "[Verify] 执行 ohpm install..."
29
+ ohpm install 2>&1
30
+ if [ $? -eq 0 ]; then
31
+ echo "[Verify] ohpm install: PASS"
32
+ PASS_COUNT=$((PASS_COUNT + 1))
33
+ else
34
+ echo "[Verify] ohpm install: FAIL"
35
+ FAIL_COUNT=$((FAIL_COUNT + 1))
36
+ fi
37
+ else
38
+ echo "[Verify] ohpm install: SKIP (ohpm 命令未安装)"
39
+ SKIP_COUNT=$((SKIP_COUNT + 1))
40
+ fi
41
+ echo ""
42
+
43
+ # 2. lint
44
+ echo "--- 步骤 2/4: Lint ---"
45
+ bash "$SCRIPT_DIR/lint_harmony.sh" "$PROJECT_DIR" 2>&1 | tail -1
46
+ # 从输出判断结果
47
+ LAST_LINE=$(bash "$SCRIPT_DIR/lint_harmony.sh" "$PROJECT_DIR" 2>&1 | tail -1)
48
+ if echo "$LAST_LINE" | grep -q "PASS"; then
49
+ PASS_COUNT=$((PASS_COUNT + 1))
50
+ elif echo "$LAST_LINE" | grep -q "SKIP"; then
51
+ SKIP_COUNT=$((SKIP_COUNT + 1))
52
+ else
53
+ FAIL_COUNT=$((FAIL_COUNT + 1))
54
+ fi
55
+ echo ""
56
+
57
+ # 3. test
58
+ echo "--- 步骤 3/4: Test ---"
59
+ bash "$SCRIPT_DIR/test_harmony.sh" "$PROJECT_DIR" 2>&1 | tail -1
60
+ LAST_LINE=$(bash "$SCRIPT_DIR/test_harmony.sh" "$PROJECT_DIR" 2>&1 | tail -1)
61
+ if echo "$LAST_LINE" | grep -q "PASS"; then
62
+ PASS_COUNT=$((PASS_COUNT + 1))
63
+ elif echo "$LAST_LINE" | grep -q "SKIP"; then
64
+ SKIP_COUNT=$((SKIP_COUNT + 1))
65
+ else
66
+ FAIL_COUNT=$((FAIL_COUNT + 1))
67
+ fi
68
+ echo ""
69
+
70
+ # 4. build
71
+ echo "--- 步骤 4/4: Build ---"
72
+ bash "$SCRIPT_DIR/build_hap.sh" "$PROJECT_DIR" 2>&1 | tail -1
73
+ LAST_LINE=$(bash "$SCRIPT_DIR/build_hap.sh" "$PROJECT_DIR" 2>&1 | tail -1)
74
+ if echo "$LAST_LINE" | grep -q "PASS"; then
75
+ PASS_COUNT=$((PASS_COUNT + 1))
76
+ elif echo "$LAST_LINE" | grep -q "SKIP"; then
77
+ SKIP_COUNT=$((SKIP_COUNT + 1))
78
+ else
79
+ FAIL_COUNT=$((FAIL_COUNT + 1))
80
+ fi
81
+ echo ""
82
+
83
+ # 汇总
84
+ echo "===== 验证汇总 ====="
85
+ echo "PASS: $PASS_COUNT | FAIL: $FAIL_COUNT | SKIP: $SKIP_COUNT"
86
+ if [ $FAIL_COUNT -eq 0 ]; then
87
+ echo "结果: PASS"
88
+ else
89
+ echo "结果: FAIL ($FAIL_COUNT 项失败)"
90
+ fi
91
+ echo "===== 验证结束 ====="
92
+ exit $FAIL_COUNT