@intelligo-dev/cli 1.0.0-beta.1 → 1.0.0-beta.14

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 (223) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +102 -0
  3. package/dist/bin.js +122 -37
  4. package/dist/bin.js.map +1 -1
  5. package/dist/commands/add.d.ts +26 -1
  6. package/dist/commands/add.d.ts.map +1 -1
  7. package/dist/commands/add.js +70 -4
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/create-flow.d.ts +37 -0
  10. package/dist/commands/create-flow.d.ts.map +1 -0
  11. package/dist/commands/create-flow.js +212 -0
  12. package/dist/commands/create-flow.js.map +1 -0
  13. package/dist/commands/create.d.ts +27 -6
  14. package/dist/commands/create.d.ts.map +1 -1
  15. package/dist/commands/create.js +53 -13
  16. package/dist/commands/create.js.map +1 -1
  17. package/dist/commands/doctor.d.ts +14 -3
  18. package/dist/commands/doctor.d.ts.map +1 -1
  19. package/dist/commands/doctor.js +295 -37
  20. package/dist/commands/doctor.js.map +1 -1
  21. package/dist/commands/migrate-check.d.ts +73 -1
  22. package/dist/commands/migrate-check.d.ts.map +1 -1
  23. package/dist/commands/migrate-check.js +130 -5
  24. package/dist/commands/migrate-check.js.map +1 -1
  25. package/dist/commands/migrate.d.ts +97 -0
  26. package/dist/commands/migrate.d.ts.map +1 -0
  27. package/dist/commands/migrate.js +141 -0
  28. package/dist/commands/migrate.js.map +1 -0
  29. package/dist/commands/sync-messages.d.ts +37 -0
  30. package/dist/commands/sync-messages.d.ts.map +1 -0
  31. package/dist/commands/sync-messages.js +88 -0
  32. package/dist/commands/sync-messages.js.map +1 -0
  33. package/dist/commands/sync-scaffold.d.ts +36 -0
  34. package/dist/commands/sync-scaffold.d.ts.map +1 -0
  35. package/dist/commands/sync-scaffold.js +53 -0
  36. package/dist/commands/sync-scaffold.js.map +1 -0
  37. package/dist/commands/sync.d.ts +103 -0
  38. package/dist/commands/sync.d.ts.map +1 -0
  39. package/dist/commands/sync.js +361 -0
  40. package/dist/commands/sync.js.map +1 -0
  41. package/dist/commands/upgrade-check.d.ts +5 -5
  42. package/dist/commands/upgrade-check.d.ts.map +1 -1
  43. package/dist/commands/upgrade-check.js +22 -6
  44. package/dist/commands/upgrade-check.js.map +1 -1
  45. package/dist/env-files.d.ts +12 -0
  46. package/dist/env-files.d.ts.map +1 -0
  47. package/dist/env-files.js +29 -0
  48. package/dist/env-files.js.map +1 -0
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +9 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/manifest.d.ts +36 -15
  54. package/dist/manifest.d.ts.map +1 -1
  55. package/dist/manifest.js +32 -16
  56. package/dist/manifest.js.map +1 -1
  57. package/dist/migrations.d.ts +3 -6
  58. package/dist/migrations.d.ts.map +1 -1
  59. package/dist/migrations.js +3 -6
  60. package/dist/migrations.js.map +1 -1
  61. package/dist/model-catalogue.d.ts +14 -0
  62. package/dist/model-catalogue.d.ts.map +1 -0
  63. package/dist/model-catalogue.js +34 -0
  64. package/dist/model-catalogue.js.map +1 -0
  65. package/dist/module-exports.d.ts +63 -0
  66. package/dist/module-exports.d.ts.map +1 -0
  67. package/dist/module-exports.js +231 -0
  68. package/dist/module-exports.js.map +1 -0
  69. package/dist/registry-bundle.d.ts +43 -0
  70. package/dist/registry-bundle.d.ts.map +1 -0
  71. package/dist/registry-bundle.js +74 -0
  72. package/dist/registry-bundle.js.map +1 -0
  73. package/dist/registry-items.d.ts +84 -0
  74. package/dist/registry-items.d.ts.map +1 -0
  75. package/dist/registry-items.js +187 -0
  76. package/dist/registry-items.js.map +1 -0
  77. package/package.json +36 -10
  78. package/src/bin.ts +316 -0
  79. package/src/commands/add.ts +255 -0
  80. package/src/commands/create-flow.ts +284 -0
  81. package/src/commands/create.ts +149 -0
  82. package/src/commands/doctor.ts +487 -0
  83. package/src/commands/migrate-check.ts +298 -0
  84. package/src/commands/migrate.ts +228 -0
  85. package/src/commands/sync-messages.ts +114 -0
  86. package/src/commands/sync-scaffold.ts +83 -0
  87. package/src/commands/sync.ts +534 -0
  88. package/src/commands/upgrade-check.ts +160 -0
  89. package/src/env-files.ts +31 -0
  90. package/src/index.ts +39 -0
  91. package/src/manifest.ts +147 -0
  92. package/src/migrations-dir.ts +25 -0
  93. package/src/migrations.ts +133 -0
  94. package/src/model-catalogue.ts +35 -0
  95. package/src/module-exports.ts +266 -0
  96. package/src/registry-bundle.ts +103 -0
  97. package/src/registry-items.ts +237 -0
  98. package/templates/admin-page/admin-page.tsx.tpl +2 -3
  99. package/templates/app-scaffold/assistant-route.ts.tpl +2 -2
  100. package/templates/app-scaffold/auth-route.ts.tpl +10 -0
  101. package/templates/app-scaffold/components.json.tpl +6 -2
  102. package/templates/app-scaffold/db-schema.ts.tpl +29 -0
  103. package/templates/app-scaffold/drizzle-journal.json.tpl +5 -0
  104. package/templates/app-scaffold/drizzle.config.ts.tpl +45 -0
  105. package/templates/app-scaffold/env.example.tpl +65 -1
  106. package/templates/app-scaffold/globals.css.tpl +172 -281
  107. package/templates/app-scaffold/i18n-request.ts.tpl +25 -0
  108. package/templates/app-scaffold/instrumentation.ts.tpl +21 -0
  109. package/templates/app-scaffold/intelligo.ts.tpl +95 -41
  110. package/templates/app-scaffold/layout.tsx.tpl +18 -1
  111. package/templates/app-scaffold/lib-utils.ts.tpl +1 -6
  112. package/templates/app-scaffold/next.config.mjs.tpl +2 -0
  113. package/templates/app-scaffold/package.json.tpl +31 -17
  114. package/templates/app-scaffold/page.tsx.tpl +16 -0
  115. package/templates/app-scaffold/plans.ts.tpl +32 -13
  116. package/templates/app-scaffold/{middleware.ts.tpl → proxy.ts.tpl} +6 -0
  117. package/templates/app-scaffold/sonner.tsx.tpl +42 -20
  118. package/templates/app-scaffold/stripe-webhook-route.ts.tpl +24 -0
  119. package/templates/app-scaffold/theme-provider.tsx.tpl +6 -4
  120. package/templates/app-scaffold/tsconfig.json.tpl +20 -4
  121. package/templates/app-scaffold/use-mobile.ts.tpl +19 -0
  122. package/templates/app-scaffold/workspace-bootstrap.ts.tpl +30 -0
  123. package/templates/maintenance/maintenance-route.ts.tpl +119 -0
  124. package/templates/manifest.json +75 -17
  125. package/templates/registry/ai-agent-activity.json +23 -0
  126. package/templates/registry/ai-agent-progress.json +21 -0
  127. package/templates/registry/ai-approval-card.json +27 -0
  128. package/templates/registry/ai-artifact.json +22 -0
  129. package/templates/registry/ai-branch.json +21 -0
  130. package/templates/registry/ai-citations.json +24 -0
  131. package/templates/registry/ai-code-block.json +23 -0
  132. package/templates/registry/ai-composer-menu.json +19 -0
  133. package/templates/registry/ai-file-diff.json +25 -0
  134. package/templates/registry/ai-image-generation.json +23 -0
  135. package/templates/registry/ai-markdown.json +23 -0
  136. package/templates/registry/ai-message-bubble.json +23 -0
  137. package/templates/registry/ai-message-scroller.json +22 -0
  138. package/templates/registry/ai-message.json +21 -0
  139. package/templates/registry/ai-motion.json +19 -0
  140. package/templates/registry/ai-prompt-input.json +28 -0
  141. package/templates/registry/ai-reasoning-text.json +22 -0
  142. package/templates/registry/ai-reasoning.json +22 -0
  143. package/templates/registry/ai-shimmer-text.json +19 -0
  144. package/templates/registry/ai-sidebar.json +25 -0
  145. package/templates/registry/ai-speech-input.json +21 -0
  146. package/templates/registry/ai-streaming-response.json +24 -0
  147. package/templates/registry/ai-suggestion.json +19 -0
  148. package/templates/registry/ai-todo-list.json +22 -0
  149. package/templates/registry/ai-tool-approval.json +26 -0
  150. package/templates/registry/ai-tool-result.json +25 -0
  151. package/templates/registry/alert-dialog.json +23 -0
  152. package/templates/registry/animated-list.json +21 -0
  153. package/templates/registry/app-shell.json +93 -0
  154. package/templates/registry/artifacts.json +82 -0
  155. package/templates/registry/attachment.json +22 -0
  156. package/templates/registry/auth-email-verification.json +39 -0
  157. package/templates/registry/auth-login.json +72 -0
  158. package/templates/registry/auth-password-reset.json +53 -0
  159. package/templates/registry/auth-signup.json +41 -0
  160. package/templates/registry/billing-settings.json +60 -0
  161. package/templates/registry/button.json +22 -0
  162. package/templates/registry/chat-eve.json +19 -0
  163. package/templates/registry/chat-panel.json +30 -0
  164. package/templates/registry/chat-share.json +42 -0
  165. package/templates/registry/chat-widget.json +34 -0
  166. package/templates/registry/chat.json +326 -0
  167. package/templates/registry/checkbox.json +22 -0
  168. package/templates/registry/checkout.json +40 -0
  169. package/templates/registry/collapsible.json +19 -0
  170. package/templates/registry/command.json +23 -0
  171. package/templates/registry/copy-button.json +21 -0
  172. package/templates/registry/dashboard.json +69 -0
  173. package/templates/registry/dialog.json +24 -0
  174. package/templates/registry/document-viewer.json +22 -0
  175. package/templates/registry/dropdown-menu.json +23 -0
  176. package/templates/registry/expandable-tabs.json +22 -0
  177. package/templates/registry/feature-gating.json +73 -0
  178. package/templates/registry/file-upload.json +24 -0
  179. package/templates/registry/hold-action-button.json +22 -0
  180. package/templates/registry/input-group.json +23 -0
  181. package/templates/registry/input.json +19 -0
  182. package/templates/registry/intelligo.json +187 -0
  183. package/templates/registry/invitation-accept.json +64 -0
  184. package/templates/registry/language-switcher.json +29 -0
  185. package/templates/registry/morphing-modal.json +24 -0
  186. package/templates/registry/notification-stack.json +24 -0
  187. package/templates/registry/notifications.json +87 -0
  188. package/templates/registry/onboarding.json +83 -0
  189. package/templates/registry/otp-input.json +22 -0
  190. package/templates/registry/page-header.json +15 -0
  191. package/templates/registry/payment-poll.json +52 -0
  192. package/templates/registry/popover-morph.json +22 -0
  193. package/templates/registry/popover.json +22 -0
  194. package/templates/registry/pricing.json +111 -0
  195. package/templates/registry/privacy-settings.json +65 -0
  196. package/templates/registry/profile-settings.json +68 -0
  197. package/templates/registry/progress.json +19 -0
  198. package/templates/registry/radio-group.json +22 -0
  199. package/templates/registry/registry.json +2945 -0
  200. package/templates/registry/route-error.json +65 -0
  201. package/templates/registry/select-morph.json +23 -0
  202. package/templates/registry/select.json +23 -0
  203. package/templates/registry/settings-shell.json +47 -0
  204. package/templates/registry/sheet.json +24 -0
  205. package/templates/registry/sidebar.json +28 -0
  206. package/templates/registry/smoke.json +34 -0
  207. package/templates/registry/spinner.json +16 -0
  208. package/templates/registry/stat-card.json +18 -0
  209. package/templates/registry/status-badge.json +18 -0
  210. package/templates/registry/switch.json +20 -0
  211. package/templates/registry/tabs.json +23 -0
  212. package/templates/registry/team-settings.json +97 -0
  213. package/templates/registry/textarea.json +16 -0
  214. package/templates/registry/tooltip.json +22 -0
  215. package/templates/registry/trial-banner.json +43 -0
  216. package/templates/registry/usage.json +84 -0
  217. package/templates/registry/workspace-settings.json +71 -0
  218. package/templates/registry-items.json +116 -0
  219. package/templates/registry-requires.json +180 -0
  220. package/templates/usage-page/usage-page.tsx.tpl +23 -8
  221. package/templates/vitest/server-only.ts.tpl +7 -0
  222. package/templates/vitest/vitest.config.ts.tpl +37 -0
  223. package/templates/billing-page/billing-page.tsx.tpl +0 -72
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Scaffold files a registry install replaces. `intelligo create`
3
+ * writes app/globals.css, the theme provider and lib/utils.ts; the
4
+ * design-system base and the items overwrite them, and the scaffold's
5
+ * record has to let go of them or `upgrade --check` reports them as
6
+ * the app's own edits forever.
7
+ */
8
+ import { existsSync, readFileSync } from "node:fs";
9
+ import path from "node:path";
10
+ import { readManifest } from "../manifest.js";
11
+ /** The `intelligo create` feature whose files an install may replace. */
12
+ export const SCAFFOLD_FEATURE = "app-scaffold";
13
+ /**
14
+ * Scaffold files the install extends in place rather than replaces:
15
+ * shadcn adds dependencies to package.json and style fields to
16
+ * components.json, and both stay the app's.
17
+ */
18
+ const EDITED_IN_PLACE = new Set([
19
+ "package.json",
20
+ "components.json",
21
+ ]);
22
+ /**
23
+ * The scaffold files an install has made the registry's: a file an
24
+ * installed item ships, the Tailwind stylesheet once the design-system
25
+ * base is in (it rewrites the tokens), or any scaffold file the install
26
+ * changed (shadcn's own `utils`, `sonner`). Seams stay the app's, and
27
+ * so do the files shadcn only extends. Left in the scaffold's record,
28
+ * each would read `customized` in `upgrade --check` forever.
29
+ */
30
+ export function scaffoldHandover(input) {
31
+ return input.scaffold.filter((file) => !(file in input.seams) &&
32
+ !EDITED_IN_PLACE.has(file) &&
33
+ (input.shipped.has(file) || file === input.css || input.changed.has(file)));
34
+ }
35
+ function readIfExists(file) {
36
+ return existsSync(file) ? readFileSync(file, "utf8") : null;
37
+ }
38
+ /**
39
+ * The scaffold's recorded files as they are before an install, and
40
+ * afterwards the ones the install made the registry's.
41
+ */
42
+ export function snapshotScaffold(appRoot) {
43
+ const scaffold = (readManifest(appRoot)?.features[SCAFFOLD_FEATURE]?.files ?? []).map((f) => f.path);
44
+ const before = new Map(scaffold.map((f) => [f, readIfExists(path.join(appRoot, f))]));
45
+ return {
46
+ handedOver: (input) => scaffoldHandover({
47
+ ...input,
48
+ scaffold,
49
+ changed: new Set(scaffold.filter((f) => readIfExists(path.join(appRoot, f)) !== before.get(f))),
50
+ }),
51
+ };
52
+ }
53
+ //# sourceMappingURL=sync-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-scaffold.js","sourceRoot":"","sources":["../../src/commands/sync-scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C;;;;GAIG;AACH,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACnD,cAAc;IACd,iBAAiB;CAClB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAMhC;IACC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAC1B,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAO9C,MAAM,QAAQ,GAAG,CACf,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK,IAAI,EAAE,CAC/D,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;IACF,OAAO;QACL,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CACpB,gBAAgB,CAAC;YACf,GAAG,KAAK;YACR,QAAQ;YACR,OAAO,EAAE,IAAI,GAAG,CACd,QAAQ,CAAC,MAAM,CACb,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAC7D,CACF;SACF,CAAC;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `intelligo sync [items…] [--check] [--force]`
3
+ *
4
+ * Keeps an app's installed registry pages exactly what the framework
5
+ * ships. Installing stays the shadcn CLI's job — every item goes in with
6
+ * `shadcn add <item> --yes --overwrite` — and this command adds what
7
+ * shadcn cannot know:
8
+ *
9
+ * - the version: items come from the registry bundled with this CLI, so
10
+ * they match the `@intelligo-dev/*` packages of the same release;
11
+ * - the order: an item that imports a sibling's files lands after it
12
+ * (requires.json `items`);
13
+ * - the seams: files an item ships once for the deployment to own
14
+ * (requires.json `seams`) are put back after the install, and message
15
+ * files are merged key by key, the app's copy winning;
16
+ * - the record: intelligo.manifest.json keeps each installed file's
17
+ * hash, so `--check` can tell a file edited by hand from one a newer
18
+ * registry replaced. Scaffold files an install replaces (globals.css,
19
+ * the theme provider) leave the `app-scaffold` record for this one,
20
+ * so `upgrade --check` stops calling them customized.
21
+ *
22
+ * `--check` installs nothing and exits 1 when any installed file is
23
+ * missing, edited or behind the registry — the gate CI runs.
24
+ */
25
+ import type { RegistryRequires } from "./doctor.js";
26
+ export { appLocales, mergeMessages, missingMessageKeys, } from "./sync-messages.js";
27
+ export { SCAFFOLD_FEATURE, scaffoldHandover } from "./sync-scaffold.js";
28
+ /** The design-system base: no marker file, installed before any page. */
29
+ export declare const BASE_ITEM = "intelligo";
30
+ export type SyncFileState =
31
+ /** identical to the registry */
32
+ "current"
33
+ /** untouched since the last sync; the registry has a newer version */
34
+ | "outdated"
35
+ /** changed by hand since it was installed */
36
+ | "edited"
37
+ /** differs from the registry, and no sync ever recorded it */
38
+ | "differs"
39
+ /** the registry ships it and the app does not have it */
40
+ | "missing"
41
+ /** a seam: the app's own from the first install on */
42
+ | "seam"
43
+ /** a message file that lacks keys the registry's has */
44
+ | "messages-behind"
45
+ /** another locale's copy of a shipped namespace lacks keys the app's English has */
46
+ | "locale-behind";
47
+ export type SyncEntry = {
48
+ item: string;
49
+ path: string;
50
+ state: SyncFileState;
51
+ /** For `messages-behind` / `locale-behind`: the dotted keys the copy lacks. */
52
+ missingKeys?: string[];
53
+ };
54
+ export type SyncReport = {
55
+ /** The framework version of the bundled registry. */
56
+ version: string;
57
+ /** The items checked, in install order (Intelligo components included). */
58
+ items: string[];
59
+ entries: SyncEntry[];
60
+ };
61
+ export type SyncSelection = {
62
+ ok: true;
63
+ items: string[];
64
+ } | {
65
+ ok: false;
66
+ message: string;
67
+ };
68
+ export type SyncContext = {
69
+ appRoot: string;
70
+ registryDir: string;
71
+ requires: RegistryRequires & {
72
+ seams?: Record<string, string>;
73
+ };
74
+ frameworkVersion: string;
75
+ };
76
+ /**
77
+ * The items to sync: the ones named, else the ones the manifest
78
+ * recorded. With neither, nothing is guessed — a page at an item's
79
+ * marker path may be the product's own (a custom dashboard), and a sync
80
+ * would replace it — so the message lists what looks installed and asks
81
+ * for names.
82
+ */
83
+ export declare function selectItems(names: readonly string[], context: SyncContext): SyncSelection;
84
+ /** Blocks in requires.json order, the design-system base first. */
85
+ export declare function installOrder(items: readonly string[], requires: RegistryRequires): string[];
86
+ /** Compare the app against the bundled registry; writes nothing. */
87
+ export declare function syncCheck(items: readonly string[], context: SyncContext): SyncReport;
88
+ export declare function syncCheckExitCode(report: SyncReport): number;
89
+ export declare function formatSyncReport(report: SyncReport): string;
90
+ /** The package version the app resolves for `@intelligo-dev/core`, if any. */
91
+ export declare function installedFrameworkVersion(appRoot: string): string | null;
92
+ export type SyncApplyOptions = {
93
+ force?: boolean;
94
+ log?: (line: string) => void;
95
+ };
96
+ /**
97
+ * Install `items` from the bundled registry, keep the seams, merge the
98
+ * messages and record what was written. Refuses to overwrite a file
99
+ * edited by hand unless `force` — the edit belongs in a seam, and the
100
+ * refusal says which files.
101
+ */
102
+ export declare function syncApply(names: readonly string[], context: SyncContext, options?: SyncApplyOptions): Promise<number>;
103
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA0BpD,OAAO,EACL,UAAU,EACV,aAAa,EACb,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAExE,yEAAyE;AACzE,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,MAAM,MAAM,aAAa;AACvB,gCAAgC;AAC9B,SAAS;AACX,sEAAsE;GACpE,UAAU;AACZ,6CAA6C;GAC3C,QAAQ;AACV,8DAA8D;GAC5D,SAAS;AACX,yDAAyD;GACvD,SAAS;AACX,sDAAsD;GACpD,MAAM;AACR,wDAAwD;GACtD,iBAAiB;AACnB,oFAAoF;GAClF,eAAe,CAAC;AAEpB,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,gBAAgB,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAChE,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAWF;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,WAAW,GACnB,aAAa,CAiCf;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,EAAE,gBAAgB,GACzB,MAAM,EAAE,CASV;AAwBD,oEAAoE;AACpE,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,WAAW,GACnB,UAAU,CAmCZ;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkC3D;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxE;AAsGD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAyHjB"}
@@ -0,0 +1,361 @@
1
+ /**
2
+ * `intelligo sync [items…] [--check] [--force]`
3
+ *
4
+ * Keeps an app's installed registry pages exactly what the framework
5
+ * ships. Installing stays the shadcn CLI's job — every item goes in with
6
+ * `shadcn add <item> --yes --overwrite` — and this command adds what
7
+ * shadcn cannot know:
8
+ *
9
+ * - the version: items come from the registry bundled with this CLI, so
10
+ * they match the `@intelligo-dev/*` packages of the same release;
11
+ * - the order: an item that imports a sibling's files lands after it
12
+ * (requires.json `items`);
13
+ * - the seams: files an item ships once for the deployment to own
14
+ * (requires.json `seams`) are put back after the install, and message
15
+ * files are merged key by key, the app's copy winning;
16
+ * - the record: intelligo.manifest.json keeps each installed file's
17
+ * hash, so `--check` can tell a file edited by hand from one a newer
18
+ * registry replaced. Scaffold files an install replaces (globals.css,
19
+ * the theme provider) leave the `app-scaffold` record for this one,
20
+ * so `upgrade --check` stops calling them customized.
21
+ *
22
+ * `--check` installs nothing and exits 1 when any installed file is
23
+ * missing, edited or behind the registry — the gate CI runs.
24
+ */
25
+ import { spawn } from "node:child_process";
26
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
27
+ import { createServer } from "node:http";
28
+ import path from "node:path";
29
+ import { emptyManifest, handOver, hashContents, readManifest, writeManifest, } from "../manifest.js";
30
+ import { asInstalled, hasRegistryItem, installedPath, readRegistryItem, registryClosure, } from "../registry-bundle.js";
31
+ import { withDependencies } from "../registry-items.js";
32
+ import { isMessages, localeEntries, mergeMessages, missingMessageKeys, } from "./sync-messages.js";
33
+ import { SCAFFOLD_FEATURE, snapshotScaffold } from "./sync-scaffold.js";
34
+ export { appLocales, mergeMessages, missingMessageKeys, } from "./sync-messages.js";
35
+ export { SCAFFOLD_FEATURE, scaffoldHandover } from "./sync-scaffold.js";
36
+ /** The design-system base: no marker file, installed before any page. */
37
+ export const BASE_ITEM = "intelligo";
38
+ const FAILING = new Set([
39
+ "outdated",
40
+ "edited",
41
+ "differs",
42
+ "missing",
43
+ "messages-behind",
44
+ "locale-behind",
45
+ ]);
46
+ /**
47
+ * The items to sync: the ones named, else the ones the manifest
48
+ * recorded. With neither, nothing is guessed — a page at an item's
49
+ * marker path may be the product's own (a custom dashboard), and a sync
50
+ * would replace it — so the message lists what looks installed and asks
51
+ * for names.
52
+ */
53
+ export function selectItems(names, context) {
54
+ const unknown = names.filter((n) => n === "registry" || !hasRegistryItem(context.registryDir, n));
55
+ if (unknown.length > 0) {
56
+ return {
57
+ ok: false,
58
+ message: `Unknown registry item(s): ${unknown.join(", ")}. Available: ${[
59
+ BASE_ITEM,
60
+ ...Object.keys(context.requires.items),
61
+ ].join(", ")}`,
62
+ };
63
+ }
64
+ if (names.length > 0)
65
+ return { ok: true, items: [...names] };
66
+ const recorded = readManifest(context.appRoot)?.registry?.items;
67
+ if (recorded && recorded.length > 0)
68
+ return { ok: true, items: recorded };
69
+ const looksInstalled = Object.entries(context.requires.items)
70
+ .filter(([, item]) => existsSync(path.join(context.appRoot, item.marker)))
71
+ .map(([name]) => name);
72
+ return {
73
+ ok: false,
74
+ message: [
75
+ "No synced items are recorded in intelligo.manifest.json yet.",
76
+ "Name the items this app installs from the registry, once:",
77
+ "",
78
+ ` intelligo sync ${[BASE_ITEM, ...looksInstalled].join(" ")}`,
79
+ "",
80
+ "(these are the items whose files are present — leave out any whose",
81
+ "path your product uses for a page of its own)",
82
+ ].join("\n"),
83
+ };
84
+ }
85
+ /** Blocks in requires.json order, the design-system base first. */
86
+ export function installOrder(items, requires) {
87
+ const blocks = items.filter((n) => n in requires.items);
88
+ const others = items.filter((n) => !(n in requires.items));
89
+ const ordered = withDependencies(blocks, requires);
90
+ return [
91
+ ...others.filter((n) => n === BASE_ITEM),
92
+ ...others.filter((n) => n !== BASE_ITEM),
93
+ ...ordered,
94
+ ];
95
+ }
96
+ function shippedFiles(context, items) {
97
+ const closure = registryClosure(context.registryDir, items);
98
+ const byTarget = new Map();
99
+ for (const name of closure) {
100
+ const item = readRegistryItem(context.registryDir, name);
101
+ for (const file of item.files ?? []) {
102
+ const target = installedPath(item, file);
103
+ if (!target || file.content === undefined)
104
+ continue;
105
+ byTarget.set(target, { item: name, target, content: file.content });
106
+ }
107
+ }
108
+ return { closure, files: [...byTarget.values()] };
109
+ }
110
+ /** Compare the app against the bundled registry; writes nothing. */
111
+ export function syncCheck(items, context) {
112
+ const { closure, files } = shippedFiles(context, items);
113
+ const seams = context.requires.seams ?? {};
114
+ const recorded = readManifest(context.appRoot)?.registry?.files ?? {};
115
+ const entries = files.map(({ item, target, content }) => {
116
+ const abs = path.join(context.appRoot, target);
117
+ if (!existsSync(abs))
118
+ return { item, path: target, state: "missing" };
119
+ if (target in seams)
120
+ return { item, path: target, state: "seam" };
121
+ const local = readFileSync(abs, "utf8");
122
+ if (isMessages(target)) {
123
+ const missingKeys = missingMessageKeys(JSON.parse(content), JSON.parse(local));
124
+ return missingKeys.length > 0
125
+ ? { item, path: target, state: "messages-behind", missingKeys }
126
+ : { item, path: target, state: "current" };
127
+ }
128
+ if (asInstalled(local) === asInstalled(content)) {
129
+ return { item, path: target, state: "current" };
130
+ }
131
+ const hash = recorded[target];
132
+ if (hash === undefined)
133
+ return { item, path: target, state: "differs" };
134
+ return {
135
+ item,
136
+ path: target,
137
+ state: hashContents(asInstalled(local)) === hash ? "outdated" : "edited",
138
+ };
139
+ });
140
+ entries.push(...localeEntries(context.appRoot, files));
141
+ return { version: context.frameworkVersion, items: closure, entries };
142
+ }
143
+ export function syncCheckExitCode(report) {
144
+ return report.entries.some((e) => FAILING.has(e.state)) ? 1 : 0;
145
+ }
146
+ export function formatSyncReport(report) {
147
+ const counts = new Map();
148
+ for (const e of report.entries) {
149
+ counts.set(e.state, (counts.get(e.state) ?? 0) + 1);
150
+ }
151
+ const lines = [
152
+ `Registry ${report.version}: ${report.items.length} item(s), ${report.entries.length} file(s) — ` +
153
+ [...counts].map(([state, n]) => `${n} ${state}`).join(", "),
154
+ ];
155
+ const HINT = {
156
+ outdated: "a newer registry version — `intelligo sync` replaces it",
157
+ edited: "edited by hand — move the change into a seam, or ask for one upstream",
158
+ differs: "not what the registry ships, and never synced",
159
+ missing: "not installed",
160
+ "messages-behind": "lacks registry keys — `intelligo sync` adds them",
161
+ "locale-behind": "lacks keys the app's English copy has — translate them; sync never writes another locale",
162
+ };
163
+ for (const state of FAILING) {
164
+ const group = report.entries.filter((e) => e.state === state);
165
+ if (group.length === 0)
166
+ continue;
167
+ lines.push("", `${state} (${HINT[state]}):`);
168
+ for (const e of group) {
169
+ const keys = e.missingKeys
170
+ ? ` — ${e.missingKeys.slice(0, 5).join(", ")}${e.missingKeys.length > 5 ? `, +${e.missingKeys.length - 5}` : ""}`
171
+ : "";
172
+ lines.push(` ${e.path} [${e.item}]${keys}`);
173
+ }
174
+ }
175
+ if (!report.entries.some((e) => FAILING.has(e.state))) {
176
+ lines.push("✓ every installed file is the registry's, seams aside");
177
+ }
178
+ return lines.join("\n");
179
+ }
180
+ /** The package version the app resolves for `@intelligo-dev/core`, if any. */
181
+ export function installedFrameworkVersion(appRoot) {
182
+ const manifest = path.join(appRoot, "node_modules", "@intelligo-dev", "core", "package.json");
183
+ if (!existsSync(manifest))
184
+ return null;
185
+ return JSON.parse(readFileSync(manifest, "utf8"))
186
+ .version;
187
+ }
188
+ function serveRegistry(dir) {
189
+ return new Promise((resolve, reject) => {
190
+ const server = createServer((req, res) => {
191
+ const name = decodeURIComponent((req.url ?? "").split("?")[0]).replace(/^\//, "");
192
+ const file = path.join(dir, name);
193
+ if (!/^[a-z0-9-]+\.json$/.test(name) || !existsSync(file)) {
194
+ res.writeHead(404);
195
+ res.end();
196
+ return;
197
+ }
198
+ res.writeHead(200, { "content-type": "application/json" });
199
+ res.end(readFileSync(file));
200
+ });
201
+ server.once("error", reject);
202
+ server.listen(0, "127.0.0.1", () => {
203
+ const { port } = server.address();
204
+ resolve({ server, url: `http://127.0.0.1:${port}` });
205
+ });
206
+ });
207
+ }
208
+ function run(command, args, cwd) {
209
+ return new Promise((resolve) => {
210
+ const child = spawn(command, args, {
211
+ cwd,
212
+ // pnpm, npx and friends are .cmd shims on Windows.
213
+ shell: process.platform === "win32",
214
+ env: process.env,
215
+ });
216
+ let output = "";
217
+ child.stdout.on("data", (d) => (output += String(d)));
218
+ child.stderr.on("data", (d) => (output += String(d)));
219
+ child.on("close", (code) => resolve({ code: code ?? 1, output }));
220
+ child.on("error", (error) => resolve({ code: 1, output: `${output}${error.message}` }));
221
+ });
222
+ }
223
+ /** Put the kept seams back, and merge kept messages over the registry's. */
224
+ function restoreKept(appRoot, kept, shipped) {
225
+ for (const [target, content] of kept) {
226
+ const abs = path.join(appRoot, target);
227
+ mkdirSync(path.dirname(abs), { recursive: true });
228
+ if (isMessages(target) && shipped.has(target)) {
229
+ const merged = mergeMessages(JSON.parse(shipped.get(target)), JSON.parse(content));
230
+ writeFileSync(abs, `${JSON.stringify(merged, null, 2)}\n`);
231
+ }
232
+ else {
233
+ writeFileSync(abs, content);
234
+ }
235
+ }
236
+ }
237
+ /**
238
+ * Write the synced items and each installed file's hash (seams and
239
+ * message files aside) into the manifest.
240
+ */
241
+ function recordSync(context, names, after, { manifest }) {
242
+ const files = {};
243
+ for (const e of after.entries) {
244
+ if (e.state === "seam" || e.state === "missing" || isMessages(e.path)) {
245
+ continue;
246
+ }
247
+ files[e.path] = hashContents(asInstalled(readFileSync(path.join(context.appRoot, e.path), "utf8")));
248
+ }
249
+ const recordedItems = new Set([
250
+ ...(manifest.registry?.items ?? []),
251
+ ...names,
252
+ ]);
253
+ writeManifest(context.appRoot, {
254
+ ...manifest,
255
+ registry: {
256
+ version: context.frameworkVersion,
257
+ items: installOrder([...recordedItems], context.requires),
258
+ files: { ...manifest.registry?.files, ...files },
259
+ },
260
+ });
261
+ }
262
+ /**
263
+ * Install `items` from the bundled registry, keep the seams, merge the
264
+ * messages and record what was written. Refuses to overwrite a file
265
+ * edited by hand unless `force` — the edit belongs in a seam, and the
266
+ * refusal says which files.
267
+ */
268
+ export async function syncApply(names, context, options = {}) {
269
+ const log = options.log ?? console.log;
270
+ const { appRoot } = context;
271
+ const shadcn = path.join(appRoot, "node_modules", ".bin", "shadcn");
272
+ if (!existsSync(shadcn)) {
273
+ log("shadcn is not installed in this app — add it as a devDependency (the scaffold declares it) and install.");
274
+ return 1;
275
+ }
276
+ const componentsPath = path.join(appRoot, "components.json");
277
+ if (!existsSync(componentsPath)) {
278
+ log("No components.json — run from the app's root.");
279
+ return 1;
280
+ }
281
+ const items = installOrder(names, context.requires);
282
+ const before = syncCheck(items, context);
283
+ const shippedTargets = new Set(shippedFiles(context, items).files.map((f) => f.target));
284
+ const edited = before.entries.filter((e) => e.state === "edited" || e.state === "differs");
285
+ if (edited.length > 0 && !options.force) {
286
+ log([
287
+ `${edited.length} installed file(s) differ from the registry and would be overwritten:`,
288
+ ...edited.map((e) => ` ${e.path} [${e.item}]`),
289
+ "",
290
+ "Move what the change does into a seam (lib/*-config, messages/), then re-run",
291
+ "with --force to replace these files with the registry's.",
292
+ ].join("\n"));
293
+ return 1;
294
+ }
295
+ // What the install must not lose: the app's seams and message files.
296
+ const seams = context.requires.seams ?? {};
297
+ const kept = new Map();
298
+ for (const e of before.entries) {
299
+ if (e.state === "missing" || !shippedTargets.has(e.path))
300
+ continue;
301
+ if (e.path in seams || isMessages(e.path)) {
302
+ kept.set(e.path, readFileSync(path.join(appRoot, e.path), "utf8"));
303
+ }
304
+ }
305
+ const componentsBefore = JSON.parse(readFileSync(componentsPath, "utf8"));
306
+ // The scaffold's files as they are now, to see which the install replaces.
307
+ const scaffold = snapshotScaffold(appRoot);
308
+ const originalRegistry = componentsBefore.registries?.["@intelligo"];
309
+ const { server, url } = await serveRegistry(context.registryDir);
310
+ const setRegistry = (value) => {
311
+ // Read fresh: the base item rewrites components.json's style fields,
312
+ // and those changes are the point — only the registry URL is ours.
313
+ const current = JSON.parse(readFileSync(componentsPath, "utf8"));
314
+ const registries = { ...current.registries };
315
+ if (value === undefined)
316
+ delete registries["@intelligo"];
317
+ else
318
+ registries["@intelligo"] = value;
319
+ const next = { ...current, registries };
320
+ if (Object.keys(registries).length === 0)
321
+ delete next.registries;
322
+ writeFileSync(componentsPath, `${JSON.stringify(next, null, 2)}\n`);
323
+ };
324
+ let failed = null;
325
+ try {
326
+ setRegistry(`${url}/{name}.json`);
327
+ for (const item of items) {
328
+ log(`› shadcn add ${item}`);
329
+ const result = await run(shadcn, ["add", `${url}/${item}.json`, "--yes", "--overwrite"], appRoot);
330
+ if (result.code !== 0) {
331
+ failed = { item, output: result.output };
332
+ break;
333
+ }
334
+ }
335
+ }
336
+ finally {
337
+ setRegistry(originalRegistry);
338
+ server.close();
339
+ }
340
+ // Seams back as they were; messages merged over the registry's.
341
+ const shipped = new Map(shippedFiles(context, items).files.map((f) => [f.target, f.content]));
342
+ restoreKept(appRoot, kept, shipped);
343
+ if (failed) {
344
+ log(`shadcn add ${failed.item} failed:\n${failed.output.trim().split("\n").slice(-20).join("\n")}`);
345
+ return 1;
346
+ }
347
+ // Record what is on disk now, so the next check can tell an edit.
348
+ const after = syncCheck(items, context);
349
+ recordSync(context, names, after, {
350
+ manifest: handOver(readManifest(appRoot) ?? emptyManifest(context.frameworkVersion), SCAFFOLD_FEATURE, scaffold.handedOver({
351
+ shipped: new Set(shipped.keys()),
352
+ seams,
353
+ css: items.includes(BASE_ITEM)
354
+ ? (componentsBefore.tailwind?.css ?? null)
355
+ : null,
356
+ })),
357
+ });
358
+ log(formatSyncReport(after));
359
+ return syncCheckExitCode(after);
360
+ }
361
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * `intelligo upgrade --check`
3
3
  *
4
- * Reports what a template upgrade would do, and does nothing. The
5
- * promise in ADR-0002 is that dependency upgrades never overwrite
6
- * consumer source, so the interesting output is not "these files
7
- * changed upstream" but "these changed upstream AND you have edited
4
+ * Reports what a template upgrade would do, and does nothing. Upgrades
5
+ * never overwrite consumer source, so the interesting output is not
6
+ * "these templates changed" but "these changed AND you have edited
8
7
  * them" — the set where the consumer has to make a decision.
9
8
  */
10
9
  export type UpgradeItem = {
@@ -17,8 +16,9 @@ export type UpgradeItem = {
17
16
  * - `conflict` — template changed AND the consumer edited the file
18
17
  * - `customized` — consumer edited it; template unchanged
19
18
  * - `deleted` — consumer removed it
19
+ * - `new` — the template has a file this app was never given
20
20
  */
21
- state: "current" | "outdated" | "conflict" | "customized" | "deleted";
21
+ state: "current" | "outdated" | "conflict" | "customized" | "deleted" | "new";
22
22
  };
23
23
  export type UpgradeReport = {
24
24
  installedVersion: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-check.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAwDxE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CA0B5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAE7D"}
1
+ {"version":3,"file":"upgrade-check.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,KAAK,CAAC;CAC/E,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAqExE;AAaD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CA2B5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAE7D"}