@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.
- package/LICENSE +96 -0
- package/README.md +35 -0
- package/dist/app.d.ts +294 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +49 -0
- package/dist/app.js.map +1 -0
- package/dist/arrange.d.ts +185 -0
- package/dist/arrange.d.ts.map +1 -0
- package/dist/arrange.js +456 -0
- package/dist/arrange.js.map +1 -0
- package/dist/beginning.d.ts +65 -0
- package/dist/beginning.d.ts.map +1 -0
- package/dist/beginning.js +94 -0
- package/dist/beginning.js.map +1 -0
- package/dist/bind.d.ts +42 -0
- package/dist/bind.d.ts.map +1 -0
- package/dist/bind.js +26 -0
- package/dist/bind.js.map +1 -0
- package/dist/city.d.ts +93 -0
- package/dist/city.d.ts.map +1 -0
- package/dist/city.js +160 -0
- package/dist/city.js.map +1 -0
- package/dist/cli/check/arrangement.d.ts +13 -0
- package/dist/cli/check/arrangement.d.ts.map +1 -0
- package/dist/cli/check/arrangement.js +63 -0
- package/dist/cli/check/arrangement.js.map +1 -0
- package/dist/cli/check/beginnings.d.ts +16 -0
- package/dist/cli/check/beginnings.d.ts.map +1 -0
- package/dist/cli/check/beginnings.js +53 -0
- package/dist/cli/check/beginnings.js.map +1 -0
- package/dist/cli/check/brand.d.ts +17 -0
- package/dist/cli/check/brand.d.ts.map +1 -0
- package/dist/cli/check/brand.js +153 -0
- package/dist/cli/check/brand.js.map +1 -0
- package/dist/cli/check/city.d.ts +17 -0
- package/dist/cli/check/city.d.ts.map +1 -0
- package/dist/cli/check/city.js +58 -0
- package/dist/cli/check/city.js.map +1 -0
- package/dist/cli/check/context.d.ts +50 -0
- package/dist/cli/check/context.d.ts.map +1 -0
- package/dist/cli/check/context.js +37 -0
- package/dist/cli/check/context.js.map +1 -0
- package/dist/cli/check/fields.d.ts +16 -0
- package/dist/cli/check/fields.d.ts.map +1 -0
- package/dist/cli/check/fields.js +237 -0
- package/dist/cli/check/fields.js.map +1 -0
- package/dist/cli/check/index.d.ts +14 -0
- package/dist/cli/check/index.d.ts.map +1 -0
- package/dist/cli/check/index.js +14 -0
- package/dist/cli/check/index.js.map +1 -0
- package/dist/cli/check/intelligence.d.ts +17 -0
- package/dist/cli/check/intelligence.d.ts.map +1 -0
- package/dist/cli/check/intelligence.js +136 -0
- package/dist/cli/check/intelligence.js.map +1 -0
- package/dist/cli/check/lenses.d.ts +17 -0
- package/dist/cli/check/lenses.d.ts.map +1 -0
- package/dist/cli/check/lenses.js +239 -0
- package/dist/cli/check/lenses.js.map +1 -0
- package/dist/cli/check/migrations.d.ts +16 -0
- package/dist/cli/check/migrations.d.ts.map +1 -0
- package/dist/cli/check/migrations.js +43 -0
- package/dist/cli/check/migrations.js.map +1 -0
- package/dist/cli/check/modules.d.ts +16 -0
- package/dist/cli/check/modules.d.ts.map +1 -0
- package/dist/cli/check/modules.js +123 -0
- package/dist/cli/check/modules.js.map +1 -0
- package/dist/cli/check/policy.d.ts +16 -0
- package/dist/cli/check/policy.d.ts.map +1 -0
- package/dist/cli/check/policy.js +90 -0
- package/dist/cli/check/policy.js.map +1 -0
- package/dist/cli/check/relations.d.ts +29 -0
- package/dist/cli/check/relations.d.ts.map +1 -0
- package/dist/cli/check/relations.js +279 -0
- package/dist/cli/check/relations.js.map +1 -0
- package/dist/cli/check/routes.d.ts +16 -0
- package/dist/cli/check/routes.d.ts.map +1 -0
- package/dist/cli/check/routes.js +31 -0
- package/dist/cli/check/routes.js.map +1 -0
- package/dist/cli/check/settings.d.ts +16 -0
- package/dist/cli/check/settings.d.ts.map +1 -0
- package/dist/cli/check/settings.js +81 -0
- package/dist/cli/check/settings.js.map +1 -0
- package/dist/cli/check.d.ts +36 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +76 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/create.d.ts +20 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +251 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/describe.d.ts +35 -0
- package/dist/cli/describe.d.ts.map +1 -0
- package/dist/cli/describe.js +230 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/docs.d.ts +11 -0
- package/dist/cli/docs.d.ts.map +1 -0
- package/dist/cli/docs.js +152 -0
- package/dist/cli/docs.js.map +1 -0
- package/dist/cli/index.d.ts +18 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +281 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/extend.d.ts +23 -0
- package/dist/extend.d.ts.map +1 -0
- package/dist/extend.js +53 -0
- package/dist/extend.js.map +1 -0
- package/dist/graph/diff.d.ts +31 -0
- package/dist/graph/diff.d.ts.map +1 -0
- package/dist/graph/diff.js +71 -0
- package/dist/graph/diff.js.map +1 -0
- package/dist/graph/graph.d.ts +69 -0
- package/dist/graph/graph.d.ts.map +1 -0
- package/dist/graph/graph.js +284 -0
- package/dist/graph/graph.js.map +1 -0
- package/dist/graph/primitives.d.ts +52 -0
- package/dist/graph/primitives.d.ts.map +1 -0
- package/dist/graph/primitives.js +62 -0
- package/dist/graph/primitives.js.map +1 -0
- package/dist/graph/tracked.d.ts +31 -0
- package/dist/graph/tracked.d.ts.map +1 -0
- package/dist/graph/tracked.js +69 -0
- package/dist/graph/tracked.js.map +1 -0
- package/dist/graph/types.d.ts +34 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +0 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/index.d.ts +100 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/installation.d.ts +112 -0
- package/dist/installation.d.ts.map +1 -0
- package/dist/installation.js +193 -0
- package/dist/installation.js.map +1 -0
- package/dist/intelligence-bridge.d.ts +73 -0
- package/dist/intelligence-bridge.d.ts.map +1 -0
- package/dist/intelligence-bridge.js +31 -0
- package/dist/intelligence-bridge.js.map +1 -0
- package/dist/invariants/engine.d.ts +36 -0
- package/dist/invariants/engine.d.ts.map +1 -0
- package/dist/invariants/engine.js +88 -0
- package/dist/invariants/engine.js.map +1 -0
- package/dist/invariants/types.d.ts +75 -0
- package/dist/invariants/types.d.ts.map +1 -0
- package/dist/invariants/types.js +2 -0
- package/dist/invariants/types.js.map +1 -0
- package/dist/modules.d.ts +75 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +87 -0
- package/dist/modules.js.map +1 -0
- package/dist/mutations/decidable.d.ts +26 -0
- package/dist/mutations/decidable.d.ts.map +1 -0
- package/dist/mutations/decidable.js +39 -0
- package/dist/mutations/decidable.js.map +1 -0
- package/dist/mutations/define-mutation.d.ts +32 -0
- package/dist/mutations/define-mutation.d.ts.map +1 -0
- package/dist/mutations/define-mutation.js +181 -0
- package/dist/mutations/define-mutation.js.map +1 -0
- package/dist/mutations/derive-edits.d.ts +75 -0
- package/dist/mutations/derive-edits.d.ts.map +1 -0
- package/dist/mutations/derive-edits.js +240 -0
- package/dist/mutations/derive-edits.js.map +1 -0
- package/dist/mutations/form.d.ts +63 -0
- package/dist/mutations/form.d.ts.map +1 -0
- package/dist/mutations/form.js +113 -0
- package/dist/mutations/form.js.map +1 -0
- package/dist/mutations/node-ref.d.ts +83 -0
- package/dist/mutations/node-ref.d.ts.map +1 -0
- package/dist/mutations/node-ref.js +113 -0
- package/dist/mutations/node-ref.js.map +1 -0
- package/dist/mutations/types.d.ts +136 -0
- package/dist/mutations/types.d.ts.map +1 -0
- package/dist/mutations/types.js +2 -0
- package/dist/mutations/types.js.map +1 -0
- package/dist/ops/log.d.ts +35 -0
- package/dist/ops/log.d.ts.map +1 -0
- package/dist/ops/log.js +103 -0
- package/dist/ops/log.js.map +1 -0
- package/dist/ops/types.d.ts +52 -0
- package/dist/ops/types.d.ts.map +1 -0
- package/dist/ops/types.js +2 -0
- package/dist/ops/types.js.map +1 -0
- package/dist/ops/undo.d.ts +33 -0
- package/dist/ops/undo.d.ts.map +1 -0
- package/dist/ops/undo.js +65 -0
- package/dist/ops/undo.js.map +1 -0
- package/dist/permissions/policy.d.ts +68 -0
- package/dist/permissions/policy.d.ts.map +1 -0
- package/dist/permissions/policy.js +191 -0
- package/dist/permissions/policy.js.map +1 -0
- package/dist/permissions/types.d.ts +78 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/persistence/memory.d.ts +6 -0
- package/dist/persistence/memory.d.ts.map +1 -0
- package/dist/persistence/memory.js +31 -0
- package/dist/persistence/memory.js.map +1 -0
- package/dist/persistence/sqlite.d.ts +59 -0
- package/dist/persistence/sqlite.d.ts.map +1 -0
- package/dist/persistence/sqlite.js +131 -0
- package/dist/persistence/sqlite.js.map +1 -0
- package/dist/persistence/types.d.ts +22 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +2 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/presence.d.ts +38 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +50 -0
- package/dist/presence.js.map +1 -0
- package/dist/scaffold/domain.d.ts +8 -0
- package/dist/scaffold/domain.d.ts.map +1 -0
- package/dist/scaffold/domain.js +331 -0
- package/dist/scaffold/domain.js.map +1 -0
- package/dist/scaffold/index.d.ts +66 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +142 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/lens.d.ts +31 -0
- package/dist/scaffold/lens.d.ts.map +1 -0
- package/dist/scaffold/lens.js +176 -0
- package/dist/scaffold/lens.js.map +1 -0
- package/dist/scaffold/names.d.ts +44 -0
- package/dist/scaffold/names.d.ts.map +1 -0
- package/dist/scaffold/names.js +69 -0
- package/dist/scaffold/names.js.map +1 -0
- package/dist/scaffold/project.d.ts +41 -0
- package/dist/scaffold/project.d.ts.map +1 -0
- package/dist/scaffold/project.js +604 -0
- package/dist/scaffold/project.js.map +1 -0
- package/dist/scaffold/ui.d.ts +15 -0
- package/dist/scaffold/ui.d.ts.map +1 -0
- package/dist/scaffold/ui.js +536 -0
- package/dist/scaffold/ui.js.map +1 -0
- package/dist/schema/define-node.d.ts +132 -0
- package/dist/schema/define-node.d.ts.map +1 -0
- package/dist/schema/define-node.js +254 -0
- package/dist/schema/define-node.js.map +1 -0
- package/dist/schema/figures.d.ts +42 -0
- package/dist/schema/figures.d.ts.map +1 -0
- package/dist/schema/figures.js +220 -0
- package/dist/schema/figures.js.map +1 -0
- package/dist/schema/json-schema.d.ts +39 -0
- package/dist/schema/json-schema.d.ts.map +1 -0
- package/dist/schema/json-schema.js +74 -0
- package/dist/schema/json-schema.js.map +1 -0
- package/dist/schema/schema.d.ts +43 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/schema.js +102 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/types.d.ts +201 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/search.d.ts +215 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +449 -0
- package/dist/search.js.map +1 -0
- package/dist/settings.d.ts +30 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +74 -0
- package/dist/settings.js.map +1 -0
- package/dist/store.d.ts +284 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +660 -0
- package/dist/store.js.map +1 -0
- package/dist/studio-door.d.ts +187 -0
- package/dist/studio-door.d.ts.map +1 -0
- package/dist/studio-door.js +20 -0
- package/dist/studio-door.js.map +1 -0
- package/dist/sync/conflict.d.ts +37 -0
- package/dist/sync/conflict.d.ts.map +1 -0
- package/dist/sync/conflict.js +56 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/engine.d.ts +118 -0
- package/dist/sync/engine.d.ts.map +1 -0
- package/dist/sync/engine.js +341 -0
- package/dist/sync/engine.js.map +1 -0
- package/dist/sync/google-calendar.d.ts +54 -0
- package/dist/sync/google-calendar.d.ts.map +1 -0
- package/dist/sync/google-calendar.js +167 -0
- package/dist/sync/google-calendar.js.map +1 -0
- package/dist/sync/types.d.ts +125 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +6 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/temporal/effectivity.d.ts +75 -0
- package/dist/temporal/effectivity.d.ts.map +1 -0
- package/dist/temporal/effectivity.js +89 -0
- package/dist/temporal/effectivity.js.map +1 -0
- package/dist/testing.d.ts +63 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +194 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme/contrast.d.ts +47 -0
- package/dist/theme/contrast.d.ts.map +1 -0
- package/dist/theme/contrast.js +172 -0
- package/dist/theme/contrast.js.map +1 -0
- package/dist/theme/derive.d.ts +81 -0
- package/dist/theme/derive.d.ts.map +1 -0
- package/dist/theme/derive.js +171 -0
- package/dist/theme/derive.js.map +1 -0
- package/dist/theme/kit.d.ts +106 -0
- package/dist/theme/kit.d.ts.map +1 -0
- package/dist/theme/kit.js +84 -0
- package/dist/theme/kit.js.map +1 -0
- package/dist/theme/palettes.d.ts +32 -0
- package/dist/theme/palettes.d.ts.map +1 -0
- package/dist/theme/palettes.js +96 -0
- package/dist/theme/palettes.js.map +1 -0
- package/dist/theme/types.d.ts +131 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +23 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/views/types.d.ts +89 -0
- package/dist/views/types.d.ts.map +1 -0
- package/dist/views/types.js +88 -0
- package/dist/views/types.js.map +1 -0
- package/dist/watched.d.ts +33 -0
- package/dist/watched.d.ts.map +1 -0
- package/dist/watched.js +50 -0
- package/dist/watched.js.map +1 -0
- package/dist/who.d.ts +26 -0
- package/dist/who.d.ts.map +1 -0
- package/dist/who.js +20 -0
- package/dist/who.js.map +1 -0
- 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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"}
|
package/dist/extend.d.ts
ADDED
|
@@ -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":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAU,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1F,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,SAAS,IAAI,CAC/C,IAAI,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAC7B,IAAI,CAAC;AAyBV,qBAAa,UAAW,SAAQ,KAAK;IAGjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;gBADtB,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA;CAKzB;AAED;;;;GAIG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,SAAS,CAAE,YAAW,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAS3E,QAAQ,CAAC,MAAM,EAAE,CAAC;IARpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAGxB,MAAM,EAAE,CAAC,EAClB,OAAO,GAAE,YAAiB;IAK5B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,SAAS,EAC7B,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE,YAAiB,GACzB,KAAK,CAAC,CAAC,CAAC;IAMX,uEAAuE;IACvE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAe1E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;IAIhD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE;IAI7B,QAAQ,IAAI,SAAS,EAAE;IAIvB,WAAW,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAC3C,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,EAAE;IAM1C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAItC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE;IAIjD,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE;IAIhD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE;IAMxC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAIhD,sDAAsD;IACtD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAI/C,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI1C,IAAI,IAAI,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAE3C;IAID;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAQ7E,2EAA2E;IAC3E,OAAO,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAKrE,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAOjD,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,QAAQ;IAgDhB,OAAO,CAAC,KAAK;IA4Bb,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,OAAO;CAYhB"}
|