homegraph 1.5.2 → 1.5.4

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 (242) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +63 -10
  3. package/dist/addons/dynamic-import.d.ts +18 -0
  4. package/dist/addons/dynamic-import.d.ts.map +1 -0
  5. package/dist/addons/dynamic-import.js +25 -0
  6. package/dist/addons/dynamic-import.js.map +1 -0
  7. package/dist/addons/init-template.d.ts +15 -0
  8. package/dist/addons/init-template.d.ts.map +1 -0
  9. package/dist/addons/init-template.js +290 -0
  10. package/dist/addons/init-template.js.map +1 -0
  11. package/dist/addons/loader.d.ts +18 -0
  12. package/dist/addons/loader.d.ts.map +1 -0
  13. package/dist/addons/loader.js +88 -0
  14. package/dist/addons/loader.js.map +1 -0
  15. package/dist/addons/manager.d.ts +106 -0
  16. package/dist/addons/manager.d.ts.map +1 -0
  17. package/dist/addons/manager.js +437 -0
  18. package/dist/addons/manager.js.map +1 -0
  19. package/dist/addons/paths.d.ts +22 -0
  20. package/dist/addons/paths.d.ts.map +1 -0
  21. package/dist/addons/paths.js +65 -0
  22. package/dist/addons/paths.js.map +1 -0
  23. package/dist/addons/registry.d.ts +38 -0
  24. package/dist/addons/registry.d.ts.map +1 -0
  25. package/dist/addons/registry.js +160 -0
  26. package/dist/addons/registry.js.map +1 -0
  27. package/dist/addons/semver.d.ts +21 -0
  28. package/dist/addons/semver.d.ts.map +1 -0
  29. package/dist/addons/semver.js +79 -0
  30. package/dist/addons/semver.js.map +1 -0
  31. package/dist/addons/types.d.ts +51 -0
  32. package/dist/addons/types.d.ts.map +1 -0
  33. package/dist/addons/types.js +14 -0
  34. package/dist/addons/types.js.map +1 -0
  35. package/dist/addons/validate.d.ts +38 -0
  36. package/dist/addons/validate.d.ts.map +1 -0
  37. package/dist/addons/validate.js +165 -0
  38. package/dist/addons/validate.js.map +1 -0
  39. package/dist/arkui/index.d.ts +4 -0
  40. package/dist/arkui/index.d.ts.map +1 -0
  41. package/dist/arkui/index.js +23 -0
  42. package/dist/arkui/index.js.map +1 -0
  43. package/dist/arkui/migrate-passage.d.ts +28 -0
  44. package/dist/arkui/migrate-passage.d.ts.map +1 -0
  45. package/dist/arkui/migrate-passage.js +310 -0
  46. package/dist/arkui/migrate-passage.js.map +1 -0
  47. package/dist/arkui/migrate-semantics.d.ts +47 -0
  48. package/dist/arkui/migrate-semantics.d.ts.map +1 -0
  49. package/dist/arkui/migrate-semantics.js +229 -0
  50. package/dist/arkui/migrate-semantics.js.map +1 -0
  51. package/dist/arkui/migrate-snapshot.d.ts +79 -0
  52. package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
  53. package/dist/arkui/migrate-snapshot.js +364 -0
  54. package/dist/arkui/migrate-snapshot.js.map +1 -0
  55. package/dist/bin/addon-commands.d.ts +27 -0
  56. package/dist/bin/addon-commands.d.ts.map +1 -0
  57. package/dist/bin/addon-commands.js +254 -0
  58. package/dist/bin/addon-commands.js.map +1 -0
  59. package/dist/bin/fatal-handler.js +2 -2
  60. package/dist/bin/homegraph.js +111 -157
  61. package/dist/bin/homegraph.js.map +1 -1
  62. package/dist/bin/node-version-check.d.ts +6 -15
  63. package/dist/bin/node-version-check.d.ts.map +1 -1
  64. package/dist/bin/node-version-check.js +8 -37
  65. package/dist/bin/node-version-check.js.map +1 -1
  66. package/dist/db/index.d.ts +36 -1
  67. package/dist/db/index.d.ts.map +1 -1
  68. package/dist/db/index.js +92 -6
  69. package/dist/db/index.js.map +1 -1
  70. package/dist/db/migrations.d.ts +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +15 -1
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/db/queries.d.ts +42 -0
  75. package/dist/db/queries.d.ts.map +1 -1
  76. package/dist/db/queries.js +177 -10
  77. package/dist/db/queries.js.map +1 -1
  78. package/dist/db/schema.sql +6 -1
  79. package/dist/db/sqlite-adapter.d.ts +7 -3
  80. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  81. package/dist/db/sqlite-adapter.js +44 -3
  82. package/dist/db/sqlite-adapter.js.map +1 -1
  83. package/dist/extraction/extraction-version.d.ts +1 -1
  84. package/dist/extraction/extraction-version.js +1 -1
  85. package/dist/extraction/generated-detection.d.ts +42 -11
  86. package/dist/extraction/generated-detection.d.ts.map +1 -1
  87. package/dist/extraction/generated-detection.js +141 -20
  88. package/dist/extraction/generated-detection.js.map +1 -1
  89. package/dist/extraction/index.d.ts +42 -0
  90. package/dist/extraction/index.d.ts.map +1 -1
  91. package/dist/extraction/index.js +96 -0
  92. package/dist/extraction/index.js.map +1 -1
  93. package/dist/extraction/languages/arkts.d.ts +33 -2
  94. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  95. package/dist/extraction/languages/arkts.js +525 -129
  96. package/dist/extraction/languages/arkts.js.map +1 -1
  97. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  98. package/dist/extraction/wasm-runtime-flags.js +9 -6
  99. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  100. package/dist/graph-sources.d.ts +41 -0
  101. package/dist/graph-sources.d.ts.map +1 -0
  102. package/dist/graph-sources.js +82 -0
  103. package/dist/graph-sources.js.map +1 -0
  104. package/dist/index.d.ts +20 -1
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +79 -9
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/index.d.ts.map +1 -1
  109. package/dist/installer/index.js +0 -48
  110. package/dist/installer/index.js.map +1 -1
  111. package/dist/installer/targets/antigravity.js +1 -1
  112. package/dist/installer/targets/antigravity.js.map +1 -1
  113. package/dist/installer/targets/deveco.js +1 -1
  114. package/dist/installer/targets/deveco.js.map +1 -1
  115. package/dist/installer/targets/hermes.d.ts +1 -1
  116. package/dist/installer/targets/hermes.js +2 -2
  117. package/dist/installer/targets/hermes.js.map +1 -1
  118. package/dist/installer/targets/opencode.js +1 -1
  119. package/dist/installer/targets/opencode.js.map +1 -1
  120. package/dist/installer/targets/shared.js +1 -1
  121. package/dist/installer/targets/shared.js.map +1 -1
  122. package/dist/mcp/daemon-paths.d.ts +5 -4
  123. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  124. package/dist/mcp/daemon-paths.js +28 -13
  125. package/dist/mcp/daemon-paths.js.map +1 -1
  126. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  127. package/dist/mcp/daemon-registry.js +4 -1
  128. package/dist/mcp/daemon-registry.js.map +1 -1
  129. package/dist/mcp/daemon.d.ts +1 -1
  130. package/dist/mcp/daemon.js +1 -1
  131. package/dist/mcp/engine.d.ts.map +1 -1
  132. package/dist/mcp/engine.js +12 -3
  133. package/dist/mcp/engine.js.map +1 -1
  134. package/dist/mcp/explore-dedup.d.ts +137 -0
  135. package/dist/mcp/explore-dedup.d.ts.map +1 -0
  136. package/dist/mcp/explore-dedup.js +236 -0
  137. package/dist/mcp/explore-dedup.js.map +1 -0
  138. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  139. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  140. package/dist/mcp/explore-repeat-guard.js +503 -0
  141. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  142. package/dist/mcp/explore-session-state.d.ts +237 -0
  143. package/dist/mcp/explore-session-state.d.ts.map +1 -0
  144. package/dist/mcp/explore-session-state.js +353 -0
  145. package/dist/mcp/explore-session-state.js.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +4 -7
  148. package/dist/mcp/index.js.map +1 -1
  149. package/dist/mcp/proxy.d.ts.map +1 -1
  150. package/dist/mcp/proxy.js +20 -18
  151. package/dist/mcp/proxy.js.map +1 -1
  152. package/dist/mcp/query-pool.d.ts.map +1 -1
  153. package/dist/mcp/query-pool.js +10 -13
  154. package/dist/mcp/query-pool.js.map +1 -1
  155. package/dist/mcp/query-worker.d.ts +1 -1
  156. package/dist/mcp/query-worker.js +1 -1
  157. package/dist/mcp/server-instructions.d.ts +5 -2
  158. package/dist/mcp/server-instructions.d.ts.map +1 -1
  159. package/dist/mcp/server-instructions.js +43 -32
  160. package/dist/mcp/server-instructions.js.map +1 -1
  161. package/dist/mcp/session.d.ts +14 -3
  162. package/dist/mcp/session.d.ts.map +1 -1
  163. package/dist/mcp/session.js +17 -14
  164. package/dist/mcp/session.js.map +1 -1
  165. package/dist/mcp/startup-handshake.d.ts +1 -1
  166. package/dist/mcp/startup-handshake.js +1 -1
  167. package/dist/mcp/tools.d.ts +149 -8
  168. package/dist/mcp/tools.d.ts.map +1 -1
  169. package/dist/mcp/tools.js +4265 -575
  170. package/dist/mcp/tools.js.map +1 -1
  171. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  172. package/dist/resolution/callback-synthesizer.js +166 -0
  173. package/dist/resolution/callback-synthesizer.js.map +1 -1
  174. package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
  175. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/arkts-napi.js +169 -49
  177. package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
  178. package/dist/search/query-utils.d.ts +157 -5
  179. package/dist/search/query-utils.d.ts.map +1 -1
  180. package/dist/search/query-utils.js +1105 -70
  181. package/dist/search/query-utils.js.map +1 -1
  182. package/dist/spec/build/scan.js +1 -1
  183. package/dist/spec/build/scan.js.map +1 -1
  184. package/dist/spec/build/scope-resolver.d.ts +24 -5
  185. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  186. package/dist/spec/build/scope-resolver.js +76 -10
  187. package/dist/spec/build/scope-resolver.js.map +1 -1
  188. package/dist/spec/config.d.ts +8 -0
  189. package/dist/spec/config.d.ts.map +1 -1
  190. package/dist/spec/config.js +3 -0
  191. package/dist/spec/config.js.map +1 -1
  192. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  193. package/dist/spec/evolve/pipeline.js +2 -1
  194. package/dist/spec/evolve/pipeline.js.map +1 -1
  195. package/dist/spec/git/commits.d.ts +8 -3
  196. package/dist/spec/git/commits.d.ts.map +1 -1
  197. package/dist/spec/git/commits.js +12 -11
  198. package/dist/spec/git/commits.js.map +1 -1
  199. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  200. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  201. package/dist/spec/mine/addon/adapter.js +118 -0
  202. package/dist/spec/mine/addon/adapter.js.map +1 -0
  203. package/dist/spec/mine/addon/render.d.ts +20 -0
  204. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  205. package/dist/spec/mine/addon/render.js +41 -0
  206. package/dist/spec/mine/addon/render.js.map +1 -0
  207. package/dist/spec/mine/addon/types.d.ts +70 -0
  208. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  209. package/dist/spec/mine/addon/types.js +14 -0
  210. package/dist/spec/mine/addon/types.js.map +1 -0
  211. package/dist/spec/mine/generator.d.ts +5 -1
  212. package/dist/spec/mine/generator.d.ts.map +1 -1
  213. package/dist/spec/mine/generator.js +69 -7
  214. package/dist/spec/mine/generator.js.map +1 -1
  215. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  216. package/dist/spec/mine/pipeline.js +5 -1
  217. package/dist/spec/mine/pipeline.js.map +1 -1
  218. package/dist/spec/mine/scanner.d.ts +1 -0
  219. package/dist/spec/mine/scanner.d.ts.map +1 -1
  220. package/dist/spec/mine/scanner.js +1 -1
  221. package/dist/spec/mine/scanner.js.map +1 -1
  222. package/dist/spec/types.d.ts +1 -1
  223. package/dist/spec/types.d.ts.map +1 -1
  224. package/dist/types.d.ts +8 -0
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/upgrade/index.d.ts +14 -26
  227. package/dist/upgrade/index.d.ts.map +1 -1
  228. package/dist/upgrade/index.js +28 -123
  229. package/dist/upgrade/index.js.map +1 -1
  230. package/dist/upgrade/remove-binary.d.ts +19 -19
  231. package/dist/upgrade/remove-binary.d.ts.map +1 -1
  232. package/dist/upgrade/remove-binary.js +20 -21
  233. package/dist/upgrade/remove-binary.js.map +1 -1
  234. package/dist/upgrade/update-check.d.ts +4 -3
  235. package/dist/upgrade/update-check.d.ts.map +1 -1
  236. package/dist/upgrade/update-check.js +4 -3
  237. package/dist/upgrade/update-check.js.map +1 -1
  238. package/package.json +13 -9
  239. package/dist/telemetry/index.d.ts +0 -143
  240. package/dist/telemetry/index.d.ts.map +0 -1
  241. package/dist/telemetry/index.js +0 -541
  242. package/dist/telemetry/index.js.map +0 -1
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Addon registry file I/O — read/write `${getHomeGraphDir(repoRoot)}/addons.json`.
4
+ *
5
+ * The registry is a small standalone file, deliberately separate from the
6
+ * spec feature's `configs.json`, so the top-level `homegraph addon` command
7
+ * never touches spec configuration. Writes are atomic (tmp file + rename).
8
+ *
9
+ * @module addons/registry
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.registryFilePath = registryFilePath;
46
+ exports.readRegistry = readRegistry;
47
+ exports.writeRegistry = writeRegistry;
48
+ exports.upsertEntry = upsertEntry;
49
+ exports.removeEntry = removeEntry;
50
+ exports.setEntryEnabled = setEntryEnabled;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const errors_1 = require("../errors");
54
+ const directory_1 = require("../directory");
55
+ /** Registry file name relative to the HomeGraph data dir. */
56
+ const REGISTRY_FILE = 'addons.json';
57
+ /** Absolute path of the registry file for a repository. */
58
+ function registryFilePath(repoRoot) {
59
+ return path.join((0, directory_1.getHomeGraphDir)(repoRoot), REGISTRY_FILE);
60
+ }
61
+ function isValidEntry(value) {
62
+ if (!value || typeof value !== 'object')
63
+ return false;
64
+ const entry = value;
65
+ return (typeof entry.name === 'string' &&
66
+ entry.name.length > 0 &&
67
+ typeof entry.version === 'string' &&
68
+ typeof entry.enabled === 'boolean' &&
69
+ (entry.source === 'registry' || entry.source === 'local'));
70
+ }
71
+ /**
72
+ * Read the registry. A missing file yields an empty registry (the first
73
+ * `install` may be the very first addon operation); a corrupt file is
74
+ * ignored with a warning and treated as empty.
75
+ */
76
+ function readRegistry(repoRoot) {
77
+ const file = registryFilePath(repoRoot);
78
+ let raw;
79
+ try {
80
+ raw = fs.readFileSync(file, 'utf-8');
81
+ }
82
+ catch {
83
+ return { addons: [] };
84
+ }
85
+ try {
86
+ const parsed = JSON.parse(raw);
87
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
88
+ throw new Error('top-level value must be an object');
89
+ }
90
+ const rawAddons = parsed.addons;
91
+ if (!Array.isArray(rawAddons))
92
+ return { addons: [] };
93
+ const addons = rawAddons.filter(isValidEntry);
94
+ if (addons.length !== rawAddons.length) {
95
+ // Entries from a pre-`source` registry are dropped outright (no
96
+ // compatibility path) — surface it so a vanishing addon is diagnosable.
97
+ (0, errors_1.logWarn)(`Dropped ${rawAddons.length - addons.length} entry(ies) from ${file}: ` +
98
+ 'missing "source" (registry format changed — reinstall them with "homegraph addon install")');
99
+ }
100
+ return { addons };
101
+ }
102
+ catch (err) {
103
+ (0, errors_1.logWarn)(`Ignoring ${file}: not a valid addon registry`, {
104
+ file,
105
+ error: err instanceof Error ? err.message : String(err),
106
+ });
107
+ return { addons: [] };
108
+ }
109
+ }
110
+ /**
111
+ * Atomically write the registry (tmp file + rename). Creates the HomeGraph
112
+ * data directory if needed.
113
+ */
114
+ function writeRegistry(repoRoot, registry) {
115
+ const file = registryFilePath(repoRoot);
116
+ fs.mkdirSync(path.dirname(file), { recursive: true });
117
+ const tmp = `${file}.tmp`;
118
+ fs.writeFileSync(tmp, JSON.stringify(registry, null, 2) + '\n', 'utf-8');
119
+ fs.renameSync(tmp, file);
120
+ }
121
+ /**
122
+ * Insert or replace an entry by name (re-install updates version/enabled,
123
+ * preserving the position).
124
+ */
125
+ function upsertEntry(repoRoot, entry) {
126
+ const registry = readRegistry(repoRoot);
127
+ const index = registry.addons.findIndex((e) => e.name === entry.name);
128
+ if (index >= 0) {
129
+ registry.addons[index] = entry;
130
+ }
131
+ else {
132
+ registry.addons.push(entry);
133
+ }
134
+ writeRegistry(repoRoot, registry);
135
+ }
136
+ /**
137
+ * Remove an entry by name. Returns `false` when the name was not registered.
138
+ */
139
+ function removeEntry(repoRoot, name) {
140
+ const registry = readRegistry(repoRoot);
141
+ const next = registry.addons.filter((e) => e.name !== name);
142
+ if (next.length === registry.addons.length)
143
+ return false;
144
+ writeRegistry(repoRoot, { addons: next });
145
+ return true;
146
+ }
147
+ /**
148
+ * Toggle the `enabled` flag of an entry. Returns `false` when the name was
149
+ * not registered.
150
+ */
151
+ function setEntryEnabled(repoRoot, name, enabled) {
152
+ const registry = readRegistry(repoRoot);
153
+ const entry = registry.addons.find((e) => e.name === name);
154
+ if (!entry)
155
+ return false;
156
+ entry.enabled = enabled;
157
+ writeRegistry(repoRoot, registry);
158
+ return true;
159
+ }
160
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/addons/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Minimal semver comparison for addon version gating.
3
+ *
4
+ * HomeGraph deliberately does not depend on a semver library: the versions
5
+ * compared here always come from npm (`npm view`) or a package.json that
6
+ * `validateAddonPackage` already accepted, so they are well-formed semver.
7
+ * Only the comparisons needed for the install gate (`<`, `=`, `>`) are
8
+ * implemented — no ranges, no coercion, no build-metadata significance.
9
+ *
10
+ * @module addons/semver
11
+ */
12
+ /**
13
+ * Compare two semver strings: negative when `a < b`, zero when equal,
14
+ * positive when `a > b`. Build metadata (`+...`) is ignored.
15
+ *
16
+ * A version that does not parse as semver compares equal to anything
17
+ * (returns 0) — callers treat an unparseable version conservatively as
18
+ * "not a downgrade" rather than refusing the install.
19
+ */
20
+ export declare function compareSemver(a: string, b: string): number;
21
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/addons/semver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyCH;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1D"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * Minimal semver comparison for addon version gating.
4
+ *
5
+ * HomeGraph deliberately does not depend on a semver library: the versions
6
+ * compared here always come from npm (`npm view`) or a package.json that
7
+ * `validateAddonPackage` already accepted, so they are well-formed semver.
8
+ * Only the comparisons needed for the install gate (`<`, `=`, `>`) are
9
+ * implemented — no ranges, no coercion, no build-metadata significance.
10
+ *
11
+ * @module addons/semver
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.compareSemver = compareSemver;
15
+ /** x.y.z with optional prerelease and build metadata (build metadata ignored). */
16
+ const SEMVER_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
17
+ /**
18
+ * Compare prerelease identifiers (semver §11.4).
19
+ *
20
+ * `undefined` (no prerelease) sorts after any prerelease: `1.0.0 > 1.0.0-alpha`.
21
+ * Numeric identifiers compare numerically, alphanumeric compare ASCII, and
22
+ * numeric < alphanumeric. A shorter list sorts first when otherwise equal.
23
+ */
24
+ function comparePrerelease(a, b) {
25
+ if (a === undefined && b === undefined)
26
+ return 0;
27
+ if (a === undefined)
28
+ return 1;
29
+ if (b === undefined)
30
+ return -1;
31
+ const as = a.split('.');
32
+ const bs = b.split('.');
33
+ const len = Math.max(as.length, bs.length);
34
+ for (let i = 0; i < len; i++) {
35
+ const x = as[i];
36
+ const y = bs[i];
37
+ if (x === undefined)
38
+ return -1;
39
+ if (y === undefined)
40
+ return 1;
41
+ const xn = /^\d+$/.test(x);
42
+ const yn = /^\d+$/.test(y);
43
+ if (xn && yn) {
44
+ const nx = parseInt(x, 10);
45
+ const ny = parseInt(y, 10);
46
+ if (nx !== ny)
47
+ return nx < ny ? -1 : 1;
48
+ }
49
+ else {
50
+ if (xn !== yn)
51
+ return xn ? -1 : 1;
52
+ if (x !== y)
53
+ return x < y ? -1 : 1;
54
+ }
55
+ }
56
+ return 0;
57
+ }
58
+ /**
59
+ * Compare two semver strings: negative when `a < b`, zero when equal,
60
+ * positive when `a > b`. Build metadata (`+...`) is ignored.
61
+ *
62
+ * A version that does not parse as semver compares equal to anything
63
+ * (returns 0) — callers treat an unparseable version conservatively as
64
+ * "not a downgrade" rather than refusing the install.
65
+ */
66
+ function compareSemver(a, b) {
67
+ const ma = SEMVER_RE.exec(a.trim());
68
+ const mb = SEMVER_RE.exec(b.trim());
69
+ if (!ma || !mb)
70
+ return 0;
71
+ for (let i = 1; i <= 3; i++) {
72
+ const x = parseInt(ma[i], 10);
73
+ const y = parseInt(mb[i], 10);
74
+ if (x !== y)
75
+ return x < y ? -1 : 1;
76
+ }
77
+ return comparePrerelease(ma[4], mb[4]);
78
+ }
79
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/addons/semver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * HomeGraph addon registry types.
3
+ *
4
+ * The addon registry is repository-level state stored in
5
+ * `${getHomeGraphDir(repoRoot)}/addons.json`. The loader only ever loads
6
+ * addons that are explicitly registered AND enabled — scanning installed
7
+ * packages is deliberately unsupported (an addon is executable code; loading
8
+ * it requires an explicit user action).
9
+ *
10
+ * @module addons/types
11
+ */
12
+ /** A single registered addon entry in `addons.json`. */
13
+ export interface AddonRegistryEntry {
14
+ /**
15
+ * npm package name — the registry primary key
16
+ * (e.g. `"@scope/homegraph-jira"`).
17
+ */
18
+ name: string;
19
+ /**
20
+ * Concrete version resolved at install time — never a range, so the
21
+ * registry stays reproducible and audit-friendly.
22
+ */
23
+ version: string;
24
+ /** Whether the addon is loaded at runtime. */
25
+ enabled: boolean;
26
+ /**
27
+ * Where the package was installed from. Drives the install version gate
28
+ * (a local path is re-pointed by npm, never downgraded by us) and
29
+ * `update --latest` (registry packages only — local paths have no dist-tag).
30
+ */
31
+ source: 'registry' | 'local';
32
+ }
33
+ /** Shape of the repository-level addon registry file. */
34
+ export interface AddonRegistry {
35
+ addons: AddonRegistryEntry[];
36
+ }
37
+ /**
38
+ * An addon that passed validation and was loaded at runtime. Consumers
39
+ * filter by export shape (e.g. spec-mine looks for `enrich`/`buildPrompt`);
40
+ * the generic layer does not know about any specific hook.
41
+ */
42
+ export interface LoadedAddon {
43
+ name: string;
44
+ version: string;
45
+ /**
46
+ * Module namespace. A `default` export is merged into the namespace so
47
+ * both `export default { ... }` and named exports work.
48
+ */
49
+ module: Record<string, unknown>;
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/addons/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;CAC9B;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * HomeGraph addon registry types.
4
+ *
5
+ * The addon registry is repository-level state stored in
6
+ * `${getHomeGraphDir(repoRoot)}/addons.json`. The loader only ever loads
7
+ * addons that are explicitly registered AND enabled — scanning installed
8
+ * packages is deliberately unsupported (an addon is executable code; loading
9
+ * it requires an explicit user action).
10
+ *
11
+ * @module addons/types
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/addons/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Addon package validation.
3
+ *
4
+ * An addon package must:
5
+ * 1. have a parseable `package.json`,
6
+ * 2. declare `"homegraph": { "addon": true, "api": 1 }` (contract version),
7
+ * 3. resolve to a loadable entry point (exports / main / index.js),
8
+ * 4. export `enrich` or `buildPrompt` (at least one).
9
+ *
10
+ * Used both at install time (fail fast, before registering) and at runtime
11
+ * (skip with a warning, never crash the host flow).
12
+ *
13
+ * @module addons/validate
14
+ */
15
+ /** Result of validating an installed addon package. */
16
+ export interface AddonValidation {
17
+ ok: boolean;
18
+ /** Human-readable reason when `ok` is false. */
19
+ reason?: string;
20
+ /** Package version from package.json (set when `ok`). */
21
+ version?: string;
22
+ /** Resolved entry point relative to the package dir (set when `ok`). */
23
+ entryPoint?: string;
24
+ /** Loaded module namespace (set when `ok`). */
25
+ module?: Record<string, unknown>;
26
+ }
27
+ /**
28
+ * Resolve the addon entry point from package.json:
29
+ * `exports` (string | { "." | "import" | "default" | nested conditions })
30
+ * → `main` → `index.js`.
31
+ */
32
+ export declare function resolveEntryPoint(pkg: unknown): string | null;
33
+ /**
34
+ * Validate an installed addon package directory. Async because validation
35
+ * loads the module (which also double-checks the export shape).
36
+ */
37
+ export declare function validateAddonPackage(pkgDir: string): Promise<AddonValidation>;
38
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/addons/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAsB7D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CA8E1B"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Addon package validation.
4
+ *
5
+ * An addon package must:
6
+ * 1. have a parseable `package.json`,
7
+ * 2. declare `"homegraph": { "addon": true, "api": 1 }` (contract version),
8
+ * 3. resolve to a loadable entry point (exports / main / index.js),
9
+ * 4. export `enrich` or `buildPrompt` (at least one).
10
+ *
11
+ * Used both at install time (fail fast, before registering) and at runtime
12
+ * (skip with a warning, never crash the host flow).
13
+ *
14
+ * @module addons/validate
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.resolveEntryPoint = resolveEntryPoint;
51
+ exports.validateAddonPackage = validateAddonPackage;
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const url_1 = require("url");
55
+ const dynamic_import_1 = require("./dynamic-import");
56
+ /**
57
+ * Resolve the addon entry point from package.json:
58
+ * `exports` (string | { "." | "import" | "default" | nested conditions })
59
+ * → `main` → `index.js`.
60
+ */
61
+ function resolveEntryPoint(pkg) {
62
+ if (!pkg || typeof pkg !== 'object')
63
+ return null;
64
+ const p = pkg;
65
+ const isNonEmptyString = (v) => typeof v === 'string' && v.length > 0;
66
+ const exports = p.exports;
67
+ if (isNonEmptyString(exports))
68
+ return exports;
69
+ if (exports && typeof exports === 'object') {
70
+ const ex = exports;
71
+ const direct = ex['.'] ?? ex['import'] ?? ex['default'];
72
+ if (isNonEmptyString(direct))
73
+ return direct;
74
+ // Nested condition form: { ".": { "import": ..., "default": ... } }
75
+ if (direct && typeof direct === 'object') {
76
+ const conditions = direct;
77
+ const nested = conditions['import'] ?? conditions['default'] ?? conditions['require'];
78
+ if (isNonEmptyString(nested))
79
+ return nested;
80
+ }
81
+ }
82
+ if (isNonEmptyString(p.main))
83
+ return p.main;
84
+ return 'index.js';
85
+ }
86
+ /**
87
+ * Validate an installed addon package directory. Async because validation
88
+ * loads the module (which also double-checks the export shape).
89
+ */
90
+ async function validateAddonPackage(pkgDir) {
91
+ const pkgJsonPath = path.join(pkgDir, 'package.json');
92
+ let raw;
93
+ try {
94
+ raw = fs.readFileSync(pkgJsonPath, 'utf-8');
95
+ }
96
+ catch {
97
+ return { ok: false, reason: 'package.json not found' };
98
+ }
99
+ let pkg;
100
+ try {
101
+ pkg = JSON.parse(raw);
102
+ }
103
+ catch (err) {
104
+ return {
105
+ ok: false,
106
+ reason: `package.json is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
107
+ };
108
+ }
109
+ if (!pkg || typeof pkg !== 'object') {
110
+ return { ok: false, reason: 'package.json is not a JSON object' };
111
+ }
112
+ const p = pkg;
113
+ const marker = p.homegraph;
114
+ if (!marker || marker.addon !== true) {
115
+ return {
116
+ ok: false,
117
+ reason: 'not a HomeGraph addon (missing "homegraph": { "addon": true })',
118
+ };
119
+ }
120
+ if (marker.api !== 1) {
121
+ return {
122
+ ok: false,
123
+ reason: `incompatible addon API version ${JSON.stringify(marker.api)} (expected 1)`,
124
+ };
125
+ }
126
+ const entryPoint = resolveEntryPoint(pkg);
127
+ if (!entryPoint) {
128
+ return { ok: false, reason: 'cannot resolve entry point (no exports/main)' };
129
+ }
130
+ const entryPath = path.join(pkgDir, entryPoint);
131
+ if (!fs.existsSync(entryPath)) {
132
+ return { ok: false, reason: `entry point not found: ${entryPoint}` };
133
+ }
134
+ let module;
135
+ try {
136
+ // Absolute-path import: the CLI is installed globally, so a bare
137
+ // specifier would resolve against HomeGraph's own node_modules and
138
+ // never find the repository-local addon.
139
+ const imported = await (0, dynamic_import_1.importESM)((0, url_1.pathToFileURL)(entryPath).href);
140
+ const defaultExport = imported.default;
141
+ module =
142
+ defaultExport && typeof defaultExport === 'object'
143
+ ? { ...imported, ...defaultExport }
144
+ : { ...imported };
145
+ }
146
+ catch (err) {
147
+ return {
148
+ ok: false,
149
+ reason: `failed to load entry point: ${err instanceof Error ? err.message : String(err)}`,
150
+ };
151
+ }
152
+ if (typeof module.enrich !== 'function' && typeof module.buildPrompt !== 'function') {
153
+ return {
154
+ ok: false,
155
+ reason: 'addon exports neither enrich nor buildPrompt',
156
+ };
157
+ }
158
+ return {
159
+ ok: true,
160
+ version: typeof p.version === 'string' ? p.version : '0.0.0',
161
+ entryPoint,
162
+ module,
163
+ };
164
+ }
165
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/addons/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './migrate-semantics';
2
+ export * from './migrate-snapshot';
3
+ export { collectPassagesForViewTreeNode, resolveObjectLiteralClass, type PassageEmit, } from './migrate-passage';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/arkui/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.resolveObjectLiteralClass = exports.collectPassagesForViewTreeNode = void 0;
18
+ __exportStar(require("./migrate-semantics"), exports);
19
+ __exportStar(require("./migrate-snapshot"), exports);
20
+ var migrate_passage_1 = require("./migrate-passage");
21
+ Object.defineProperty(exports, "collectPassagesForViewTreeNode", { enumerable: true, get: function () { return migrate_passage_1.collectPassagesForViewTreeNode; } });
22
+ Object.defineProperty(exports, "resolveObjectLiteralClass", { enumerable: true, get: function () { return migrate_passage_1.resolveObjectLiteralClass; } });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/arkui/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,qDAAmC;AACnC,qDAI2B;AAHzB,iIAAA,8BAA8B,OAAA;AAC9B,4HAAA,yBAAyB,OAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ViewTree data-passage classification for ArkUI migrate (spec 0007).
3
+ * Ports migration-graph object-literal + transfer fallbacks with duck typing.
4
+ */
5
+ import { type Scene, type ArkClass, type ArkField } from 'arkanalyzer';
6
+ import type { ViewTreeNode } from 'arkanalyzer';
7
+ import { type PassageType, type ValueTypeKind } from './migrate-semantics';
8
+ export interface PassageEmit {
9
+ fromField?: ArkField;
10
+ fromIsParentComponent: boolean;
11
+ toField: ArkField;
12
+ passageType: PassageType;
13
+ valueType: ValueTypeKind;
14
+ forcesMigration: boolean;
15
+ parentExpression: string;
16
+ /** Child decorator via for explore labels: Prop | Link | data-passage | builder-param */
17
+ via: string;
18
+ }
19
+ /**
20
+ * Resolve anonymous object-literal class from ViewTree `create` attribute
21
+ * (same chain as migration-graph / ViewTreeBuilder).
22
+ */
23
+ export declare function resolveObjectLiteralClass(node: ViewTreeNode, scene: Scene): ArkClass | null;
24
+ /**
25
+ * Emit passage records for a custom-component ViewTree node.
26
+ */
27
+ export declare function collectPassagesForViewTreeNode(node: ViewTreeNode, scene: Scene, parentCls: ArkClass): PassageEmit[];
28
+ //# sourceMappingURL=migrate-passage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-passage.d.ts","sourceRoot":"","sources":["../../src/arkui/migrate-passage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAc,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAkB,MAAM,aAAa,CAAC;AACnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAK7B,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,QAAQ,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,GAAG,EAAE,MAAM,CAAC;CACb;AA6ED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,KAAK,GACX,QAAQ,GAAG,IAAI,CAmDjB;AAyCD;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,QAAQ,GAClB,WAAW,EAAE,CA4Gf"}