@neuroverseos/governance 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +55 -0
  2. package/dist/adapters/autoresearch.js +2 -2
  3. package/dist/adapters/deep-agents.js +2 -2
  4. package/dist/adapters/express.js +2 -2
  5. package/dist/adapters/github.js +2 -2
  6. package/dist/adapters/index.js +8 -8
  7. package/dist/adapters/langchain.js +2 -2
  8. package/dist/adapters/mentraos.js +2 -2
  9. package/dist/adapters/openai.js +2 -2
  10. package/dist/adapters/openclaw.js +2 -2
  11. package/dist/{add-JP7TC2K3.js → add-XSANI3FK.js} +1 -1
  12. package/dist/{build-THUEYMVT.js → build-UTVDGHB3.js} +4 -4
  13. package/dist/{chunk-TZBERHFM.js → chunk-7FL3U7Z5.js} +1 -1
  14. package/dist/{chunk-FGOSKQDE.js → chunk-A2UZTLRV.js} +1 -1
  15. package/dist/{chunk-R23T5SZG.js → chunk-B3IIPTY3.js} +1 -1
  16. package/dist/chunk-EQR7BGFN.js +337 -0
  17. package/dist/{chunk-LAKUB76X.js → chunk-FDPPZLSQ.js} +1 -1
  18. package/dist/{chunk-UZBW44KD.js → chunk-FKQCPRKI.js} +1 -1
  19. package/dist/{chunk-XPMZB46F.js → chunk-FS2UUJJO.js} +3 -3
  20. package/dist/{chunk-6UPEUMJ2.js → chunk-HDNDL6D5.js} +1 -1
  21. package/dist/{chunk-7UU7V3AD.js → chunk-IOVXB6QN.js} +1 -1
  22. package/dist/{chunk-EK77AJAH.js → chunk-OTZU76DH.js} +1 -1
  23. package/dist/{chunk-5RAQ5DZW.js → chunk-T6GMRZWC.js} +1 -1
  24. package/dist/{chunk-RF2L5SYG.js → chunk-TIXVEPS2.js} +1 -1
  25. package/dist/{chunk-TL4DLMMW.js → chunk-TJ5L2UTE.js} +1 -1
  26. package/dist/chunk-UGTNKTHS.js +542 -0
  27. package/dist/cli/neuroverse.cjs +1987 -303
  28. package/dist/cli/neuroverse.js +27 -19
  29. package/dist/cli/plan.js +1 -1
  30. package/dist/cli/run.js +2 -2
  31. package/dist/cli/worldmodel.cjs +1624 -0
  32. package/dist/cli/worldmodel.d.cts +24 -0
  33. package/dist/cli/worldmodel.d.ts +24 -0
  34. package/dist/cli/worldmodel.js +742 -0
  35. package/dist/{demo-N5K4VXJW.js → demo-6W3YXLAX.js} +2 -2
  36. package/dist/{derive-5LOMN7GO.js → derive-42IJW7JI.js} +3 -3
  37. package/dist/engine/worldmodel-compiler.cjs +366 -0
  38. package/dist/engine/worldmodel-compiler.d.cts +46 -0
  39. package/dist/engine/worldmodel-compiler.d.ts +46 -0
  40. package/dist/engine/worldmodel-compiler.js +17 -0
  41. package/dist/engine/worldmodel-parser.cjs +566 -0
  42. package/dist/engine/worldmodel-parser.d.cts +22 -0
  43. package/dist/engine/worldmodel-parser.d.ts +22 -0
  44. package/dist/engine/worldmodel-parser.js +7 -0
  45. package/dist/{equity-penalties-PYCJ3Q4U.js → equity-penalties-CCO3GVHS.js} +1 -1
  46. package/dist/{explain-42TVC3QD.js → explain-HDFN4ION.js} +1 -1
  47. package/dist/{guard-TPYDFG6V.js → guard-IHJEKHL2.js} +1 -1
  48. package/dist/{improve-HLZGJ54Z.js → improve-LRORRYEX.js} +1 -1
  49. package/dist/index.js +48 -48
  50. package/dist/{lens-NFGZHD76.js → lens-TLDZQXBI.js} +61 -2
  51. package/dist/{mcp-server-5XXNG6VC.js → mcp-server-CKYBHXWK.js} +2 -2
  52. package/dist/{playground-2EU5CFIH.js → playground-3TTBN7XD.js} +1 -1
  53. package/dist/{redteam-VK6OVHAE.js → redteam-W644UMWN.js} +1 -1
  54. package/dist/{session-NGA4DUPL.js → session-FMAROEIE.js} +2 -2
  55. package/dist/{simulate-4YNOBMES.js → simulate-VT437EEL.js} +1 -1
  56. package/dist/{test-HDBPMQTG.js → test-XDB2DH3L.js} +1 -1
  57. package/dist/{validate-6MFQZ2EG.js → validate-M52DX22Y.js} +1 -1
  58. package/dist/{world-H5WVURKU.js → world-O4HTQPDP.js} +1 -1
  59. package/dist/{world-loader-J47PCPDZ.js → world-loader-YTYFOP7D.js} +1 -1
  60. package/dist/worldmodel-contract-BPGhiuW5.d.cts +221 -0
  61. package/dist/worldmodel-contract-BPGhiuW5.d.ts +221 -0
  62. package/dist/worlds/auki-vanguard.worldmodel.md +116 -0
  63. package/dist/worlds/behavioral-demo.nv-world.md +130 -0
  64. package/dist/worlds/neuroverse-governance.worldmodel.md +115 -0
  65. package/package.json +2 -2
  66. package/dist/{bootstrap-IP5QMC3Q.js → bootstrap-2OW5ZLBL.js} +3 -3
  67. package/dist/{chunk-QZ666FCV.js → chunk-735Z3HA4.js} +3 -3
  68. /package/dist/{chunk-EQUAWNXW.js → chunk-I4RTIMLX.js} +0 -0
  69. /package/dist/{doctor-Q5APJOTS.js → doctor-XEMLO6UA.js} +0 -0
