@hmos-library-adapter/fast 0.0.17-beta.0 → 0.0.17-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/node_modules/@hmos-library-adapter/executer/README.md +2 -2
  2. package/node_modules/@hmos-library-adapter/executer/shared/skill-map.json +5 -1
  3. package/node_modules/@hmos-library-adapter/executer/shared/skills/arkts-rules/SKILL.md +400 -0
  4. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/CHANGELOG.md +1391 -0
  5. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/COMPATIBILITY.md +53 -0
  6. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/README.md +123 -0
  7. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/SKILL.md +48 -0
  8. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/agents/upgrade-assess-change.md +37 -0
  9. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/agents/upgrade-fix-file.md +23 -0
  10. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/package.json +19 -0
  11. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/beta1-changes-for-all-apps.md +1793 -0
  12. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/beta1-ux-style-and-effect-changes.md +288 -0
  13. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/beta2-changes-for-all-apps.md +148 -0
  14. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/26.0.0/release-changes-for-all-apps.md +662 -0
  15. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/beta3-os-api-behavior-changes.md +652 -0
  16. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/beta3-ux-style-and-effect-changes.md +222 -0
  17. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/release-os-api-behavior-changes.md +444 -0
  18. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.1(13)/release-ux-style-and-effect-changes.md +221 -0
  19. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.2(14)/os-api-behavior-changes.md +1767 -0
  20. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.2(14)/ux-style-and-effect-changes.md +134 -0
  21. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta1-os-api-behavior-changes.md +430 -0
  22. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta1-ux-style-and-effect-changes.md +49 -0
  23. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta2-os-api-behavior-changes.md +240 -0
  24. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/beta2-ux-style-and-effect-changes.md +90 -0
  25. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.0.3(15)/release-os-api-behavior-changes.md +69 -0
  26. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.1.0(18)/os-api-behavior-changes.md +1294 -0
  27. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/5.1.0(18)/ux-style-and-effect-changes.md +147 -0
  28. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta1-os-api-behavior-changes.md +1019 -0
  29. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta1-ux-style-and-effect-changes.md +153 -0
  30. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta2-os-api-behavior-changes.md +662 -0
  31. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta2-ux-style-and-effect-changes.md +78 -0
  32. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta3-os-api-behavior-changes.md +167 -0
  33. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.0.0(20)/beta5-os-api-behavior-changes.md +52 -0
  34. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs/6.1.0(23)/changes-for-all-apps.md +397 -0
  35. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/changelogs-index.json +883 -0
  36. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/arkts-coding-standards.md +53 -0
  37. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/compatibility.md +207 -0
  38. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/native-adaptation.md +21 -0
  39. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/runtime-functional-tests.md +62 -0
  40. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/sdk-versions.md +77 -0
  41. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/troubleshooting.md +54 -0
  42. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/verification.md +79 -0
  43. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/common/workflow-scan.md +41 -0
  44. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/deprecated/context-migration.md +274 -0
  45. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/deprecated/deprecated-api-adaptation.md +157 -0
  46. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/deprecated/deprecated-api-examples.md +219 -0
  47. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/toolchain/hvigor.md +50 -0
  48. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/har-upgrade.md +60 -0
  49. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/scanner-missed-cases.md +171 -0
  50. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/upgrade-compatibility.md +112 -0
  51. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/upgrade-examples.md +289 -0
  52. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/references/upgrade/upgrade-workflow.md +122 -0
  53. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/references/generate-behavior-policy.mjs +96 -0
  54. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/references/references.mjs +9 -0
  55. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/regression/compare-deprecated.mjs +57 -0
  56. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/regression/compare-golden.mjs +130 -0
  57. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/regression/regress-deprecated.mjs +120 -0
  58. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/behavior-catalog-generation.test.mjs +59 -0
  59. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/behavior-local-sources.test.mjs +44 -0
  60. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/changelog-index.test.mjs +66 -0
  61. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/compare-golden.test.mjs +103 -0
  62. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/fixtures/behavior/local-sources.csv +5 -0
  63. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/references.test.mjs +16 -0
  64. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/skill-content.test.mjs +139 -0
  65. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/skill-frontmatter.test.mjs +11 -0
  66. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/test/test-suite.test.mjs +65 -0
  67. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/validation/skill-content.mjs +125 -0
  68. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/validation/skill-frontmatter.mjs +6 -0
  69. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/maintenance/validation/validate-skill.mjs +57 -0
  70. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/CHANGELOG.md +506 -0
  71. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/GOLDEN_VALIDATION.md +42 -0
  72. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/README.md +137 -0
  73. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/behavior/behavior-policy.mjs +117 -0
  74. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/behavior/upgrade-coverage.mjs +29 -0
  75. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/bin/deveco-worker-compat.cjs +21 -0
  76. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/bin/harmony-api-scan.mjs +17 -0
  77. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/cli.mjs +416 -0
  78. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/deveco.mjs +348 -0
  79. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/project.mjs +81 -0
  80. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/rules.mjs +425 -0
  81. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/runtime-identity.mjs +23 -0
  82. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/scan-runner.mjs +521 -0
  83. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/core/sdk-deprecations.mjs +204 -0
  84. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/data/behavior-change-policy.json +4378 -0
  85. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/deprecated/arkts-deprecations.mjs +363 -0
  86. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/deprecated/build-log.mjs +72 -0
  87. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/native/native.mjs +95 -0
  88. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/package.json +16 -0
  89. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/batch-layout.test.mjs +94 -0
  90. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/behavior-policy.test.mjs +75 -0
  91. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/build-log.test.mjs +69 -0
  92. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/cli.test.mjs +102 -0
  93. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/csv.test.mjs +35 -0
  94. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/deprecations.test.mjs +283 -0
  95. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/deveco.test.mjs +262 -0
  96. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/helpers/scan-batch.mjs +10 -0
  97. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/native.test.mjs +108 -0
  98. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/project.test.mjs +42 -0
  99. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/rules.test.mjs +190 -0
  100. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/runtime-identity.test.mjs +53 -0
  101. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/scan-mode.test.mjs +38 -0
  102. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/scan-runner.test.mjs +481 -0
  103. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/scan-scope.test.mjs +110 -0
  104. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/source-inputs.test.mjs +64 -0
  105. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/scanner/test/upgrade.test.mjs +164 -0
  106. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/args.mjs +66 -0
  107. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/csv.mjs +85 -0
  108. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/json5.mjs +92 -0
  109. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/upgrade-results.mjs +45 -0
  110. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/format/zip.mjs +87 -0
  111. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/io/fs-utils.mjs +60 -0
  112. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/artifact-layout.mjs +74 -0
  113. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/changelog-index.mjs +29 -0
  114. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/deveco-version.mjs +40 -0
  115. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/document-links.mjs +30 -0
  116. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/errors.mjs +41 -0
  117. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/fs.mjs +72 -0
  118. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/paths.mjs +34 -0
  119. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/process.mjs +154 -0
  120. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-mode.mjs +7 -0
  121. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-statistics.mjs +7 -0
  122. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-version-catalog.json +43 -0
  123. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/scan-versions.mjs +51 -0
  124. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/sdk-layout.mjs +27 -0
  125. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/source-scope.mjs +108 -0
  126. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/source-types.mjs +7 -0
  127. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/platform/version.mjs +76 -0
  128. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/deveco-version.test.mjs +50 -0
  129. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/document-links.test.mjs +13 -0
  130. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/errors.test.mjs +40 -0
  131. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/fs-utils.test.mjs +31 -0
  132. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/platform-paths.test.mjs +19 -0
  133. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/process-utils.test.mjs +68 -0
  134. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/scan-versions.test.mjs +26 -0
  135. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/sdk-version.test.mjs +17 -0
  136. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/shared/test/upgrade-results.test.mjs +140 -0
  137. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/scripts/test-suite.mjs +29 -0
  138. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/deprecated-report.md +86 -0
  139. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/progress.md +150 -0
  140. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/results.md +110 -0
  141. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/upgrade-report.md +105 -0
  142. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/upgrade-spec.md +58 -0
  143. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-api-upgrade-adapter/templates/upgrade-test-report.md +47 -0
  144. package/node_modules/@hmos-library-adapter/executer/shared/skills/harmonyos-knowledge/SKILL.md +70 -0
  145. package/node_modules/@hmos-library-adapter/executer/src/config.js +3 -4
  146. package/node_modules/@hmos-library-adapter/executer/src/doctor.js +1 -1
  147. package/node_modules/@hmos-library-adapter/executer/src/install.js +1 -1
  148. package/node_modules/@hmos-library-adapter/executer/src/paths.js +4 -4
  149. package/package.json +1 -1
