@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,521 @@
1
+ import { mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { atomicWrite, ensureDir, exists, portableRelative, sha256 } from '../../shared/io/fs-utils.mjs';
6
+ import { DEPRECATED_HEADERS, hyperlink, hyperlinkUrl, parseCsv, SCANNER_HEADERS, stringifyCsv, UPGRADE_HEADERS } from '../../shared/format/csv.mjs';
7
+ import { canonicalHarmonyVersion as canonicalVersion, compareHarmonyVersions as compareVersions, devecoVersionName, parseVersion } from '../../shared/platform/version.mjs';
8
+ import { locationInsideScanDirs, canonicalSourceFile } from './project.mjs';
9
+ import {
10
+ classifyDeprecatedFindings,
11
+ VALIDATION_HEADERS,
12
+ } from '../behavior/behavior-policy.mjs';
13
+ import { runProcess } from '../../shared/platform/process.mjs';
14
+ import { ruleDocumentLink } from '../../shared/platform/document-links.mjs';
15
+ import { retryFileOperation } from '../../shared/platform/fs.mjs';
16
+ import { inside } from '../../shared/platform/source-scope.mjs';
17
+ import { batchArtifactPaths, ensureBatchDirectory } from '../../shared/platform/artifact-layout.mjs';
18
+ import { requireScanMode } from '../../shared/platform/scan-mode.mjs';
19
+
20
+ const TYPE_RANK = new Map([
21
+ ['API Behavior Change', 0],
22
+ ['UX Interaction Behavior Change', 1],
23
+ ['UX Visual Layout Change', 2],
24
+ ['Deprecated API', 3],
25
+ ['API Definition Change', 4],
26
+ ]);
27
+
28
+ const devecoWorkerCompat = fileURLToPath(new URL('../bin/deveco-worker-compat.cjs', import.meta.url));
29
+
30
+ async function execute(command, args, options, timeoutMs = null) {
31
+ const result = await runProcess(command, args, { ...options, timeoutMs });
32
+ if (result.error) throw new Error(result.error);
33
+ return {
34
+ code: result.exitCode,
35
+ stdout: result.stdout,
36
+ stderr: result.stderr,
37
+ timedOut: result.timedOut,
38
+ error: result.error,
39
+ };
40
+ }
41
+
42
+ export function interpretDevEcoOutput(processResult) {
43
+ const combined = `${processResult.stdout}\n${processResult.stderr}`;
44
+ if (processResult.code !== 0) {
45
+ const error = new Error(`DevEco API scan exited with code ${processResult.code}`);
46
+ error.code = 'DEVECO_SCAN_FAILED';
47
+ error.details = { stdout: processResult.stdout.slice(-12000), stderr: processResult.stderr.slice(-12000) };
48
+ throw error;
49
+ }
50
+ if (/falling back to grep|with grep|error\[2000(?:1|2|3|5)\]/i.test(combined)) {
51
+ const error = new Error('DevEco scanner used or requested an inaccurate fallback');
52
+ error.code = 'DEVECO_SCAN_DEGRADED';
53
+ error.details = { stdout: processResult.stdout.slice(-12000), stderr: processResult.stderr.slice(-12000) };
54
+ throw error;
55
+ }
56
+ const cppTimeoutCount = [...combined.matchAll(/error\[20004\]/gi)].length;
57
+ return {
58
+ cppStatus: cppTimeoutCount > 0 ? 'TIMED_OUT' : 'COMPLETE',
59
+ warnings: cppTimeoutCount > 0
60
+ ? [`C++扫描超时${cppTimeoutCount}次,已继续生成报告;C++结果可能不完整,需人工复核`]
61
+ : [],
62
+ };
63
+ }
64
+
65
+ function normalizeCodeLocation(project, location) {
66
+ const normalized = String(location).replaceAll('\\', '/');
67
+ const match = normalized.match(/^(.*?):(\d+)(?::(\d+))?$/);
68
+ if (!match) return normalized;
69
+ if (!path.isAbsolute(match[1])) {
70
+ const segments = match[1].split('/');
71
+ const module = project.modules?.find(candidate => candidate.name === segments[0] || path.basename(candidate.root) === segments[0]);
72
+ const absolute = module ? path.join(module.root, ...segments.slice(1)) : path.join(project.root, match[1]);
73
+ const actual = canonicalSourceFile(project, absolute);
74
+ if (actual && project.sourceFiles) return normalizeCodeLocation(project, `${actual}:${match[2]}${match[3] ? `:${match[3]}` : ''}`);
75
+ return normalized;
76
+ }
77
+ const actual = canonicalSourceFile(project, match[1]);
78
+ if (actual) match[1] = actual;
79
+ const module = project.modules?.find((candidate) => {
80
+ const relation = path.relative(candidate.root, match[1]);
81
+ return relation !== '' && !relation.startsWith('..') && !path.isAbsolute(relation);
82
+ });
83
+ if (module) {
84
+ const moduleRelative = portableRelative(module.root, match[1]);
85
+ return `${module.name}/${moduleRelative}:${match[2]}${match[3] ? `:${match[3]}` : ''}`;
86
+ }
87
+ const relative = portableRelative(project.root, match[1]);
88
+ if (relative.startsWith('../') || relative === '..') return normalized;
89
+ return `${relative}:${match[2]}${match[3] ? `:${match[3]}` : ''}`;
90
+ }
91
+
92
+ function normalizeFinding(row, rule, project = null, mode) {
93
+ requireScanMode(mode);
94
+ const originalUrl = hyperlinkUrl(row.Title);
95
+ const link = ruleDocumentLink(rule, originalUrl, { requireEntry: mode === 'upgrade' });
96
+ const disposition = rule.reportDisposition ?? 'REQUIRES_REVIEW';
97
+ const filterReason = rule.filterReason ?? null;
98
+ const applicabilityProof = rule.applicabilityProof ?? null;
99
+ return {
100
+ 'Api Definition': row['Api Definition'],
101
+ Language: row.Language === 'C++' ? 'C' : row.Language,
102
+ 'Changed in SDK': rule.changedInSdk || row['Changed in SDK'],
103
+ 'Affected Versions': rule.affectedVersions ?? row['Affected Versions'],
104
+ Title: hyperlink(link.url, rule.title),
105
+ documentLink: link,
106
+ 'Code Location': project
107
+ ? normalizeCodeLocation(project, row['Code Location'])
108
+ : String(row['Code Location']).replaceAll('\\', '/'),
109
+ Fixed: 'Unfixed',
110
+ ...(mode === 'upgrade' && row.Column !== undefined ? { Column: row.Column } : {}),
111
+ 'Change Type': rule.changeType,
112
+ 'Rule ID': String(rule.ruleId),
113
+ 'Change Operation': rule.changeOperation,
114
+ 'Source Reference': rule.sourceReference,
115
+ 'Replacement API': rule.replacementApi ?? '',
116
+ 'Replacement Source': rule.replacementSource ?? '',
117
+ includedInCsv: disposition !== 'FILTERED_COMPATIBLE',
118
+ disposition,
119
+ filterReason,
120
+ applicabilityProof,
121
+ };
122
+ }
123
+
124
+ function normalizeApiDefinition(value) {
125
+ return String(value).replace(/\s+/g, ' ').replace(/;\s*$/, '').trim();
126
+ }
127
+
128
+ function compareFindings(left, right) {
129
+ const level = finding => finding['Deprecated Since'] !== undefined && finding['Deprecated Since'] !== ''
130
+ ? Number(finding['Deprecated Since']) : finding['Changed in SDK'] ? parseVersion(finding['Changed in SDK']).apiLevel : 0;
131
+ const leftLevel = level(left);
132
+ const rightLevel = level(right);
133
+ const versionRank = !left['Changed in SDK'] || !right['Changed in SDK']
134
+ ? (leftLevel ?? 0) - (rightLevel ?? 0)
135
+ : compareVersions(left['Changed in SDK'], right['Changed in SDK']);
136
+ const values = [
137
+ versionRank,
138
+ (TYPE_RANK.get(left['Change Type']) ?? 99) - (TYPE_RANK.get(right['Change Type']) ?? 99),
139
+ left['Rule ID'].localeCompare(right['Rule ID']),
140
+ left.Language.localeCompare(right.Language),
141
+ left['Code Location'].localeCompare(right['Code Location'], undefined, { numeric: true }),
142
+ Number(left.Column ?? 0) - Number(right.Column ?? 0),
143
+ left['Api Definition'].localeCompare(right['Api Definition']),
144
+ ];
145
+ return values.find((value) => value !== 0) ?? 0;
146
+ }
147
+
148
+ function deduplicate(rows) {
149
+ const seen = new Set();
150
+ return rows.filter((row) => {
151
+ const key = row.occurrenceId ?? [row['Rule ID'], row['Api Definition'], row.Language, row['Code Location'], row.Column ?? ''].join('\u0000');
152
+ if (seen.has(key)) return false;
153
+ seen.add(key);
154
+ return true;
155
+ });
156
+ }
157
+
158
+ async function findOfficialCsv(directory) {
159
+ const files = (await readdir(directory)).filter((name) => name.endsWith('.csv')).sort();
160
+ if (files.length !== 1) throw new Error(`Expected one DevEco CSV, found ${files.length}`);
161
+ return path.join(directory, files[0]);
162
+ }
163
+
164
+ async function readCsvOutputs(directory) {
165
+ const files = (await readdir(directory)).filter(name => name.endsWith('.csv')).sort();
166
+ if (files.length === 0) throw new Error('DevEco scanner did not produce a CSV');
167
+ const parsed = await Promise.all(files.map(async file => parseCsv(await readFile(path.join(directory, file), 'utf8'))));
168
+ return {
169
+ headers: [...new Set(parsed.flatMap(item => item.headers))],
170
+ rows: parsed.flatMap(item => item.rows),
171
+ };
172
+ }
173
+
174
+ function normalizeIndexRow(row) {
175
+ const location = String(row['Invoke Location'] ?? '');
176
+ const withColumn = location.match(/^(.*?:\d+):(\d+)$/);
177
+ return {
178
+ 'Api Definition': row.MethodDefinition ?? row['Api Name'] ?? '',
179
+ Language: 'ArkTS',
180
+ ChangeId: row.ChangeId,
181
+ 'Code Location': withColumn ? withColumn[1] : location,
182
+ Column: withColumn ? Number(withColumn[2]) : undefined,
183
+ };
184
+ }
185
+
186
+ export function rulesForProject(rules, project) {
187
+ const hasArkTs = project.sourceFiles.some((file) => /\.(?:ets|ts)$/i.test(file));
188
+ const hasCpp = project.sourceFiles.some((file) => /\.(?:c|cc|cpp|cxx)$/i.test(file));
189
+ const groups = { typescript: new Map(), c: new Map() };
190
+ const scanRuleMap = new Map();
191
+ for (const rule of rules) {
192
+ for (const api of rule.rawEntry.affectedApis) {
193
+ const language = String(api.implementLanguage).toLowerCase();
194
+ if (language === 'typescript' && !hasArkTs) continue;
195
+ if (language === 'c' && !hasCpp) continue;
196
+ if (!(language in groups)) continue;
197
+ const identity = [
198
+ rule.provider ?? 'UNKNOWN', language, api.completePath, api.className, api.interfaceType, api.interfaceName,
199
+ normalizeApiDefinition(api.methodDefinition), api.invokeInstance ?? '',
200
+ ].join('\u0000');
201
+ let scanId = groups[language].get(identity);
202
+ if (!scanId) {
203
+ scanId = `scan-${sha256(identity).slice(0, 20)}`;
204
+ groups[language].set(identity, scanId);
205
+ scanRuleMap.set(scanId, { api, provider: rule.provider ?? 'UNKNOWN', rules: [], bindings: [] });
206
+ }
207
+ const record = scanRuleMap.get(scanId);
208
+ if (!record.rules.some((candidate) => candidate.ruleId === rule.ruleId)) record.rules.push(rule);
209
+ if (!record.bindings.some((binding) => binding.rule.ruleId === rule.ruleId)) record.bindings.push({ rule, api });
210
+ }
211
+ }
212
+ const toEntries = (language) => [...groups[language].values()].map((scanId) => {
213
+ const record = scanRuleMap.get(scanId);
214
+ const source = record.rules[0].rawEntry;
215
+ return {
216
+ ...source,
217
+ __provider: record.provider,
218
+ affectedApis: [record.api],
219
+ interfaceChanges: { ...source.interfaceChanges, id: scanId },
220
+ };
221
+ });
222
+ const arkTsEntries = toEntries('typescript');
223
+ const cppEntries = toEntries('c');
224
+ return {
225
+ entries: [...arkTsEntries, ...cppEntries],
226
+ arkTsEntries,
227
+ cppEntries,
228
+ scanRuleMap,
229
+ hasArkTs,
230
+ hasCpp,
231
+ };
232
+ }
233
+
234
+ export async function cleanupScanDirectory(directory, remove = rm) {
235
+ try {
236
+ await retryFileOperation(() => remove(directory, { recursive: true, force: true }));
237
+ return null;
238
+ } catch (error) {
239
+ return { code: 'SCAN_TEMP_CLEANUP_FAILED', path: directory, errorCode: error.code, message: error.message };
240
+ }
241
+ }
242
+
243
+ export async function runDevEcoScan({ toolchain, project, range, rules, outputDirectory, batchId, deprecations = null,
244
+ buildLogImport = null, devecoVersionNames = {}, runtime = null, mode, verifyInputs = async () => {}, cppPassTimeoutMs = 240_000, removeTemporary = rm }) {
245
+ requireScanMode(mode);
246
+ const layout = batchArtifactPaths(outputDirectory, batchId, mode);
247
+ await ensureBatchDirectory(layout, layout.scannerDirectory);
248
+ await ensureBatchDirectory(layout, layout.deliveryDirectory);
249
+ const temporary = await mkdtemp(path.join(os.tmpdir(), 'harmony-api-scan-'));
250
+ const startedAt = Date.now();
251
+ const projectRules = rulesForProject(rules, project);
252
+ let result, failure;
253
+ try {
254
+ const selectedModules = project.selectedModules ?? project.modules;
255
+ const cppModules = selectedModules.filter((module) => project.sourceFiles.some((file) => {
256
+ if (!/\.(?:c|cc|cpp|cxx)$/i.test(file)) return false;
257
+ const relation = path.relative(module.root, file);
258
+ return relation !== '' && !relation.startsWith('..') && !path.isAbsolute(relation);
259
+ }));
260
+ if (toolchain.apiChangeBackend === 'index' && projectRules.cppEntries.length > 0 && cppModules.length > 0) {
261
+ const error = new Error('The discovered DevEco index backend cannot scan C/C++ API changes');
262
+ error.code = 'C_CPP_BACKEND_UNAVAILABLE';
263
+ error.details = toolchain.layoutDiagnostics;
264
+ throw error;
265
+ }
266
+ const runPass = async (name, entries, modules, files = null) => {
267
+ if (entries.length === 0 || modules.length === 0 || files?.length === 0) {
268
+ return { rows: [], processResult: { stdout: '', stderr: '' }, interpretation: { cppStatus: 'NOT_APPLICABLE', warnings: [] } };
269
+ }
270
+ const passRoot = path.join(temporary, name);
271
+ const officialOutput = path.join(passRoot, 'official');
272
+ const apiChangesPath = path.join(passRoot, 'api-changes.json');
273
+ await ensureDir(officialOutput);
274
+ await writeFile(apiChangesPath, `${JSON.stringify(entries)}\n`);
275
+ if (toolchain.apiChangeBackend === 'index') {
276
+ const tmpPath = path.join(passRoot, 'tmp');
277
+ const logPath = path.join(passRoot, 'APIScan.log');
278
+ const configPath = path.join(passRoot, 'scanner-config.json');
279
+ await ensureDir(tmpPath);
280
+ await writeFile(configPath, `${JSON.stringify({
281
+ projectPath: project.sourceScope ? modules.map(module => module.root) : project.root,
282
+ sdks: Object.entries(toolchain.sdkFamilies ?? {}).map(([family, etsRoot]) => ({
283
+ name: family === 'openharmony' ? 'ohos' : family,
284
+ path: etsRoot,
285
+ })),
286
+ outPath: officialOutput,
287
+ }, null, 2)}\n`);
288
+ const processResult = await execute(process.execPath, [
289
+ '--require', devecoWorkerCompat,
290
+ toolchain.apiChangeScan,
291
+ '--configPath', configPath,
292
+ '--apiModifiedPath', apiChangesPath,
293
+ '--outPath', officialOutput,
294
+ '--tmpPath', tmpPath,
295
+ '--logPath', logPath,
296
+ '--batchSize', '1000',
297
+ ...(files ? ['--scanFilePaths', files.join(',')] : []),
298
+ ], {
299
+ cwd: passRoot,
300
+ env: { ...process.env, DEVECO_HOME: toolchain.contentsRoot, DEVECO_SDK_HOME: toolchain.sdkRoot },
301
+ });
302
+ if (await exists(logPath)) processResult.stderr += `\n${await readFile(logPath, 'utf8')}`;
303
+ const interpretation = interpretDevEcoOutput(processResult);
304
+ const csv = await readCsvOutputs(officialOutput);
305
+ return { rows: csv.rows.map(normalizeIndexRow), headers: ['ChangeId'], processResult, interpretation };
306
+ }
307
+ if (name.startsWith('cpp-') && (!toolchain.cApiScanJar || !toolchain.java)) {
308
+ const error = new Error('DevEco C/C++ scanner components are unavailable');
309
+ error.code = 'C_CPP_BACKEND_UNAVAILABLE';
310
+ error.details = toolchain.layoutDiagnostics;
311
+ throw error;
312
+ }
313
+ const args = [
314
+ toolchain.apiChangeScan,
315
+ '--startVersion', devecoVersionNames[canonicalVersion(range.start)] ?? devecoVersionName(range.start),
316
+ '--endVersion', devecoVersionNames[canonicalVersion(range.end)] ?? devecoVersionName(range.end),
317
+ ...(files ? [name.startsWith('cpp-') ? '--cppFiles' : '--arkTsFiles', files.join(',')]
318
+ : ['--modulePaths', modules.map(module => module.root).join(',')]),
319
+ '--sdkPath', toolchain.sdkRoot,
320
+ '--apiModifiedPath', apiChangesPath,
321
+ '--outputPath', officialOutput,
322
+ ];
323
+ if (toolchain.cApiScanJar) args.push('--cApiScanJarPath', toolchain.cApiScanJar);
324
+ const processResult = await execute(process.execPath, args, {
325
+ detached: name.startsWith('cpp-'),
326
+ cwd: toolchain.analyzerRoot,
327
+ env: {
328
+ ...process.env,
329
+ DEVECO_HOME: toolchain.contentsRoot,
330
+ DEVECO_SDK_HOME: toolchain.sdkRoot,
331
+ ...(toolchain.java ? { JAVA_HOME: path.dirname(path.dirname(toolchain.java)) } : {}),
332
+ },
333
+ }, name.startsWith('cpp-') ? cppPassTimeoutMs : null);
334
+ if (processResult.timedOut) {
335
+ processResult.code = 0;
336
+ processResult.stderr += `\nerror[20004] C++ semantic pass exceeded ${cppPassTimeoutMs}ms; process group terminated; completed rows only\n`;
337
+ const interpretation = interpretDevEcoOutput(processResult);
338
+ const files = (await readdir(officialOutput)).filter(file => file.endsWith('.csv'));
339
+ let csv = { rows: [], headers: [] };
340
+ if (files.length === 1) {
341
+ try { csv = parseCsv(await readFile(path.join(officialOutput, files[0]), 'utf8')); }
342
+ catch { interpretation.warnings.push('C++超时导致未完成CSV损坏,已跳过该批次;ArkTS结果继续生成'); }
343
+ }
344
+ return { rows: csv.rows, headers: csv.headers, processResult, interpretation };
345
+ }
346
+ const interpretation = interpretDevEcoOutput(processResult);
347
+ const csv = parseCsv(await readFile(await findOfficialCsv(officialOutput), 'utf8'));
348
+ return { rows: csv.rows, headers: csv.headers, processResult, interpretation };
349
+ };
350
+ const groupedPasses = async (language, entries, modules) => {
351
+ const providers = [...new Set(entries.map((entry) => entry.__provider))].sort();
352
+ const passes = [];
353
+ const narrowed = Boolean(project.sourceScope?.scanDirs.length) && modules.some(module =>
354
+ !project.sourceScope.scanDirs.some(directory => inside(directory,module.root)));
355
+ const fileMode = narrowed || toolchain.apiChangeBackend === 'index' && project.sourceScope?.restricted && toolchain.fileScanSupported !== false;
356
+ if (fileMode && toolchain.fileScanSupported === false) {
357
+ const error = new Error('This DevEco backend cannot scan the requested file scope');
358
+ error.code = 'SCAN_SCOPE_UNSUPPORTED'; throw error;
359
+ }
360
+ for (const provider of providers) {
361
+ const selectedEntries = entries.filter(entry => entry.__provider === provider);
362
+ if (!fileMode) {
363
+ // The native backend owns a fixed per-invocation timeout. Keep module
364
+ // results independent so a slow CDT parse does not erase sibling results.
365
+ const batches = language === 'cpp' ? modules.map(module => [module]) : [modules];
366
+ for (const [index, batch] of batches.entries())
367
+ passes.push({ ...await runPass(`${language}-${String(provider).toLowerCase()}-${index}`, selectedEntries, batch),
368
+ modules: batch.map(module => module.name) });
369
+ continue;
370
+ }
371
+ for (const module of modules) {
372
+ const files = project.sourceFiles.filter(file => {
373
+ const relative = path.relative(module.root, file);
374
+ return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)
375
+ && (language === 'arkts' ? /\.(ets|ts)$/i : /\.(c|cc|cpp|cxx|h|hpp)$/i).test(file);
376
+ });
377
+ let batch = [], bytes = 0, index = 0;
378
+ const flush = async () => {
379
+ if (batch.length) passes.push(await runPass(`${language}-${String(provider).toLowerCase()}-${index++}-${modules.indexOf(module)}`, selectedEntries, [module], batch));
380
+ batch = []; bytes = 0;
381
+ };
382
+ for (const file of files) {
383
+ const size = Buffer.byteLength(file, 'utf8') + 1;
384
+ if (file.includes(',') || size > 16000) {
385
+ const error = new Error('DevEco cannot represent this source path in its file scope');
386
+ error.code = 'SCAN_SCOPE_UNSUPPORTED'; throw error;
387
+ }
388
+ if (bytes + size > 16000) await flush();
389
+ batch.push(file); bytes += size;
390
+ }
391
+ await flush();
392
+ }
393
+ }
394
+ return passes;
395
+ };
396
+ const arkTsPasses = await groupedPasses('arkts', projectRules.arkTsEntries, selectedModules);
397
+ const cppPasses = await groupedPasses('cpp', projectRules.cppEntries, cppModules);
398
+ const allPasses = [...arkTsPasses, ...cppPasses];
399
+ const officialRows = allPasses.flatMap((pass) => pass.rows);
400
+ const idHeader = allPasses.flatMap((pass) => pass.headers ?? []).includes('ChangeId')
401
+ ? 'ChangeId' : 'Rule ID';
402
+ const unresolved = [];
403
+ const findings = [...(deprecations?.findings ?? []), ...(buildLogImport?.findings ?? [])];
404
+ for (const row of officialRows) {
405
+ const record = projectRules.scanRuleMap?.get(String(row[idHeader] ?? ''));
406
+ if (!record) {
407
+ unresolved.push({ changeId: row[idHeader] ?? '', title: row.Title, location: row['Code Location'] });
408
+ continue;
409
+ }
410
+ for (const binding of record.bindings) {
411
+ const finding = normalizeFinding({ ...row, 'Api Definition': binding.api.methodDefinition }, binding.rule, project, mode);
412
+ if (locationInsideScanDirs(project, finding['Code Location'])) findings.push(finding);
413
+ }
414
+ }
415
+ if (unresolved.length) {
416
+ const error = new Error(`DevEco results contain ${unresolved.length} unresolved rule identifiers`);
417
+ error.code = 'UNRESOLVED_SCAN_RESULTS';
418
+ error.details = unresolved.slice(0, 20);
419
+ throw error;
420
+ }
421
+ const rawFindings = deduplicate(findings).sort(compareFindings);
422
+ const classified = mode === 'upgrade'
423
+ ? { findings: rawFindings.map(finding => ({ ...finding, includedInCsv: true, disposition: 'REQUIRES_REVIEW', filterReason: null })),
424
+ actionRows: rawFindings, actionGroups: [], validationRows: [], validationGroups: [] }
425
+ : classifyDeprecatedFindings(rawFindings);
426
+ const allFindings = classified.findings;
427
+ const reportedFindings = classified.actionRows;
428
+ const filteredFindings = allFindings.filter((finding) => !finding.includedInCsv);
429
+ const filterSummary = Object.fromEntries([...filteredFindings.reduce((counts, finding) => {
430
+ counts.set(finding.filterReason, (counts.get(finding.filterReason) ?? 0) + 1);
431
+ return counts;
432
+ }, new Map())].sort(([left], [right]) => left.localeCompare(right)));
433
+ const outputCsv = layout.rawCsv;
434
+ const validationCsv = mode === 'upgrade' ? null : layout.validationCsv;
435
+ const scanJson = layout.scanJson;
436
+ await verifyInputs();
437
+ await ensureBatchDirectory(layout, layout.deliveryDirectory);
438
+ await ensureBatchDirectory(layout, layout.scannerDirectory);
439
+ await atomicWrite(outputCsv, stringifyCsv(mode === 'upgrade' ? UPGRADE_HEADERS : DEPRECATED_HEADERS, reportedFindings));
440
+ if (validationCsv) await atomicWrite(validationCsv, stringifyCsv(VALIDATION_HEADERS, classified.validationRows));
441
+ await atomicWrite(scanJson, `${JSON.stringify({
442
+ schemaVersion: 4,
443
+ batchId,
444
+ mode,
445
+ runtime,
446
+ versionResolution:{scanFromSdkVersion:range.start ? canonicalVersion(range.start) : null,scanToSdkVersion:range.end ? canonicalVersion(range.end) : null,
447
+ compileSdkVersion:toolchain.sdkVersion ? canonicalVersion(toolchain.sdkVersion) : null},
448
+ sourceSnapshot: project.sourceSnapshot,
449
+ sourceScope: project.sourceScope ?? null,
450
+ scannedFiles: project.sourceFiles.map(file => path.relative(project.root, file).split(path.sep).join('/')),
451
+ buildProfileHash: project.buildProfileHash,
452
+ findingCount: allFindings.length,
453
+ totalFindingCount: allFindings.length,
454
+ reportedFindingCount: reportedFindings.length,
455
+ filteredFindingCount: filteredFindings.length,
456
+ filterSummary,
457
+ deprecationCoverage: deprecations?.coverage ?? null,
458
+ deprecationCatalog: deprecations?.catalogCoverage ?? null,
459
+ unresolved: deprecations?.unresolved ?? [],
460
+ resolutionWarnings: deprecations?.resolutionWarnings ?? [],
461
+ buildLogImport: buildLogImport?.audit ?? null,
462
+ actionGroups: classified.actionGroups,
463
+ validationGroups: classified.validationGroups,
464
+ findings: allFindings.map((finding) => ({
465
+ findingId: `finding-${sha256(SCANNER_HEADERS.map((header) => finding[header]).join('\u0000')).slice(0, 20)}`,
466
+ ...finding,
467
+ })),
468
+ }, null, 2)}\n`);
469
+ const warnings = [
470
+ ...allPasses.flatMap((pass) => pass.interpretation.warnings),
471
+ ...(deprecations?.resolutionWarnings?.some(item => item.reason === 'UNUSED_SDK_IMPORT_NOT_RESOLVED')
472
+ ? ['SDK 存在未使用的缺失导出,已通过工程符号影响分析;详见扫描 JSON 的 resolutionWarnings'] : []),
473
+ ...(deprecations?.resolutionWarnings?.some(item => item.reason !== 'UNUSED_SDK_IMPORT_NOT_RESOLVED')
474
+ ? [`${deprecations.resolutionWarnings.filter(item => item.reason !== 'UNUSED_SDK_IMPORT_NOT_RESOLVED').length}处非系统模块导入未解析;相关类型证据不完整`] : []),
475
+ ...(buildLogImport?.warnings ?? []),
476
+ ];
477
+ const scannerStdout = allPasses.map((pass, index) => pass.processResult.stdout
478
+ ? `[pass-${index + 1}]\n${pass.processResult.stdout}` : '').filter(Boolean).join('\n');
479
+ const scannerStderr = allPasses.map((pass, index) => pass.processResult.stderr
480
+ ? `[pass-${index + 1}]\n${pass.processResult.stderr}` : '').filter(Boolean).join('\n');
481
+ const cppStatuses = cppPasses.map((pass) => pass.interpretation.cppStatus);
482
+ const cppStatus = !projectRules.hasCpp ? 'NOT_APPLICABLE'
483
+ : cppStatuses.includes('TIMED_OUT') ? 'TIMED_OUT' : 'COMPLETE';
484
+ result = {
485
+ outputCsv,
486
+ validationCsv,
487
+ scanJson,
488
+ findings: reportedFindings,
489
+ allFindings,
490
+ filteredFindings,
491
+ actionGroups: classified.actionGroups,
492
+ validationGroups: classified.validationGroups,
493
+ diagnostics: {
494
+ durationMs: Date.now() - startedAt,
495
+ totalFindingCount: allFindings.length,
496
+ reportedFindingCount: reportedFindings.length,
497
+ filteredFindingCount: filteredFindings.length,
498
+ filterSummary,
499
+ cppStatus,
500
+ nativePasses: cppPasses.map(pass => ({ modules: pass.modules ?? [], status: pass.interpretation.cppStatus })),
501
+ languages: { arkts: projectRules.hasArkTs, cpp: projectRules.hasCpp },
502
+ warnings,
503
+ backend: toolchain.apiChangeBackend ?? 'integrated',
504
+ stdout: scannerStdout.slice(-12000),
505
+ stderr: scannerStderr.slice(-12000),
506
+ },
507
+ };
508
+ return result;
509
+ } catch (error) {
510
+ failure = error;
511
+ throw error;
512
+ } finally {
513
+ const warning = await cleanupScanDirectory(temporary, removeTemporary);
514
+ if (warning && result) {
515
+ result.diagnostics.cleanupWarning = warning;
516
+ result.diagnostics.warnings.push(`${warning.code}: ${warning.path}: ${warning.message}`);
517
+ } else if (warning && failure) failure.cleanupWarning = warning;
518
+ }
519
+ }
520
+
521
+ export { compareFindings, normalizeCodeLocation, normalizeFinding };