@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.
- package/README.md +55 -0
- package/dist/adapters/autoresearch.js +2 -2
- package/dist/adapters/deep-agents.js +2 -2
- package/dist/adapters/express.js +2 -2
- package/dist/adapters/github.js +2 -2
- package/dist/adapters/index.js +8 -8
- package/dist/adapters/langchain.js +2 -2
- package/dist/adapters/mentraos.js +2 -2
- package/dist/adapters/openai.js +2 -2
- package/dist/adapters/openclaw.js +2 -2
- package/dist/{add-JP7TC2K3.js → add-XSANI3FK.js} +1 -1
- package/dist/{build-THUEYMVT.js → build-UTVDGHB3.js} +4 -4
- package/dist/{chunk-TZBERHFM.js → chunk-7FL3U7Z5.js} +1 -1
- package/dist/{chunk-FGOSKQDE.js → chunk-A2UZTLRV.js} +1 -1
- package/dist/{chunk-R23T5SZG.js → chunk-B3IIPTY3.js} +1 -1
- package/dist/chunk-EQR7BGFN.js +337 -0
- package/dist/{chunk-LAKUB76X.js → chunk-FDPPZLSQ.js} +1 -1
- package/dist/{chunk-UZBW44KD.js → chunk-FKQCPRKI.js} +1 -1
- package/dist/{chunk-XPMZB46F.js → chunk-FS2UUJJO.js} +3 -3
- package/dist/{chunk-6UPEUMJ2.js → chunk-HDNDL6D5.js} +1 -1
- package/dist/{chunk-7UU7V3AD.js → chunk-IOVXB6QN.js} +1 -1
- package/dist/{chunk-EK77AJAH.js → chunk-OTZU76DH.js} +1 -1
- package/dist/{chunk-5RAQ5DZW.js → chunk-T6GMRZWC.js} +1 -1
- package/dist/{chunk-RF2L5SYG.js → chunk-TIXVEPS2.js} +1 -1
- package/dist/{chunk-TL4DLMMW.js → chunk-TJ5L2UTE.js} +1 -1
- package/dist/chunk-UGTNKTHS.js +542 -0
- package/dist/cli/neuroverse.cjs +1987 -303
- package/dist/cli/neuroverse.js +27 -19
- package/dist/cli/plan.js +1 -1
- package/dist/cli/run.js +2 -2
- package/dist/cli/worldmodel.cjs +1624 -0
- package/dist/cli/worldmodel.d.cts +24 -0
- package/dist/cli/worldmodel.d.ts +24 -0
- package/dist/cli/worldmodel.js +742 -0
- package/dist/{demo-N5K4VXJW.js → demo-6W3YXLAX.js} +2 -2
- package/dist/{derive-5LOMN7GO.js → derive-42IJW7JI.js} +3 -3
- package/dist/engine/worldmodel-compiler.cjs +366 -0
- package/dist/engine/worldmodel-compiler.d.cts +46 -0
- package/dist/engine/worldmodel-compiler.d.ts +46 -0
- package/dist/engine/worldmodel-compiler.js +17 -0
- package/dist/engine/worldmodel-parser.cjs +566 -0
- package/dist/engine/worldmodel-parser.d.cts +22 -0
- package/dist/engine/worldmodel-parser.d.ts +22 -0
- package/dist/engine/worldmodel-parser.js +7 -0
- package/dist/{equity-penalties-PYCJ3Q4U.js → equity-penalties-CCO3GVHS.js} +1 -1
- package/dist/{explain-42TVC3QD.js → explain-HDFN4ION.js} +1 -1
- package/dist/{guard-TPYDFG6V.js → guard-IHJEKHL2.js} +1 -1
- package/dist/{improve-HLZGJ54Z.js → improve-LRORRYEX.js} +1 -1
- package/dist/index.js +48 -48
- package/dist/{lens-NFGZHD76.js → lens-TLDZQXBI.js} +61 -2
- package/dist/{mcp-server-5XXNG6VC.js → mcp-server-CKYBHXWK.js} +2 -2
- package/dist/{playground-2EU5CFIH.js → playground-3TTBN7XD.js} +1 -1
- package/dist/{redteam-VK6OVHAE.js → redteam-W644UMWN.js} +1 -1
- package/dist/{session-NGA4DUPL.js → session-FMAROEIE.js} +2 -2
- package/dist/{simulate-4YNOBMES.js → simulate-VT437EEL.js} +1 -1
- package/dist/{test-HDBPMQTG.js → test-XDB2DH3L.js} +1 -1
- package/dist/{validate-6MFQZ2EG.js → validate-M52DX22Y.js} +1 -1
- package/dist/{world-H5WVURKU.js → world-O4HTQPDP.js} +1 -1
- package/dist/{world-loader-J47PCPDZ.js → world-loader-YTYFOP7D.js} +1 -1
- package/dist/worldmodel-contract-BPGhiuW5.d.cts +221 -0
- package/dist/worldmodel-contract-BPGhiuW5.d.ts +221 -0
- package/dist/worlds/auki-vanguard.worldmodel.md +116 -0
- package/dist/worlds/behavioral-demo.nv-world.md +130 -0
- package/dist/worlds/neuroverse-governance.worldmodel.md +115 -0
- package/package.json +2 -2
- package/dist/{bootstrap-IP5QMC3Q.js → bootstrap-2OW5ZLBL.js} +3 -3
- package/dist/{chunk-QZ666FCV.js → chunk-735Z3HA4.js} +3 -3
- /package/dist/{chunk-EQUAWNXW.js → chunk-I4RTIMLX.js} +0 -0
- /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
|
+
};
|