@design-intelligence/ghost 0.20.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 (269) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +75 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +19 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/cli.d.ts +4 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +29 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/checks-command.d.ts +9 -0
  12. package/dist/commands/checks-command.d.ts.map +1 -0
  13. package/dist/commands/checks-command.js +45 -0
  14. package/dist/commands/checks-command.js.map +1 -0
  15. package/dist/commands/command-discovery.d.ts +57 -0
  16. package/dist/commands/command-discovery.d.ts.map +1 -0
  17. package/dist/commands/command-discovery.js +220 -0
  18. package/dist/commands/command-discovery.js.map +1 -0
  19. package/dist/commands/errors.d.ts +7 -0
  20. package/dist/commands/errors.d.ts.map +1 -0
  21. package/dist/commands/errors.js +19 -0
  22. package/dist/commands/errors.js.map +1 -0
  23. package/dist/commands/export-command.d.ts +3 -0
  24. package/dist/commands/export-command.d.ts.map +1 -0
  25. package/dist/commands/export-command.js +157 -0
  26. package/dist/commands/export-command.js.map +1 -0
  27. package/dist/commands/fingerprint-commands.d.ts +10 -0
  28. package/dist/commands/fingerprint-commands.d.ts.map +1 -0
  29. package/dist/commands/fingerprint-commands.js +74 -0
  30. package/dist/commands/fingerprint-commands.js.map +1 -0
  31. package/dist/commands/gather-command.d.ts +3 -0
  32. package/dist/commands/gather-command.d.ts.map +1 -0
  33. package/dist/commands/gather-command.js +152 -0
  34. package/dist/commands/gather-command.js.map +1 -0
  35. package/dist/commands/init-command.d.ts +3 -0
  36. package/dist/commands/init-command.d.ts.map +1 -0
  37. package/dist/commands/init-command.js +79 -0
  38. package/dist/commands/init-command.js.map +1 -0
  39. package/dist/commands/manifest-command.d.ts +9 -0
  40. package/dist/commands/manifest-command.d.ts.map +1 -0
  41. package/dist/commands/manifest-command.js +33 -0
  42. package/dist/commands/manifest-command.js.map +1 -0
  43. package/dist/commands/pull-command.d.ts +3 -0
  44. package/dist/commands/pull-command.d.ts.map +1 -0
  45. package/dist/commands/pull-command.js +224 -0
  46. package/dist/commands/pull-command.js.map +1 -0
  47. package/dist/commands/pulse-command.d.ts +3 -0
  48. package/dist/commands/pulse-command.d.ts.map +1 -0
  49. package/dist/commands/pulse-command.js +257 -0
  50. package/dist/commands/pulse-command.js.map +1 -0
  51. package/dist/commands/review-command.d.ts +3 -0
  52. package/dist/commands/review-command.d.ts.map +1 -0
  53. package/dist/commands/review-command.js +77 -0
  54. package/dist/commands/review-command.js.map +1 -0
  55. package/dist/commands/skill-command.d.ts +3 -0
  56. package/dist/commands/skill-command.d.ts.map +1 -0
  57. package/dist/commands/skill-command.js +96 -0
  58. package/dist/commands/skill-command.js.map +1 -0
  59. package/dist/fingerprint.d.ts +5 -0
  60. package/dist/fingerprint.d.ts.map +1 -0
  61. package/dist/fingerprint.js +3 -0
  62. package/dist/fingerprint.js.map +1 -0
  63. package/dist/ghost-core/catalog/assemble.d.ts +30 -0
  64. package/dist/ghost-core/catalog/assemble.d.ts.map +1 -0
  65. package/dist/ghost-core/catalog/assemble.js +38 -0
  66. package/dist/ghost-core/catalog/assemble.js.map +1 -0
  67. package/dist/ghost-core/catalog/closest.d.ts +16 -0
  68. package/dist/ghost-core/catalog/closest.d.ts.map +1 -0
  69. package/dist/ghost-core/catalog/closest.js +63 -0
  70. package/dist/ghost-core/catalog/closest.js.map +1 -0
  71. package/dist/ghost-core/catalog/index.d.ts +10 -0
  72. package/dist/ghost-core/catalog/index.d.ts.map +1 -0
  73. package/dist/ghost-core/catalog/index.js +9 -0
  74. package/dist/ghost-core/catalog/index.js.map +1 -0
  75. package/dist/ghost-core/catalog/menu.d.ts +36 -0
  76. package/dist/ghost-core/catalog/menu.d.ts.map +1 -0
  77. package/dist/ghost-core/catalog/menu.js +27 -0
  78. package/dist/ghost-core/catalog/menu.js.map +1 -0
  79. package/dist/ghost-core/catalog/types.d.ts +37 -0
  80. package/dist/ghost-core/catalog/types.d.ts.map +1 -0
  81. package/dist/ghost-core/catalog/types.js +2 -0
  82. package/dist/ghost-core/catalog/types.js.map +1 -0
  83. package/dist/ghost-core/check/index.d.ts +12 -0
  84. package/dist/ghost-core/check/index.d.ts.map +1 -0
  85. package/dist/ghost-core/check/index.js +12 -0
  86. package/dist/ghost-core/check/index.js.map +1 -0
  87. package/dist/ghost-core/check/lint.d.ts +9 -0
  88. package/dist/ghost-core/check/lint.d.ts.map +1 -0
  89. package/dist/ghost-core/check/lint.js +119 -0
  90. package/dist/ghost-core/check/lint.js.map +1 -0
  91. package/dist/ghost-core/check/load.d.ts +7 -0
  92. package/dist/ghost-core/check/load.d.ts.map +1 -0
  93. package/dist/ghost-core/check/load.js +44 -0
  94. package/dist/ghost-core/check/load.js.map +1 -0
  95. package/dist/ghost-core/check/parse.d.ts +12 -0
  96. package/dist/ghost-core/check/parse.d.ts.map +1 -0
  97. package/dist/ghost-core/check/parse.js +13 -0
  98. package/dist/ghost-core/check/parse.js.map +1 -0
  99. package/dist/ghost-core/check/source-ref.d.ts +27 -0
  100. package/dist/ghost-core/check/source-ref.d.ts.map +1 -0
  101. package/dist/ghost-core/check/source-ref.js +58 -0
  102. package/dist/ghost-core/check/source-ref.js.map +1 -0
  103. package/dist/ghost-core/check/types.d.ts +48 -0
  104. package/dist/ghost-core/check/types.d.ts.map +1 -0
  105. package/dist/ghost-core/check/types.js +4 -0
  106. package/dist/ghost-core/check/types.js.map +1 -0
  107. package/dist/ghost-core/errors.d.ts +30 -0
  108. package/dist/ghost-core/errors.d.ts.map +1 -0
  109. package/dist/ghost-core/errors.js +33 -0
  110. package/dist/ghost-core/errors.js.map +1 -0
  111. package/dist/ghost-core/glob.d.ts +5 -0
  112. package/dist/ghost-core/glob.d.ts.map +1 -0
  113. package/dist/ghost-core/glob.js +68 -0
  114. package/dist/ghost-core/glob.js.map +1 -0
  115. package/dist/ghost-core/glossary.d.ts +38 -0
  116. package/dist/ghost-core/glossary.d.ts.map +1 -0
  117. package/dist/ghost-core/glossary.js +76 -0
  118. package/dist/ghost-core/glossary.js.map +1 -0
  119. package/dist/ghost-core/index.d.ts +13 -0
  120. package/dist/ghost-core/index.d.ts.map +1 -0
  121. package/dist/ghost-core/index.js +19 -0
  122. package/dist/ghost-core/index.js.map +1 -0
  123. package/dist/ghost-core/markdown.d.ts +15 -0
  124. package/dist/ghost-core/markdown.d.ts.map +1 -0
  125. package/dist/ghost-core/markdown.js +30 -0
  126. package/dist/ghost-core/markdown.js.map +1 -0
  127. package/dist/ghost-core/material-transport.d.ts +43 -0
  128. package/dist/ghost-core/material-transport.d.ts.map +1 -0
  129. package/dist/ghost-core/material-transport.js +231 -0
  130. package/dist/ghost-core/material-transport.js.map +1 -0
  131. package/dist/ghost-core/materials.d.ts +14 -0
  132. package/dist/ghost-core/materials.d.ts.map +1 -0
  133. package/dist/ghost-core/materials.js +52 -0
  134. package/dist/ghost-core/materials.js.map +1 -0
  135. package/dist/ghost-core/node/index.d.ts +11 -0
  136. package/dist/ghost-core/node/index.d.ts.map +1 -0
  137. package/dist/ghost-core/node/index.js +11 -0
  138. package/dist/ghost-core/node/index.js.map +1 -0
  139. package/dist/ghost-core/node/parse.d.ts +16 -0
  140. package/dist/ghost-core/node/parse.d.ts.map +1 -0
  141. package/dist/ghost-core/node/parse.js +55 -0
  142. package/dist/ghost-core/node/parse.js.map +1 -0
  143. package/dist/ghost-core/node/schema.d.ts +17 -0
  144. package/dist/ghost-core/node/schema.d.ts.map +1 -0
  145. package/dist/ghost-core/node/schema.js +49 -0
  146. package/dist/ghost-core/node/schema.js.map +1 -0
  147. package/dist/ghost-core/node/serialize.d.ts +11 -0
  148. package/dist/ghost-core/node/serialize.d.ts.map +1 -0
  149. package/dist/ghost-core/node/serialize.js +21 -0
  150. package/dist/ghost-core/node/serialize.js.map +1 -0
  151. package/dist/ghost-core/node/steering.d.ts +18 -0
  152. package/dist/ghost-core/node/steering.d.ts.map +1 -0
  153. package/dist/ghost-core/node/steering.js +65 -0
  154. package/dist/ghost-core/node/steering.js.map +1 -0
  155. package/dist/ghost-core/node/types.d.ts +42 -0
  156. package/dist/ghost-core/node/types.d.ts.map +1 -0
  157. package/dist/ghost-core/node/types.js +2 -0
  158. package/dist/ghost-core/node/types.js.map +1 -0
  159. package/dist/ghost-core/package-manifest.d.ts +12 -0
  160. package/dist/ghost-core/package-manifest.d.ts.map +1 -0
  161. package/dist/ghost-core/package-manifest.js +14 -0
  162. package/dist/ghost-core/package-manifest.js.map +1 -0
  163. package/dist/ghost-core/skill-bundle-loader.d.ts +28 -0
  164. package/dist/ghost-core/skill-bundle-loader.d.ts.map +1 -0
  165. package/dist/ghost-core/skill-bundle-loader.js +51 -0
  166. package/dist/ghost-core/skill-bundle-loader.js.map +1 -0
  167. package/dist/index.d.ts +5 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +5 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/internal/fs.d.ts +4 -0
  172. package/dist/internal/fs.d.ts.map +1 -0
  173. package/dist/internal/fs.js +24 -0
  174. package/dist/internal/fs.js.map +1 -0
  175. package/dist/observability-events.d.ts +27 -0
  176. package/dist/observability-events.d.ts.map +1 -0
  177. package/dist/observability-events.js +56 -0
  178. package/dist/observability-events.js.map +1 -0
  179. package/dist/package-version.d.ts +3 -0
  180. package/dist/package-version.d.ts.map +1 -0
  181. package/dist/package-version.js +10 -0
  182. package/dist/package-version.js.map +1 -0
  183. package/dist/review/baseline.d.ts +11 -0
  184. package/dist/review/baseline.d.ts.map +1 -0
  185. package/dist/review/baseline.js +35 -0
  186. package/dist/review/baseline.js.map +1 -0
  187. package/dist/review/diff.d.ts +7 -0
  188. package/dist/review/diff.d.ts.map +1 -0
  189. package/dist/review/diff.js +41 -0
  190. package/dist/review/diff.js.map +1 -0
  191. package/dist/review/glob.d.ts +2 -0
  192. package/dist/review/glob.d.ts.map +1 -0
  193. package/dist/review/glob.js +2 -0
  194. package/dist/review/glob.js.map +1 -0
  195. package/dist/review/probes.d.ts +13 -0
  196. package/dist/review/probes.d.ts.map +1 -0
  197. package/dist/review/probes.js +45 -0
  198. package/dist/review/probes.js.map +1 -0
  199. package/dist/review/resolve.d.ts +29 -0
  200. package/dist/review/resolve.d.ts.map +1 -0
  201. package/dist/review/resolve.js +87 -0
  202. package/dist/review/resolve.js.map +1 -0
  203. package/dist/review/review-packet.d.ts +40 -0
  204. package/dist/review/review-packet.d.ts.map +1 -0
  205. package/dist/review/review-packet.js +139 -0
  206. package/dist/review/review-packet.js.map +1 -0
  207. package/dist/scan/check-files.d.ts +23 -0
  208. package/dist/scan/check-files.d.ts.map +1 -0
  209. package/dist/scan/check-files.js +90 -0
  210. package/dist/scan/check-files.js.map +1 -0
  211. package/dist/scan/check-scaffold.d.ts +7 -0
  212. package/dist/scan/check-scaffold.d.ts.map +1 -0
  213. package/dist/scan/check-scaffold.js +37 -0
  214. package/dist/scan/check-scaffold.js.map +1 -0
  215. package/dist/scan/constants.d.ts +21 -0
  216. package/dist/scan/constants.d.ts.map +1 -0
  217. package/dist/scan/constants.js +21 -0
  218. package/dist/scan/constants.js.map +1 -0
  219. package/dist/scan/file-kind.d.ts +12 -0
  220. package/dist/scan/file-kind.d.ts.map +1 -0
  221. package/dist/scan/file-kind.js +114 -0
  222. package/dist/scan/file-kind.js.map +1 -0
  223. package/dist/scan/fingerprint-package-loader.d.ts +5 -0
  224. package/dist/scan/fingerprint-package-loader.d.ts.map +1 -0
  225. package/dist/scan/fingerprint-package-loader.js +105 -0
  226. package/dist/scan/fingerprint-package-loader.js.map +1 -0
  227. package/dist/scan/fingerprint-package.d.ts +58 -0
  228. package/dist/scan/fingerprint-package.d.ts.map +1 -0
  229. package/dist/scan/fingerprint-package.js +301 -0
  230. package/dist/scan/fingerprint-package.js.map +1 -0
  231. package/dist/scan/index.d.ts +3 -0
  232. package/dist/scan/index.d.ts.map +1 -0
  233. package/dist/scan/index.js +3 -0
  234. package/dist/scan/index.js.map +1 -0
  235. package/dist/scan/lint.d.ts +15 -0
  236. package/dist/scan/lint.d.ts.map +1 -0
  237. package/dist/scan/lint.js +2 -0
  238. package/dist/scan/lint.js.map +1 -0
  239. package/dist/scan/node-files.d.ts +25 -0
  240. package/dist/scan/node-files.d.ts.map +1 -0
  241. package/dist/scan/node-files.js +114 -0
  242. package/dist/scan/node-files.js.map +1 -0
  243. package/dist/scan/package-paths.d.ts +10 -0
  244. package/dist/scan/package-paths.d.ts.map +1 -0
  245. package/dist/scan/package-paths.js +49 -0
  246. package/dist/scan/package-paths.js.map +1 -0
  247. package/dist/scan/steering-template.d.ts +8 -0
  248. package/dist/scan/steering-template.d.ts.map +1 -0
  249. package/dist/scan/steering-template.js +266 -0
  250. package/dist/scan/steering-template.js.map +1 -0
  251. package/dist/scan/tarball.d.ts +23 -0
  252. package/dist/scan/tarball.d.ts.map +1 -0
  253. package/dist/scan/tarball.js +145 -0
  254. package/dist/scan/tarball.js.map +1 -0
  255. package/dist/scan/templates.d.ts +24 -0
  256. package/dist/scan/templates.d.ts.map +1 -0
  257. package/dist/scan/templates.js +295 -0
  258. package/dist/scan/templates.js.map +1 -0
  259. package/dist/skill-bundle/SKILL.md +140 -0
  260. package/dist/skill-bundle/references/authoring-scenarios.md +147 -0
  261. package/dist/skill-bundle/references/blocks.md +180 -0
  262. package/dist/skill-bundle/references/brief.md +49 -0
  263. package/dist/skill-bundle/references/capture.md +377 -0
  264. package/dist/skill-bundle/references/recall.md +38 -0
  265. package/dist/skill-bundle/references/schema.md +119 -0
  266. package/dist/skill-bundle/references/self-check.md +65 -0
  267. package/dist/skill-bundle/references/steering-audit.md +61 -0
  268. package/dist/skill-bundle/references/wild.md +30 -0
  269. package/package.json +79 -0
