@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,425 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { buildSdkCatalog, resolveRuleDeclarations } from './sdk-deprecations.mjs';
4
+ import { listFiles, portableRelative, sha256 } from '../../shared/io/fs-utils.mjs';
5
+ import { canonicalHarmonyVersion as canonicalVersion, compareHarmonyVersions as compareVersions, devecoVersionName, parseVersion } from '../../shared/platform/version.mjs';
6
+ import { readZipTextEntries } from '../../shared/format/zip.mjs';
7
+ import { normalizeDocumentUrl, entryUrl } from '../../shared/platform/document-links.mjs';
8
+ import { loadChangelogIndex } from '../../shared/platform/changelog-index.mjs';
9
+ import { requireScanMode } from '../../shared/platform/scan-mode.mjs';
10
+
11
+ const API_PLATFORM = new Map([
12
+ [12, '5.0.0'], [13, '5.0.1'], [14, '5.0.2'], [15, '5.0.3'], [16, '5.0.4'], [17, '5.0.5'],
13
+ [18, '5.1.0'], [19, '5.1.1'], [20, '6.0.0'], [21, '6.0.1'], [22, '6.0.2'], [23, '6.1.0'],
14
+ [24, '6.1.1'], [26, '26.0.0'],
15
+ ]);
16
+
17
+ const CHANGE_TYPE_MAP = new Map([
18
+ ['接口行为变更', ['API Behavior Change', 'API_BEHAVIOR']],
19
+ ['接口行为变更(API变更)', ['API Behavior Change', 'API_BEHAVIOR']],
20
+ ['UX视觉布局变更', ['UX Visual Layout Change', 'UX_VISUAL']],
21
+ ['视觉布局变更', ['UX Visual Layout Change', 'UX_VISUAL']],
22
+ ['UX交互行为变更', ['UX Interaction Behavior Change', 'UX_INTERACTION']],
23
+ ['接口定义变更', ['API Definition Change', 'API_DEFINITION']],
24
+ ['接口废弃变更', ['Deprecated API', 'API_DEPRECATED']],
25
+ ]);
26
+
27
+ const BEHAVIOR_BASELINE_API_LEVEL = 12;
28
+ const BEHAVIOR_CHANGE_TYPES = new Set([
29
+ 'API Behavior Change',
30
+ 'UX Visual Layout Change',
31
+ 'UX Interaction Behavior Change',
32
+ ]);
33
+ const BEHAVIOR_BASELINE_REASON = 'BEHAVIOR_BASELINE_ALREADY_ADAPTED';
34
+
35
+ const CHANGE_TITLE_OVERRIDES = new Map([
36
+ ['CH2026042864213', '通过ohos.permission.READ_IMAGEVIDEO权限可读取的媒体库文件的范围变更'],
37
+ ]);
38
+
39
+ function ruleId(parts) {
40
+ return `rule-${sha256(parts.join('\u0000')).slice(0, 20)}`;
41
+ }
42
+
43
+ function normalizeTitle(value) {
44
+ return String(value).toLowerCase().replaceAll('\\', '').replace(/[^\p{L}\p{N}]+/gu, '');
45
+ }
46
+
47
+ function markdownField(section, label) {
48
+ const escaped = label.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
49
+ return section.match(new RegExp(`\\*\\*${escaped}\\*\\*\\s*\\n+([\\s\\S]*?)(?=\\n\\*\\*[^*]+\\*\\*|\\n#{1,6}\\s|$)`))?.[1]?.trim() ?? '';
50
+ }
51
+
52
+ function cleanStatement(value) {
53
+ return String(value)
54
+ .replace(/!\[[^\]]*\]\([^)]+\)/g, '')
55
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
56
+ .replace(/[*_`]/g, '')
57
+ .replace(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/, '')
58
+ .replace(/\s+/g, ' ')
59
+ .trim();
60
+ }
61
+
62
+ function guidanceNoAdaptationEvidence(guidance) {
63
+ const normalized = guidance.split(/\r?\n/).map(cleanStatement).filter(Boolean).join('\n');
64
+ const direct = /^(?:(?:默认(?:行为|效果|UX样式)?变更|(?:此|该|本)变更)[,,::]?\s*)?(?:开发者|应用)?(?:无需(?:进行|应用)?适配|不涉及应用适配)/;
65
+ if (!direct.test(normalized)) return null;
66
+ return {
67
+ sectionField: '适配指导',
68
+ statement: normalized.split('\n', 1)[0],
69
+ };
70
+ }
71
+
72
+ export function documentedNoAdaptationEvidence(section) {
73
+ const guidance = markdownField(section, '适配指导');
74
+ const guidanceEvidence = guidanceNoAdaptationEvidence(guidance);
75
+ if (guidanceEvidence) return guidanceEvidence;
76
+ const wholeSectionMatch = section.match(/(?:此|该)变更不涉及应用适配[。.]?/);
77
+ if (!wholeSectionMatch) return null;
78
+ if (/(?:无需(?:进行|应用)?适配|不涉及应用适配)/.test(guidance)) return null;
79
+ const remaining = section.replace(wholeSectionMatch[0], '');
80
+ if (/(?:此|该)变更涉及应用适配|(?:需要|必须|应当)修改|(?:需要|必须|(?<!无)需)适配/.test(remaining)) return null;
81
+ return { sectionField: '变更影响', statement: cleanStatement(wholeSectionMatch[0]) };
82
+ }
83
+
84
+ export function documentedNoAdaptation(section) {
85
+ return documentedNoAdaptationEvidence(section) !== null;
86
+ }
87
+
88
+ export function applyBehaviorBaseline(rules, apiLevel = BEHAVIOR_BASELINE_API_LEVEL) {
89
+ const included = [];
90
+ const excluded = [];
91
+ for (const rule of rules) {
92
+ const level = parseVersion(rule.changedInSdk).apiLevel;
93
+ if (BEHAVIOR_CHANGE_TYPES.has(rule.changeType) && level <= apiLevel) {
94
+ excluded.push({
95
+ ruleId: rule.ruleId,
96
+ changedInSdk: rule.changedInSdk,
97
+ changeType: rule.changeType,
98
+ title: rule.title,
99
+ sourceReference: rule.sourceReference,
100
+ reason: BEHAVIOR_BASELINE_REASON,
101
+ });
102
+ } else {
103
+ included.push(rule);
104
+ }
105
+ }
106
+ return {
107
+ rules: included,
108
+ excluded,
109
+ audit: {
110
+ apiLevel,
111
+ policy: 'ALREADY_ADAPTED',
112
+ reason: BEHAVIOR_BASELINE_REASON,
113
+ excludedRuleCount: excluded.length,
114
+ },
115
+ };
116
+ }
117
+
118
+ async function buildHeadingIndex(referenceRoot) {
119
+ const changelogIndex = await loadChangelogIndex(referenceRoot);
120
+ const files = await listFiles(referenceRoot, (file) => file.endsWith('.md'));
121
+ const byTitle = new Map();
122
+ const byNormalizedTitle = new Map();
123
+ const linkedTitlesByChangeId = new Map();
124
+ const sectionsBySourceReference = new Map();
125
+ const documentSources = new Map();
126
+ const links = [];
127
+ for (const file of files) {
128
+ const relative = portableRelative(referenceRoot, file);
129
+ const lines = (await readFile(file, 'utf8')).split(/\r?\n/);
130
+ documentSources.set(relative, lines.find(line => /^source:\s*https?:\/\//.test(line))?.replace(/^source:\s*/, '').trim());
131
+ let fenced = false;
132
+ const headings = [];
133
+ for (let index = 0; index < lines.length; index += 1) {
134
+ if (lines[index].trim().startsWith('```')) {
135
+ fenced = !fenced;
136
+ continue;
137
+ }
138
+ if (fenced) continue;
139
+ const heading = lines[index].match(/^#{2,6}\s+(.+?)\s*$/);
140
+ if (!heading) continue;
141
+ headings.push({ index, level: lines[index].match(/^#+/)?.[0].length ?? 6 });
142
+ const entries = byTitle.get(heading[1]) ?? [];
143
+ entries.push(`${relative}:${index + 1}`);
144
+ byTitle.set(heading[1], entries);
145
+ const normalized = normalizeTitle(heading[1]);
146
+ const normalizedEntries = byNormalizedTitle.get(normalized) ?? [];
147
+ normalizedEntries.push(`${relative}:${index + 1}`);
148
+ byNormalizedTitle.set(normalized, normalizedEntries);
149
+ }
150
+ for (let index = 0; index < headings.length; index += 1) {
151
+ const heading = headings[index];
152
+ const next = headings.slice(index + 1).find((candidate) => candidate.level <= heading.level);
153
+ sectionsBySourceReference.set(
154
+ `${relative}:${heading.index + 1}`,
155
+ lines.slice(heading.index, next?.index ?? lines.length).join('\n').trim(),
156
+ );
157
+ }
158
+ for (const line of lines) {
159
+ for (const match of line.matchAll(/\[([^\]]+)\]\((https?:\/\/[^)#]+#([^)]+))\)/g)) {
160
+ const id = decodeURIComponent(match[3]).toLowerCase();
161
+ links.push({ title: match[1], url: match[2], id, version: relative.split('/')[0] });
162
+ const titles = linkedTitlesByChangeId.get(id) ?? [];
163
+ titles.push(match[1]);
164
+ linkedTitlesByChangeId.set(id, titles);
165
+ }
166
+ }
167
+ }
168
+ for (const record of changelogIndex.overview) {
169
+ for (const match of record.row.matchAll(/\[([^\]]+)\]\((https?:\/\/[^)#]+#([^)]+))\)/g)) {
170
+ const id = decodeURIComponent(match[3]).toLowerCase();
171
+ links.push({ title: match[1], url: match[2], id, version: record.version });
172
+ const titles = linkedTitlesByChangeId.get(id) ?? [];
173
+ titles.push(match[1]);
174
+ linkedTitlesByChangeId.set(id, titles);
175
+ }
176
+ }
177
+ return { byTitle, byNormalizedTitle, linkedTitlesByChangeId, sectionsBySourceReference, documentSources, links };
178
+ }
179
+
180
+ function documentLink(change, sourceReference, index) {
181
+ const file = sourceReference.replace(/:\d+$/, ''), versionRoot = file.split('/')[0];
182
+ const page = normalizeDocumentUrl(index.documentSources.get(file), { fragment: false });
183
+ const candidates = index.links.filter(link => link.version === versionRoot
184
+ && normalizeDocumentUrl(link.url, { fragment: false }) === page);
185
+ const byId = candidates.filter(link => link.id === String(change.id).toLowerCase());
186
+ const heading = index.sectionsBySourceReference.get(sourceReference)?.split('\n')[0].replace(/^#+\s*/, '');
187
+ const matched = byId.length ? byId : candidates.filter(link => normalizeTitle(link.title) === normalizeTitle(heading ?? change.changeTitle));
188
+ const urls = [...new Set(matched.map(link => entryUrl(link.url)).filter(Boolean))];
189
+ let provided = null;
190
+ try { provided = entryUrl(new URL(change.url, 'https://developer.huawei.com/consumer/cn/doc/harmonyos-releases/').href); } catch { /* No plugin URL. */ }
191
+ if (provided && (urls.length === 1 && provided === urls[0] || !urls.length
192
+ && normalizeDocumentUrl(provided, { fragment: false }) === page
193
+ && new URL(provided).hash.toLowerCase() === `#${String(change.id).toLowerCase()}`))
194
+ return { url: provided, source: 'DEVECO_RULE' };
195
+ return urls.length === 1 ? { url: urls[0], source: 'OFFICIAL_OVERVIEW' }
196
+ : { url: '', source: null, reason: urls.length ? 'AMBIGUOUS_DOCUMENT_LINK' : 'DOCUMENT_LINK_NOT_FOUND' };
197
+ }
198
+
199
+ function affectedVersionRange(change, endVersion) {
200
+ if (['NOT_ISOLATED', 'COULD_NOT_ISOLATED'].includes(change.apiEffectiveVersion)) return 'ALL';
201
+ const apiText = String(change.apiVersion ?? '');
202
+ const apiLevel = /^\d+$/.test(apiText) ? Number(apiText) : parseVersion(apiText).apiLevel;
203
+ const platform = API_PLATFORM.get(apiLevel);
204
+ const start = platform ? `${platform}(${apiLevel})` : apiText;
205
+ return `${start} - ${endVersion.platformVersion}(${endVersion.apiLevel})`;
206
+ }
207
+
208
+ function ruleResourceVersion(name) {
209
+ return parseVersion(path.basename(name, '.json'));
210
+ }
211
+
212
+ function ruleResourceKey(name) {
213
+ try {
214
+ const version = ruleResourceVersion(name);
215
+ return ['version', version.platformVersion, version.apiLevel, version.channel, version.channelNumber].join(':');
216
+ } catch {
217
+ return `file:${path.basename(name).toLowerCase()}`;
218
+ }
219
+ }
220
+
221
+ export async function loadDevEcoRules(toolchain, referenceRoot, range, mode) {
222
+ requireScanMode(mode);
223
+ const headingIndex = await buildHeadingIndex(referenceRoot);
224
+ const resourcesByVersion = new Map();
225
+ if (toolchain.apiChangeResourceRoot) {
226
+ const files = await listFiles(toolchain.apiChangeResourceRoot, file => file.endsWith('.json'));
227
+ const directoryResources = await Promise.all(files.map(async file => ({
228
+ name: path.basename(file),
229
+ sourceReference: file,
230
+ text: await readFile(file, 'utf8'),
231
+ })));
232
+ for (const resource of directoryResources) resourcesByVersion.set(ruleResourceKey(resource.name), resource);
233
+ }
234
+ if (toolchain.apiChangeResourceArchive) {
235
+ const archiveResources = (await readZipTextEntries(toolchain.apiChangeResourceArchive,
236
+ name => /^apiChange\/.+\.json$/i.test(name) && !resourcesByVersion.has(ruleResourceKey(name)))).map(entry => ({
237
+ name: path.basename(entry.name),
238
+ sourceReference: `${toolchain.apiChangeResourceArchive}!/${entry.name}`,
239
+ text: entry.text,
240
+ }));
241
+ for (const resource of archiveResources) resourcesByVersion.set(ruleResourceKey(resource.name), resource);
242
+ }
243
+ const resources = [...resourcesByVersion.values()];
244
+ const rules = [];
245
+ const excluded = [];
246
+ const errors = [];
247
+ const versionNames = {};
248
+ const ruleSource = [toolchain.apiChangeResourceRoot, toolchain.apiChangeResourceArchive].filter(Boolean).join(' | ');
249
+ if (!resources.some((resource) => {
250
+ try { return compareVersions(ruleResourceVersion(resource.name), range.end) === 0; }
251
+ catch { return false; }
252
+ })) {
253
+ errors.push({
254
+ sourceReference: ruleSource,
255
+ message: `DevEco rule pack does not cover target ${devecoVersionName(range.end)}`,
256
+ });
257
+ }
258
+ for (const resource of resources) {
259
+ let version;
260
+ try {
261
+ version = ruleResourceVersion(resource.name);
262
+ versionNames[canonicalVersion(version)] = path.basename(resource.name, '.json');
263
+ } catch (error) {
264
+ errors.push({ sourceReference: resource.sourceReference, message: error.message });
265
+ continue;
266
+ }
267
+ if (compareVersions(version, range.start) <= 0 || compareVersions(version, range.end) > 0) continue;
268
+ const entries = JSON.parse(resource.text);
269
+ for (const entry of entries) {
270
+ const change = entry.interfaceChanges ?? {};
271
+ const affectedApis = Array.isArray(entry.affectedApis) ? entry.affectedApis : [];
272
+ const mapped = CHANGE_TYPE_MAP.get(change.changeType);
273
+ if (mode === 'upgrade' && mapped?.[0] === 'Deprecated API') {
274
+ excluded.push({ changeId: change.id, title: change.changeTitle, reason: 'UPGRADE_EXCLUDES_DEPRECATED' });
275
+ continue;
276
+ }
277
+ if (mode === 'deprecated' && mapped?.[0] !== 'Deprecated API') {
278
+ excluded.push({ changeId: change.id, title: change.changeTitle, reason: 'DEPRECATED_EXCLUDES_NON_DEPRECATED' });
279
+ continue;
280
+ }
281
+ if (mapped && BEHAVIOR_CHANGE_TYPES.has(mapped[0])
282
+ && parseVersion(change.sdkVersion || canonicalVersion(version)).apiLevel <= BEHAVIOR_BASELINE_API_LEVEL) {
283
+ excluded.push({ ruleId: change.id ? String(change.id) : null,
284
+ changedInSdk: change.sdkVersion || canonicalVersion(version), changeType: mapped[0],
285
+ title: change.changeTitle ?? '', sourceReference: null, reason: BEHAVIOR_BASELINE_REASON });
286
+ continue;
287
+ }
288
+ let sources = headingIndex.byTitle.get(change.changeTitle) ?? [];
289
+ if (sources.length !== 1) {
290
+ sources = headingIndex.byNormalizedTitle.get(normalizeTitle(change.changeTitle)) ?? [];
291
+ }
292
+ if (sources.length !== 1 && change.id !== undefined && change.id !== null) {
293
+ const idCandidates = [String(change.id).toLowerCase(), `section${String(change.id).toLowerCase()}`];
294
+ const linkedTitles = idCandidates.flatMap((id) => headingIndex.linkedTitlesByChangeId.get(id) ?? []);
295
+ const linkedSources = linkedTitles.flatMap((title) => headingIndex.byTitle.get(title)
296
+ ?? headingIndex.byNormalizedTitle.get(normalizeTitle(title)) ?? []);
297
+ if (linkedSources.length === 1) sources = linkedSources;
298
+ }
299
+ if (sources.length !== 1) {
300
+ const overrideTitle = CHANGE_TITLE_OVERRIDES.get(String(change.id));
301
+ if (overrideTitle) {
302
+ sources = headingIndex.byTitle.get(overrideTitle)
303
+ ?? headingIndex.byNormalizedTitle.get(normalizeTitle(overrideTitle)) ?? [];
304
+ }
305
+ }
306
+ if (!mapped || affectedApis.length === 0) {
307
+ excluded.push({
308
+ sourceReference: sources.length === 1 ? sources[0] : null,
309
+ changeId: change.id ?? null,
310
+ title: change.changeTitle ?? '',
311
+ reason: affectedApis.length === 0 ? 'NO_AFFECTED_APIS' : `UNSUPPORTED_CHANGE_TYPE:${change.changeType ?? ''}`,
312
+ });
313
+ continue;
314
+ }
315
+ if (sources.length !== 1) {
316
+ errors.push({
317
+ changeId: change.id ?? null,
318
+ title: change.changeTitle ?? '',
319
+ message: sources.length === 0 ? 'changelog heading not found' : 'ambiguous changelog heading',
320
+ candidates: sources,
321
+ });
322
+ continue;
323
+ }
324
+ const id = String(change.id || ruleId([change.sdkVersion ?? canonicalVersion(version), change.changeTitle, sources[0]]));
325
+ const noAdaptation = documentedNoAdaptationEvidence(headingIndex.sectionsBySourceReference.get(sources[0]) ?? '');
326
+ const link = documentLink(change, sources[0], headingIndex);
327
+ rules.push({
328
+ provider: 'DEVECO',
329
+ ruleId: id,
330
+ changeOperation: mapped[1],
331
+ changeType: mapped[0],
332
+ changedInSdk: change.sdkVersion || canonicalVersion(version),
333
+ affectedVersions: affectedVersionRange(change, range.end),
334
+ title: change.changeTitle ?? '',
335
+ url: link.url,
336
+ documentLink: link,
337
+ sourceReference: sources[0],
338
+ affectedApis,
339
+ reportDisposition: noAdaptation ? 'FILTERED_COMPATIBLE' : 'REQUIRES_REVIEW',
340
+ filterReason: noAdaptation ? 'DOCUMENTED_NO_ADAPTATION' : null,
341
+ applicabilityProof: noAdaptation ? {
342
+ kind: 'DOCUMENTED_NO_ADAPTATION',
343
+ sourceReference: sources[0],
344
+ ...noAdaptation,
345
+ } : null,
346
+ rawEntry: entry,
347
+ });
348
+ }
349
+ }
350
+ return { rules, excluded, errors, versionNames };
351
+ }
352
+
353
+ export async function compileRules({ toolchain, referenceRoot, range, strict = true, mode }) {
354
+ requireScanMode(mode);
355
+ const deveco = await loadDevEcoRules(toolchain, referenceRoot, range, mode);
356
+ const selected = mode === 'upgrade' ? deveco.rules.map(rule => ({
357
+ ...rule, reportDisposition: 'REQUIRES_REVIEW', filterReason: null, applicabilityProof: null,
358
+ })) : deveco.rules;
359
+ const baseline = applyBehaviorBaseline(selected);
360
+ const rules = baseline.rules;
361
+ const errors = deveco.errors;
362
+ const coverage = {
363
+ status: errors.length === 0 ? 'COMPLETE' : 'INCOMPLETE',
364
+ includedRuleCount: rules.length,
365
+ devecoRuleCount: rules.length,
366
+ excludedRuleCount: deveco.excluded.length + baseline.excluded.length,
367
+ behaviorBaseline: { ...baseline.audit, excludedRuleCount: baseline.audit.excludedRuleCount
368
+ + deveco.excluded.filter(entry => entry.reason === BEHAVIOR_BASELINE_REASON).length },
369
+ devecoVersionNames: deveco.versionNames,
370
+ errorCount: errors.length,
371
+ excluded: [...deveco.excluded, ...baseline.excluded],
372
+ errors,
373
+ };
374
+ if (strict && errors.length) {
375
+ const error = new Error(`Rule coverage is incomplete: ${errors.length} rule errors`);
376
+ error.code = 'INCOMPLETE_RULE_COVERAGE';
377
+ error.details = errors.slice(0, 20);
378
+ throw error;
379
+ }
380
+ return { rules, coverage };
381
+ }
382
+
383
+ export async function auditDeprecationRules(toolchain, rules, catalog = null) {
384
+ catalog ??= await buildSdkCatalog(toolchain);
385
+ const sourceFilesByParserName = new Map(
386
+ [...catalog.sourceFiles.values()].map(sourceFile => [sourceFile.fileName, sourceFile]),
387
+ );
388
+ let targetSdkTagged = 0;
389
+ let replacementCount = 0;
390
+ let legacyChangelogSignature = 0;
391
+ const legacySamples = [];
392
+ for (const rule of rules.filter(item => item.changeOperation === 'API_DEPRECATED')) {
393
+ const api = rule.affectedApis[0];
394
+ const matches = api.implementLanguage.toLowerCase() === 'typescript'
395
+ ? resolveRuleDeclarations(catalog, api).filter(entry => entry.deprecatedSince !== null)
396
+ : [];
397
+ rule.sdkSymbolIds = matches.map(entry => entry.symbolId);
398
+ if (matches.length === 1) {
399
+ const entry = matches[0];
400
+ rule.replacementApi = entry.replacementApi;
401
+ rule.replacementSource = `${entry.file}:${entry.line}`;
402
+ const sf = catalog.sourceFiles.get(entry.file) ?? sourceFilesByParserName.get(entry.file);
403
+ if (!sf) {
404
+ const error = new Error(`SDK declaration source is unavailable: ${entry.file}`);
405
+ error.code = 'SDK_DECLARATION_SOURCE_MISSING';
406
+ error.details = { ruleId: rule.ruleId, symbolId: entry.symbolId, file: entry.file };
407
+ throw error;
408
+ }
409
+ const commentStart = sf.text.lastIndexOf('/**', entry.start);
410
+ rule.replacementDeclaration = `${commentStart >= 0 ? sf.text.slice(commentStart, entry.start) : ''}${entry.declaration}`;
411
+ targetSdkTagged += 1;
412
+ if (entry.replacementApi) replacementCount += 1;
413
+ } else {
414
+ rule.replacementApi = null;
415
+ rule.replacementSource = null;
416
+ legacyChangelogSignature += 1;
417
+ if (legacySamples.length < 20) legacySamples.push({
418
+ ruleId: rule.ruleId, sourceReference: rule.sourceReference,
419
+ apiDefinition: api.methodDefinition,
420
+ reason: matches.length > 1 ? 'SDK_DECLARATION_AMBIGUOUS' : 'EXACT_SDK_DECLARATION_NOT_FOUND',
421
+ });
422
+ }
423
+ }
424
+ return { targetSdkTagged, replacementCount, legacyChangelogSignature, legacySamples };
425
+ }
@@ -0,0 +1,23 @@
1
+ // Scanner provenance: tool identity only.
2
+ // This records tool identity only; it does not diagnose or run API adaptation.
3
+ import path from 'node:path';
4
+ import {readFile} from 'node:fs/promises';
5
+ import {listFiles,portableRelative,sha256} from '../../shared/io/fs-utils.mjs';
6
+ import {requireScanMode} from '../../shared/platform/scan-mode.mjs';
7
+
8
+ export async function runtimeIdentity(skillRoot,{mode}={}) {
9
+ requireScanMode(mode);
10
+ const root=path.resolve(skillRoot),adapter=JSON.parse(await readFile(path.join(root,'package.json'),'utf8'));
11
+ const scanner=JSON.parse(await readFile(path.join(root,'scripts','scanner','package.json'),'utf8')),files=[];
12
+ const selected=[path.join(root,'scripts','shared','platform','scan-version-catalog.json')];
13
+ for(const directory of [path.join('scripts','shared'),path.join('scripts','scanner')])
14
+ selected.push(...await listFiles(path.join(root,directory),file=>/\.(mjs|cjs)$/.test(file),directory=>path.basename(directory)!=='test'));
15
+ for(const file of selected) {
16
+ const text=(await readFile(file,'utf8')).replace(/^\ufeff/,'').replace(/\r\n?/g,'\n');
17
+ files.push(`${portableRelative(root,file)}\0${sha256(text)}`);
18
+ }
19
+ return {identityVersion:2,featureMode:mode,featureVersion:1,skillRoot:root,adapterVersion:adapter.version,
20
+ scannerVersion:scanner.version,nodeVersion:process.version,platform:process.platform,
21
+ implementationFingerprint:sha256(files.sort().join('\n')),
22
+ capabilities:['independent-scanner','upgrade-plugin-mode','scan-statistics','official-change-links','native-abi-compilation-context']};
23
+ }