@@ -0,0 +1,742 @@
1
+ import {
2
+ compileWorldModel,
3
+ emitContextsConfig,
4
+ emitLensSuggestions,
5
+ emitOverlapMap,
6
+ emitSignalSchema,
7
+ emitWorldMarkdown
8
+ } from "../chunk-EQR7BGFN.js";
9
+ import {
10
+ parseWorldModel
11
+ } from "../chunk-UGTNKTHS.js";
12
+ import "../chunk-QWGCMQQD.js";
13
+
14
+ // src/cli/worldmodel.ts
15
+ import { readFile, writeFile, mkdir } from "fs/promises";
16
+ import { existsSync } from "fs";
17
+ import { resolve, basename, dirname, join } from "path";
18
+ var BOLD = "\x1B[1m";
19
+ var DIM = "\x1B[2m";
20
+ var CYAN = "\x1B[36m";
21
+ var GREEN = "\x1B[32m";
22
+ var YELLOW = "\x1B[33m";
23
+ var RED = "\x1B[31m";
24
+ var MAGENTA = "\x1B[35m";
25
+ var RESET = "\x1B[0m";
26
+ var USAGE = `
27
+ neuroverse worldmodel \u2014 Behavioral world model toolkit
28
+
29
+ ${BOLD}This file defines how a system behaves, how that behavior
30
+ is interpreted, and how it evolves over time.${RESET}
31
+
32
+ Commands:
33
+ init Scaffold a new .worldmodel.md template
34
+ validate Check structure and completeness
35
+ explain Human-readable model summary
36
+ build Compile to .nv-world.md + signals + overlaps + contexts + lenses
37
+ emit-world Emit compiled .nv-world.md to stdout
38
+ emit-signals Emit signal schema JSON to stdout
39
+ emit-lenses Emit lens suggestions JSON to stdout
40
+ emit-contexts Emit contextual modifiers JSON to stdout
41
+ emit-overlaps Emit overlap map JSON to stdout
42
+
43
+ Usage:
44
+ neuroverse worldmodel init [--name "Name"] [--output path]
45
+ neuroverse worldmodel validate <source.worldmodel.md> [--json]
46
+ neuroverse worldmodel explain <source.worldmodel.md> [--json]
47
+ neuroverse worldmodel build <source.worldmodel.md> [--output <dir>]
48
+ neuroverse worldmodel emit-world <source.worldmodel.md>
49
+ neuroverse worldmodel emit-signals <source.worldmodel.md> [--json]
50
+ neuroverse worldmodel emit-lenses <source.worldmodel.md> [--json]
51
+ neuroverse worldmodel emit-contexts <source.worldmodel.md> [--json]
52
+ neuroverse worldmodel emit-overlaps <source.worldmodel.md> [--json]
53
+
54
+ Examples:
55
+ neuroverse worldmodel init --name "Auki Vanguard"
56
+ neuroverse worldmodel build ./auki-vanguard.worldmodel.md --output ./world/
57
+ neuroverse worldmodel explain ./auki-vanguard.worldmodel.md
58
+ `.trim();
59
+ function parseArgs(argv) {
60
+ const args = {
61
+ inputPath: "",
62
+ output: "",
63
+ name: "",
64
+ json: false,
65
+ help: false
66
+ };
67
+ for (let i = 0; i < argv.length; i++) {
68
+ const arg = argv[i];
69
+ if (arg === "--json") {
70
+ args.json = true;
71
+ } else if (arg === "--help" || arg === "-h") {
72
+ args.help = true;
73
+ } else if (arg === "--output" && i + 1 < argv.length) {
74
+ args.output = argv[++i];
75
+ } else if (arg === "--name" && i + 1 < argv.length) {
76
+ args.name = argv[++i];
77
+ } else if (!arg.startsWith("--") && !args.inputPath) {
78
+ args.inputPath = arg;
79
+ }
80
+ }
81
+ return args;
82
+ }
83
+ function formatIssue(issue) {
84
+ const color = issue.severity === "error" ? RED : issue.severity === "warning" ? YELLOW : DIM;
85
+ const icon = issue.severity === "error" ? "x" : issue.severity === "warning" ? "!" : "i";
86
+ const lineRef = issue.line > 0 ? `:${issue.line}` : "";
87
+ return ` ${color}${icon}${RESET} [${issue.section}${lineRef}] ${issue.message}`;
88
+ }
89
+ async function readSourceFile(inputPath) {
90
+ const fullPath = resolve(inputPath);
91
+ if (!existsSync(fullPath)) {
92
+ process.stderr.write(`File not found: ${fullPath}
93
+ `);
94
+ process.exit(3);
95
+ }
96
+ return readFile(fullPath, "utf-8");
97
+ }
98
+ async function loadAndParse(inputPath) {
99
+ const content = await readSourceFile(inputPath);
100
+ const result = parseWorldModel(content);
101
+ if (!result.model) {
102
+ process.stderr.write(`${RED}Failed to parse ${inputPath}${RESET}
103
+ `);
104
+ for (const issue of result.issues) {
105
+ process.stderr.write(formatIssue(issue) + "\n");
106
+ }
107
+ process.exit(1);
108
+ }
109
+ return { model: result.model, issues: result.issues };
110
+ }
111
+ async function cmdInit(argv) {
112
+ const args = parseArgs(argv);
113
+ if (args.help) {
114
+ process.stdout.write(
115
+ 'neuroverse worldmodel init \u2014 Scaffold a new .worldmodel.md template\n\nOptions:\n --name <name> Model name (default: "My Behavioral Model")\n --output <path> Output path (default: ./model.worldmodel.md)\n'
116
+ );
117
+ return;
118
+ }
119
+ const modelName = args.name || "My Behavioral Model";
120
+ const outputPath = resolve(
121
+ args.output || `./${toFileName(modelName)}.worldmodel.md`
122
+ );
123
+ if (existsSync(outputPath)) {
124
+ process.stderr.write(`File already exists: ${outputPath}
125
+ `);
126
+ process.stderr.write("Use --output to specify a different path.\n");
127
+ process.exit(1);
128
+ }
129
+ const template = generateScaffold(modelName);
130
+ const dir = dirname(outputPath);
131
+ if (!existsSync(dir)) {
132
+ await mkdir(dir, { recursive: true });
133
+ }
134
+ await writeFile(outputPath, template, "utf-8");
135
+ process.stderr.write(`${GREEN}Created${RESET} ${outputPath}
136
+ `);
137
+ process.stderr.write(
138
+ `${DIM}Edit the template, then run: neuroverse worldmodel validate ${basename(outputPath)}${RESET}
139
+ `
140
+ );
141
+ }
142
+ function toFileName(name) {
143
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
144
+ }
145
+ function generateScaffold(modelName) {
146
+ return `---
147
+ name: ${modelName}
148
+ version: 1.0.0
149
+ ---
150
+
151
+ # Core Model Geometry
152
+ <!--
153
+ This section defines the STRUCTURE of your behavioral system.
154
+
155
+ You are defining:
156
+ - what the system is trying to achieve (mission)
157
+ - the major domains it operates within (2-4 recommended)
158
+ - the skills inside each domain
159
+ - the values that govern those skills
160
+ - what emerges when domains interact
161
+ - what identity forms when everything is aligned
162
+
163
+ Think of this as the "physics" of your system.
164
+ -->
165
+
166
+ ## Mission
167
+ <!-- What is this system trying to achieve? This is not a slogan \u2014 it is the core aim. -->
168
+
169
+ Replace with your mission statement.
170
+
171
+ ## Domains
172
+ <!--
173
+ Define 2-4 domains. Each domain is a mode of operating.
174
+ Each domain MUST include:
175
+ - Skills (what it can do)
176
+ - Values (how it must behave while doing it)
177
+
178
+ Domains are NOT personality traits \u2014 they are capability environments.
179
+ -->
180
+
181
+ ### Domain One
182
+
183
+ #### Skills
184
+ - Replace with a capability
185
+ - Replace with another capability
186
+
187
+ #### Values
188
+ - Replace with a constraint
189
+ - Replace with another constraint
190
+
191
+ ### Domain Two
192
+
193
+ #### Skills
194
+ - Replace with a capability
195
+ - Replace with another capability
196
+
197
+ #### Values
198
+ - Replace with a constraint
199
+ - Replace with another constraint
200
+
201
+ ## Overlap Effects
202
+ <!--
203
+ Define what emerges when TWO domains interact well.
204
+
205
+ Format:
206
+ - Domain A + Domain B = Emergent State
207
+
208
+ These are NOT enforced rules.
209
+ These are INTERPRETIVE STATES used downstream.
210
+
211
+ They answer:
212
+ "What does it feel like / look like when these are working together?"
213
+ -->
214
+
215
+ - Domain One + Domain Two = Replace With Emergent State
216
+
217
+ ## Center Identity
218
+ <!--
219
+ What does the system become when all domains are aligned?
220
+ This is the CORE IDENTITY of the system.
221
+ -->
222
+
223
+ Replace with center identity name
224
+
225
+ # Contextual Modifiers
226
+ <!--
227
+ This section defines how BEHAVIOR IS INTERPRETED differently depending on context.
228
+
229
+ These do NOT define truth.
230
+ They define how meaning changes depending on:
231
+ - who is acting
232
+ - where behavior occurs
233
+ - what phase the system is in
234
+
235
+ This is what makes the model multidimensional.
236
+ -->
237
+
238
+ ## Authority Layers
239
+ <!-- Who is acting? -->
240
+ - founder
241
+ - maintainer
242
+ - contributor
243
+ - agent
244
+
245
+ ## Spatial Contexts
246
+ <!-- Where is behavior happening? -->
247
+ - planning
248
+ - execution
249
+ - deployment
250
+ - governance
251
+
252
+ ## Interpretation Rules
253
+ <!--
254
+ How does context change meaning?
255
+
256
+ Examples:
257
+ - ambiguity from a founder carries more risk than ambiguity from a contributor
258
+ - weak ownership in deployment is more serious than in planning
259
+ -->
260
+
261
+ - Replace with an interpretation rule
262
+
263
+ # Evolution Layer
264
+ <!--
265
+ This section defines:
266
+ - what GOOD behavior looks like
267
+ - what DRIFT looks like
268
+ - what can be OBSERVED
269
+ - how decisions should be made
270
+ - how the model EVOLVES
271
+
272
+ This is the EXECUTABLE layer.
273
+ -->
274
+
275
+ ## Aligned Behaviors
276
+ <!-- What does success look like in action? -->
277
+ - Replace with an aligned behavior
278
+
279
+ ## Drift Behaviors
280
+ <!-- What does misalignment look like? -->
281
+ - Replace with a drift behavior
282
+
283
+ ## Signals
284
+ <!--
285
+ What can be measured or observed?
286
+
287
+ Use simple snake_case identifiers:
288
+ - clarity
289
+ - ownership
290
+ - follow_through
291
+ -->
292
+
293
+ - clarity
294
+ - ownership
295
+
296
+ ## Decision Priorities
297
+ <!--
298
+ What wins when tradeoffs appear?
299
+
300
+ Format:
301
+ - preferred > secondary
302
+ -->
303
+
304
+ - quality > speed
305
+
306
+ ## Evolution Conditions
307
+ <!--
308
+ When should the model adapt?
309
+
310
+ Examples:
311
+ - repeated successful behavior outside assumptions should trigger review
312
+ - persistent drift across scopes should trigger evolution proposal
313
+ -->
314
+
315
+ - Replace with an evolution condition
316
+ `;
317
+ }
318
+ async function cmdValidate(argv) {
319
+ const args = parseArgs(argv);
320
+ if (args.help || !args.inputPath) {
321
+ process.stdout.write(
322
+ "neuroverse worldmodel validate <source.worldmodel.md> [--json]\n"
323
+ );
324
+ return;
325
+ }
326
+ const content = await readSourceFile(args.inputPath);
327
+ const result = parseWorldModel(content);
328
+ const errors = result.issues.filter((i) => i.severity === "error");
329
+ const warnings = result.issues.filter((i) => i.severity === "warning");
330
+ const infos = result.issues.filter((i) => i.severity === "info");
331
+ if (args.json) {
332
+ const summary = result.model ? {
333
+ valid: errors.length === 0,
334
+ domains: result.model.geometry.domains.length,
335
+ overlaps: result.model.geometry.overlapEffects.length,
336
+ signals: result.model.evolution.signals.length,
337
+ aligned_behaviors: result.model.evolution.alignedBehaviors.length,
338
+ drift_behaviors: result.model.evolution.driftBehaviors.length,
339
+ priorities: result.model.evolution.decisionPriorities.length,
340
+ errors: errors.length,
341
+ warnings: warnings.length
342
+ } : { valid: false, errors: errors.length, warnings: warnings.length };
343
+ process.stdout.write(
344
+ JSON.stringify({ summary, issues: result.issues }, null, 2) + "\n"
345
+ );
346
+ process.exit(errors.length > 0 ? 1 : 0);
347
+ return;
348
+ }
349
+ if (errors.length === 0) {
350
+ process.stderr.write(
351
+ `${GREEN}Valid${RESET} ${args.inputPath}
352
+ `
353
+ );
354
+ } else {
355
+ process.stderr.write(
356
+ `${RED}Invalid${RESET} ${args.inputPath}
357
+ `
358
+ );
359
+ }
360
+ if (result.model) {
361
+ const m = result.model;
362
+ process.stderr.write(
363
+ `${DIM} Domains: ${m.geometry.domains.length} Overlaps: ${m.geometry.overlapEffects.length} Signals: ${m.evolution.signals.length}${RESET}
364
+ `
365
+ );
366
+ }
367
+ if (result.issues.length > 0) {
368
+ process.stderr.write("\n");
369
+ for (const issue of result.issues) {
370
+ process.stderr.write(formatIssue(issue) + "\n");
371
+ }
372
+ }
373
+ process.exit(errors.length > 0 ? 1 : 0);
374
+ }
375
+ async function cmdExplain(argv) {
376
+ const args = parseArgs(argv);
377
+ if (args.help || !args.inputPath) {
378
+ process.stdout.write(
379
+ "neuroverse worldmodel explain <source.worldmodel.md> [--json]\n"
380
+ );
381
+ return;
382
+ }
383
+ const { model } = await loadAndParse(args.inputPath);
384
+ if (args.json) {
385
+ const output = buildExplainData(model);
386
+ process.stdout.write(JSON.stringify(output, null, 2) + "\n");
387
+ return;
388
+ }
389
+ const out = process.stdout;
390
+ out.write(`
391
+ ${BOLD}MODEL:${RESET} ${model.frontmatter.name} (v${model.frontmatter.version})
392
+
393
+ `);
394
+ out.write(`${CYAN}${BOLD}CORE MODEL GEOMETRY${RESET}
395
+ `);
396
+ out.write(` ${BOLD}Mission:${RESET} ${model.geometry.mission}
397
+ `);
398
+ const domainNames = model.geometry.domains.map((d) => d.name).join(", ");
399
+ out.write(
400
+ ` ${BOLD}Domains (${model.geometry.domains.length}):${RESET} ${domainNames}
401
+ `
402
+ );
403
+ for (const domain of model.geometry.domains) {
404
+ out.write(`
405
+ ${MAGENTA}${domain.name}${RESET}
406
+ `);
407
+ if (domain.skills.length > 0) {
408
+ out.write(` ${DIM}Skills:${RESET} ${domain.skills.join(", ")}
409
+ `);
410
+ }
411
+ if (domain.values.length > 0) {
412
+ out.write(` ${DIM}Values:${RESET} ${domain.values.join(", ")}
413
+ `);
414
+ }
415
+ }
416
+ if (model.geometry.overlapEffects.length > 0) {
417
+ out.write(`
418
+ ${BOLD}Overlaps (${model.geometry.overlapEffects.length}):${RESET}
419
+ `);
420
+ for (const o of model.geometry.overlapEffects) {
421
+ out.write(` ${o.domainA} + ${o.domainB} = ${GREEN}${o.effect}${RESET}
422
+ `);
423
+ }
424
+ }
425
+ if (model.geometry.centerIdentity) {
426
+ out.write(
427
+ `
428
+ ${BOLD}Center Identity:${RESET} ${GREEN}${model.geometry.centerIdentity}${RESET}
429
+ `
430
+ );
431
+ }
432
+ out.write(`
433
+ ${CYAN}${BOLD}CONTEXTUAL MODIFIERS${RESET}
434
+ `);
435
+ if (model.modifiers.authorityLayers.length > 0) {
436
+ out.write(
437
+ ` ${BOLD}Authority:${RESET} ${model.modifiers.authorityLayers.join(", ")}
438
+ `
439
+ );
440
+ }
441
+ if (model.modifiers.spatialContexts.length > 0) {
442
+ out.write(
443
+ ` ${BOLD}Spatial:${RESET} ${model.modifiers.spatialContexts.join(", ")}
444
+ `
445
+ );
446
+ }
447
+ if (model.modifiers.interpretationRules.length > 0) {
448
+ out.write(
449
+ ` ${BOLD}Interpretation Rules:${RESET} ${model.modifiers.interpretationRules.length} defined
450
+ `
451
+ );
452
+ for (const rule of model.modifiers.interpretationRules) {
453
+ out.write(` ${DIM}- ${rule}${RESET}
454
+ `);
455
+ }
456
+ }
457
+ out.write(`
458
+ ${CYAN}${BOLD}EVOLUTION LAYER${RESET}
459
+ `);
460
+ out.write(
461
+ ` Aligned behaviors: ${model.evolution.alignedBehaviors.length} defined
462
+ `
463
+ );
464
+ out.write(
465
+ ` Drift behaviors: ${model.evolution.driftBehaviors.length} defined
466
+ `
467
+ );
468
+ out.write(
469
+ ` Signals: ${model.evolution.signals.length} tracked
470
+ `
471
+ );
472
+ out.write(
473
+ ` Decision priorities: ${model.evolution.decisionPriorities.length} defined
474
+ `
475
+ );
476
+ out.write(
477
+ ` Evolution conditions: ${model.evolution.evolutionConditions.length} defined
478
+ `
479
+ );
480
+ out.write(`
481
+ ${DIM}---${RESET}
482
+ `);
483
+ const overlapEffects = model.geometry.overlapEffects.map((o) => o.effect).join(", ");
484
+ out.write(
485
+ `
486
+ This model operates across ${model.geometry.domains.length} domains governed by embedded values.
487
+ `
488
+ );
489
+ if (overlapEffects) {
490
+ out.write(
491
+ `It produces ${GREEN}${overlapEffects}${RESET} when domains interact well.
492
+ `
493
+ );
494
+ }
495
+ if (model.evolution.driftBehaviors.length > 0) {
496
+ const driftSample = model.evolution.driftBehaviors.slice(0, 3).join("; ");
497
+ out.write(`Drift shows as: ${YELLOW}${driftSample}${RESET}.
498
+ `);
499
+ }
500
+ if (model.geometry.centerIdentity) {
501
+ out.write(
502
+ `When aligned, the system becomes: ${GREEN}${BOLD}${model.geometry.centerIdentity}${RESET}.
503
+ `
504
+ );
505
+ }
506
+ out.write("\n");
507
+ }
508
+ function buildExplainData(model) {
509
+ return {
510
+ name: model.frontmatter.name,
511
+ version: model.frontmatter.version,
512
+ model_id: model.frontmatter.model_id,
513
+ geometry: {
514
+ mission: model.geometry.mission,
515
+ domains: model.geometry.domains.map((d) => ({
516
+ name: d.name,
517
+ skills: d.skills,
518
+ values: d.values
519
+ })),
520
+ overlaps: model.geometry.overlapEffects.map((o) => ({
521
+ domainA: o.domainA,
522
+ domainB: o.domainB,
523
+ effect: o.effect
524
+ })),
525
+ centerIdentity: model.geometry.centerIdentity
526
+ },
527
+ modifiers: {
528
+ authority: model.modifiers.authorityLayers,
529
+ spatial: model.modifiers.spatialContexts,
530
+ interpretationRules: model.modifiers.interpretationRules.length
531
+ },
532
+ evolution: {
533
+ alignedBehaviors: model.evolution.alignedBehaviors.length,
534
+ driftBehaviors: model.evolution.driftBehaviors.length,
535
+ signals: model.evolution.signals,
536
+ priorities: model.evolution.decisionPriorities.length,
537
+ evolutionConditions: model.evolution.evolutionConditions.length
538
+ }
539
+ };
540
+ }
541
+ async function cmdBuild(argv) {
542
+ const args = parseArgs(argv);
543
+ if (args.help || !args.inputPath) {
544
+ process.stdout.write(
545
+ "neuroverse worldmodel build <source.worldmodel.md> [--output <dir>] [--json]\n"
546
+ );
547
+ return;
548
+ }
549
+ const { model, issues } = await loadAndParse(args.inputPath);
550
+ const errors = issues.filter((i) => i.severity === "error");
551
+ if (errors.length > 0) {
552
+ process.stderr.write(`${RED}Cannot build \u2014 validation errors:${RESET}
553
+ `);
554
+ for (const issue of errors) {
555
+ process.stderr.write(formatIssue(issue) + "\n");
556
+ }
557
+ process.exit(1);
558
+ }
559
+ const warnings = issues.filter((i) => i.severity === "warning");
560
+ if (warnings.length > 0) {
561
+ process.stderr.write(`${YELLOW}Warnings:${RESET}
562
+ `);
563
+ for (const issue of warnings) {
564
+ process.stderr.write(formatIssue(issue) + "\n");
565
+ }
566
+ process.stderr.write("\n");
567
+ }
568
+ const output = compileWorldModel(model);
569
+ const outputDir = resolve(
570
+ args.output || `.neuroverse/worldmodels/${model.frontmatter.model_id}/`
571
+ );
572
+ if (!existsSync(outputDir)) {
573
+ await mkdir(outputDir, { recursive: true });
574
+ }
575
+ const worldPath = join(outputDir, `${model.frontmatter.model_id}.nv-world.md`);
576
+ const signalsPath = join(outputDir, "signals.json");
577
+ const overlapsPath = join(outputDir, "overlaps.json");
578
+ const contextsPath = join(outputDir, "contexts.json");
579
+ const lensesPath = join(outputDir, "lenses.json");
580
+ await Promise.all([
581
+ writeFile(worldPath, output.worldMarkdown, "utf-8"),
582
+ writeFile(signalsPath, JSON.stringify(output.signalSchema, null, 2) + "\n", "utf-8"),
583
+ writeFile(overlapsPath, JSON.stringify(output.overlapMap, null, 2) + "\n", "utf-8"),
584
+ writeFile(contextsPath, JSON.stringify(output.contextsConfig, null, 2) + "\n", "utf-8"),
585
+ writeFile(lensesPath, JSON.stringify(output.lensSuggestions, null, 2) + "\n", "utf-8")
586
+ ]);
587
+ if (args.json) {
588
+ process.stdout.write(
589
+ JSON.stringify(
590
+ {
591
+ success: true,
592
+ outputDir,
593
+ files: {
594
+ world: worldPath,
595
+ signals: signalsPath,
596
+ overlaps: overlapsPath,
597
+ contexts: contextsPath,
598
+ lenses: lensesPath
599
+ }
600
+ },
601
+ null,
602
+ 2
603
+ ) + "\n"
604
+ );
605
+ } else {
606
+ process.stderr.write(`${GREEN}Built${RESET} ${model.frontmatter.name}
607
+
608
+ `);
609
+ process.stderr.write(` ${BOLD}Output:${RESET} ${outputDir}/
610
+ `);
611
+ process.stderr.write(` ${basename(worldPath)}${DIM} \u2014 executable world${RESET}
612
+ `);
613
+ process.stderr.write(` signals.json${DIM} \u2014 signal schema${RESET}
614
+ `);
615
+ process.stderr.write(` overlaps.json${DIM} \u2014 overlap map${RESET}
616
+ `);
617
+ process.stderr.write(` contexts.json${DIM} \u2014 contextual modifiers${RESET}
618
+ `);
619
+ process.stderr.write(` lenses.json${DIM} \u2014 lens suggestions${RESET}
620
+
621
+ `);
622
+ const ruleCount = model.evolution.driftBehaviors.length + model.evolution.alignedBehaviors.length + model.evolution.decisionPriorities.length;
623
+ const invariantCount = model.geometry.domains.reduce(
624
+ (sum, d) => sum + d.values.length,
625
+ 0
626
+ );
627
+ process.stderr.write(
628
+ ` ${DIM}${invariantCount} invariants, ${model.evolution.signals.length + 1} state vars, ${ruleCount} rules, 5 gates, ${model.geometry.overlapEffects.length} lenses${RESET}
629
+ `
630
+ );
631
+ process.stderr.write(
632
+ `
633
+ ${DIM}Next: neuroverse bootstrap --input ${worldPath} --output ${outputDir}${RESET}
634
+ `
635
+ );
636
+ }
637
+ }
638
+ async function cmdEmitWorld(argv) {
639
+ const args = parseArgs(argv);
640
+ if (args.help || !args.inputPath) {
641
+ process.stdout.write("neuroverse worldmodel emit-world <source.worldmodel.md>\n");
642
+ return;
643
+ }
644
+ const { model } = await loadAndParse(args.inputPath);
645
+ const markdown = emitWorldMarkdown(model);
646
+ if (args.output) {
647
+ const dir = dirname(resolve(args.output));
648
+ if (!existsSync(dir)) await mkdir(dir, { recursive: true });
649
+ await writeFile(resolve(args.output), markdown, "utf-8");
650
+ process.stderr.write(`${GREEN}Written${RESET} ${args.output}
651
+ `);
652
+ } else {
653
+ process.stdout.write(markdown);
654
+ }
655
+ }
656
+ async function cmdEmitSignals(argv) {
657
+ const args = parseArgs(argv);
658
+ if (args.help || !args.inputPath) {
659
+ process.stdout.write(
660
+ "neuroverse worldmodel emit-signals <source.worldmodel.md> [--json]\n"
661
+ );
662
+ return;
663
+ }
664
+ const { model } = await loadAndParse(args.inputPath);
665
+ const schema = emitSignalSchema(model);
666
+ process.stdout.write(JSON.stringify(schema, null, 2) + "\n");
667
+ }
668
+ async function cmdEmitLenses(argv) {
669
+ const args = parseArgs(argv);
670
+ if (args.help || !args.inputPath) {
671
+ process.stdout.write(
672
+ "neuroverse worldmodel emit-lenses <source.worldmodel.md> [--json]\n"
673
+ );
674
+ return;
675
+ }
676
+ const { model } = await loadAndParse(args.inputPath);
677
+ const lenses = emitLensSuggestions(model);
678
+ process.stdout.write(JSON.stringify(lenses, null, 2) + "\n");
679
+ }
680
+ async function cmdEmitContexts(argv) {
681
+ const args = parseArgs(argv);
682
+ if (args.help || !args.inputPath) {
683
+ process.stdout.write(
684
+ "neuroverse worldmodel emit-contexts <source.worldmodel.md> [--json]\n"
685
+ );
686
+ return;
687
+ }
688
+ const { model } = await loadAndParse(args.inputPath);
689
+ const contexts = emitContextsConfig(model);
690
+ process.stdout.write(JSON.stringify(contexts, null, 2) + "\n");
691
+ }
692
+ async function cmdEmitOverlaps(argv) {
693
+ const args = parseArgs(argv);
694
+ if (args.help || !args.inputPath) {
695
+ process.stdout.write(
696
+ "neuroverse worldmodel emit-overlaps <source.worldmodel.md> [--json]\n"
697
+ );
698
+ return;
699
+ }
700
+ const { model } = await loadAndParse(args.inputPath);
701
+ const overlaps = emitOverlapMap(model);
702
+ process.stdout.write(JSON.stringify(overlaps, null, 2) + "\n");
703
+ }
704
+ async function main(argv = process.argv.slice(2)) {
705
+ const subcommand = argv[0] ?? "";
706
+ const subArgs = argv.slice(1);
707
+ switch (subcommand) {
708
+ case "init":
709
+ return cmdInit(subArgs);
710
+ case "validate":
711
+ return cmdValidate(subArgs);
712
+ case "explain":
713
+ return cmdExplain(subArgs);
714
+ case "build":
715
+ return cmdBuild(subArgs);
716
+ case "emit-world":
717
+ return cmdEmitWorld(subArgs);
718
+ case "emit-signals":
719
+ return cmdEmitSignals(subArgs);
720
+ case "emit-lenses":
721
+ return cmdEmitLenses(subArgs);
722
+ case "emit-contexts":
723
+ return cmdEmitContexts(subArgs);
724
+ case "emit-overlaps":
725
+ return cmdEmitOverlaps(subArgs);
726
+ case "--help":
727
+ case "-h":
728
+ case "help":
729
+ case "":
730
+ process.stdout.write(USAGE + "\n");
731
+ break;
732
+ default:
733
+ process.stderr.write(`Unknown worldmodel command: "${subcommand}"
734
+
735
+ `);
736
+ process.stdout.write(USAGE + "\n");
737
+ process.exit(1);
738
+ }
739
+ }
740
+ export {
741
+ main
742
+ };