mewkit 1.6.8 → 1.7.0

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 (263) hide show
  1. package/dist/commands/init.d.ts +6 -0
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +45 -0
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/migrate.d.ts +21 -0
  6. package/dist/commands/migrate.d.ts.map +1 -0
  7. package/dist/commands/migrate.js +42 -0
  8. package/dist/commands/migrate.js.map +1 -0
  9. package/dist/index.js +48 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/migrate/__tests__/frontmatter-parser.test.d.ts +2 -0
  12. package/dist/migrate/__tests__/frontmatter-parser.test.d.ts.map +1 -0
  13. package/dist/migrate/__tests__/frontmatter-parser.test.js +73 -0
  14. package/dist/migrate/__tests__/frontmatter-parser.test.js.map +1 -0
  15. package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts +2 -0
  16. package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts.map +1 -0
  17. package/dist/migrate/__tests__/md-strip-mewkit.test.js +55 -0
  18. package/dist/migrate/__tests__/md-strip-mewkit.test.js.map +1 -0
  19. package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts +2 -0
  20. package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts.map +1 -0
  21. package/dist/migrate/__tests__/migrate-scope-resolver.test.js +53 -0
  22. package/dist/migrate/__tests__/migrate-scope-resolver.test.js.map +1 -0
  23. package/dist/migrate/__tests__/process-lock.test.d.ts +2 -0
  24. package/dist/migrate/__tests__/process-lock.test.d.ts.map +1 -0
  25. package/dist/migrate/__tests__/process-lock.test.js +63 -0
  26. package/dist/migrate/__tests__/process-lock.test.js.map +1 -0
  27. package/dist/migrate/__tests__/provider-registry.test.d.ts +2 -0
  28. package/dist/migrate/__tests__/provider-registry.test.d.ts.map +1 -0
  29. package/dist/migrate/__tests__/provider-registry.test.js +53 -0
  30. package/dist/migrate/__tests__/provider-registry.test.js.map +1 -0
  31. package/dist/migrate/__tests__/reconciler.test.d.ts +2 -0
  32. package/dist/migrate/__tests__/reconciler.test.d.ts.map +1 -0
  33. package/dist/migrate/__tests__/reconciler.test.js +180 -0
  34. package/dist/migrate/__tests__/reconciler.test.js.map +1 -0
  35. package/dist/migrate/codex-capabilities.d.ts +17 -0
  36. package/dist/migrate/codex-capabilities.d.ts.map +1 -0
  37. package/dist/migrate/codex-capabilities.js +95 -0
  38. package/dist/migrate/codex-capabilities.js.map +1 -0
  39. package/dist/migrate/config-merger/merge-single-sections.d.ts +20 -0
  40. package/dist/migrate/config-merger/merge-single-sections.d.ts.map +1 -0
  41. package/dist/migrate/config-merger/merge-single-sections.js +169 -0
  42. package/dist/migrate/config-merger/merge-single-sections.js.map +1 -0
  43. package/dist/migrate/converters/claude-to-codex-hooks.d.ts +23 -0
  44. package/dist/migrate/converters/claude-to-codex-hooks.d.ts.map +1 -0
  45. package/dist/migrate/converters/claude-to-codex-hooks.js +80 -0
  46. package/dist/migrate/converters/claude-to-codex-hooks.js.map +1 -0
  47. package/dist/migrate/converters/direct-copy.d.ts +3 -0
  48. package/dist/migrate/converters/direct-copy.d.ts.map +1 -0
  49. package/dist/migrate/converters/direct-copy.js +52 -0
  50. package/dist/migrate/converters/direct-copy.js.map +1 -0
  51. package/dist/migrate/converters/fm-strip.d.ts +4 -0
  52. package/dist/migrate/converters/fm-strip.d.ts.map +1 -0
  53. package/dist/migrate/converters/fm-strip.js +36 -0
  54. package/dist/migrate/converters/fm-strip.js.map +1 -0
  55. package/dist/migrate/converters/fm-to-codex-toml.d.ts +19 -0
  56. package/dist/migrate/converters/fm-to-codex-toml.d.ts.map +1 -0
  57. package/dist/migrate/converters/fm-to-codex-toml.js +93 -0
  58. package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -0
  59. package/dist/migrate/converters/fm-to-fm.d.ts +3 -0
  60. package/dist/migrate/converters/fm-to-fm.d.ts.map +1 -0
  61. package/dist/migrate/converters/fm-to-fm.js +142 -0
  62. package/dist/migrate/converters/fm-to-fm.js.map +1 -0
  63. package/dist/migrate/converters/fm-to-json.d.ts +12 -0
  64. package/dist/migrate/converters/fm-to-json.d.ts.map +1 -0
  65. package/dist/migrate/converters/fm-to-json.js +55 -0
  66. package/dist/migrate/converters/fm-to-json.js.map +1 -0
  67. package/dist/migrate/converters/fm-to-yaml.d.ts +4 -0
  68. package/dist/migrate/converters/fm-to-yaml.d.ts.map +1 -0
  69. package/dist/migrate/converters/fm-to-yaml.js +62 -0
  70. package/dist/migrate/converters/fm-to-yaml.js.map +1 -0
  71. package/dist/migrate/converters/gemini-hook-event-map.d.ts +6 -0
  72. package/dist/migrate/converters/gemini-hook-event-map.d.ts.map +1 -0
  73. package/dist/migrate/converters/gemini-hook-event-map.js +41 -0
  74. package/dist/migrate/converters/gemini-hook-event-map.js.map +1 -0
  75. package/dist/migrate/converters/index.d.ts +12 -0
  76. package/dist/migrate/converters/index.d.ts.map +1 -0
  77. package/dist/migrate/converters/index.js +66 -0
  78. package/dist/migrate/converters/index.js.map +1 -0
  79. package/dist/migrate/converters/md-strip.d.ts +19 -0
  80. package/dist/migrate/converters/md-strip.d.ts.map +1 -0
  81. package/dist/migrate/converters/md-strip.js +290 -0
  82. package/dist/migrate/converters/md-strip.js.map +1 -0
  83. package/dist/migrate/converters/md-to-kiro-steering.d.ts +3 -0
  84. package/dist/migrate/converters/md-to-kiro-steering.d.ts.map +1 -0
  85. package/dist/migrate/converters/md-to-kiro-steering.js +90 -0
  86. package/dist/migrate/converters/md-to-kiro-steering.js.map +1 -0
  87. package/dist/migrate/converters/md-to-mdc.d.ts +3 -0
  88. package/dist/migrate/converters/md-to-mdc.d.ts.map +1 -0
  89. package/dist/migrate/converters/md-to-mdc.js +19 -0
  90. package/dist/migrate/converters/md-to-mdc.js.map +1 -0
  91. package/dist/migrate/converters/md-to-toml.d.ts +4 -0
  92. package/dist/migrate/converters/md-to-toml.d.ts.map +1 -0
  93. package/dist/migrate/converters/md-to-toml.js +25 -0
  94. package/dist/migrate/converters/md-to-toml.js.map +1 -0
  95. package/dist/migrate/converters/skill-md.d.ts +3 -0
  96. package/dist/migrate/converters/skill-md.d.ts.map +1 -0
  97. package/dist/migrate/converters/skill-md.js +18 -0
  98. package/dist/migrate/converters/skill-md.js.map +1 -0
  99. package/dist/migrate/discovery/agents-discovery.d.ts +3 -0
  100. package/dist/migrate/discovery/agents-discovery.d.ts.map +1 -0
  101. package/dist/migrate/discovery/agents-discovery.js +42 -0
  102. package/dist/migrate/discovery/agents-discovery.js.map +1 -0
  103. package/dist/migrate/discovery/commands-discovery.d.ts +3 -0
  104. package/dist/migrate/discovery/commands-discovery.d.ts.map +1 -0
  105. package/dist/migrate/discovery/commands-discovery.js +60 -0
  106. package/dist/migrate/discovery/commands-discovery.js.map +1 -0
  107. package/dist/migrate/discovery/config-discovery.d.ts +3 -0
  108. package/dist/migrate/discovery/config-discovery.d.ts.map +1 -0
  109. package/dist/migrate/discovery/config-discovery.js +17 -0
  110. package/dist/migrate/discovery/config-discovery.js.map +1 -0
  111. package/dist/migrate/discovery/exclusions.d.ts +5 -0
  112. package/dist/migrate/discovery/exclusions.d.ts.map +1 -0
  113. package/dist/migrate/discovery/exclusions.js +31 -0
  114. package/dist/migrate/discovery/exclusions.js.map +1 -0
  115. package/dist/migrate/discovery/handlers-json-filter.d.ts +17 -0
  116. package/dist/migrate/discovery/handlers-json-filter.d.ts.map +1 -0
  117. package/dist/migrate/discovery/handlers-json-filter.js +48 -0
  118. package/dist/migrate/discovery/handlers-json-filter.js.map +1 -0
  119. package/dist/migrate/discovery/hooks-discovery.d.ts +7 -0
  120. package/dist/migrate/discovery/hooks-discovery.d.ts.map +1 -0
  121. package/dist/migrate/discovery/hooks-discovery.js +45 -0
  122. package/dist/migrate/discovery/hooks-discovery.js.map +1 -0
  123. package/dist/migrate/discovery/index.d.ts +10 -0
  124. package/dist/migrate/discovery/index.d.ts.map +1 -0
  125. package/dist/migrate/discovery/index.js +10 -0
  126. package/dist/migrate/discovery/index.js.map +1 -0
  127. package/dist/migrate/discovery/rules-discovery.d.ts +3 -0
  128. package/dist/migrate/discovery/rules-discovery.d.ts.map +1 -0
  129. package/dist/migrate/discovery/rules-discovery.js +53 -0
  130. package/dist/migrate/discovery/rules-discovery.js.map +1 -0
  131. package/dist/migrate/discovery/skills-discovery.d.ts +5 -0
  132. package/dist/migrate/discovery/skills-discovery.d.ts.map +1 -0
  133. package/dist/migrate/discovery/skills-discovery.js +73 -0
  134. package/dist/migrate/discovery/skills-discovery.js.map +1 -0
  135. package/dist/migrate/discovery/source-paths.d.ts +13 -0
  136. package/dist/migrate/discovery/source-paths.d.ts.map +1 -0
  137. package/dist/migrate/discovery/source-paths.js +63 -0
  138. package/dist/migrate/discovery/source-paths.js.map +1 -0
  139. package/dist/migrate/frontmatter-parser.d.ts +4 -0
  140. package/dist/migrate/frontmatter-parser.d.ts.map +1 -0
  141. package/dist/migrate/frontmatter-parser.js +99 -0
  142. package/dist/migrate/frontmatter-parser.js.map +1 -0
  143. package/dist/migrate/hooks/codex-features-flag.d.ts +8 -0
  144. package/dist/migrate/hooks/codex-features-flag.d.ts.map +1 -0
  145. package/dist/migrate/hooks/codex-features-flag.js +146 -0
  146. package/dist/migrate/hooks/codex-features-flag.js.map +1 -0
  147. package/dist/migrate/hooks/codex-hook-wrapper.d.ts +10 -0
  148. package/dist/migrate/hooks/codex-hook-wrapper.d.ts.map +1 -0
  149. package/dist/migrate/hooks/codex-hook-wrapper.js +166 -0
  150. package/dist/migrate/hooks/codex-hook-wrapper.js.map +1 -0
  151. package/dist/migrate/hooks/codex-path-safety.d.ts +5 -0
  152. package/dist/migrate/hooks/codex-path-safety.d.ts.map +1 -0
  153. package/dist/migrate/hooks/codex-path-safety.js +99 -0
  154. package/dist/migrate/hooks/codex-path-safety.js.map +1 -0
  155. package/dist/migrate/hooks/codex-toml-installer.d.ts +15 -0
  156. package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -0
  157. package/dist/migrate/hooks/codex-toml-installer.js +124 -0
  158. package/dist/migrate/hooks/codex-toml-installer.js.map +1 -0
  159. package/dist/migrate/hooks/hooks-settings-merger.d.ts +20 -0
  160. package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -0
  161. package/dist/migrate/hooks/hooks-settings-merger.js +273 -0
  162. package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -0
  163. package/dist/migrate/hooks/index.d.ts +7 -0
  164. package/dist/migrate/hooks/index.d.ts.map +1 -0
  165. package/dist/migrate/hooks/index.js +7 -0
  166. package/dist/migrate/hooks/index.js.map +1 -0
  167. package/dist/migrate/hooks/opencode-config-installer.d.ts +31 -0
  168. package/dist/migrate/hooks/opencode-config-installer.d.ts.map +1 -0
  169. package/dist/migrate/hooks/opencode-config-installer.js +116 -0
  170. package/dist/migrate/hooks/opencode-config-installer.js.map +1 -0
  171. package/dist/migrate/index.d.ts +15 -0
  172. package/dist/migrate/index.d.ts.map +1 -0
  173. package/dist/migrate/index.js +15 -0
  174. package/dist/migrate/index.js.map +1 -0
  175. package/dist/migrate/migrate-discover.d.ts +28 -0
  176. package/dist/migrate/migrate-discover.d.ts.map +1 -0
  177. package/dist/migrate/migrate-discover.js +52 -0
  178. package/dist/migrate/migrate-discover.js.map +1 -0
  179. package/dist/migrate/migrate-mode-resolver.d.ts +10 -0
  180. package/dist/migrate/migrate-mode-resolver.d.ts.map +1 -0
  181. package/dist/migrate/migrate-mode-resolver.js +123 -0
  182. package/dist/migrate/migrate-mode-resolver.js.map +1 -0
  183. package/dist/migrate/migrate-orchestrator.d.ts +9 -0
  184. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -0
  185. package/dist/migrate/migrate-orchestrator.js +204 -0
  186. package/dist/migrate/migrate-orchestrator.js.map +1 -0
  187. package/dist/migrate/migrate-scope-resolver.d.ts +19 -0
  188. package/dist/migrate/migrate-scope-resolver.d.ts.map +1 -0
  189. package/dist/migrate/migrate-scope-resolver.js +81 -0
  190. package/dist/migrate/migrate-scope-resolver.js.map +1 -0
  191. package/dist/migrate/migrate-ui-summary.d.ts +14 -0
  192. package/dist/migrate/migrate-ui-summary.d.ts.map +1 -0
  193. package/dist/migrate/migrate-ui-summary.js +65 -0
  194. package/dist/migrate/migrate-ui-summary.js.map +1 -0
  195. package/dist/migrate/model-taxonomy.d.ts +16 -0
  196. package/dist/migrate/model-taxonomy.d.ts.map +1 -0
  197. package/dist/migrate/model-taxonomy.js +58 -0
  198. package/dist/migrate/model-taxonomy.js.map +1 -0
  199. package/dist/migrate/portable-installer.d.ts +14 -0
  200. package/dist/migrate/portable-installer.d.ts.map +1 -0
  201. package/dist/migrate/portable-installer.js +159 -0
  202. package/dist/migrate/portable-installer.js.map +1 -0
  203. package/dist/migrate/provider-overrides.d.ts +8 -0
  204. package/dist/migrate/provider-overrides.d.ts.map +1 -0
  205. package/dist/migrate/provider-overrides.js +40 -0
  206. package/dist/migrate/provider-overrides.js.map +1 -0
  207. package/dist/migrate/provider-registry-utils.d.ts +23 -0
  208. package/dist/migrate/provider-registry-utils.d.ts.map +1 -0
  209. package/dist/migrate/provider-registry-utils.js +67 -0
  210. package/dist/migrate/provider-registry-utils.js.map +1 -0
  211. package/dist/migrate/provider-registry.d.ts +5 -0
  212. package/dist/migrate/provider-registry.d.ts.map +1 -0
  213. package/dist/migrate/provider-registry.js +327 -0
  214. package/dist/migrate/provider-registry.js.map +1 -0
  215. package/dist/migrate/reconcile/checksum-utils.d.ts +8 -0
  216. package/dist/migrate/reconcile/checksum-utils.d.ts.map +1 -0
  217. package/dist/migrate/reconcile/checksum-utils.js +32 -0
  218. package/dist/migrate/reconcile/checksum-utils.js.map +1 -0
  219. package/dist/migrate/reconcile/conflict-resolver.d.ts +8 -0
  220. package/dist/migrate/reconcile/conflict-resolver.d.ts.map +1 -0
  221. package/dist/migrate/reconcile/conflict-resolver.js +59 -0
  222. package/dist/migrate/reconcile/conflict-resolver.js.map +1 -0
  223. package/dist/migrate/reconcile/diff-display.d.ts +6 -0
  224. package/dist/migrate/reconcile/diff-display.d.ts.map +1 -0
  225. package/dist/migrate/reconcile/diff-display.js +40 -0
  226. package/dist/migrate/reconcile/diff-display.js.map +1 -0
  227. package/dist/migrate/reconcile/index.d.ts +10 -0
  228. package/dist/migrate/reconcile/index.d.ts.map +1 -0
  229. package/dist/migrate/reconcile/index.js +10 -0
  230. package/dist/migrate/reconcile/index.js.map +1 -0
  231. package/dist/migrate/reconcile/output-sanitizer.d.ts +3 -0
  232. package/dist/migrate/reconcile/output-sanitizer.d.ts.map +1 -0
  233. package/dist/migrate/reconcile/output-sanitizer.js +42 -0
  234. package/dist/migrate/reconcile/output-sanitizer.js.map +1 -0
  235. package/dist/migrate/reconcile/portable-registry.d.ts +142 -0
  236. package/dist/migrate/reconcile/portable-registry.d.ts.map +1 -0
  237. package/dist/migrate/reconcile/portable-registry.js +224 -0
  238. package/dist/migrate/reconcile/portable-registry.js.map +1 -0
  239. package/dist/migrate/reconcile/process-lock.d.ts +15 -0
  240. package/dist/migrate/reconcile/process-lock.d.ts.map +1 -0
  241. package/dist/migrate/reconcile/process-lock.js +77 -0
  242. package/dist/migrate/reconcile/process-lock.js.map +1 -0
  243. package/dist/migrate/reconcile/reconcile-state-builders.d.ts +24 -0
  244. package/dist/migrate/reconcile/reconcile-state-builders.d.ts.map +1 -0
  245. package/dist/migrate/reconcile/reconcile-state-builders.js +185 -0
  246. package/dist/migrate/reconcile/reconcile-state-builders.js.map +1 -0
  247. package/dist/migrate/reconcile/reconcile-types.d.ts +113 -0
  248. package/dist/migrate/reconcile/reconcile-types.d.ts.map +1 -0
  249. package/dist/migrate/reconcile/reconcile-types.js +42 -0
  250. package/dist/migrate/reconcile/reconcile-types.js.map +1 -0
  251. package/dist/migrate/reconcile/reconciler.d.ts +3 -0
  252. package/dist/migrate/reconcile/reconciler.d.ts.map +1 -0
  253. package/dist/migrate/reconcile/reconciler.js +445 -0
  254. package/dist/migrate/reconcile/reconciler.js.map +1 -0
  255. package/dist/migrate/skill-directory-installer.d.ts +23 -0
  256. package/dist/migrate/skill-directory-installer.d.ts.map +1 -0
  257. package/dist/migrate/skill-directory-installer.js +55 -0
  258. package/dist/migrate/skill-directory-installer.js.map +1 -0
  259. package/dist/migrate/types.d.ts +172 -0
  260. package/dist/migrate/types.d.ts.map +1 -0
  261. package/dist/migrate/types.js +45 -0
  262. package/dist/migrate/types.js.map +1 -0
  263. package/package.json +10 -2
