@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.
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +2 -0
- package/README.md +34 -2
- package/agents/d2h.md +16 -14
- package/dist/bin/install-opencode.js +25 -22
- package/dist/src/install-codex.js +5 -126
- package/dist/src/install-skills.js +147 -0
- package/dist/src/install-vscode.js +2 -2
- package/docs/environment-check.md +3 -3
- package/package.json +6 -6
- package/skills/arkts-mvvm-architecture/SKILL.md +2 -0
- package/skills/d2h-architecture-plan/SKILL.md +19 -26
- package/skills/d2h-architecture-plan/references/architecture-plan.example.json +80 -315
- package/skills/d2h-architecture-plan/references/directory-creation.md +27 -34
- package/skills/d2h-architecture-plan/references/hybrid-design.md +13 -15
- package/skills/d2h-architecture-plan/references/json-contract.md +29 -91
- package/skills/d2h-architecture-plan/references/layout-reference.md +30 -27
- package/skills/d2h-architecture-plan/references/plan-contract.md +27 -34
- package/skills/d2h-architecture-plan/references/source-review.md +1 -1
- package/skills/d2h-architecture-plan/scripts/architecture_plan.py +29 -163
- package/skills/d2h-architecture-plan/scripts/test_architecture_plan.py +205 -342
- package/skills/d2h-spec-develop/SKILL.md +5 -4
- package/{install-opencode.sh → tooling/install-opencode.sh} +3 -3
- package/{opencode → tooling/opencode}/interactive-tools/advance-progress-demo.mjs +1 -1
- package/{opencode → tooling/opencode}/interactive-tools/demo.mjs +3 -3
- package/{opencode → tooling/opencode}/interactive-tools/prepare-demo.mjs +1 -1
- package/{scripts → tooling/scripts}/check-environment.mjs +3 -3
- package/skills/d2h-architecture-plan/references/selection-flow.md +0 -71
- /package/{opencode → tooling/opencode}/agents.json +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/browser-host.ts +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/core.ts +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/demo-workflow.ts +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/package-lock.json +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/package.json +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/panel.ts +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/prepare-progress-demo.mjs +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/progress.ts +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/server-legacy.mjs +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/server.mjs +0 -0
- /package/{opencode → tooling/opencode}/interactive-tools/tui.tsx +0 -0
- /package/{opencode → tooling/opencode}/vscode-d2h-package.json +0 -0
- /package/{opencode → tooling/opencode}/vscode-d2h-plugin.mjs +0 -0
|
@@ -1,45 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: d2h-architecture-plan
|
|
3
3
|
description: >-
|
|
4
|
-
用于 Android 转 HarmonyOS
|
|
5
|
-
|
|
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
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
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
|
|
28
|
-
3.
|
|
29
|
-
4.
|
|
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
|
-
|
|
28
|
+
校验命令:`python <本Skill目录>/scripts/architecture_plan.py validate <产物目录>/architecture-plan.json`。辅助脚本要求 Python 3.10+,只校验展示数据,不处理选择、写入文件或创建工程。
|
|
32
29
|
|
|
33
|
-
|
|
30
|
+
## 交付与修订
|
|
34
31
|
|
|
35
|
-
|
|
32
|
+
`architecture-plan.md` 保存项目理解、三套对照、推荐、用户回答与范围、最终归属/依赖及风险;`architecture-plan.json` 是确认后生成的最终展示和目录实施输入,两者应一致。
|
|
36
33
|
|
|
37
|
-
|
|
34
|
+
用户通过对话修改时同步两份产物。影响目录、依赖、目标或授权范围时,先将旧展示 JSON 移为不覆盖历史文件的备份,注明待修订并暂停受影响的实施,处理后重新校验发布;明确授权的调整不再重复确认。缺少当前有效确认的旧产物不作为最终结果继续展示。
|
|
38
35
|
|
|
39
|
-
|
|
36
|
+
恢复实施须重读 Markdown 的实际确认与最终 JSON,核对项目、目标和目录;文件存在或校验通过不代表用户授权。看板只展示最终 JSON,加载、刷新及修订期间的缓存处理由调用方适配。
|
|
40
37
|
|
|
41
|
-
|
|
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
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"name": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
"
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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": "
|
|
34
|
-
"path": "
|
|
35
|
-
"description": "
|
|
21
|
+
"name": "src",
|
|
22
|
+
"path": "entry/src",
|
|
23
|
+
"description": "产品模块源码与资源。",
|
|
36
24
|
"children": [
|
|
37
25
|
{
|
|
38
|
-
"name": "
|
|
39
|
-
"path": "
|
|
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": "
|
|
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": "
|
|
63
|
-
"path": "entry/src/main/ets",
|
|
64
|
-
"description": "
|
|
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": "
|
|
109
|
-
"path": "entry/src/main/
|
|
110
|
-
"description": "
|
|
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": "
|
|
162
|
-
"path": "entry/src/main/ets",
|
|
163
|
-
"description": "
|
|
54
|
+
"name": "features",
|
|
55
|
+
"path": "entry/src/main/ets/features",
|
|
56
|
+
"description": "页面业务区,不额外拆成独立构建模块。",
|
|
164
57
|
"children": [
|
|
165
58
|
{
|
|
166
|
-
"name": "
|
|
167
|
-
"path": "entry/src/main/ets/
|
|
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": "
|
|
178
|
-
"path": "entry/src/main/ets/features/
|
|
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": "
|
|
204
|
-
"path": "entry/src/main/ets/
|
|
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": "
|
|
214
|
-
"path": "entry/src/main/
|
|
215
|
-
"description": "
|
|
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": "
|
|
272
|
-
"path": "entry/src/main/ets/
|
|
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
|
-
|
|
3
|
+
仅在用户要求创建/复用基础工程并已确认当前方案时读取。按 [SKILL.md](../SKILL.md) 的主流程完成提问及 JSON/Markdown 交付后继续;看板仅展示,不再确认。本阶段优先复用基础工程,普通文件工具补齐关键目录;确实无基础工程时才用本机 DevEco CLI 创建。不实现业务、不构建或运行应用。
|
|
4
4
|
|
|
5
|
-
## 1.
|
|
5
|
+
## 1. 重读最终方案、授权与目标
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
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
|
-
|
|
17
|
+
已有基础工程(含 Preflight 模板壳)先核对根配置、注册模块和本地依赖;直接在原工程落地,不再次初始化或复制模板。不因默认布局、设备或 SDK 与所选方案不同而另建工程,记录必要调整。
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
最终树若确认产品 HAP 就是现有 `entry`,直接复用;若确认移到 `products/产品`,先查目标冲突,再同步根注册 `srcPath`、本地依赖及测试路径。核对下游是否假定旧模块位置;所需工具改动超出本阶段时记录交接,不用两份 HAP 或两套工程掩盖不兼容。无法确认安全时不移动,报告具体差异。
|
|
22
20
|
|
|
23
|
-
|
|
21
|
+
仅实际目标根尚无基础工程时才定位本机 DevEco CLI,读取其帮助核对当前 create 命令、应用名、bundle、设备和输出路径。目标非空但缺基础配置时先报告冲突,不覆盖初始化;Preflight 记录与实际不符时先查明。不把 Android 构建文件复制成鸿蒙配置;只询问确实缺少的身份或目标值。
|
|
24
22
|
|
|
25
|
-
|
|
23
|
+
创建所需的配置核对和结果验证不等于选择结合鸿蒙业务进行架构分析。如需扩读业务实现,按 [SKILL.md](../SKILL.md) 的现有选择执行,尚未选择时只问缺失项。
|
|
26
24
|
|
|
27
|
-
确需新建但 CLI
|
|
25
|
+
确需新建但 CLI 不可用或不支持目标时,保留规划并报告实际错误/未完成项;空目录不能冒充可用工程。已有工程补目录不以再次运行 CLI 为前提,不无限安装或重试。
|
|
28
26
|
|
|
29
|
-
## 3.
|
|
27
|
+
## 3. 按最终树补齐目录
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
只创建 `directoryTree` 中的实际模块/关键子目录,根 `.` 表示目标根。不得创建另外两套对照方案,也不在实施时静默增加未展示的关键路径。发现归属或布局矛盾时回到主流程修订,处理影响后再继续,不为补壳子重做业务分析。
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
模板之外不生成业务文件、空实现、额外模块配置或提前注册所有 HAR/HSP;未配置的模块须记为目录壳子。单 HAP 的 feature 放在实际源码根内,资源服从所属模块;共享契约与所有权随规划交接,不用接口桩或重复共享状态冒充前置完成。
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
完成后检查基础配置、注册产品路径和关键目录确实存在,设备与要求一致,用户文件未被覆盖。执行中若规划被修改,核对影响后再继续;调整过结构/配置时向调用方交接需要刷新的验证,旧 Preflight 不能证明新布局已通过。本 Skill 不自行构建或运行。
|
|
36
34
|
|
|
37
|
-
|
|
35
|
+
## 4. 保存实际结果并交接
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
在规划产物目录写 `shell-receipt.json`;复用并补目录同样记录:
|
|
40
38
|
|
|
41
|
-
|
|
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
|
-
|
|
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 和未解决风险,不宣称业务迁移完成。
|