@younndai/lyt-mesh 0.9.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 +200 -0
- package/NOTICE +23 -0
- package/README.md +135 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/clone-all.d.ts +3 -0
- package/dist/commands/clone-all.d.ts.map +1 -0
- package/dist/commands/clone-all.js +66 -0
- package/dist/commands/clone-all.js.map +1 -0
- package/dist/commands/mesh-init.d.ts +3 -0
- package/dist/commands/mesh-init.d.ts.map +1 -0
- package/dist/commands/mesh-init.js +70 -0
- package/dist/commands/mesh-init.js.map +1 -0
- package/dist/commands/pod-status.d.ts +3 -0
- package/dist/commands/pod-status.d.ts.map +1 -0
- package/dist/commands/pod-status.js +67 -0
- package/dist/commands/pod-status.js.map +1 -0
- package/dist/commands/source.d.ts +3 -0
- package/dist/commands/source.d.ts.map +1 -0
- package/dist/commands/source.js +83 -0
- package/dist/commands/source.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +121 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +234 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +66 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/discovery/github.d.ts +19 -0
- package/dist/discovery/github.d.ts.map +1 -0
- package/dist/discovery/github.js +90 -0
- package/dist/discovery/github.js.map +1 -0
- package/dist/discovery/walk.d.ts +28 -0
- package/dist/discovery/walk.d.ts.map +1 -0
- package/dist/discovery/walk.js +78 -0
- package/dist/discovery/walk.js.map +1 -0
- package/dist/flows/clone-all.d.ts +53 -0
- package/dist/flows/clone-all.d.ts.map +1 -0
- package/dist/flows/clone-all.js +123 -0
- package/dist/flows/clone-all.js.map +1 -0
- package/dist/flows/mesh-init-validate.d.ts +22 -0
- package/dist/flows/mesh-init-validate.d.ts.map +1 -0
- package/dist/flows/mesh-init-validate.js +195 -0
- package/dist/flows/mesh-init-validate.js.map +1 -0
- package/dist/flows/mesh-init.d.ts +46 -0
- package/dist/flows/mesh-init.d.ts.map +1 -0
- package/dist/flows/mesh-init.js +302 -0
- package/dist/flows/mesh-init.js.map +1 -0
- package/dist/flows/pod-status.d.ts +37 -0
- package/dist/flows/pod-status.d.ts.map +1 -0
- package/dist/flows/pod-status.js +269 -0
- package/dist/flows/pod-status.js.map +1 -0
- package/dist/flows/status.d.ts +16 -0
- package/dist/flows/status.d.ts.map +1 -0
- package/dist/flows/status.js +76 -0
- package/dist/flows/status.js.map +1 -0
- package/dist/flows/sync-check.d.ts +38 -0
- package/dist/flows/sync-check.d.ts.map +1 -0
- package/dist/flows/sync-check.js +180 -0
- package/dist/flows/sync-check.js.map +1 -0
- package/dist/flows/sync-watch.d.ts +24 -0
- package/dist/flows/sync-watch.d.ts.map +1 -0
- package/dist/flows/sync-watch.js +217 -0
- package/dist/flows/sync-watch.js.map +1 -0
- package/dist/flows/sync.d.ts +45 -0
- package/dist/flows/sync.d.ts.map +1 -0
- package/dist/flows/sync.js +513 -0
- package/dist/flows/sync.js.map +1 -0
- package/dist/flows/validate.d.ts +22 -0
- package/dist/flows/validate.d.ts.map +1 -0
- package/dist/flows/validate.js +62 -0
- package/dist/flows/validate.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mesh-command.d.ts +3 -0
- package/dist/mesh-command.d.ts.map +1 -0
- package/dist/mesh-command.js +31 -0
- package/dist/mesh-command.js.map +1 -0
- package/dist/source/repo.d.ts +14 -0
- package/dist/source/repo.d.ts.map +1 -0
- package/dist/source/repo.js +71 -0
- package/dist/source/repo.js.map +1 -0
- package/dist/source/types.d.ts +22 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +49 -0
- package/dist/source/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { applyGhPrefix, closeRegistry, listVaults, openRegistry, } from "@younndai/lyt-vault";
|
|
17
|
+
// Pre-init validator. Surfaces ALL errors at once — no fail-fast on first error —
|
|
18
|
+
// per the brief: "If any fail → surface all failures + exit 1; no partial state."
|
|
19
|
+
export async function validateMeshInit(opts) {
|
|
20
|
+
const issues = [];
|
|
21
|
+
const manifest = opts.manifest;
|
|
22
|
+
const allManifestNames = new Set(manifest.vaults.map((v) => v.name));
|
|
23
|
+
const targets = opts.onlyNames ? new Set(opts.onlyNames) : allManifestNames;
|
|
24
|
+
const inScope = manifest.vaults.filter((v) => targets.has(v.name));
|
|
25
|
+
// 1) Uniqueness within the manifest.
|
|
26
|
+
const seen = new Map();
|
|
27
|
+
for (const v of manifest.vaults) {
|
|
28
|
+
seen.set(v.name, (seen.get(v.name) ?? 0) + 1);
|
|
29
|
+
}
|
|
30
|
+
for (const [name, count] of seen) {
|
|
31
|
+
if (count > 1) {
|
|
32
|
+
issues.push({
|
|
33
|
+
code: "duplicate-name",
|
|
34
|
+
severity: "error",
|
|
35
|
+
message: `Vault name "${name}" declared ${count} times in the manifest.`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// 2) Uniqueness against the local registry.
|
|
40
|
+
const registryNames = await getRegistryNames(opts);
|
|
41
|
+
for (const v of inScope) {
|
|
42
|
+
if (registryNames.has(v.name)) {
|
|
43
|
+
issues.push({
|
|
44
|
+
code: "registry-collision",
|
|
45
|
+
severity: "error",
|
|
46
|
+
message: `Vault "${v.name}" already exists in the local registry. Pick a different name or 'lyt vault forget' the existing one.`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 3) Parent refs resolve (within manifest OR registry).
|
|
51
|
+
for (const v of inScope) {
|
|
52
|
+
if (v.parent === null || v.parent === undefined || v.parent.length === 0)
|
|
53
|
+
continue;
|
|
54
|
+
const inManifest = allManifestNames.has(v.parent);
|
|
55
|
+
const inRegistry = registryNames.has(v.parent);
|
|
56
|
+
const inSubset = targets.has(v.parent);
|
|
57
|
+
if (!inManifest && !inRegistry) {
|
|
58
|
+
issues.push({
|
|
59
|
+
code: "missing-parent",
|
|
60
|
+
severity: "error",
|
|
61
|
+
message: `Vault "${v.name}" declares parent "${v.parent}" which is not in the manifest or the local registry.`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (inManifest && !inSubset && !inRegistry) {
|
|
65
|
+
issues.push({
|
|
66
|
+
code: "parent-not-in-subset",
|
|
67
|
+
severity: "error",
|
|
68
|
+
message: `Vault "${v.name}" requires parent "${v.parent}", which is in the manifest but excluded by --only and not in the local registry.`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 4) DAG check (no cycles in parent graph; only check vaults whose entire chain is in manifest).
|
|
73
|
+
const cycles = detectCycles(manifest.vaults, allManifestNames);
|
|
74
|
+
for (const cycle of cycles) {
|
|
75
|
+
issues.push({
|
|
76
|
+
code: "parent-cycle",
|
|
77
|
+
severity: "error",
|
|
78
|
+
message: `Parent-graph cycle detected: ${cycle.join(" -> ")}.`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// 5) share_with peers — warn-not-error if missing (Phase 5.5 lock: idle declaration is OK).
|
|
82
|
+
for (const sw of manifest.shareWith) {
|
|
83
|
+
for (const peer of [sw.a, sw.b]) {
|
|
84
|
+
const inManifest = allManifestNames.has(peer);
|
|
85
|
+
const inRegistry = registryNames.has(peer);
|
|
86
|
+
if (!inManifest && !inRegistry) {
|
|
87
|
+
issues.push({
|
|
88
|
+
code: "share-with-undeclared",
|
|
89
|
+
severity: "warn",
|
|
90
|
+
message: `@SHARE_WITH peer "${peer}" is not in the manifest or local registry — declaration kept as idle.`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 6) gh-org accessibility (smoke) when ghOrgSmoke is provided + a gh-org is declared.
|
|
96
|
+
if (opts.ghOrgSmoke && manifest.mesh?.ghOrg) {
|
|
97
|
+
const ok = await opts.ghOrgSmoke(manifest.mesh.ghOrg).catch(() => false);
|
|
98
|
+
if (!ok) {
|
|
99
|
+
issues.push({
|
|
100
|
+
code: "gh-org-unreachable",
|
|
101
|
+
severity: "error",
|
|
102
|
+
message: `GitHub org "${manifest.mesh.ghOrg}" is not reachable via 'gh repo list <org> --limit 1'. Authenticate or fix the org name.`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Compute topo order for the in-scope set (ignore cycles since they're errors).
|
|
107
|
+
const order = topoSort(inScope);
|
|
108
|
+
const hasError = issues.some((i) => i.severity === "error");
|
|
109
|
+
return { ok: !hasError, issues, topoOrder: order };
|
|
110
|
+
}
|
|
111
|
+
async function getRegistryNames(opts) {
|
|
112
|
+
if (opts.registryVaultNames)
|
|
113
|
+
return new Set(opts.registryVaultNames);
|
|
114
|
+
const db = await openRegistry();
|
|
115
|
+
try {
|
|
116
|
+
const rows = await listVaults(db);
|
|
117
|
+
return new Set(rows.map((r) => r.name));
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
await closeRegistry(db);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Detect parent-graph cycles. Returns each cycle as the path of names (last name == first).
|
|
124
|
+
function detectCycles(vaults, inManifest) {
|
|
125
|
+
const byName = new Map();
|
|
126
|
+
for (const v of vaults)
|
|
127
|
+
byName.set(v.name, v);
|
|
128
|
+
const cycles = [];
|
|
129
|
+
const seenCycleKeys = new Set();
|
|
130
|
+
for (const start of vaults) {
|
|
131
|
+
const path = [start.name];
|
|
132
|
+
const seenInPath = new Set([start.name]);
|
|
133
|
+
let cur = start;
|
|
134
|
+
while (cur && cur.parent && inManifest.has(cur.parent)) {
|
|
135
|
+
const next = byName.get(cur.parent);
|
|
136
|
+
if (!next)
|
|
137
|
+
break;
|
|
138
|
+
if (seenInPath.has(next.name)) {
|
|
139
|
+
// Found a cycle. Normalize to start at the smallest name to dedupe.
|
|
140
|
+
const cycleStartIdx = path.indexOf(next.name);
|
|
141
|
+
const cycle = path.slice(cycleStartIdx).concat(next.name);
|
|
142
|
+
const key = cycle.slice(0, -1).sort().join(",");
|
|
143
|
+
if (!seenCycleKeys.has(key)) {
|
|
144
|
+
seenCycleKeys.add(key);
|
|
145
|
+
cycles.push(cycle);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
seenInPath.add(next.name);
|
|
150
|
+
path.push(next.name);
|
|
151
|
+
cur = next;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return cycles;
|
|
155
|
+
}
|
|
156
|
+
// Topological sort: parents before children. Vaults whose parent is OUT of the input set
|
|
157
|
+
// are treated as roots (the registry-resident parent is assumed already initialized).
|
|
158
|
+
function topoSort(vaults) {
|
|
159
|
+
const names = new Set(vaults.map((v) => v.name));
|
|
160
|
+
const adj = new Map();
|
|
161
|
+
const indeg = new Map();
|
|
162
|
+
for (const v of vaults) {
|
|
163
|
+
adj.set(v.name, []);
|
|
164
|
+
indeg.set(v.name, 0);
|
|
165
|
+
}
|
|
166
|
+
for (const v of vaults) {
|
|
167
|
+
if (v.parent && names.has(v.parent)) {
|
|
168
|
+
adj.get(v.parent).push(v.name);
|
|
169
|
+
indeg.set(v.name, (indeg.get(v.name) ?? 0) + 1);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Stable ordering by manifest order.
|
|
173
|
+
const order = [];
|
|
174
|
+
const ready = vaults.filter((v) => (indeg.get(v.name) ?? 0) === 0).map((v) => v.name);
|
|
175
|
+
while (ready.length > 0) {
|
|
176
|
+
const next = ready.shift();
|
|
177
|
+
order.push(next);
|
|
178
|
+
for (const child of adj.get(next) ?? []) {
|
|
179
|
+
indeg.set(child, (indeg.get(child) ?? 0) - 1);
|
|
180
|
+
if ((indeg.get(child) ?? 0) === 0)
|
|
181
|
+
ready.push(child);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// If we couldn't drain (cycle), append the rest in manifest order — the cycle is an error
|
|
185
|
+
// and the executor will see ok=false before running.
|
|
186
|
+
if (order.length < vaults.length) {
|
|
187
|
+
for (const v of vaults)
|
|
188
|
+
if (!order.includes(v.name))
|
|
189
|
+
order.push(v.name);
|
|
190
|
+
}
|
|
191
|
+
return order;
|
|
192
|
+
}
|
|
193
|
+
// Re-export so tests can convert vault name -> gh repo name in one place.
|
|
194
|
+
export { applyGhPrefix };
|
|
195
|
+
//# sourceMappingURL=mesh-init-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-init-validate.js","sourceRoot":"","sources":["../../src/flows/mesh-init-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ParsedManifest } from "@younndai/lyt-vault";
|
|
2
|
+
import { type ValidateIssue, type ValidateOutcome } from "./mesh-init-validate.js";
|
|
3
|
+
export interface MeshInitOptions {
|
|
4
|
+
manifestPath: string;
|
|
5
|
+
dryRun?: boolean | undefined;
|
|
6
|
+
only?: string | undefined;
|
|
7
|
+
noPush?: boolean | undefined;
|
|
8
|
+
overrides?: readonly string[] | undefined;
|
|
9
|
+
ghOrgSmoke?: ((org: string) => Promise<boolean>) | undefined;
|
|
10
|
+
ghRepoCreate?: ((org: string | null, repoName: string) => Promise<string>) | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface MeshInitVaultResult {
|
|
13
|
+
vaultName: string;
|
|
14
|
+
ghRepoName: string;
|
|
15
|
+
initialized: boolean;
|
|
16
|
+
registered: boolean;
|
|
17
|
+
pushed: boolean;
|
|
18
|
+
pushUrl: string | null;
|
|
19
|
+
}
|
|
20
|
+
export interface MeshInitEdgeResult {
|
|
21
|
+
source: string;
|
|
22
|
+
target: string;
|
|
23
|
+
kind: "parent" | "share_with";
|
|
24
|
+
applied: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface MeshInitOutcome {
|
|
27
|
+
dryRun: boolean;
|
|
28
|
+
manifest: ParsedManifest;
|
|
29
|
+
topoOrder: string[];
|
|
30
|
+
validation: ValidateOutcome;
|
|
31
|
+
vaults: MeshInitVaultResult[];
|
|
32
|
+
edges: MeshInitEdgeResult[];
|
|
33
|
+
regenedContexts: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface MeshInitResult {
|
|
36
|
+
ok: true;
|
|
37
|
+
outcome: MeshInitOutcome;
|
|
38
|
+
}
|
|
39
|
+
export interface MeshInitBlocked {
|
|
40
|
+
ok: false;
|
|
41
|
+
reason: "validation-failed";
|
|
42
|
+
issues: ValidateIssue[];
|
|
43
|
+
}
|
|
44
|
+
export declare function meshInitFlow(opts: MeshInitOptions): Promise<MeshInitResult | MeshInitBlocked>;
|
|
45
|
+
export declare function traverseMeshFromRoot(rootName: string, depth: number): Promise<string[]>;
|
|
46
|
+
//# sourceMappingURL=mesh-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-init.d.ts","sourceRoot":"","sources":["../../src/flows/mesh-init.ts"],"names":[],"mappings":"AAkBA,OAAO,EAYL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAG1C,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAG7D,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CACxF;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAWD,wBAAsB,YAAY,CAChC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,GAAG,eAAe,CAAC,CAuL3C;AAiED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyC7F"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import { addEdgeFlow, applyGhPrefix, closeRegistry, getVaultByName, initVaultFlow, listVaults, openRegistry, parseMeshManifest, regenContextFlow, ridsEqual, uuid7BytesToHex, } from "@younndai/lyt-vault";
|
|
18
|
+
import { validateMeshInit, } from "./mesh-init-validate.js";
|
|
19
|
+
// Execute a manifest-driven mesh stand-up. Order of operations:
|
|
20
|
+
// 1. Parse the manifest from disk.
|
|
21
|
+
// 2. Apply overrides (in memory).
|
|
22
|
+
// 3. Validate (fail-fast on errors; warns proceed).
|
|
23
|
+
// 4. Resolve --only subset.
|
|
24
|
+
// 5. Init vaults in topological order (parents before children).
|
|
25
|
+
// 6. Create GH repos per vault (unless --no-push).
|
|
26
|
+
// 7. Add parent + share_with edges (suppressing per-edge regen).
|
|
27
|
+
// 8. After ALL mutations, regen .lyt/mesh-context.md once per affected vault.
|
|
28
|
+
export async function meshInitFlow(opts) {
|
|
29
|
+
const raw = readFileSync(opts.manifestPath, "utf8");
|
|
30
|
+
const manifest = applyOverrides(parseMeshManifest(raw), opts.overrides ?? []);
|
|
31
|
+
const onlyNames = opts.only ? matchOnly(manifest, opts.only) : undefined;
|
|
32
|
+
const validation = await validateMeshInit({
|
|
33
|
+
manifest,
|
|
34
|
+
onlyNames,
|
|
35
|
+
ghOrgSmoke: opts.noPush === true ? undefined : opts.ghOrgSmoke,
|
|
36
|
+
});
|
|
37
|
+
if (!validation.ok) {
|
|
38
|
+
return { ok: false, reason: "validation-failed", issues: validation.issues };
|
|
39
|
+
}
|
|
40
|
+
const targets = onlyNames ? new Set(onlyNames) : new Set(manifest.vaults.map((v) => v.name));
|
|
41
|
+
const inScope = manifest.vaults.filter((v) => targets.has(v.name));
|
|
42
|
+
const ghPrefix = manifest.mesh?.ghPrefix ?? null;
|
|
43
|
+
const ghOrg = manifest.mesh?.ghOrg ?? null;
|
|
44
|
+
const vaultResults = [];
|
|
45
|
+
const edgeResults = [];
|
|
46
|
+
const affectedVaultNames = new Set();
|
|
47
|
+
// Walk in topological order so parents are registered before children that
|
|
48
|
+
// reference them via --parent.
|
|
49
|
+
const ordered = validation.topoOrder.filter((n) => targets.has(n));
|
|
50
|
+
for (const vaultName of ordered) {
|
|
51
|
+
const v = inScope.find((x) => x.name === vaultName);
|
|
52
|
+
const ghRepoName = applyGhPrefix(vaultName, ghPrefix);
|
|
53
|
+
if (opts.dryRun === true) {
|
|
54
|
+
vaultResults.push({
|
|
55
|
+
vaultName,
|
|
56
|
+
ghRepoName,
|
|
57
|
+
initialized: false,
|
|
58
|
+
registered: false,
|
|
59
|
+
pushed: false,
|
|
60
|
+
pushUrl: null,
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Note: do NOT pass `parent` to initVaultFlow. initVault writes parent_vault directly
|
|
65
|
+
// into vault.yon as a string, which would collide with the rid-based parent edge we
|
|
66
|
+
// add later via addEdgeFlow. The parent relationship is added via the edge pass below
|
|
67
|
+
// so registry + vault.yon agree on the rid.
|
|
68
|
+
await initVaultFlow({
|
|
69
|
+
name: vaultName,
|
|
70
|
+
...(v.desc !== null ? { desc: v.desc } : {}),
|
|
71
|
+
...(v.tier !== null ? { tierHint: v.tier } : {}),
|
|
72
|
+
gitInit: true,
|
|
73
|
+
});
|
|
74
|
+
let pushed = false;
|
|
75
|
+
let pushUrl = null;
|
|
76
|
+
if (opts.noPush !== true && opts.ghRepoCreate) {
|
|
77
|
+
pushUrl = await opts.ghRepoCreate(ghOrg, ghRepoName);
|
|
78
|
+
pushed = true;
|
|
79
|
+
}
|
|
80
|
+
vaultResults.push({
|
|
81
|
+
vaultName,
|
|
82
|
+
ghRepoName,
|
|
83
|
+
initialized: true,
|
|
84
|
+
registered: true,
|
|
85
|
+
pushed,
|
|
86
|
+
pushUrl,
|
|
87
|
+
});
|
|
88
|
+
affectedVaultNames.add(vaultName);
|
|
89
|
+
}
|
|
90
|
+
if (opts.dryRun === true) {
|
|
91
|
+
for (const v of inScope) {
|
|
92
|
+
if (v.parent && v.parent.length > 0) {
|
|
93
|
+
edgeResults.push({
|
|
94
|
+
source: v.name,
|
|
95
|
+
target: v.parent,
|
|
96
|
+
kind: "parent",
|
|
97
|
+
applied: false,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const sw of manifest.shareWith) {
|
|
102
|
+
edgeResults.push({ source: sw.a, target: sw.b, kind: "share_with", applied: false });
|
|
103
|
+
edgeResults.push({ source: sw.b, target: sw.a, kind: "share_with", applied: false });
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
ok: true,
|
|
107
|
+
outcome: {
|
|
108
|
+
dryRun: true,
|
|
109
|
+
manifest,
|
|
110
|
+
topoOrder: validation.topoOrder,
|
|
111
|
+
validation,
|
|
112
|
+
vaults: vaultResults,
|
|
113
|
+
edges: edgeResults,
|
|
114
|
+
regenedContexts: [],
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Add parent edges (each child has at most one parent — already in vault.yon from init,
|
|
119
|
+
// but we want the registry edge row too).
|
|
120
|
+
for (const v of inScope) {
|
|
121
|
+
if (!v.parent || v.parent.length === 0)
|
|
122
|
+
continue;
|
|
123
|
+
const parentRid = await resolveRidByName(v.parent);
|
|
124
|
+
if (!parentRid)
|
|
125
|
+
continue; // parent not in registry yet (validator should've caught)
|
|
126
|
+
const res = await addEdgeFlow({
|
|
127
|
+
vaultName: v.name,
|
|
128
|
+
peerRid: uuid7BytesToHex(parentRid),
|
|
129
|
+
edge: "parent",
|
|
130
|
+
skipRegenContext: true,
|
|
131
|
+
});
|
|
132
|
+
edgeResults.push({
|
|
133
|
+
source: v.name,
|
|
134
|
+
target: v.parent,
|
|
135
|
+
kind: "parent",
|
|
136
|
+
applied: !res.yonAlreadyHadEdge,
|
|
137
|
+
});
|
|
138
|
+
affectedVaultNames.add(v.name);
|
|
139
|
+
}
|
|
140
|
+
// Add share_with edges bidirectionally (only when both peers exist in registry).
|
|
141
|
+
for (const sw of manifest.shareWith) {
|
|
142
|
+
const aRid = await resolveRidByName(sw.a);
|
|
143
|
+
const bRid = await resolveRidByName(sw.b);
|
|
144
|
+
if (aRid && bRid) {
|
|
145
|
+
const r1 = await addEdgeFlow({
|
|
146
|
+
vaultName: sw.a,
|
|
147
|
+
peerRid: uuid7BytesToHex(bRid),
|
|
148
|
+
edge: "share_with",
|
|
149
|
+
skipRegenContext: true,
|
|
150
|
+
});
|
|
151
|
+
edgeResults.push({
|
|
152
|
+
source: sw.a,
|
|
153
|
+
target: sw.b,
|
|
154
|
+
kind: "share_with",
|
|
155
|
+
applied: !r1.yonAlreadyHadEdge,
|
|
156
|
+
});
|
|
157
|
+
affectedVaultNames.add(sw.a);
|
|
158
|
+
const r2 = await addEdgeFlow({
|
|
159
|
+
vaultName: sw.b,
|
|
160
|
+
peerRid: uuid7BytesToHex(aRid),
|
|
161
|
+
edge: "share_with",
|
|
162
|
+
skipRegenContext: true,
|
|
163
|
+
});
|
|
164
|
+
edgeResults.push({
|
|
165
|
+
source: sw.b,
|
|
166
|
+
target: sw.a,
|
|
167
|
+
kind: "share_with",
|
|
168
|
+
applied: !r2.yonAlreadyHadEdge,
|
|
169
|
+
});
|
|
170
|
+
affectedVaultNames.add(sw.b);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
edgeResults.push({ source: sw.a, target: sw.b, kind: "share_with", applied: false });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Batched mesh-context regen — ONCE per affected vault, at the end.
|
|
177
|
+
const regenedContexts = [];
|
|
178
|
+
for (const name of affectedVaultNames) {
|
|
179
|
+
try {
|
|
180
|
+
const r = await regenContextFlow(name);
|
|
181
|
+
regenedContexts.push(r.meshContextPath);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Best-effort; surface failure in validation later if needed.
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
ok: true,
|
|
189
|
+
outcome: {
|
|
190
|
+
dryRun: false,
|
|
191
|
+
manifest,
|
|
192
|
+
topoOrder: validation.topoOrder,
|
|
193
|
+
validation,
|
|
194
|
+
vaults: vaultResults,
|
|
195
|
+
edges: edgeResults,
|
|
196
|
+
regenedContexts,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
async function resolveRidByName(name) {
|
|
201
|
+
const db = await openRegistry();
|
|
202
|
+
try {
|
|
203
|
+
const row = await getVaultByName(db, name);
|
|
204
|
+
return row?.rid ?? null;
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
await closeRegistry(db);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Apply --override "<vault>.<field>=<value>" entries. Mutates the manifest in-memory.
|
|
211
|
+
function applyOverrides(manifest, overrides) {
|
|
212
|
+
if (overrides.length === 0)
|
|
213
|
+
return manifest;
|
|
214
|
+
for (const o of overrides) {
|
|
215
|
+
const m = o.match(/^([^.]+)\.([^=]+)=(.*)$/);
|
|
216
|
+
if (!m) {
|
|
217
|
+
throw new Error(`--override must be of the form '<vault>.<field>=<value>' — got '${o}'.`);
|
|
218
|
+
}
|
|
219
|
+
const [, vaultName, field, value] = m;
|
|
220
|
+
const vault = manifest.vaults.find((v) => v.name === vaultName);
|
|
221
|
+
if (!vault) {
|
|
222
|
+
throw new Error(`--override targets vault '${vaultName}' which is not in the manifest.`);
|
|
223
|
+
}
|
|
224
|
+
switch (field) {
|
|
225
|
+
case "desc":
|
|
226
|
+
vault.desc = value;
|
|
227
|
+
break;
|
|
228
|
+
case "tier":
|
|
229
|
+
vault.tier = value;
|
|
230
|
+
break;
|
|
231
|
+
case "parent":
|
|
232
|
+
vault.parent = value;
|
|
233
|
+
break;
|
|
234
|
+
case "seed":
|
|
235
|
+
vault.seed = value;
|
|
236
|
+
break;
|
|
237
|
+
default:
|
|
238
|
+
throw new Error(`--override unknown field '${field}'. Supported: desc, tier, parent, seed.`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return manifest;
|
|
242
|
+
}
|
|
243
|
+
// Expand --only <glob> to the set of matching vault names from the manifest.
|
|
244
|
+
function matchOnly(manifest, glob) {
|
|
245
|
+
const re = globToRegex(glob);
|
|
246
|
+
return manifest.vaults.map((v) => v.name).filter((n) => re.test(n));
|
|
247
|
+
}
|
|
248
|
+
function globToRegex(glob) {
|
|
249
|
+
const escaped = glob
|
|
250
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
251
|
+
.replace(/\*/g, ".*")
|
|
252
|
+
.replace(/\?/g, ".");
|
|
253
|
+
return new RegExp(`^${escaped}$`);
|
|
254
|
+
}
|
|
255
|
+
// Helper for D13: traverse mesh graph from a root vault via parent_vault FK,
|
|
256
|
+
// depth-bounded, returning the set of vault names encountered (including the
|
|
257
|
+
// root). v1.A.1b: share_with semantic collapsed to mesh subscriptions (v1.C.1);
|
|
258
|
+
// only parent_vault FK is walked here. The mesh-aware traversal lands in v1.B.1.
|
|
259
|
+
export async function traverseMeshFromRoot(rootName, depth) {
|
|
260
|
+
const db = await openRegistry();
|
|
261
|
+
try {
|
|
262
|
+
const all = await listVaults(db);
|
|
263
|
+
const byName = new Map(all.map((v) => [v.name, v]));
|
|
264
|
+
const byRidHex = new Map(all.map((v) => [v.ridHex, v]));
|
|
265
|
+
const root = byName.get(rootName);
|
|
266
|
+
if (!root) {
|
|
267
|
+
throw new Error(`No vault named '${rootName}' in the registry.`);
|
|
268
|
+
}
|
|
269
|
+
const visited = new Set([root.name]);
|
|
270
|
+
const queue = [{ name: root.name, remaining: depth }];
|
|
271
|
+
while (queue.length > 0) {
|
|
272
|
+
const cur = queue.shift();
|
|
273
|
+
if (cur.remaining <= 0)
|
|
274
|
+
continue;
|
|
275
|
+
const v = byName.get(cur.name);
|
|
276
|
+
if (!v)
|
|
277
|
+
continue;
|
|
278
|
+
// Children: any vault whose parent_vault FK points at v.rid (bytes-equal).
|
|
279
|
+
for (const candidate of all) {
|
|
280
|
+
if (candidate.parentVault &&
|
|
281
|
+
ridsEqual(candidate.parentVault, v.rid) &&
|
|
282
|
+
!visited.has(candidate.name)) {
|
|
283
|
+
visited.add(candidate.name);
|
|
284
|
+
queue.push({ name: candidate.name, remaining: cur.remaining - 1 });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Parent (upward traversal too).
|
|
288
|
+
if (v.parentVaultHex) {
|
|
289
|
+
const parent = byRidHex.get(v.parentVaultHex);
|
|
290
|
+
if (parent && !visited.has(parent.name)) {
|
|
291
|
+
visited.add(parent.name);
|
|
292
|
+
queue.push({ name: parent.name, remaining: cur.remaining - 1 });
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return [...visited];
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
await closeRegistry(db);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=mesh-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-init.js","sourceRoot":"","sources":["../../src/flows/mesh-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type GitRunOptions, type GitRunResult } from "@younndai/lyt-vault";
|
|
2
|
+
export type GitRunner = (args: readonly string[], opts: GitRunOptions) => Promise<GitRunResult>;
|
|
3
|
+
export type VaultDriftStatus = "clean" | "unpushed" | "no-remote" | "stale-index" | "unregistered" | "missing" | "not-git-repo";
|
|
4
|
+
export interface VaultDriftReport {
|
|
5
|
+
name: string;
|
|
6
|
+
path: string;
|
|
7
|
+
status: VaultDriftStatus;
|
|
8
|
+
ahead: number;
|
|
9
|
+
dirtyCount: number;
|
|
10
|
+
hasRemote: boolean;
|
|
11
|
+
detail: string;
|
|
12
|
+
}
|
|
13
|
+
export type PodDriftStatus = "clean" | "unpushed" | "no-remote" | "local-only" | "no-pod";
|
|
14
|
+
export interface PodDriftReport {
|
|
15
|
+
handle: string | null;
|
|
16
|
+
status: PodDriftStatus;
|
|
17
|
+
ahead: number;
|
|
18
|
+
dirtyCount: number;
|
|
19
|
+
detail: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PodStatusResult {
|
|
22
|
+
pod: PodDriftReport;
|
|
23
|
+
vaults: VaultDriftReport[];
|
|
24
|
+
unregistered: string[];
|
|
25
|
+
summary: {
|
|
26
|
+
clean: number;
|
|
27
|
+
needsPublish: number;
|
|
28
|
+
total: number;
|
|
29
|
+
};
|
|
30
|
+
ok: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface PodStatusArgs {
|
|
33
|
+
runGit?: GitRunner;
|
|
34
|
+
noFetch?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function podStatusFlow(args?: PodStatusArgs): Promise<PodStatusResult>;
|
|
37
|
+
//# sourceMappingURL=pod-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod-status.d.ts","sourceRoot":"","sources":["../../src/flows/pod-status.ts"],"names":[],"mappings":"AAmBA,OAAO,EAWL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEhG,MAAM,MAAM,gBAAgB,GACxB,OAAO,GACP,UAAU,GACV,WAAW,GACX,aAAa,GACb,cAAc,GACd,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,UAAU,GACV,WAAW,GAIX,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAG3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAEhE,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkGD,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoHtF"}
|