@harmonyos-arkts/d2h 0.1.27 → 0.1.29
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 +43 -3
- package/agents/d2h.md +16 -14
- package/dist/bin/install-opencode.js +28 -23
- 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/dist/src/select-agent.js +207 -0
- 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,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 和未解决风险,不宣称业务迁移完成。
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
保留的是可追溯结构与合理协作,不是 Android 实现机制:Android API、资源格式、JNI/运行时和 SDK 坐标按目标承接方式替换。原结构中反向依赖页面、应用单例、环或业务混杂的部分需要最小拆分/改向,逐项记录原路径、保留部分、调整部分、目标所有者、消费者与理由。未确认的 SDK/Native/运行时能力记录受影响边界和验证前置,不能凭保留目录认定可直接转换。
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
原包族已经清楚时,保留其组织方式,不为套用 `core/network/storage/model` 重新拆散。原包中混有页面状态、业务策略或直接访问应用全局对象的代码时,分别移回业务侧或改为接收明确依赖;基础库需要配置、应用环境等信息时由应用入口提供,不长期持有页面对象。拆分改动很大且收益有限时,说明保留部分及哪些页面仍需一起修改和验证。
|
|
25
25
|
|
|
26
26
|
## 3. 业务层:feature 是转换边界
|
|
27
27
|
|
|
@@ -29,34 +29,36 @@
|
|
|
29
29
|
|
|
30
30
|
每个 feature 内聚页面、ViewModel/等效状态、私有数据访问、组件和资源;按真实复杂度选目录,保留原业务名及源码映射便于定位。共享会话、缓存、任务队列等由一个领域所有者维护,页面只保留展示投影;导航传必要标识/值或约定结果,不传其他页面的 ViewModel、组件实例或可变状态。
|
|
31
31
|
|
|
32
|
-
`feature`
|
|
32
|
+
`feature` 在这里指业务目录,不等于 feature 类型的 HAP,也不要求一页一个 HAR/HSP。包类型按 [layout-reference.md](layout-reference.md) 的选型规则确定:没有拆库收益时留在产品 HAP,需要封装引用时用 HAR,有实际运行时共享或按需加载需求时再评估 HSP。HAP 不能作为供其他模块直接 import 的业务库。
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
同一个 HAR 被多个 HAP/HSP 引用时可能重复打包;无论选择 HAR 还是 HSP,都不能因此认定业务状态只有一个实例。共享仓库/会话由应用入口统一创建和提供,说明其有效期;跨进程不假设共享同一实例。
|
|
35
|
+
|
|
36
|
+
下面仅示意需要单独维护 `infra` 基础库、商品业务库和设置业务库的工程:一个产品 HAP 引用这些 HAR,商品列表/详情由产品导航打开,没有独立安装需求。树只列目录,名字和包粒度从实际源码确定;`commons`、`features` 分别可承载两层,`products` 承载业务侧装配。
|
|
35
37
|
|
|
36
38
|
```text
|
|
37
39
|
<HarmonyOS>/
|
|
38
40
|
├── AppScope/
|
|
39
|
-
├── products/<产品>/src/main/ # HAP
|
|
41
|
+
├── products/<产品>/src/main/ # entry HAP:启动、装配与导航
|
|
40
42
|
│ ├── ets/{entryability,navigation,composition}/
|
|
41
43
|
│ └── resources/
|
|
42
|
-
├── commons/infra/src/main/ #
|
|
44
|
+
├── commons/infra/src/main/ # HAR:供产品与业务模块引用的基础库
|
|
43
45
|
│ ├── ets/com/acme/infra/ # 原基础包族相对层级
|
|
44
46
|
│ │ ├── net/
|
|
45
47
|
│ │ └── store/
|
|
46
48
|
│ └── resources/ # 原基础能力实际拥有的资源
|
|
47
49
|
└── features/
|
|
48
|
-
├── catalog/src/main/ #
|
|
50
|
+
├── catalog/src/main/ # HAR:产品 HAP 引用,含列表/详情,无独立安装需求
|
|
49
51
|
│ ├── ets/
|
|
50
52
|
│ │ ├── list/{pages,viewmodel,data,components}/
|
|
51
53
|
│ │ ├── detail/{pages,viewmodel,data}/
|
|
52
54
|
│ │ └── shared/{model,repository,state}/
|
|
53
55
|
│ └── resources/ # 同模块资源,划分页面命名与集成归属
|
|
54
|
-
└── settings/src/main/ #
|
|
56
|
+
└── settings/src/main/ # HAR:产品 HAP 引用的设置业务库
|
|
55
57
|
├── ets/{pages,viewmodel}/
|
|
56
58
|
└── resources/
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
上例列表/详情同属一个业务 HAR,页面 feature 是库内的普通目录。若只是这几个页面且无拆库收益,直接放在产品 HAP 内更简单;确有独立安装/部署需求时才评估 feature HAP,并重新设计 Ability 入口及跨 HAP 协作,不能只改树上的类型注释。目录树标注实际模块及源码根,不把业务域分组自动变成构建模块。此例没有需要 HSP 的共享或加载要求,不为展示包类型凑一个 HSP。
|
|
60
62
|
|
|
61
63
|
单 HAP 可在 `entry/src/main/ets/` 下使用 `foundation/<原包族>/`、`features/<业务>/<页面>/`、必要的 `features/<业务>/shared/` 和装配目录;资源按目标模块规则放置并划分命名/写入所有权。模块内目录也能定义页面转换边界,不能虚构每页独立的资源根或构建能力。
|
|
62
64
|
|
|
@@ -71,14 +73,10 @@
|
|
|
71
73
|
|
|
72
74
|
在架构稿中简记关键共享能力、目标所有者、主要消费者及协作/装配方式,未明确的契约列为后续细化前置。只有输入输出、错误或生命周期约束会改变拆合与所有权时才展开;不要求完整契约设计,不预定接口文件,也不把规划能力写成已实现。
|
|
73
75
|
|
|
74
|
-
|
|
76
|
+
跨模块页面导航参考 [Navigation 跨包路由](https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/arkts-navigation-cross-package),核对系统路由表及 HAR/HSP 页面路由的配置方式(核查日期:2026-11-02)。这份资料只作为导航集成依据;本 Skill 的两层划分、原包族保留及按页面组织是迁移设计选择,不宣称来自官方统一分层规范。具体路由与打包机制按实际 SDK/设备核实,不仅凭目录选定。
|
|
75
77
|
|
|
76
78
|
## 5. 从分层到独立页面转换的交接
|
|
77
79
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
路由、资源聚合、公共导出、构建配置与装配等已知共同修改区域指定集成归属;页面私有目录与共享区域分开。共享修改先回所有者,精确的独占文件、测试资产、完整契约与验收条件由后续页面规划/实现确定,不作为架构稿交付前置。
|
|
81
|
-
|
|
82
|
-
并行建议附条件:契约明确、实现前置满足、写入范围不冲突且共同修改有集成归属;仅导航关联不自动形成实现顺序。条件未核验时写候选或待细化,强耦合已证实才要求合组/串行;规划契约与空目录不能证明已可开工。集成仍需验证真实能力和跨页协作。
|
|
80
|
+
交接源入口/页面族、目标 feature、共享依赖及所有者,说明各候选真正需要的前置;不要求无关基础库全部迁完。路由、资源、公共导出、构建配置和应用装配等共同修改区域要有集成归属。
|
|
83
81
|
|
|
84
|
-
|
|
82
|
+
页面目录分开只表示候选边界。能否独立转换,还需后续确认契约、实现前置和写入范围无冲突;强耦合已证实时说明需要合组的部分。具体页面/Spec 身份、任务派发和验收由下游确定,不在架构阶段生成任务协议或把目录壳子记为已可开工。
|