@@ -0,0 +1,445 @@
1
+ // Vendored from claudekit-cli (MIT). Source: src/commands/portable/reconciler.ts
2
+ // Pure reconciler module — zero I/O, fully testable.
3
+ // Mewkit-side adaptation: dropped manifest-driven rename/path-migration entry points
4
+ // (greenfield install — no v1→v2 migrations to encode). The 8-case decision matrix is
5
+ // ported verbatim. Reconciler stays pure (no fs, no path I/O).
6
+ import path from "node:path";
7
+ import { UNKNOWN_CHECKSUM, getReasonCopy, isUnknownChecksum, normalizeChecksum, } from "./reconcile-types.js";
8
+ function normalizePortablePath(value) {
9
+ const asPosix = value.replace(/\\/g, "/");
10
+ const normalized = path.posix.normalize(asPosix);
11
+ if (normalized === ".")
12
+ return "";
13
+ return normalized.replace(/^\.\/+/, "");
14
+ }
15
+ function makeProviderConfigKey(provider, global) {
16
+ return JSON.stringify([provider, global]);
17
+ }
18
+ function makeItemTypeKey(item, type) {
19
+ return JSON.stringify([item, type]);
20
+ }
21
+ function makeRegistryIdentityKey(entry) {
22
+ return JSON.stringify([entry.item, entry.type, entry.provider, entry.global]);
23
+ }
24
+ function makeDirStateKey(provider, type, global) {
25
+ return JSON.stringify([provider, type, global]);
26
+ }
27
+ function dedupeProviderConfigs(providerConfigs) {
28
+ const seen = new Set();
29
+ const unique = [];
30
+ for (const config of providerConfigs) {
31
+ const key = makeProviderConfigKey(config.provider, config.global);
32
+ if (seen.has(key))
33
+ continue;
34
+ seen.add(key);
35
+ unique.push(config);
36
+ }
37
+ return unique;
38
+ }
39
+ function buildTargetStateIndex(targetStates) {
40
+ const index = new Map();
41
+ for (const [mapPath, state] of targetStates) {
42
+ const normalizedMapPath = normalizePortablePath(mapPath);
43
+ if (normalizedMapPath && !index.has(normalizedMapPath))
44
+ index.set(normalizedMapPath, state);
45
+ const normalizedStatePath = normalizePortablePath(state.path);
46
+ if (normalizedStatePath && !index.has(normalizedStatePath))
47
+ index.set(normalizedStatePath, state);
48
+ }
49
+ return index;
50
+ }
51
+ function buildDirStateIndex(dirStates) {
52
+ const index = new Map();
53
+ for (const ds of dirStates) {
54
+ index.set(makeDirStateKey(ds.provider, ds.type, ds.global), ds);
55
+ }
56
+ return index;
57
+ }
58
+ function lookupTargetState(targetStateIndex, pathValue) {
59
+ return targetStateIndex.get(normalizePortablePath(pathValue));
60
+ }
61
+ function getManagedSectionKind(type) {
62
+ if (type === "agent")
63
+ return "agent";
64
+ if (type === "rules")
65
+ return "rule";
66
+ if (type === "config")
67
+ return "config";
68
+ return null;
69
+ }
70
+ function getExpectedTargetChecksum(source, provider) {
71
+ return normalizeChecksum(source.targetChecksums?.[provider] ?? source.convertedChecksums[provider]);
72
+ }
73
+ function getCurrentTargetChecksum(targetState, registryEntry) {
74
+ if (!targetState)
75
+ return UNKNOWN_CHECKSUM;
76
+ if (!targetState.exists)
77
+ return UNKNOWN_CHECKSUM;
78
+ if (targetState.sectionChecksums && registryEntry.ownedSections?.length) {
79
+ const sectionKind = getManagedSectionKind(registryEntry.type);
80
+ const sectionName = registryEntry.ownedSections[0];
81
+ if (sectionKind && sectionName) {
82
+ return normalizeChecksum(targetState.sectionChecksums[`${sectionKind}:${sectionName}`]);
83
+ }
84
+ return UNKNOWN_CHECKSUM;
85
+ }
86
+ return normalizeChecksum(targetState.currentChecksum);
87
+ }
88
+ function getTargetChangeState(targetState, registryEntry, registeredTargetChecksum) {
89
+ if (!targetState)
90
+ return "unknown";
91
+ if (!targetState.exists)
92
+ return "deleted";
93
+ const currentTargetChecksum = getCurrentTargetChecksum(targetState, registryEntry);
94
+ if (isUnknownChecksum(currentTargetChecksum) || isUnknownChecksum(registeredTargetChecksum)) {
95
+ return "unknown";
96
+ }
97
+ return currentTargetChecksum === registeredTargetChecksum ? "unchanged" : "changed";
98
+ }
99
+ function dedupeActions(actions) {
100
+ const seen = new Set();
101
+ const deduped = [];
102
+ for (const action of actions) {
103
+ const key = JSON.stringify([
104
+ action.action, action.item, action.type, action.provider, action.global,
105
+ normalizePortablePath(action.targetPath),
106
+ ]);
107
+ if (seen.has(key))
108
+ continue;
109
+ seen.add(key);
110
+ deduped.push(action);
111
+ }
112
+ return deduped;
113
+ }
114
+ function suppressOverlappingActions(actions) {
115
+ const byIdentity = new Map();
116
+ for (const action of actions) {
117
+ const key = makeRegistryIdentityKey(action);
118
+ const list = byIdentity.get(key) ?? [];
119
+ list.push(action);
120
+ byIdentity.set(key, list);
121
+ }
122
+ const filtered = [];
123
+ for (const action of actions) {
124
+ const key = makeRegistryIdentityKey(action);
125
+ const actionsForKey = byIdentity.get(key) ?? [];
126
+ const hasDelete = actionsForKey.some((a) => a.action === "delete");
127
+ if (!hasDelete) {
128
+ filtered.push(action);
129
+ continue;
130
+ }
131
+ if (action.action === "delete" || action.action === "install")
132
+ filtered.push(action);
133
+ }
134
+ return filtered;
135
+ }
136
+ function applyEmptyDirOverride(actions, dirStates, respectDeletions) {
137
+ if (dirStates.length === 0)
138
+ return { actions, banners: [] };
139
+ const dirIndex = buildDirStateIndex(dirStates);
140
+ const banners = [];
141
+ const flippedGroups = new Map();
142
+ for (const action of actions) {
143
+ if (action.action !== "skip" || action.reasonCode !== "user-deleted-respected")
144
+ continue;
145
+ const key = makeDirStateKey(action.provider, action.type, action.global);
146
+ const dirState = dirIndex.get(key);
147
+ if (!dirState?.isEmpty)
148
+ continue;
149
+ if (respectDeletions) {
150
+ const existing = flippedGroups.get(key);
151
+ if (existing)
152
+ existing.count++;
153
+ else
154
+ flippedGroups.set(key, { dirState, count: 1 });
155
+ continue;
156
+ }
157
+ action.action = "install";
158
+ action.reasonCode = "target-dir-empty-reinstall";
159
+ action.reasonCopy = getReasonCopy("target-dir-empty-reinstall");
160
+ action.reason = action.reasonCopy;
161
+ const existing = flippedGroups.get(key);
162
+ if (existing)
163
+ existing.count++;
164
+ else
165
+ flippedGroups.set(key, { dirState, count: 1 });
166
+ }
167
+ for (const [, { dirState, count }] of flippedGroups) {
168
+ if (respectDeletions) {
169
+ banners.push({
170
+ kind: "empty-dir-respected",
171
+ provider: dirState.provider, type: dirState.type, global: dirState.global,
172
+ path: dirState.path, itemCount: count,
173
+ message: `Detected empty ${dirState.path} — respecting your deletions (${count} items skipped).`,
174
+ });
175
+ }
176
+ else {
177
+ banners.push({
178
+ kind: "empty-dir",
179
+ provider: dirState.provider, type: dirState.type, global: dirState.global,
180
+ path: dirState.path, itemCount: count,
181
+ message: `Detected empty ${dirState.path} — ${count} item${count === 1 ? "" : "s"} will be reinstalled. Uncheck any to skip.`,
182
+ });
183
+ }
184
+ }
185
+ return { actions, banners };
186
+ }
187
+ export function reconcile(input) {
188
+ const actions = [];
189
+ const targetStateIndex = buildTargetStateIndex(input.targetStates);
190
+ const uniqueProviderConfigs = dedupeProviderConfigs(input.providerConfigs);
191
+ const deletedIdentityKeys = new Set();
192
+ for (const sourceItem of input.sourceItems) {
193
+ for (const providerConfig of uniqueProviderConfigs) {
194
+ actions.push(determineAction(sourceItem, providerConfig, input, targetStateIndex, deletedIdentityKeys));
195
+ }
196
+ }
197
+ actions.push(...detectOrphans(input));
198
+ const normalizedActions = suppressOverlappingActions(dedupeActions(actions));
199
+ const dirStates = input.typeDirectoryStates ?? [];
200
+ const respectDeletions = input.respectDeletions ?? false;
201
+ const { actions: finalActions, banners } = applyEmptyDirOverride(normalizedActions, dirStates, respectDeletions);
202
+ return buildPlan(finalActions, banners);
203
+ }
204
+ function determineAction(source, providerConfig, input, targetStateIndex, deletedIdentityKeys) {
205
+ let registryEntry = findRegistryEntry(source, providerConfig, input.registry);
206
+ const identityKey = makeRegistryIdentityKey({
207
+ item: source.item, type: source.type,
208
+ provider: providerConfig.provider, global: providerConfig.global,
209
+ });
210
+ if (registryEntry && deletedIdentityKeys.has(identityKey))
211
+ registryEntry = null;
212
+ const isDirectoryItem = source.type === "skill";
213
+ const common = {
214
+ item: source.item,
215
+ type: source.type,
216
+ provider: providerConfig.provider,
217
+ global: providerConfig.global,
218
+ targetPath: "",
219
+ isDirectoryItem: isDirectoryItem || undefined,
220
+ };
221
+ const convertedChecksumRaw = source.convertedChecksums[providerConfig.provider];
222
+ const convertedChecksum = normalizeChecksum(convertedChecksumRaw);
223
+ const expectedTargetChecksum = getExpectedTargetChecksum(source, providerConfig.provider);
224
+ if (!convertedChecksumRaw || isUnknownChecksum(convertedChecksumRaw)) {
225
+ if (registryEntry) {
226
+ common.targetPath = registryEntry.path;
227
+ const code = "provider-checksum-unavailable";
228
+ return {
229
+ ...common, action: "skip",
230
+ reason: "Provider checksum unavailable — cannot verify safely",
231
+ reasonCode: code, reasonCopy: getReasonCopy(code),
232
+ sourceChecksum: UNKNOWN_CHECKSUM,
233
+ registeredSourceChecksum: normalizeChecksum(registryEntry.sourceChecksum),
234
+ registeredTargetChecksum: normalizeChecksum(registryEntry.targetChecksum),
235
+ };
236
+ }
237
+ const itemExistsElsewhere = input.registry.installations.some((i) => i.item === source.item && i.type === source.type);
238
+ const code = itemExistsElsewhere ? "new-provider-for-item" : "new-item";
239
+ return {
240
+ ...common, action: "install",
241
+ reason: itemExistsElsewhere ? "New provider for existing item" : "New item, not previously installed",
242
+ reasonCode: code, reasonCopy: getReasonCopy(code),
243
+ sourceChecksum: UNKNOWN_CHECKSUM,
244
+ };
245
+ }
246
+ if (!registryEntry) {
247
+ const itemExistsElsewhere = input.registry.installations.some((i) => i.item === source.item && i.type === source.type);
248
+ const code = itemExistsElsewhere ? "new-provider-for-item" : "new-item";
249
+ return {
250
+ ...common, action: "install",
251
+ reason: itemExistsElsewhere ? "New provider for existing item" : "New item, not previously installed",
252
+ reasonCode: code, reasonCopy: getReasonCopy(code),
253
+ sourceChecksum: convertedChecksum,
254
+ };
255
+ }
256
+ common.targetPath = registryEntry.path;
257
+ const registeredSourceChecksum = normalizeChecksum(registryEntry.sourceChecksum);
258
+ const registeredTargetChecksum = normalizeChecksum(registryEntry.targetChecksum);
259
+ const targetState = lookupTargetState(targetStateIndex, registryEntry.path);
260
+ const currentTargetChecksum = getCurrentTargetChecksum(targetState, registryEntry);
261
+ const targetMatchesExpectedOutput = targetState?.exists === true &&
262
+ !isUnknownChecksum(expectedTargetChecksum) &&
263
+ currentTargetChecksum === expectedTargetChecksum;
264
+ if (isUnknownChecksum(registeredSourceChecksum)) {
265
+ if (targetMatchesExpectedOutput) {
266
+ const code = "target-up-to-date-backfill";
267
+ return {
268
+ ...common, action: "skip",
269
+ reason: "Target up-to-date after registry upgrade — checksums will be backfilled",
270
+ reasonCode: code, reasonCopy: getReasonCopy(code),
271
+ sourceChecksum: convertedChecksum, currentTargetChecksum, backfillRegistry: true,
272
+ };
273
+ }
274
+ if (!targetState || !targetState.exists) {
275
+ const code = "registry-upgrade-reinstall";
276
+ return {
277
+ ...common, action: "install",
278
+ reason: "Target deleted — reinstalling after registry upgrade",
279
+ reasonCode: code, reasonCopy: getReasonCopy(code),
280
+ sourceChecksum: convertedChecksum,
281
+ };
282
+ }
283
+ const code = "registry-upgrade-heal";
284
+ return {
285
+ ...common, action: "update",
286
+ reason: "Healing stale target after registry upgrade",
287
+ reasonCode: code, reasonCopy: getReasonCopy(code),
288
+ sourceChecksum: convertedChecksum, currentTargetChecksum,
289
+ };
290
+ }
291
+ if (targetMatchesExpectedOutput &&
292
+ (convertedChecksum !== registeredSourceChecksum ||
293
+ currentTargetChecksum !== registeredTargetChecksum)) {
294
+ const code = "target-up-to-date-backfill";
295
+ return {
296
+ ...common, action: "skip",
297
+ reason: "Target up-to-date — registry checksums will be backfilled",
298
+ reasonCode: code, reasonCopy: getReasonCopy(code),
299
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
300
+ currentTargetChecksum, registeredTargetChecksum, backfillRegistry: true,
301
+ };
302
+ }
303
+ const sourceChanged = convertedChecksum !== registeredSourceChecksum;
304
+ const targetChangeState = getTargetChangeState(targetState, registryEntry, registeredTargetChecksum);
305
+ if (targetChangeState === "deleted") {
306
+ const forceReinstall = input.force && !sourceChanged;
307
+ if (sourceChanged) {
308
+ const code = "target-deleted-source-changed";
309
+ return {
310
+ ...common, action: "install",
311
+ reason: "Target was deleted, mewkit has updates — reinstalling",
312
+ reasonCode: code, reasonCopy: getReasonCopy(code),
313
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
314
+ };
315
+ }
316
+ if (forceReinstall) {
317
+ const code = "force-reinstall";
318
+ return {
319
+ ...common, action: "install",
320
+ reason: "Force reinstall (target was deleted)",
321
+ reasonCode: code, reasonCopy: getReasonCopy(code),
322
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
323
+ };
324
+ }
325
+ const code = "user-deleted-respected";
326
+ return {
327
+ ...common, action: "skip",
328
+ reason: "Target was deleted by user, mewkit unchanged — respecting deletion",
329
+ reasonCode: code, reasonCopy: getReasonCopy(code),
330
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
331
+ };
332
+ }
333
+ if (targetChangeState === "unknown") {
334
+ const code = sourceChanged
335
+ ? "target-state-unknown-source-changed"
336
+ : "target-state-unknown";
337
+ return {
338
+ ...common,
339
+ action: sourceChanged ? "conflict" : "skip",
340
+ reason: sourceChanged
341
+ ? "Target state unavailable while mewkit changed — manual review required"
342
+ : "Target state unavailable, mewkit unchanged — preserving target",
343
+ reasonCode: code, reasonCopy: getReasonCopy(code),
344
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
345
+ currentTargetChecksum, registeredTargetChecksum,
346
+ };
347
+ }
348
+ const targetChanged = targetChangeState === "changed";
349
+ if (!sourceChanged && !targetChanged) {
350
+ const code = "no-changes";
351
+ return {
352
+ ...common, action: "skip", reason: "No changes",
353
+ reasonCode: code, reasonCopy: getReasonCopy(code),
354
+ sourceChecksum: convertedChecksum, currentTargetChecksum,
355
+ };
356
+ }
357
+ if (!sourceChanged && targetChanged) {
358
+ if (input.force) {
359
+ return {
360
+ ...common, action: "install",
361
+ reason: "Force overwrite (user edits)",
362
+ reasonCode: "force-overwrite",
363
+ reasonCopy: getReasonCopy("force-overwrite"),
364
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
365
+ currentTargetChecksum, registeredTargetChecksum,
366
+ };
367
+ }
368
+ const code = "user-edits-preserved";
369
+ return {
370
+ ...common, action: "skip",
371
+ reason: "User edited, mewkit unchanged — preserving edits",
372
+ reasonCode: code, reasonCopy: getReasonCopy(code),
373
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
374
+ currentTargetChecksum, registeredTargetChecksum,
375
+ };
376
+ }
377
+ if (sourceChanged && !targetChanged) {
378
+ const code = "source-changed";
379
+ return {
380
+ ...common, action: "update",
381
+ reason: "mewkit updated, no user edits — safe overwrite",
382
+ reasonCode: code, reasonCopy: getReasonCopy(code),
383
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
384
+ currentTargetChecksum, registeredTargetChecksum,
385
+ };
386
+ }
387
+ const code = "both-changed";
388
+ return {
389
+ ...common, action: "conflict",
390
+ reason: "Both mewkit and user modified this item",
391
+ reasonCode: code, reasonCopy: getReasonCopy(code),
392
+ sourceChecksum: convertedChecksum, registeredSourceChecksum,
393
+ currentTargetChecksum, registeredTargetChecksum,
394
+ };
395
+ }
396
+ function findRegistryEntry(source, providerConfig, registry) {
397
+ const exactMatch = registry.installations.find((i) => i.item === source.item &&
398
+ i.type === source.type &&
399
+ i.provider === providerConfig.provider &&
400
+ i.global === providerConfig.global) || null;
401
+ if (exactMatch)
402
+ return exactMatch;
403
+ if (source.type === "config") {
404
+ return (registry.installations.find((i) => i.type === "config" &&
405
+ i.provider === providerConfig.provider &&
406
+ i.global === providerConfig.global) || null);
407
+ }
408
+ return null;
409
+ }
410
+ function detectOrphans(input) {
411
+ const actions = [];
412
+ const sourceItemKeys = new Set(input.sourceItems.map((s) => makeItemTypeKey(s.item, s.type)));
413
+ const activeProviderKeys = new Set(input.providerConfigs.map((p) => makeProviderConfigKey(p.provider, p.global)));
414
+ const hasConfigSource = input.sourceItems.some((s) => s.type === "config");
415
+ for (const entry of input.registry.installations) {
416
+ const sourceItemKey = makeItemTypeKey(entry.item, entry.type);
417
+ const providerKey = makeProviderConfigKey(entry.provider, entry.global);
418
+ if (!activeProviderKeys.has(providerKey))
419
+ continue;
420
+ if (entry.installSource === "manual")
421
+ continue;
422
+ if (entry.type === "skill")
423
+ continue;
424
+ if (entry.type === "config" && hasConfigSource)
425
+ continue;
426
+ if (!sourceItemKeys.has(sourceItemKey)) {
427
+ const code = "source-removed-orphan";
428
+ actions.push({
429
+ action: "delete",
430
+ item: entry.item, type: entry.type, provider: entry.provider, global: entry.global,
431
+ targetPath: entry.path,
432
+ reason: "Item no longer in mewkit source — orphaned",
433
+ reasonCode: code, reasonCopy: getReasonCopy(code),
434
+ });
435
+ }
436
+ }
437
+ return actions;
438
+ }
439
+ function buildPlan(actions, banners) {
440
+ const summary = { install: 0, update: 0, skip: 0, conflict: 0, delete: 0 };
441
+ for (const action of actions)
442
+ summary[action.action]++;
443
+ return { actions, summary, hasConflicts: summary.conflict > 0, banners };
444
+ }
445
+ //# sourceMappingURL=reconciler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciler.js","sourceRoot":"","sources":["../../../src/migrate/reconcile/reconciler.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,qDAAqD;AACrD,qFAAqF;AACrF,sFAAsF;AACtF,+DAA+D;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACN,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAe9B,SAAS,qBAAqB,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB,EAAE,MAAe;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,IAA6B;IACnE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAKhC;IACA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,IAA6B,EAAE,MAAe;IACxF,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,qBAAqB,CAC7B,eAAyC;IAEzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAC7B,YAA0C;IAE1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7C,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,iBAAiB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAC5F,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,mBAAmB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;IACtD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CACzB,gBAA8C,EAC9C,SAAiB;IAEjB,OAAO,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,qBAAqB,CAAC,IAA6B;IAC3D,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAuB,EAAE,QAAgB;IAC3E,OAAO,iBAAiB,CACvB,MAAM,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CACzE,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAChC,WAAwC,EACxC,aAAqC;IAErC,IAAI,CAAC,WAAW;QAAE,OAAO,gBAAgB,CAAC;IAC1C,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,gBAAgB,CAAC;IAEjD,IAAI,WAAW,CAAC,gBAAgB,IAAI,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QACzE,MAAM,WAAW,GAAG,qBAAqB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;YAChC,OAAO,iBAAiB,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,WAAW,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAED,OAAO,iBAAiB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB,CAC5B,WAAwC,EACxC,aAAqC,EACrC,wBAAgC;IAEhC,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACnF,IAAI,iBAAiB,CAAC,qBAAqB,CAAC,IAAI,iBAAiB,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC7F,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,qBAAqB,KAAK,wBAAwB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACrF,CAAC;AAED,SAAS,aAAa,CAAC,OAA0B;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM;YACvE,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC;SACxC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,0BAA0B,CAAC,OAA0B;IAC7D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;IACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,SAAS;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,qBAAqB,CAC7B,OAA0B,EAC1B,SAAiC,EACjC,gBAAyB;IAEzB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE5D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6D,CAAC;IAE3F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,wBAAwB;YAAE,SAAS;QAEzF,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,OAAO;YAAE,SAAS;QAEjC,IAAI,gBAAgB,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,QAAQ;gBAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;;gBAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,SAAS;QACV,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,CAAC,UAAU,GAAG,4BAA4B,CAAC;QACjD,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC,4BAA4B,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;QAElC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;;YAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC;QACrD,IAAI,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACzE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK;gBACrC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,IAAI,iCAAiC,KAAK,kBAAkB;aAChG,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACzE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK;gBACrC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,IAAI,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,4CAA4C;aAC7H,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC9C,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnE,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC3E,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC5C,KAAK,MAAM,cAAc,IAAI,qBAAqB,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CACX,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CACzF,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAClD,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC;IACzD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAC/D,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,CAC9C,CAAC;IAEF,OAAO,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CACvB,MAAuB,EACvB,cAAsC,EACtC,KAAqB,EACrB,gBAA8C,EAC9C,mBAAgC;IAEhC,IAAI,aAAa,GAAG,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,uBAAuB,CAAC;QAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI;QACpC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM;KAChE,CAAC,CAAC;IACH,IAAI,aAAa,IAAI,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,aAAa,GAAG,IAAI,CAAC;IAEhF,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;IAEhD,MAAM,MAAM,GAAG;QACd,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,UAAU,EAAE,EAAE;QACd,eAAe,EAAE,eAAe,IAAI,SAAS;KAC7C,CAAC;IAEF,MAAM,oBAAoB,GAAG,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAChF,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAClE,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE1F,IAAI,CAAC,oBAAoB,IAAI,iBAAiB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtE,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC;YACvC,MAAM,IAAI,GAAoB,+BAA+B,CAAC;YAC9D,OAAO;gBACN,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;gBACzB,MAAM,EAAE,sDAAsD;gBAC9D,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;gBACjD,cAAc,EAAE,gBAAgB;gBAChC,wBAAwB,EAAE,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC;gBACzE,wBAAwB,EAAE,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC;aACzE,CAAC;QACH,CAAC;QAED,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAC5D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CACvD,CAAC;QACF,MAAM,IAAI,GAAoB,mBAAmB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;QACzF,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;YAC5B,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,oCAAoC;YACrG,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,gBAAgB;SAChC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAC5D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CACvD,CAAC;QACF,MAAM,IAAI,GAAoB,mBAAmB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;QACzF,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;YAC5B,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,oCAAoC;YACrG,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB;SACjC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC;IACvC,MAAM,wBAAwB,GAAG,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACjF,MAAM,wBAAwB,GAAG,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACjF,MAAM,WAAW,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACnF,MAAM,2BAA2B,GAChC,WAAW,EAAE,MAAM,KAAK,IAAI;QAC5B,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;QAC1C,qBAAqB,KAAK,sBAAsB,CAAC;IAElD,IAAI,iBAAiB,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACjD,IAAI,2BAA2B,EAAE,CAAC;YACjC,MAAM,IAAI,GAAoB,4BAA4B,CAAC;YAC3D,OAAO;gBACN,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;gBACzB,MAAM,EAAE,yEAAyE;gBACjF,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;gBACjD,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,IAAI;aAChF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,GAAoB,4BAA4B,CAAC;YAC3D,OAAO;gBACN,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;gBAC5B,MAAM,EAAE,sDAAsD;gBAC9D,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;gBACjD,cAAc,EAAE,iBAAiB;aACjC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAoB,uBAAuB,CAAC;QACtD,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ;YAC3B,MAAM,EAAE,6CAA6C;YACrD,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,qBAAqB;SACxD,CAAC;IACH,CAAC;IAED,IACC,2BAA2B;QAC3B,CAAC,iBAAiB,KAAK,wBAAwB;YAC9C,qBAAqB,KAAK,wBAAwB,CAAC,EACnD,CAAC;QACF,MAAM,IAAI,GAAoB,4BAA4B,CAAC;QAC3D,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;YACzB,MAAM,EAAE,2DAA2D;YACnE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;YAC3D,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,IAAI;SACvE,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,KAAK,wBAAwB,CAAC;IACrE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,WAAW,EAAE,aAAa,EAAE,wBAAwB,CAAC,CAAC;IAErG,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC;QAErD,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,GAAoB,+BAA+B,CAAC;YAC9D,OAAO;gBACN,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;gBAC5B,MAAM,EAAE,uDAAuD;gBAC/D,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;gBACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;aAC3D,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,GAAoB,iBAAiB,CAAC;YAChD,OAAO;gBACN,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;gBAC5B,MAAM,EAAE,sCAAsC;gBAC9C,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;gBACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;aAC3D,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAoB,wBAAwB,CAAC;QACvD,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;YACzB,MAAM,EAAE,oEAAoE;YAC5E,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;SAC3D,CAAC;IACH,CAAC;IAED,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,GAAoB,aAAa;YAC1C,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,sBAAsB,CAAC;QAC1B,OAAO;YACN,GAAG,MAAM;YACT,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;YAC3C,MAAM,EAAE,aAAa;gBACpB,CAAC,CAAC,wEAAwE;gBAC1E,CAAC,CAAC,gEAAgE;YACnE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;YAC3D,qBAAqB,EAAE,wBAAwB;SAC/C,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,KAAK,SAAS,CAAC;IAEtD,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,GAAoB,YAAY,CAAC;QAC3C,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;YAC/C,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,qBAAqB;SACxD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;gBACN,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS;gBAC5B,MAAM,EAAE,8BAA8B;gBACtC,UAAU,EAAE,iBAAiB;gBAC7B,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC;gBAC5C,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;gBAC3D,qBAAqB,EAAE,wBAAwB;aAC/C,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAoB,sBAAsB,CAAC;QACrD,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;YACzB,MAAM,EAAE,kDAAkD;YAC1D,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;YAC3D,qBAAqB,EAAE,wBAAwB;SAC/C,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAoB,gBAAgB,CAAC;QAC/C,OAAO;YACN,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ;YAC3B,MAAM,EAAE,gDAAgD;YACxD,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;YACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;YAC3D,qBAAqB,EAAE,wBAAwB;SAC/C,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAoB,cAAc,CAAC;IAC7C,OAAO;QACN,GAAG,MAAM,EAAE,MAAM,EAAE,UAAU;QAC7B,MAAM,EAAE,yCAAyC;QACjD,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;QACjD,cAAc,EAAE,iBAAiB,EAAE,wBAAwB;QAC3D,qBAAqB,EAAE,wBAAwB;KAC/C,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACzB,MAAuB,EACvB,cAAsC,EACtC,QAAqD;IAErD,MAAM,UAAU,GACf,QAAQ,CAAC,aAAa,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;QACtB,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;QACtB,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC,QAAQ;QACtC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,CACnC,IAAI,IAAI,CAAC;IACX,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CACN,QAAQ,CAAC,aAAa,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,IAAI,KAAK,QAAQ;YACnB,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC,QAAQ;YACtC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,CACnC,IAAI,IAAI,CACT,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAqB;IAC3C,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,kBAAkB,GAAG,IAAI,GAAG,CACjC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAC7E,CAAC;IACF,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAE3E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAClD,MAAM,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAExE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,SAAS;QACnD,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ;YAAE,SAAS;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,eAAe;YAAE,SAAS;QAEzD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAoB,uBAAuB,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;gBAClF,UAAU,EAAE,KAAK,CAAC,IAAI;gBACtB,MAAM,EAAE,4CAA4C;gBACpD,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC;aACjD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,OAA0B,EAAE,OAA0B;IACxE,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3E,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAEvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ProviderType, SkillInfo } from "./types.js";
2
+ export interface SkillInstallResult {
3
+ skill: string;
4
+ provider: ProviderType;
5
+ success: boolean;
6
+ path?: string;
7
+ error?: string;
8
+ }
9
+ /**
10
+ * Install a single skill directory to the target provider.
11
+ * Source dir → target dir using node fs.cp recursive.
12
+ * Updates registry with sourceChecksum (SKILL.md content) for idempotency.
13
+ */
14
+ export declare function installSkillDirectory(skill: SkillInfo, provider: ProviderType, options: {
15
+ global: boolean;
16
+ }): Promise<SkillInstallResult>;
17
+ /**
18
+ * Compute the install path for a skill on a target provider (used by reconciler/dry-run).
19
+ */
20
+ export declare function getSkillInstallPath(skill: SkillInfo, provider: ProviderType, options: {
21
+ global: boolean;
22
+ }): string | null;
23
+ //# sourceMappingURL=skill-directory-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-directory-installer.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAuC7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,MAAM,GAAG,IAAI,CAGf"}
@@ -0,0 +1,55 @@
1
+ // Skill directory installer — recursively copies a skill folder (SKILL.md + references/ + scripts/)
2
+ // to the target provider's skill path. Handles colon→dash sanitization for cross-platform safety.
3
+ import { existsSync } from "node:fs";
4
+ import { cp, mkdir, readFile } from "node:fs/promises";
5
+ import { dirname, join } from "node:path";
6
+ import { providers } from "./provider-registry.js";
7
+ import { getPortableInstallPath } from "./provider-registry-utils.js";
8
+ import { sanitizeSkillName } from "./discovery/skills-discovery.js";
9
+ import { computeContentChecksum } from "./reconcile/checksum-utils.js";
10
+ import { addPortableInstallation } from "./reconcile/portable-registry.js";
11
+ /**
12
+ * Install a single skill directory to the target provider.
13
+ * Source dir → target dir using node fs.cp recursive.
14
+ * Updates registry with sourceChecksum (SKILL.md content) for idempotency.
15
+ */
16
+ export async function installSkillDirectory(skill, provider, options) {
17
+ const providerConfig = providers[provider];
18
+ if (!providerConfig?.skills) {
19
+ return { skill: skill.name, provider, success: false, error: `${provider} does not support skills` };
20
+ }
21
+ const sanitizedName = sanitizeSkillName(skill.dirName);
22
+ const targetBase = options.global ? providerConfig.skills.globalPath : providerConfig.skills.projectPath;
23
+ if (!targetBase) {
24
+ return { skill: skill.name, provider, success: false, error: `No ${options.global ? "global" : "project"} skills path for ${provider}` };
25
+ }
26
+ const targetDir = join(targetBase, sanitizedName);
27
+ try {
28
+ const parent = dirname(targetDir);
29
+ if (!existsSync(parent))
30
+ await mkdir(parent, { recursive: true });
31
+ await cp(skill.sourcePath, targetDir, { recursive: true, force: true, errorOnExist: false });
32
+ const skillMdPath = join(skill.sourcePath, "SKILL.md");
33
+ const skillMdTarget = join(targetDir, "SKILL.md");
34
+ const sourceChecksum = computeContentChecksum(await readFile(skillMdPath, "utf-8"));
35
+ const targetChecksum = computeContentChecksum(await readFile(skillMdTarget, "utf-8"));
36
+ await addPortableInstallation(skill.name, "skill", provider, options.global, targetDir, skill.sourcePath, { sourceChecksum, targetChecksum, installSource: "kit" });
37
+ return { skill: skill.name, provider, success: true, path: targetDir };
38
+ }
39
+ catch (err) {
40
+ return {
41
+ skill: skill.name,
42
+ provider,
43
+ success: false,
44
+ error: err instanceof Error ? err.message : String(err),
45
+ };
46
+ }
47
+ }
48
+ /**
49
+ * Compute the install path for a skill on a target provider (used by reconciler/dry-run).
50
+ */
51
+ export function getSkillInstallPath(skill, provider, options) {
52
+ const sanitizedName = sanitizeSkillName(skill.dirName);
53
+ return getPortableInstallPath(sanitizedName, provider, "skills", options);
54
+ }
55
+ //# sourceMappingURL=skill-directory-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-directory-installer.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"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"}