@harmonyos-arkts/d2h 0.1.27 → 0.1.28

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. package/.claude-plugin/plugin.json +1 -1
  2. package/AGENTS.md +2 -0
  3. package/README.md +34 -2
  4. package/agents/d2h.md +16 -14
  5. package/dist/bin/install-opencode.js +25 -22
  6. package/dist/src/install-codex.js +5 -126
  7. package/dist/src/install-skills.js +147 -0
  8. package/dist/src/install-vscode.js +2 -2
  9. package/docs/environment-check.md +3 -3
  10. package/package.json +6 -6
  11. package/skills/arkts-mvvm-architecture/SKILL.md +2 -0
  12. package/skills/d2h-architecture-plan/SKILL.md +19 -26
  13. package/skills/d2h-architecture-plan/references/architecture-plan.example.json +80 -315
  14. package/skills/d2h-architecture-plan/references/directory-creation.md +27 -34
  15. package/skills/d2h-architecture-plan/references/hybrid-design.md +13 -15
  16. package/skills/d2h-architecture-plan/references/json-contract.md +29 -91
  17. package/skills/d2h-architecture-plan/references/layout-reference.md +30 -27
  18. package/skills/d2h-architecture-plan/references/plan-contract.md +27 -34
  19. package/skills/d2h-architecture-plan/references/source-review.md +1 -1
  20. package/skills/d2h-architecture-plan/scripts/architecture_plan.py +29 -163
  21. package/skills/d2h-architecture-plan/scripts/test_architecture_plan.py +205 -342
  22. package/skills/d2h-spec-develop/SKILL.md +5 -4
  23. package/{install-opencode.sh → tooling/install-opencode.sh} +3 -3
  24. package/{opencode → tooling/opencode}/interactive-tools/advance-progress-demo.mjs +1 -1
  25. package/{opencode → tooling/opencode}/interactive-tools/demo.mjs +3 -3
  26. package/{opencode → tooling/opencode}/interactive-tools/prepare-demo.mjs +1 -1
  27. package/{scripts → tooling/scripts}/check-environment.mjs +3 -3
  28. package/skills/d2h-architecture-plan/references/selection-flow.md +0 -71
  29. /package/{opencode → tooling/opencode}/agents.json +0 -0
  30. /package/{opencode → tooling/opencode}/interactive-tools/browser-host.ts +0 -0
  31. /package/{opencode → tooling/opencode}/interactive-tools/core.ts +0 -0
  32. /package/{opencode → tooling/opencode}/interactive-tools/demo-workflow.ts +0 -0
  33. /package/{opencode → tooling/opencode}/interactive-tools/package-lock.json +0 -0
  34. /package/{opencode → tooling/opencode}/interactive-tools/package.json +0 -0
  35. /package/{opencode → tooling/opencode}/interactive-tools/panel.ts +0 -0
  36. /package/{opencode → tooling/opencode}/interactive-tools/prepare-progress-demo.mjs +0 -0
  37. /package/{opencode → tooling/opencode}/interactive-tools/progress.ts +0 -0
  38. /package/{opencode → tooling/opencode}/interactive-tools/server-legacy.mjs +0 -0
  39. /package/{opencode → tooling/opencode}/interactive-tools/server.mjs +0 -0
  40. /package/{opencode → tooling/opencode}/interactive-tools/tui.tsx +0 -0
  41. /package/{opencode → tooling/opencode}/vscode-d2h-package.json +0 -0
  42. /package/{opencode → tooling/opencode}/vscode-d2h-plugin.mjs +0 -0
@@ -20,6 +20,8 @@ tags: [arkts, mvvm, state-management-v2, navigation, architecture, harmonyos]
20
20
 
21
21
  ## 1. 目录结构规范
22
22
 
23
+ 优先遵循工程已有的目录、模块归属和共享边界,在其内部落实 MVVM 分层。以下目录树和模块拆分建议供新建工程或尚无明确约定的部分参考,不要求现有工程按示例重组。
24
+
23
25
  按「功能 + 分层」组织。`core/` 放跨模块共享资产,业务按 feature 内聚。
24
26
 
