@behavior-os/cli 0.0.0-stage → 2.2.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.
@@ -0,0 +1,37 @@
1
+ import type { Agent } from '@behavior-os/schemas';
2
+ export interface AgentRegistryResult {
3
+ /** Registry file that was read, or the first default candidate. */
4
+ path: string;
5
+ /** Whether the registry file exists. */
6
+ found: boolean;
7
+ /** Agents loaded via the facade from the SQLite store. */
8
+ agents: Agent[];
9
+ /** Read error, when the file exists but could not be opened. */
10
+ error: string | null;
11
+ }
12
+ /**
13
+ * Resolve the agent registry path.
14
+ *
15
+ * The documented SDK default is `./behavioros.db`; `.behavioros/behavioros.db`
16
+ * is also accepted for projects that keep all local state in `.behavioros/`.
17
+ * An explicit `--db` always wins, even when the file does not exist yet.
18
+ */
19
+ export declare function resolveAgentRegistryPath(directory: string, explicitPath?: string): {
20
+ path: string;
21
+ exists: boolean;
22
+ };
23
+ /**
24
+ * Read registered agents via the BehaviorOS facade instead of reaching into
25
+ * `SqliteStore` directly (Finding #11: CLI bypass of facade).
26
+ *
27
+ * Creates a BehaviorOS instance configured with the same SQLite path the
28
+ * plugin/MCP use, lets `hydrateFromStore` populate the in-memory agent map,
29
+ * then returns `listAgents()`. The store is properly closed afterwards to
30
+ * avoid file-handle leaks (especially on Windows).
31
+ *
32
+ * A missing registry is not an error: a project that never enabled persistence
33
+ * simply has no agents to list. An existing but unreadable/corrupt database is
34
+ * reported via the facade's `storeError` status field.
35
+ */
36
+ export declare function listRegisteredAgents(directory: string, explicitPath?: string): Promise<AgentRegistryResult>;
37
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,gEAAgE;IAChE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAWnC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC,CA+B9B"}
package/dist/agents.js ADDED
@@ -0,0 +1,66 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { BehaviorOS } from '@behavior-os/core';
4
+ /**
5
+ * Resolve the agent registry path.
6
+ *
7
+ * The documented SDK default is `./behavioros.db`; `.behavioros/behavioros.db`
8
+ * is also accepted for projects that keep all local state in `.behavioros/`.
9
+ * An explicit `--db` always wins, even when the file does not exist yet.
10
+ */
11
+ export function resolveAgentRegistryPath(directory, explicitPath) {
12
+ if (explicitPath)
13
+ return { path: explicitPath, exists: existsSync(explicitPath) };
14
+ const candidates = [
15
+ join(directory, 'behavioros.db'),
16
+ join(directory, '.behavioros', 'behavioros.db'),
17
+ ];
18
+ for (const candidate of candidates) {
19
+ if (existsSync(candidate))
20
+ return { path: candidate, exists: true };
21
+ }
22
+ return { path: candidates[0], exists: false };
23
+ }
24
+ /**
25
+ * Read registered agents via the BehaviorOS facade instead of reaching into
26
+ * `SqliteStore` directly (Finding #11: CLI bypass of facade).
27
+ *
28
+ * Creates a BehaviorOS instance configured with the same SQLite path the
29
+ * plugin/MCP use, lets `hydrateFromStore` populate the in-memory agent map,
30
+ * then returns `listAgents()`. The store is properly closed afterwards to
31
+ * avoid file-handle leaks (especially on Windows).
32
+ *
33
+ * A missing registry is not an error: a project that never enabled persistence
34
+ * simply has no agents to list. An existing but unreadable/corrupt database is
35
+ * reported via the facade's `storeError` status field.
36
+ */
37
+ export async function listRegisteredAgents(directory, explicitPath) {
38
+ const resolved = resolveAgentRegistryPath(directory, explicitPath);
39
+ if (!resolved.exists) {
40
+ return { path: resolved.path, found: false, agents: [], error: null };
41
+ }
42
+ const bos = new BehaviorOS({
43
+ persistence: { path: resolved.path },
44
+ });
45
+ try {
46
+ const status = bos.getStatus();
47
+ // If the store failed to initialise (corrupt DB, wrong format), surface
48
+ // the error instead of silently returning an empty registry.
49
+ if (status.store === false && status.storeError) {
50
+ return {
51
+ path: resolved.path,
52
+ found: true,
53
+ agents: [],
54
+ error: status.storeError,
55
+ };
56
+ }
57
+ // hydrateFromStore runs in the constructor when persistence is set;
58
+ // listAgents() now reflects what was persisted by any host.
59
+ return { path: resolved.path, found: true, agents: bos.listAgents(), error: null };
60
+ }
61
+ finally {
62
+ // Ensure the SQLite handle is released promptly (Windows file locking).
63
+ bos.closeStore();
64
+ }
65
+ }
66
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc/C;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAiB,EACjB,YAAqB;IAErB,IAAI,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;IAElF,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,eAAe,CAAC;KAChD,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,YAAqB;IAErB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC;QACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;KACrC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAE/B,wEAAwE;QACxE,6DAA6D;QAC7D,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAChD,OAAO;gBACL,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,MAAM,CAAC,UAAU;aACzB,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,4DAA4D;QAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACrF,CAAC;YAAS,CAAC;QACT,wEAAwE;QACxE,GAAG,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,716 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { BehaviorOS, DNALoader } from '@behavior-os/core';
6
+ import chalk from 'chalk';
7
+ import { Command } from 'commander';
8
+ import { listRegisteredAgents } from './agents.js';
9
+ import { runDriftCheck } from './drift.js';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ const program = new Command();
13
+ program
14
+ .name('behavioros')
15
+ .description('Behavior-OS CLI - Governance platform for AI agent teams')
16
+ .version('2.0.0');
17
+ /**
18
+ * Best-effort DNA loader shared by the commands that need governance to be
19
+ * active. Reads `BEHAVIOROS_DNA_PATH` first, then `<dir>/dnas/<pattern>.yaml`.
20
+ *
21
+ * Returns the DNA name that was actually loaded, or `null` when nothing was
22
+ * loaded. Callers must surface `null` instead of assuming governance ran — an
23
+ * unloaded DNA means every gate is skipped, not passed.
24
+ */
25
+ async function loadDnaForCommand(bos, dir, pattern) {
26
+ const candidates = [process.env.BEHAVIOROS_DNA_PATH, join(dir, 'dnas', `${pattern}.yaml`)].filter((candidate) => typeof candidate === 'string' && candidate.length > 0);
27
+ for (const candidate of candidates) {
28
+ if (!existsSync(candidate))
29
+ continue;
30
+ try {
31
+ const yaml = await import('js-yaml');
32
+ const fs = await import('node:fs/promises');
33
+ const dna = yaml.load(await fs.readFile(candidate, 'utf-8'));
34
+ await bos.loadDNA(dna);
35
+ return dna.name;
36
+ }
37
+ catch {
38
+ // Try the next candidate rather than claiming a DNA was loaded.
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ // INIT command
44
+ program
45
+ .command('init')
46
+ .description('Initialize a new Behavior-OS project')
47
+ .option('-d, --directory <path>', 'Target directory', '.')
48
+ .option('--dna <pattern>', 'Initial DNA pattern', 'enterprise-governance')
49
+ .action(async (options) => {
50
+ const dir = options.directory;
51
+ // Create directory structure
52
+ const dirs = ['dnas', 'src', 'tests', '.behavioros'];
53
+ for (const d of dirs) {
54
+ mkdirSync(join(dir, d), { recursive: true });
55
+ }
56
+ // Create .behavioros/state.json
57
+ const state = {
58
+ currentStep: 0,
59
+ selectedDna: options.dna,
60
+ activeMission: null,
61
+ stepHistory: [],
62
+ createdAt: new Date().toISOString(),
63
+ updatedAt: new Date().toISOString(),
64
+ };
65
+ writeFileSync(join(dir, '.behavioros', 'state.json'), JSON.stringify(state, null, 2));
66
+ // Create .mcp.json
67
+ const mcpConfig = {
68
+ mcpServers: {
69
+ behavioros: {
70
+ command: 'node',
71
+ args: [join(__dirname, '..', '..', 'mcp-server', 'dist', 'server.js')],
72
+ env: {
73
+ BEHAVIOROS_DNA_PATH: join(dir, 'dnas', `${options.dna}.yaml`),
74
+ },
75
+ },
76
+ },
77
+ };
78
+ writeFileSync(join(dir, '.mcp.json'), JSON.stringify(mcpConfig, null, 2));
79
+ // Create sample DNA
80
+ const sampleDNA = `name: ${options.dna}
81
+ version: "2.0.0"
82
+ description: "Behavior-OS DNA pattern"
83
+ personas:
84
+ - role: developer
85
+ name: Default Developer
86
+ authority: developer
87
+ skills: [code, test, review]
88
+ governance:
89
+ - id: default-rule
90
+ level: medium
91
+ action: warn
92
+ conditions:
93
+ - type: default
94
+ value: true
95
+ quality:
96
+ - id: coverage
97
+ type: test_coverage
98
+ threshold: 80
99
+ `;
100
+ writeFileSync(join(dir, 'dnas', `${options.dna}.yaml`), sampleDNA);
101
+ console.log(chalk.green(`✓ Behavior-OS project initialized in ${dir}`));
102
+ console.log(chalk.gray(` DNA pattern: ${options.dna}`));
103
+ console.log(chalk.gray(` Config files created:`));
104
+ console.log(chalk.gray(` - .behavioros/state.json`));
105
+ console.log(chalk.gray(` - .mcp.json`));
106
+ console.log(chalk.gray(` - dnas/${options.dna}.yaml`));
107
+ });
108
+ // COMPILE command
109
+ program
110
+ .command('compile')
111
+ .description('Parse and validate every DNA pattern in dnas/')
112
+ .option('-d, --directory <path>', 'Project directory', '.')
113
+ .action(async (options) => {
114
+ const dir = options.directory;
115
+ const dnasDir = join(dir, 'dnas');
116
+ if (!existsSync(dnasDir)) {
117
+ console.error(chalk.red('Error: dnas/ directory not found'));
118
+ process.exit(1);
119
+ }
120
+ const fileSystem = await import('node:fs/promises');
121
+ const files = (await fileSystem.readdir(dnasDir))
122
+ .filter((file) => file.endsWith('.yaml') || file.endsWith('.yml'))
123
+ .sort();
124
+ console.log(chalk.blue(`Compiling ${files.length} DNA pattern(s) from dnas/...`));
125
+ const loader = new DNALoader();
126
+ const yaml = await import('js-yaml');
127
+ let failed = 0;
128
+ for (const file of files) {
129
+ try {
130
+ // Validated against the full DNASchema, not a substring check.
131
+ loader.load(yaml.load(readFileSync(join(dnasDir, file), 'utf-8')));
132
+ console.log(chalk.green(` ✓ ${file}`));
133
+ }
134
+ catch (error) {
135
+ failed += 1;
136
+ console.log(chalk.red(` ✗ ${file} — ${error instanceof Error ? error.message : error}`));
137
+ }
138
+ }
139
+ if (failed > 0) {
140
+ console.log(chalk.red(`\n✗ ${failed} of ${files.length} pattern(s) failed validation.`));
141
+ process.exit(1);
142
+ }
143
+ console.log(chalk.green(`\n✓ ${files.length} pattern(s) compiled and validated.`));
144
+ });
145
+ // VALIDATE command
146
+ program
147
+ .command('validate')
148
+ .description('Validate the project layout and every DNA pattern in dnas/')
149
+ .option('-d, --directory <path>', 'Project directory', '.')
150
+ .action(async (options) => {
151
+ const dir = options.directory;
152
+ console.log(chalk.blue('Validating Behavior-OS project...'));
153
+ // Check for required files
154
+ const checks = [
155
+ { file: '.behavioros/state.json', required: true },
156
+ { file: '.mcp.json', required: false },
157
+ { file: 'dnas', required: true },
158
+ ];
159
+ let allPassed = true;
160
+ for (const check of checks) {
161
+ const exists = existsSync(join(dir, check.file));
162
+ if (exists) {
163
+ console.log(chalk.green(` ✓ ${check.file}`));
164
+ }
165
+ else if (check.required) {
166
+ console.log(chalk.red(` ✗ ${check.file} - missing`));
167
+ allPassed = false;
168
+ }
169
+ else {
170
+ console.log(chalk.gray(` ○ ${check.file} - optional, not present`));
171
+ }
172
+ }
173
+ // Validate every DNA pattern against the schema (the engine's own loader).
174
+ const dnasDir = join(dir, 'dnas');
175
+ if (existsSync(dnasDir)) {
176
+ const fileSystem = await import('node:fs/promises');
177
+ const files = (await fileSystem.readdir(dnasDir))
178
+ .filter((file) => file.endsWith('.yaml') || file.endsWith('.yml'))
179
+ .sort();
180
+ const loader = new DNALoader();
181
+ const yaml = await import('js-yaml');
182
+ let invalid = 0;
183
+ for (const file of files) {
184
+ try {
185
+ loader.load(yaml.load(readFileSync(join(dnasDir, file), 'utf-8')));
186
+ }
187
+ catch (error) {
188
+ invalid += 1;
189
+ console.log(chalk.red(` ✗ dnas/${file} — ${error instanceof Error ? error.message : error}`));
190
+ }
191
+ }
192
+ if (invalid > 0) {
193
+ allPassed = false;
194
+ }
195
+ else {
196
+ console.log(chalk.green(` ✓ dnas/ — ${files.length} pattern(s) valid`));
197
+ }
198
+ }
199
+ if (allPassed) {
200
+ console.log(chalk.green('\n✓ Validation passed!'));
201
+ }
202
+ else {
203
+ console.log(chalk.red('\n✗ Validation failed. Please fix the issues above.'));
204
+ process.exit(1);
205
+ }
206
+ });
207
+ // STATUS command
208
+ program
209
+ .command('status')
210
+ .description('Show engine status plus the local .behavioros/state.json')
211
+ .option('-d, --directory <path>', 'Project directory', '.')
212
+ .option('--dna <pattern>', 'DNA pattern to load', 'enterprise-governance')
213
+ .action(async (options) => {
214
+ const dir = options.directory;
215
+ const bos = new BehaviorOS();
216
+ const loaded = await loadDnaForCommand(bos, dir, options.dna);
217
+ const status = bos.getStatus();
218
+ console.log(chalk.blue('Behavior-OS Status'));
219
+ console.log(chalk.gray('='.repeat(40)));
220
+ console.log(` DNA loaded: ${loaded ?? 'none'}`);
221
+ console.log(` Governance: ${status.config.governance}`);
222
+ console.log(` Missions: ${status.missions}`);
223
+ console.log(` Agents: ${status.agents}`);
224
+ // Load state
225
+ let state = null;
226
+ const statePath = join(dir, '.behavioros', 'state.json');
227
+ if (existsSync(statePath)) {
228
+ state = JSON.parse(readFileSync(statePath, 'utf-8'));
229
+ }
230
+ if (state) {
231
+ console.log(chalk.cyan(` State file: .behavioros/state.json (updated ${state.updatedAt})`));
232
+ console.log(chalk.cyan(` DNA Pattern: ${state.selectedDna || 'Not selected'}`));
233
+ console.log(chalk.cyan(` Current Step: ${state.currentStep}/7`));
234
+ console.log(chalk.cyan(` Active Mission: ${state.activeMission || 'None'}`));
235
+ }
236
+ else {
237
+ console.log(chalk.yellow(' No .behavioros/state.json (create one with: behavioros init).'));
238
+ }
239
+ // Check MCP config
240
+ const mcpPath = join(dir, '.mcp.json');
241
+ if (existsSync(mcpPath)) {
242
+ console.log(chalk.green(' ✓ .mcp.json present (this command does not start the server)'));
243
+ }
244
+ else {
245
+ console.log(chalk.gray(' ○ .mcp.json not found'));
246
+ }
247
+ });
248
+ // DIFF command
249
+ program
250
+ .command('diff')
251
+ .description('Compare dnas/*.yaml with .behavioros/baseline.json')
252
+ .option('-d, --directory <path>', 'Project directory', '.')
253
+ .action(async (options) => {
254
+ const dir = options.directory;
255
+ const dnasDir = join(dir, 'dnas');
256
+ const baselinePath = join(dir, '.behavioros', 'baseline.json');
257
+ console.log(chalk.blue('Checking for behavioral drift...'));
258
+ if (!existsSync(dnasDir)) {
259
+ console.log(chalk.yellow(' No dnas/ directory found.'));
260
+ return;
261
+ }
262
+ // Load current DNA files
263
+ const yaml = await import('js-yaml');
264
+ const fs = await import('node:fs/promises');
265
+ const currentDNAs = {};
266
+ try {
267
+ const files = await fs.readdir(dnasDir);
268
+ for (const file of files) {
269
+ if (file.endsWith('.yaml') || file.endsWith('.yml')) {
270
+ const content = await fs.readFile(join(dnasDir, file), 'utf-8');
271
+ const name = file.replace(/\.(yaml|yml)$/, '');
272
+ currentDNAs[name] = yaml.load(content);
273
+ }
274
+ }
275
+ }
276
+ catch {
277
+ console.log(chalk.yellow(' Could not read dnas/ directory.'));
278
+ return;
279
+ }
280
+ // Load baseline
281
+ let baseline = {};
282
+ if (existsSync(baselinePath)) {
283
+ try {
284
+ baseline = JSON.parse(readFileSync(baselinePath, 'utf-8'));
285
+ }
286
+ catch {
287
+ console.log(chalk.yellow(' Invalid baseline file, skipping comparison.'));
288
+ return;
289
+ }
290
+ }
291
+ if (Object.keys(baseline).length === 0) {
292
+ console.log(chalk.green(' No baseline found. Current DNA state will be used as baseline.'));
293
+ await fs.writeFile(baselinePath, JSON.stringify(currentDNAs, null, 2));
294
+ return;
295
+ }
296
+ let driftDetected = false;
297
+ for (const [name, current] of Object.entries(currentDNAs)) {
298
+ const base = baseline[name];
299
+ if (!base) {
300
+ console.log(chalk.red(` ✗ New DNA pattern detected: ${name}`));
301
+ driftDetected = true;
302
+ continue;
303
+ }
304
+ const currentStr = JSON.stringify(current);
305
+ const baseStr = JSON.stringify(base);
306
+ if (currentStr !== baseStr) {
307
+ console.log(chalk.yellow(` ⚠ Drift detected in ${name}`));
308
+ driftDetected = true;
309
+ }
310
+ }
311
+ if (!driftDetected) {
312
+ console.log(chalk.green(' No drift detected. All DNA patterns match baseline.'));
313
+ }
314
+ });
315
+ // SIMULATE command
316
+ program
317
+ .command('simulate')
318
+ .description('Evaluate one action against the loaded DNA rules')
319
+ .option('-d, --directory <path>', 'Project directory', '.')
320
+ .option('--action <action>', 'Action to simulate', 'deploy')
321
+ .option('--agent <agent>', 'Agent ID', 'test-agent')
322
+ .option('--dna <pattern>', 'DNA pattern to load', 'enterprise-governance')
323
+ .action(async (options) => {
324
+ const bos = new BehaviorOS();
325
+ const loaded = await loadDnaForCommand(bos, options.directory, options.dna);
326
+ console.log(chalk.blue(`Simulating: ${options.action}`));
327
+ console.log(chalk.gray(`Agent: ${options.agent}`));
328
+ if (!loaded) {
329
+ console.log(chalk.yellow(` ⚠ No DNA loaded (looked for dnas/${options.dna}.yaml)`));
330
+ console.log(chalk.yellow(' Without a DNA there are no rules to evaluate.'));
331
+ return;
332
+ }
333
+ const decision = bos.evaluateGovernance(options.action, {
334
+ agent: options.agent,
335
+ context: { action: options.action },
336
+ });
337
+ console.log(chalk.gray(`DNA: ${loaded}`));
338
+ console.log(chalk.green(`Verdict: ${decision.verdict}`));
339
+ console.log(chalk.gray(`Reason: ${decision.reason}`));
340
+ });
341
+ // DEPLOY command
342
+ program
343
+ .command('deploy')
344
+ .description('Print the deployment gate plan (does not execute the gates)')
345
+ .option('-d, --directory <path>', 'Project directory', '.')
346
+ .option('--mission-id <id>', 'Mission ID to deploy')
347
+ .option('--dna <pattern>', 'DNA pattern to load', 'enterprise-governance')
348
+ .action(async (options) => {
349
+ const bos = new BehaviorOS();
350
+ const loaded = await loadDnaForCommand(bos, options.directory, options.dna);
351
+ console.log(chalk.blue('Deployment gate plan'));
352
+ console.log(chalk.gray('This command prints the plan; it does not run quality gates.'));
353
+ if (options.missionId)
354
+ console.log(chalk.gray(` Mission: ${options.missionId}`));
355
+ if (!loaded) {
356
+ console.log(chalk.yellow(` ⚠ No DNA loaded (looked for dnas/${options.dna}.yaml)`));
357
+ console.log(chalk.gray(' Quality gates are declared by the DNA: pass --dna or set BEHAVIOROS_DNA_PATH.'));
358
+ }
359
+ else {
360
+ console.log(chalk.gray(` DNA: ${loaded}`));
361
+ }
362
+ const gates = bos.getPipelineEngine().getGates();
363
+ if (gates.length === 0) {
364
+ console.log(chalk.gray(' (pipeline disabled or DNA declares no quality gates)'));
365
+ }
366
+ else {
367
+ for (const gate of gates) {
368
+ console.log(` ${gate.phase.padEnd(4)} ${gate.id}${gate.blocking ? '' : ' (non-blocking)'}`);
369
+ }
370
+ }
371
+ // The `governance` pre gate is the one gate that can run here for real: it
372
+ // evaluates the `deploy` action against the loaded DNA and vetoes on `deny`.
373
+ const identity = bos.resolveAgentIdentity();
374
+ const preflight = bos.preflightAction('deploy', { agent: identity.agentId });
375
+ if (preflight.allowed) {
376
+ console.log(chalk.green(`\n Pre-flight (governance): allowed — agent ${identity.agentId}`));
377
+ }
378
+ else {
379
+ console.log(chalk.red(`\n Pre-flight (governance): blocked by ${preflight.blockedBy ?? 'a gate'}`));
380
+ process.exitCode = 1;
381
+ }
382
+ console.log(chalk.gray('\n Run the real checks with: pnpm lint:check && pnpm typecheck && pnpm test'));
383
+ });
384
+ // ECOSYSTEM command
385
+ program
386
+ .command('ecosystem')
387
+ .description('Report what can be read from the project on disk')
388
+ .option('-d, --directory <path>', 'Project directory', '.')
389
+ .action(async (options) => {
390
+ const dir = options.directory;
391
+ const dnasDir = join(dir, 'dnas');
392
+ let dnaNames = [];
393
+ if (existsSync(dnasDir)) {
394
+ try {
395
+ const files = await import('node:fs/promises');
396
+ const entries = await files.readdir(dnasDir);
397
+ dnaNames = entries
398
+ .filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))
399
+ .map((f) => f.replace(/\.(yaml|yml)$/, ''))
400
+ .sort();
401
+ }
402
+ catch {
403
+ // directory may not exist
404
+ }
405
+ }
406
+ console.log(chalk.blue('Behavior-OS ecosystem'));
407
+ console.log(chalk.gray('='.repeat(40)));
408
+ console.log(` DNA patterns: ${dnaNames.length}`);
409
+ for (const name of dnaNames)
410
+ console.log(chalk.gray(` - ${name}`));
411
+ console.log(' Verdicts: allow | deny | escalate | transform');
412
+ console.log(chalk.gray(' Gate plan: behavioros deploy --dna <pattern>'));
413
+ console.log(chalk.gray(' Engine/tool inventory: docs/CLAIMS.md'));
414
+ });
415
+ // AGENT command
416
+ program
417
+ .command('agent')
418
+ .description('Show the local state summary and agents from the SQLite registry')
419
+ .option('-d, --directory <path>', 'Project directory', '.')
420
+ .option('--db <path>', 'Agent registry SQLite path (default: <dir>/behavioros.db or <dir>/.behavioros/behavioros.db)')
421
+ .action(async (options) => {
422
+ const dir = options.directory;
423
+ const statePath = join(dir, '.behavioros', 'state.json');
424
+ console.log(chalk.blue('Behavior-OS Agents'));
425
+ console.log(chalk.gray('='.repeat(40)));
426
+ if (existsSync(statePath)) {
427
+ try {
428
+ const state = JSON.parse(readFileSync(statePath, 'utf-8'));
429
+ console.log(chalk.cyan(` DNA Pattern: ${state.selectedDna || 'Not selected'}`));
430
+ console.log(chalk.cyan(` Active Mission: ${state.activeMission || 'None'}`));
431
+ console.log(chalk.cyan(` Current Step: ${state.currentStep}/7`));
432
+ if (state.stepHistory?.length) {
433
+ console.log(chalk.gray(` Steps completed: ${state.stepHistory.length}`));
434
+ }
435
+ }
436
+ catch {
437
+ console.log(chalk.yellow(' Invalid state file.'));
438
+ }
439
+ }
440
+ else {
441
+ console.log(chalk.yellow(' No .behavioros/state.json found (create one with: behavioros init).'));
442
+ }
443
+ const registry = await listRegisteredAgents(dir, options.db);
444
+ console.log(chalk.cyan(`\n Agent registry: ${registry.path}`));
445
+ if (!registry.found) {
446
+ console.log(chalk.yellow(' No agent registry found.'));
447
+ console.log(chalk.gray(' Register agents with the SDK and persistence enabled:'));
448
+ console.log(chalk.gray(" const bos = new BehaviorOS({ persistence: { path: 'behavioros.db' } });"));
449
+ console.log(chalk.gray(" bos.registerAgent({ id: 'agent-1', name: 'DevBot', type: 'developer', ... });"));
450
+ return;
451
+ }
452
+ if (registry.error) {
453
+ console.log(chalk.red(` Could not read the registry: ${registry.error}`));
454
+ process.exitCode = 1;
455
+ return;
456
+ }
457
+ if (registry.agents.length === 0) {
458
+ console.log(chalk.yellow(' Registry is empty.'));
459
+ return;
460
+ }
461
+ console.log(chalk.green(` ${registry.agents.length} registered agent(s):`));
462
+ for (const agent of registry.agents) {
463
+ console.log(chalk.gray(` ${agent.id} ${agent.name} [${agent.type}/${agent.status}] DNA=${agent.dnaPattern} mission=${agent.currentMission ?? 'none'}`));
464
+ }
465
+ });
466
+ // AUTONOMOUS command
467
+ program
468
+ .command('autonomous')
469
+ .description('Dry-run the 7-step protocol on a task (no work is executed; audit is simulated)')
470
+ .option('-d, --directory <path>', 'Project directory', '.')
471
+ .option('-t, --task <task>', 'Task description')
472
+ .option('--dna <pattern>', 'DNA pattern to use', 'enterprise-governance')
473
+ .option('--priority <level>', 'Mission priority', 'medium')
474
+ .action(async (options) => {
475
+ if (!options.task) {
476
+ console.error(chalk.red('Error: --task is required'));
477
+ process.exit(1);
478
+ }
479
+ const dir = options.directory;
480
+ const bos = new BehaviorOS();
481
+ console.log(chalk.blue(`Protocol dry run: ${options.task}`));
482
+ console.log(chalk.gray('No work is executed. The audit below is simulated (simulate: true).'));
483
+ console.log(chalk.gray('='.repeat(40)));
484
+ // Protocol step 1 — select DNA.
485
+ console.log(chalk.cyan('\n[Step 1/7] Select DNA'));
486
+ const loaded = await loadDnaForCommand(bos, dir, options.dna);
487
+ if (loaded) {
488
+ console.log(chalk.green(` ✓ Loaded DNA: ${loaded}`));
489
+ }
490
+ else {
491
+ console.log(chalk.yellow(` ⚠ No DNA loaded (looked for dnas/${options.dna}.yaml)`));
492
+ console.log(chalk.yellow(' Governance rules are unavailable without a DNA.'));
493
+ }
494
+ console.log(chalk.gray(' (steps 2–3 run interactively: bos_list_dna / bos_get_state)'));
495
+ // Pre-flight is not a protocol step: it is the real governance check.
496
+ const identity = bos.resolveAgentIdentity();
497
+ let verdict = null;
498
+ if (loaded) {
499
+ const decision = bos.evaluateGovernance('execute_task', {
500
+ agent: identity.agentId,
501
+ context: { task: options.task },
502
+ });
503
+ verdict = decision.verdict;
504
+ console.log(chalk[decision.verdict === 'deny' ? 'red' : 'green'](` Pre-flight (governance): ${decision.verdict.toUpperCase()} — ${decision.reason}`));
505
+ }
506
+ else {
507
+ console.log(chalk.yellow(' Pre-flight (governance): skipped — no DNA loaded'));
508
+ }
509
+ // Protocol step 4 — create mission. requiredChecks mirrors the plugin's
510
+ // auto-mission: governance + audit must pass before completion is accepted.
511
+ console.log(chalk.cyan('\n[Step 4/7] Create mission'));
512
+ const mission = bos.createMission({
513
+ title: options.task,
514
+ type: 'feature',
515
+ priority: options.priority,
516
+ requiredChecks: ['governance', 'audit'],
517
+ });
518
+ console.log(chalk.green(` ✓ Mission created: ${mission.id}`));
519
+ // Protocol step 5 — start mission.
520
+ console.log(chalk.cyan('\n[Step 5/7] Start mission'));
521
+ bos.startMission(mission.id);
522
+ console.log(chalk.green(' ✓ Mission started'));
523
+ // Protocol step 6 — run audit (simulated).
524
+ console.log(chalk.cyan('\n[Step 6/7] Run audit (simulated)'));
525
+ const report = await bos.runAudit({
526
+ missionId: mission.id,
527
+ agentId: identity.agentId,
528
+ simulate: true,
529
+ });
530
+ console.log(chalk[report.overall === 'pass' ? 'green' : 'yellow'](` Audit: ${report.overall.toUpperCase()} (${report.summary})`));
531
+ // Protocol step 7 — record learning.
532
+ console.log(chalk.cyan('\n[Step 7/7] Record learning'));
533
+ const event = bos.recordLearning({
534
+ type: 'insight',
535
+ source: 'autonomous-dry-run',
536
+ content: `Dry run of task: ${options.task}`,
537
+ impact: verdict === 'deny' ? 'high' : 'medium',
538
+ relatedMission: mission.id,
539
+ });
540
+ console.log(chalk.green(` ✓ Learning recorded: ${event.id}`));
541
+ // Close the mission created by the dry run. Since the audit was simulated
542
+ // (no real verification), the mission cannot be "completed" — it gets
543
+ // cancelled to close the lifecycle. This fixes the CLI lifecycle gap where
544
+ // autonomous created missions it could never close.
545
+ bos.cancelMission(mission.id);
546
+ const closed = bos.getMission(mission.id);
547
+ console.log(chalk.gray(` Mission ${mission.id} closed (status: ${closed?.status ?? 'unknown'})`));
548
+ const statePath = join(dir, '.behavioros', 'state.json');
549
+ if (existsSync(statePath)) {
550
+ const state = JSON.parse(readFileSync(statePath, 'utf-8'));
551
+ state.stepHistory = [
552
+ ...(state.stepHistory || []),
553
+ { step: 7, timestamp: new Date().toISOString(), missionId: mission.id },
554
+ ];
555
+ state.updatedAt = new Date().toISOString();
556
+ writeFileSync(statePath, JSON.stringify(state, null, 2));
557
+ console.log(chalk.gray(' (state.json updated — not a protocol step)'));
558
+ }
559
+ console.log(chalk.green('\n✅ Protocol dry run completed — no work was executed.'));
560
+ console.log(chalk.gray(` Mission: ${mission.id}`));
561
+ console.log(chalk.gray(` Governance: ${verdict ?? 'skipped (no DNA)'}`));
562
+ console.log(chalk.gray(` Audit: ${report.overall} (simulated)`));
563
+ });
564
+ // PROTOCOL command
565
+ program
566
+ .command('protocol')
567
+ .description('Check the 7-step protocol against the local state file')
568
+ .option('-d, --directory <path>', 'Project directory', '.')
569
+ .action(async (options) => {
570
+ const dir = options.directory;
571
+ const statePath = join(dir, '.behavioros', 'state.json');
572
+ if (!existsSync(statePath)) {
573
+ console.log(chalk.yellow("No protocol state found. Run 'behavioros init' first."));
574
+ return;
575
+ }
576
+ const state = JSON.parse(readFileSync(statePath, 'utf-8'));
577
+ // Mirrors PROTOCOL_TOOL_STEPS in @behavior-os/core (engine/behavior-os.ts).
578
+ const steps = [
579
+ { num: 1, name: 'Select DNA', tool: 'bos_select_dna' },
580
+ { num: 2, name: 'Confirm DNA rules', tool: 'bos_list_dna' },
581
+ { num: 3, name: 'Resolve state', tool: 'bos_get_state' },
582
+ { num: 4, name: 'Create mission', tool: 'bos_create_mission' },
583
+ { num: 5, name: 'Start mission', tool: 'bos_start_mission' },
584
+ { num: 6, name: 'Run audit', tool: 'bos_run_audit' },
585
+ { num: 7, name: 'Record learning', tool: 'bos_record_learning' },
586
+ ];
587
+ console.log(chalk.blue('Protocol Compliance Check'));
588
+ console.log(chalk.gray('='.repeat(40)));
589
+ for (const step of steps) {
590
+ const completed = state.stepHistory?.some((h) => h.step === step.num);
591
+ const icon = completed ? chalk.green('✓') : chalk.yellow('○');
592
+ console.log(`${icon} Step ${step.num}: ${step.name} (${step.tool})`);
593
+ }
594
+ console.log(chalk.gray('\nThis reads .behavioros/state.json (written by `behavioros init`/`autonomous`).'));
595
+ console.log(chalk.gray('Live protocol state lives in the host: the plugin stores it via ctx.storage.'));
596
+ });
597
+ // DRIFT-CHECK command
598
+ program
599
+ .command('drift-check')
600
+ .description('Compare dnas/*.yaml with .behavioros/baseline.json using DriftEngine')
601
+ .option('-d, --directory <path>', 'Project directory', '.')
602
+ .action(async (options) => {
603
+ const dir = options.directory;
604
+ console.log(chalk.blue('Checking for behavioral drift...'));
605
+ let report;
606
+ try {
607
+ report = await runDriftCheck(dir);
608
+ }
609
+ catch (error) {
610
+ console.log(chalk.red(` Error comparing DNA snapshots: ${error instanceof Error ? error.message : error}`));
611
+ process.exitCode = 1;
612
+ return;
613
+ }
614
+ if (!report.baselineFound) {
615
+ console.log(chalk.yellow(' No baseline found. Create one with: behavioros diff'));
616
+ return;
617
+ }
618
+ if (report.findings.length === 0 && report.stateDrifts.length === 0) {
619
+ if (!report.dnasFound && report.compared === 0 && report.stateDrifts.length === 0) {
620
+ console.log(chalk.yellow(' No dnas/ directory found.'));
621
+ return;
622
+ }
623
+ if (!report.stateFound && report.compared === 0) {
624
+ console.log(chalk.yellow(" No current state found. Run 'behavioros init' first."));
625
+ return;
626
+ }
627
+ console.log(chalk.green(` No drift detected. ${report.compared} DNA pattern(s) match the baseline.`));
628
+ return;
629
+ }
630
+ if (report.compared > 0) {
631
+ console.log(chalk.gray(` Compared ${report.compared} DNA pattern(s) against the baseline.`));
632
+ }
633
+ for (const finding of report.findings) {
634
+ const message = finding.kind === 'changed'
635
+ ? `Drift in ${finding.pattern}: ${finding.summary.replace(/^Drift detected: /, '')}`
636
+ : finding.summary;
637
+ console.log(chalk.yellow(` ⚠ ${message}`));
638
+ }
639
+ for (const drift of report.stateDrifts) {
640
+ console.log(chalk.yellow(` ⚠ ${drift}`));
641
+ }
642
+ console.log(chalk.red(`\n Drift detected: ${report.findings.length + report.stateDrifts.length} change(s).`));
643
+ process.exitCode = 1;
644
+ });
645
+ // METRICS command
646
+ program
647
+ .command('metrics')
648
+ .description('Display governance metrics from the Behavior-OS engine')
649
+ .option('-d, --directory <path>', 'Project directory', '.')
650
+ .option('-j, --json', 'Output as JSON instead of formatted table')
651
+ .option('-r, --reset', 'Reset all metrics before reporting')
652
+ .action(async (options) => {
653
+ const dir = options.directory;
654
+ const pattern = process.env.BEHAVIOROS_DNA || 'surgical-team';
655
+ const bos = new BehaviorOS();
656
+ const loaded = await loadDnaForCommand(bos, dir, pattern);
657
+ if (options.reset) {
658
+ bos.resetMetrics();
659
+ console.log(chalk.gray(' ✓ Metrics reset'));
660
+ }
661
+ const metrics = bos.getMetrics();
662
+ if (options.json) {
663
+ console.log(JSON.stringify(metrics, null, 2));
664
+ return;
665
+ }
666
+ console.log(chalk.blue('Behavior-OS Governance Metrics'));
667
+ console.log(chalk.gray('='.repeat(40)));
668
+ console.log(chalk.gray(`DNA: ${loaded ?? 'none'}`));
669
+ console.log(chalk.gray(`Timestamp: ${metrics.timestamp}`));
670
+ console.log(chalk.gray(`Uptime: ${Math.round(metrics.uptimeMs / 1000)}s`));
671
+ // Governance overview
672
+ const gov = metrics.governance;
673
+ const total = gov.totalActions;
674
+ const denyPct = total > 0 ? ((gov.denied / total) * 100).toFixed(1) : '0.0';
675
+ console.log(chalk.yellow('\nGovernance:'));
676
+ console.log(` Total actions: ${total}`);
677
+ console.log(` Allowed: ${gov.allowed}`);
678
+ console.log(` Denied: ${gov.denied} (${denyPct}%)`);
679
+ console.log(` Escalated: ${gov.escalated}`);
680
+ console.log(` Warned: ${gov.warned}`);
681
+ console.log(` Avg rules/action: ${gov.avgRulesPerAction.toFixed(1)}`);
682
+ if (gov.topRules.length > 0) {
683
+ console.log(chalk.yellow('\nTop firing rules:'));
684
+ for (const rule of gov.topRules) {
685
+ console.log(` ${rule.id.padEnd(30)} ${rule.count}× (${rule.action})`);
686
+ }
687
+ }
688
+ if (gov.latencySamples && gov.latencySamples.length > 0) {
689
+ const sorted = [...gov.latencySamples].sort((a, b) => a - b);
690
+ const p50 = sorted[Math.floor(sorted.length * 0.5)];
691
+ const p95 = sorted[Math.floor(sorted.length * 0.95)];
692
+ console.log(chalk.yellow('\nLatency (ms):'));
693
+ console.log(` p50: ${p50}`);
694
+ console.log(` p95: ${p95}`);
695
+ }
696
+ // Learning summary
697
+ console.log(chalk.yellow('\nLearning:'));
698
+ console.log(` Events total: ${metrics.learningEventsTotal}`);
699
+ const byType = Object.entries(metrics.learningEventsByType).sort((a, b) => b[1] - a[1]);
700
+ for (const [type, count] of byType.slice(0, 5)) {
701
+ console.log(` ${type}: ${count}`);
702
+ }
703
+ // Consensus/prediction (if any)
704
+ if (metrics.consensus.totalRounds > 0) {
705
+ console.log(chalk.yellow('\nConsensus:'));
706
+ console.log(` Rounds: ${metrics.consensus.totalRounds}`);
707
+ console.log(` Approved: ${metrics.consensus.approved}`);
708
+ console.log(` Rejected: ${metrics.consensus.rejected}`);
709
+ }
710
+ if (metrics.prediction.totalPredictions > 0) {
711
+ console.log(chalk.yellow('\nPredictions:'));
712
+ console.log(` Total: ${metrics.prediction.totalPredictions}`);
713
+ }
714
+ });
715
+ program.parse();
716
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { DNA } from '@behavior-os/schemas';
2
+ /**
3
+ * A baseline written by `diff` maps a file stem to a parsed DNA document.
4
+ * Requiring at least one DNA collection keeps a malformed baseline from being
5
+ * silently compared as if it were a DNA map.
6
+ */
7
+ export declare function isDnaSnapshot(value: unknown): value is DNA;
8
+ /** Legacy baselines only carried the two state fields. */
9
+ export declare function isLegacyStateBaseline(value: unknown): value is {
10
+ selectedDna?: unknown;
11
+ currentStep?: unknown;
12
+ };
13
+ /** Load every `dnas/*.yaml|yml` document, keyed by file stem. */
14
+ export declare function loadDnaDirectory(dnasDir: string): Promise<Record<string, DNA>>;
15
+ export type DriftFindingKind = 'new' | 'removed' | 'changed';
16
+ export interface DriftFinding {
17
+ pattern: string;
18
+ kind: DriftFindingKind;
19
+ summary: string;
20
+ totalChanges: number;
21
+ significant: boolean;
22
+ }
23
+ export interface DriftComparison {
24
+ compared: number;
25
+ findings: DriftFinding[];
26
+ hasDrift: boolean;
27
+ }
28
+ /**
29
+ * Compare current DNA snapshots with a baseline using the facade's
30
+ * `compareDNADrift` (which delegates to `DriftEngine.compare`).
31
+ *
32
+ * Finding #11 fix: previously this function instantiated `new DriftEngine()`
33
+ * directly, bypassing the BehaviorOS facade. Now it creates a BehaviorOS
34
+ * instance with the default (no-persistence) mode so the comparison goes
35
+ * through the same engine resolution path as every other host.
36
+ *
37
+ * `DriftEngine` is the source of truth for governance-rule and quality-gate
38
+ * drift; this wrapper only adds the repository-level cases the engine cannot
39
+ * see (a pattern added or removed since the baseline).
40
+ */
41
+ export declare function compareDnaSnapshots(current: Record<string, DNA>, baseline: Record<string, DNA>): DriftComparison;
42
+ /** Compare the legacy state baseline fields, if present. */
43
+ export declare function compareStateToBaseline(state: unknown, baseline: unknown): string[];
44
+ export interface DriftCheckReport {
45
+ baselineFound: boolean;
46
+ dnasFound: boolean;
47
+ stateFound: boolean;
48
+ compared: number;
49
+ findings: DriftFinding[];
50
+ stateDrifts: string[];
51
+ hasDrift: boolean;
52
+ }
53
+ /**
54
+ * Run a drift check against a project directory.
55
+ *
56
+ * A baseline from `diff` is a DNA snapshot map. Older/state-only baselines are
57
+ * still accepted so existing projects keep working. Invalid JSON or a
58
+ * malformed DNA entry throws; the CLI turns that into exit code 1 instead of
59
+ * pretending the check passed.
60
+ */
61
+ export declare function runDriftCheck(directory: string): Promise<DriftCheckReport>;
62
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAOhD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAQ1D;AAED,0DAA0D;AAC1D,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAE3D;AAED,iEAAiE;AACjE,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAepF;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,eAAe,CA4CjB;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAelF;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsEhF"}
package/dist/drift.js ADDED
@@ -0,0 +1,180 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { readdir, readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { BehaviorOS } from '@behavior-os/core';
5
+ import { load } from 'js-yaml';
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ }
9
+ /**
10
+ * A baseline written by `diff` maps a file stem to a parsed DNA document.
11
+ * Requiring at least one DNA collection keeps a malformed baseline from being
12
+ * silently compared as if it were a DNA map.
13
+ */
14
+ export function isDnaSnapshot(value) {
15
+ return (isRecord(value) &&
16
+ typeof value.name === 'string' &&
17
+ (Array.isArray(value.personas) ||
18
+ Array.isArray(value.governance) ||
19
+ Array.isArray(value.quality)));
20
+ }
21
+ /** Legacy baselines only carried the two state fields. */
22
+ export function isLegacyStateBaseline(value) {
23
+ return isRecord(value) && ('selectedDna' in value || 'currentStep' in value);
24
+ }
25
+ /** Load every `dnas/*.yaml|yml` document, keyed by file stem. */
26
+ export async function loadDnaDirectory(dnasDir) {
27
+ const files = await readdir(dnasDir);
28
+ const snapshots = {};
29
+ for (const file of files) {
30
+ if (!file.endsWith('.yaml') && !file.endsWith('.yml'))
31
+ continue;
32
+ const content = await readFile(join(dnasDir, file), 'utf8');
33
+ const parsed = load(content);
34
+ if (!isDnaSnapshot(parsed)) {
35
+ throw new Error(`${file}: parsed document is not a DNA snapshot`);
36
+ }
37
+ snapshots[file.replace(/\.(yaml|yml)$/, '')] = parsed;
38
+ }
39
+ return snapshots;
40
+ }
41
+ /**
42
+ * Compare current DNA snapshots with a baseline using the facade's
43
+ * `compareDNADrift` (which delegates to `DriftEngine.compare`).
44
+ *
45
+ * Finding #11 fix: previously this function instantiated `new DriftEngine()`
46
+ * directly, bypassing the BehaviorOS facade. Now it creates a BehaviorOS
47
+ * instance with the default (no-persistence) mode so the comparison goes
48
+ * through the same engine resolution path as every other host.
49
+ *
50
+ * `DriftEngine` is the source of truth for governance-rule and quality-gate
51
+ * drift; this wrapper only adds the repository-level cases the engine cannot
52
+ * see (a pattern added or removed since the baseline).
53
+ */
54
+ export function compareDnaSnapshots(current, baseline) {
55
+ const bos = new BehaviorOS();
56
+ const findings = [];
57
+ let compared = 0;
58
+ for (const [pattern, dna] of Object.entries(current)) {
59
+ const previous = baseline[pattern];
60
+ if (!previous) {
61
+ findings.push({
62
+ pattern,
63
+ kind: 'new',
64
+ summary: `New DNA pattern: ${pattern}`,
65
+ totalChanges: 0,
66
+ significant: true,
67
+ });
68
+ continue;
69
+ }
70
+ compared += 1;
71
+ const drift = bos.compareDNADrift(previous, dna);
72
+ if (drift.totalChanges > 0) {
73
+ findings.push({
74
+ pattern,
75
+ kind: 'changed',
76
+ summary: drift.summary,
77
+ totalChanges: drift.totalChanges,
78
+ significant: drift.significant,
79
+ });
80
+ }
81
+ }
82
+ for (const pattern of Object.keys(baseline)) {
83
+ if (!(pattern in current)) {
84
+ findings.push({
85
+ pattern,
86
+ kind: 'removed',
87
+ summary: `Removed DNA pattern: ${pattern}`,
88
+ totalChanges: 0,
89
+ significant: true,
90
+ });
91
+ }
92
+ }
93
+ return { compared, findings, hasDrift: findings.length > 0 };
94
+ }
95
+ /** Compare the legacy state baseline fields, if present. */
96
+ export function compareStateToBaseline(state, baseline) {
97
+ if (!isRecord(state) || !isRecord(baseline))
98
+ return [];
99
+ const drifts = [];
100
+ if ('selectedDna' in baseline && state.selectedDna !== baseline.selectedDna) {
101
+ drifts.push(`DNA pattern changed: ${String(baseline.selectedDna)} → ${String(state.selectedDna)}`);
102
+ }
103
+ if ('currentStep' in baseline && state.currentStep !== baseline.currentStep) {
104
+ drifts.push(`Protocol step changed: ${String(baseline.currentStep)} → ${String(state.currentStep)}`);
105
+ }
106
+ return drifts;
107
+ }
108
+ /**
109
+ * Run a drift check against a project directory.
110
+ *
111
+ * A baseline from `diff` is a DNA snapshot map. Older/state-only baselines are
112
+ * still accepted so existing projects keep working. Invalid JSON or a
113
+ * malformed DNA entry throws; the CLI turns that into exit code 1 instead of
114
+ * pretending the check passed.
115
+ */
116
+ export async function runDriftCheck(directory) {
117
+ const dnasDir = join(directory, 'dnas');
118
+ const baselinePath = join(directory, '.behavioros', 'baseline.json');
119
+ const statePath = join(directory, '.behavioros', 'state.json');
120
+ const dnasFound = existsSync(dnasDir);
121
+ const stateFound = existsSync(statePath);
122
+ if (!existsSync(baselinePath)) {
123
+ return {
124
+ baselineFound: false,
125
+ dnasFound,
126
+ stateFound,
127
+ compared: 0,
128
+ findings: [],
129
+ stateDrifts: [],
130
+ hasDrift: false,
131
+ };
132
+ }
133
+ const baseline = JSON.parse(readFileSync(baselinePath, 'utf8'));
134
+ if (isLegacyStateBaseline(baseline)) {
135
+ if (!stateFound) {
136
+ return {
137
+ baselineFound: true,
138
+ dnasFound,
139
+ stateFound: false,
140
+ compared: 0,
141
+ findings: [],
142
+ stateDrifts: [],
143
+ hasDrift: false,
144
+ };
145
+ }
146
+ const state = JSON.parse(readFileSync(statePath, 'utf8'));
147
+ const stateDrifts = compareStateToBaseline(state, baseline);
148
+ return {
149
+ baselineFound: true,
150
+ dnasFound,
151
+ stateFound: true,
152
+ compared: 0,
153
+ findings: [],
154
+ stateDrifts,
155
+ hasDrift: stateDrifts.length > 0,
156
+ };
157
+ }
158
+ if (!isRecord(baseline)) {
159
+ throw new Error('baseline.json must be a DNA map or a state baseline object');
160
+ }
161
+ const baselineDnas = {};
162
+ for (const [pattern, value] of Object.entries(baseline)) {
163
+ if (!isDnaSnapshot(value)) {
164
+ throw new Error(`baseline entry "${pattern}" is not a DNA snapshot`);
165
+ }
166
+ baselineDnas[pattern] = value;
167
+ }
168
+ const current = dnasFound ? await loadDnaDirectory(dnasDir) : {};
169
+ const comparison = compareDnaSnapshots(current, baselineDnas);
170
+ return {
171
+ baselineFound: true,
172
+ dnasFound,
173
+ stateFound,
174
+ compared: comparison.compared,
175
+ findings: comparison.findings,
176
+ stateDrifts: [],
177
+ hasDrift: comparison.hasDrift,
178
+ };
179
+ }
180
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './cli.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './cli.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,31 @@
1
1
  {
2
2
  "name": "@behavior-os/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "2.2.0",
4
+ "description": "CLI for Behavior-OS initialization and management",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "behavioros": "./dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.build.json",
12
+ "test": "vitest run",
13
+ "typecheck": "tsc --noEmit -p tsconfig.json",
14
+ "clean": "node ../../scripts/clean.mjs"
15
+ },
16
+ "dependencies": {
17
+ "@behavior-os/core": "workspace:*",
18
+ "@behavior-os/schemas": "workspace:*",
19
+ "commander": "^12.0.0",
20
+ "chalk": "^5.3.0",
21
+ "js-yaml": "^5.4.3"
22
+ },
23
+ "files": [
24
+ "dist/"
25
+ ],
26
+ "devDependencies": {
27
+ "@types/node": "^22.0.0",
28
+ "typescript": "~5.9.3",
29
+ "vitest": "^4.1.11"
30
+ }
31
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.