@@ -0,0 +1,262 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, mkdir, writeFile, readFile, readdir, rm } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { deflateRawSync } from 'node:zlib';
7
+ import { discoverDevEco, validateTargetCoverage } from '../core/deveco.mjs';
8
+ import { execute } from '../core/cli.mjs';
9
+ import { buildSdkCatalog } from '../core/sdk-deprecations.mjs';
10
+ import { loadDevEcoRules } from '../core/rules.mjs';
11
+ import { assertUpgradeRange, parseVersion } from '../../shared/platform/version.mjs';
12
+
13
+ function zip(entries) {
14
+ const locals = [];
15
+ const centrals = [];
16
+ let offset = 0;
17
+ for (const [name, value] of entries) {
18
+ const fileName = Buffer.from(name);
19
+ const content = Buffer.from(value);
20
+ const compressed = deflateRawSync(content);
21
+ const local = Buffer.alloc(30);
22
+ local.writeUInt32LE(0x04034b50, 0); local.writeUInt16LE(20, 4); local.writeUInt16LE(8, 8);
23
+ local.writeUInt32LE(compressed.length, 18); local.writeUInt32LE(content.length, 22);
24
+ local.writeUInt16LE(fileName.length, 26);
25
+ locals.push(local, fileName, compressed);
26
+ const central = Buffer.alloc(46);
27
+ central.writeUInt32LE(0x02014b50, 0); central.writeUInt16LE(20, 4); central.writeUInt16LE(20, 6);
28
+ central.writeUInt16LE(8, 10); central.writeUInt32LE(compressed.length, 20);
29
+ central.writeUInt32LE(content.length, 24); central.writeUInt16LE(fileName.length, 28);
30
+ central.writeUInt32LE(offset, 42);
31
+ centrals.push(central, fileName);
32
+ offset += local.length + fileName.length + compressed.length;
33
+ }
34
+ const centralDirectory = Buffer.concat(centrals);
35
+ const end = Buffer.alloc(22);
36
+ end.writeUInt32LE(0x06054b50, 0); end.writeUInt16LE(entries.length, 8); end.writeUInt16LE(entries.length, 10);
37
+ end.writeUInt32LE(centralDirectory.length, 12); end.writeUInt32LE(offset, 16);
38
+ return Buffer.concat([...locals, centralDirectory, end]);
39
+ }
40
+
41
+ async function fixture({ scannerName = 'api-change-scan.js', scannerSource = '--startVersion --endVersion --modulePaths --sdkPath --apiModifiedPath --outputPath', resourceMode = 'directory', ideVersion = '26.0.0.821',
42
+ sdkData = { platformVersion: '26.0.0', apiVersion: '26', releaseType: 'Release' } } = {}) {
43
+ const root = await mkdtemp(path.join(os.tmpdir(), 'scanner-windows-home-'));
44
+ const home = path.join(root, 'DevEco Studio');
45
+ const sdk = path.join(root, 'Harmony SDK');
46
+ const files = [
47
+ [path.join(sdk, 'default/sdk-pkg.json'), JSON.stringify({ data: sdkData })],
48
+ [path.join(home, 'product-info.json'), JSON.stringify({ name: 'DevEco Studio', version: ideVersion })],
49
+ [path.join(sdk, 'default/openharmony/ets/build-tools/ets-loader/node_modules/typescript/lib/typescript.js'), 'parser'],
50
+ [path.join(sdk, 'default/hms/ets/api/@hms.test.d.ts'), 'export {};'],
51
+ [path.join(home, `plugins/harmony/arkanalyzer-apiscan/${scannerName}`), scannerSource],
52
+ [path.join(home, 'jbr/bin/java.exe'), 'java'],
53
+ [path.join(home, 'tools/hvigor/bin/hvigorw.bat'), 'hvigor'],
54
+ [path.join(home, 'tools/ohpm/bin/ohpm.cmd'), 'ohpm'],
55
+ ];
56
+ for (const [file, content] of files) {
57
+ await mkdir(path.dirname(file), { recursive: true });
58
+ await writeFile(file, content);
59
+ }
60
+ if (['directory', 'mixed', 'modern-directory'].includes(resourceMode)) {
61
+ const resource = path.join(home,
62
+ `plugins/harmony/arkanalyzer-apiscan/resources/apiChange/${resourceMode === 'directory'
63
+ ? 'HarmonyOS_26.0.0(26)_Release.json' : 'HarmonyOS_26.0.0_Release.json'}`);
64
+ await mkdir(path.dirname(resource), { recursive: true });
65
+ await writeFile(resource, '[]');
66
+ }
67
+ if (resourceMode === 'jar' || resourceMode === 'mixed') {
68
+ const archive = path.join(home, 'plugins/harmony/lib/project-api-change-assistant-26.0.0.361.jar');
69
+ await mkdir(path.dirname(archive), { recursive: true });
70
+ await writeFile(archive, zip([
71
+ ['apiChange/HarmonyOS_26.0.0(26)_Beta1.json', '[]'],
72
+ ['apiChange/HarmonyOS_26.0.0(26)_Release.json', resourceMode === 'mixed' ? 'invalid duplicate' : '[]'],
73
+ ]));
74
+ }
75
+ return { root, home, sdk };
76
+ }
77
+
78
+ test('discovers the Windows analyzer when the SDK and DevEco home are separate', async () => {
79
+ const { home, sdk } = await fixture();
80
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
81
+ assert.equal(result.contentsRoot, path.resolve(home));
82
+ assert.equal(result.ohpm,path.join(home,'tools/ohpm/bin/ohpm.cmd'));
83
+ assert.equal(result.sdkRoot, path.resolve(sdk));
84
+ assert.equal(result.java, path.join(home, 'jbr/bin/java.exe'));
85
+ assert.equal(result.hvigorw, path.join(home, 'tools/hvigor/bin/hvigorw.bat'));
86
+ assert.equal(result.apiChangeBackend, 'integrated');
87
+ assert.equal(result.projectApiChangeJar, null);
88
+ });
89
+
90
+ test('detects a renamed integrated scanner by its CLI contract', async () => {
91
+ const { home, sdk } = await fixture({ scannerName: 'windows-api-compatibility.js' });
92
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
93
+ assert.equal(result.apiChangeBackend, 'integrated');
94
+ assert.equal(result.apiChangeScan, path.join(home, 'plugins/harmony/arkanalyzer-apiscan/windows-api-compatibility.js'));
95
+ });
96
+
97
+ test('detects the index backend without treating it as the integrated CLI', async () => {
98
+ const { home, sdk } = await fixture({
99
+ scannerName: 'index.js',
100
+ scannerSource: '--startVersion --endVersion --modulePaths --sdkPath --outputPath '
101
+ + '--configPath --scanFilePaths --apiModifiedPath --outPath --tmpPath '
102
+ + '__webpack_require__.s = "./src/collector/api/MainSrc.ts"',
103
+ });
104
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
105
+ assert.equal(result.apiChangeBackend, 'index');
106
+ assert.equal(result.apiChangeScan, path.join(home, 'plugins/harmony/arkanalyzer-apiscan/index.js'));
107
+ assert.equal(result.cApiScanJar, null);
108
+ });
109
+
110
+ test('index family markers do not imply scanFilePaths support; help overrides incidental source strings',async()=>{
111
+ const scannerSource=`// __webpack_require__.s = "./src/collector/api/MainSrc.ts"
112
+ if(process.argv.includes('--help'))console.log('Usage: index --configPath --apiModifiedPath --outPath --tmpPath');
113
+ else if(process.argv.includes('--scanFilePaths'))throw new Error('unknown option');`;
114
+ const {sdk,home}=await fixture({scannerSource});
115
+ const result=await discoverDevEco(sdk,home,{platform:'win32',env:{}});
116
+ assert.equal(result.apiChangeBackend,'index');assert.equal(result.fileScanSupported,false);
117
+ assert.equal(result.moduleScanSupported,true);
118
+ });
119
+
120
+ test('reports unsupported layouts with inspected scanner candidates', async () => {
121
+ const { home, sdk } = await fixture({ scannerName: 'windows-scan.js', scannerSource: '--unknown-option' });
122
+ await assert.rejects(discoverDevEco(sdk, home, { platform: 'win32', env: {} }), error => {
123
+ assert.equal(error.code, 'UNSUPPORTED_DEVECO_SCANNER_LAYOUT');
124
+ assert.ok(error.details.scannerCandidates.some(candidate => candidate.file.endsWith('windows-scan.js')));
125
+ assert.equal(error.details.scannerCandidates.at(-1).contract, 'unknown');
126
+ return true;
127
+ });
128
+ });
129
+
130
+ test('probes help output when a bundle contains both CLI marker sets', async () => {
131
+ const markers = [
132
+ '--startVersion', '--endVersion', '--modulePaths', '--sdkPath', '--apiModifiedPath', '--outputPath',
133
+ '--configPath', '--scanFilePaths', '--outPath', '--tmpPath',
134
+ ].join(' ');
135
+ const { home, sdk } = await fixture({
136
+ scannerName: 'windows-bundle.js',
137
+ scannerSource: `// ${markers}\nif (process.argv.includes('--help')) console.log('--configPath --scanFilePaths --apiModifiedPath --outPath --tmpPath');\n`,
138
+ });
139
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
140
+ assert.equal(result.apiChangeBackend, 'index');
141
+ });
142
+
143
+ test('uses API change rules packaged only inside the project assistant JAR', async () => {
144
+ const { root, home, sdk } = await fixture({
145
+ scannerName: 'index.js',
146
+ scannerSource: '__webpack_require__.s = "./src/collector/api/MainSrc.ts"',
147
+ resourceMode: 'jar',
148
+ });
149
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
150
+ assert.equal(result.apiChangeResourceRoot, null);
151
+ assert.match(result.apiChangeResourceArchive, /project-api-change-assistant-26\.0\.0\.361\.jar$/);
152
+ const referenceRoot = path.join(root, 'references');
153
+ await mkdir(referenceRoot);
154
+ const rules = await loadDevEcoRules(result, referenceRoot,
155
+ assertUpgradeRange('5.0.0(12)', '26.0.0(26) Beta1'), 'upgrade');
156
+ assert.deepEqual(rules.errors, []);
157
+ });
158
+
159
+ test('fills missing directory rule versions from the project assistant JAR', async () => {
160
+ const { root, home, sdk } = await fixture({ resourceMode: 'mixed' });
161
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
162
+ assert.match(result.apiChangeResourceRoot, /resources[/\\]apiChange$/);
163
+ assert.match(result.apiChangeResourceArchive, /project-api-change-assistant-26\.0\.0\.361\.jar$/);
164
+ const referenceRoot = path.join(root, 'references');
165
+ await mkdir(referenceRoot);
166
+ const rules = await loadDevEcoRules(result, referenceRoot,
167
+ assertUpgradeRange('5.0.0(12)', '26.0.0(26) Release'), 'upgrade');
168
+ assert.deepEqual(rules.errors, []);
169
+ assert.equal(rules.versionNames['26.0.0(26) Release'], 'HarmonyOS_26.0.0_Release');
170
+ });
171
+
172
+ test('accepts API 26 rule names without a repeated API level', async () => {
173
+ const { root, home, sdk } = await fixture({ resourceMode: 'modern-directory' });
174
+ const result = await discoverDevEco(sdk, home, { platform: 'win32', env: {} });
175
+ const referenceRoot = path.join(root, 'references');
176
+ await mkdir(referenceRoot);
177
+ const rules = await loadDevEcoRules(result, referenceRoot,
178
+ assertUpgradeRange('5.0.0(12)', '26.0.0(26) Release'), 'upgrade');
179
+ assert.deepEqual(rules.errors, []);
180
+ });
181
+
182
+ test('newer SDK covers an older target while a real parser remains required', async t => {
183
+ const historical = await fixture({ sdkData: { platformVersion: '6.1.1', apiVersion: '24', releaseType: 'Release' } });
184
+ t.after(() => rm(historical.root, { recursive: true, force: true }));
185
+ const toolchain = await discoverDevEco(historical.sdk, historical.home, { targetVersion: '24' });
186
+ assert.equal(toolchain.devecoCompatibility.status, 'COMPATIBLE');
187
+ assert.equal(toolchain.devecoCompatibility.requiredVersion, '6.1.1');
188
+ assert.doesNotThrow(() => validateTargetCoverage(toolchain, parseVersion('24')));
189
+ const newer = await fixture();
190
+ t.after(() => rm(newer.root, { recursive: true, force: true }));
191
+ const substituted = await discoverDevEco(newer.sdk, newer.home, { targetVersion: '24' });
192
+ assert.doesNotThrow(()=>validateTargetCoverage(substituted,parseVersion('24')));
193
+ await assert.rejects(buildSdkCatalog(substituted, parseVersion('24')), { code: 'ARKTS_PARSER_UNAVAILABLE' });
194
+ });
195
+
196
+ test('a historical IDE is accepted for its matching target instead of requiring IDE 26', async t => {
197
+ const { root, home, sdk } = await fixture({ ideVersion: '6.1.1.280',
198
+ sdkData: { platformVersion: '6.1.1', apiVersion: '24', releaseType: 'Release' } });
199
+ t.after(() => rm(root, { recursive: true, force: true }));
200
+ const toolchain = await discoverDevEco(sdk, home, { targetVersion: '6.1.1(24)' });
201
+ assert.equal(toolchain.devecoCompatibility.status, 'COMPATIBLE');
202
+ validateTargetCoverage(toolchain, parseVersion('24'));
203
+ });
204
+
205
+ test('missing and damaged product metadata block discovery with environment repair guidance', async t => {
206
+ const { root, home, sdk } = await fixture();
207
+ t.after(() => rm(root, { recursive: true, force: true }));
208
+ const metadata = path.join(home, 'product-info.json');
209
+ await rm(metadata);
210
+ await assert.rejects(discoverDevEco(sdk, home), { code: 'DEVECO_VERSION_UNRESOLVED' });
211
+ await writeFile(metadata, '{broken');
212
+ await assert.rejects(discoverDevEco(sdk, home), error => {
213
+ assert.equal(error.code, 'DEVECO_VERSION_UNRESOLVED');
214
+ assert.equal(error.details.metadataPath, metadata);
215
+ return true;
216
+ });
217
+ });
218
+
219
+ test('both scan modes and rule inspection reject old or unknown IDEs before probing the backend', async t => {
220
+ for (const [ideVersion, code] of [['6.1.1.280', 'DEVECO_TARGET_NOT_COVERED'], ['invalid', 'DEVECO_VERSION_UNRESOLVED']]) {
221
+ const { root, home, sdk } = await fixture({ ideVersion, scannerSource:
222
+ '// --startVersion --endVersion --modulePaths --sdkPath --apiModifiedPath --outputPath --configPath --scanFilePaths --outPath --tmpPath\n'
223
+ + 'require("node:fs").writeFileSync(require("node:path").join(__dirname, "backend-started"), "started");\n' });
224
+ t.after(() => rm(root, { recursive: true, force: true }));
225
+ const output = path.join(root, 'output');
226
+ for (const mode of ['upgrade', 'deprecated']) {
227
+ await assert.rejects(execute(['scan', '--project', path.join(root, 'project'), '--sdk', sdk, '--deveco-home', home,
228
+ '--from', '13', '--to', '26', '--mode', mode, '--output-dir', output]), { code, stage: 'VALIDATE_DEVECO_VERSION' });
229
+ }
230
+ await assert.rejects(execute(['inspect-rules', '--mode', 'upgrade', '--sdk', sdk, '--deveco-home', home, '--from', '13', '--to', '26']), { code });
231
+ const directories=(await readdir(output)).filter(name=>/^\d{14}(?:-\d+)?$/.test(name));
232
+ assert.equal(directories.length,2);
233
+ for (const directory of directories) {
234
+ const files = await readdir(path.join(output, directory));
235
+ const diagnostics = JSON.parse(await readFile(path.join(output,directory,'.internal','scanner','diagnostics.json'),'utf8'));
236
+ assert.deepEqual(files.sort(),['.internal',diagnostics.runtime.featureMode].sort());
237
+ assert.deepEqual(await readdir(path.join(output,directory,diagnostics.runtime.featureMode)),[]);
238
+ assert.deepEqual(await readdir(path.join(output,directory,'.internal','scanner')),['diagnostics.json']);
239
+ assert.equal(diagnostics.error.code, code);
240
+ assert.equal(diagnostics.error.stage, 'VALIDATE_DEVECO_VERSION');
241
+ assert.equal(diagnostics.error.details.installedVersion, ideVersion);
242
+ }
243
+ assert.equal((await readdir(path.join(home, 'plugins/harmony/arkanalyzer-apiscan'))).includes('backend-started'), false);
244
+ }
245
+ });
246
+
247
+ test('scanner canonicalizes default and probes an ambiguous backend only once', async t => {
248
+ const { root, sdk, home } = await fixture();
249
+ t.after(() => rm(root, { recursive: true, force: true }));
250
+ const count = path.join(root, 'help-calls.txt');
251
+ const source = '// --startVersion --endVersion --modulePaths --sdkPath --outputPath --configPath --apiModifiedPath --outPath --tmpPath\n'
252
+ + `require('node:fs').appendFileSync(${JSON.stringify(count)},'help\\n');\n`
253
+ + "console.log('--configPath --apiModifiedPath --outPath --tmpPath --scanFilePaths');\n";
254
+ await writeFile(path.join(home, 'plugins/harmony/arkanalyzer-apiscan/api-change-scan.js'), source);
255
+ for (const input of [sdk, path.join(sdk, 'default')]) {
256
+ const toolchain = await discoverDevEco(input, home);
257
+ assert.equal(toolchain.sdkRoot, sdk);
258
+ assert.equal(toolchain.sdkLocation.packagePath, path.join(sdk, 'default/sdk-pkg.json'));
259
+ assert.equal(toolchain.fileScanSupported, true);
260
+ }
261
+ assert.equal(await readFile(count, 'utf8'), 'help\n');
262
+ });
@@ -0,0 +1,10 @@
1
+ import { createRunOutputDirectory } from '../../core/cli.mjs';
2
+ import { createScanBatch } from '../../../shared/platform/artifact-layout.mjs';
3
+ import { runDevEcoScan } from '../../core/scan-runner.mjs';
4
+
5
+ export async function runScanInBatch(mode, options) {
6
+ if (options.batchId) return runDevEcoScan({ ...options, mode });
7
+ const { directory } = await createRunOutputDirectory(options.outputDirectory);
8
+ const layout = await createScanBatch(options.outputDirectory, directory, { mode });
9
+ return runDevEcoScan({ ...options, mode, outputDirectory: directory, batchId: layout.batchId });
10
+ }
@@ -0,0 +1,108 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, mkdir, writeFile } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { ensureNativeBuild } from '../native/native.mjs';
7
+
8
+ test('runs compileNative with the selected module target when ninja is missing', async () => {
9
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-native-'));
10
+ const moduleRoot = path.join(root, 'native');
11
+ await mkdir(path.join(root, 'oh_modules'), { recursive: true });
12
+ await mkdir(moduleRoot, { recursive: true });
13
+ const calls = [];
14
+ await ensureNativeBuild({
15
+ project: {
16
+ root,
17
+ product: { name: 'default' },
18
+ modules: [{ name: 'native', target: 'default', root: moduleRoot, hasNativeConfig: true }],
19
+ },
20
+ toolchain: { hvigorw: '/mock/hvigorw', sdkRoot: '/mock/sdk' },
21
+ runCommand: async (command, args) => {
22
+ calls.push({ command, args });
23
+ await mkdir(path.join(moduleRoot, '.cxx', 'default', 'arm64-v8a'), { recursive: true });
24
+ await writeFile(path.join(moduleRoot, '.cxx', 'default', 'arm64-v8a', 'build.ninja'), 'rule cc\n');
25
+ return { code: 0, stdout: '', stderr: '' };
26
+ },
27
+ });
28
+ assert.equal(calls.length, 1);
29
+ assert.ok(calls[0].args.includes('module=native@default'));
30
+ assert.ok(calls[0].args.includes('compileNative'));
31
+ });
32
+
33
+ test('reports a capability error when a native rebuild needs missing Hvigor', async () => {
34
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-native-no-hvigor-'));
35
+ const moduleRoot = path.join(root, 'native');
36
+ await mkdir(path.join(root, 'oh_modules'), { recursive: true });
37
+ await mkdir(moduleRoot);
38
+ await assert.rejects(ensureNativeBuild({
39
+ project: {
40
+ root, product: { name: 'default' },
41
+ modules: [{ name: 'native', target: 'default', root: moduleRoot, hasNativeConfig: true }],
42
+ },
43
+ toolchain: { hvigorw: null, sdkRoot: '/mock/sdk' },
44
+ }), { code: 'NATIVE_BUILD_TOOL_UNAVAILABLE' });
45
+ });
46
+
47
+ test('installs dependencies with ohpm before a native rebuild', async () => {
48
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-native-ohpm-'));
49
+ const moduleRoot = path.join(root, 'native');
50
+ await mkdir(moduleRoot, { recursive: true });
51
+ const calls = [];
52
+ const records = await ensureNativeBuild({
53
+ project: {
54
+ root, product: { name: 'default' },
55
+ modules: [{ name: 'native', target: 'default', root: moduleRoot, hasNativeConfig: true }],
56
+ },
57
+ toolchain: { hvigorw: '/mock/hvigorw', ohpm: '/mock/ohpm', sdkRoot: '/mock/sdk' },
58
+ runCommand: async (command, args, cwd, environment, timeoutMs) => {
59
+ calls.push({ command, args, cwd, timeoutMs });
60
+ if (command === '/mock/ohpm') {
61
+ await mkdir(path.join(root, 'oh_modules'), { recursive: true });
62
+ return { code: 0, stdout: 'installed', stderr: '' };
63
+ }
64
+ await mkdir(path.join(moduleRoot, '.cxx', 'default', 'arm64-v8a'), { recursive: true });
65
+ await writeFile(path.join(moduleRoot, '.cxx', 'default', 'arm64-v8a', 'build.ninja'), 'rule cc\n');
66
+ return { code: 0, stdout: '', stderr: '' };
67
+ },
68
+ });
69
+ assert.equal(calls[0].command, '/mock/ohpm');
70
+ assert.deepEqual(calls[0].args, ['install']);
71
+ assert.equal(calls[0].cwd, root);
72
+ assert.ok(calls[0].timeoutMs >= 60_000);
73
+ assert.equal(calls[1].command, '/mock/hvigorw');
74
+ assert.equal(records.length, 1);
75
+ assert.equal(records[0].rebuilt, true);
76
+ });
77
+
78
+ test('reports OHPM_INSTALL_FAILED when dependency installation fails', async () => {
79
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-native-ohpm-fail-'));
80
+ const moduleRoot = path.join(root, 'native');
81
+ await mkdir(moduleRoot, { recursive: true });
82
+ await assert.rejects(ensureNativeBuild({
83
+ project: {
84
+ root, product: { name: 'default' },
85
+ modules: [{ name: 'native', target: 'default', root: moduleRoot, hasNativeConfig: true }],
86
+ },
87
+ toolchain: { hvigorw: '/mock/hvigorw', ohpm: '/mock/ohpm', sdkRoot: '/mock/sdk' },
88
+ runCommand: async () => ({ code: 1, stdout: '', stderr: 'install failed' }),
89
+ }), error => {
90
+ assert.equal(error.code, 'OHPM_INSTALL_FAILED');
91
+ assert.match(error.message, /ohpm install failed for native module native/);
92
+ assert.equal(error.details.stderr, 'install failed');
93
+ return true;
94
+ });
95
+ });
96
+
97
+ test('reports OHPM_UNAVAILABLE when dependencies are missing without ohpm', async () => {
98
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-native-no-ohpm-'));
99
+ const moduleRoot = path.join(root, 'native');
100
+ await mkdir(moduleRoot, { recursive: true });
101
+ await assert.rejects(ensureNativeBuild({
102
+ project: {
103
+ root, product: { name: 'default' },
104
+ modules: [{ name: 'native', target: 'default', root: moduleRoot, hasNativeConfig: true }],
105
+ },
106
+ toolchain: { hvigorw: '/mock/hvigorw', ohpm: null, sdkRoot: '/mock/sdk' },
107
+ }), { code: 'OHPM_UNAVAILABLE' });
108
+ });
@@ -0,0 +1,42 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, mkdir, writeFile } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { loadProject, locationInsideScanDirs } from '../core/project.mjs';
7
+
8
+ test('loads full module context but restricts emitted locations to scan dirs', async () => {
9
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-scan-project-'));
10
+ await writeFile(path.join(root, 'build-profile.json5'), `{
11
+ app: { products: [{ name: 'default', compatibleSdkVersion: '12' }] },
12
+ modules: [{ name: 'entry', srcPath: './entry' }, { name: 'feature', srcPath: './feature' }],
13
+ }`);
14
+ for (const module of ['entry', 'feature']) {
15
+ await mkdir(path.join(root, module, 'src', 'main', 'ets'), { recursive: true });
16
+ await writeFile(path.join(root, module, 'src', 'main', 'module.json5'), `{ module: { name: '${module}', type: 'har' } }`);
17
+ await writeFile(path.join(root, module, 'src', 'main', 'ets', 'A.ets'), 'const value = 1;\n');
18
+ }
19
+ const project = await loadProject(root, 'default', ['entry']);
20
+ assert.equal(project.model, 'STAGE');
21
+ assert.deepEqual(project.modules.map((item) => item.name), ['entry', 'feature']);
22
+ assert.deepEqual(project.selectedModules.map((item) => item.name), ['entry']);
23
+ assert.equal(locationInsideScanDirs(project, 'entry/src/main/ets/A.ets:1'), true);
24
+ assert.equal(locationInsideScanDirs(project, 'feature/src/main/ets/A.ets:1'), false);
25
+ assert.equal(locationInsideScanDirs(project, 'entry/src/main/ets/Missing.ets:1'), false);
26
+ });
27
+
28
+ test('dependency, build and test directories never enter source discovery or result scope', async () => {
29
+ const root = await mkdtemp(path.join(os.tmpdir(), 'harmony-excluded-source-'));
30
+ await writeFile(path.join(root, 'build-profile.json5'), '{app:{products:[{name:"default"}]},modules:[{name:"entry",srcPath:"entry"}]}');
31
+ await mkdir(path.join(root, 'entry/src/main'), { recursive: true });
32
+ await writeFile(path.join(root, 'entry/src/main/module.json5'), '{module:{type:"entry"}}');
33
+ for (const directory of ['entry/src/main/ets', 'entry/oh_modules', 'entry/build', 'entry/src/ohosTest', 'node_modules']) {
34
+ await mkdir(path.join(root, directory), { recursive: true });
35
+ await writeFile(path.join(root, directory, 'A.ets'), 'oldGlobal();');
36
+ }
37
+ await writeFile(path.join(root, 'entry', 'BuildProfile.ets'), 'generatedBuildProfile();');
38
+ const project = await loadProject(root, 'default');
39
+ assert.equal(project.sourceFiles.length, 1);
40
+ assert.equal(locationInsideScanDirs(project, 'entry/oh_modules/A.ets:1'), false);
41
+ assert.equal(locationInsideScanDirs(project, 'entry/build/A.ets:1'), false);
42
+ });
@@ -0,0 +1,190 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdir, mkdtemp, writeFile, realpath } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { existsSync } from 'node:fs';
7
+ import {
8
+ auditDeprecationRules,
9
+ applyBehaviorBaseline,
10
+ documentedNoAdaptation,
11
+ documentedNoAdaptationEvidence,
12
+ } from '../core/rules.mjs';
13
+
14
+ test('excludes API 12 behavior and UX rules without affecting other rule types', () => {
15
+ const makeRule = (ruleId, changedInSdk, changeType) => ({
16
+ ruleId, changedInSdk, changeType, sourceReference: `${ruleId}.md:1`, title: ruleId,
17
+ });
18
+ const result = applyBehaviorBaseline([
19
+ makeRule('behavior-12', '5.0.0(12) Release', 'API Behavior Change'),
20
+ makeRule('ux-12', '5.0.0(12) Beta3', 'UX Interaction Behavior Change'),
21
+ makeRule('definition-12', '5.0.0(12) Release', 'API Definition Change'),
22
+ makeRule('deprecated-12', '5.0.0(12) Release', 'Deprecated API'),
23
+ makeRule('behavior-13', '5.0.1(13) Beta3', 'API Behavior Change'),
24
+ ]);
25
+ assert.deepEqual(result.rules.map(rule => rule.ruleId), [
26
+ 'definition-12', 'deprecated-12', 'behavior-13',
27
+ ]);
28
+ assert.deepEqual(result.audit, {
29
+ apiLevel: 12,
30
+ policy: 'ALREADY_ADAPTED',
31
+ reason: 'BEHAVIOR_BASELINE_ALREADY_ADAPTED',
32
+ excludedRuleCount: 2,
33
+ });
34
+ assert.deepEqual(result.excluded.map(item => [item.ruleId, item.reason]), [
35
+ ['behavior-12', 'BEHAVIOR_BASELINE_ALREADY_ADAPTED'],
36
+ ['ux-12', 'BEHAVIOR_BASELINE_ALREADY_ADAPTED'],
37
+ ]);
38
+ });
39
+
40
+ test('filters only sections whose overall guidance explicitly says no adaptation', () => {
41
+ assert.equal(documentedNoAdaptation(`### 默认效果变更
42
+
43
+ **适配指导**
44
+
45
+ 默认效果变更,无需适配,但应注意变更后的默认效果是否符合开发者预期。`), true);
46
+ assert.equal(documentedNoAdaptation(`### Bugfix
47
+
48
+ **变更影响**
49
+
50
+ 此变更不涉及应用适配。`), true);
51
+ assert.equal(documentedNoAdaptation(`### 混合变更
52
+
53
+ 1. 接口A涉及应用适配。
54
+ 2. 接口B不涉及应用适配。
55
+
56
+ **适配指导**
57
+
58
+ 接口A需要修改,接口B无需适配。`), false);
59
+ assert.equal(documentedNoAdaptation(`### 条件变更
60
+
61
+ **适配指导**
62
+
63
+ 若存在继承派生则需要修改,否则无需适配。`), false);
64
+ assert.equal(documentedNoAdaptation(`### 仅建议关注
65
+
66
+ **适配指导**
67
+
68
+ 默认行为变更,应注意变更后的行为是否符合预期,可按需恢复旧效果。`), false);
69
+ });
70
+
71
+ test('records structured evidence for an unconditional official no-adaptation statement', () => {
72
+ assert.deepEqual(documentedNoAdaptationEvidence(`### 默认布局效果变更
73
+
74
+ **变更影响**
75
+
76
+ 此变更涉及应用适配。
77
+
78
+ **适配指导**
79
+
80
+ 默认行为变更,应用无需适配。`), {
81
+ sectionField: '适配指导',
82
+ statement: '默认行为变更,应用无需适配。',
83
+ });
84
+ assert.deepEqual(documentedNoAdaptationEvidence(`### Bugfix
85
+
86
+ **变更影响**
87
+
88
+ 该变更不涉及应用适配。`), {
89
+ sectionField: '变更影响',
90
+ statement: '该变更不涉及应用适配。',
91
+ });
92
+ assert.deepEqual(documentedNoAdaptationEvidence(`### 系统接口补齐
93
+
94
+ **适配指导**
95
+
96
+ 本变更不涉及应用适配。`), {
97
+ sectionField: '适配指导',
98
+ statement: '本变更不涉及应用适配。',
99
+ });
100
+ assert.equal(documentedNoAdaptationEvidence(`### 混合变更
101
+
102
+ **适配指导**
103
+
104
+ 接口A需要修改,接口B无需适配。`), null);
105
+ assert.equal(documentedNoAdaptationEvidence(`### 条件变更
106
+
107
+ **适配指导**
108
+
109
+ 若存在继承派生则需要修改,否则无需适配。`), null);
110
+ assert.equal(documentedNoAdaptationEvidence(`### 需评估的UX变更
111
+
112
+ **变更影响**
113
+
114
+ 此变更不涉及应用适配。
115
+
116
+ **适配指导**
117
+
118
+ UX规格变更,无需适配。`), null);
119
+ });
120
+
121
+ const parserPath = process.env.HARMONYOS_TYPESCRIPT || '/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/ets/build-tools/ets-loader/node_modules/typescript/lib/typescript.js';
122
+ test('audits declarations when the Windows parser normalizes source file separators', async () => {
123
+ const parserFile = 'D:/SDK/api/@ohos.legacy.d.ts';
124
+ const filesystemFile = 'D:\\SDK\\api\\@ohos.legacy.d.ts';
125
+ const text = '/** @deprecated since 26 */\ndeclare function legacy(): void;';
126
+ const declaration = {
127
+ symbolId: 'api-legacy',
128
+ relativePath: 'api/@ohos.legacy.d.ts',
129
+ file: parserFile,
130
+ line: 2,
131
+ start: text.indexOf('declare'),
132
+ name: 'legacy',
133
+ owner: '',
134
+ kind: 'method',
135
+ deprecatedSince: 26,
136
+ replacementApi: null,
137
+ declaration: 'declare function legacy(): void;',
138
+ };
139
+ const catalog = {
140
+ declarations: [declaration],
141
+ sourceFiles: new Map([[filesystemFile, { fileName: parserFile, text }]]),
142
+ };
143
+ const rule = {
144
+ ruleId: 'deprecated-legacy',
145
+ changeOperation: 'API_DEPRECATED',
146
+ affectedApis: [{
147
+ implementLanguage: 'typeScript',
148
+ completePath: '/interface/sdk-js/api/@ohos.legacy.d.ts',
149
+ className: 'unnamed',
150
+ interfaceName: 'legacy',
151
+ interfaceType: 'method',
152
+ }],
153
+ };
154
+
155
+ const result = await auditDeprecationRules({}, [rule], catalog);
156
+
157
+ assert.equal(result.targetSdkTagged, 1);
158
+ assert.match(rule.replacementDeclaration, /@deprecated since 26/);
159
+ });
160
+
161
+ test('enriches deprecated rules with the target SDK useinstead declaration', { skip: !existsSync(parserPath) }, async () => {
162
+ const sdkRoot = await mkdtemp(path.join(os.tmpdir(), 'scanner-deprecated-sdk-'));
163
+ const declarationFile = path.join(sdkRoot, 'default', 'openharmony', 'ets', 'component', 'common.d.ts');
164
+ await mkdir(path.dirname(declarationFile), { recursive: true });
165
+ await writeFile(declarationFile, `/**
166
+ * Returns the context.
167
+ * @deprecated since 18
168
+ * @useinstead ohos.arkui.UIContext.UIContext#getHostContext
169
+ */
170
+ declare function getContext(component?: Object): Context;
171
+ `);
172
+ const rule = {
173
+ ruleId: 'deprecated-get-context',
174
+ changeOperation: 'API_DEPRECATED',
175
+ affectedApis: [{
176
+ implementLanguage: 'typeScript',
177
+ completePath: '/interface/sdk-js/api/@internal/component/ets/common.d.ts',
178
+ interfaceName: 'getContext',
179
+ methodDefinition: 'declare function getContext(component?: Object): Context;',
180
+ }],
181
+ };
182
+
183
+ const result = await auditDeprecationRules({ sdkRoot, parserPath }, [rule]);
184
+
185
+ assert.equal(result.targetSdkTagged, 1);
186
+ assert.equal(result.replacementCount, 1);
187
+ assert.equal(rule.replacementApi, 'ohos.arkui.UIContext.UIContext#getHostContext');
188
+ assert.equal(rule.replacementSource, `${await realpath(declarationFile)}:6`);
189
+ assert.match(rule.replacementDeclaration, /@useinstead[\s\S]*declare function getContext/);
190
+ });