@graview/core 0.1.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 (327) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +35 -0
  3. package/dist/app.d.ts +294 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +49 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/arrange.d.ts +185 -0
  8. package/dist/arrange.d.ts.map +1 -0
  9. package/dist/arrange.js +456 -0
  10. package/dist/arrange.js.map +1 -0
  11. package/dist/beginning.d.ts +65 -0
  12. package/dist/beginning.d.ts.map +1 -0
  13. package/dist/beginning.js +94 -0
  14. package/dist/beginning.js.map +1 -0
  15. package/dist/bind.d.ts +42 -0
  16. package/dist/bind.d.ts.map +1 -0
  17. package/dist/bind.js +26 -0
  18. package/dist/bind.js.map +1 -0
  19. package/dist/city.d.ts +93 -0
  20. package/dist/city.d.ts.map +1 -0
  21. package/dist/city.js +160 -0
  22. package/dist/city.js.map +1 -0
  23. package/dist/cli/check/arrangement.d.ts +13 -0
  24. package/dist/cli/check/arrangement.d.ts.map +1 -0
  25. package/dist/cli/check/arrangement.js +63 -0
  26. package/dist/cli/check/arrangement.js.map +1 -0
  27. package/dist/cli/check/beginnings.d.ts +16 -0
  28. package/dist/cli/check/beginnings.d.ts.map +1 -0
  29. package/dist/cli/check/beginnings.js +53 -0
  30. package/dist/cli/check/beginnings.js.map +1 -0
  31. package/dist/cli/check/brand.d.ts +17 -0
  32. package/dist/cli/check/brand.d.ts.map +1 -0
  33. package/dist/cli/check/brand.js +153 -0
  34. package/dist/cli/check/brand.js.map +1 -0
  35. package/dist/cli/check/city.d.ts +17 -0
  36. package/dist/cli/check/city.d.ts.map +1 -0
  37. package/dist/cli/check/city.js +58 -0
  38. package/dist/cli/check/city.js.map +1 -0
  39. package/dist/cli/check/context.d.ts +50 -0
  40. package/dist/cli/check/context.d.ts.map +1 -0
  41. package/dist/cli/check/context.js +37 -0
  42. package/dist/cli/check/context.js.map +1 -0
  43. package/dist/cli/check/fields.d.ts +16 -0
  44. package/dist/cli/check/fields.d.ts.map +1 -0
  45. package/dist/cli/check/fields.js +237 -0
  46. package/dist/cli/check/fields.js.map +1 -0
  47. package/dist/cli/check/index.d.ts +14 -0
  48. package/dist/cli/check/index.d.ts.map +1 -0
  49. package/dist/cli/check/index.js +14 -0
  50. package/dist/cli/check/index.js.map +1 -0
  51. package/dist/cli/check/intelligence.d.ts +17 -0
  52. package/dist/cli/check/intelligence.d.ts.map +1 -0
  53. package/dist/cli/check/intelligence.js +136 -0
  54. package/dist/cli/check/intelligence.js.map +1 -0
  55. package/dist/cli/check/lenses.d.ts +17 -0
  56. package/dist/cli/check/lenses.d.ts.map +1 -0
  57. package/dist/cli/check/lenses.js +239 -0
  58. package/dist/cli/check/lenses.js.map +1 -0
  59. package/dist/cli/check/migrations.d.ts +16 -0
  60. package/dist/cli/check/migrations.d.ts.map +1 -0
  61. package/dist/cli/check/migrations.js +43 -0
  62. package/dist/cli/check/migrations.js.map +1 -0
  63. package/dist/cli/check/modules.d.ts +16 -0
  64. package/dist/cli/check/modules.d.ts.map +1 -0
  65. package/dist/cli/check/modules.js +123 -0
  66. package/dist/cli/check/modules.js.map +1 -0
  67. package/dist/cli/check/policy.d.ts +16 -0
  68. package/dist/cli/check/policy.d.ts.map +1 -0
  69. package/dist/cli/check/policy.js +90 -0
  70. package/dist/cli/check/policy.js.map +1 -0
  71. package/dist/cli/check/relations.d.ts +29 -0
  72. package/dist/cli/check/relations.d.ts.map +1 -0
  73. package/dist/cli/check/relations.js +279 -0
  74. package/dist/cli/check/relations.js.map +1 -0
  75. package/dist/cli/check/routes.d.ts +16 -0
  76. package/dist/cli/check/routes.d.ts.map +1 -0
  77. package/dist/cli/check/routes.js +31 -0
  78. package/dist/cli/check/routes.js.map +1 -0
  79. package/dist/cli/check/settings.d.ts +16 -0
  80. package/dist/cli/check/settings.d.ts.map +1 -0
  81. package/dist/cli/check/settings.js +81 -0
  82. package/dist/cli/check/settings.js.map +1 -0
  83. package/dist/cli/check.d.ts +36 -0
  84. package/dist/cli/check.d.ts.map +1 -0
  85. package/dist/cli/check.js +76 -0
  86. package/dist/cli/check.js.map +1 -0
  87. package/dist/cli/create.d.ts +20 -0
  88. package/dist/cli/create.d.ts.map +1 -0
  89. package/dist/cli/create.js +251 -0
  90. package/dist/cli/create.js.map +1 -0
  91. package/dist/cli/describe.d.ts +35 -0
  92. package/dist/cli/describe.d.ts.map +1 -0
  93. package/dist/cli/describe.js +230 -0
  94. package/dist/cli/describe.js.map +1 -0
  95. package/dist/cli/docs.d.ts +11 -0
  96. package/dist/cli/docs.d.ts.map +1 -0
  97. package/dist/cli/docs.js +152 -0
  98. package/dist/cli/docs.js.map +1 -0
  99. package/dist/cli/index.d.ts +18 -0
  100. package/dist/cli/index.d.ts.map +1 -0
  101. package/dist/cli/index.js +281 -0
  102. package/dist/cli/index.js.map +1 -0
  103. package/dist/extend.d.ts +23 -0
  104. package/dist/extend.d.ts.map +1 -0
  105. package/dist/extend.js +53 -0
  106. package/dist/extend.js.map +1 -0
  107. package/dist/graph/diff.d.ts +31 -0
  108. package/dist/graph/diff.d.ts.map +1 -0
  109. package/dist/graph/diff.js +71 -0
  110. package/dist/graph/diff.js.map +1 -0
  111. package/dist/graph/graph.d.ts +69 -0
  112. package/dist/graph/graph.d.ts.map +1 -0
  113. package/dist/graph/graph.js +284 -0
  114. package/dist/graph/graph.js.map +1 -0
  115. package/dist/graph/primitives.d.ts +52 -0
  116. package/dist/graph/primitives.d.ts.map +1 -0
  117. package/dist/graph/primitives.js +62 -0
  118. package/dist/graph/primitives.js.map +1 -0
  119. package/dist/graph/tracked.d.ts +31 -0
  120. package/dist/graph/tracked.d.ts.map +1 -0
  121. package/dist/graph/tracked.js +69 -0
  122. package/dist/graph/tracked.js.map +1 -0
  123. package/dist/graph/types.d.ts +34 -0
  124. package/dist/graph/types.d.ts.map +1 -0
  125. package/dist/graph/types.js +0 -0
  126. package/dist/graph/types.js.map +1 -0
  127. package/dist/index.d.ts +100 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +90 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/installation.d.ts +112 -0
  132. package/dist/installation.d.ts.map +1 -0
  133. package/dist/installation.js +193 -0
  134. package/dist/installation.js.map +1 -0
  135. package/dist/intelligence-bridge.d.ts +73 -0
  136. package/dist/intelligence-bridge.d.ts.map +1 -0
  137. package/dist/intelligence-bridge.js +31 -0
  138. package/dist/intelligence-bridge.js.map +1 -0
  139. package/dist/invariants/engine.d.ts +36 -0
  140. package/dist/invariants/engine.d.ts.map +1 -0
  141. package/dist/invariants/engine.js +88 -0
  142. package/dist/invariants/engine.js.map +1 -0
  143. package/dist/invariants/types.d.ts +75 -0
  144. package/dist/invariants/types.d.ts.map +1 -0
  145. package/dist/invariants/types.js +2 -0
  146. package/dist/invariants/types.js.map +1 -0
  147. package/dist/modules.d.ts +75 -0
  148. package/dist/modules.d.ts.map +1 -0
  149. package/dist/modules.js +87 -0
  150. package/dist/modules.js.map +1 -0
  151. package/dist/mutations/decidable.d.ts +26 -0
  152. package/dist/mutations/decidable.d.ts.map +1 -0
  153. package/dist/mutations/decidable.js +39 -0
  154. package/dist/mutations/decidable.js.map +1 -0
  155. package/dist/mutations/define-mutation.d.ts +32 -0
  156. package/dist/mutations/define-mutation.d.ts.map +1 -0
  157. package/dist/mutations/define-mutation.js +181 -0
  158. package/dist/mutations/define-mutation.js.map +1 -0
  159. package/dist/mutations/derive-edits.d.ts +75 -0
  160. package/dist/mutations/derive-edits.d.ts.map +1 -0
  161. package/dist/mutations/derive-edits.js +240 -0
  162. package/dist/mutations/derive-edits.js.map +1 -0
  163. package/dist/mutations/form.d.ts +63 -0
  164. package/dist/mutations/form.d.ts.map +1 -0
  165. package/dist/mutations/form.js +113 -0
  166. package/dist/mutations/form.js.map +1 -0
  167. package/dist/mutations/node-ref.d.ts +83 -0
  168. package/dist/mutations/node-ref.d.ts.map +1 -0
  169. package/dist/mutations/node-ref.js +113 -0
  170. package/dist/mutations/node-ref.js.map +1 -0
  171. package/dist/mutations/types.d.ts +136 -0
  172. package/dist/mutations/types.d.ts.map +1 -0
  173. package/dist/mutations/types.js +2 -0
  174. package/dist/mutations/types.js.map +1 -0
  175. package/dist/ops/log.d.ts +35 -0
  176. package/dist/ops/log.d.ts.map +1 -0
  177. package/dist/ops/log.js +103 -0
  178. package/dist/ops/log.js.map +1 -0
  179. package/dist/ops/types.d.ts +52 -0
  180. package/dist/ops/types.d.ts.map +1 -0
  181. package/dist/ops/types.js +2 -0
  182. package/dist/ops/types.js.map +1 -0
  183. package/dist/ops/undo.d.ts +33 -0
  184. package/dist/ops/undo.d.ts.map +1 -0
  185. package/dist/ops/undo.js +65 -0
  186. package/dist/ops/undo.js.map +1 -0
  187. package/dist/permissions/policy.d.ts +68 -0
  188. package/dist/permissions/policy.d.ts.map +1 -0
  189. package/dist/permissions/policy.js +191 -0
  190. package/dist/permissions/policy.js.map +1 -0
  191. package/dist/permissions/types.d.ts +78 -0
  192. package/dist/permissions/types.d.ts.map +1 -0
  193. package/dist/permissions/types.js +17 -0
  194. package/dist/permissions/types.js.map +1 -0
  195. package/dist/persistence/memory.d.ts +6 -0
  196. package/dist/persistence/memory.d.ts.map +1 -0
  197. package/dist/persistence/memory.js +31 -0
  198. package/dist/persistence/memory.js.map +1 -0
  199. package/dist/persistence/sqlite.d.ts +59 -0
  200. package/dist/persistence/sqlite.d.ts.map +1 -0
  201. package/dist/persistence/sqlite.js +131 -0
  202. package/dist/persistence/sqlite.js.map +1 -0
  203. package/dist/persistence/types.d.ts +22 -0
  204. package/dist/persistence/types.d.ts.map +1 -0
  205. package/dist/persistence/types.js +2 -0
  206. package/dist/persistence/types.js.map +1 -0
  207. package/dist/presence.d.ts +38 -0
  208. package/dist/presence.d.ts.map +1 -0
  209. package/dist/presence.js +50 -0
  210. package/dist/presence.js.map +1 -0
  211. package/dist/scaffold/domain.d.ts +8 -0
  212. package/dist/scaffold/domain.d.ts.map +1 -0
  213. package/dist/scaffold/domain.js +331 -0
  214. package/dist/scaffold/domain.js.map +1 -0
  215. package/dist/scaffold/index.d.ts +66 -0
  216. package/dist/scaffold/index.d.ts.map +1 -0
  217. package/dist/scaffold/index.js +142 -0
  218. package/dist/scaffold/index.js.map +1 -0
  219. package/dist/scaffold/lens.d.ts +31 -0
  220. package/dist/scaffold/lens.d.ts.map +1 -0
  221. package/dist/scaffold/lens.js +176 -0
  222. package/dist/scaffold/lens.js.map +1 -0
  223. package/dist/scaffold/names.d.ts +44 -0
  224. package/dist/scaffold/names.d.ts.map +1 -0
  225. package/dist/scaffold/names.js +69 -0
  226. package/dist/scaffold/names.js.map +1 -0
  227. package/dist/scaffold/project.d.ts +41 -0
  228. package/dist/scaffold/project.d.ts.map +1 -0
  229. package/dist/scaffold/project.js +604 -0
  230. package/dist/scaffold/project.js.map +1 -0
  231. package/dist/scaffold/ui.d.ts +15 -0
  232. package/dist/scaffold/ui.d.ts.map +1 -0
  233. package/dist/scaffold/ui.js +536 -0
  234. package/dist/scaffold/ui.js.map +1 -0
  235. package/dist/schema/define-node.d.ts +132 -0
  236. package/dist/schema/define-node.d.ts.map +1 -0
  237. package/dist/schema/define-node.js +254 -0
  238. package/dist/schema/define-node.js.map +1 -0
  239. package/dist/schema/figures.d.ts +42 -0
  240. package/dist/schema/figures.d.ts.map +1 -0
  241. package/dist/schema/figures.js +220 -0
  242. package/dist/schema/figures.js.map +1 -0
  243. package/dist/schema/json-schema.d.ts +39 -0
  244. package/dist/schema/json-schema.d.ts.map +1 -0
  245. package/dist/schema/json-schema.js +74 -0
  246. package/dist/schema/json-schema.js.map +1 -0
  247. package/dist/schema/schema.d.ts +43 -0
  248. package/dist/schema/schema.d.ts.map +1 -0
  249. package/dist/schema/schema.js +102 -0
  250. package/dist/schema/schema.js.map +1 -0
  251. package/dist/schema/types.d.ts +201 -0
  252. package/dist/schema/types.d.ts.map +1 -0
  253. package/dist/schema/types.js +2 -0
  254. package/dist/schema/types.js.map +1 -0
  255. package/dist/search.d.ts +215 -0
  256. package/dist/search.d.ts.map +1 -0
  257. package/dist/search.js +449 -0
  258. package/dist/search.js.map +1 -0
  259. package/dist/settings.d.ts +30 -0
  260. package/dist/settings.d.ts.map +1 -0
  261. package/dist/settings.js +74 -0
  262. package/dist/settings.js.map +1 -0
  263. package/dist/store.d.ts +284 -0
  264. package/dist/store.d.ts.map +1 -0
  265. package/dist/store.js +660 -0
  266. package/dist/store.js.map +1 -0
  267. package/dist/studio-door.d.ts +187 -0
  268. package/dist/studio-door.d.ts.map +1 -0
  269. package/dist/studio-door.js +20 -0
  270. package/dist/studio-door.js.map +1 -0
  271. package/dist/sync/conflict.d.ts +37 -0
  272. package/dist/sync/conflict.d.ts.map +1 -0
  273. package/dist/sync/conflict.js +56 -0
  274. package/dist/sync/conflict.js.map +1 -0
  275. package/dist/sync/engine.d.ts +118 -0
  276. package/dist/sync/engine.d.ts.map +1 -0
  277. package/dist/sync/engine.js +341 -0
  278. package/dist/sync/engine.js.map +1 -0
  279. package/dist/sync/google-calendar.d.ts +54 -0
  280. package/dist/sync/google-calendar.d.ts.map +1 -0
  281. package/dist/sync/google-calendar.js +167 -0
  282. package/dist/sync/google-calendar.js.map +1 -0
  283. package/dist/sync/types.d.ts +125 -0
  284. package/dist/sync/types.d.ts.map +1 -0
  285. package/dist/sync/types.js +6 -0
  286. package/dist/sync/types.js.map +1 -0
  287. package/dist/temporal/effectivity.d.ts +75 -0
  288. package/dist/temporal/effectivity.d.ts.map +1 -0
  289. package/dist/temporal/effectivity.js +89 -0
  290. package/dist/temporal/effectivity.js.map +1 -0
  291. package/dist/testing.d.ts +63 -0
  292. package/dist/testing.d.ts.map +1 -0
  293. package/dist/testing.js +194 -0
  294. package/dist/testing.js.map +1 -0
  295. package/dist/theme/contrast.d.ts +47 -0
  296. package/dist/theme/contrast.d.ts.map +1 -0
  297. package/dist/theme/contrast.js +172 -0
  298. package/dist/theme/contrast.js.map +1 -0
  299. package/dist/theme/derive.d.ts +81 -0
  300. package/dist/theme/derive.d.ts.map +1 -0
  301. package/dist/theme/derive.js +171 -0
  302. package/dist/theme/derive.js.map +1 -0
  303. package/dist/theme/kit.d.ts +106 -0
  304. package/dist/theme/kit.d.ts.map +1 -0
  305. package/dist/theme/kit.js +84 -0
  306. package/dist/theme/kit.js.map +1 -0
  307. package/dist/theme/palettes.d.ts +32 -0
  308. package/dist/theme/palettes.d.ts.map +1 -0
  309. package/dist/theme/palettes.js +96 -0
  310. package/dist/theme/palettes.js.map +1 -0
  311. package/dist/theme/types.d.ts +131 -0
  312. package/dist/theme/types.d.ts.map +1 -0
  313. package/dist/theme/types.js +23 -0
  314. package/dist/theme/types.js.map +1 -0
  315. package/dist/views/types.d.ts +89 -0
  316. package/dist/views/types.d.ts.map +1 -0
  317. package/dist/views/types.js +88 -0
  318. package/dist/views/types.js.map +1 -0
  319. package/dist/watched.d.ts +33 -0
  320. package/dist/watched.d.ts.map +1 -0
  321. package/dist/watched.js +50 -0
  322. package/dist/watched.js.map +1 -0
  323. package/dist/who.d.ts +26 -0
  324. package/dist/who.d.ts.map +1 -0
  325. package/dist/who.js +20 -0
  326. package/dist/who.js.map +1 -0
  327. package/package.json +77 -0
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
3
+ import { mkdir, writeFile } from "node:fs/promises";
4
+ import { dirname, resolve } from "node:path";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+ import { checkApp, formatFindings } from "./check.js";
7
+ import { create, CREATE_USAGE } from "./create.js";
8
+ import { describeApp } from "./describe.js";
9
+ import { generateAgentsMd, generateLlmsTxt } from "./docs.js";
10
+ import { figureBrief, figureFaults, FIGURE_NAMES, FIGURES } from "../schema/figures.js";
11
+ import { scaffoldLens, validateLensOptions } from "../scaffold/lens.js";
12
+ export const USAGE = `graview — start a product, check its declaration, write its agent docs
13
+
14
+ ${CREATE_USAGE}
15
+
16
+ graview check <entry> [--views <module>] [--json]
17
+ Loads <entry> (a module whose default export, or \`app\` export, is a
18
+ GraviewApp) and reports schema problems. Exits 1 on any error.
19
+
20
+ graview docs <entry> [--out <dir>] [--views <module>]
21
+ Writes llms.txt and agents.md next to the entry, or into <dir>.
22
+
23
+ graview describe <entry> [--as <role>] [--views <module>]
24
+ Reads the app out: what a blank installation meets and in what order,
25
+ what is drawn and what falls back, the hues, what a seat may do, how a
26
+ model is reached, what is judged. The rung between check and a browser
27
+ — "run it and look" for something that cannot see.
28
+
29
+ graview lens <name> --roles a,b,c [--binds fields|entities] [--dir <dir>]
30
+ Writes a lens that compiles: the role check that fails loudly, the
31
+ createXLens factory, three fidelities, pick targets — and beside it a
32
+ REUSE TEST in a domain the app is not about, red until you make the
33
+ claim true. If you cannot make it pass, you wrote a view, and a view
34
+ is a legitimate thing to have written.
35
+
36
+ graview figure <entry> --kind <kind> [--name <shipped>]
37
+ [--from "<what the thing is>"] [--judge <file|->]
38
+ Prints the figure line to paste into defineNode. With --name it is one
39
+ of the shipped drawings; with neither, it suggests the nearest one by
40
+ name and says so. --from prints the brief to hand a model — the rules,
41
+ the angle and a shipped figure as the style — and --judge reads the
42
+ answer back, holds it to the rules graview check holds a figure to, and
43
+ prints the line. Nine shipped figures is a vocabulary to start from,
44
+ not a vocabulary to finish in.
45
+ `;
46
+ export async function loadApp(entry) {
47
+ const path = resolve(process.cwd(), entry);
48
+ const module = (await import(pathToFileURL(path).href));
49
+ const app = (module["default"] ?? module["app"]);
50
+ if (!app || typeof app !== "object" || !("schema" in app)) {
51
+ throw new Error(`${entry} does not export a GraviewApp. Export it as default, or as \`app\`.`);
52
+ }
53
+ return app;
54
+ }
55
+ /**
56
+ * The shipped figure whose NAME is closest to a kind's — never a guess
57
+ * about what a thing is. A cleat is not a box, and the framework has never
58
+ * met this domain.
59
+ */
60
+ function nearest(kind) {
61
+ const said = kind.toLowerCase();
62
+ if (FIGURES[said])
63
+ return said;
64
+ return FIGURE_NAMES.find((name) => said.includes(name) || name.includes(said)) ?? "note";
65
+ }
66
+ /**
67
+ * THE PICTURES, FROM WHERE THEY LIVE (F-042).
68
+ *
69
+ * A view registry is React, and the declaration is the domain tier, which
70
+ * must not import React — so no app can pass `defineApp({ views })`, and
71
+ * everything outside a browser went quiet about what is drawn. The
72
+ * pictures are still a module: `--views ./dist/ui/views.js` names it, and
73
+ * this reads the registry — `places()`, `kindsWithViews()`, `all()` —
74
+ * without rendering anything. The module exports `views` (a registry, or
75
+ * a function that builds one), or the registry as its default export.
76
+ */
77
+ export function withViews(app, module, name) {
78
+ const candidate = module["views"] ?? module["default"] ?? module["registry"];
79
+ const registry = typeof candidate === "function" ? candidate() : candidate;
80
+ const looksLikeOne = typeof registry === "object" &&
81
+ registry !== null &&
82
+ typeof registry.kindsWithViews === "function" &&
83
+ typeof registry.places === "function";
84
+ if (!looksLikeOne) {
85
+ throw new Error(`${name} does not export a view registry. Export \`views\` — the registry, or a function that builds it — or the registry as default.`);
86
+ }
87
+ return { ...app, views: registry };
88
+ }
89
+ async function loadViews(app, entry) {
90
+ if (!entry)
91
+ return app;
92
+ const path = resolve(process.cwd(), entry);
93
+ const module = (await import(pathToFileURL(path).href));
94
+ return withViews(app, module, entry);
95
+ }
96
+ function flag(argv, name) {
97
+ const index = argv.indexOf(name);
98
+ if (index === -1)
99
+ return undefined;
100
+ return argv[index + 1] ?? "";
101
+ }
102
+ export async function main(argv) {
103
+ const [command, entry] = argv;
104
+ if (!command || command === "--help" || command === "-h") {
105
+ process.stdout.write(USAGE);
106
+ return 0;
107
+ }
108
+ if (command === "create")
109
+ return create(argv.slice(1));
110
+ if (command === "lens") {
111
+ /*
112
+ * A LENS, STARTED. The rules in `graview-lens` are the kind that are
113
+ * easy to agree with and easy to forget at line 300, so they arrive in
114
+ * the file already — and the reuse test arrives RED, which is the only
115
+ * way an instruction nothing can enforce ever gets followed.
116
+ */
117
+ const name = argv[1];
118
+ if (!name || name.startsWith("--")) {
119
+ process.stderr.write(`graview lens: a name is required\n\n${USAGE}`);
120
+ return 2;
121
+ }
122
+ const roles = (flag(argv, "--roles") ?? "").split(",").map((role) => role.trim()).filter(Boolean);
123
+ const bindsFlag = flag(argv, "--binds");
124
+ const dir = flag(argv, "--dir");
125
+ const options = {
126
+ name,
127
+ roles,
128
+ ...(bindsFlag === "entities" || bindsFlag === "fields" ? { binds: bindsFlag } : {}),
129
+ ...(dir ? { dir } : {}),
130
+ };
131
+ const problems = validateLensOptions(options);
132
+ if (problems.length > 0) {
133
+ process.stderr.write(`graview lens: ${problems.join("\ngraview lens: ")}\n`);
134
+ return 2;
135
+ }
136
+ const files = scaffoldLens(options);
137
+ for (const file of files) {
138
+ const path = resolve(process.cwd(), file.path);
139
+ if (existsSync(path)) {
140
+ process.stderr.write(`graview lens: ${file.path} already exists — nothing was written.\n`);
141
+ return 1;
142
+ }
143
+ }
144
+ for (const file of files) {
145
+ const path = resolve(process.cwd(), file.path);
146
+ mkdirSync(dirname(path), { recursive: true });
147
+ writeFileSync(path, file.contents, "utf8");
148
+ }
149
+ process.stdout.write(`${files.map((file) => ` ${file.path}\n`).join("")}` +
150
+ `\nThe reuse test is RED on purpose: bind the roles to a domain this app is not\n` +
151
+ `about and make it pass, or say plainly that you wrote a view.\n`);
152
+ return 0;
153
+ }
154
+ if (!entry) {
155
+ process.stderr.write(`graview ${command}: an entry module is required\n\n${USAGE}`);
156
+ return 2;
157
+ }
158
+ switch (command) {
159
+ case "check": {
160
+ const app = await loadViews(await loadApp(entry), flag(argv, "--views"));
161
+ const result = checkApp(app);
162
+ if (argv.includes("--json")) {
163
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
164
+ }
165
+ else {
166
+ process.stdout.write(`${formatFindings(result)}\n`);
167
+ }
168
+ return result.ok ? 0 : 1;
169
+ }
170
+ case "docs": {
171
+ const app = await loadViews(await loadApp(entry), flag(argv, "--views"));
172
+ const outDir = resolve(process.cwd(), flag(argv, "--out") || dirname(resolve(process.cwd(), entry)));
173
+ await mkdir(outDir, { recursive: true });
174
+ await writeFile(`${outDir}/llms.txt`, generateLlmsTxt(app), "utf8");
175
+ await writeFile(`${outDir}/agents.md`, generateAgentsMd(app), "utf8");
176
+ process.stdout.write(`graview docs: wrote llms.txt and agents.md to ${outDir}\n`);
177
+ return 0;
178
+ }
179
+ case "describe": {
180
+ /*
181
+ * The one instruction an agent cannot follow is the one every skill
182
+ * ends on. It can declare, and it cannot see — so the derivations say
183
+ * what they would do, in words.
184
+ */
185
+ const app = await loadViews(await loadApp(entry), flag(argv, "--views"));
186
+ const role = flag(argv, "--as");
187
+ process.stdout.write(`${describeApp(app, role ? { as: { kind: "human", id: role, roles: [role] } } : {})}\n`);
188
+ return 0;
189
+ }
190
+ case "figure": {
191
+ /*
192
+ * A DRAWING YOU CAN PASTE, judged before it is printed.
193
+ *
194
+ * No model here: reaching a vendor is `@graview/tools`' job and the
195
+ * CLI has no key, no seam and no business holding one. What this
196
+ * does is the other half — name a figure, judge it against the rules
197
+ * `graview check` will judge it against, and print the line. An
198
+ * agent that HAS a model calls `drawFigure` and lands here anyway,
199
+ * because the judging is the same judging.
200
+ */
201
+ const app = await loadApp(entry);
202
+ const kind = flag(argv, "--kind");
203
+ if (!kind) {
204
+ process.stderr.write(`graview figure: --kind <kind> is required\n\n${USAGE}`);
205
+ return 2;
206
+ }
207
+ if (!app.schema.kinds.includes(kind)) {
208
+ process.stderr.write(`graview figure: "${kind}" is not a kind of ${app.name}. It declares: ${app.schema.kinds.join(", ")}\n`);
209
+ return 1;
210
+ }
211
+ /*
212
+ * THE AUTHORING LOOP, through the door every app has: a prompt to
213
+ * copy and an answer to paste. The CLI still holds no key and reaches
214
+ * no vendor — that is `@graview/tools`' job — and it does the half it
215
+ * is actually good at, which is saying what a figure must be and then
216
+ * judging what came back.
217
+ */
218
+ const from = flag(argv, "--from");
219
+ if (from) {
220
+ process.stdout.write(`${figureBrief(kind, from)}\n`);
221
+ return 0;
222
+ }
223
+ const judge = flag(argv, "--judge");
224
+ if (judge) {
225
+ const drawn = judge === "-" ? readFileSync(0, "utf8") : readFileSync(resolve(process.cwd(), judge), "utf8");
226
+ const trimmed = drawn.trim();
227
+ const faults = figureFaults(trimmed);
228
+ if (faults.length > 0) {
229
+ process.stderr.write(`graview figure: that drawing cannot be kept —\n${faults.map((fault) => ` ${fault}\n`).join("")}` +
230
+ `Ask again with the fault quoted; the brief is graview figure ${entry} --kind ${kind} --from "…".\n`);
231
+ return 1;
232
+ }
233
+ process.stdout.write(` figure:\n ${JSON.stringify(trimmed)},\n` +
234
+ `Paste it into defineNode(${JSON.stringify(kind)}, { ... }), then look at it at twenty pixels.\n`);
235
+ return 0;
236
+ }
237
+ const named = flag(argv, "--name");
238
+ const figure = named || nearest(kind);
239
+ const faults = figureFaults(figure);
240
+ if (faults.length > 0) {
241
+ process.stderr.write(`graview figure: that figure cannot be drawn — ${faults.join(" ")}\n`);
242
+ return 1;
243
+ }
244
+ process.stdout.write(`${named ? "" : `graview figure: nothing was asked to draw one, so this is the nearest shipped figure by name.\n`}` +
245
+ ` figure: ${JSON.stringify(figure)},\n` +
246
+ `Paste it into defineNode("${kind}", { ... }). The shipped set: ${FIGURE_NAMES.join(", ")}.\n`);
247
+ return 0;
248
+ }
249
+ default:
250
+ process.stderr.write(`graview: unknown command "${command}"\n\n${USAGE}`);
251
+ return 2;
252
+ }
253
+ }
254
+ /*
255
+ * Whether this module is the program, not an import. Compared by REAL path:
256
+ * a project's `node_modules/.bin/graview` is a symlink to this file, and
257
+ * comparing the unresolved path made `npx graview check` exit 0 having done
258
+ * nothing — the quietest possible way for a check to pass.
259
+ */
260
+ function invokedAs(argv1) {
261
+ if (argv1 === undefined)
262
+ return false;
263
+ try {
264
+ return realpathSync(argv1) === realpathSync(fileURLToPath(import.meta.url));
265
+ }
266
+ catch {
267
+ return import.meta.url === pathToFileURL(argv1).href;
268
+ }
269
+ }
270
+ const invokedDirectly = invokedAs(process.argv[1]);
271
+ if (invokedDirectly) {
272
+ main(process.argv.slice(2))
273
+ .then((code) => {
274
+ process.exitCode = code;
275
+ })
276
+ .catch((error) => {
277
+ process.stderr.write(`graview: ${error instanceof Error ? error.message : String(error)}\n`);
278
+ process.exitCode = 1;
279
+ });
280
+ }
281
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type AnySchema } from "./schema/schema.js";
2
+ import type { AnyMutationDefinition } from "./mutations/types.js";
3
+ import type { InvariantDefinition } from "./invariants/types.js";
4
+ /**
5
+ * Carries declarations written against a base schema over to a schema that
6
+ * EXTENDS it.
7
+ *
8
+ * Adding a node kind should not mean rewriting the mutations and invariants
9
+ * that never mentioned it — but a mutation typed for seven kinds is not
10
+ * automatically typed for eight, because the reader it is handed is
11
+ * contravariant in the node union. That is a real typing fact, not a bug, and
12
+ * pretending otherwise with a bare cast would hide the moment it stops being
13
+ * true.
14
+ *
15
+ * So this is a checked crossing rather than an assertion: every kind the
16
+ * declarations name must exist in the wider schema, and anything that does
17
+ * not is reported by name. The cast that follows is then sound, and the
18
+ * reason it is sound has been verified rather than asserted.
19
+ */
20
+ export declare function extendMutations<Wide extends AnySchema>(schema: Wide, mutations: readonly AnyMutationDefinition<never>[]): AnyMutationDefinition<Wide>[];
21
+ /** The same checked crossing, for invariants. */
22
+ export declare function extendInvariants<Wide extends AnySchema>(schema: Wide, invariants: readonly InvariantDefinition<never>[]): InvariantDefinition<Wide>[];
23
+ //# sourceMappingURL=extend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,SAAS,EACpD,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,SAAS,qBAAqB,CAAC,KAAK,CAAC,EAAE,GACjD,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAsB/B;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,IAAI,SAAS,SAAS,EACrD,MAAM,EAAE,IAAI,EACZ,UAAU,EAAE,SAAS,mBAAmB,CAAC,KAAK,CAAC,EAAE,GAChD,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAY7B"}
package/dist/extend.js ADDED
@@ -0,0 +1,53 @@
1
+ import { SchemaError } from "./schema/schema.js";
2
+ import { nodeRefArgs } from "./mutations/node-ref.js";
3
+ /**
4
+ * Carries declarations written against a base schema over to a schema that
5
+ * EXTENDS it.
6
+ *
7
+ * Adding a node kind should not mean rewriting the mutations and invariants
8
+ * that never mentioned it — but a mutation typed for seven kinds is not
9
+ * automatically typed for eight, because the reader it is handed is
10
+ * contravariant in the node union. That is a real typing fact, not a bug, and
11
+ * pretending otherwise with a bare cast would hide the moment it stops being
12
+ * true.
13
+ *
14
+ * So this is a checked crossing rather than an assertion: every kind the
15
+ * declarations name must exist in the wider schema, and anything that does
16
+ * not is reported by name. The cast that follows is then sound, and the
17
+ * reason it is sound has been verified rather than asserted.
18
+ */
19
+ export function extendMutations(schema, mutations) {
20
+ const kinds = new Set(schema.kinds);
21
+ for (const mutation of mutations) {
22
+ const named = new Set();
23
+ const subject = mutation.subject;
24
+ if (subject && subject.kinds !== "*") {
25
+ for (const kind of subject.kinds)
26
+ named.add(kind);
27
+ }
28
+ for (const ref of nodeRefArgs(mutation.input)) {
29
+ for (const kind of ref.kinds) {
30
+ if (kind !== "*")
31
+ named.add(kind);
32
+ }
33
+ }
34
+ const missing = [...named].filter((kind) => !kinds.has(kind));
35
+ if (missing.length > 0) {
36
+ throw new SchemaError(`Mutation "${mutation.name}" names node kinds the extended schema does not declare: ${missing.join(", ")}`, `Declared kinds: ${[...kinds].join(", ")}`);
37
+ }
38
+ }
39
+ return mutations;
40
+ }
41
+ /** The same checked crossing, for invariants. */
42
+ export function extendInvariants(schema, invariants) {
43
+ const kinds = new Set(schema.kinds);
44
+ for (const invariant of invariants) {
45
+ if (invariant.scope === "graph")
46
+ continue;
47
+ if (!kinds.has(invariant.scope.kind)) {
48
+ throw new SchemaError(`Invariant "${invariant.name}" is scoped to "${invariant.scope.kind}", which the extended schema does not declare`, `Declared kinds: ${[...kinds].join(", ")}`);
49
+ }
50
+ }
51
+ return invariants;
52
+ }
53
+ //# sourceMappingURL=extend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.js","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAY,EACZ,SAAkD;IAElD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,KAA0B,CAAC,CAAC;IACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAA0B;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,IAAI,IAAI,KAAK,GAAG;oBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,WAAW,CACnB,aAAa,QAAQ,CAAC,IAAI,4DAA4D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC1G,mBAAmB,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,SAAqD,CAAC;AAC/D,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAC9B,MAAY,EACZ,UAAiD;IAEjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,KAA0B,CAAC,CAAC;IACjE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO;YAAE,SAAS;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,WAAW,CACnB,cAAc,SAAS,CAAC,IAAI,mBAAmB,SAAS,CAAC,KAAK,CAAC,IAAI,+CAA+C,EAClH,mBAAmB,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,UAAyC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { AnyGraphNode, GraphEdge, GraphNodeBase } from "./types.js";
2
+ export interface NodeChange<N extends GraphNodeBase = AnyGraphNode> {
3
+ readonly before: N;
4
+ readonly after: N;
5
+ /** Field names whose values differ. */
6
+ readonly fields: readonly string[];
7
+ }
8
+ export interface GraphDiff<N extends GraphNodeBase = AnyGraphNode> {
9
+ readonly addedNodes: readonly N[];
10
+ readonly removedNodes: readonly N[];
11
+ readonly changedNodes: readonly NodeChange<N>[];
12
+ readonly addedEdges: readonly GraphEdge[];
13
+ readonly removedEdges: readonly GraphEdge[];
14
+ /** Every node id implicated, so a renderer can highlight across planes. */
15
+ readonly touched: readonly string[];
16
+ }
17
+ export declare const EMPTY_DIFF: GraphDiff;
18
+ export declare function isEmptyDiff(diff: GraphDiff<never>): boolean;
19
+ /**
20
+ * Pure structural diff of two snapshots. Used for previewing a mutation (or
21
+ * an undo) before it applies — a human edit and an agent edit produce the
22
+ * same diff shape, which is why watching an agent needs no bespoke layer.
23
+ */
24
+ export declare function diffSnapshots<N extends GraphNodeBase>(before: {
25
+ nodes: readonly N[];
26
+ edges: readonly GraphEdge[];
27
+ }, after: {
28
+ nodes: readonly N[];
29
+ edges: readonly GraphEdge[];
30
+ }): GraphDiff<N>;
31
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/graph/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGzE,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,aAAa,GAAG,YAAY;IAChE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,aAAa,GAAG,YAAY;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5C,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,eAAO,MAAM,UAAU,EAAE,SAOxB,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAQ3D;AAaD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,aAAa,EACnD,MAAM,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,EAC5D,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAC1D,SAAS,CAAC,CAAC,CAAC,CAoCd"}
@@ -0,0 +1,71 @@
1
+ import { edgeId } from "./types.js";
2
+ export const EMPTY_DIFF = {
3
+ addedNodes: [],
4
+ removedNodes: [],
5
+ changedNodes: [],
6
+ addedEdges: [],
7
+ removedEdges: [],
8
+ touched: [],
9
+ };
10
+ export function isEmptyDiff(diff) {
11
+ return (diff.addedNodes.length === 0 &&
12
+ diff.removedNodes.length === 0 &&
13
+ diff.changedNodes.length === 0 &&
14
+ diff.addedEdges.length === 0 &&
15
+ diff.removedEdges.length === 0);
16
+ }
17
+ function changedFields(before, after) {
18
+ const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
19
+ const fields = [];
20
+ for (const key of keys) {
21
+ const a = before[key];
22
+ const b = after[key];
23
+ if (JSON.stringify(a) !== JSON.stringify(b))
24
+ fields.push(key);
25
+ }
26
+ return fields.sort();
27
+ }
28
+ /**
29
+ * Pure structural diff of two snapshots. Used for previewing a mutation (or
30
+ * an undo) before it applies — a human edit and an agent edit produce the
31
+ * same diff shape, which is why watching an agent needs no bespoke layer.
32
+ */
33
+ export function diffSnapshots(before, after) {
34
+ const beforeNodes = new Map(before.nodes.map((n) => [n.id, n]));
35
+ const afterNodes = new Map(after.nodes.map((n) => [n.id, n]));
36
+ const addedNodes = after.nodes.filter((n) => !beforeNodes.has(n.id));
37
+ const removedNodes = before.nodes.filter((n) => !afterNodes.has(n.id));
38
+ const changedNodes = [];
39
+ for (const prev of before.nodes) {
40
+ const next = afterNodes.get(prev.id);
41
+ if (!next)
42
+ continue;
43
+ const fields = changedFields(prev, next);
44
+ if (fields.length > 0)
45
+ changedNodes.push({ before: prev, after: next, fields });
46
+ }
47
+ const beforeEdges = new Map(before.edges.map((e) => [edgeId(e), e]));
48
+ const afterEdges = new Map(after.edges.map((e) => [edgeId(e), e]));
49
+ const addedEdges = after.edges.filter((e) => !beforeEdges.has(edgeId(e)));
50
+ const removedEdges = before.edges.filter((e) => !afterEdges.has(edgeId(e)));
51
+ const touched = new Set();
52
+ for (const n of addedNodes)
53
+ touched.add(n.id);
54
+ for (const n of removedNodes)
55
+ touched.add(n.id);
56
+ for (const c of changedNodes)
57
+ touched.add(c.after.id);
58
+ for (const e of [...addedEdges, ...removedEdges]) {
59
+ touched.add(e.from);
60
+ touched.add(e.to);
61
+ }
62
+ return {
63
+ addedNodes,
64
+ removedNodes,
65
+ changedNodes,
66
+ addedEdges,
67
+ removedEdges,
68
+ touched: [...touched].sort(),
69
+ };
70
+ }
71
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/graph/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { AnySchema, NodeOfSchema } from "../schema/schema.js";
2
+ import { type GraphDiff } from "./diff.js";
3
+ import { type Primitive } from "./primitives.js";
4
+ import { type GraphEdge, type GraphReader, type GraphSnapshot } from "./types.js";
5
+ export interface GraphOptions {
6
+ /** Validate every node against its declared fields on the way in. */
7
+ readonly validate?: boolean;
8
+ }
9
+ export type GraphListener<S extends AnySchema> = (diff: GraphDiff<NodeOfSchema<S>>) => void;
10
+ export declare class GraphError extends Error {
11
+ readonly hint?: string | undefined;
12
+ constructor(message: string, hint?: string | undefined);
13
+ }
14
+ /**
15
+ * The framework owns the reactive in-memory graph. Owning it — rather than
16
+ * reading someone else's store — is what makes invariants enforceable and
17
+ * agent attribution free; persistence is a pluggable adapter underneath.
18
+ */
19
+ export declare class Graph<S extends AnySchema> implements GraphReader<NodeOfSchema<S>> {
20
+ readonly schema: S;
21
+ private readonly nodes;
22
+ private readonly edges;
23
+ private readonly outIndex;
24
+ private readonly inIndex;
25
+ private readonly listeners;
26
+ private readonly validate;
27
+ constructor(schema: S, options?: GraphOptions);
28
+ static from<S extends AnySchema>(schema: S, snapshot: GraphSnapshot<NodeOfSchema<S>>, options?: GraphOptions): Graph<S>;
29
+ /** Replaces the whole graph without emitting a per-node diff storm. */
30
+ load(snapshot: GraphSnapshot<NodeOfSchema<S>>): GraphDiff<NodeOfSchema<S>>;
31
+ getNode(id: string): NodeOfSchema<S> | undefined;
32
+ has(id: string): boolean;
33
+ allNodes(): NodeOfSchema<S>[];
34
+ allEdges(): GraphEdge[];
35
+ nodesOfKind<K extends NodeOfSchema<S>["kind"]>(kind: K): Extract<NodeOfSchema<S>, {
36
+ kind: K;
37
+ }>[];
38
+ edgesOfKind(kind: string): GraphEdge[];
39
+ out(id: string, kind?: string): NodeOfSchema<S>[];
40
+ in(id: string, kind?: string): NodeOfSchema<S>[];
41
+ neighbors(id: string): NodeOfSchema<S>[];
42
+ /** Edges leaving `id`, optionally of one kind. */
43
+ outEdges(id: string, kind?: string): GraphEdge[];
44
+ /** Edges arriving at `id`, optionally of one kind. */
45
+ inEdges(id: string, kind?: string): GraphEdge[];
46
+ snapshot(): GraphSnapshot<NodeOfSchema<S>>;
47
+ get size(): {
48
+ nodes: number;
49
+ edges: number;
50
+ };
51
+ /**
52
+ * Applies primitives as one batch and emits a single diff. Nothing outside
53
+ * the op log should call this directly — attribution lives in the log.
54
+ */
55
+ applyPrimitives(primitives: readonly Primitive[]): GraphDiff<NodeOfSchema<S>>;
56
+ /** Applies primitives to a throwaway copy — used for previewing a diff. */
57
+ preview(primitives: readonly Primitive[]): GraphDiff<NodeOfSchema<S>>;
58
+ subscribe(listener: GraphListener<S>): () => void;
59
+ private emit;
60
+ private applyOne;
61
+ private check;
62
+ private insertNode;
63
+ private insertEdge;
64
+ private deleteEdge;
65
+ private index;
66
+ private edgesFrom;
67
+ private resolve;
68
+ }
69
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/graph/graph.ts"],"names":[],"mappings":"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"}