@harmonyos-arkts/d2h 0.1.10 → 0.1.12
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/marketplace.json +15 -13
- package/.claude-plugin/plugin.json +13 -7
- package/AGENTS.md +5 -5
- package/README.md +212 -212
- package/agents/android-to-hmos-00-orchestrator.md +318 -318
- package/agents/d2h.md +157 -157
- package/dist/bin/install-opencode.js +30 -30
- package/docs/environment-check.md +86 -86
- package/install-opencode.sh +160 -160
- package/opencode/agents.json +16 -16
- package/opencode/vscode-d2h-package.json +7 -7
- package/opencode/vscode-d2h-plugin.mjs +29 -29
- package/package.json +54 -54
- package/schemas/android-source-manifest.schema.json +25 -25
- package/schemas/checkpoint-provenance.schema.json +67 -67
- package/schemas/final-acceptance.schema.json +29 -29
- package/schemas/managed-evidence-index.schema.json +15 -15
- package/schemas/managed-evidence.schema.json +114 -114
- package/schemas/migration-config.schema.json +51 -51
- package/schemas/migration-report-index.schema.json +39 -39
- package/schemas/migration-report-item.schema.json +51 -51
- package/schemas/migration-report-summary.schema.json +25 -25
- package/schemas/migration-status.schema.json +202 -202
- package/schemas/preflight.schema.json +60 -60
- package/schemas/source-order-audit.schema.json +16 -16
- package/schemas/source-provenance-event.schema.json +19 -19
- package/schemas/spec-app-shard.schema.json +45 -45
- package/schemas/spec-fact-corrections-shard.schema.json +13 -13
- package/schemas/spec-features-shard.schema.json +43 -43
- package/schemas/spec-index.schema.json +26 -26
- package/schemas/spec-interactions-shard.schema.json +40 -40
- package/schemas/spec-page.schema.json +98 -98
- package/schemas/spec-pages-index.schema.json +1 -1
- package/schemas/spec-unresolved-shard.schema.json +1 -1
- package/schemas/task-envelope.schema.json +109 -109
- package/schemas/task-plan.schema.json +341 -341
- package/scripts/check-environment.mjs +320 -320
- package/skills/android2hmos_resources_convert/SKILL.md +180 -180
- package/skills/android2hmos_resources_convert/references/image-conversion-rules.md +230 -230
- package/skills/android2hmos_resources_convert/references/svg-fix-patterns.md +175 -175
- package/skills/android2hmos_resources_convert/references/xml-drawable-to-svg-rules.md +513 -513
- package/skills/arkts-app-identity/SKILL.md +238 -238
- package/skills/arkts-i18n/SKILL.md +496 -496
- package/skills/arkts-i18n/evals/evals.json +84 -84
- package/skills/arkts-i18n/references/code-examples.md +302 -302
- package/skills/arkts-i18n/references/common-pitfalls.md +391 -391
- package/skills/arkts-i18n/references/dynamic-language-switch.md +604 -604
- package/skills/arkts-i18n/references/hardcoded-string-scanner.md +348 -348
- package/skills/arkts-i18n/references/language-codes.md +104 -104
- package/skills/arkts-i18n/references/resource-file-structure.md +775 -775
- package/skills/arkts-i18n/references/static-vs-dynamic.md +242 -242
- package/skills/arkts-i18n/references/v1-compat.md +244 -244
- package/skills/arkts-i18n/scripts/audit_i18n_completeness.sh +174 -174
- package/skills/arkts-icon-sizing/SKILL.md +211 -211
- package/skills/arkts-icon-sizing/scripts/icon_audit.py +131 -131
- package/skills/arkts-icon-sizing/scripts/icon_autofix.py +88 -88
- package/skills/arkts-icon-sizing/scripts/icon_dims.py +179 -179
- package/skills/arkts-icon-sizing/scripts/icon_fix.py +119 -119
- package/skills/arkts-mvvm-architecture/SKILL.md +613 -613
- package/skills/d2h-hypium-forge/SKILL.md +309 -309
- package/skills/d2h-hypium-forge/references/functional-spec-template.md +140 -140
- package/skills/d2h-hypium-forge/references/official-api.md +135 -135
- package/skills/d2h-hypium-forge/references/pitfalls.md +98 -98
- package/skills/d2h-hypium-forge/references/testability-template.md +71 -71
- package/skills/d2h-hypium-forge/scripts/_common_template.py +659 -659
- package/skills/d2h-hypium-forge/scripts/analyze_results.py +165 -165
- package/skills/d2h-hypium-forge/scripts/assert_audit.py +107 -107
- package/skills/d2h-hypium-forge/scripts/collect_runtime_pages.py +169 -169
- package/skills/d2h-hypium-forge/scripts/forge_report.py +325 -325
- package/skills/d2h-hypium-forge/scripts/inject_resource_ids.py +114 -114
- package/skills/d2h-hypium-forge/scripts/lint_asserts.py +80 -80
- package/skills/d2h-hypium-forge/scripts/lint_locate.py +60 -60
- package/skills/d2h-hypium-forge/scripts/merge_appgraph.py +249 -249
- package/skills/d2h-hypium-forge/scripts/precondition.py +140 -140
- package/skills/d2h-hypium-forge/scripts/preinject_ids.py +232 -232
- package/skills/d2h-hypium-forge/scripts/probe.py +197 -197
- package/skills/d2h-hypium-forge/scripts/run_direct.py +823 -823
- package/skills/d2h-hypium-forge/scripts/run_parallel.py +121 -121
- package/skills/d2h-hypium-forge/scripts/scan_features.py +255 -255
- package/skills/d2h-hypium-forge/scripts/upgrade_asserts.py +66 -66
- package/skills/d2h-hypium-forge/scripts/validate_scenarios.py +84 -84
- package/skills/d2h-page-develop/SKILL.md +112 -112
- package/skills/d2h-page-develop/agents/openai.yaml +7 -7
- package/skills/d2h-page-spec-generate/SKILL.md +206 -206
- package/skills/d2h-page-spec-generate/scripts/build_batch_report.py +227 -227
- package/skills/d2h-utg-ai-generate/SKILL.md +128 -128
- package/skills/d2h-utg-ai-generate/references/click-paths-schema.json +76 -76
- package/skills/d2h-utg-ai-generate/references/extraction-guide.md +34 -34
- package/skills/d2h-utg-ai-generate/references/facts-contract.md +96 -96
- package/skills/d2h-utg-ai-generate/references/page-schema.json +61 -61
- package/skills/d2h-utg-ai-generate/references/utg-schema.json +89 -89
- package/skills/d2h-utg-ai-generate/scripts/build_page_json.py +314 -314
- package/skills/d2h-utg-ai-generate/scripts/build_utg.py +123 -123
- package/skills/d2h-utg-ai-generate/scripts/capture_from_page_json.ts +280 -280
- package/skills/d2h-utg-ai-generate/scripts/utg_common.py +524 -524
- package/skills/d2h-utg-ai-generate/scripts/utg_html.py +489 -489
- package/skills/d2h-utg-ai-generate/scripts/validate_utg.py +69 -69
- package/skills/d2h-utg-ai-generate/scripts/vendor/D3-LICENSE +13 -13
- package/skills/d2h-utg-ai-generate/scripts/vendor/d3-7.9.0.min.js +2 -2
- package/skills/d2h-utg-ai-generate/tests/test_pipeline.py +369 -369
- package/skills/d2h-utg-static-generate/SKILL.md +73 -73
- package/skills/d2h-utg-static-generate/references/discoveries.md +38 -38
- package/skills/d2h-utg-static-generate/scripts/generate.py +499 -499
- package/skills/d2h-utg-static-generate/tests/test_static.py +335 -335
- package/skills/d2h-utg-static-generate/tests/verify-offline-html.py +60 -60
- package/skills/d2h-utg-static-generate/tests/verify-produced-fixture.py +131 -131
- package/skills/harmonyos-migration-playbook/SKILL.md +83 -83
- package/skills/harmonyos-migration-playbook/agents/openai.yaml +7 -7
- package/skills/harmonyos-migration-playbook/references/arkts-compile.md +24 -24
- package/skills/harmonyos-migration-playbook/references/harmony-runtime.md +53 -53
- package/skills/harmonyos-migration-playbook/references/lesson-lifecycle.md +45 -45
- package/skills/harmonyos-migration-playbook/references/protocol-e2e.md +23 -23
- package/skills/harmonyos-migration-playbook/references/ui-automation.md +53 -53
- package/skills/harmonyos-migration-playbook/references/windows-environment.md +38 -38
- package/skills/maintaining-migration-report/SKILL.md +144 -144
- package/skills/maintaining-migration-report/references/final-acceptance.md +48 -48
- package/skills/maintaining-migration-report/references/source-provenance.md +66 -66
- package/skills/managing-d2h-toolchain/SKILL.md +24 -24
- package/skills/managing-d2h-toolchain/environment-requirements.json +16 -16
- package/skills/managing-d2h-toolchain/scripts/manage-toolchain.mjs +98 -98
- package/skills/managing-d2h-toolchain/toolchain.json +16 -16
- package/skills/native-library-substitution/SKILL.md +384 -384
- package/skills/native-library-substitution/references/native-library-substitution.json +56905 -56905
- package/skills/native-library-substitution/references/native-library-substitution.md +163 -163
- package/skills/preparing-migration-workspace/SKILL.md +131 -131
- package/skills/reviewing-migration-process/SKILL.md +62 -62
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
from __future__ import annotations
|
|
3
|
-
|
|
4
|
-
import argparse
|
|
5
|
-
import subprocess
|
|
6
|
-
import sys
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
|
|
9
|
-
from utg_common import (
|
|
10
|
-
UtgError,
|
|
11
|
-
atomic_write_json,
|
|
12
|
-
build_click_paths,
|
|
13
|
-
load_json,
|
|
14
|
-
normalize_facts,
|
|
15
|
-
summary,
|
|
16
|
-
validate_pair,
|
|
17
|
-
)
|
|
18
|
-
from build_page_json import build_page_plan, validate_page_plan
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def parse_args() -> argparse.Namespace:
|
|
22
|
-
parser = argparse.ArgumentParser(
|
|
23
|
-
description="Build normalized utg.json and deterministic click_paths.json from AI source facts."
|
|
24
|
-
)
|
|
25
|
-
parser.add_argument("--facts", required=True, type=Path)
|
|
26
|
-
parser.add_argument("--project-root", required=True, type=Path)
|
|
27
|
-
parser.add_argument("--workspace", required=True, type=Path)
|
|
28
|
-
parser.add_argument("--force", action="store_true", help="replace existing generated outputs")
|
|
29
|
-
return parser.parse_args()
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def main() -> int:
|
|
33
|
-
args = parse_args()
|
|
34
|
-
workspace = args.workspace.resolve()
|
|
35
|
-
project_root = args.project_root.resolve()
|
|
36
|
-
if not project_root.is_dir():
|
|
37
|
-
print(f"ERROR: project root is not a directory: {project_root}", file=sys.stderr)
|
|
38
|
-
return 2
|
|
39
|
-
outputs = [
|
|
40
|
-
workspace / "utg.json",
|
|
41
|
-
workspace / "click_paths.json",
|
|
42
|
-
workspace / "page.json",
|
|
43
|
-
]
|
|
44
|
-
existing = [path for path in outputs if path.exists()]
|
|
45
|
-
if existing and not args.force:
|
|
46
|
-
print(
|
|
47
|
-
"ERROR: generated output already exists; use --force only for an authorized regeneration: "
|
|
48
|
-
+ ", ".join(str(path) for path in existing),
|
|
49
|
-
file=sys.stderr,
|
|
50
|
-
)
|
|
51
|
-
return 2
|
|
52
|
-
try:
|
|
53
|
-
facts = load_json(args.facts.resolve())
|
|
54
|
-
utg, normalizations, unresolved = normalize_facts(facts, project_root)
|
|
55
|
-
click_paths = build_click_paths(utg)
|
|
56
|
-
errors = validate_pair(utg, click_paths, project_root)
|
|
57
|
-
if errors:
|
|
58
|
-
raise UtgError("generated pair failed validation:\n- " + "\n- ".join(errors))
|
|
59
|
-
page_plan = build_page_plan(
|
|
60
|
-
utg,
|
|
61
|
-
click_paths,
|
|
62
|
-
utg_path=str(outputs[0]),
|
|
63
|
-
click_paths_path=str(outputs[1]),
|
|
64
|
-
)
|
|
65
|
-
page_errors = validate_page_plan(
|
|
66
|
-
page_plan,
|
|
67
|
-
utg,
|
|
68
|
-
click_paths,
|
|
69
|
-
utg_path=str(outputs[0]),
|
|
70
|
-
click_paths_path=str(outputs[1]),
|
|
71
|
-
)
|
|
72
|
-
if page_errors:
|
|
73
|
-
raise UtgError("generated page plan failed validation:\n- " + "\n- ".join(page_errors))
|
|
74
|
-
report = {
|
|
75
|
-
"schema_version": "d2h-utg-ai-generation-report/v1",
|
|
76
|
-
"status": "valid",
|
|
77
|
-
"method": facts.get('graph', {}).get('method', 'ai-source-analysis'),
|
|
78
|
-
"facts": str(args.facts.resolve()),
|
|
79
|
-
"project_root": str(project_root),
|
|
80
|
-
"summary": summary(utg, click_paths),
|
|
81
|
-
"page_plan": page_plan["summary"],
|
|
82
|
-
"normalizations": normalizations,
|
|
83
|
-
"unresolved": unresolved,
|
|
84
|
-
}
|
|
85
|
-
if 'projection_summary' in facts.get('graph', {}):
|
|
86
|
-
report['projection'] = facts['graph']['projection_summary']
|
|
87
|
-
atomic_write_json(outputs[0], utg)
|
|
88
|
-
atomic_write_json(outputs[1], click_paths)
|
|
89
|
-
atomic_write_json(outputs[2], page_plan)
|
|
90
|
-
atomic_write_json(workspace / "generation-report.json", report)
|
|
91
|
-
# Interactive visualization — same renderer android-utg-static ships
|
|
92
|
-
# (extended for reconciliation semantics), so the output is comparable.
|
|
93
|
-
# It reads <workspace>/utg.json and writes <workspace>/utg.html. Best
|
|
94
|
-
# effort: a visualization failure must not fail the build.
|
|
95
|
-
html_script = Path(__file__).resolve().parent / "utg_html.py"
|
|
96
|
-
if html_script.exists():
|
|
97
|
-
result = subprocess.run(
|
|
98
|
-
[sys.executable, str(html_script), str(workspace)],
|
|
99
|
-
capture_output=True,
|
|
100
|
-
text=True,
|
|
101
|
-
)
|
|
102
|
-
if result.returncode != 0:
|
|
103
|
-
print(
|
|
104
|
-
f"WARN: utg.html generation failed: {result.stderr.strip()}",
|
|
105
|
-
file=sys.stderr,
|
|
106
|
-
)
|
|
107
|
-
except UtgError as exc:
|
|
108
|
-
print(f"ERROR: {exc}", file=sys.stderr)
|
|
109
|
-
return 2
|
|
110
|
-
|
|
111
|
-
counts = report["summary"]
|
|
112
|
-
print(
|
|
113
|
-
f"valid: nodes={counts['nodes']} edges={counts['edges']} "
|
|
114
|
-
f"reachable={counts['reachable']} unreachable={counts['unreachable']}"
|
|
115
|
-
)
|
|
116
|
-
print(outputs[0])
|
|
117
|
-
print(outputs[1])
|
|
118
|
-
print(outputs[2])
|
|
119
|
-
return 0
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if __name__ == "__main__":
|
|
123
|
-
raise SystemExit(main())
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import subprocess
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from utg_common import (
|
|
10
|
+
UtgError,
|
|
11
|
+
atomic_write_json,
|
|
12
|
+
build_click_paths,
|
|
13
|
+
load_json,
|
|
14
|
+
normalize_facts,
|
|
15
|
+
summary,
|
|
16
|
+
validate_pair,
|
|
17
|
+
)
|
|
18
|
+
from build_page_json import build_page_plan, validate_page_plan
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def parse_args() -> argparse.Namespace:
|
|
22
|
+
parser = argparse.ArgumentParser(
|
|
23
|
+
description="Build normalized utg.json and deterministic click_paths.json from AI source facts."
|
|
24
|
+
)
|
|
25
|
+
parser.add_argument("--facts", required=True, type=Path)
|
|
26
|
+
parser.add_argument("--project-root", required=True, type=Path)
|
|
27
|
+
parser.add_argument("--workspace", required=True, type=Path)
|
|
28
|
+
parser.add_argument("--force", action="store_true", help="replace existing generated outputs")
|
|
29
|
+
return parser.parse_args()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def main() -> int:
|
|
33
|
+
args = parse_args()
|
|
34
|
+
workspace = args.workspace.resolve()
|
|
35
|
+
project_root = args.project_root.resolve()
|
|
36
|
+
if not project_root.is_dir():
|
|
37
|
+
print(f"ERROR: project root is not a directory: {project_root}", file=sys.stderr)
|
|
38
|
+
return 2
|
|
39
|
+
outputs = [
|
|
40
|
+
workspace / "utg.json",
|
|
41
|
+
workspace / "click_paths.json",
|
|
42
|
+
workspace / "page.json",
|
|
43
|
+
]
|
|
44
|
+
existing = [path for path in outputs if path.exists()]
|
|
45
|
+
if existing and not args.force:
|
|
46
|
+
print(
|
|
47
|
+
"ERROR: generated output already exists; use --force only for an authorized regeneration: "
|
|
48
|
+
+ ", ".join(str(path) for path in existing),
|
|
49
|
+
file=sys.stderr,
|
|
50
|
+
)
|
|
51
|
+
return 2
|
|
52
|
+
try:
|
|
53
|
+
facts = load_json(args.facts.resolve())
|
|
54
|
+
utg, normalizations, unresolved = normalize_facts(facts, project_root)
|
|
55
|
+
click_paths = build_click_paths(utg)
|
|
56
|
+
errors = validate_pair(utg, click_paths, project_root)
|
|
57
|
+
if errors:
|
|
58
|
+
raise UtgError("generated pair failed validation:\n- " + "\n- ".join(errors))
|
|
59
|
+
page_plan = build_page_plan(
|
|
60
|
+
utg,
|
|
61
|
+
click_paths,
|
|
62
|
+
utg_path=str(outputs[0]),
|
|
63
|
+
click_paths_path=str(outputs[1]),
|
|
64
|
+
)
|
|
65
|
+
page_errors = validate_page_plan(
|
|
66
|
+
page_plan,
|
|
67
|
+
utg,
|
|
68
|
+
click_paths,
|
|
69
|
+
utg_path=str(outputs[0]),
|
|
70
|
+
click_paths_path=str(outputs[1]),
|
|
71
|
+
)
|
|
72
|
+
if page_errors:
|
|
73
|
+
raise UtgError("generated page plan failed validation:\n- " + "\n- ".join(page_errors))
|
|
74
|
+
report = {
|
|
75
|
+
"schema_version": "d2h-utg-ai-generation-report/v1",
|
|
76
|
+
"status": "valid",
|
|
77
|
+
"method": facts.get('graph', {}).get('method', 'ai-source-analysis'),
|
|
78
|
+
"facts": str(args.facts.resolve()),
|
|
79
|
+
"project_root": str(project_root),
|
|
80
|
+
"summary": summary(utg, click_paths),
|
|
81
|
+
"page_plan": page_plan["summary"],
|
|
82
|
+
"normalizations": normalizations,
|
|
83
|
+
"unresolved": unresolved,
|
|
84
|
+
}
|
|
85
|
+
if 'projection_summary' in facts.get('graph', {}):
|
|
86
|
+
report['projection'] = facts['graph']['projection_summary']
|
|
87
|
+
atomic_write_json(outputs[0], utg)
|
|
88
|
+
atomic_write_json(outputs[1], click_paths)
|
|
89
|
+
atomic_write_json(outputs[2], page_plan)
|
|
90
|
+
atomic_write_json(workspace / "generation-report.json", report)
|
|
91
|
+
# Interactive visualization — same renderer android-utg-static ships
|
|
92
|
+
# (extended for reconciliation semantics), so the output is comparable.
|
|
93
|
+
# It reads <workspace>/utg.json and writes <workspace>/utg.html. Best
|
|
94
|
+
# effort: a visualization failure must not fail the build.
|
|
95
|
+
html_script = Path(__file__).resolve().parent / "utg_html.py"
|
|
96
|
+
if html_script.exists():
|
|
97
|
+
result = subprocess.run(
|
|
98
|
+
[sys.executable, str(html_script), str(workspace)],
|
|
99
|
+
capture_output=True,
|
|
100
|
+
text=True,
|
|
101
|
+
)
|
|
102
|
+
if result.returncode != 0:
|
|
103
|
+
print(
|
|
104
|
+
f"WARN: utg.html generation failed: {result.stderr.strip()}",
|
|
105
|
+
file=sys.stderr,
|
|
106
|
+
)
|
|
107
|
+
except UtgError as exc:
|
|
108
|
+
print(f"ERROR: {exc}", file=sys.stderr)
|
|
109
|
+
return 2
|
|
110
|
+
|
|
111
|
+
counts = report["summary"]
|
|
112
|
+
print(
|
|
113
|
+
f"valid: nodes={counts['nodes']} edges={counts['edges']} "
|
|
114
|
+
f"reachable={counts['reachable']} unreachable={counts['unreachable']}"
|
|
115
|
+
)
|
|
116
|
+
print(outputs[0])
|
|
117
|
+
print(outputs[1])
|
|
118
|
+
print(outputs[2])
|
|
119
|
+
return 0
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
if __name__ == "__main__":
|
|
123
|
+
raise SystemExit(main())
|