@wairon/cli 5.0.2-dev.13 → 5.0.2-dev.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +981 -674
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +249 -71
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1260,6 +1260,47 @@ var init_errors = __esm({
|
|
|
1260
1260
|
}
|
|
1261
1261
|
});
|
|
1262
1262
|
|
|
1263
|
+
// src/core/statehash.ts
|
|
1264
|
+
function computeStateId() {
|
|
1265
|
+
const tree = {
|
|
1266
|
+
system: loadSystemSpec(),
|
|
1267
|
+
subsystems: loadSubsystemSpecs(),
|
|
1268
|
+
components: loadComponentSpecs(),
|
|
1269
|
+
interfaces: loadInterfaceSpecs(),
|
|
1270
|
+
implementations: loadImplementationSpecs(),
|
|
1271
|
+
types: loadTypeSpecs()
|
|
1272
|
+
};
|
|
1273
|
+
const digest = crypto.createHash("sha256").update(canonicalize(tree)).digest("hex");
|
|
1274
|
+
return { algorithm: "sha256", digest };
|
|
1275
|
+
}
|
|
1276
|
+
function stateIdEquals(a, b) {
|
|
1277
|
+
return !!a && !!b && a.algorithm === b.algorithm && a.digest === b.digest;
|
|
1278
|
+
}
|
|
1279
|
+
function canonicalize(value) {
|
|
1280
|
+
return JSON.stringify(sortKeys(value));
|
|
1281
|
+
}
|
|
1282
|
+
function sortKeys(v) {
|
|
1283
|
+
if (Array.isArray(v)) return v.map(sortKeys);
|
|
1284
|
+
if (v && typeof v === "object") {
|
|
1285
|
+
const src = v;
|
|
1286
|
+
const out = {};
|
|
1287
|
+
for (const k of Object.keys(src).sort()) {
|
|
1288
|
+
if (k === "createdAt" || k === "updatedAt") continue;
|
|
1289
|
+
out[k] = sortKeys(src[k]);
|
|
1290
|
+
}
|
|
1291
|
+
return out;
|
|
1292
|
+
}
|
|
1293
|
+
return v;
|
|
1294
|
+
}
|
|
1295
|
+
var crypto;
|
|
1296
|
+
var init_statehash = __esm({
|
|
1297
|
+
"src/core/statehash.ts"() {
|
|
1298
|
+
"use strict";
|
|
1299
|
+
crypto = __toESM(require("crypto"));
|
|
1300
|
+
init_specs2();
|
|
1301
|
+
}
|
|
1302
|
+
});
|
|
1303
|
+
|
|
1263
1304
|
// src/core/narrative-labels.ts
|
|
1264
1305
|
function resolveNarrativeLabels(methodName, steps) {
|
|
1265
1306
|
const errors = [];
|
|
@@ -6824,47 +6865,6 @@ var init_filenames = __esm({
|
|
|
6824
6865
|
}
|
|
6825
6866
|
});
|
|
6826
6867
|
|
|
6827
|
-
// src/core/statehash.ts
|
|
6828
|
-
function computeStateId() {
|
|
6829
|
-
const tree = {
|
|
6830
|
-
system: loadSystemSpec(),
|
|
6831
|
-
subsystems: loadSubsystemSpecs(),
|
|
6832
|
-
components: loadComponentSpecs(),
|
|
6833
|
-
interfaces: loadInterfaceSpecs(),
|
|
6834
|
-
implementations: loadImplementationSpecs(),
|
|
6835
|
-
types: loadTypeSpecs()
|
|
6836
|
-
};
|
|
6837
|
-
const digest = crypto.createHash("sha256").update(canonicalize(tree)).digest("hex");
|
|
6838
|
-
return { algorithm: "sha256", digest };
|
|
6839
|
-
}
|
|
6840
|
-
function stateIdEquals(a, b) {
|
|
6841
|
-
return !!a && !!b && a.algorithm === b.algorithm && a.digest === b.digest;
|
|
6842
|
-
}
|
|
6843
|
-
function canonicalize(value) {
|
|
6844
|
-
return JSON.stringify(sortKeys(value));
|
|
6845
|
-
}
|
|
6846
|
-
function sortKeys(v) {
|
|
6847
|
-
if (Array.isArray(v)) return v.map(sortKeys);
|
|
6848
|
-
if (v && typeof v === "object") {
|
|
6849
|
-
const src = v;
|
|
6850
|
-
const out = {};
|
|
6851
|
-
for (const k of Object.keys(src).sort()) {
|
|
6852
|
-
if (k === "createdAt" || k === "updatedAt") continue;
|
|
6853
|
-
out[k] = sortKeys(src[k]);
|
|
6854
|
-
}
|
|
6855
|
-
return out;
|
|
6856
|
-
}
|
|
6857
|
-
return v;
|
|
6858
|
-
}
|
|
6859
|
-
var crypto;
|
|
6860
|
-
var init_statehash = __esm({
|
|
6861
|
-
"src/core/statehash.ts"() {
|
|
6862
|
-
"use strict";
|
|
6863
|
-
crypto = __toESM(require("crypto"));
|
|
6864
|
-
init_specs2();
|
|
6865
|
-
}
|
|
6866
|
-
});
|
|
6867
|
-
|
|
6868
6868
|
// src/core/openapi.ts
|
|
6869
6869
|
function schemaFor(typeRef, closureIds) {
|
|
6870
6870
|
const trimmed = typeRef.trim().replace(/^promise\s*<(.+)>$/i, "$1").trim();
|
|
@@ -7322,6 +7322,57 @@ function projectOwnSurface(maxAudience) {
|
|
|
7322
7322
|
function projectChildSurface() {
|
|
7323
7323
|
return projectOwnSurface("project");
|
|
7324
7324
|
}
|
|
7325
|
+
function localName(id) {
|
|
7326
|
+
return id.split("::").pop();
|
|
7327
|
+
}
|
|
7328
|
+
function projectSubsystemSurface(subsystemId) {
|
|
7329
|
+
const system = loadSystemSpec();
|
|
7330
|
+
if (!system) {
|
|
7331
|
+
throw new Error("Cannot project a subsystem surface: the L0 system spec is missing.");
|
|
7332
|
+
}
|
|
7333
|
+
const subsystems = loadSubsystemSpecs();
|
|
7334
|
+
const target = subsystems.find((s) => s.id === subsystemId);
|
|
7335
|
+
if (!target) {
|
|
7336
|
+
throw new Error(`Cannot project a subsystem surface: subsystem "${subsystemId}" does not exist.`);
|
|
7337
|
+
}
|
|
7338
|
+
const components = loadComponentSpecs();
|
|
7339
|
+
const interfaces = loadInterfaceSpecs();
|
|
7340
|
+
const types = loadTypeSpecs();
|
|
7341
|
+
const entries = [];
|
|
7342
|
+
for (const pub of target.publicInterfaces ?? []) {
|
|
7343
|
+
if (!pub.component) continue;
|
|
7344
|
+
const comp = components.find((c) => c.id === pub.component || c.id === `${subsystemId}::${pub.component}`);
|
|
7345
|
+
if (!comp) continue;
|
|
7346
|
+
if (comp.componentType !== "Portal") continue;
|
|
7347
|
+
const compInterfaces = interfaces.filter((i) => i.component === comp.id && (!pub.interface || i.id === pub.interface || i.id === `${subsystemId}::${pub.interface}`));
|
|
7348
|
+
const methods = compInterfaces.flatMap((i) => i.methods);
|
|
7349
|
+
entries.push({
|
|
7350
|
+
id: localName(pub.interface ?? comp.id),
|
|
7351
|
+
name: comp.name,
|
|
7352
|
+
// Family ceiling: a sibling surface is consumable by the system family only.
|
|
7353
|
+
audience: "project",
|
|
7354
|
+
type: pub.type ?? "Custom",
|
|
7355
|
+
// The snapshot carries the LOCAL portal name — consumers resolve cross-tree
|
|
7356
|
+
// refs by their final segment.
|
|
7357
|
+
component: localName(comp.id),
|
|
7358
|
+
methods,
|
|
7359
|
+
...comp.dispatch && comp.dispatch.length ? { dispatch: comp.dispatch } : {},
|
|
7360
|
+
// Project the backing Portal's auth + basePath so the codec can emit
|
|
7361
|
+
// OpenAPI security + per-portal servers self-contained from the snapshot.
|
|
7362
|
+
...comp.auth && comp.auth.scheme !== "none" ? { auth: comp.auth } : {},
|
|
7363
|
+
...comp.basePath ? { basePath: comp.basePath } : {},
|
|
7364
|
+
details: pub.details ?? ""
|
|
7365
|
+
});
|
|
7366
|
+
}
|
|
7367
|
+
return SurfaceSnapshotSchema.parse({
|
|
7368
|
+
projectName: `${system.name}::${subsystemId}`,
|
|
7369
|
+
origin: "generated",
|
|
7370
|
+
stateId: stateIdString(),
|
|
7371
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
7372
|
+
interfaces: entries,
|
|
7373
|
+
types: computeTypeClosure(entries, types)
|
|
7374
|
+
});
|
|
7375
|
+
}
|
|
7325
7376
|
function listSnapshots(rootDir = getProjectRoot()) {
|
|
7326
7377
|
const dir = surfacesDir(rootDir);
|
|
7327
7378
|
if (!fs4.existsSync(dir)) return [];
|
|
@@ -7338,18 +7389,37 @@ function listSnapshots(rootDir = getProjectRoot()) {
|
|
|
7338
7389
|
function getSnapshot(projectName, rootDir = getProjectRoot()) {
|
|
7339
7390
|
return listSnapshots(rootDir).find((s) => s.projectName === projectName) ?? null;
|
|
7340
7391
|
}
|
|
7392
|
+
function snapshotFilename(projectName) {
|
|
7393
|
+
return `${safeFilenamePart(projectName)}.yaml`;
|
|
7394
|
+
}
|
|
7341
7395
|
function saveSnapshot(snapshot, rootDir = getProjectRoot()) {
|
|
7342
7396
|
const dir = surfacesDir(rootDir);
|
|
7343
7397
|
fs4.mkdirSync(dir, { recursive: true });
|
|
7344
|
-
const p = path5.join(dir,
|
|
7398
|
+
const p = path5.join(dir, snapshotFilename(snapshot.projectName));
|
|
7345
7399
|
writeYamlFile(p, SurfaceSnapshotSchema.parse(snapshot));
|
|
7346
7400
|
return p;
|
|
7347
7401
|
}
|
|
7348
7402
|
function removeSnapshot(projectName, rootDir = getProjectRoot()) {
|
|
7349
|
-
const
|
|
7350
|
-
|
|
7351
|
-
fs4.
|
|
7352
|
-
|
|
7403
|
+
const dir = surfacesDir(rootDir);
|
|
7404
|
+
const direct = path5.join(dir, snapshotFilename(projectName));
|
|
7405
|
+
if (fs4.existsSync(direct)) {
|
|
7406
|
+
fs4.unlinkSync(direct);
|
|
7407
|
+
return true;
|
|
7408
|
+
}
|
|
7409
|
+
if (!fs4.existsSync(dir)) return false;
|
|
7410
|
+
for (const file of fs4.readdirSync(dir)) {
|
|
7411
|
+
if (!file.endsWith(".yaml") && !file.endsWith(".yml")) continue;
|
|
7412
|
+
const p = path5.join(dir, file);
|
|
7413
|
+
try {
|
|
7414
|
+
const snap = SurfaceSnapshotSchema.parse(readYamlFile(p));
|
|
7415
|
+
if (snap.projectName === projectName) {
|
|
7416
|
+
fs4.unlinkSync(p);
|
|
7417
|
+
return true;
|
|
7418
|
+
}
|
|
7419
|
+
} catch {
|
|
7420
|
+
}
|
|
7421
|
+
}
|
|
7422
|
+
return false;
|
|
7353
7423
|
}
|
|
7354
7424
|
function loadSurfaceSnapshots() {
|
|
7355
7425
|
return listSnapshots();
|
|
@@ -7420,17 +7490,54 @@ function importSurface(sourcePath, origin) {
|
|
|
7420
7490
|
return snapshot;
|
|
7421
7491
|
}
|
|
7422
7492
|
function generateChildSnapshots(rootDir = getProjectRoot()) {
|
|
7423
|
-
const
|
|
7493
|
+
const topLevel = loadSubsystemSpecs().filter((s) => !s.id.includes("::"));
|
|
7494
|
+
const children = topLevel.filter((s) => s.projectPath);
|
|
7424
7495
|
if (!children.length) return [];
|
|
7425
|
-
const
|
|
7496
|
+
const familySnapshot = projectChildSurface();
|
|
7497
|
+
const siblingSnapshots = /* @__PURE__ */ new Map();
|
|
7498
|
+
const siblingSurface = (subsystemId) => {
|
|
7499
|
+
let snap = siblingSnapshots.get(subsystemId);
|
|
7500
|
+
if (!snap) {
|
|
7501
|
+
snap = projectSubsystemSurface(subsystemId);
|
|
7502
|
+
siblingSnapshots.set(subsystemId, snap);
|
|
7503
|
+
}
|
|
7504
|
+
return snap;
|
|
7505
|
+
};
|
|
7426
7506
|
const written = [];
|
|
7427
7507
|
for (const child of children) {
|
|
7428
7508
|
const childDir = path5.resolve(rootDir, child.projectPath);
|
|
7429
7509
|
if (!fs4.existsSync(childDir)) continue;
|
|
7430
|
-
written.push(saveSnapshot(
|
|
7510
|
+
written.push(saveSnapshot(familySnapshot, childDir));
|
|
7511
|
+
for (const sibling of topLevel) {
|
|
7512
|
+
if (sibling.id === child.id) continue;
|
|
7513
|
+
written.push(saveSnapshot(siblingSurface(sibling.id), childDir));
|
|
7514
|
+
}
|
|
7431
7515
|
}
|
|
7432
7516
|
return written;
|
|
7433
7517
|
}
|
|
7518
|
+
function computeParentStateId(parentRoot) {
|
|
7519
|
+
return computeStateIdAt(parentRoot);
|
|
7520
|
+
}
|
|
7521
|
+
function listExternalInterfaces() {
|
|
7522
|
+
const snapshots = listSnapshots();
|
|
7523
|
+
const chainingParent = resolveChainingParent();
|
|
7524
|
+
const parentStateId = chainingParent ? computeParentStateId(chainingParent.parentRoot) : null;
|
|
7525
|
+
return snapshots.map((snapshot) => {
|
|
7526
|
+
const generated = snapshot.origin === "generated";
|
|
7527
|
+
const sourceKind = !generated ? "foreign" : snapshot.projectName.includes("::") ? "sibling" : "parent";
|
|
7528
|
+
const freshness = generated && parentStateId ? snapshot.stateId === parentStateId ? "fresh" : "stale" : "unverifiable";
|
|
7529
|
+
return {
|
|
7530
|
+
projectName: snapshot.projectName,
|
|
7531
|
+
origin: snapshot.origin,
|
|
7532
|
+
sourceKind,
|
|
7533
|
+
generatedAt: snapshot.generatedAt,
|
|
7534
|
+
...snapshot.stateId ? { stateId: snapshot.stateId } : {},
|
|
7535
|
+
...snapshot.version ? { version: snapshot.version } : {},
|
|
7536
|
+
freshness,
|
|
7537
|
+
interfaceIds: snapshot.interfaces.map((e) => e.id)
|
|
7538
|
+
};
|
|
7539
|
+
});
|
|
7540
|
+
}
|
|
7434
7541
|
function surfaceContentKey(snapshot) {
|
|
7435
7542
|
const { stateId, generatedAt, origin, ...content } = snapshot;
|
|
7436
7543
|
return JSON.stringify(content);
|
|
@@ -7639,7 +7746,8 @@ var init_contracts = __esm({
|
|
|
7639
7746
|
"SURFACE_REF_NOT_EXPOSED",
|
|
7640
7747
|
`Method "${implMethod.name}" in implementation "${impl.id}" dispatches capability "${step.capability}" through cross-tree portal "${step.targetComponent}" (step ${step.stepNumber}), but the surface snapshot of "${resolved.snapshot.projectName}" does not serve that capability on "${resolved.entry.id}".`,
|
|
7641
7748
|
impl.id,
|
|
7642
|
-
isDraftCtx
|
|
7749
|
+
isDraftCtx,
|
|
7750
|
+
true
|
|
7643
7751
|
);
|
|
7644
7752
|
}
|
|
7645
7753
|
continue;
|
|
@@ -7696,7 +7804,8 @@ var init_contracts = __esm({
|
|
|
7696
7804
|
"SURFACE_REF_NOT_EXPOSED",
|
|
7697
7805
|
`Method "${implMethod.name}" in implementation "${impl.id}" calls "${step.targetMethod}" on cross-tree component "${step.targetComponent}" (step ${step.stepNumber}), but the surface snapshot of "${resolved.snapshot.projectName}" does not expose that method on "${resolved.entry.id}".`,
|
|
7698
7806
|
impl.id,
|
|
7699
|
-
isDraftCtx
|
|
7807
|
+
isDraftCtx,
|
|
7808
|
+
true
|
|
7700
7809
|
);
|
|
7701
7810
|
} else if (step.assertsGuarantees) {
|
|
7702
7811
|
const declared = new Set(surfaceMethod.guarantees ?? []);
|
|
@@ -7707,7 +7816,8 @@ var init_contracts = __esm({
|
|
|
7707
7816
|
"NARRATIVE_SEMANTIC_UNBACKED",
|
|
7708
7817
|
`Step ${step.stepNumber} of "${implMethod.name}" in implementation "${impl.id}" asserts guarantee "${g}", but the surface snapshot of "${resolved.snapshot.projectName}" does not declare it on "${resolved.entry.id}.${step.targetMethod}".`,
|
|
7709
7818
|
impl.id,
|
|
7710
|
-
isDraftCtx
|
|
7819
|
+
isDraftCtx,
|
|
7820
|
+
true
|
|
7711
7821
|
);
|
|
7712
7822
|
}
|
|
7713
7823
|
}
|
|
@@ -9195,7 +9305,8 @@ var init_stereotype_deps = __esm({
|
|
|
9195
9305
|
"CROSS_SUBSYSTEM_NON_ADAPTER",
|
|
9196
9306
|
`Boundary violation: ${comp.componentType} "${comp.id}" depends directly on "${depId}", a surface of project "${resolved.snapshot.projectName}". Only a local client Adapter may cross a project boundary \u2014 route this hop through an Adapter.`,
|
|
9197
9307
|
comp.id,
|
|
9198
|
-
isDraftCtx
|
|
9308
|
+
isDraftCtx,
|
|
9309
|
+
true
|
|
9199
9310
|
);
|
|
9200
9311
|
}
|
|
9201
9312
|
continue;
|
|
@@ -12453,9 +12564,15 @@ function buildRuleContext(opts) {
|
|
|
12453
12564
|
...[...SDD_RULES, ...extensions.rules].flatMap((r) => r.codes.map((c) => c.code)),
|
|
12454
12565
|
// Declarative assertions bring their own namespaced codes — lint.allow
|
|
12455
12566
|
// and severity overrides treat them exactly like builtins.
|
|
12456
|
-
...extensions.assertions.map((a) => a.fullCode)
|
|
12567
|
+
...extensions.assertions.map((a) => a.fullCode),
|
|
12568
|
+
// Entry-point emitted codes: validateSddTree's chained-subproject pass
|
|
12569
|
+
// raises these AFTER the rule run (it post-processes the aggregated issue
|
|
12570
|
+
// list), so no registered rule declares them — but lint.allow validation
|
|
12571
|
+
// must still recognize them as real codes.
|
|
12572
|
+
"CHAINED_SUBPROJECT_CONTEXT",
|
|
12573
|
+
"UNVERIFIED_EXTERNAL_REF"
|
|
12457
12574
|
]);
|
|
12458
|
-
const addIssue = (defaultSeverity, code, message, specId, isDraftContext) => {
|
|
12575
|
+
const addIssue = (defaultSeverity, code, message, specId, isDraftContext, surfaceResolved) => {
|
|
12459
12576
|
if (scopeSubsystem && specId && !isSpecInScope(specId)) {
|
|
12460
12577
|
return;
|
|
12461
12578
|
}
|
|
@@ -12473,7 +12590,14 @@ function buildRuleContext(opts) {
|
|
|
12473
12590
|
if (severity === "warning") return;
|
|
12474
12591
|
}
|
|
12475
12592
|
}
|
|
12476
|
-
issues.push({
|
|
12593
|
+
issues.push({
|
|
12594
|
+
severity,
|
|
12595
|
+
code,
|
|
12596
|
+
message,
|
|
12597
|
+
specId,
|
|
12598
|
+
...isDraftContext ? { draftContext: true } : {},
|
|
12599
|
+
...surfaceResolved ? { surfaceResolved: true } : {}
|
|
12600
|
+
});
|
|
12477
12601
|
};
|
|
12478
12602
|
return {
|
|
12479
12603
|
system,
|
|
@@ -12951,24 +13075,54 @@ function validateSddTree(rulesOrOptions, projectType = "backend") {
|
|
|
12951
13075
|
for (const rule of ruleSequence()) {
|
|
12952
13076
|
rule.check(ctx);
|
|
12953
13077
|
}
|
|
12954
|
-
const hasCrossTreeSuspects = issues.some(
|
|
13078
|
+
const hasCrossTreeSuspects = issues.some(
|
|
13079
|
+
(i) => SUBPROJECT_REFERENCE_CODES.has(i.code) || SUBPROJECT_CONFORMANCE_CODES.has(i.code)
|
|
13080
|
+
);
|
|
12955
13081
|
const chainingParent = hasCrossTreeSuspects ? findChainingParent(getProjectRoot()) : null;
|
|
12956
13082
|
if (chainingParent) {
|
|
13083
|
+
let unverified = 0;
|
|
12957
13084
|
let downgraded = 0;
|
|
12958
|
-
for (
|
|
12959
|
-
|
|
12960
|
-
if (iss.
|
|
12961
|
-
|
|
12962
|
-
|
|
13085
|
+
for (let at = 0; at < issues.length; at++) {
|
|
13086
|
+
const iss = issues[at];
|
|
13087
|
+
if (SUBPROJECT_REFERENCE_CODES.has(iss.code) && !iss.surfaceResolved) {
|
|
13088
|
+
issues[at] = {
|
|
13089
|
+
severity: "warning",
|
|
13090
|
+
code: "UNVERIFIED_EXTERNAL_REF",
|
|
13091
|
+
crossTreeContext: true,
|
|
13092
|
+
// --ci waives it (parent root is authoritative)
|
|
13093
|
+
specId: iss.specId,
|
|
13094
|
+
...iss.agentId ? { agentId: iss.agentId } : {},
|
|
13095
|
+
...iss.draftContext ? { draftContext: true } : {},
|
|
13096
|
+
message: `Unverified external reference (${iss.code}): ${iss.message} No vendored surface snapshot covers this reference, so it cannot be verified from this chained subproject standalone \u2014 re-lock the parent so fresh family/sibling snapshots ship, or inspect what this project can consume via \`wairon surface externals\` / sdd_list_external_interfaces.`
|
|
13097
|
+
};
|
|
13098
|
+
unverified++;
|
|
13099
|
+
continue;
|
|
13100
|
+
}
|
|
13101
|
+
if (SUBPROJECT_CONFORMANCE_CODES.has(iss.code)) {
|
|
13102
|
+
if (iss.severity === "error") {
|
|
13103
|
+
iss.severity = "warning";
|
|
13104
|
+
downgraded++;
|
|
13105
|
+
}
|
|
13106
|
+
iss.crossTreeContext = true;
|
|
12963
13107
|
}
|
|
12964
|
-
iss.crossTreeContext = true;
|
|
12965
13108
|
}
|
|
12966
|
-
if (downgraded > 0) {
|
|
13109
|
+
if (unverified > 0 || downgraded > 0) {
|
|
13110
|
+
const notes = [];
|
|
13111
|
+
if (unverified > 0) {
|
|
13112
|
+
notes.push(
|
|
13113
|
+
`${unverified} cross-tree reference(s) have no vendored surface snapshot covering them and were reported as UNVERIFIED_EXTERNAL_REF warnings \u2014 re-lock the parent so fresh family/sibling snapshots ship, or inspect via \`wairon surface externals\` / sdd_list_external_interfaces.`
|
|
13114
|
+
);
|
|
13115
|
+
}
|
|
13116
|
+
if (downgraded > 0) {
|
|
13117
|
+
notes.push(
|
|
13118
|
+
`${downgraded} code\u2194spec conformance finding(s) (parent-root-relative source paths) were downgraded to warnings.`
|
|
13119
|
+
);
|
|
13120
|
+
}
|
|
12967
13121
|
issues.unshift({
|
|
12968
13122
|
severity: "warning",
|
|
12969
13123
|
code: "CHAINED_SUBPROJECT_CONTEXT",
|
|
12970
13124
|
crossTreeContext: true,
|
|
12971
|
-
message: `This project is a chained subproject ("${chainingParent.subsystemId}") of the parent project at "${chainingParent.parentRoot}". ${
|
|
13125
|
+
message: `This project is a chained subproject ("${chainingParent.subsystemId}") of the parent project at "${chainingParent.parentRoot}". ${notes.join(" ")} Full cross-tree verification runs from the parent root.`
|
|
12972
13126
|
});
|
|
12973
13127
|
}
|
|
12974
13128
|
}
|
|
@@ -12985,7 +13139,7 @@ function validateSddTree(rulesOrOptions, projectType = "backend") {
|
|
|
12985
13139
|
function validateAsComplete(options) {
|
|
12986
13140
|
return validateSddTree({ ...options ?? {}, treatAllAsComplete: true });
|
|
12987
13141
|
}
|
|
12988
|
-
var
|
|
13142
|
+
var SUBPROJECT_REFERENCE_CODES, SUBPROJECT_CONFORMANCE_CODES;
|
|
12989
13143
|
var init_validation = __esm({
|
|
12990
13144
|
"src/core/validation.ts"() {
|
|
12991
13145
|
"use strict";
|
|
@@ -12998,8 +13152,7 @@ var init_validation = __esm({
|
|
|
12998
13152
|
init_source_analysis();
|
|
12999
13153
|
init_specs2();
|
|
13000
13154
|
init_fs();
|
|
13001
|
-
|
|
13002
|
-
// reference resolution
|
|
13155
|
+
SUBPROJECT_REFERENCE_CODES = /* @__PURE__ */ new Set([
|
|
13003
13156
|
"UNDEFINED_TYPE_REFERENCE",
|
|
13004
13157
|
"INVALID_DEPENDENCY_REFERENCE",
|
|
13005
13158
|
"INVALID_TARGET_COMPONENT_REFERENCE",
|
|
@@ -13007,8 +13160,9 @@ var init_validation = __esm({
|
|
|
13007
13160
|
"UNDECLARED_DEPENDENCY_CALL",
|
|
13008
13161
|
"INVALID_TRUSTED_LINK",
|
|
13009
13162
|
"CROSS_SUBSYSTEM_NON_ADAPTER",
|
|
13010
|
-
"CROSS_TREE_REF_UNRESOLVED"
|
|
13011
|
-
|
|
13163
|
+
"CROSS_TREE_REF_UNRESOLVED"
|
|
13164
|
+
]);
|
|
13165
|
+
SUBPROJECT_CONFORMANCE_CODES = /* @__PURE__ */ new Set([
|
|
13012
13166
|
"MISSING_SOURCE_FILE",
|
|
13013
13167
|
"SOURCE_PATH_ESCAPES_ROOT",
|
|
13014
13168
|
"MISSING_SOURCE_PATH",
|
|
@@ -13931,6 +14085,19 @@ function dryRunSerializeSpecs(include) {
|
|
|
13931
14085
|
function buildProjectGraph(level) {
|
|
13932
14086
|
return buildGraphModel(level);
|
|
13933
14087
|
}
|
|
14088
|
+
function resolveChainingParent() {
|
|
14089
|
+
return findChainingParent(getProjectRoot());
|
|
14090
|
+
}
|
|
14091
|
+
function computeStateIdAt(root) {
|
|
14092
|
+
const resolved = path10.resolve(root);
|
|
14093
|
+
return runWithProjectRoot(resolved, () => {
|
|
14094
|
+
workspaceFor(resolved).invalidate();
|
|
14095
|
+
const system = loadSystemSpec();
|
|
14096
|
+
if (!system) return null;
|
|
14097
|
+
const s = computeStateId();
|
|
14098
|
+
return `${s.algorithm}:${s.digest}`;
|
|
14099
|
+
});
|
|
14100
|
+
}
|
|
13934
14101
|
function deleteTypeSpec(id) {
|
|
13935
14102
|
return current().deleteTypeSpec(id);
|
|
13936
14103
|
}
|
|
@@ -13974,6 +14141,7 @@ var init_specs2 = __esm({
|
|
|
13974
14141
|
path10 = __toESM(require("path"));
|
|
13975
14142
|
init_loader();
|
|
13976
14143
|
init_fs();
|
|
14144
|
+
init_statehash();
|
|
13977
14145
|
init_yaml();
|
|
13978
14146
|
init_models();
|
|
13979
14147
|
init_narrative_labels();
|
|
@@ -16138,7 +16306,9 @@ __export(src_exports, {
|
|
|
16138
16306
|
clearLoaderIssues: () => clearLoaderIssues,
|
|
16139
16307
|
collectPromotableSpecs: () => collectPromotableSpecs,
|
|
16140
16308
|
composeRuleSequence: () => composeRuleSequence,
|
|
16309
|
+
computeParentStateId: () => computeParentStateId,
|
|
16141
16310
|
computeStateId: () => computeStateId,
|
|
16311
|
+
computeStateIdAt: () => computeStateIdAt,
|
|
16142
16312
|
contextDir: () => contextDir,
|
|
16143
16313
|
createAgentRecord: () => createAgentRecord,
|
|
16144
16314
|
createChainedSubsystem: () => createChainedSubsystem,
|
|
@@ -16204,6 +16374,7 @@ __export(src_exports, {
|
|
|
16204
16374
|
isOpenApiDocument: () => isOpenApiDocument,
|
|
16205
16375
|
isProjectInitialized: () => isProjectInitialized,
|
|
16206
16376
|
listDirectChainedSubprojects: () => listDirectChainedSubprojects,
|
|
16377
|
+
listExternalInterfaces: () => listExternalInterfaces,
|
|
16207
16378
|
listFiles: () => listFiles,
|
|
16208
16379
|
listFilesRecursive: () => listFilesRecursive,
|
|
16209
16380
|
listFreeStandingDomains: () => listFreeStandingDomains,
|
|
@@ -16249,6 +16420,7 @@ __export(src_exports, {
|
|
|
16249
16420
|
pathExists: () => pathExists,
|
|
16250
16421
|
projectChildSurface: () => projectChildSurface,
|
|
16251
16422
|
projectOwnSurface: () => projectOwnSurface,
|
|
16423
|
+
projectSubsystemSurface: () => projectSubsystemSurface,
|
|
16252
16424
|
promoteAllComplete: () => promoteAllComplete,
|
|
16253
16425
|
provisionProject: () => provisionProject,
|
|
16254
16426
|
readArchitectureContext: () => readArchitectureContext,
|
|
@@ -16268,6 +16440,7 @@ __export(src_exports, {
|
|
|
16268
16440
|
renderTemplateInstructions: () => renderTemplateInstructions,
|
|
16269
16441
|
renderWaironGuide: () => renderWaironGuide,
|
|
16270
16442
|
resolveAgentTopology: () => resolveAgentTopology,
|
|
16443
|
+
resolveChainingParent: () => resolveChainingParent,
|
|
16271
16444
|
resolveDomains: () => resolveDomains,
|
|
16272
16445
|
resolvePackRef: () => resolvePackRef,
|
|
16273
16446
|
resolveSubprojectForNamespace: () => resolveSubprojectForNamespace,
|
|
@@ -16331,7 +16504,7 @@ function defaultTargetConfig(type) {
|
|
|
16331
16504
|
enabled: true
|
|
16332
16505
|
};
|
|
16333
16506
|
}
|
|
16334
|
-
var WAIRON_VERSION = "5.0.2-dev.
|
|
16507
|
+
var WAIRON_VERSION = "5.0.2-dev.14";
|
|
16335
16508
|
var GITHUB_REPO = "SYW-Apps/Waffle-AIron";
|
|
16336
16509
|
var ARCHITECT_AGENT_ID = "agent-architect";
|
|
16337
16510
|
var ARCHITECT_TEMPLATE_ID = "architect";
|
|
@@ -17725,7 +17898,9 @@ init_yaml();
|
|
|
17725
17898
|
clearLoaderIssues,
|
|
17726
17899
|
collectPromotableSpecs,
|
|
17727
17900
|
composeRuleSequence,
|
|
17901
|
+
computeParentStateId,
|
|
17728
17902
|
computeStateId,
|
|
17903
|
+
computeStateIdAt,
|
|
17729
17904
|
contextDir,
|
|
17730
17905
|
createAgentRecord,
|
|
17731
17906
|
createChainedSubsystem,
|
|
@@ -17791,6 +17966,7 @@ init_yaml();
|
|
|
17791
17966
|
isOpenApiDocument,
|
|
17792
17967
|
isProjectInitialized,
|
|
17793
17968
|
listDirectChainedSubprojects,
|
|
17969
|
+
listExternalInterfaces,
|
|
17794
17970
|
listFiles,
|
|
17795
17971
|
listFilesRecursive,
|
|
17796
17972
|
listFreeStandingDomains,
|
|
@@ -17836,6 +18012,7 @@ init_yaml();
|
|
|
17836
18012
|
pathExists,
|
|
17837
18013
|
projectChildSurface,
|
|
17838
18014
|
projectOwnSurface,
|
|
18015
|
+
projectSubsystemSurface,
|
|
17839
18016
|
promoteAllComplete,
|
|
17840
18017
|
provisionProject,
|
|
17841
18018
|
readArchitectureContext,
|
|
@@ -17855,6 +18032,7 @@ init_yaml();
|
|
|
17855
18032
|
renderTemplateInstructions,
|
|
17856
18033
|
renderWaironGuide,
|
|
17857
18034
|
resolveAgentTopology,
|
|
18035
|
+
resolveChainingParent,
|
|
17858
18036
|
resolveDomains,
|
|
17859
18037
|
resolvePackRef,
|
|
17860
18038
|
resolveSubprojectForNamespace,
|