@harmonyos-arkts/d2h 0.1.20 → 0.1.21
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/README.md +40 -0
- package/agents/android-to-hmos-00-orchestrator.md +3 -315
- package/agents/d2h.md +53 -38
- package/contracts/workflow/artifacts.md +22 -0
- package/contracts/workflow/delivery.md +54 -0
- package/contracts/workflow/dispatch.md +26 -0
- package/contracts/workflow/execution.md +125 -0
- package/contracts/workflow/generation.md +40 -0
- package/contracts/workflow/orchestration.md +49 -0
- package/contracts/workflow/overview.md +58 -0
- package/contracts/workflow/plan.md +119 -0
- package/contracts/workflow/scope.md +151 -0
- package/dist/bin/install-opencode.js +34 -15
- package/dist/src/install-codex.js +131 -0
- package/dist/src/install-opencode.js +5 -5
- package/dist/src/workflow.js +54 -0
- package/docs/architecture-plan-guide.zh-CN.md +70 -0
- package/docs/incremental-spec-evaluation-design.md +670 -0
- package/docs/spec-plan-guide.md +226 -0
- package/docs/workflow-decoupling.md +59 -0
- package/opencode/interactive-tools/advance-progress-demo.mjs +21 -0
- package/opencode/interactive-tools/browser-host.ts +110 -0
- package/opencode/interactive-tools/core.ts +242 -0
- package/opencode/interactive-tools/demo-workflow.ts +55 -0
- package/opencode/interactive-tools/demo.mjs +37 -0
- package/opencode/interactive-tools/package-lock.json +1876 -0
- package/opencode/interactive-tools/package.json +23 -0
- package/opencode/interactive-tools/panel.ts +40 -0
- package/opencode/interactive-tools/prepare-demo.mjs +17 -0
- package/opencode/interactive-tools/prepare-progress-demo.mjs +13 -0
- package/opencode/interactive-tools/progress.ts +118 -0
- package/opencode/interactive-tools/server-legacy.mjs +2 -0
- package/opencode/interactive-tools/server.mjs +40 -0
- package/opencode/interactive-tools/tui.tsx +230 -0
- package/package.json +9 -1
- package/schemas/native-libs-analysis-report.schema.json +695 -0
- package/schemas/native-libs-verify-report.schema.json +566 -0
- package/schemas/spec-native-libs-shard.schema.json +110 -0
- package/skills/arkts-icon-sizing/SKILL.md +0 -10
- package/skills/cpp/d2h-native-library-analyse/SKILL.md +91 -0
- package/skills/cpp/d2h-native-library-analyse/scripts/analyse-android-so.py +630 -0
- package/skills/cpp/d2h-native-library-build/SKILL.md +403 -0
- package/skills/cpp/d2h-native-library-build/references/build-config-mapping.md +180 -0
- package/skills/cpp/d2h-native-library-build/references/jni-to-napi-mapping.md +74 -0
- package/skills/cpp/d2h-native-library-build/scripts/check-android-so.py +580 -0
- package/skills/cpp/d2h-native-library-verify/SKILL.md +111 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-build-sign-run.md +67 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/AppScope/app.json5 +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/AppScope/resources/base/element/string.json +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/README.md +25 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/build-profile.json5 +24 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/build-profile.json5 +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/hvigorfile.ts +2 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/oh-package.json5 +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/ets/entryability/EntryAbility.ets +5 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/ets/pages/Index.ets +3 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/ets/pages/NativeVerifyDemo.ets +276 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/module.json5 +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/resources/base/element/color.json +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/resources/base/element/string.json +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/main/resources/base/profile/main_pages.json +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/ohosTest/ets/test/FFmpegVerify.test.ets +176 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/ohosTest/ets/test/List.test.ets +2 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/entry/src/ohosTest/module.json5 +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/hvigor/hvigor-config.json5 +1 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/hvigorfile.ts +2 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-project-template/oh-package.json5 +9 -0
- package/skills/cpp/d2h-native-library-verify/references/demo-template.md +176 -0
- package/skills/cpp/d2h-native-library-verify/references/hypium-test-template.md +163 -0
- package/skills/cpp/d2h-native-library-verify/scripts/__pycache__/native_common.cpython-313.pyc +0 -0
- package/skills/cpp/d2h-native-library-verify/scripts/device-verify.py +304 -0
- package/skills/cpp/d2h-native-library-verify/scripts/native_common.py +341 -0
- package/skills/cpp/d2h-native-library-verify/scripts/verify-ohos-native.py +1099 -0
- package/skills/d2h-app-solution/SKILL.md +198 -0
- package/skills/d2h-app-solution/agents/openai.yaml +4 -0
- package/skills/d2h-app-solution/references/framework-evidence.md +117 -0
- package/skills/d2h-app-solution/references/hierarchy-rules.md +88 -0
- package/skills/d2h-app-solution/references/inventory-schema.md +305 -0
- package/skills/d2h-app-solution/references/technical-analysis.md +101 -0
- package/skills/d2h-app-solution/scripts/scan_repositories.py +350 -0
- package/skills/d2h-app-solution/scripts/validate_inventory.py +337 -0
- package/skills/d2h-architecture-plan/SKILL.md +35 -0
- package/skills/d2h-architecture-plan/references/directory-creation.md +43 -0
- package/skills/d2h-architecture-plan/references/hybrid-design.md +84 -0
- package/skills/d2h-architecture-plan/references/layout-reference.md +83 -0
- package/skills/d2h-architecture-plan/references/plan-contract.md +51 -0
- package/skills/d2h-architecture-plan/references/source-review.md +50 -0
- package/skills/d2h-cloud-knowledge/SKILL.md +28 -7
- package/skills/d2h-cloud-knowledge/kb_query.mjs +8 -0
- package/skills/d2h-dashboard/SKILL.md +56 -0
- package/skills/d2h-product-family-migration/SKILL.md +103 -0
- package/skills/d2h-product-family-migration/agents/openai.yaml +3 -0
- package/skills/d2h-product-family-migration/assets/incremental-plan.template.md +55 -0
- package/skills/d2h-product-family-migration/references/advanced/behavioral-verification.md +59 -0
- package/skills/d2h-product-family-migration/references/advanced/existing-skill-integration.md +30 -0
- package/skills/d2h-product-family-migration/references/advanced/packaging-and-verification.md +43 -0
- package/skills/d2h-product-family-migration/references/advanced/platform-probes.md +26 -0
- package/skills/d2h-product-family-migration/references/advanced/product-line-design.md +40 -0
- package/skills/d2h-product-family-migration/references/baseline-and-delta.md +50 -0
- package/skills/d2h-product-family-migration/tests/markdown-cases.md +76 -0
- package/skills/{d2h-page-develop → d2h-spec-develop}/SKILL.md +143 -126
- package/skills/d2h-spec-develop/agents/openai.yaml +7 -0
- package/skills/d2h-spec-develop/references/worker-workflow.md +26 -0
- package/skills/{d2h-page-spec-generate → d2h-spec-generate}/SKILL.md +24 -13
- package/skills/d2h-spec-generate/assets/spec-template.md +109 -0
- package/skills/d2h-spec-generate/references/from-plan.md +19 -0
- package/skills/d2h-spec-generate/references/spec-content.md +34 -0
- package/skills/{d2h-page-spec-generate → d2h-spec-generate}/scripts/build_batch_report.py +35 -84
- package/skills/d2h-spec-plan/SKILL.md +38 -0
- package/skills/d2h-spec-plan/agents/openai.yaml +4 -0
- package/skills/d2h-spec-plan/references/architecture-handoff.md +9 -0
- package/skills/d2h-spec-plan/references/plan-contract.md +13 -0
- package/skills/d2h-spec-plan/references/planning-method.md +46 -0
- package/skills/d2h-spec-plan/references/round-scope-assessment.md +49 -0
- package/skills/d2h-spec-plan/references/work-packets.md +61 -0
- package/skills/d2h-utg-ai-generate/references/click-paths-schema.json +2 -2
- package/skills/d2h-utg-ai-generate/references/page-schema.json +2 -2
- package/skills/d2h-utg-ai-generate/references/utg-schema.json +2 -2
- package/skills/d2h-utg-static-generate/SKILL.md +2 -2
- package/skills/managing-d2h-toolchain/environment-requirements.json +1 -1
- package/skills/managing-d2h-toolchain/toolchain.json +1 -1
- package/skills/preparing-migration-workspace/SKILL.md +32 -2
- package/workflow/__pycache__/artifact_bindings.cpython-313.pyc +0 -0
- package/workflow/__pycache__/spec_runtime.cpython-313.pyc +0 -0
- package/workflow/artifact_bindings.py +224 -0
- package/workflow/assets/dashboard.html +88 -0
- package/workflow/build_batch_report.py +8 -0
- package/workflow/collect_code_metrics.py +75 -0
- package/workflow/dashboard_overview.py +109 -0
- package/workflow/delivery_view.py +82 -0
- package/workflow/feature_plan.py +234 -0
- package/workflow/page_batches.py +223 -0
- package/workflow/spec_generation.py +120 -0
- package/workflow/spec_runtime.py +890 -0
- package/workflow/work_packets.py +85 -0
- package/skills/d2h-page-develop/agents/openai.yaml +0 -7
- package/skills/harmonyos-migration-playbook/SKILL.md +0 -83
- package/skills/harmonyos-migration-playbook/agents/openai.yaml +0 -7
- package/skills/harmonyos-migration-playbook/references/arkts-compile.md +0 -24
- package/skills/harmonyos-migration-playbook/references/harmony-runtime.md +0 -53
- package/skills/harmonyos-migration-playbook/references/lesson-lifecycle.md +0 -45
- package/skills/harmonyos-migration-playbook/references/protocol-e2e.md +0 -23
- package/skills/harmonyos-migration-playbook/references/ui-automation.md +0 -53
- package/skills/harmonyos-migration-playbook/references/windows-environment.md +0 -38
- package/skills/native-library-substitution/SKILL.md +0 -385
- package/skills/native-library-substitution/references/native-library-substitution.json +0 -56906
- package/skills/native-library-substitution/references/native-library-substitution.md +0 -163
- package/skills/porting-cmake-native-libraries/SKILL.md +0 -57
- package/skills/porting-cmake-native-libraries/references/platform-adaptation.md +0 -49
- package/skills/porting-cmake-native-libraries/references/report-and-build.md +0 -60
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: d2h-app-solution
|
|
3
|
+
description: Extract an auditable inventory.json containing a one-to-four-level user-facing feature inventory from Android, HarmonyOS, iOS, Flutter, React Native, or web source repositories, including whether each feature should be developed, implementation status, MVP/core/full release stage, per-feature technology stack, SDK/SO dependencies, Android permissions, confidence, and source citations. Use for code-based function discovery, navigation reconstruction, platform coverage comparison, or migration planning.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 提取应用功能清单
|
|
7
|
+
|
|
8
|
+
从“用户能看到并操作什么”出发重建功能树。不要把目录树、类名列表或字符串资源列表直接当成功能清单。
|
|
9
|
+
|
|
10
|
+
## 输入与默认值
|
|
11
|
+
|
|
12
|
+
收集以下输入;只有缺失项会实质改变结果时才询问:
|
|
13
|
+
|
|
14
|
+
- 一个或多个应用代码仓路径;为每个仓指定稳定的短 ID 和展示名。
|
|
15
|
+
- 输出目录。
|
|
16
|
+
- 可选的产品变体、登录态、账号态、首次启动态或目标语言。
|
|
17
|
+
- 可选的参考清单。参考清单只定义粒度和命名风格,不得覆盖源码事实。
|
|
18
|
+
|
|
19
|
+
默认分析可发布的主应用变体、首次启动与回访用户两个入口上下文、最多四级路径,并输出中文名称。
|
|
20
|
+
|
|
21
|
+
由 `d2h` 完整迁移流程调用时,输出目录固定为 Android 工程同级 `<工程名>-migration/.migration/feature-analysis/`,机器事实源固定命名为 `inventory.json`;单仓 Android 输入使用稳定仓 ID `android`、平台 `android`,并在 `repositories[].revision` 记录当前提交或 `working-tree`。独立调用仍使用用户指定输出目录。
|
|
22
|
+
|
|
23
|
+
## 核心约束
|
|
24
|
+
|
|
25
|
+
1. 只收录用户可感知的页面、区域、控件、菜单、对话框、设置项和操作结果。
|
|
26
|
+
2. 先证明入口可达,再证明控件可见,再证明交互与结果。仅有字符串、类名、资源或测试名称不能证明功能存在。
|
|
27
|
+
3. 测试、文档、截图和注释只能补强源码证据,不能单独支撑“已实现”。
|
|
28
|
+
4. 不把后端能力、工具模块、示例目录、UI catalog、debug 页面或未接入入口的页面默认列为正式功能。
|
|
29
|
+
5. 不用“未搜到”直接判定“无”。只有完成同义词、路由、入口、交互、资源和调用链复核后,才标记 `absent`;否则标记 `uncertain`。
|
|
30
|
+
6. 不为凑齐四级而虚构中间节点。路径可以在任意一级结束。
|
|
31
|
+
7. 同一功能从不同父入口进入时保留不同路径;只有交互语义、目标和前置条件等价时才跨仓对齐。
|
|
32
|
+
8. 版本阶段按用户价值链判定,不把代码复杂度或推测的历史发布时间当作版本依据。
|
|
33
|
+
9. 技术栈、SDK/SO 和权限必须关联到具体功能实现;仓库级依赖、Manifest 权限或某类文件存在不能自动套用到所有功能。
|
|
34
|
+
10. 开闭源属性必须有许可证、源码或权威依赖元数据证据;无法证明时写 `unknown`,不要按厂商或包名猜测。
|
|
35
|
+
|
|
36
|
+
## 工作流
|
|
37
|
+
|
|
38
|
+
### 1. 建立确定性证据索引
|
|
39
|
+
|
|
40
|
+
运行扫描器;扫描器只生成检索种子,不直接决定最终功能。扫描结果必须写入系统临时工作目录,不能写入 `inventory.json` 所在交付目录:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
EVIDENCE_DIR="$(mktemp -d)"
|
|
44
|
+
python3 <skill-dir>/scripts/scan_repositories.py \
|
|
45
|
+
--repo android=/abs/path/to/android-app \
|
|
46
|
+
--repo harmony=/abs/path/to/harmony-app \
|
|
47
|
+
--output "$EVIDENCE_DIR"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
读取临时目录中的 `scan-summary.json`、`candidate-files.tsv` 和 `technical-files.tsv`,再用 `rg` 定点追踪高分文件。`technical-files.tsv` 用于定位实现语言、构建依赖、原生库和权限线索;扫描结果仍只是检索种子。大仓库不要从所有业务类开始逐文件阅读。完成 `inventory.json` 校验后清理该临时目录;交付目录最终只能包含 `inventory.json`。
|
|
51
|
+
|
|
52
|
+
### 2. 识别平台与正式入口
|
|
53
|
+
|
|
54
|
+
按需读取 [framework-evidence.md](references/framework-evidence.md)。逐仓确认:
|
|
55
|
+
|
|
56
|
+
- launcher/ability/application 入口和实际发布变体;
|
|
57
|
+
- 首次启动、未登录、已登录、无账号、有账号、深链等入口上下文;
|
|
58
|
+
- 主页面、导航壳、tab、drawer、toolbar 和路由宿主;
|
|
59
|
+
- 被 feature flag、权限、账号状态、构建 flavor 或 mock 数据控制的分支。
|
|
60
|
+
|
|
61
|
+
把 demo、preview、test、catalog、benchmark、sample 和未被正式入口引用的页面从主图隔离。
|
|
62
|
+
|
|
63
|
+
### 3. 重建可达交互图
|
|
64
|
+
|
|
65
|
+
从每个正式入口做有界遍历:
|
|
66
|
+
|
|
67
|
+
1. 解析路由声明和目标页面。
|
|
68
|
+
2. 解析可见文案、菜单标题、图标的 content description/无障碍标签。
|
|
69
|
+
3. 关联点击、手势、提交、选择、tab 切换和菜单展开回调。
|
|
70
|
+
4. 沿回调追到导航目标、对话框、状态变化或外部系统行为。
|
|
71
|
+
5. 记录控制显示/可用性的条件。
|
|
72
|
+
6. 对动态路由、反射、DI、服务端配置或运行时菜单保留 `uncertain`,不要猜测。
|
|
73
|
+
|
|
74
|
+
每条候选至少保留:入口上下文、父路径、用户可见名称、触发方式、目标/效果、条件、源码位置和证据类型。
|
|
75
|
+
|
|
76
|
+
### 4. 分析版本阶段与技术约束
|
|
77
|
+
|
|
78
|
+
完整读取 [technical-analysis.md](references/technical-analysis.md),逐功能补充:
|
|
79
|
+
|
|
80
|
+
- `release_stage`:`mvp|core|full|uncertain`,并说明基于用户价值闭环的判定理由;
|
|
81
|
+
- 每个仓实现实际使用的 `technology_stack`,混合实现保留多个技术栈;
|
|
82
|
+
- `external_dependencies`:是否依赖第三方 SDK 或 SO、开闭源属性、用途、链接方式和证据;
|
|
83
|
+
- `android_permissions`:是否依赖 Android 权限、权限名、申请类型、触发条件、用途和证据。
|
|
84
|
+
|
|
85
|
+
依赖或权限标记为 `none` 时必须记录实际负向复核;无法排除传递依赖、动态加载、系统版本差异或插件注入时使用 `uncertain`。
|
|
86
|
+
|
|
87
|
+
### 5. 投影为一至四级功能树
|
|
88
|
+
|
|
89
|
+
完整读取 [hierarchy-rules.md](references/hierarchy-rules.md),按用户路径而不是代码结构定级。关键规则:
|
|
90
|
+
|
|
91
|
+
- 一级是正式入口上下文中的主要可见业务表面或首个流程页面。
|
|
92
|
+
- 点击一级中的入口后出现的页面、菜单、弹窗或操作为二级,依次类推。
|
|
93
|
+
- 打开“更多”“筛选”“设置”之类的真实容器会占一级;纯代码容器不占级。
|
|
94
|
+
- 超过四级时,在保持用户语义的前提下折叠连续的导航壳,并在 `notes` 中记录原始完整路径。
|
|
95
|
+
- 并列 tab、drawer 目标、列表条目和同屏快捷操作按实际入口分别建路径。
|
|
96
|
+
|
|
97
|
+
### 6. 跨仓语义对齐
|
|
98
|
+
|
|
99
|
+
先独立完成每个仓的功能树,再对齐。不要以某一仓的目录或命名强行套另一仓。
|
|
100
|
+
|
|
101
|
+
- 名称不同但触发、目标、前置条件和效果等价:合并为同一路径。
|
|
102
|
+
- 页面相似但只实现 UI/mock、缺少业务效果:标记 `mock` 或 `partial`。
|
|
103
|
+
- 代码存在但入口不可达:标记 `unreachable`,不要写“有”。
|
|
104
|
+
- 仅一仓存在:另一仓在完成负向复核后标记 `absent`;证据不足则 `uncertain`。
|
|
105
|
+
- 产品新增功能可单独保留,不自动视为迁移错误。
|
|
106
|
+
|
|
107
|
+
### 7. 写入规范化清单
|
|
108
|
+
|
|
109
|
+
唯一交付物是 `inventory.json`,不得生成 `feature-inventory.md`、`feature-inventory.csv`、XLSX、分析报告或其他派生清单。完整读取 [inventory-schema.md](references/inventory-schema.md) 后按下列格式写入;详细字段枚举、证据约束和最小示例以该规范为准:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"schema_version": "1.2",
|
|
114
|
+
"title": "应用功能清单",
|
|
115
|
+
"language": "zh-CN",
|
|
116
|
+
"max_depth": 4,
|
|
117
|
+
"repositories": [
|
|
118
|
+
{
|
|
119
|
+
"id": "android",
|
|
120
|
+
"label": "Android",
|
|
121
|
+
"path": "/absolute/repository/path",
|
|
122
|
+
"platform": "android",
|
|
123
|
+
"revision": "git commit or working-tree"
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"features": [
|
|
127
|
+
{
|
|
128
|
+
"entry_context": "returning_user",
|
|
129
|
+
"path": ["一级功能", "二级功能"],
|
|
130
|
+
"kind": "action",
|
|
131
|
+
"trigger": "用户如何触发",
|
|
132
|
+
"effect": "用户看到的结果",
|
|
133
|
+
"conditions": [],
|
|
134
|
+
"should_develop": true,
|
|
135
|
+
"release_stage": "mvp",
|
|
136
|
+
"release_rationale": "版本阶段判定依据",
|
|
137
|
+
"capability_key": "optional.stable_key",
|
|
138
|
+
"notes": "",
|
|
139
|
+
"implementations": {
|
|
140
|
+
"android": {
|
|
141
|
+
"status": "uncertain",
|
|
142
|
+
"confidence": "low",
|
|
143
|
+
"technology_stack": [],
|
|
144
|
+
"technology_evidence": [],
|
|
145
|
+
"external_dependencies": {
|
|
146
|
+
"status": "uncertain",
|
|
147
|
+
"items": [],
|
|
148
|
+
"negative_searches": [],
|
|
149
|
+
"notes": ""
|
|
150
|
+
},
|
|
151
|
+
"android_permissions": {
|
|
152
|
+
"status": "uncertain",
|
|
153
|
+
"items": [],
|
|
154
|
+
"negative_searches": [],
|
|
155
|
+
"notes": ""
|
|
156
|
+
},
|
|
157
|
+
"evidence": [],
|
|
158
|
+
"negative_searches": [],
|
|
159
|
+
"notes": ""
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
"open_questions": [],
|
|
165
|
+
"excluded_candidates": []
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`features[].should_develop` 是必填布尔值:`true` 表示纳入 HarmonyOS 开发范围,`false` 表示明确不开发。它不表示任一源码仓是否已经实现;已有实现仍由 `implementations.<repo_id>.status` 表达。源码中发现且属于正式产品范围的功能默认写 `true`;只有用户明确排除时才能写 `false`,并在 `notes` 记录排除依据。不得根据实现难度、平台差异、依赖缺失或模型判断擅自写 `false`。
|
|
170
|
+
|
|
171
|
+
每条实现状态都必须带置信度和源码证据;`absent` 必须带负向检索说明。
|
|
172
|
+
|
|
173
|
+
运行校验:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
python3 <skill-dir>/scripts/validate_inventory.py \
|
|
177
|
+
/abs/path/to/inventory.json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
先修复所有 error,再逐条复核 warning。高置信“已实现”若缺少可见性与交互/路由两类独立证据,必须降级或补证据。
|
|
181
|
+
|
|
182
|
+
## 最终质量门槛
|
|
183
|
+
|
|
184
|
+
- 所有路径都从明确入口上下文可达,或被标记为 `unreachable/uncertain`。
|
|
185
|
+
- 每个层级名称都是用户语言,不是裸路由名、类名或资源键。
|
|
186
|
+
- `implemented/partial/mock` 至少有交互或路由证据;高置信项同时有可见性证据。
|
|
187
|
+
- 不把测试、文档、注释或未使用字符串当作唯一实现证据。
|
|
188
|
+
- 每个 `absent` 都有负向检索说明;无法排除动态行为时使用 `uncertain`。
|
|
189
|
+
- 比较模式保留各仓独立状态、置信度、证据和备注。
|
|
190
|
+
- 四级之外的折叠、同义词归并和产品差异都有审计说明。
|
|
191
|
+
- 每条功能都有布尔型 `should_develop`;未获用户明确排除的正式功能不得标记为 `false`。
|
|
192
|
+
- 每条功能都有版本阶段和判定理由;缺少产品定位时使用 `uncertain`。
|
|
193
|
+
- 每个已实现/部分实现/mock 的仓实现都有功能级技术栈证据。
|
|
194
|
+
- SDK/SO 依赖明确记录是否存在、开闭源属性与用途;`none` 有负向复核,无法证明开闭源时使用 `unknown`。
|
|
195
|
+
- Android 实现逐功能说明权限依赖;Manifest 声明与运行时申请/受保护 API 调用没有混为一谈。
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
功能清单是独立分析产物,只用 `should_develop` 记录用户明确的开发范围选择。开发轮次、执行进度和验收状态仍由调用方维护;本 Skill 不创建执行计划或运行状态。返回 `inventory.json` 路径、来源、未决项及需要补充的信息即可。
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# 多平台证据路由
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
1. 通用顺序
|
|
6
|
+
2. Android
|
|
7
|
+
3. HarmonyOS
|
|
8
|
+
4. iOS
|
|
9
|
+
5. Flutter
|
|
10
|
+
6. React Native 与 Web
|
|
11
|
+
7. 技术、依赖与权限证据
|
|
12
|
+
8. 负向复核
|
|
13
|
+
|
|
14
|
+
## 1. 通用顺序
|
|
15
|
+
|
|
16
|
+
按“入口 → 路由声明 → 可见控件 → 交互回调 → 目标/效果 → 条件”追踪。优先读取发布源码与资源,再用 UI 测试、用户文档和截图补强。
|
|
17
|
+
|
|
18
|
+
## 2. Android
|
|
19
|
+
|
|
20
|
+
优先证据:
|
|
21
|
+
|
|
22
|
+
- `AndroidManifest.xml` 的 MAIN/LAUNCHER Activity、activity alias、deep link。
|
|
23
|
+
- Navigation XML 的 destination/action/deepLink。
|
|
24
|
+
- Compose `NavHost`、`composable`、`navigation`、`navigate`。
|
|
25
|
+
- `startActivity`、Fragment transaction、NavController 调用。
|
|
26
|
+
- `res/menu`、preferences XML、layout 的可点击控件与 `android:title/text/contentDescription`。
|
|
27
|
+
- `onClick`、`clickable`、`setOnClickListener`、菜单选择分发。
|
|
28
|
+
- `res/values/strings.xml` 用于解析资源键,不能单独证明功能。
|
|
29
|
+
|
|
30
|
+
注意 flavor、manifest merge、`android:enabled/visible`、feature flag、账号态和 legacy/compose 双实现。
|
|
31
|
+
|
|
32
|
+
## 3. HarmonyOS
|
|
33
|
+
|
|
34
|
+
优先证据:
|
|
35
|
+
|
|
36
|
+
- `module.json5` 中 abilities、skills、srcEntry 与 exported。
|
|
37
|
+
- `resources/base/profile/main_pages.json` 与 `windowStage.loadContent`。
|
|
38
|
+
- `Navigation`、`NavDestination`、`NavPathStack.pushPath*`、`router.pushUrl/replaceUrl`。
|
|
39
|
+
- `Tabs`、`TabContent`、`.onClick/.onChange/.onSubmit`。
|
|
40
|
+
- `resources/*/element/string.json` 用于解析 `$r('app.string.*')`。
|
|
41
|
+
- Want、系统 picker、分享、设置页等外部能力调用。
|
|
42
|
+
|
|
43
|
+
注意 ArkTS 移植仓常保留大量未接线的 Activity/Fragment 同名类;只有正式 `@Entry`/Ability 页面和实际组件引用能证明 UI 可达。preview、catalog、mock 页面需单独标记。
|
|
44
|
+
|
|
45
|
+
## 4. iOS
|
|
46
|
+
|
|
47
|
+
优先证据:
|
|
48
|
+
|
|
49
|
+
- `@main` App、`WindowGroup`、App/SceneDelegate、Info.plist scene 与 URL types。
|
|
50
|
+
- SwiftUI `NavigationStack`、`NavigationLink`、`navigationDestination`、`sheet/fullScreenCover`、Button。
|
|
51
|
+
- UIKit storyboard segue、`present`、`pushViewController`、target-action。
|
|
52
|
+
- `Localizable.strings/.xcstrings` 与 accessibility label。
|
|
53
|
+
|
|
54
|
+
注意 Storyboard/XIB 连接、Coordinator、URL scheme 和编译 target membership。
|
|
55
|
+
|
|
56
|
+
## 5. Flutter
|
|
57
|
+
|
|
58
|
+
优先证据:
|
|
59
|
+
|
|
60
|
+
- `MaterialApp/CupertinoApp` 的 home、routes、onGenerateRoute。
|
|
61
|
+
- `Navigator.push*`、GoRouter、AutoRoute、RouterDelegate。
|
|
62
|
+
- `onTap/onPressed/onSelected/onSubmitted`、BottomNavigationBar、TabBar、Drawer。
|
|
63
|
+
- ARB、本地化生成调用与 widget tests。
|
|
64
|
+
|
|
65
|
+
注意生成路由、条件 import、flavor entrypoint 和 dead widget。
|
|
66
|
+
|
|
67
|
+
## 6. React Native 与 Web
|
|
68
|
+
|
|
69
|
+
优先证据:
|
|
70
|
+
|
|
71
|
+
- NavigationContainer 和 stack/tab/drawer route 声明。
|
|
72
|
+
- `navigation.navigate`、router push/replace、Link。
|
|
73
|
+
- Pressable/Touchable/Button 与 `onPress/onClick/onSubmit`。
|
|
74
|
+
- 路由文件系统、菜单配置、国际化资源和 feature flag。
|
|
75
|
+
|
|
76
|
+
注意仅注册未挂载的 screen、Storybook、demo route、开发菜单和服务端下发导航。
|
|
77
|
+
|
|
78
|
+
## 7. 技术、依赖与权限证据
|
|
79
|
+
|
|
80
|
+
Android:
|
|
81
|
+
|
|
82
|
+
- 技术栈:功能页面和效果调用所在的 `.kt/.java/.cpp` 文件、Compose/View/XML、JNI 桥接。
|
|
83
|
+
- SDK:Gradle/version catalog、AAR/JAR、插件声明,以及对应 import/初始化/调用。
|
|
84
|
+
- SO:`jniLibs/**/*.so`、CMake/ndkBuild、JNI 方法、`System.loadLibrary`/`ReLinker`。
|
|
85
|
+
- 权限:Manifest `uses-permission`、Activity Result permission contract、`requestPermissions`、权限检查和受保护 API。
|
|
86
|
+
|
|
87
|
+
iOS:
|
|
88
|
+
|
|
89
|
+
- 技术栈:Swift/Objective-C/Objective-C++ 页面、Coordinator 与桥接头。
|
|
90
|
+
- SDK/二进制:SPM、Podfile/Podfile.lock、framework/XCFramework、link phases、动态加载。
|
|
91
|
+
- 权限/能力:Info.plist usage description、entitlements 与实际 API 调用;不写入 `android_permissions`,使用 `not-applicable`。
|
|
92
|
+
|
|
93
|
+
Flutter / React Native:
|
|
94
|
+
|
|
95
|
+
- 技术栈:Dart 或 JS/TS 页面加原生插件/桥接层;不能只标跨端框架而遗漏功能实际依赖的 Kotlin/Java/Swift/Objective-C/CPP 层。
|
|
96
|
+
- SDK:`pubspec.yaml`、`package.json`、lockfile、plugin registration 与原生包管理配置。
|
|
97
|
+
- 权限:Android 侧继续沿 Manifest、运行时申请和插件原生实现追踪到具体功能。
|
|
98
|
+
|
|
99
|
+
Web/H5:
|
|
100
|
+
|
|
101
|
+
- 技术栈:路由页面、组件和网络/浏览器 API 调用;原生 WebView 容器与 H5 内容分别记录。
|
|
102
|
+
- SDK:包管理清单只能证明项目依赖;需结合 import/调用证明功能使用。
|
|
103
|
+
- Android 权限通常 `not-applicable`;若 H5 在 Android WebView 中通过 JS bridge 调用原生受权限能力,则记录在承载该功能的 Android 实现中。
|
|
104
|
+
|
|
105
|
+
## 8. 负向复核
|
|
106
|
+
|
|
107
|
+
判定 `absent` 前至少完成:
|
|
108
|
+
|
|
109
|
+
1. 用目标语言、英文、同义词、资源键和常见动词检索。
|
|
110
|
+
2. 检索相关路由、页面类、菜单、设置项和回调。
|
|
111
|
+
3. 从正式入口反向确认没有动态注册或条件分支。
|
|
112
|
+
4. 检查生成代码、配置文件、feature flag、依赖模块与深链。
|
|
113
|
+
5. 检查是否以图标/无障碍标签而非文本呈现。
|
|
114
|
+
6. 记录检索项到 `negative_searches`;仍不能排除时标记 `uncertain`。
|
|
115
|
+
|
|
116
|
+
SDK/SO 与权限的 `none` 还需分别完成 [technical-analysis.md](technical-analysis.md) 规定的构建声明、加载/调用链、Manifest 和运行时申请/API 复核。
|
|
117
|
+
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# 功能树层级规则
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
1. 定级基准
|
|
6
|
+
2. 节点类型
|
|
7
|
+
3. 容器与点击深度
|
|
8
|
+
4. 多入口与多状态
|
|
9
|
+
5. 四级折叠
|
|
10
|
+
6. 命名与去重
|
|
11
|
+
7. 常见误判
|
|
12
|
+
|
|
13
|
+
## 1. 定级基准
|
|
14
|
+
|
|
15
|
+
层级表达用户从正式入口看到并继续操作的路径,不表达代码包、技术模块、数据模型或调用栈。
|
|
16
|
+
|
|
17
|
+
- 一级:入口上下文中的主要业务表面、可见区域或首个流程页面,例如“邮件列表”“首页顶部栏”“首次启动欢迎页”。
|
|
18
|
+
- 二级:用户从一级中的控件、条目或动作打开/触发的目标。
|
|
19
|
+
- 三级:从二级继续操作得到的目标。
|
|
20
|
+
- 四级:从三级继续操作得到的目标。
|
|
21
|
+
|
|
22
|
+
路径可以在任意层结束。一个行为若在同屏完成,也仍可作为父表面下的子功能,例如“邮件列表 > 下拉刷新”。
|
|
23
|
+
|
|
24
|
+
## 2. 节点类型
|
|
25
|
+
|
|
26
|
+
使用以下 `kind`:
|
|
27
|
+
|
|
28
|
+
- `screen`:整页或主要页面。
|
|
29
|
+
- `surface`:toolbar、drawer、主列表、详情区等主要业务表面。
|
|
30
|
+
- `tab`:用户可切换的 tab。
|
|
31
|
+
- `menu`:用户必须先打开的菜单、筛选器或操作面板。
|
|
32
|
+
- `dialog`:对话框、sheet、popover。
|
|
33
|
+
- `action`:删除、发送、刷新、收藏、分享等操作。
|
|
34
|
+
- `setting`:可见设置项。
|
|
35
|
+
- `flow-step`:注册、添加账号、支付等向导步骤。
|
|
36
|
+
- `external`:打开浏览器、系统设置、分享面板等外部目标。
|
|
37
|
+
|
|
38
|
+
## 3. 容器与点击深度
|
|
39
|
+
|
|
40
|
+
- 真实可见或可打开的业务容器占一级:`邮件详情 > 更多操作 > 显示标头`。
|
|
41
|
+
- 纯技术容器不占级:Activity、Fragment、Composable、ViewModel、NavHost、Ability。
|
|
42
|
+
- toolbar 上直接可点的“删除”不需要虚构“toolbar 操作”父级。
|
|
43
|
+
- overflow、context menu、drawer、筛选 sheet 若必须先打开,则容器本身占一级。
|
|
44
|
+
- 自动跳转的加载页、路由代理和透明 Activity 默认不占级;若用户能看到并理解为流程步骤,则保留。
|
|
45
|
+
- tab 本身是用户可见入口时作为节点;tab 内默认可见内容通常放在 tab 下一级。
|
|
46
|
+
- 列表中同类数据条目只抽象一次,例如“邮件条目”,不要把每条样例数据列成功能。
|
|
47
|
+
|
|
48
|
+
## 4. 多入口与多状态
|
|
49
|
+
|
|
50
|
+
使用 `entry_context` 区分:
|
|
51
|
+
|
|
52
|
+
- `first_launch`:首次启动/引导。
|
|
53
|
+
- `returning_user`:回访用户正常入口。
|
|
54
|
+
- `signed_out` / `signed_in`:未登录/已登录。
|
|
55
|
+
- `empty_state` / `populated_state`:无数据/有数据。
|
|
56
|
+
- `deep_link`:外部链接入口。
|
|
57
|
+
- 项目特有上下文可用稳定 snake_case 名称。
|
|
58
|
+
|
|
59
|
+
同一功能从不同父入口进入时保留不同路径,例如“列表 > 单项更多 > 删除”和“详情 > 删除”。仅在最终清单明确要求能力去重时,才增加共享 `capability_key`,但不删除入口路径。
|
|
60
|
+
|
|
61
|
+
## 5. 四级折叠
|
|
62
|
+
|
|
63
|
+
真实路径超过四级时:
|
|
64
|
+
|
|
65
|
+
1. 保留用户能说出名称的业务节点。
|
|
66
|
+
2. 优先折叠无独立业务语义的连续导航壳、重复列表容器和纯选择中间页。
|
|
67
|
+
3. 不折叠会改变前置条件、触发方式或操作结果的节点。
|
|
68
|
+
4. 在 `notes` 写入 `完整路径:A > B > C > D > E` 和折叠理由。
|
|
69
|
+
5. 无法无损折叠时,保留前四级并把余下步骤写入 `effect`,同时降低置信度或加入待确认项。
|
|
70
|
+
|
|
71
|
+
## 6. 命名与去重
|
|
72
|
+
|
|
73
|
+
- 优先使用目标语言的运行时可见文案。
|
|
74
|
+
- 图标无文字时使用 content description、accessibility label、测试语义标签或紧邻设计语义;仍不明确时用“图标动作(待确认)”。
|
|
75
|
+
- 资源键、路由常量和类名只帮助定位,不直接作为最终名称。
|
|
76
|
+
- 同一路径下同名但条件或结果不同的动作应区分,例如“删除(移入回收站)”与“永久删除”。
|
|
77
|
+
- 跨仓对齐需同时比较入口、触发、目标、条件和效果,不能只做字符串相似度匹配。
|
|
78
|
+
|
|
79
|
+
## 7. 常见误判
|
|
80
|
+
|
|
81
|
+
- 字符串资源中存在“导出”不等于存在导出入口。
|
|
82
|
+
- Manifest 注册 Activity 不等于用户可达。
|
|
83
|
+
- 页面类存在不等于发布变体包含该页面。
|
|
84
|
+
- preview、catalog、sample 和截图展示不等于正式功能。
|
|
85
|
+
- 单元测试覆盖服务方法不等于 UI 功能已接线。
|
|
86
|
+
- TODO、注释描述和 mock toast 不等于业务效果已实现。
|
|
87
|
+
- 权限、通知渠道、后台服务属于支撑能力;只有存在用户入口或可感知行为时才进入主清单。
|
|
88
|
+
|