@soleri/forge 5.14.9 → 7.0.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/agent-schema.d.ts +323 -0
- package/dist/agent-schema.js +151 -0
- package/dist/agent-schema.js.map +1 -0
- package/dist/compose-claude-md.d.ts +24 -0
- package/dist/compose-claude-md.js +197 -0
- package/dist/compose-claude-md.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/lib.d.ts +12 -1
- package/dist/lib.js +10 -1
- package/dist/lib.js.map +1 -1
- package/dist/scaffold-filetree.d.ts +22 -0
- package/dist/scaffold-filetree.js +349 -0
- package/dist/scaffold-filetree.js.map +1 -0
- package/dist/scaffolder.js +261 -11
- package/dist/scaffolder.js.map +1 -1
- package/dist/templates/activate.d.ts +5 -2
- package/dist/templates/activate.js +136 -35
- package/dist/templates/activate.js.map +1 -1
- package/dist/templates/agents-md.d.ts +10 -1
- package/dist/templates/agents-md.js +76 -16
- package/dist/templates/agents-md.js.map +1 -1
- package/dist/templates/claude-md-template.js +25 -4
- package/dist/templates/claude-md-template.js.map +1 -1
- package/dist/templates/entry-point.js +84 -7
- package/dist/templates/entry-point.js.map +1 -1
- package/dist/templates/inject-claude-md.js +53 -0
- package/dist/templates/inject-claude-md.js.map +1 -1
- package/dist/templates/package-json.js +4 -1
- package/dist/templates/package-json.js.map +1 -1
- package/dist/templates/readme.js +4 -3
- package/dist/templates/readme.js.map +1 -1
- package/dist/templates/setup-script.js +109 -3
- package/dist/templates/setup-script.js.map +1 -1
- package/dist/templates/shared-rules.js +54 -17
- package/dist/templates/shared-rules.js.map +1 -1
- package/dist/templates/test-facades.js +151 -6
- package/dist/templates/test-facades.js.map +1 -1
- package/dist/types.d.ts +75 -10
- package/dist/types.js +40 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/detect-domain-packs.d.ts +25 -0
- package/dist/utils/detect-domain-packs.js +104 -0
- package/dist/utils/detect-domain-packs.js.map +1 -0
- package/package.json +2 -1
- package/src/__tests__/detect-domain-packs.test.ts +178 -0
- package/src/__tests__/scaffold-filetree.test.ts +243 -0
- package/src/__tests__/scaffolder.test.ts +5 -3
- package/src/agent-schema.ts +184 -0
- package/src/compose-claude-md.ts +252 -0
- package/src/lib.ts +14 -1
- package/src/scaffold-filetree.ts +409 -0
- package/src/scaffolder.ts +299 -15
- package/src/templates/activate.ts +137 -39
- package/src/templates/agents-md.ts +78 -16
- package/src/templates/claude-md-template.ts +29 -4
- package/src/templates/entry-point.ts +91 -7
- package/src/templates/inject-claude-md.ts +53 -0
- package/src/templates/package-json.ts +4 -1
- package/src/templates/readme.ts +4 -3
- package/src/templates/setup-script.ts +110 -4
- package/src/templates/shared-rules.ts +55 -17
- package/src/templates/test-facades.ts +156 -6
- package/src/types.ts +45 -2
- package/src/utils/detect-domain-packs.ts +129 -0
- package/tsconfig.json +0 -1
- package/vitest.config.ts +1 -2
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/** Generate vault connection code for linked vaults. */
|
|
2
|
+
function generateVaultConnections(config) {
|
|
3
|
+
if (!config.vaults?.length)
|
|
4
|
+
return '';
|
|
5
|
+
const lines = ['', ' // ─── Linked vaults ──────────────────────────────────────────────'];
|
|
6
|
+
for (const v of config.vaults) {
|
|
7
|
+
lines.push(` try { runtime.vaultManager.connect('${v.name}', '${v.path}', ${v.priority ?? 0.5}); } catch { /* already connected or unavailable */ }`);
|
|
8
|
+
}
|
|
9
|
+
lines.push(` console.error(\`[\${tag}] Connected ${config.vaults.length} linked vault(s): ${config.vaults.map((v) => v.name).join(', ')}\`);`, '');
|
|
10
|
+
return lines.join('\n');
|
|
11
|
+
}
|
|
1
12
|
/**
|
|
2
13
|
* Generate the main index.ts entry point for the agent.
|
|
3
14
|
*
|
|
@@ -7,6 +18,7 @@
|
|
|
7
18
|
*/
|
|
8
19
|
export function generateEntryPoint(config) {
|
|
9
20
|
const domainsLiteral = JSON.stringify(config.domains);
|
|
21
|
+
const hasDomainPacks = config.domainPacks && config.domainPacks.length > 0;
|
|
10
22
|
return `#!/usr/bin/env node
|
|
11
23
|
|
|
12
24
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
@@ -21,12 +33,14 @@ import {
|
|
|
21
33
|
registerAllFacades,
|
|
22
34
|
seedDefaultPlaybooks,
|
|
23
35
|
wrapWithMiddleware,
|
|
36
|
+
CapabilityRegistry,
|
|
37
|
+
loadAllFlows,
|
|
24
38
|
} from '@soleri/core';
|
|
25
|
-
import type { OpDefinition, AgentExtensions } from '@soleri/core'
|
|
39
|
+
import type { OpDefinition, AgentExtensions } from '@soleri/core';${hasDomainPacks ? `\nimport { loadDomainPacksFromConfig, createPackRuntime } from '@soleri/core';` : ''}
|
|
26
40
|
import { z } from 'zod';
|
|
27
41
|
import { PERSONA, getPersonaPrompt } from './identity/persona.js';
|
|
28
42
|
import { activateAgent, deactivateAgent } from './activation/activate.js';
|
|
29
|
-
import { injectClaudeMd, injectClaudeMdGlobal, hasAgentMarker } from './activation/inject-claude-md.js';
|
|
43
|
+
import { injectClaudeMd, injectClaudeMdGlobal, hasAgentMarker, injectAgentsMd, injectAgentsMdGlobal, hasAgentMarkerInAgentsMd } from './activation/inject-claude-md.js';
|
|
30
44
|
|
|
31
45
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
32
46
|
|
|
@@ -34,11 +48,11 @@ async function main(): Promise<void> {
|
|
|
34
48
|
// ─── Runtime — vault, brain, planner, curator, LLM, key pools ───
|
|
35
49
|
const runtime = createAgentRuntime({
|
|
36
50
|
agentId: '${config.id}',
|
|
37
|
-
dataDir: join(__dirname, 'intelligence', 'data')
|
|
51
|
+
dataDir: join(__dirname, 'intelligence', 'data'),${config.sharedVaultPath ? `\n sharedVaultPath: '${config.sharedVaultPath}',` : ''}${config.cognee ? `\n cognee: true,` : ''}
|
|
38
52
|
});
|
|
39
53
|
|
|
40
54
|
const tag = PERSONA.name.toLowerCase();
|
|
41
|
-
|
|
55
|
+
${generateVaultConnections(config)}
|
|
42
56
|
// Seed built-in playbooks (idempotent)
|
|
43
57
|
const seedResult = seedDefaultPlaybooks(runtime.vault);
|
|
44
58
|
if (seedResult.seeded > 0) {
|
|
@@ -99,7 +113,7 @@ async function main(): Promise<void> {
|
|
|
99
113
|
changeReason: 'Initial identity seeded from PERSONA',
|
|
100
114
|
});
|
|
101
115
|
}
|
|
102
|
-
return activateAgent(runtime
|
|
116
|
+
return activateAgent(runtime, (params.projectPath as string) ?? '.');
|
|
103
117
|
},
|
|
104
118
|
},
|
|
105
119
|
{
|
|
@@ -117,9 +131,24 @@ async function main(): Promise<void> {
|
|
|
117
131
|
return injectClaudeMd((params.projectPath as string) ?? '.');
|
|
118
132
|
},
|
|
119
133
|
},
|
|
134
|
+
{
|
|
135
|
+
name: 'inject_agents_md',
|
|
136
|
+
description: 'Inject agent sections into AGENTS.md — project-level or global (~/.config/opencode/AGENTS.md). For OpenCode and Codex. Idempotent.',
|
|
137
|
+
auth: 'write',
|
|
138
|
+
schema: z.object({
|
|
139
|
+
projectPath: z.string().optional().default('.'),
|
|
140
|
+
global: z.boolean().optional().describe('If true, inject into ~/.config/opencode/AGENTS.md instead of project-level'),
|
|
141
|
+
}),
|
|
142
|
+
handler: async (params) => {
|
|
143
|
+
if (params.global) {
|
|
144
|
+
return injectAgentsMdGlobal();
|
|
145
|
+
}
|
|
146
|
+
return injectAgentsMd((params.projectPath as string) ?? '.');
|
|
147
|
+
},
|
|
148
|
+
},
|
|
120
149
|
{
|
|
121
150
|
name: 'setup',
|
|
122
|
-
description: 'Check setup status — CLAUDE.md configured? Vault has entries? What to do next?',
|
|
151
|
+
description: 'Check setup status — CLAUDE.md configured? AGENTS.md configured? Vault has entries? What to do next?',
|
|
123
152
|
auth: 'read',
|
|
124
153
|
schema: z.object({
|
|
125
154
|
projectPath: z.string().optional().default('.'),
|
|
@@ -132,12 +161,19 @@ async function main(): Promise<void> {
|
|
|
132
161
|
|
|
133
162
|
const projectClaudeMd = joinPath(projectPath, 'CLAUDE.md');
|
|
134
163
|
const globalClaudeMd = joinPath(homedir(), '.claude', 'CLAUDE.md');
|
|
164
|
+
const projectAgentsMd = joinPath(projectPath, 'AGENTS.md');
|
|
165
|
+
const globalAgentsMd = joinPath(homedir(), '.config', 'opencode', 'AGENTS.md');
|
|
135
166
|
|
|
136
167
|
const projectExists = existsSync(projectClaudeMd);
|
|
137
168
|
const projectHasAgent = hasAgentMarker(projectClaudeMd);
|
|
138
169
|
const globalExists = existsSync(globalClaudeMd);
|
|
139
170
|
const globalHasAgent = hasAgentMarker(globalClaudeMd);
|
|
140
171
|
|
|
172
|
+
const agentsMdProjectExists = existsSync(projectAgentsMd);
|
|
173
|
+
const agentsMdProjectHasAgent = hasAgentMarkerInAgentsMd(projectAgentsMd);
|
|
174
|
+
const agentsMdGlobalExists = existsSync(globalAgentsMd);
|
|
175
|
+
const agentsMdGlobalHasAgent = hasAgentMarkerInAgentsMd(globalAgentsMd);
|
|
176
|
+
|
|
141
177
|
const s = runtime.vault.stats();
|
|
142
178
|
|
|
143
179
|
const recommendations: string[] = [];
|
|
@@ -146,6 +182,9 @@ async function main(): Promise<void> {
|
|
|
146
182
|
} else if (!globalHasAgent) {
|
|
147
183
|
recommendations.push('Global ~/.claude/CLAUDE.md not configured — run inject_claude_md with global: true to enable in all projects');
|
|
148
184
|
}
|
|
185
|
+
if (!agentsMdGlobalHasAgent && !agentsMdProjectHasAgent) {
|
|
186
|
+
recommendations.push('No AGENTS.md configured — run inject_agents_md for OpenCode/Codex support');
|
|
187
|
+
}
|
|
149
188
|
if (s.totalEntries === 0) {
|
|
150
189
|
recommendations.push('Vault is empty — add intelligence data or capture knowledge via domain facades');
|
|
151
190
|
}
|
|
@@ -190,6 +229,10 @@ async function main(): Promise<void> {
|
|
|
190
229
|
project: { exists: projectExists, has_agent_section: projectHasAgent },
|
|
191
230
|
global: { exists: globalExists, has_agent_section: globalHasAgent },
|
|
192
231
|
},
|
|
232
|
+
agents_md: {
|
|
233
|
+
project: { exists: agentsMdProjectExists, has_agent_section: agentsMdProjectHasAgent },
|
|
234
|
+
global: { exists: agentsMdGlobalExists, has_agent_section: agentsMdGlobalHasAgent },
|
|
235
|
+
},
|
|
193
236
|
vault: { entries: s.totalEntries, domains: Object.keys(s.byDomain) },
|
|
194
237
|
hooks: hookStatus,
|
|
195
238
|
recommendations,
|
|
@@ -206,7 +249,41 @@ async function main(): Promise<void> {
|
|
|
206
249
|
ops: agentOps,
|
|
207
250
|
};
|
|
208
251
|
|
|
209
|
-
|
|
252
|
+
${hasDomainPacks
|
|
253
|
+
? ` // ─── Domain packs ─────────────────────────────────────────────
|
|
254
|
+
const domainPacks = await loadDomainPacksFromConfig(${JSON.stringify(config.domainPacks)});
|
|
255
|
+
console.error(\`[\${tag}] Loaded \${domainPacks.length} domain packs\`);
|
|
256
|
+
for (const pack of domainPacks) {
|
|
257
|
+
if (pack.onActivate) await pack.onActivate(runtime);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// ─── Capability Registry ─────────────────────────────────────
|
|
261
|
+
const capabilityRegistry = new CapabilityRegistry();
|
|
262
|
+
const packRuntime = createPackRuntime(runtime);
|
|
263
|
+
|
|
264
|
+
// Register domain pack capabilities
|
|
265
|
+
for (const pack of domainPacks) {
|
|
266
|
+
if (pack.capabilities) {
|
|
267
|
+
const handlers = pack.capabilities(packRuntime);
|
|
268
|
+
// Use pack manifest capabilities if available, otherwise derive from handler keys
|
|
269
|
+
const definitions = (pack as Record<string, unknown>).manifest
|
|
270
|
+
? ((pack as Record<string, unknown>).manifest as { capabilities?: Array<{ id: string; description: string; provides: string[]; requires: string[] }> }).capabilities ?? []
|
|
271
|
+
: [...handlers.keys()].map(id => ({ id, description: id, provides: [], requires: [] }));
|
|
272
|
+
capabilityRegistry.registerPack(pack.name, definitions, handlers, 50);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Validate flows against installed capabilities
|
|
277
|
+
const flows = loadAllFlows();
|
|
278
|
+
for (const flow of flows) {
|
|
279
|
+
const validation = capabilityRegistry.validateFlow(flow);
|
|
280
|
+
if (validation.missing.length > 0) {
|
|
281
|
+
console.error(\`[\${tag}] Flow \${flow.id}: \${validation.missing.length} capabilities degraded (\${validation.missing.join(', ')})\`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
console.error(\`[\${tag}] Capability registry: \${capabilityRegistry.size} capabilities from \${capabilityRegistry.packCount} pack(s)\`);
|
|
285
|
+
`
|
|
286
|
+
: ''} const domainFacades = createDomainFacades(runtime, '${config.id}', ${domainsLiteral}${hasDomainPacks ? `, domainPacks` : ''});
|
|
210
287
|
|
|
211
288
|
// ─── User extensions (auto-discovered from src/extensions/) ────
|
|
212
289
|
let extensions: AgentExtensions = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-point.js","sourceRoot":"","sources":["../../src/templates/entry-point.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"entry-point.js","sourceRoot":"","sources":["../../src/templates/entry-point.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,SAAS,wBAAwB,CAAC,MAAmB;IACnD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,uEAAuE,CAAC,CAAC;IAC5F,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,yCAAyC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,IAAI,GAAG,uDAAuD,CAC3I,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CACR,yCAAyC,MAAM,CAAC,MAAM,CAAC,MAAM,qBAAqB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EACnI,EAAE,CACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAE3E,OAAO;;;;;;;;;;;;;;;;;oEAiB2D,cAAc,CAAC,CAAC,CAAC,gFAAgF,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;gBAW1J,MAAM,CAAC,EAAE;uDAC8B,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,2BAA2B,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;;;;EAIrL,wBAAwB,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEAiC8B,MAAM,CAAC,EAAE;;;;;;;qGAO4B,MAAM,CAAC,IAAI;;;;;;;;;;;oDAW5D,MAAM,CAAC,EAAE;iDACZ,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAoHxB,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;4DAsBe,MAAM,CAAC,EAAE;;aAExD,MAAM,CAAC,EAAE;;;;;EAMpB,cAAc;QACZ,CAAC,CAAC;wDACkD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BzF;QACG,CAAC,CAAC,EACN,yDAAyD,MAAM,CAAC,EAAE,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAwCjH,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;gBAkBN,MAAM,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA+BL,MAAM,CAAC,EAAE;;;CAG5B,CAAC;AACF,CAAC"}
|
|
@@ -41,6 +41,10 @@ export function generateInjectClaudeMd(config) {
|
|
|
41
41
|
' if (existing.includes(startMarker)) {',
|
|
42
42
|
' const startIdx = existing.indexOf(startMarker);',
|
|
43
43
|
' const endIdx = existing.indexOf(endMarker);',
|
|
44
|
+
' if (endIdx !== -1) {',
|
|
45
|
+
' const currentBlock = existing.slice(startIdx, endIdx + endMarker.length);',
|
|
46
|
+
" if (currentBlock === content.trim()) return 'skipped';",
|
|
47
|
+
' }',
|
|
44
48
|
' if (endIdx === -1) {',
|
|
45
49
|
" const updated = existing.slice(0, startIdx) + content + '\\n' + existing.slice(startIdx + startMarker.length);",
|
|
46
50
|
" writeFileSync(filePath, updated, 'utf-8');",
|
|
@@ -163,6 +167,55 @@ export function generateInjectClaudeMd(config) {
|
|
|
163
167
|
" const content = readFileSync(filePath, 'utf-8');",
|
|
164
168
|
" return content.includes('<!-- ' + getEngineRulesMarker() + ' -->');",
|
|
165
169
|
'}',
|
|
170
|
+
'',
|
|
171
|
+
'// ─── AGENTS.md support (OpenCode, Codex) ──────────────────────',
|
|
172
|
+
'',
|
|
173
|
+
'/**',
|
|
174
|
+
' * Inject agent sections into a project AGENTS.md.',
|
|
175
|
+
' * Same engine rules + agent block as CLAUDE.md, targeting AGENTS.md instead.',
|
|
176
|
+
' * OpenCode reads AGENTS.md as its primary instruction file.',
|
|
177
|
+
' */',
|
|
178
|
+
'export function injectAgentsMd(projectPath: string): InjectResult {',
|
|
179
|
+
" return injectIntoFile(join(projectPath, 'AGENTS.md'));",
|
|
180
|
+
'}',
|
|
181
|
+
'',
|
|
182
|
+
'/**',
|
|
183
|
+
' * Inject into the global ~/.config/opencode/AGENTS.md.',
|
|
184
|
+
" * Creates ~/.config/opencode/ directory if it doesn't exist.",
|
|
185
|
+
' * This makes the activation phrase work in any OpenCode project.',
|
|
186
|
+
' */',
|
|
187
|
+
'export function injectAgentsMdGlobal(): InjectResult {',
|
|
188
|
+
" const opencodeDir = join(homedir(), '.config', 'opencode');",
|
|
189
|
+
' if (!existsSync(opencodeDir)) {',
|
|
190
|
+
' mkdirSync(opencodeDir, { recursive: true });',
|
|
191
|
+
' }',
|
|
192
|
+
" return injectIntoFile(join(opencodeDir, 'AGENTS.md'));",
|
|
193
|
+
'}',
|
|
194
|
+
'',
|
|
195
|
+
'/**',
|
|
196
|
+
' * Remove agent section from a project AGENTS.md.',
|
|
197
|
+
' */',
|
|
198
|
+
'export function removeAgentsMd(projectPath: string): { removed: boolean; path: string } {',
|
|
199
|
+
" const filePath = join(projectPath, 'AGENTS.md');",
|
|
200
|
+
' return { removed: removeBlock(filePath, getClaudeMdMarker()), path: filePath };',
|
|
201
|
+
'}',
|
|
202
|
+
'',
|
|
203
|
+
'/**',
|
|
204
|
+
' * Remove agent section from the global ~/.config/opencode/AGENTS.md.',
|
|
205
|
+
' */',
|
|
206
|
+
'export function removeAgentsMdGlobal(): { removed: boolean; path: string } {',
|
|
207
|
+
" const filePath = join(homedir(), '.config', 'opencode', 'AGENTS.md');",
|
|
208
|
+
' return { removed: removeBlock(filePath, getClaudeMdMarker()), path: filePath };',
|
|
209
|
+
'}',
|
|
210
|
+
'',
|
|
211
|
+
'/**',
|
|
212
|
+
' * Check if the agent marker exists in an AGENTS.md file.',
|
|
213
|
+
' */',
|
|
214
|
+
'export function hasAgentMarkerInAgentsMd(filePath: string): boolean {',
|
|
215
|
+
' if (!existsSync(filePath)) return false;',
|
|
216
|
+
" const content = readFileSync(filePath, 'utf-8');",
|
|
217
|
+
` return content.includes('<!-- ${marker} -->');`,
|
|
218
|
+
'}',
|
|
166
219
|
].join('\n');
|
|
167
220
|
}
|
|
168
221
|
//# sourceMappingURL=inject-claude-md.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inject-claude-md.js","sourceRoot":"","sources":["../../src/templates/inject-claude-md.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC;IAEnC,OAAO;QACL,+EAA+E;QAC/E,oCAAoC;QACpC,mCAAmC;QACnC,8HAA8H;QAC9H,EAAE;QACF,iCAAiC;QACjC,sBAAsB;QACtB,iBAAiB;QACjB,+CAA+C;QAC/C,0BAA0B;QAC1B,GAAG;QACH,EAAE;QACF,KAAK;QACL,iDAAiD;QACjD,wEAAwE;QACxE,6CAA6C;QAC7C,KAAK;QACL,2HAA2H;QAC3H,kDAAkD;QAClD,iDAAiD;QACjD,EAAE;QACF,gCAAgC;QAChC,wDAAwD;QACxD,uBAAuB;QACvB,KAAK;QACL,EAAE;QACF,qDAAqD;QACrD,EAAE;QACF,yCAAyC;QACzC,qDAAqD;QACrD,iDAAiD;QACjD,0BAA0B;QAC1B,sHAAsH;QACtH,kDAAkD;QAClD,yBAAyB;QACzB,OAAO;QACP,wGAAwG;QACxG,gDAAgD;QAChD,uBAAuB;QACvB,KAAK;QACL,EAAE;QACF,kEAAkE;QAClE,6EAA6E;QAC7E,sBAAsB;QACtB,GAAG;QACH,EAAE;QACF,KAAK;QACL,6DAA6D;QAC7D,IAAI;QACJ,+DAA+D;QAC/D,0EAA0E;QAC1E,4DAA4D;QAC5D,aAAa,MAAM,SAAS;QAC5B,KAAK;QACL,2DAA2D;QAC3D,sDAAsD;QACtD,gGAAgG;QAChG,EAAE;QACF,mCAAmC;QACnC,yFAAyF;QACzF,EAAE;QACF,YAAY;QACZ,qBAAqB;QACrB,qBAAqB;QACrB,mEAAmE;QACnE,8CAA8C;QAC9C,MAAM;QACN,GAAG;QACH,EAAE;QACF,KAAK;QACL,mDAAmD;QACnD,8DAA8D;QAC9D,iDAAiD;QACjD,KAAK;QACL,qEAAqE;QACrE,0DAA0D;QAC1D,GAAG;QACH,EAAE;QACF,KAAK;QACL,gDAAgD;QAChD,sDAAsD;QACtD,0DAA0D;QAC1D,KAAK;QACL,wDAAwD;QACxD,iDAAiD;QACjD,iCAAiC;QACjC,gDAAgD;QAChD,KAAK;QACL,wDAAwD;QACxD,GAAG;QACH,EAAE;QACF,KAAK;QACL,iDAAiD;QACjD,KAAK;QACL,mEAAmE;QACnE,4CAA4C;QAC5C,qDAAqD;QACrD,kDAAkD;QAClD,iDAAiD;QACjD,mDAAmD;QACnD,sCAAsC;QACtC,+CAA+C;QAC/C,oCAAoC;QACpC,oEAAoE;QACpE,iFAAiF;QACjF,uEAAuE;QACvE,oDAAoD;QACpD,gBAAgB;QAChB,GAAG;QACH,EAAE;QACF,KAAK;QACL,8DAA8D;QAC9D,8DAA8D;QAC9D,uCAAuC;QACvC,KAAK;QACL,8EAA8E;QAC9E,6DAA6D;QAC7D,mFAAmF;QACnF,GAAG;QACH,EAAE;QACF,KAAK;QACL,mDAAmD;QACnD,KAAK;QACL,2FAA2F;QAC3F,oDAAoD;QACpD,mFAAmF;QACnF,GAAG;QACH,EAAE;QACF,KAAK;QACL,4CAA4C;QAC5C,gDAAgD;QAChD,KAAK;QACL,gEAAgE;QAChE,yDAAyD;QACzD,GAAG;QACH,EAAE;QACF,KAAK;QACL,0DAA0D;QAC1D,KAAK;QACL,6DAA6D;QAC7D,4CAA4C;QAC5C,oDAAoD;QACpD,mCAAmC,MAAM,SAAS;QAClD,GAAG;QACH,EAAE;QACF,KAAK;QACL,mEAAmE;QACnE,KAAK;QACL,6DAA6D;QAC7D,4CAA4C;QAC5C,oDAAoD;QACpD,uEAAuE;QACvE,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"inject-claude-md.js","sourceRoot":"","sources":["../../src/templates/inject-claude-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export function generatePackageJson(config) {
|
|
2
2
|
const pkg = {
|
|
3
|
-
name:
|
|
3
|
+
name: config.id,
|
|
4
4
|
version: '1.0.0',
|
|
5
5
|
description: config.description,
|
|
6
6
|
type: 'module',
|
|
@@ -29,6 +29,9 @@ export function generatePackageJson(config) {
|
|
|
29
29
|
'@soleri/core': '^2.0.0',
|
|
30
30
|
zod: '^3.24.2',
|
|
31
31
|
...(config.telegram ? { grammy: '^1.35.0' } : {}),
|
|
32
|
+
...(config.domainPacks?.length
|
|
33
|
+
? Object.fromEntries(config.domainPacks.map((pack) => [pack.package, pack.version ?? '*']))
|
|
34
|
+
: {}),
|
|
32
35
|
},
|
|
33
36
|
optionalDependencies: {
|
|
34
37
|
'@anthropic-ai/sdk': '^0.39.0',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/templates/package-json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/templates/package-json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,MAAM,CAAC,EAAE;QACf,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,eAAe;QACrB,GAAG,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE;QAC9C,OAAO,EAAE;YACP,GAAG,EAAE,kBAAkB;YACvB,KAAK,EAAE,oCAAoC;YAC3C,KAAK,EAAE,oBAAoB;YAC3B,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,QAAQ;YACtB,eAAe,EAAE,uBAAuB;YACxC,GAAG,CAAC,MAAM,CAAC,QAAQ;gBACjB,CAAC,CAAC;oBACE,gBAAgB,EAAE,kCAAkC;oBACpD,cAAc,EAAE,yBAAyB;iBAC1C;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QAC7B,YAAY,EAAE;YACZ,2BAA2B,EAAE,SAAS;YACtC,cAAc,EAAE,QAAQ;YACxB,GAAG,EAAE,SAAS;YACd,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM;gBAC5B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC;gBAC3F,CAAC,CAAC,EAAE,CAAC;SACR;QACD,oBAAoB,EAAE;YACpB,mBAAmB,EAAE,SAAS;SAC/B;QACD,eAAe,EAAE;YACf,aAAa,EAAE,UAAU;YACzB,qBAAqB,EAAE,QAAQ;YAC/B,GAAG,EAAE,SAAS;YACd,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,QAAQ;SACjB;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/templates/readme.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Generate a README.md for the scaffolded agent.
|
|
3
3
|
*/
|
|
4
4
|
export function generateReadme(config) {
|
|
5
|
+
const skillCount = config.skills?.length ?? 17;
|
|
5
6
|
const setupTarget = config.setupTarget ?? 'claude';
|
|
6
7
|
const claudeSetup = setupTarget === 'claude' || setupTarget === 'both';
|
|
7
8
|
const codexSetup = setupTarget === 'codex' || setupTarget === 'both';
|
|
@@ -68,10 +69,10 @@ export function generateReadme(config) {
|
|
|
68
69
|
: []),
|
|
69
70
|
].join('\n\n');
|
|
70
71
|
const skillsLead = claudeSetup && codexSetup
|
|
71
|
-
? `${config.name} ships with
|
|
72
|
+
? `${config.name} ships with ${skillCount} structured workflow skills. In Claude Code they are invocable via \`/<skill-name>\`; in Codex they are available via generated AGENTS.md + local skill files.`
|
|
72
73
|
: claudeSetup
|
|
73
|
-
? `${config.name} ships with
|
|
74
|
-
: `${config.name} ships with
|
|
74
|
+
? `${config.name} ships with ${skillCount} structured workflow skills, invocable via \`/<skill-name>\` in Claude Code:`
|
|
75
|
+
: `${config.name} ships with ${skillCount} structured workflow skills, available via generated AGENTS.md + local skill files in Codex:`;
|
|
75
76
|
const skillsInstallNote = claudeSetup && codexSetup
|
|
76
77
|
? 'Skills are installed to `~/.claude/commands/` and `~/.codex/skills/` during setup. Run `./scripts/setup.sh` to install or reinstall.'
|
|
77
78
|
: claudeSetup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readme.js","sourceRoot":"","sources":["../../src/templates/readme.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,MAAM,CAAC;IACvE,MAAM,UAAU,GAAG,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,MAAM,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,MAAM,iBAAiB,GACrB,WAAW,IAAI,UAAU;QACvB,CAAC,CAAC,qDAAqD;QACvD,CAAC,CAAC,WAAW;YACX,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,sCAAsC,CAAC;IAE/C,MAAM,aAAa,GAAG;QACpB,+CAA+C;QAC/C,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,SAAS,GAAG;QAChB,KAAK,MAAM,CAAC,IAAI,4DAA4D;QAC5E,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,0BAA0B,MAAM,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,WAAW;YACb,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,wDAAwD,CAAC;YAC5E,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,4EAA4E,CAAC;YAChF,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,iBAAiB,GAAG;QACxB,GAAG,CAAC,WAAW;YACb,CAAC,CAAC;gBACE;oBACE,iBAAiB;oBACjB,EAAE;oBACF,2DAA2D;oBAC3D,EAAE;oBACF,SAAS;oBACT,GAAG;oBACH,mBAAmB;oBACnB,QAAQ,MAAM,CAAC,EAAE,MAAM;oBACvB,0BAA0B;oBAC1B,kCAAkC;oBAClC,mCAAmC,MAAM,CAAC,EAAE,GAAG;oBAC/C,OAAO;oBACP,KAAK;oBACL,GAAG;oBACH,KAAK;iBACN,CAAC,IAAI,CAAC,IAAI,CAAC;aACb;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU;YACZ,CAAC,CAAC;gBACE;oBACE,WAAW;oBACX,EAAE;oBACF,qCAAqC;oBACrC,EAAE;oBACF,SAAS;oBACT,gBAAgB,MAAM,CAAC,EAAE,GAAG;oBAC5B,kBAAkB;oBAClB,8BAA8B,MAAM,CAAC,EAAE,kBAAkB;oBACzD,KAAK;iBACN,CAAC,IAAI,CAAC,IAAI,CAAC;aACb;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,MAAM,UAAU,GACd,WAAW,IAAI,UAAU;QACvB,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"readme.js","sourceRoot":"","sources":["../../src/templates/readme.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export function generateSetupScript(config) {
|
|
6
6
|
const setupTarget = config.setupTarget ?? 'claude';
|
|
7
|
-
const claudeSetup = setupTarget === 'claude' || setupTarget === 'both';
|
|
8
|
-
const codexSetup = setupTarget === 'codex' || setupTarget === 'both';
|
|
9
|
-
const
|
|
7
|
+
const claudeSetup = setupTarget === 'claude' || setupTarget === 'both' || setupTarget === 'all';
|
|
8
|
+
const codexSetup = setupTarget === 'codex' || setupTarget === 'both' || setupTarget === 'all';
|
|
9
|
+
const opencodeSetup = setupTarget === 'opencode' || setupTarget === 'all';
|
|
10
|
+
const hostParts = [
|
|
11
|
+
...(claudeSetup ? ['Claude Code'] : []),
|
|
12
|
+
...(codexSetup ? ['Codex'] : []),
|
|
13
|
+
...(opencodeSetup ? ['OpenCode'] : []),
|
|
14
|
+
];
|
|
15
|
+
const hostLabel = hostParts.join(' + ');
|
|
10
16
|
const claudeSection = claudeSetup
|
|
11
17
|
? `
|
|
12
18
|
# Check Claude Code
|
|
@@ -188,6 +194,102 @@ if [ -d "$SKILLS_DIR" ]; then
|
|
|
188
194
|
done
|
|
189
195
|
echo "[ok] Codex skills: $skill_installed installed, $skill_skipped already present"
|
|
190
196
|
fi
|
|
197
|
+
`
|
|
198
|
+
: '';
|
|
199
|
+
const opencodeSection = opencodeSetup
|
|
200
|
+
? `
|
|
201
|
+
# Check and install OpenCode (Soleri fork with title branding)
|
|
202
|
+
if ! command -v opencode &>/dev/null; then
|
|
203
|
+
echo ""
|
|
204
|
+
INSTALLED=false
|
|
205
|
+
# Try Go install from Soleri fork (supports title branding)
|
|
206
|
+
if command -v go &>/dev/null; then
|
|
207
|
+
echo "Installing OpenCode (Soleri fork) via go install..."
|
|
208
|
+
if go install github.com/adrozdenko/opencode@latest 2>/dev/null; then
|
|
209
|
+
if command -v opencode &>/dev/null; then
|
|
210
|
+
echo "[ok] OpenCode installed from Soleri fork ($(opencode --version 2>/dev/null || echo 'installed'))"
|
|
211
|
+
INSTALLED=true
|
|
212
|
+
fi
|
|
213
|
+
fi
|
|
214
|
+
fi
|
|
215
|
+
# Fallback: upstream npm package (no title branding)
|
|
216
|
+
if [ "$INSTALLED" = false ]; then
|
|
217
|
+
echo "Installing OpenCode via npm (upstream — title branding requires Go)..."
|
|
218
|
+
npm install -g opencode-ai
|
|
219
|
+
if command -v opencode &>/dev/null; then
|
|
220
|
+
echo "[ok] OpenCode installed ($(opencode --version 2>/dev/null || echo 'unknown version'))"
|
|
221
|
+
else
|
|
222
|
+
echo ""
|
|
223
|
+
echo "Warning: Could not install OpenCode automatically."
|
|
224
|
+
echo "Install manually using one of:"
|
|
225
|
+
echo " go install github.com/adrozdenko/opencode@latest (recommended — includes title branding)"
|
|
226
|
+
echo " npm install -g opencode-ai (upstream)"
|
|
227
|
+
echo ""
|
|
228
|
+
fi
|
|
229
|
+
fi
|
|
230
|
+
else
|
|
231
|
+
echo "[ok] OpenCode found ($(opencode --version 2>/dev/null || echo 'installed'))"
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
# Register MCP server with OpenCode
|
|
235
|
+
echo ""
|
|
236
|
+
echo "Registering ${config.name} with OpenCode..."
|
|
237
|
+
OPENCODE_CONFIG="$HOME/.opencode.json"
|
|
238
|
+
AGENT_DIST="$AGENT_DIR/dist/index.js"
|
|
239
|
+
|
|
240
|
+
OPENCODE_CONFIG="$OPENCODE_CONFIG" AGENT_NAME="$AGENT_NAME" AGENT_DIST="$AGENT_DIST" node <<'NODE'
|
|
241
|
+
const fs = require('node:fs');
|
|
242
|
+
const path = process.env.OPENCODE_CONFIG;
|
|
243
|
+
const agentName = process.env.AGENT_NAME;
|
|
244
|
+
const distPath = process.env.AGENT_DIST;
|
|
245
|
+
|
|
246
|
+
let config = {};
|
|
247
|
+
if (fs.existsSync(path)) {
|
|
248
|
+
try {
|
|
249
|
+
const raw = fs.readFileSync(path, 'utf-8');
|
|
250
|
+
const stripped = raw.replace(/^\\s*\\/\\/.*$/gm, '');
|
|
251
|
+
config = JSON.parse(stripped);
|
|
252
|
+
} catch {
|
|
253
|
+
config = {};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (!config.mcp || typeof config.mcp !== 'object') {
|
|
258
|
+
config.mcp = {};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
config.mcp[agentName] = {
|
|
262
|
+
type: 'local',
|
|
263
|
+
command: ['node', distPath],
|
|
264
|
+
enabled: true,
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
fs.writeFileSync(path, JSON.stringify(config, null, 2) + '\\n', 'utf-8');
|
|
268
|
+
NODE
|
|
269
|
+
echo "[ok] Registered ${config.name} as MCP server (OpenCode)"
|
|
270
|
+
|
|
271
|
+
# Create launcher script — type "${config.id}" to start OpenCode
|
|
272
|
+
LAUNCHER_PATH="/usr/local/bin/$AGENT_NAME"
|
|
273
|
+
LAUNCHER_CONTENT="#!/usr/bin/env bash
|
|
274
|
+
# Soleri agent launcher — starts OpenCode with $AGENT_NAME MCP agent
|
|
275
|
+
cd \\"$AGENT_DIR\\" || exit 1
|
|
276
|
+
exec opencode \\"\\$@\\""
|
|
277
|
+
|
|
278
|
+
if [ -w "/usr/local/bin" ]; then
|
|
279
|
+
echo "$LAUNCHER_CONTENT" > "$LAUNCHER_PATH"
|
|
280
|
+
chmod +x "$LAUNCHER_PATH"
|
|
281
|
+
echo "[ok] Launcher created: type \\"${config.id}\\" to start OpenCode"
|
|
282
|
+
else
|
|
283
|
+
echo "$LAUNCHER_CONTENT" > "$AGENT_DIR/scripts/$AGENT_NAME"
|
|
284
|
+
chmod +x "$AGENT_DIR/scripts/$AGENT_NAME"
|
|
285
|
+
if command -v sudo &>/dev/null; then
|
|
286
|
+
sudo ln -sf "$AGENT_DIR/scripts/$AGENT_NAME" "$LAUNCHER_PATH" 2>/dev/null && \\
|
|
287
|
+
echo "[ok] Launcher created: type \\"${config.id}\\" to start OpenCode" || \\
|
|
288
|
+
echo "Note: Run 'sudo ln -sf $AGENT_DIR/scripts/$AGENT_NAME $LAUNCHER_PATH' to enable \\"${config.id}\\" command"
|
|
289
|
+
else
|
|
290
|
+
echo "Note: Add $AGENT_DIR/scripts to PATH, or symlink $AGENT_DIR/scripts/$AGENT_NAME to /usr/local/bin/$AGENT_NAME"
|
|
291
|
+
fi
|
|
292
|
+
fi
|
|
191
293
|
`
|
|
192
294
|
: '';
|
|
193
295
|
const nextSteps = [
|
|
@@ -199,6 +301,9 @@ fi
|
|
|
199
301
|
? ['echo " - Start a new Claude Code session (or restart if one is open)"']
|
|
200
302
|
: []),
|
|
201
303
|
...(codexSetup ? ['echo " - Start a new Codex session (or restart if one is open)"'] : []),
|
|
304
|
+
...(opencodeSetup
|
|
305
|
+
? ['echo " - Start a new OpenCode session (or restart if one is open)"']
|
|
306
|
+
: []),
|
|
202
307
|
`echo " - Say: \\"Hello, ${config.name}!\\""`,
|
|
203
308
|
'echo ""',
|
|
204
309
|
`echo "${config.name} is ready."`,
|
|
@@ -239,6 +344,7 @@ fi
|
|
|
239
344
|
${claudeSection}
|
|
240
345
|
${hookPackSection}
|
|
241
346
|
${codexSection}
|
|
347
|
+
${opencodeSection}
|
|
242
348
|
${nextSteps}
|
|
243
349
|
`;
|
|
244
350
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/templates/setup-script.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/templates/setup-script.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,38 @@ const ENGINE_RULES_LINES = [
|
|
|
23
23
|
'',
|
|
24
24
|
"Shared behavioral rules for all Soleri agents. The active agent's facade table provides tool names.",
|
|
25
25
|
'',
|
|
26
|
+
// ─── What is Soleri ─────────────────────────────────────
|
|
27
|
+
'## What is Soleri',
|
|
28
|
+
'<!-- soleri:what-is-soleri -->',
|
|
29
|
+
'',
|
|
30
|
+
'You are powered by the **Soleri engine** — an intelligence framework that makes AI agents learn, remember, and improve over time. You are not a stateless chatbot. You are a knowledge-driven agent with:',
|
|
31
|
+
'',
|
|
32
|
+
"- **Vault** — your knowledge graph (Zettelkasten). Patterns, anti-patterns, principles you've learned. Grows with every session.",
|
|
33
|
+
'- **Brain** — pattern learning loop. Tracks what works (strengths) and recommends approaches based on past success.',
|
|
34
|
+
'- **Memory** — session history that persists across conversations and projects.',
|
|
35
|
+
'- **Planning** — structured workflow: plan → approve → execute → reconcile → capture knowledge.',
|
|
36
|
+
'- **Packs** — installable capability bundles (knowledge + skills + hooks). Add domains without code changes.',
|
|
37
|
+
'',
|
|
38
|
+
'### The 5-Step Rhythm',
|
|
39
|
+
'',
|
|
40
|
+
'Every task follows this cycle — each iteration makes the next one better:',
|
|
41
|
+
'',
|
|
42
|
+
'1. **Search** — check vault for existing patterns before deciding anything',
|
|
43
|
+
'2. **Plan** — create a structured plan, get user approval',
|
|
44
|
+
'3. **Work** — execute with vault-informed decisions',
|
|
45
|
+
'4. **Capture** — persist what you learned (patterns, anti-patterns, decisions)',
|
|
46
|
+
'5. **Complete** — reconcile, capture knowledge, feed the brain',
|
|
47
|
+
'',
|
|
48
|
+
'### Growing Your Capabilities',
|
|
49
|
+
'',
|
|
50
|
+
'You start with core capabilities (vault, brain, planning, memory). To add more:',
|
|
51
|
+
'',
|
|
52
|
+
'- **Install packs**: `soleri pack install <name>` — adds knowledge, skills, and hooks for a domain',
|
|
53
|
+
'- **Capture knowledge**: every pattern you capture makes you smarter for next time',
|
|
54
|
+
'- **Add domains**: `soleri add-domain <name>` — expands your expertise',
|
|
55
|
+
'',
|
|
56
|
+
'When a user asks "what can you do?" — list your current domains and capabilities from your activation context, not a generic list.',
|
|
57
|
+
'',
|
|
26
58
|
// ─── Response Integrity ─────────────────────────────────
|
|
27
59
|
'## Response Integrity',
|
|
28
60
|
'<!-- soleri:response-integrity -->',
|
|
@@ -41,14 +73,17 @@ const ENGINE_RULES_LINES = [
|
|
|
41
73
|
'',
|
|
42
74
|
"If in doubt, don't save. Less memory with high signal beats more memory with noise.",
|
|
43
75
|
'',
|
|
44
|
-
// ─── Vault-First Protocol
|
|
45
|
-
'## Vault as Source of Truth',
|
|
76
|
+
// ─── Vault-First Protocol (Zettelkasten) ─────────────────
|
|
77
|
+
'## Vault as Source of Truth (Zettelkasten)',
|
|
46
78
|
'<!-- soleri:vault-protocol -->',
|
|
47
79
|
'',
|
|
48
|
-
'
|
|
49
|
-
'
|
|
50
|
-
'-
|
|
51
|
-
'-
|
|
80
|
+
'The vault is a **Zettelkasten** — a connected knowledge graph. Every knowledge operation follows Zettelkasten principles: atomic entries, typed links, dense connections.',
|
|
81
|
+
'',
|
|
82
|
+
'- **MANDATORY**: Consult the vault BEFORE every decision — search + traverse the link graph.',
|
|
83
|
+
'- Lookup order: 1) VAULT search → 2) VAULT traverse (follow links 2 hops) → 3) MEMORY → 4) CODEBASE → 5) WEB/TRAINING.',
|
|
84
|
+
"- **Search + Traverse**: Don't just search — traverse from the best result to discover connected knowledge and anti-patterns.",
|
|
85
|
+
'- Check `contradicts` links to know what to avoid. Check `sequences` links for ordering dependencies.',
|
|
86
|
+
'- Persist lessons: capture + link. An unlinked entry is incomplete.',
|
|
52
87
|
'- Exceptions: runtime errors with stack traces → codebase first; user explicitly asks to search web.',
|
|
53
88
|
'',
|
|
54
89
|
// ─── Planning ────────────────────────────────────────────
|
|
@@ -152,20 +187,25 @@ const ENGINE_RULES_LINES = [
|
|
|
152
187
|
'refactor: simplify data fetching logic',
|
|
153
188
|
'```',
|
|
154
189
|
'',
|
|
155
|
-
// ─── Knowledge Capture
|
|
190
|
+
// ─── Knowledge Capture (Zettelkasten) ───────────────────
|
|
156
191
|
'## Knowledge Capture',
|
|
157
192
|
'<!-- soleri:knowledge-capture -->',
|
|
158
193
|
'',
|
|
159
|
-
"**MANDATORY**: Persist lessons, don't just promise them.",
|
|
194
|
+
"**MANDATORY**: Persist lessons, don't just promise them. **Always link after capturing.**",
|
|
160
195
|
'',
|
|
161
196
|
'When you learn something that should persist:',
|
|
162
197
|
'1. **DON\'T** just say "I will remember this"',
|
|
163
198
|
'2. **DO** call `op:capture_knowledge` to persist to vault',
|
|
164
|
-
|
|
199
|
+
'3. **DO** review `suggestedLinks` in the capture response',
|
|
200
|
+
'4. **DO** create links for relevant suggestions: `op:link_entries`',
|
|
201
|
+
"5. **DO** update relevant files if it's a behavioral change",
|
|
202
|
+
'',
|
|
203
|
+
'An unlinked entry is an orphan — it adds noise, not knowledge.',
|
|
165
204
|
'',
|
|
166
205
|
'| Type | Op | Persists To |',
|
|
167
206
|
'|------|-----|-------------|',
|
|
168
207
|
'| Patterns/Anti-patterns | `op:capture_knowledge` | vault |',
|
|
208
|
+
'| Links between entries | `op:link_entries` | vault_links table |',
|
|
169
209
|
'| Quick capture | `op:capture_quick` | vault |',
|
|
170
210
|
'| Session summaries | `op:session_capture` | memory |',
|
|
171
211
|
'',
|
|
@@ -259,12 +299,9 @@ const ENGINE_RULES_LINES = [
|
|
|
259
299
|
'',
|
|
260
300
|
'### Session Start Protocol',
|
|
261
301
|
'',
|
|
262
|
-
'
|
|
263
|
-
'
|
|
264
|
-
'
|
|
265
|
-
'3. Check for plans awaiting reconciliation via `op:check_persistence`:',
|
|
266
|
-
' - `executing` → Remind user to call `op:plan_reconcile`.',
|
|
267
|
-
' - `reconciling` → Remind user to call `op:plan_complete_lifecycle`.',
|
|
302
|
+
'Do NOT call tools automatically on session start — just greet the user in character.',
|
|
303
|
+
'Call `op:register` only when you need project context for a task (not on every message).',
|
|
304
|
+
'Call `op:activate` only when checking evolved capabilities or recovering session state.',
|
|
268
305
|
'',
|
|
269
306
|
'### Context Compaction',
|
|
270
307
|
'',
|
|
@@ -283,7 +320,7 @@ const ENGINE_RULES_LINES = [
|
|
|
283
320
|
'|---------|-------------|',
|
|
284
321
|
'| `soleri agent status` | Health check — version, packs, vault, update availability |',
|
|
285
322
|
'| `soleri agent update` | Update engine to latest compatible version (`--check` for dry run) |',
|
|
286
|
-
'| `soleri agent refresh` | Regenerate CLAUDE.md from latest forge templates (`--dry-run` to preview) |',
|
|
323
|
+
'| `soleri agent refresh` | Regenerate AGENTS.md/CLAUDE.md from latest forge templates (`--dry-run` to preview) |',
|
|
287
324
|
'| `soleri agent diff` | Show drift between current templates and latest engine |',
|
|
288
325
|
'| `soleri doctor` | Full system health and project status check |',
|
|
289
326
|
'| `soleri dev` | Run agent in development mode (stdio MCP) |',
|
|
@@ -324,7 +361,7 @@ const ENGINE_RULES_LINES = [
|
|
|
324
361
|
'',
|
|
325
362
|
'| Command | What it does |',
|
|
326
363
|
'|---------|-------------|',
|
|
327
|
-
'| `soleri install` | Register agent as MCP server (`--target claude\\|codex\\|
|
|
364
|
+
'| `soleri install` | Register agent as MCP server (`--target opencode\\|claude\\|codex\\|all`) |',
|
|
328
365
|
'| `soleri uninstall` | Remove agent MCP server entry |',
|
|
329
366
|
'| `soleri governance --show` | Show vault governance policy |',
|
|
330
367
|
'| `soleri governance --preset <name>` | Set policy preset (strict\\|moderate\\|permissive) |',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB;IACnC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,kBAAkB,GAAa;IACnC,QAAQ,aAAa,MAAM;IAC3B,EAAE;IACF,uBAAuB;IACvB,EAAE;IACF,qGAAqG;IACrG,EAAE;IAEF,2DAA2D;IAC3D,uBAAuB;IACvB,oCAAoC;IACpC,EAAE;IACF,8FAA8F;IAC9F,uFAAuF;IACvF,EAAE;IAEF,0DAA0D;IAC1D,wBAAwB;IACxB,gCAAgC;IAChC,EAAE;IACF,2FAA2F;IAC3F,EAAE;IACF,2GAA2G;IAC3G,+KAA+K;IAC/K,EAAE;IACF,qFAAqF;IACrF,EAAE;IAEF,4DAA4D;IAC5D,
|
|
1
|
+
{"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"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"}
|