25
27
  ```
@@ -1,45 +1,38 @@
1
1
  ---
2
2
  name: d2h-architecture-plan
3
3
  description: >-
4
- 用于 Android 转 HarmonyOS 的架构评估、目录规划和方案选型。读取 Android 源码,以 JSON 交付项目简介、原工程分析和三套嵌套目录,供看板展示推荐与用户选择;
5
- 看板确认或 question 工具回答统一落盘,目录实施读取 JSON 后复用或创建基础工程、补齐所选目录。
4
+ 用于 Android 转 HarmonyOS 的目录级架构评估、三方案比较与选型。确认后交付规划 Markdown 和最终目录 JSON;
5
+ 按授权创建或复用鸿蒙基础工程、补齐关键目录。
6
6
  ---
7
7
 
8
8
  # Android 源码 → 鸿蒙架构与目录规划
9
9
 
10
- 基于 Android 工程结构与必要源码,为迁移确定职责归属、依赖方向和可落地的鸿蒙目录,兼顾原开发者维护便利性。默认做目录级架构分析,不开展完整业务理解、逐页行为分析或实现级迁移设计。
10
+ 基于 Android 工程结构与必要源码,确定职责归属、依赖方向和可落地的鸿蒙目录,兼顾原开发者维护便利性。默认做目录级架构分析,不开展完整业务理解、逐页行为分析或实现级迁移设计。
11
11
 
12
12
  ## 输入与边界
13
13
 
14
14
  - 必需输入只有 Android 源码根目录,可独立执行。按用户范围识别实际应用、运行时模块、技术栈和目标设备;源码缺失或目标能力未知时标明影响。
15
- - 默认读取 Android 工程源码及其相关资源、构建声明;不自动读取鸿蒙业务源码,也不为寻找鸿蒙参考实现扩大扫描范围。上下文已指向鸿蒙目标时,按 [source-review.md](references/source-review.md) 做最小辨别,区分自动生成的模板壳、已有业务工程和性质未明的工程。
16
- - 已确认仍为自动生成模板壳的工程(包括 Preflight 创建的工程)作为后续落地基础,不作为业务架构依据,不触发“是否结合现有鸿蒙工程”的询问。职责与目录由 Android 事实及目标要求决定,不能被空壳的默认结构限制。
17
- - 确认鸿蒙工程已存在,且含业务实现或最小辨别后性质仍不明确,用户又尚未决定是否结合时,询问一次:“是否结合现有鸿蒙工程的业务实现进行架构规划?默认仅分析 Android 工程。”仅提供输出路径或配置中的目标路径不单独证明已有业务工程或用户选择结合。
18
- - 用户明确要求结合/复用鸿蒙业务实现时,按约定范围读取;明确选择不结合时,只分析 Android。同一工程、同一任务范围内沿用已有明确选择,不重复询问;用户改变选择时据此调整。尚未答复期间可继续 Android 侧分析,不扩读鸿蒙业务源码,也不把沉默记为用户拒绝。复用基础工程、核对配置或创建目录的授权不自动扩大为分析已有业务实现。
19
- - 已有功能清单、Facts、规划可作导航线索,用当前源码核验。
20
- - 默认交付 `architecture-plan.json` 作为看板决策事实源,同时保留 `architecture-plan.md` 作为现有主流程使用的阅读视图;推荐、选择和目录以 JSON 为准,两者同步。不生成持久化的全量文件清单、源码快照、import/调用图或扫描基线。已有大型扫描产物按问题查询,不整体读入或为更新规划重新生成。
21
- - 源工程只读;默认在同级 `<工程名>-migration/.migration/architecture-plan/` 交付。已有文件先阅读,保留用户批注,修订时同步受影响部分。
22
- - 分析分支和目录组织依据本次读取范围内的工程事实与迁移目标确定,参考示例按实际需要选用。基础配置核对可用于工程复用判断;未读取的鸿蒙业务实现不作已核验的能力复用依据。
15
+ - 默认读取 Android 源码及相关资源、构建声明。上下文已指向鸿蒙目标时,按 [source-review.md](references/source-review.md) 辨别其性质:模板壳仅作落地基础,无需询问是否结合业务;已有业务或性质未明且用户尚未决定时,询问是否结合其业务实现,默认仅分析 Android。
16
+ - 沿用同工程、同范围的明确选择;等待答复时可继续 Android 分析,不扩读鸿蒙业务。配置核对与目录创建不自动扩大为业务分析;模板的默认目录不限制架构设计。
17
+ - 已有功能清单、Facts、规划可作定位线索,用当前源码核验。不生成全量文件清单、源码快照、import/调用图或扫描基线;已有大型产物按问题查询。
18
+ - 源工程只读;默认在同级 `<工程名>-migration/.migration/architecture-plan/` 交付。已有文件先阅读,保留用户批注,修订受影响部分。
23
19
 
24
- ## 架构规划
20
+ ## 规划 → 确认 → 展示
25
21
 
26
- 1. 按 [source-review.md](references/source-review.md) 从构建声明、入口/导航和主要源码目录建立结构地图,识别基础依赖、页面业务、共享业务及装配。仅当证据不足会改变拆合、归属或依赖方向时,定点读取相关源码;边界可解释后停止扩读。
27
- 2. 按 [layout-reference.md](references/layout-reference.md) 设计原结构对照 `android-mirror`、鸿蒙优选 `harmony-practice`、融合 `hybrid`,共用范围地图;已有选定方案时围绕它修订并同步受影响的对照。融合结构以基础依赖保留原模块/包族、业务按 feature 承载页面为原则,需要详细展开时读 [hybrid-design.md](references/hybrid-design.md),不展开逐页实施计划。
28
- 3. 读取 [plan-contract.md](references/plan-contract.md) 和 [json-contract.md](references/json-contract.md),JSON 聚焦三部分:项目简介、Android 工程分析与风险、三套可独立展开的目录树;推荐/选择及最小回传元数据沿用契约。每套仅 `id/name/summary/directoryTree`,不生成机器映射表、依赖图、共享所有者或逐方案收益成本数组。每个目录都有相对路径与简介,三套均展开到可选型、可创建的关键目录粒度,不用文字差异、通配符或引用另一套目录代替树。必要的归属/依赖/共享边界在 Markdown 简记,复核与目录一致。
29
- 4. 运行 `python <本Skill目录>/scripts/architecture_plan.py validate <产物目录>/architecture-plan.json`,再同步 Markdown 阅读视图。向调用方交接 JSON/Markdown 路径、`planId` 和待决项;三套方案的选择单位是整套目录方案,展开/折叠及点击单个节点不改变选择。
22
+ 1. 按 [source-review.md](references/source-review.md) 从构建声明、入口/导航和主要源码目录建立结构地图,识别基础依赖、页面业务、共享业务及装配。仅当证据不足会改变拆合、归属或依赖时扩读;边界可解释后停止。
23
+ 2. 按 [layout-reference.md](references/layout-reference.md) 设计原结构对照 `android-mirror`、鸿蒙优选 `harmony-practice`、融合 `hybrid`,共用范围地图。在对话中展示三套目录结构、职责、取舍及推荐理由,供用户判断,暂不生成交付文件。融合方案设计时读 [hybrid-design.md](references/hybrid-design.md)。已有有效选择时围绕它修订,不重新强制选型。
24
+ 3. 用可用的 question 工具或对话询问方案选择,三个选项对应上述方案并标识推荐,说明本次只选型还是确认后落地。只接受实际回答,预选项、取消或超时不算选择;先处理修改意见,仅询问仍缺失的用户决定。技术核验由 Agent 完成。已有当前有效选择和授权直接沿用,不重复询问;仅比较、尚未选型时在对话中交付分析,不生成最终 JSON/Markdown。
25
+ 4. 用户回答完成后,按 [plan-contract.md](references/plan-contract.md) 生成 `architecture-plan.md`,保存三套目录及实际选型/授权;按 [json-contract.md](references/json-contract.md) 生成最终 `architecture-plan.json`,只含 `projectName`、`directoryTree`、`decisions`。两份产物使用同一组已确认的路径与决定;JSON 先在临时文件中生成,校验通过后替换正式文件,再交给只读看板。任一产物保存失败或不一致时,先修复,不进入实施。
26
+ 5. 有创建/复用授权时,读取 [directory-creation.md](references/directory-creation.md),重新读取最终 JSON 和 Markdown 确认记录后实施。完整迁移已有创建要求并确认方案时直接继续;仅选型不扩大为创建授权。
30
27
 
31
- `androidAnalysis` 固定为简短的 `summary`、按语言/界面/存储/网络四类归纳的 `techStack`、最多五项的 `risks`。风险只含名称与迁移影响;字段与类型见 JSON 契约。用用户能理解的文字说明关键事实,不堆叠工具和架构缩写,不输出源码目录清单或独立未决清单;详细核验线索放 Markdown。
28
+ 校验命令:`python <本Skill目录>/scripts/architecture_plan.py validate <产物目录>/architecture-plan.json`。辅助脚本要求 Python 3.10+,只校验展示数据,不处理选择、写入文件或创建工程。
32
29
 
33
- 本 Skill 交付架构与转换交接设计;并行候选表示具备独立转换的架构条件,实际派发、开发和验收由调用方的执行流程决定。
30
+ ## 交付与修订
34
31
 
35
- ## 选型与可选落地
32
+ `architecture-plan.md` 保存项目理解、三套对照、推荐、用户回答与范围、最终归属/依赖及风险;`architecture-plan.json` 是确认后生成的最终展示和目录实施输入,两者应一致。
36
33
 
37
- 选型、接收回答和恢复实施时读取 [selection-flow.md](references/selection-flow.md)。仅规划时交付即可;需要选型时,模型填写推荐,`selectedProposalId` 初始为 `null`。有效选择不重复询问,风险仅展示、不要求逐项答复,也不因风险非空而阻塞选型或目录创建。
34
+ 用户通过对话修改时同步两份产物。影响目录、依赖、目标或授权范围时,先将旧展示 JSON 移为不覆盖历史文件的备份,注明待修订并暂停受影响的实施,处理后重新校验发布;明确授权的调整不再重复确认。缺少当前有效确认的旧产物不作为最终结果继续展示。
38
35
 
39
- 看板“确定”和 OpenCode `question` 回答是同一个确认步骤的两个入口;已有明确对话授权也可沿用。真实提交先写独立请求文件,脚本校验后保存 `architecture-selection.json` 并更新规划选择。不得先覆盖已确认文件,不把默认项、未提交/取消或模型推荐当用户答案。主规划只保留 `selectedProposalId`,不嵌套完整确认。
36
+ 恢复实施须重读 Markdown 的实际确认与最终 JSON,核对项目、目标和目录;文件存在或校验通过不代表用户授权。看板只展示最终 JSON,加载、刷新及修订期间的缓存处理由调用方适配。
40
37
 
41
- 创建流程的提示需明确“确定后创建或复用基础工程并补齐目录”,一次确认记为 `select-and-create`,不追加“是否继续”;只选型则记为 `select`。question 回答也必须落盘,不只留在上下文。实施前运行 `read-selection` 重新核对规划、确认及原始意见,再按选定 ID 读取目录树;写入失败、不一致或有未处理的布局修改时不执行旧树。记录恢复使用统一流程的显式恢复入口。
42
-
43
- 用户通过对话调整 JSON,并同步 Markdown。仅修改说明或风险时保留有效确认;影响目录、目标位置或授权范围时,先清理当前确认和旧选择,再更新展示并按实际授权确认。技术未知由 Agent 在实施时核查;必要输入/授权缺失时只询问缺失项。
44
-
45
- 需要落地时读取 [directory-creation.md](references/directory-creation.md)。沿用 Preflight 目标与基础工程,普通文件工具补齐选定目录,确实无基础工程时才用本机 DevEco CLI 创建;不生成业务实现、不构建或运行应用。看板服务器、提交端点与会话通知由外部适配方提供,本 Skill 不提供监听器,也不把“文件已写入”当作 Agent 已被唤醒。
38
+ 本 Skill 交付架构与转换交接设计。页面族是候选,目录壳子不是已实现能力;实际派发、开发和验收由调用方流程决定。
@@ -1,208 +1,75 @@
1
1
  {
2
- "planId": "c9c093cf-94ec-4b49-b919-a89c82eef0d1",
3
- "project": {
4
- "name": "NoteSample",
5
- "summary": "协议示例:一个支持笔记列表、编辑和本地保存的 Android 应用,不代表已分析真实项目。"
6
- },
7
- "androidAnalysis": {
8
- "summary": "单个应用模块承载笔记页面和存储访问,页面通过存储包装读写笔记。",
9
- "techStack": {
10
- "language": "Kotlin",
11
- "ui": "Android 原生界面",
12
- "storage": "本地保存笔记,具体存储方式未核验",
13
- "network": "示例未提供联网功能信息"
14
- },
15
- "risks": [
2
+ "projectName": "示例邮件客户端",
3
+ "directoryTree": {
4
+ "name": "示例邮件客户端",
5
+ "path": ".",
6
+ "description": "已选单 HAP 结构,复用现有 entry;本树描述目标职责,不表示已完成实现。",
7
+ "children": [
16
8
  {
17
- "title": "本地存储需要适配",
18
- "impact": "需核对鸿蒙存储实现,保证笔记保存与读取行为一致。"
19
- }
20
- ]
21
- },
22
- "proposals": [
23
- {
24
- "id": "android-mirror",
25
- "name": "原结构对照",
26
- "summary": "保留源模块内的主要包族与 ui/store 层级,适配入口和资源;原开发者可按包族快速回溯;原 ui 包内的职责仍需后续实现时约束。",
27
- "directoryTree": {
28
- "name": "NoteSample-HarmonyOS",
29
- "path": ".",
30
- "description": "示例目标工程根;仅说明数据形状",
9
+ "name": "AppScope",
10
+ "path": "AppScope",
11
+ "description": "应用级名称、图标等配置与资源。",
12
+ "children": []
13
+ },
14
+ {
15
+ "name": "entry",
16
+ "path": "entry",
17
+ "description": "产品 HAP,负责启动、装配和页面承载。",
18
+ "kind": "HAP",
31
19
  "children": [
32
20
  {
33
- "name": "AppScope",
34
- "path": "AppScope",
35
- "description": "按原工程职责保留的目录",
21
+ "name": "src",
22
+ "path": "entry/src",
23
+ "description": "产品模块源码与资源。",
36
24
  "children": [
37
25
  {
38
- "name": "resources",
39
- "path": "AppScope/resources",
40
- "description": "应用级资源,具体资源转换由后续阶段完成",
41
- "children": []
42
- }
43
- ]
44
- },
45
- {
46
- "name": "entry",
47
- "path": "entry",
48
- "description": "本例唯一应用 HAP,负责装配与业务承载",
49
- "kind": "HAP",
50
- "children": [
51
- {
52
- "name": "src",
53
- "path": "entry/src",
54
- "description": "模块源码根",
26
+ "name": "main",
27
+ "path": "entry/src/main",
28
+ "description": "产品的生产源码和资源根。",
55
29
  "children": [
56
30
  {
57
- "name": "main",
58
- "path": "entry/src/main",
59
- "description": "主源集",
31
+ "name": "ets",
32
+ "path": "entry/src/main/ets",
33
+ "description": "ArkTS 源码,按装配、页面和共享数据职责组织。",
60
34
  "children": [
61
35
  {
62
- "name": "ets",
63
- "path": "entry/src/main/ets",
64
- "description": "ArkTS 源码根",
65
- "children": [
66
- {
67
- "name": "entryability",
68
- "path": "entry/src/main/ets/entryability",
69
- "description": "应用入口与依赖装配",
70
- "children": []
71
- },
72
- {
73
- "name": "com",
74
- "path": "entry/src/main/ets/com",
75
- "description": "原包层级",
76
- "children": [
77
- {
78
- "name": "acme",
79
- "path": "entry/src/main/ets/com/acme",
80
- "description": "原组织包层级",
81
- "children": [
82
- {
83
- "name": "notes",
84
- "path": "entry/src/main/ets/com/acme/notes",
85
- "description": "笔记职责目录",
86
- "children": [
87
- {
88
- "name": "ui",
89
- "path": "entry/src/main/ets/com/acme/notes/ui",
90
- "description": "笔记列表与编辑页面,保留原 ui 包族",
91
- "children": []
92
- },
93
- {
94
- "name": "store",
95
- "path": "entry/src/main/ets/com/acme/notes/store",
96
- "description": "本地存储包装,保留原 store 包族;唯一存储包装所有者;实例由应用装配提供,业务状态不复制到基础层",
97
- "children": []
98
- }
99
- ]
100
- }
101
- ]
102
- }
103
- ]
104
- }
105
- ]
36
+ "name": "entryability",
37
+ "path": "entry/src/main/ets/entryability",
38
+ "description": "应用入口和生命周期,调用装配并承载导航。",
39
+ "children": []
106
40
  },
107
41
  {
108
- "name": "resources",
109
- "path": "entry/src/main/resources",
110
- "description": "本 HAP 的页面文案及其他资源,由模块统一管理",
42
+ "name": "composition",
43
+ "path": "entry/src/main/ets/composition",
44
+ "description": "创建并持有共享邮件仓库,为页面提供同一实例。",
111
45
  "children": []
112
- }
113
- ]
114
- }
115
- ]
116
- }
117
- ]
118
- }
119
- ]
120
- }
121
- },
122
- {
123
- "id": "harmony-practice",
124
- "name": "鸿蒙优选",
125
- "summary": "按业务 feature 与基础存储职责重组,仍使用一个 HAP;页面与展示状态边界清晰;需重新定位原包族,调整引用和装配。",
126
- "directoryTree": {
127
- "name": "NoteSample-HarmonyOS",
128
- "path": ".",
129
- "description": "示例目标工程根;仅说明数据形状",
130
- "children": [
131
- {
132
- "name": "AppScope",
133
- "path": "AppScope",
134
- "description": "按原工程职责保留的目录",
135
- "children": [
136
- {
137
- "name": "resources",
138
- "path": "AppScope/resources",
139
- "description": "应用级资源,具体资源转换由后续阶段完成",
140
- "children": []
141
- }
142
- ]
143
- },
144
- {
145
- "name": "entry",
146
- "path": "entry",
147
- "description": "本例唯一应用 HAP,负责装配与业务承载",
148
- "kind": "HAP",
149
- "children": [
150
- {
151
- "name": "src",
152
- "path": "entry/src",
153
- "description": "模块源码根",
154
- "children": [
155
- {
156
- "name": "main",
157
- "path": "entry/src/main",
158
- "description": "主源集",
159
- "children": [
46
+ },
47
+ {
48
+ "name": "navigation",
49
+ "path": "entry/src/main/ets/navigation",
50
+ "description": "注册列表与阅读路由,跨页只传邮件标识。",
51
+ "children": []
52
+ },
160
53
  {
161
- "name": "ets",
162
- "path": "entry/src/main/ets",
163
- "description": "ArkTS 源码根",
54
+ "name": "features",
55
+ "path": "entry/src/main/ets/features",
56
+ "description": "页面业务区,不额外拆成独立构建模块。",
164
57
  "children": [
165
58
  {
166
- "name": "entryability",
167
- "path": "entry/src/main/ets/entryability",
168
- "description": "应用入口与依赖装配",
169
- "children": []
170
- },
171
- {
172
- "name": "features",
173
- "path": "entry/src/main/ets/features",
174
- "description": "按原工程职责保留的目录",
59
+ "name": "mail",
60
+ "path": "entry/src/main/ets/features/mail",
61
+ "description": "邮件页面业务,消费共享邮件仓库。",
175
62
  "children": [
176
63
  {
177
- "name": "notes",
178
- "path": "entry/src/main/ets/features/notes",
179
- "description": "笔记业务所有者",
180
- "children": [
181
- {
182
- "name": "pages",
183
- "path": "entry/src/main/ets/features/notes/pages",
184
- "description": "笔记列表及编辑页面",
185
- "children": []
186
- },
187
- {
188
- "name": "viewmodel",
189
- "path": "entry/src/main/ets/features/notes/viewmodel",
190
- "description": "笔记展示状态与交互编排",
191
- "children": []
192
- }
193
- ]
194
- }
195
- ]
196
- },
197
- {
198
- "name": "core",
199
- "path": "entry/src/main/ets/core",
200
- "description": "按原工程职责保留的目录",
201
- "children": [
64
+ "name": "messagelist",
65
+ "path": "entry/src/main/ets/features/mail/messagelist",
66
+ "description": "邮件列表展示、页面状态和筛选交互。",
67
+ "children": []
68
+ },
202
69
  {
203
- "name": "storage",
204
- "path": "entry/src/main/ets/core/storage",
205
- "description": "平台持久化适配;唯一存储包装所有者;实例由应用装配提供,业务状态不复制到基础层",
70
+ "name": "messageview",
71
+ "path": "entry/src/main/ets/features/mail/messageview",
72
+ "description": "邮件阅读与附件展示,只持有当前页面的展示状态。",
206
73
  "children": []
207
74
  }
208
75
  ]
@@ -210,138 +77,25 @@
210
77
  ]
211
78
  },
212
79
  {
213
- "name": "resources",
214
- "path": "entry/src/main/resources",
215
- "description": "本 HAP 的页面文案及其他资源,由模块统一管理",
216
- "children": []
217
- }
218
- ]
219
- }
220
- ]
221
- }
222
- ]
223
- }
224
- ]
225
- }
226
- },
227
- {
228
- "id": "hybrid",
229
- "name": "融合",
230
- "summary": "业务按 feature 组织,基础 store 保留原包族;不额外拆构建模块;原基础包族可追溯,页面有明确业务归属;需维护原包族与新 feature 的映射。",
231
- "directoryTree": {
232
- "name": "NoteSample-HarmonyOS",
233
- "path": ".",
234
- "description": "示例目标工程根;仅说明数据形状",
235
- "children": [
236
- {
237
- "name": "AppScope",
238
- "path": "AppScope",
239
- "description": "按原工程职责保留的目录",
240
- "children": [
241
- {
242
- "name": "resources",
243
- "path": "AppScope/resources",
244
- "description": "应用级资源,具体资源转换由后续阶段完成",
245
- "children": []
246
- }
247
- ]
248
- },
249
- {
250
- "name": "entry",
251
- "path": "entry",
252
- "description": "本例唯一应用 HAP,负责装配与业务承载",
253
- "kind": "HAP",
254
- "children": [
255
- {
256
- "name": "src",
257
- "path": "entry/src",
258
- "description": "模块源码根",
259
- "children": [
260
- {
261
- "name": "main",
262
- "path": "entry/src/main",
263
- "description": "主源集",
264
- "children": [
265
- {
266
- "name": "ets",
267
- "path": "entry/src/main/ets",
268
- "description": "ArkTS 源码根",
80
+ "name": "shared",
81
+ "path": "entry/src/main/ets/shared",
82
+ "description": "跨页面共享业务及数据所有者。",
269
83
  "children": [
270
84
  {
271
- "name": "entryability",
272
- "path": "entry/src/main/ets/entryability",
273
- "description": "应用入口与依赖装配",
85
+ "name": "mailstore",
86
+ "path": "entry/src/main/ets/shared/mailstore",
87
+ "description": "邮件仓库唯一所有者,封装数据库与查询;不引用页面。",
274
88
  "children": []
275
- },
276
- {
277
- "name": "features",
278
- "path": "entry/src/main/ets/features",
279
- "description": "按原工程职责保留的目录",
280
- "children": [
281
- {
282
- "name": "notes",
283
- "path": "entry/src/main/ets/features/notes",
284
- "description": "笔记业务与页面组候选",
285
- "children": [
286
- {
287
- "name": "pages",
288
- "path": "entry/src/main/ets/features/notes/pages",
289
- "description": "笔记列表与编辑页面",
290
- "children": []
291
- },
292
- {
293
- "name": "viewmodel",
294
- "path": "entry/src/main/ets/features/notes/viewmodel",
295
- "description": "笔记展示状态及交互编排",
296
- "children": []
297
- }
298
- ]
299
- }
300
- ]
301
- },
302
- {
303
- "name": "foundation",
304
- "path": "entry/src/main/ets/foundation",
305
- "description": "按原工程职责保留的目录",
306
- "children": [
307
- {
308
- "name": "com",
309
- "path": "entry/src/main/ets/foundation/com",
310
- "description": "原包层级",
311
- "children": [
312
- {
313
- "name": "acme",
314
- "path": "entry/src/main/ets/foundation/com/acme",
315
- "description": "原组织包层级",
316
- "children": [
317
- {
318
- "name": "notes",
319
- "path": "entry/src/main/ets/foundation/com/acme/notes",
320
- "description": "笔记职责目录",
321
- "children": [
322
- {
323
- "name": "store",
324
- "path": "entry/src/main/ets/foundation/com/acme/notes/store",
325
- "description": "保留原 store 包族,目标平台适配在实现阶段细化;唯一存储包装所有者;实例由应用装配提供,业务状态不复制到基础层",
326
- "children": []
327
- }
328
- ]
329
- }
330
- ]
331
- }
332
- ]
333
- }
334
- ]
335
89
  }
336
90
  ]
337
- },
338
- {
339
- "name": "resources",
340
- "path": "entry/src/main/resources",
341
- "description": "本 HAP 的页面文案及其他资源,由模块统一管理",
342
- "children": []
343
91
  }
344
92
  ]
93
+ },
94
+ {
95
+ "name": "resources",
96
+ "path": "entry/src/main/resources",
97
+ "description": "产品和页面资源,共用模块资源根并区分命名归属。",
98
+ "children": []
345
99
  }
346
100
  ]
347
101
  }
@@ -349,9 +103,20 @@
349
103
  }
350
104
  ]
351
105
  }
106
+ ]
107
+ },
108
+ "decisions": [
109
+ {
110
+ "title": "复用 entry,保持单 HAP",
111
+ "description": "当前没有业务独立安装、多 HAP 共享或分包加载需求,页面规模无需拆库;产品入口与装配直接落在现有 entry。"
112
+ },
113
+ {
114
+ "title": "列表与阅读按页面分开",
115
+ "description": "保留 messagelist/messageview 业务名方便定位,分别组织页面和展示状态;它们是 HAP 内的普通目录,跨页导航传邮件标识,不互传可变页面状态。"
116
+ },
117
+ {
118
+ "title": "入口装配仓库,页面依赖仓库公开能力",
119
+ "description": "shared/mailstore 是邮件数据唯一所有者;entryability 调用 composition 创建并提供同一仓库实例,列表和阅读通过仓库查询邮件及访问附件。mailstore 不引用页面,数据库初始化和迁移由它负责,实例的提供与释放由 composition 负责。"
352
120
  }
353
- ],
354
- "recommendedProposalId": "hybrid",
355
- "recommendationReason": "示例中既有清晰基础包族,又需要页面业务边界,融合便于回溯与维护;若原包族职责混杂,应重新评估鸿蒙优选。",
356
- "selectedProposalId": null
121
+ ]
357
122
  }
@@ -1,53 +1,46 @@
1
1
  # 用户确认后的目录落地
2
2
 
3
- 仅在用户要求落地/搬迁且已确认当前方案时读取。看板“确定”、question 工具回答及明确对话授权都按 [selection-flow.md](selection-flow.md) 先落盘,再由本步骤读取;`select-and-create` 满足创建条件,不追加“是否继续”的询问。本阶段优先复用基础工程,用普通文件工具补齐关键目录;确实无基础工程时才使用本机 DevEco CLI 创建。不实现业务、不构建或运行应用。
3
+ 仅在用户要求创建/复用基础工程并已确认当前方案时读取。按 [SKILL.md](../SKILL.md) 的主流程完成提问及 JSON/Markdown 交付后继续;看板仅展示,不再确认。本阶段优先复用基础工程,普通文件工具补齐关键目录;确实无基础工程时才用本机 DevEco CLI 创建。不实现业务、不构建或运行应用。
4
4
 
5
- ## 1. 固定实际选择与目标
5
+ ## 1. 重读最终方案、授权与目标
6
6
 
7
- - 运行 `python <本Skill目录>/scripts/architecture_plan.py read-selection <产物目录>/architecture-plan.json`,重新读取磁盘上的规划和同目录 `architecture-selection.json`。两文件的规划身份、选中方案必须一致,动作必须为 `select-and-create` 才创建;`select` 只交接已选型结果。记录来源可以是 dashboard/question/conversation,后续步骤一致。
8
- - 从刚读取的规划 `proposals` 中按 `selectedProposalId` 获取目录树,确认文件提供请求 ID、来源、意见和创建要求。不从问题工具返回值、内存变量、旧消息或推荐方案直接推导实施目录。确认缺失、不一致或写入未完成时先恢复统一落盘步骤,不能绕过读取检查。
9
- - 检查读取摘要保留的 `notes`:未处理的布局修改先回到对话修订,不能因为脚本返回创建动作就忽略用户意见;脚本只核验数据一致性,不解释自然语言或判断目标能力。
10
- - 恢复/重复回传时先读取现有 `shell-receipt.json` 和实际工程。相同请求已完成则核对后返回已有结果;partial/blocked 时核对实际状态,仅继续尚缺且仍获授权的动作。选择记录存在不代表创建已完成,不重复初始化或搬迁。不同方案已有落地时先比较实际冲突,不静默清空旧目录或迁移已有业务。
11
- - 完整迁移核对调用方交接的目标根、`.migration/config.json` 的 `harmonyProject` 与 Preflight 已建工程位置,沿用同一个实际目标根。方案内的 `products/features/commons` 布局变化不另起工程;目标指向冲突时先查明,不能静默换路径再建一套。用户明确要求更换目标时,交由调用方通过现有 CLI 配置入口同步。
12
- - 精简 JSON 不重复保存工程绝对路径。创建前结合配置、Preflight、规划 Markdown 与明确用户上下文核对本次规划所属 Android 工程及实际目标根;独立调用缺少目标时只询问该位置。目标变更按统一流程清理当前确认并刷新展示,不将原位置的确认用于新位置;脚本返回创建指令不代表它已核验实际目标。
13
- - 从选中方案推导目录清单,核对路径位于目标根内,无绝对子路径、上级跳转、大小写冲突或模块嵌套。不得跟随链接写入源/参考工程或目标根之外。
14
- - 先检查目标实际状态和已有工程;保留用户文件。新增目录通常可直接执行;重用、移动或覆盖存在冲突的内容先查清,未授权覆盖则停止该动作并说明具体冲突。
15
- - 目标设备/SDK与方案一致;未知设备能力不以默认phone掩盖,也不把所有Android设备名直接写入鸿蒙配置。
7
+ - 从磁盘重新读取 `architecture-plan.md` 的当前选型记录和 `architecture-plan.json`,运行 `python <本Skill目录>/scripts/architecture_plan.py validate <产物目录>/architecture-plan.json`。核对项目、当前已选方案的目录和实际创建要求。JSON 合法不等于有授权;只有规划/选型授权时不创建。
8
+ - 读取当前最终 JSON 的 `directoryTree`,结合 `decisions` 中的主要决定和依赖说明实施。Markdown/JSON 不一致、有未处理的布局意见或仍在修订时先解决,不沿用旧树;不再读取 `proposals`、选择回传或推荐字段。
9
+ - 恢复时先读现有 `shell-receipt.json` 和实际工程,对照当前最终树核对实际路径。旧记录的 complete 不证明新树也已完成;已完成的动作核对后返回,部分完成只补仍获授权的缺项,不重复初始化、搬迁或覆盖。不同方案已有落地时比较实际冲突,不清空旧目录或用户业务。
10
+ - 完整迁移核对调用方目标根、`.migration/config.json` 的 `harmonyProject` 与 Preflight 已建工程位置,沿用同一个实际目标。目录布局变化不另起工程;路径冲突先查明。用户明确更换目标时,交调用方通过现有 CLI 配置入口同步。
11
+ - JSON 不保存绝对路径;结合配置、Preflight、Markdown 和明确用户上下文核对当前源工程及实际目标。独立调用缺少目标时只问该位置,不将旧位置的授权自动用于新位置。
12
+ - 所有树路径相对于实际目标根;检查无越界、大小写冲突或模块源码树交叠,不跟随符号链接/联接点写入源、参考工程或目标根外。先查已有文件,保留用户内容;未授权的移动/覆盖遇冲突时暂停该动作并说明。
13
+ - 设备/SDK须与已确认要求一致;未知能力不以默认 phone 掩盖,也不将 Android 设备名直接写入鸿蒙配置。
16
14
 
17
15
  ## 2. 复用基础工程,缺失时才创建
18
16
 
19
- 已有基础工程(包括 Preflight 生成的模板壳)先核对根构建配置、注册模块及本地依赖,确认可承载所选目录;直接在原工程落地,不再次运行创建/初始化命令或复制一份模板。保留 CLI 模板和用户文件,不因模板布局、设备或 SDK 默认值与所选方案不同而另建工程,记录并处理必要的配置调整。
17
+ 已有基础工程(含 Preflight 模板壳)先核对根配置、注册模块和本地依赖;直接在原工程落地,不再次初始化或复制模板。不因默认布局、设备或 SDK 与所选方案不同而另建工程,记录必要调整。
20
18
 
21
- 需要把模板 `entry` 放到选中产品路径时,先核对目标无冲突,再同步根注册 `srcPath`、相关本地依赖及测试路径。检查下游工具是否仍假设原模块位置;需要目录落地之外的工具改动时记录交接,不用第二份 `entry` 或第二套工程掩盖不兼容。无法确认安全时不移动,报告具体差异与必要改法。
19
+ 最终树若确认产品 HAP 就是现有 `entry`,直接复用;若确认移到 `products/产品`,先查目标冲突,再同步根注册 `srcPath`、本地依赖及测试路径。核对下游是否假定旧模块位置;所需工具改动超出本阶段时记录交接,不用两份 HAP 或两套工程掩盖不兼容。无法确认安全时不移动,报告具体差异。
22
20
 
23
- 仅当实际目标根尚无基础工程时,才按当前方案的确认与创建要求定位本机 DevEco CLI,阅读其帮助核对当前 create 命令、应用名、bundle、设备和输出路径等参数;独立使用本 Skill 同样先检查是否已有工程。目标非空但缺少基础配置时先报告冲突,不覆盖初始化;Preflight 记录与实际工程不一致时先查明原因。不把 Android 构建文件复制成鸿蒙配置;需要用户身份信息时只询问缺少的实际值。
21
+ 仅实际目标根尚无基础工程时才定位本机 DevEco CLI,读取其帮助核对当前 create 命令、应用名、bundle、设备和输出路径。目标非空但缺基础配置时先报告冲突,不覆盖初始化;Preflight 记录与实际不符时先查明。不把 Android 构建文件复制成鸿蒙配置;只询问确实缺少的身份或目标值。
24
22
 
25
- 创建/复用授权所需的目标配置核对、目录冲突检查与创建结果验证,不等于选择结合鸿蒙源码进行架构分析。若还需阅读现有业务实现来判断复用或调整架构,先按 [SKILL.md](../SKILL.md) 询问是否结合,已有明确选择则按其范围执行。
23
+ 创建所需的配置核对和结果验证不等于选择结合鸿蒙业务进行架构分析。如需扩读业务实现,按 [SKILL.md](../SKILL.md) 的现有选择执行,尚未选择时只问缺失项。
26
24
 
27
- 确需新建但 CLI 不可用或不支持目标设备时,保留已完成规划,给出实际错误及未完成创建项;普通空目录不能冒充可用鸿蒙基础工程。复用现有工程并补目录不以重新执行创建 CLI 为前提。不要为本阶段无限安装/重试工具或索要与创建无关的凭据。
25
+ 确需新建但 CLI 不可用或不支持目标时,保留规划并报告实际错误/未完成项;空目录不能冒充可用工程。已有工程补目录不以再次运行 CLI 为前提,不无限安装或重试。
28
26
 
29
- ## 3. 补齐选中目录
27
+ ## 3. 按最终树补齐目录
30
28
 
31
- 只创建选中方案的实际模块/关键子目录。模板之外不生成业务文件、空实现、额外模块配置或提前注册所有HAR/HSP;这些目录须明确标注为待下游配置的目录壳子。
29
+ 只创建 `directoryTree` 中的实际模块/关键子目录,根 `.` 表示目标根。不得创建另外两套对照方案,也不在实施时静默增加未展示的关键路径。发现归属或布局矛盾时回到主流程修订,处理影响后再继续,不为补壳子重做业务分析。
32
30
 
33
- 从 `proposals` 中取与 `selectedProposalId` 一致的 `directoryTree`,使用其中相对路径落地(根节点 `.` 表示目标根)。三套树已在选型前展开,不在创建时静默增加未展示的关键目录或改用推荐方案。若发现归属冲突或影响实际布局的待决,局部修订、刷新看板并按实际授权确认后再创建受影响目录,不为创建壳子重做业务分析。
31
+ 模板之外不生成业务文件、空实现、额外模块配置或提前注册所有 HAR/HSP;未配置的模块须记为目录壳子。单 HAP 的 feature 放在实际源码根内,资源服从所属模块;共享契约与所有权随规划交接,不用接口桩或重复共享状态冒充前置完成。
34
32
 
35
- 选中融合方案时从已确认目录树创建基础包族与页面 feature 目录,必要时结合 Markdown 的归属说明,不要求 JSON 映射集合。保留逻辑目录和实际模块的区别;单 HAP 的 feature 目录落在实际源码根内,资源服从所属模块规则,不套用独立库的 `src/main`。共享契约和集成所有权随规划交接,不以生成接口桩或复制共享状态充当完成前置。
33
+ 完成后检查基础配置、注册产品路径和关键目录确实存在,设备与要求一致,用户文件未被覆盖。执行中若规划被修改,核对影响后再继续;调整过结构/配置时向调用方交接需要刷新的验证,旧 Preflight 不能证明新布局已通过。本 Skill 不自行构建或运行。
36
34
 
37
- 命令成功后检查目标根基础配置、注册产品路径及关键目录确实存在,设备配置与选择一致,已有文件没有被覆盖;若执行中用户修改规划,先核对影响,不能按旧目录继续宣称完整。
35
+ ## 4. 保存实际结果并交接
38
36
 
39
- 结构或构建配置发生变化时,向调用方交接需要刷新的工程验证;初始 Preflight 构建结果不能证明调整后的布局已通过。本 Skill 不自行构建或运行应用。
37
+ 在规划产物目录写 `shell-receipt.json`;复用并补目录同样记录:
40
38
 
41
- ## 4. 保存实际记录并交接
39
+ - `status`:complete / partial / blocked,按实际落地结果。
40
+ - `planFile`、`planViewFile`、`proposalId`、`target`:最终 JSON、规划 Markdown、当前选定方案及实际目标根;方案身份来自实际确认记录。
41
+ - `confirmation`:本次执行依据的真实回答、来源、创建要求和适用范围,指明 Markdown 记录位置;不伪造请求 ID、修订或看板确认。更新已有 receipt 时保留历史执行依据和实际落地记录。
42
+ - `baseProject`:新建/复用、来源与依据、实际注册产品路径、设备及本阶段实际执行的 CLI/日志。引用先前 Preflight 证据时注明来源,不冒充本阶段执行。
43
+ - `createdDirectories`、`existingDirectories`、`directoryOnlyModules`:新增、已存在、尚未注册的模块目录。
44
+ - `verification`、`remainingIssues`:真实检查结果、配置差异和未完成项,不编造日志或验证。
42
45
 
43
- 在规划产物目录写 `shell-receipt.json`,记录可核验的实际落地结果,复用基础工程并补目录同样需要记录:
44
-
45
- - `status`:complete / partial / blocked,按真实落地结果填写。
46
- - `planFile`、`proposalId`、`target`:当前 `architecture-plan.json`、选中方案和实际目标根;可用 `planViewFile` 附 Markdown 路径。
47
- - `planId`、`selectionRequestId`:本次执行绑定的规划身份和请求 ID,供恢复核对;旧 receipt 缺少这些字段时结合原授权与实际文件查证,不伪造历史记录。
48
- - `confirmationFile`、`confirmation`:本次实际读取的 `architecture-selection.json` 路径及用户选择/推荐委托、动作、来源与对应修订,未确认不得执行落地。receipt 保存实际执行依据,主规划不嵌套第二份确认对象。
49
- - `baseProject`:新建或复用、工程来源与辨别依据、实际注册产品路径、设备类型及本阶段实际使用的 CLI/命令/日志位置。Preflight 已建工程记为复用;引用先前创建证据时注明来源,不冒充本阶段执行。
50
- - `createdDirectories`、`existingDirectories`、`directoryOnlyModules`:分别记录新增、已存在和未注册的模块目录。
51
- - `verification`、`remainingIssues`:实际检查结果、路径/配置差异和未完成项,不编造日志或检查。
52
-
53
- 落地完成只表示基础工程已创建或复用、所选目录壳子已落地。交接最终规划、receipt与未解决风险;其他两套保留为对照。模型生成的记录不能替代目标文件/目录和用户授权证据。
46
+ 落地完成仅表示基础工程和所选目录壳子已落地。交接最终规划、receipt 和未解决风险,不宣称业务迁移完成。