@@ -0,0 +1,114 @@
1
+ import { parse as parseYaml } from "yaml";
2
+ import { GhostFingerprintPackageManifestSchema, lintGhostCheck, lintGhostNode, } from "#ghost-core";
3
+ import { GHOST_MATERIALS_DIR } from "./constants.js";
4
+ /**
5
+ * Decide whether a file is a bundle artifact. The manifest routes to its
6
+ * artifact linter; files under a root `materials/` directory are material
7
+ * files; markdown under a `checks/` directory is a check; any other markdown
8
+ * is a node (its path is its id). Unknown files remain unsupported
9
+ * instead of being guessed at.
10
+ */
11
+ export function detectFileKind(path, raw) {
12
+ const lowerPath = path.toLowerCase();
13
+ const filename = lowerPath.split(/[\\/]/).pop() ?? lowerPath;
14
+ if (filename === "manifest.yml") {
15
+ return "fingerprint-manifest";
16
+ }
17
+ if (filename === "manifest.yaml") {
18
+ return "fingerprint-manifest";
19
+ }
20
+ if (new RegExp(`(^|[\\\\/])${GHOST_MATERIALS_DIR}[\\\\/]`).test(lowerPath)) {
21
+ return "material";
22
+ }
23
+ // A markdown check lives under a `checks/` directory. Detected by location
24
+ // so the established agent-check format (no `schema:` field) is recognized.
25
+ if (filename.endsWith(".md") && /(^|[\\/])checks[\\/]/.test(lowerPath)) {
26
+ return "check";
27
+ }
28
+ // Any other markdown file is a node (ghost.node/v1). Its id is its path.
29
+ if (filename.endsWith(".md")) {
30
+ return "node";
31
+ }
32
+ if (/^\s*schema:\s*ghost\.fingerprint-package\/v1\b/m.test(raw)) {
33
+ return "fingerprint-manifest";
34
+ }
35
+ return "unsupported";
36
+ }
37
+ export function lintDetectedFileKind(kind, raw) {
38
+ return kind === "fingerprint-manifest"
39
+ ? lintFingerprintManifestFile(raw)
40
+ : kind === "check"
41
+ ? lintGhostCheck(raw)
42
+ : kind === "material"
43
+ ? emptyLintReport()
44
+ : kind === "node"
45
+ ? lintGhostNode(raw)
46
+ : lintUnsupportedFile();
47
+ }
48
+ function emptyLintReport() {
49
+ return { issues: [], errors: 0, warnings: 0, info: 0 };
50
+ }
51
+ function lintFingerprintManifestFile(raw) {
52
+ try {
53
+ return zodLintReport(GhostFingerprintPackageManifestSchema.safeParse(parseYaml(raw)));
54
+ }
55
+ catch (err) {
56
+ return yamlErrorReport("fingerprint-manifest-not-yaml", "manifest.yml", err);
57
+ }
58
+ }
59
+ function zodLintReport(result) {
60
+ if (result.success) {
61
+ return { issues: [], errors: 0, warnings: 0, info: 0 };
62
+ }
63
+ const issues = result.error?.issues.map((issue) => ({
64
+ severity: "error",
65
+ rule: `schema/${issue.code}`,
66
+ message: issue.message,
67
+ path: formatZodPath(issue.path),
68
+ })) ?? [];
69
+ return {
70
+ issues,
71
+ errors: issues.length,
72
+ warnings: 0,
73
+ info: 0,
74
+ };
75
+ }
76
+ function lintUnsupportedFile() {
77
+ return {
78
+ issues: [
79
+ {
80
+ severity: "error",
81
+ rule: "unsupported-artifact",
82
+ message: "File is not a recognized Ghost artifact. Use manifest.yml, a checks/*.md check, or a *.md node.",
83
+ },
84
+ ],
85
+ errors: 1,
86
+ warnings: 0,
87
+ info: 0,
88
+ };
89
+ }
90
+ function yamlErrorReport(rule, label, err) {
91
+ return {
92
+ issues: [
93
+ {
94
+ severity: "error",
95
+ rule,
96
+ message: `${label} is not valid YAML: ${err instanceof Error ? err.message : String(err)}`,
97
+ },
98
+ ],
99
+ errors: 1,
100
+ warnings: 0,
101
+ info: 0,
102
+ };
103
+ }
104
+ function formatZodPath(path) {
105
+ if (path.length === 0)
106
+ return undefined;
107
+ return path.reduce((formatted, segment) => {
108
+ if (typeof segment === "number")
109
+ return `${formatted}[${segment}]`;
110
+ const key = String(segment);
111
+ return formatted ? `${formatted}.${key}` : key;
112
+ }, "");
113
+ }
114
+ //# sourceMappingURL=file-kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-kind.js","sourceRoot":"","sources":["../../src/scan/file-kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FingerprintPackagePaths, LoadedFingerprintPackage } from "./fingerprint-package.js";
2
+ import type { LintIssue } from "./lint.js";
3
+ export declare function loadFingerprintPackage(paths: FingerprintPackagePaths): Promise<LoadedFingerprintPackage>;
4
+ export declare function lintFingerprintPackageManifest(raw: string, issues: LintIssue[]): void;
5
+ //# sourceMappingURL=fingerprint-package-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint-package-loader.d.ts","sourceRoot":"","sources":["../../src/scan/fingerprint-package-loader.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAmCnC;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,EAAE,GAClB,IAAI,CAkBN"}
@@ -0,0 +1,105 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { assembleCatalog, GhostFingerprintPackageManifestSchema, parseGlossary, UsageError, } from "#ghost-core";
4
+ import { isMissingPathError } from "../internal/fs.js";
5
+ import { loadCheckFiles } from "./check-files.js";
6
+ import { loadNodeFiles } from "./node-files.js";
7
+ export async function loadFingerprintPackage(paths) {
8
+ let manifestRaw;
9
+ try {
10
+ manifestRaw = await readFile(paths.manifest, "utf-8");
11
+ }
12
+ catch (err) {
13
+ // A missing package is a usage error (run `ghost init`), not a crash.
14
+ if (isMissingPathError(err)) {
15
+ throw new UsageError(`No Ghost fingerprint package found at ${paths.packageDir} (expected manifest.yml). Run \`ghost init\` or pass --package <dir>.`);
16
+ }
17
+ throw err;
18
+ }
19
+ const manifest = parseManifest(manifestRaw, "manifest.yml");
20
+ // The catalog is flat and valid by construction — no edges to resolve.
21
+ // Per-node schema failures are collected as `invalid`.
22
+ const { nodes: placedNodes, invalid } = await loadNodeFiles(paths.packageDir);
23
+ const checkFiles = await loadCheckFiles(paths.packageDir);
24
+ const postureKinds = await readPostureGlossaryKinds(paths.glossary);
25
+ const catalog = assembleCatalog({
26
+ placedNodes,
27
+ wildKinds: postureKinds.wild,
28
+ guardKinds: postureKinds.guard,
29
+ });
30
+ return {
31
+ manifest,
32
+ manifestRaw,
33
+ catalog,
34
+ hasChecksDir: checkFiles.hasChecksDir,
35
+ checks: checkFiles.checks,
36
+ invalid,
37
+ invalidChecks: checkFiles.invalid,
38
+ };
39
+ }
40
+ export function lintFingerprintPackageManifest(raw, issues) {
41
+ const manifest = parseYamlSafe(raw, "manifest.yml", issues);
42
+ if (manifest === undefined)
43
+ return;
44
+ const manifestResult = GhostFingerprintPackageManifestSchema.safeParse(manifest);
45
+ if (!manifestResult.success) {
46
+ issues.push(...manifestResult.error.issues.map((issue) => ({
47
+ severity: "error",
48
+ rule: `schema/${issue.code}`,
49
+ message: issue.message,
50
+ path: issue.path.length
51
+ ? `manifest.yml.${issue.path.join(".")}`
52
+ : "manifest.yml",
53
+ })));
54
+ return;
55
+ }
56
+ }
57
+ async function readPostureGlossaryKinds(glossaryPath) {
58
+ let raw;
59
+ try {
60
+ raw = await readFile(glossaryPath, "utf-8");
61
+ }
62
+ catch (err) {
63
+ if (isMissingPathError(err))
64
+ return { wild: [], guard: [] };
65
+ throw err;
66
+ }
67
+ const result = parseGlossary(raw);
68
+ if (result.glossary === null)
69
+ return { wild: [], guard: [] };
70
+ return {
71
+ wild: result.glossary.kinds
72
+ .filter((kind) => kind.posture === "wild")
73
+ .map((kind) => kind.name),
74
+ guard: result.glossary.kinds
75
+ .filter((kind) => kind.posture === "guard")
76
+ .map((kind) => kind.name),
77
+ };
78
+ }
79
+ function parseManifest(raw, label) {
80
+ const parsed = parseYamlStrict(raw, label);
81
+ return GhostFingerprintPackageManifestSchema.parse(parsed);
82
+ }
83
+ function parseYamlStrict(raw, label) {
84
+ try {
85
+ return parseYaml(raw);
86
+ }
87
+ catch (err) {
88
+ throw new Error(`${label} is not valid YAML: ${err instanceof Error ? err.message : String(err)}`);
89
+ }
90
+ }
91
+ function parseYamlSafe(raw, label, issues) {
92
+ try {
93
+ return parseYaml(raw);
94
+ }
95
+ catch (err) {
96
+ issues.push({
97
+ severity: "error",
98
+ rule: "package-yaml-invalid",
99
+ message: `${label} is not valid YAML: ${err instanceof Error ? err.message : String(err)}`,
100
+ path: label,
101
+ });
102
+ return undefined;
103
+ }
104
+ }
105
+ //# sourceMappingURL=fingerprint-package-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint-package-loader.js","sourceRoot":"","sources":["../../src/scan/fingerprint-package-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type GhostCatalog, type GhostFingerprintPackageManifest } from "#ghost-core";
2
+ import type { LoadedCheck } from "./check-files.js";
3
+ import { loadFingerprintPackage } from "./fingerprint-package-loader.js";
4
+ import type { LintReport } from "./lint.js";
5
+ export { loadFingerprintPackage };
6
+ export interface FingerprintPackagePaths {
7
+ dir: string;
8
+ packageDir: string;
9
+ manifest: string;
10
+ glossary: string;
11
+ /** Legacy facet paths — used only to detect pre-flat-corpus packages. */
12
+ intent: string;
13
+ inventory: string;
14
+ composition: string;
15
+ }
16
+ export interface LoadedFingerprintPackage {
17
+ manifest: GhostFingerprintPackageManifest;
18
+ manifestRaw: string;
19
+ /** The in-memory flat node catalog — the only fingerprint model. */
20
+ catalog: GhostCatalog;
21
+ /** Whether `.ghost/checks/` exists; `ghost review` requires it. */
22
+ hasChecksDir: boolean;
23
+ /** Checks from `.ghost/checks/`; never part of gather/pull. */
24
+ checks: Map<string, LoadedCheck>;
25
+ /**
26
+ * Nodes that failed per-node lint and were skipped while loading the catalog,
27
+ * each with its package-relative file path and first error message. Carried
28
+ * so `validate` can surface a malformed node instead of silently dropping it.
29
+ */
30
+ invalid: Array<{
31
+ file: string;
32
+ message: string;
33
+ }>;
34
+ /** Check files that failed lint/loading. */
35
+ invalidChecks: Array<{
36
+ file: string;
37
+ message: string;
38
+ }>;
39
+ }
40
+ export interface InitFingerprintPackageOptions {
41
+ /** Init template name (default: "steering"). */
42
+ template?: string;
43
+ force?: boolean;
44
+ }
45
+ export interface InitFingerprintPackageResult {
46
+ paths: FingerprintPackagePaths;
47
+ /** Package-relative paths of the files the template wrote. */
48
+ written: string[];
49
+ }
50
+ export declare function resolveFingerprintPackage(dirArg: string | undefined, cwd?: string): FingerprintPackagePaths;
51
+ export declare function initFingerprintPackage(dirArg: string | undefined, cwd?: string, options?: InitFingerprintPackageOptions): Promise<InitFingerprintPackageResult>;
52
+ /**
53
+ * `validate` for a package: artifact shape, per-node validity, and the
54
+ * deterministic kind-prefix lint enabled by glossary.md. The catalog is flat;
55
+ * loading collects malformed nodes so they can be surfaced as structured issues.
56
+ */
57
+ export declare function lintFingerprintPackage(dirArg: string | undefined, cwd?: string): Promise<LintReport>;
58
+ //# sourceMappingURL=fingerprint-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint-package.d.ts","sourceRoot":"","sources":["../../src/scan/fingerprint-package.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,+BAA+B,EAOrC,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAUpD,OAAO,EAEL,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,WAAW,CAAC;AAQvD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,+BAA+B,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,OAAO,EAAE,YAAY,CAAC;IACtB,mEAAmE;IACnE,YAAY,EAAE,OAAO,CAAC;IACtB,+DAA+D;IAC/D,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC;;;;OAIG;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,4CAA4C;IAC5C,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,6BAA6B;IAC5C,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,uBAAuB,CAAC;IAC/B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,SAAgB,GAClB,uBAAuB,CAYzB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,SAAgB,EACnB,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,4BAA4B,CAAC,CA+BvC;AAyCD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,SAAgB,GAClB,OAAO,CAAC,UAAU,CAAC,CA0DrB"}
@@ -0,0 +1,301 @@
1
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join, relative, resolve } from "node:path";
3
+ import { classifyMaterialLocator, closestIds, expandLocalMaterialLocator, extractSkeletonSections, listBundledMaterialFiles, materialLocatorClaimsPath, parseGlossary, parseSourceRef, sliceNodeSection, UsageError, } from "#ghost-core";
4
+ import { isExistingPathError, isMissingPathError } from "../internal/fs.js";
5
+ import { FINGERPRINT_COMPOSITION_FILENAME, FINGERPRINT_INTENT_FILENAME, FINGERPRINT_INVENTORY_FILENAME, FINGERPRINT_MANIFEST_FILENAME, FINGERPRINT_PACKAGE_DIR, GHOST_GLOSSARY_FILENAME, GHOST_MATERIALS_DIR, } from "./constants.js";
6
+ import { lintFingerprintPackageManifest, loadFingerprintPackage, } from "./fingerprint-package-loader.js";
7
+ import { resolveGitRoot } from "./package-paths.js";
8
+ import { DEFAULT_TEMPLATE_NAME, getInitTemplate, listInitTemplates, } from "./templates.js";
9
+ export { loadFingerprintPackage };
10
+ export function resolveFingerprintPackage(dirArg, cwd = process.cwd()) {
11
+ const dir = resolve(cwd, dirArg ?? FINGERPRINT_PACKAGE_DIR);
12
+ const packageDir = dir;
13
+ return {
14
+ dir,
15
+ packageDir,
16
+ manifest: join(packageDir, FINGERPRINT_MANIFEST_FILENAME),
17
+ glossary: join(packageDir, GHOST_GLOSSARY_FILENAME),
18
+ intent: join(packageDir, FINGERPRINT_INTENT_FILENAME),
19
+ inventory: join(packageDir, FINGERPRINT_INVENTORY_FILENAME),
20
+ composition: join(packageDir, FINGERPRINT_COMPOSITION_FILENAME),
21
+ };
22
+ }
23
+ export async function initFingerprintPackage(dirArg, cwd = process.cwd(), options = {}) {
24
+ const templateName = options.template ?? DEFAULT_TEMPLATE_NAME;
25
+ const template = getInitTemplate(templateName);
26
+ if (!template) {
27
+ throw new UsageError(`Unknown init template '${templateName}'. Available: ${listInitTemplates().join(", ")}.`);
28
+ }
29
+ const paths = resolveFingerprintPackage(dirArg, cwd);
30
+ await mkdir(paths.packageDir, { recursive: true });
31
+ const files = template.files().map((file) => ({
32
+ relativePath: file.relativePath,
33
+ path: join(paths.packageDir, file.relativePath),
34
+ content: file.content,
35
+ }));
36
+ if (!options.force) {
37
+ await assertInitDoesNotOverwrite(files.map((file) => file.path));
38
+ }
39
+ // Create any nested directories the template needs (e.g. nodes/).
40
+ const dirs = new Set(files.map((file) => dirname(file.path)));
41
+ await Promise.all([...dirs].map((dir) => mkdir(dir, { recursive: true })));
42
+ await Promise.all(files.map((file) => writeInitFile(file.path, file.content, options.force)));
43
+ return { paths, written: files.map((file) => file.relativePath) };
44
+ }
45
+ async function writeInitFile(path, content, force = false) {
46
+ try {
47
+ await writeFile(path, content, {
48
+ encoding: "utf-8",
49
+ flag: force ? "w" : "wx",
50
+ });
51
+ }
52
+ catch (err) {
53
+ if (!force && isExistingPathError(err)) {
54
+ throw new UsageError(`Refusing to overwrite existing Ghost fingerprint file:\n ${path}\nPass --force to overwrite.`);
55
+ }
56
+ throw err;
57
+ }
58
+ }
59
+ async function assertInitDoesNotOverwrite(paths) {
60
+ const existing = [];
61
+ for (const path of paths) {
62
+ try {
63
+ await access(path);
64
+ existing.push(path);
65
+ }
66
+ catch (err) {
67
+ if (isMissingPathError(err))
68
+ continue;
69
+ throw err;
70
+ }
71
+ }
72
+ if (existing.length > 0) {
73
+ const formatted = existing.map((path) => ` ${path}`).join("\n");
74
+ throw new UsageError(`Refusing to overwrite existing Ghost fingerprint file(s):\n${formatted}\nPass --force to overwrite.`);
75
+ }
76
+ }
77
+ /**
78
+ * `validate` for a package: artifact shape, per-node validity, and the
79
+ * deterministic kind-prefix lint enabled by glossary.md. The catalog is flat;
80
+ * loading collects malformed nodes so they can be surfaced as structured issues.
81
+ */
82
+ export async function lintFingerprintPackage(dirArg, cwd = process.cwd()) {
83
+ const paths = resolveFingerprintPackage(dirArg, cwd);
84
+ const issues = [];
85
+ const manifestRaw = await readRequired(paths.manifest, "manifest.yml", issues);
86
+ if (manifestRaw !== undefined) {
87
+ // shape pass: manifest well-formed.
88
+ const beforeManifestErrors = issues.filter((issue) => issue.severity === "error").length;
89
+ lintFingerprintPackageManifest(manifestRaw, issues);
90
+ const manifestHasErrors = issues.filter((issue) => issue.severity === "error").length >
91
+ beforeManifestErrors;
92
+ if (manifestHasErrors)
93
+ return finalize(issues);
94
+ // catalog pass: load + validate the node catalog.
95
+ try {
96
+ const { catalog, checks, invalid, invalidChecks } = await loadFingerprintPackage(paths);
97
+ // node pass: a node that failed its own schema was skipped while loading
98
+ // the catalog; surface it here so a malformed node is loud, not silent.
99
+ issues.push(...invalid.map((entry) => ({
100
+ severity: "error",
101
+ rule: "node-invalid",
102
+ message: entry.message,
103
+ path: entry.file,
104
+ })));
105
+ issues.push(...invalidChecks.map((entry) => ({
106
+ severity: "error",
107
+ rule: "check-invalid",
108
+ message: entry.message,
109
+ path: entry.file,
110
+ })));
111
+ await lintGlossary(paths.glossary, issues);
112
+ await lintKindPrefixes(paths, catalog, issues);
113
+ lintSkeletonSections(catalog, issues);
114
+ await lintMaterialLocators(paths, catalog, issues, cwd);
115
+ lintCheckReferences(catalog, checks, issues);
116
+ }
117
+ catch (err) {
118
+ issues.push({
119
+ severity: "error",
120
+ rule: "package-catalog-invalid",
121
+ message: err instanceof Error ? err.message : String(err),
122
+ path: ".ghost",
123
+ });
124
+ }
125
+ }
126
+ return finalize(issues);
127
+ }
128
+ async function lintGlossary(glossaryPath, issues) {
129
+ let raw;
130
+ try {
131
+ raw = await readFile(glossaryPath, "utf-8");
132
+ }
133
+ catch (err) {
134
+ if (isMissingPathError(err))
135
+ return;
136
+ throw err;
137
+ }
138
+ const result = parseGlossary(raw);
139
+ if (result.glossary !== null)
140
+ return;
141
+ issues.push(...result.errors.map((message) => ({
142
+ severity: "error",
143
+ rule: "glossary-invalid",
144
+ message,
145
+ path: GHOST_GLOSSARY_FILENAME,
146
+ })));
147
+ }
148
+ async function lintKindPrefixes(paths, catalog, issues) {
149
+ const declaredKinds = await readDeclaredGlossaryKinds(paths.glossary);
150
+ if (declaredKinds === undefined)
151
+ return;
152
+ const declared = new Set(declaredKinds);
153
+ for (const node of catalog.nodes.values()) {
154
+ if (node.kind === undefined || declared.has(node.kind))
155
+ continue;
156
+ const suggestions = closestIds(node.kind, declaredKinds, 1);
157
+ const suggestion = suggestions[0];
158
+ issues.push({
159
+ severity: "warning",
160
+ rule: "kind-undeclared",
161
+ message: `Kind prefix \`${node.kind}\` is not declared in ${GHOST_GLOSSARY_FILENAME}.` +
162
+ (suggestion === undefined
163
+ ? " Drop the prefix if this node has no kind."
164
+ : ` Did you mean \`${suggestion}\`? Drop the prefix if this node has no kind.`),
165
+ path: `${node.id}.md`,
166
+ });
167
+ }
168
+ }
169
+ function lintSkeletonSections(catalog, issues) {
170
+ for (const node of catalog.nodes.values()) {
171
+ const sections = extractSkeletonSections(node.body);
172
+ for (const section of sections) {
173
+ if (section.fences.length === 1)
174
+ continue;
175
+ issues.push({
176
+ severity: "warning",
177
+ rule: "skeleton-fence-count",
178
+ message: "## Skeleton section should contain exactly one fenced block; pull will emit all found skeleton fences",
179
+ path: `${node.id}.md`,
180
+ });
181
+ }
182
+ }
183
+ }
184
+ async function lintMaterialLocators(paths, catalog, issues, cwd) {
185
+ const repoRoot = await resolveGitRoot(cwd);
186
+ const options = {
187
+ repoRoot,
188
+ packageDir: paths.packageDir,
189
+ materialsDir: GHOST_MATERIALS_DIR,
190
+ };
191
+ const claimedLocators = [];
192
+ for (const node of catalog.nodes.values()) {
193
+ for (const locator of node.materials ?? []) {
194
+ if (classifyMaterialLocator(locator).kind === "url")
195
+ continue;
196
+ claimedLocators.push(locator);
197
+ const expanded = await expandLocalMaterialLocator(locator, options, {
198
+ cap: Number.POSITIVE_INFINITY,
199
+ });
200
+ if (expanded.matches.length > 0)
201
+ continue;
202
+ issues.push({
203
+ severity: "warning",
204
+ rule: "material-locator-dead",
205
+ message: `material locator '${locator}' matches no local files`,
206
+ path: `${node.id}.md.materials`,
207
+ });
208
+ }
209
+ }
210
+ const bundledFiles = await listBundledMaterialFiles(options);
211
+ for (const file of bundledFiles) {
212
+ const claimed = claimedLocators.some((locator) => materialLocatorClaimsPath(locator, file, options));
213
+ if (claimed)
214
+ continue;
215
+ issues.push({
216
+ severity: "warning",
217
+ rule: "material-orphaned",
218
+ message: "bundled material is not claimed by any node `materials` locator",
219
+ path: toPackageRelative(file, repoRoot, paths.packageDir),
220
+ });
221
+ }
222
+ }
223
+ function toPackageRelative(repoRelativePath, repoRoot, packageDir) {
224
+ const packageRelative = relative(packageDir, resolve(repoRoot, repoRelativePath))
225
+ .replace(/\\/g, "/")
226
+ .replace(/^\.\//, "");
227
+ return packageRelative.startsWith("../") ? repoRelativePath : packageRelative;
228
+ }
229
+ function lintCheckReferences(catalog, checks, issues) {
230
+ for (const check of checks.values()) {
231
+ for (const raw of check.references) {
232
+ const parsed = parseSourceRef(raw);
233
+ if (parsed === null) {
234
+ issues.push({
235
+ severity: "error",
236
+ rule: "check-reference-malformed",
237
+ message: `check reference '${raw}' is not a node id with optional '> Heading' anchor`,
238
+ path: `checks/${check.id}.md.references`,
239
+ });
240
+ continue;
241
+ }
242
+ const node = catalog.nodes.get(parsed.nodeId);
243
+ if (node === undefined) {
244
+ issues.push({
245
+ severity: "warning",
246
+ rule: "check-reference-unresolved",
247
+ message: `check reference '${raw}' does not resolve to a fingerprint node`,
248
+ path: `checks/${check.id}.md.references`,
249
+ });
250
+ continue;
251
+ }
252
+ if (parsed.heading !== undefined &&
253
+ sliceNodeSection(node.body, parsed.heading) === null) {
254
+ issues.push({
255
+ severity: "warning",
256
+ rule: "check-reference-heading-missing",
257
+ message: `check reference '${raw}' names a heading that was not found`,
258
+ path: `checks/${check.id}.md.references`,
259
+ });
260
+ }
261
+ }
262
+ }
263
+ }
264
+ async function readDeclaredGlossaryKinds(glossaryPath) {
265
+ let raw;
266
+ try {
267
+ raw = await readFile(glossaryPath, "utf-8");
268
+ }
269
+ catch (err) {
270
+ if (isMissingPathError(err))
271
+ return undefined;
272
+ throw err;
273
+ }
274
+ const result = parseGlossary(raw);
275
+ if (result.glossary === null)
276
+ return [];
277
+ return result.glossary.frontmatter.kinds.map((kind) => kind.name);
278
+ }
279
+ async function readRequired(path, label, issues) {
280
+ try {
281
+ return await readFile(path, "utf-8");
282
+ }
283
+ catch {
284
+ issues.push({
285
+ severity: "error",
286
+ rule: "package-artifact-missing",
287
+ message: `Fingerprint package is missing ${label}.`,
288
+ path: label,
289
+ });
290
+ return undefined;
291
+ }
292
+ }
293
+ function finalize(issues) {
294
+ return {
295
+ issues,
296
+ errors: issues.filter((issue) => issue.severity === "error").length,
297
+ warnings: issues.filter((issue) => issue.severity === "warning").length,
298
+ info: issues.filter((issue) => issue.severity === "info").length,
299
+ };
300
+ }
301
+ //# sourceMappingURL=fingerprint-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint-package.js","sourceRoot":"","sources":["../../src/scan/fingerprint-package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { FINGERPRINT_PACKAGE_DIR } from "./constants.js";
2
+ export { GHOST_PACKAGE_DIR_ENV, normalizeGhostDir, resolveGhostDirDefault, resolveGitRoot, } from "./package-paths.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scan/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { FINGERPRINT_PACKAGE_DIR } from "./constants.js";
2
+ export { GHOST_PACKAGE_DIR_ENV, normalizeGhostDir, resolveGhostDirDefault, resolveGitRoot, } from "./package-paths.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scan/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,oBAAoB,CAAC"}