@soleri/cli 9.14.3 → 9.15.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/dist/commands/agent.js +51 -20
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/brain.d.ts +8 -0
- package/dist/commands/brain.js +83 -0
- package/dist/commands/brain.js.map +1 -0
- package/dist/commands/dream.js +1 -12
- package/dist/commands/dream.js.map +1 -1
- package/dist/commands/install.js +3 -9
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/validate-skills.d.ts +10 -0
- package/dist/commands/validate-skills.js +47 -0
- package/dist/commands/validate-skills.js.map +1 -0
- package/dist/commands/vault.js +2 -11
- package/dist/commands/vault.js.map +1 -1
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -1
- package/dist/utils/checks.js +17 -32
- package/dist/utils/checks.js.map +1 -1
- package/dist/utils/core-resolver.d.ts +3 -0
- package/dist/utils/core-resolver.js +38 -0
- package/dist/utils/core-resolver.js.map +1 -0
- package/dist/utils/vault-db.d.ts +5 -0
- package/dist/utils/vault-db.js +17 -0
- package/dist/utils/vault-db.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/doctor.test.ts +46 -1
- package/src/__tests__/install-verify.test.ts +1 -1
- package/src/__tests__/install.test.ts +7 -10
- package/src/commands/agent.ts +53 -17
- package/src/commands/brain.ts +93 -0
- package/src/commands/dream.ts +1 -11
- package/src/commands/install.ts +3 -8
- package/src/commands/validate-skills.ts +58 -0
- package/src/commands/vault.ts +2 -11
- package/src/main.ts +4 -0
- package/src/utils/checks.ts +18 -30
- package/src/utils/core-resolver.ts +39 -0
- package/src/utils/vault-db.ts +15 -0
- package/dist/hook-packs/converter/template.test.ts +0 -133
- package/dist/hook-packs/yolo-safety/scripts/anti-deletion.sh +0 -274
- package/dist/prompts/archetypes.d.ts +0 -22
- package/dist/prompts/archetypes.js +0 -298
- package/dist/prompts/archetypes.js.map +0 -1
- package/dist/prompts/playbook.d.ts +0 -64
- package/dist/prompts/playbook.js +0 -436
- package/dist/prompts/playbook.js.map +0 -1
- package/dist/utils/format-paths.d.ts +0 -14
- package/dist/utils/format-paths.js +0 -27
- package/dist/utils/format-paths.js.map +0 -1
package/dist/main.js
CHANGED
|
@@ -29,6 +29,8 @@ import { registerVault } from './commands/vault.js';
|
|
|
29
29
|
import { registerYolo } from './commands/yolo.js';
|
|
30
30
|
import { registerDream } from './commands/dream.js';
|
|
31
31
|
import { registerUpdate } from './commands/update.js';
|
|
32
|
+
import { registerBrain } from './commands/brain.js';
|
|
33
|
+
import { registerValidateSkills } from './commands/validate-skills.js';
|
|
32
34
|
const require = createRequire(import.meta.url);
|
|
33
35
|
const { version } = require('../package.json');
|
|
34
36
|
const RESET = '\x1b[0m';
|
|
@@ -88,5 +90,7 @@ registerVault(program);
|
|
|
88
90
|
registerYolo(program);
|
|
89
91
|
registerDream(program);
|
|
90
92
|
registerUpdate(program);
|
|
93
|
+
registerBrain(program);
|
|
94
|
+
registerValidateSkills(program);
|
|
91
95
|
program.parse();
|
|
92
96
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CACX,yDAAyD,OAAO,CAAC,QAAQ,CAAC,IAAI,sCAAsC,CACrH,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/checks.js
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { execFileSync } from 'node:child_process';
|
|
7
|
-
import { homedir } from 'node:os';
|
|
8
7
|
import { detectAgent } from './agent-context.js';
|
|
8
|
+
import { detectArtifacts } from './agent-artifacts.js';
|
|
9
|
+
import { resolveCorePackageJsonPath } from './core-resolver.js';
|
|
9
10
|
import { getInstalledPacks } from '../hook-packs/registry.js';
|
|
10
11
|
export function checkNodeVersion() {
|
|
11
12
|
const [major] = process.versions.node.split('.').map(Number);
|
|
@@ -150,49 +151,33 @@ export function checkInstructionsDir(agentPath) {
|
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
export function checkEngineReachable() {
|
|
153
|
-
|
|
154
|
-
require.resolve('@soleri/core/package.json');
|
|
154
|
+
if (resolveCorePackageJsonPath() !== null) {
|
|
155
155
|
return { status: 'pass', label: 'Engine', detail: '@soleri/core reachable' };
|
|
156
156
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
};
|
|
163
|
-
}
|
|
157
|
+
return {
|
|
158
|
+
status: 'fail',
|
|
159
|
+
label: 'Engine',
|
|
160
|
+
detail: '@soleri/core not found — engine is required for file-tree agents',
|
|
161
|
+
};
|
|
164
162
|
}
|
|
165
163
|
function checkMcpRegistration(dir) {
|
|
166
164
|
const ctx = detectAgent(dir);
|
|
167
165
|
if (!ctx)
|
|
168
166
|
return { status: 'warn', label: 'MCP registration', detail: 'no agent detected' };
|
|
169
|
-
const
|
|
170
|
-
if (
|
|
171
|
-
return {
|
|
172
|
-
status: 'warn',
|
|
173
|
-
label: 'MCP registration',
|
|
174
|
-
detail: '~/.claude.json not found',
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
const config = JSON.parse(readFileSync(claudeJsonPath, 'utf-8'));
|
|
179
|
-
const servers = config.mcpServers ?? {};
|
|
180
|
-
if (ctx.agentId in servers) {
|
|
181
|
-
return {
|
|
182
|
-
status: 'pass',
|
|
183
|
-
label: 'MCP registration',
|
|
184
|
-
detail: `registered as "${ctx.agentId}"`,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
167
|
+
const artifacts = detectArtifacts(ctx.agentId, ctx.agentPath);
|
|
168
|
+
if (artifacts.mcpServerEntries.length === 0) {
|
|
187
169
|
return {
|
|
188
170
|
status: 'warn',
|
|
189
171
|
label: 'MCP registration',
|
|
190
|
-
detail: `
|
|
172
|
+
detail: `not found in ~/.claude.json, ~/.codex/config.toml, or ~/.config/opencode/opencode.json`,
|
|
191
173
|
};
|
|
192
174
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
175
|
+
const targets = [...new Set(artifacts.mcpServerEntries.map((entry) => entry.target))];
|
|
176
|
+
return {
|
|
177
|
+
status: 'pass',
|
|
178
|
+
label: 'MCP registration',
|
|
179
|
+
detail: `registered in ${targets.join(', ')}`,
|
|
180
|
+
};
|
|
196
181
|
}
|
|
197
182
|
function checkCognee() {
|
|
198
183
|
const url = process.env.COGNEE_URL ?? 'http://localhost:8000/';
|
package/dist/utils/checks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/utils/checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/utils/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
function resolveCoreEntryPath() {
|
|
5
|
+
try {
|
|
6
|
+
return fileURLToPath(import.meta.resolve('@soleri/core'));
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function resolveCorePackageJsonPath() {
|
|
13
|
+
const entryPath = resolveCoreEntryPath();
|
|
14
|
+
if (!entryPath)
|
|
15
|
+
return null;
|
|
16
|
+
const packageJsonPath = join(dirname(entryPath), '..', 'package.json');
|
|
17
|
+
return existsSync(packageJsonPath) ? packageJsonPath : null;
|
|
18
|
+
}
|
|
19
|
+
export function readInstalledCoreVersion() {
|
|
20
|
+
const packageJsonPath = resolveCorePackageJsonPath();
|
|
21
|
+
if (!packageJsonPath)
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
25
|
+
return typeof pkg.version === 'string' ? pkg.version : null;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function resolveInstalledEngineBin() {
|
|
32
|
+
const entryPath = resolveCoreEntryPath();
|
|
33
|
+
if (!entryPath)
|
|
34
|
+
return null;
|
|
35
|
+
const engineBinPath = join(dirname(entryPath), 'engine', 'bin', 'soleri-engine.js');
|
|
36
|
+
return existsSync(engineBinPath) ? engineBinPath : null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=core-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-resolver.js","sourceRoot":"","sources":["../../src/utils/core-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACvE,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,eAAe,GAAG,0BAA0B,EAAE,CAAC;IACrD,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAA0B,CAAC;QACxF,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACpF,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { SOLERI_HOME } from '@soleri/core';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the vault DB path for a given agent.
|
|
6
|
+
* Checks the current path first, then falls back to the legacy dot-prefixed path.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveVaultDbPath(agentId) {
|
|
9
|
+
const newDbPath = join(SOLERI_HOME, agentId, 'vault.db');
|
|
10
|
+
const legacyDbPath = join(SOLERI_HOME, '..', `.${agentId}`, 'vault.db');
|
|
11
|
+
if (existsSync(newDbPath))
|
|
12
|
+
return newDbPath;
|
|
13
|
+
if (existsSync(legacyDbPath))
|
|
14
|
+
return legacyDbPath;
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=vault-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-db.js","sourceRoot":"","sources":["../../src/utils/vault-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -104,7 +104,7 @@ describe('doctor command', () => {
|
|
|
104
104
|
describe('runAllChecks', () => {
|
|
105
105
|
it('should return array of check results', { timeout: 20_000 }, () => {
|
|
106
106
|
const results = runAllChecks(tempDir);
|
|
107
|
-
expect(results.length).
|
|
107
|
+
expect(results.length).toBe(9); // 4 common + 2 non-filetree (nodeModules + agentBuild) + 3 shared (mcpReg + hookPacks + cognee)
|
|
108
108
|
for (const r of results) {
|
|
109
109
|
expect(['pass', 'fail', 'warn']).toContain(r.status);
|
|
110
110
|
expect(r.label).toBeTruthy();
|
|
@@ -117,5 +117,50 @@ describe('doctor command', () => {
|
|
|
117
117
|
expect(labels).toContain('Node.js');
|
|
118
118
|
expect(labels).toContain('npm');
|
|
119
119
|
});
|
|
120
|
+
|
|
121
|
+
it('should detect Codex MCP registration for file-tree agents', { timeout: 20_000 }, () => {
|
|
122
|
+
const originalHome = process.env.HOME ?? '';
|
|
123
|
+
const originalUserProfile = process.env.USERPROFILE ?? '';
|
|
124
|
+
process.env.HOME = tempDir;
|
|
125
|
+
process.env.USERPROFILE = tempDir;
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
const agentDir = join(tempDir, 'agent');
|
|
129
|
+
mkdirSync(join(agentDir, 'instructions'), { recursive: true });
|
|
130
|
+
mkdirSync(join(tempDir, '.codex'), { recursive: true });
|
|
131
|
+
|
|
132
|
+
writeFileSync(
|
|
133
|
+
join(agentDir, 'agent.yaml'),
|
|
134
|
+
[
|
|
135
|
+
'id: test-agent',
|
|
136
|
+
'name: Test Agent',
|
|
137
|
+
'role: A test agent',
|
|
138
|
+
'description: A minimal file-tree agent for doctor testing',
|
|
139
|
+
'domains: []',
|
|
140
|
+
'principles: []',
|
|
141
|
+
'',
|
|
142
|
+
].join('\n'),
|
|
143
|
+
);
|
|
144
|
+
writeFileSync(join(agentDir, 'instructions', 'usage.md'), '# Usage');
|
|
145
|
+
writeFileSync(
|
|
146
|
+
join(tempDir, '.codex', 'config.toml'),
|
|
147
|
+
[
|
|
148
|
+
'[mcp_servers.test-agent]',
|
|
149
|
+
'command = "node"',
|
|
150
|
+
'args = ["engine.js", "--agent", "agent.yaml"]',
|
|
151
|
+
'',
|
|
152
|
+
].join('\n'),
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const results = runAllChecks(agentDir);
|
|
156
|
+
const registration = results.find((r) => r.label === 'MCP registration');
|
|
157
|
+
expect(registration).toBeDefined();
|
|
158
|
+
expect(registration!.status).toBe('pass');
|
|
159
|
+
expect(registration!.detail).toContain('codex');
|
|
160
|
+
} finally {
|
|
161
|
+
process.env.HOME = originalHome;
|
|
162
|
+
process.env.USERPROFILE = originalUserProfile;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
120
165
|
});
|
|
121
166
|
});
|
|
@@ -98,7 +98,7 @@ describe('verifyInstall', () => {
|
|
|
98
98
|
const checks = verifyInstall('test-agent', agentDir, 'claude');
|
|
99
99
|
|
|
100
100
|
expect(Array.isArray(checks)).toBe(true);
|
|
101
|
-
expect(checks.length).
|
|
101
|
+
expect(checks.length).toBe(3); // claude config entry + engine binary + agent.yaml
|
|
102
102
|
for (const check of checks) {
|
|
103
103
|
expect(check).toHaveProperty('label');
|
|
104
104
|
expect(check).toHaveProperty('passed');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { mkdirSync, rmSync,
|
|
2
|
+
import { mkdirSync, rmSync, readFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { toPosix, getNextStepMessage, resolveEngineBin } from '../commands/install.js';
|
|
@@ -82,20 +82,17 @@ describe('resolveEngineBin', () => {
|
|
|
82
82
|
describe('npx fallback warning', () => {
|
|
83
83
|
afterEach(() => {
|
|
84
84
|
vi.resetModules();
|
|
85
|
-
vi.doUnmock('
|
|
85
|
+
vi.doUnmock('../utils/core-resolver.js');
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
it('returns npx fallback when core resolution fails', async () => {
|
|
89
|
-
vi.doMock('
|
|
90
|
-
const actual = await vi.importActual<typeof import('
|
|
89
|
+
vi.doMock('../utils/core-resolver.js', async () => {
|
|
90
|
+
const actual = await vi.importActual<typeof import('../utils/core-resolver.js')>(
|
|
91
|
+
'../utils/core-resolver.js',
|
|
92
|
+
);
|
|
91
93
|
return {
|
|
92
94
|
...actual,
|
|
93
|
-
|
|
94
|
-
({
|
|
95
|
-
resolve: () => {
|
|
96
|
-
throw new Error('MODULE_NOT_FOUND');
|
|
97
|
-
},
|
|
98
|
-
}) as ReturnType<typeof import('node:module').createRequire>,
|
|
95
|
+
resolveInstalledEngineBin: () => null,
|
|
99
96
|
};
|
|
100
97
|
});
|
|
101
98
|
|
package/src/commands/agent.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { join, dirname } from 'node:path';
|
|
9
|
-
import { createRequire } from 'node:module';
|
|
10
9
|
import {
|
|
11
10
|
existsSync,
|
|
12
11
|
readFileSync,
|
|
@@ -26,6 +25,7 @@ import { PackLockfile, checkNpmVersion, checkVersionCompat, SOLERI_HOME } from '
|
|
|
26
25
|
import {
|
|
27
26
|
generateClaudeMdTemplate,
|
|
28
27
|
generateInjectClaudeMd,
|
|
28
|
+
generateAgentsMd,
|
|
29
29
|
generateSkills,
|
|
30
30
|
} from '@soleri/forge/lib';
|
|
31
31
|
import { composeClaudeMd, getModularEngineRules, AgentYamlSchema } from '@soleri/forge/lib';
|
|
@@ -48,6 +48,42 @@ function readEngineFeatures(agentPath: string): EngineFeature[] | undefined {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
function readFileTreeAgentConfig(agentPath: string): AgentConfig | null {
|
|
52
|
+
try {
|
|
53
|
+
const yamlPath = join(agentPath, 'agent.yaml');
|
|
54
|
+
if (!existsSync(yamlPath)) return null;
|
|
55
|
+
|
|
56
|
+
const parsed = AgentYamlSchema.parse(parseYaml(readFileSync(yamlPath, 'utf-8')));
|
|
57
|
+
return {
|
|
58
|
+
id: parsed.id,
|
|
59
|
+
name: parsed.name,
|
|
60
|
+
role: parsed.role,
|
|
61
|
+
description: parsed.description,
|
|
62
|
+
domains: parsed.domains,
|
|
63
|
+
principles: parsed.principles,
|
|
64
|
+
tone: parsed.tone,
|
|
65
|
+
greeting: parsed.greeting,
|
|
66
|
+
persona: parsed.persona,
|
|
67
|
+
vaults: parsed.vaults,
|
|
68
|
+
setupTarget: parsed.setup?.target ?? 'claude',
|
|
69
|
+
} as AgentConfig;
|
|
70
|
+
} catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function readAgentCoreVersion(agentPath: string): string | null {
|
|
76
|
+
const corePkgPath = join(agentPath, 'node_modules', '@soleri', 'core', 'package.json');
|
|
77
|
+
if (!existsSync(corePkgPath)) return null;
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
const pkg = JSON.parse(readFileSync(corePkgPath, 'utf-8')) as { version?: unknown };
|
|
81
|
+
return typeof pkg.version === 'string' ? pkg.version : null;
|
|
82
|
+
} catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
51
87
|
export function registerAgent(program: Command): void {
|
|
52
88
|
const agent = program.command('agent').description('Agent lifecycle management');
|
|
53
89
|
|
|
@@ -83,14 +119,7 @@ export function registerAgent(program: Command): void {
|
|
|
83
119
|
}
|
|
84
120
|
|
|
85
121
|
// Resolve engine version via require.resolve
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
const req = createRequire(join(ctx.agentPath, 'package.json'));
|
|
89
|
-
const corePkgPath = req.resolve('@soleri/core/package.json');
|
|
90
|
-
engineVersion = JSON.parse(readFileSync(corePkgPath, 'utf-8')).version || 'unknown';
|
|
91
|
-
} catch {
|
|
92
|
-
engineVersion = 'not installed';
|
|
93
|
-
}
|
|
122
|
+
const engineVersion = readAgentCoreVersion(ctx.agentPath) ?? 'not installed';
|
|
94
123
|
|
|
95
124
|
// Check for core update
|
|
96
125
|
const latestCore = checkNpmVersion('@soleri/core');
|
|
@@ -219,14 +248,7 @@ export function registerAgent(program: Command): void {
|
|
|
219
248
|
// ─── File-tree agent (v7+) ────────────────────────────────
|
|
220
249
|
if (ctx.format === 'filetree') {
|
|
221
250
|
// Resolve installed @soleri/core version
|
|
222
|
-
|
|
223
|
-
try {
|
|
224
|
-
const req = createRequire(import.meta.url);
|
|
225
|
-
const corePkgPath = req.resolve('@soleri/core/package.json');
|
|
226
|
-
installedVersion = JSON.parse(readFileSync(corePkgPath, 'utf-8')).version ?? null;
|
|
227
|
-
} catch {
|
|
228
|
-
// @soleri/core not resolvable — will show as unknown
|
|
229
|
-
}
|
|
251
|
+
const installedVersion = readAgentCoreVersion(ctx.agentPath);
|
|
230
252
|
|
|
231
253
|
// Check latest version on npm
|
|
232
254
|
const latestCore = checkNpmVersion('@soleri/core');
|
|
@@ -382,6 +404,14 @@ export function registerAgent(program: Command): void {
|
|
|
382
404
|
if (ctx.format === 'filetree') {
|
|
383
405
|
const enginePath = join(ctx.agentPath, 'instructions', '_engine.md');
|
|
384
406
|
const claudeMdPath = join(ctx.agentPath, 'CLAUDE.md');
|
|
407
|
+
const agentsMdPath = join(ctx.agentPath, 'AGENTS.md');
|
|
408
|
+
const config = readFileTreeAgentConfig(ctx.agentPath);
|
|
409
|
+
|
|
410
|
+
if (!config) {
|
|
411
|
+
p.log.error('Could not parse agent.yaml for AGENTS.md regeneration.');
|
|
412
|
+
process.exit(1);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
385
415
|
|
|
386
416
|
// Generate skills from latest forge templates
|
|
387
417
|
const skillFiles = opts.skipSkills
|
|
@@ -391,6 +421,7 @@ export function registerAgent(program: Command): void {
|
|
|
391
421
|
if (opts.dryRun) {
|
|
392
422
|
p.log.info(`Would regenerate: ${enginePath}`);
|
|
393
423
|
p.log.info(`Would regenerate: ${claudeMdPath}`);
|
|
424
|
+
p.log.info(`Would regenerate: ${agentsMdPath}`);
|
|
394
425
|
if (skillFiles.length > 0) {
|
|
395
426
|
const newSkills = skillFiles.filter(
|
|
396
427
|
([relPath]) => !existsSync(join(ctx.agentPath, relPath)),
|
|
@@ -442,6 +473,11 @@ export function registerAgent(program: Command): void {
|
|
|
442
473
|
p.log.success(
|
|
443
474
|
`Regenerated ${claudeMdPath} (${result.sources.length} sources, ${result.content.length} bytes)`,
|
|
444
475
|
);
|
|
476
|
+
|
|
477
|
+
// 4. Regenerate AGENTS.md for Codex/OpenCode
|
|
478
|
+
const agentsMd = generateAgentsMd(config);
|
|
479
|
+
writeFileSync(agentsMdPath, agentsMd, 'utf-8');
|
|
480
|
+
p.log.success(`Regenerated ${agentsMdPath} (${agentsMd.length} bytes)`);
|
|
445
481
|
return;
|
|
446
482
|
}
|
|
447
483
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain CLI — brain session management.
|
|
3
|
+
*
|
|
4
|
+
* `soleri brain close-orphans` — close orphaned sessions (default: --max-age 1h)
|
|
5
|
+
* `soleri brain close-orphans --max-age 2h` — close sessions older than 2h
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Command } from 'commander';
|
|
9
|
+
import { detectAgent } from '../utils/agent-context.js';
|
|
10
|
+
import { pass, fail, info, heading } from '../utils/logger.js';
|
|
11
|
+
import { resolveVaultDbPath } from '../utils/vault-db.js';
|
|
12
|
+
|
|
13
|
+
function parseMaxAge(value: string): number {
|
|
14
|
+
const match = value.match(/^(\d+)(h|m|s)$/);
|
|
15
|
+
if (!match) throw new Error(`Invalid --max-age format "${value}". Use e.g. 1h, 30m, 90s`);
|
|
16
|
+
const n = parseInt(match[1], 10);
|
|
17
|
+
const unit = match[2];
|
|
18
|
+
if (unit === 'h') return n * 60 * 60 * 1000;
|
|
19
|
+
if (unit === 'm') return n * 60 * 1000;
|
|
20
|
+
return n * 1000;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function registerBrain(program: Command): void {
|
|
24
|
+
const brain = program.command('brain').description('Brain session management');
|
|
25
|
+
|
|
26
|
+
brain
|
|
27
|
+
.command('close-orphans')
|
|
28
|
+
.description('Close orphaned brain sessions that were never completed')
|
|
29
|
+
.option('--max-age <duration>', 'Close sessions older than this age (e.g. 1h, 30m)', '1h')
|
|
30
|
+
.action(async (opts: { maxAge: string }) => {
|
|
31
|
+
const agent = detectAgent();
|
|
32
|
+
if (!agent) {
|
|
33
|
+
fail('Not in a Soleri agent project', 'Run from an agent directory');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const dbPath = resolveVaultDbPath(agent.agentId);
|
|
38
|
+
if (!dbPath) {
|
|
39
|
+
info('Vault DB not found — no sessions to close.');
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let maxAgeMs: number;
|
|
44
|
+
try {
|
|
45
|
+
maxAgeMs = parseMaxAge(opts.maxAge);
|
|
46
|
+
} catch (e: unknown) {
|
|
47
|
+
fail(
|
|
48
|
+
e instanceof Error ? e.message : String(e),
|
|
49
|
+
'Example: soleri brain close-orphans --max-age 1h',
|
|
50
|
+
);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const { Vault, Brain, BrainIntelligence } = await import('@soleri/core');
|
|
55
|
+
const vault = new Vault(dbPath);
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
const brainInstance = new Brain(vault);
|
|
59
|
+
const intelligence = new BrainIntelligence(vault, brainInstance);
|
|
60
|
+
|
|
61
|
+
const cutoff = new Date(Date.now() - maxAgeMs).toISOString().replace('T', ' ').slice(0, 19);
|
|
62
|
+
const activeSessions = intelligence.listSessions({ active: true, limit: 1000 });
|
|
63
|
+
const orphans = activeSessions.filter((s) => s.startedAt < cutoff);
|
|
64
|
+
|
|
65
|
+
if (orphans.length === 0) {
|
|
66
|
+
info(`No orphaned sessions older than ${opts.maxAge}.`);
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
heading('Brain — Close Orphans');
|
|
71
|
+
|
|
72
|
+
let closed = 0;
|
|
73
|
+
for (const s of orphans) {
|
|
74
|
+
try {
|
|
75
|
+
intelligence.lifecycle({
|
|
76
|
+
action: 'end',
|
|
77
|
+
sessionId: s.id,
|
|
78
|
+
planOutcome: 'abandoned',
|
|
79
|
+
context: `auto-closed via CLI: no completion after ${opts.maxAge}`,
|
|
80
|
+
});
|
|
81
|
+
closed++;
|
|
82
|
+
} catch {
|
|
83
|
+
// best-effort — never block on failures
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
pass(`Closed ${closed} orphaned session${closed === 1 ? '' : 's'}`);
|
|
88
|
+
process.exit(0);
|
|
89
|
+
} finally {
|
|
90
|
+
vault.close();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
package/src/commands/dream.ts
CHANGED
|
@@ -7,20 +7,10 @@
|
|
|
7
7
|
* `soleri dream status` — show dream status + cron info
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { existsSync } from 'node:fs';
|
|
11
|
-
import { join } from 'node:path';
|
|
12
10
|
import type { Command } from 'commander';
|
|
13
11
|
import { detectAgent } from '../utils/agent-context.js';
|
|
14
12
|
import { pass, fail, info, heading, dim } from '../utils/logger.js';
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
function resolveVaultDbPath(agentId: string): string | null {
|
|
18
|
-
const newDbPath = join(SOLERI_HOME, agentId, 'vault.db');
|
|
19
|
-
const legacyDbPath = join(SOLERI_HOME, '..', `.${agentId}`, 'vault.db');
|
|
20
|
-
if (existsSync(newDbPath)) return newDbPath;
|
|
21
|
-
if (existsSync(legacyDbPath)) return legacyDbPath;
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
13
|
+
import { resolveVaultDbPath } from '../utils/vault-db.js';
|
|
24
14
|
|
|
25
15
|
export function registerDream(program: Command): void {
|
|
26
16
|
const dream = program.command('dream').description('Vault memory consolidation');
|
package/src/commands/install.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
-
import { createRequire } from 'node:module';
|
|
3
2
|
import {
|
|
4
3
|
accessSync,
|
|
5
4
|
constants as fsConstants,
|
|
@@ -13,6 +12,7 @@ import { homedir } from 'node:os';
|
|
|
13
12
|
import * as p from '@clack/prompts';
|
|
14
13
|
import { detectAgent } from '../utils/agent-context.js';
|
|
15
14
|
import { detectArtifacts } from '../utils/agent-artifacts.js';
|
|
15
|
+
import { resolveInstalledEngineBin } from '../utils/core-resolver.js';
|
|
16
16
|
|
|
17
17
|
/** Default parent directory for agents: ~/.soleri/ */
|
|
18
18
|
const SOLERI_HOME = process.env.SOLERI_HOME ?? join(homedir(), '.soleri');
|
|
@@ -27,13 +27,8 @@ export const toPosix = (p: string): string => p.replace(/\\/g, '/');
|
|
|
27
27
|
* Falls back to `npx @soleri/engine` if resolution fails (e.g. not installed globally).
|
|
28
28
|
*/
|
|
29
29
|
export function resolveEngineBin(): { command: string; bin: string } {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const bin = require.resolve('@soleri/core/dist/engine/bin/soleri-engine.js');
|
|
33
|
-
return { command: 'node', bin };
|
|
34
|
-
} catch {
|
|
35
|
-
return { command: 'npx', bin: '@soleri/engine' };
|
|
36
|
-
}
|
|
30
|
+
const bin = resolveInstalledEngineBin();
|
|
31
|
+
return bin ? { command: 'node', bin } : { command: 'npx', bin: '@soleri/engine' };
|
|
37
32
|
}
|
|
38
33
|
|
|
39
34
|
/** MCP server entry for file-tree agents (resolved engine path, no npx) */
|