@soleri/cli 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/code-reviewer/.claude/hookify.focus-ring-required.local.md +21 -0
  2. package/code-reviewer/.claude/hookify.no-ai-attribution.local.md +18 -0
  3. package/code-reviewer/.claude/hookify.no-any-types.local.md +18 -0
  4. package/code-reviewer/.claude/hookify.no-console-log.local.md +21 -0
  5. package/code-reviewer/.claude/hookify.no-important.local.md +18 -0
  6. package/code-reviewer/.claude/hookify.no-inline-styles.local.md +21 -0
  7. package/code-reviewer/.claude/hookify.semantic-html.local.md +18 -0
  8. package/code-reviewer/.claude/hookify.ux-touch-targets.local.md +18 -0
  9. package/code-reviewer/.mcp.json +11 -0
  10. package/code-reviewer/README.md +346 -0
  11. package/code-reviewer/package-lock.json +4484 -0
  12. package/code-reviewer/package.json +45 -0
  13. package/code-reviewer/scripts/copy-assets.js +15 -0
  14. package/code-reviewer/scripts/setup.sh +130 -0
  15. package/code-reviewer/skills/brainstorming/SKILL.md +170 -0
  16. package/code-reviewer/skills/code-patrol/SKILL.md +176 -0
  17. package/code-reviewer/skills/context-resume/SKILL.md +143 -0
  18. package/code-reviewer/skills/executing-plans/SKILL.md +201 -0
  19. package/code-reviewer/skills/fix-and-learn/SKILL.md +164 -0
  20. package/code-reviewer/skills/health-check/SKILL.md +225 -0
  21. package/code-reviewer/skills/second-opinion/SKILL.md +142 -0
  22. package/code-reviewer/skills/systematic-debugging/SKILL.md +230 -0
  23. package/code-reviewer/skills/verification-before-completion/SKILL.md +170 -0
  24. package/code-reviewer/skills/writing-plans/SKILL.md +207 -0
  25. package/code-reviewer/src/__tests__/facades.test.ts +598 -0
  26. package/code-reviewer/src/activation/activate.ts +125 -0
  27. package/code-reviewer/src/activation/claude-md-content.ts +217 -0
  28. package/code-reviewer/src/activation/inject-claude-md.ts +113 -0
  29. package/code-reviewer/src/extensions/index.ts +47 -0
  30. package/code-reviewer/src/extensions/ops/example.ts +28 -0
  31. package/code-reviewer/src/identity/persona.ts +62 -0
  32. package/code-reviewer/src/index.ts +278 -0
  33. package/code-reviewer/src/intelligence/data/architecture.json +5 -0
  34. package/code-reviewer/src/intelligence/data/code-review.json +5 -0
  35. package/code-reviewer/tsconfig.json +30 -0
  36. package/code-reviewer/vitest.config.ts +23 -0
  37. package/dist/commands/create.js +6 -0
  38. package/dist/commands/create.js.map +1 -1
  39. package/dist/commands/extend.d.ts +2 -0
  40. package/dist/commands/extend.js +167 -0
  41. package/dist/commands/extend.js.map +1 -0
  42. package/dist/main.js +2 -0
  43. package/dist/main.js.map +1 -1
  44. package/dist/prompts/archetypes.d.ts +21 -0
  45. package/dist/prompts/archetypes.js +183 -0
  46. package/dist/prompts/archetypes.js.map +1 -0
  47. package/dist/prompts/create-wizard.d.ts +1 -1
  48. package/dist/prompts/create-wizard.js +295 -76
  49. package/dist/prompts/create-wizard.js.map +1 -1
  50. package/dist/prompts/playbook.d.ts +63 -0
  51. package/dist/prompts/playbook.js +250 -0
  52. package/dist/prompts/playbook.js.map +1 -0
  53. package/package.json +1 -1
  54. package/src/commands/create.ts +6 -0
  55. package/src/commands/extend.ts +197 -0
  56. package/src/main.ts +2 -0
  57. package/src/prompts/archetypes.ts +212 -0
  58. package/src/prompts/create-wizard.ts +345 -69
  59. package/src/prompts/playbook.ts +301 -0
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { dirname, join } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ import {
9
+ createAgentRuntime,
10
+ createSemanticFacades,
11
+ createDomainFacades,
12
+ registerAllFacades,
13
+ seedDefaultPlaybooks,
14
+ wrapWithMiddleware,
15
+ } from '@soleri/core';
16
+ import type { OpDefinition, AgentExtensions } from '@soleri/core';
17
+ import { z } from 'zod';
18
+ import { PERSONA, getPersonaPrompt } from './identity/persona.js';
19
+ import { activateAgent, deactivateAgent } from './activation/activate.js';
20
+ import { injectClaudeMd, injectClaudeMdGlobal, hasAgentMarker } from './activation/inject-claude-md.js';
21
+
22
+ const __dirname = dirname(fileURLToPath(import.meta.url));
23
+
24
+ async function main(): Promise<void> {
25
+ // ─── Runtime — vault, brain, planner, curator, LLM, key pools ───
26
+ const runtime = createAgentRuntime({
27
+ agentId: 'code-reviewer',
28
+ dataDir: join(__dirname, 'intelligence', 'data'),
29
+ });
30
+
31
+ const tag = PERSONA.name.toLowerCase();
32
+
33
+ // Seed built-in playbooks (idempotent)
34
+ const seedResult = seedDefaultPlaybooks(runtime.vault);
35
+ if (seedResult.seeded > 0) {
36
+ console.error(`[${tag}] Seeded ${seedResult.seeded} built-in playbooks`);
37
+ }
38
+
39
+ const stats = runtime.vault.stats();
40
+ console.error(`[${tag}] Vault: ${stats.totalEntries} entries, Brain: ${runtime.brain.getVocabularySize()} terms`);
41
+
42
+ const llmAvail = runtime.llmClient.isAvailable();
43
+ console.error(`[${tag}] LLM: OpenAI ${llmAvail.openai ? 'available' : 'not configured'}, Anthropic ${llmAvail.anthropic ? 'available' : 'not configured'}`);
44
+
45
+ // ─── Agent-specific ops (reference persona + activation) ────────
46
+ const agentOps: OpDefinition[] = [
47
+ {
48
+ name: 'health',
49
+ description: 'Health check — vault status and agent info.',
50
+ auth: 'read',
51
+ handler: async () => {
52
+ const s = runtime.vault.stats();
53
+ return {
54
+ status: 'ok',
55
+ agent: { name: PERSONA.name, role: PERSONA.role },
56
+ vault: { entries: s.totalEntries, domains: Object.keys(s.byDomain) },
57
+ };
58
+ },
59
+ },
60
+ {
61
+ name: 'identity',
62
+ description: 'Get agent identity — name, role, principles. Uses IdentityManager with PERSONA fallback.',
63
+ auth: 'read',
64
+ handler: async () => {
65
+ const identity = runtime.identityManager.getIdentity('code-reviewer');
66
+ if (identity) return identity;
67
+ return PERSONA;
68
+ },
69
+ },
70
+ {
71
+ name: 'activate',
72
+ description: 'Activate agent persona — returns full context for Claude to adopt. Say "Hello, Code Reviewer!" to trigger.',
73
+ auth: 'read',
74
+ schema: z.object({
75
+ projectPath: z.string().optional().default('.'),
76
+ deactivate: z.boolean().optional(),
77
+ }),
78
+ handler: async (params) => {
79
+ if (params.deactivate) {
80
+ return deactivateAgent();
81
+ }
82
+ // Seed identity from PERSONA on first activation
83
+ if (!runtime.identityManager.getIdentity('code-reviewer')) {
84
+ runtime.identityManager.setIdentity('code-reviewer', {
85
+ name: PERSONA.name,
86
+ role: PERSONA.role,
87
+ description: PERSONA.description ?? '',
88
+ personality: PERSONA.principles ?? [],
89
+ changedBy: 'system',
90
+ changeReason: 'Initial identity seeded from PERSONA',
91
+ });
92
+ }
93
+ return activateAgent(runtime.vault, (params.projectPath as string) ?? '.', runtime.planner);
94
+ },
95
+ },
96
+ {
97
+ name: 'inject_claude_md',
98
+ description: 'Inject agent sections into CLAUDE.md — project-level or global (~/.claude/CLAUDE.md). Idempotent.',
99
+ auth: 'write',
100
+ schema: z.object({
101
+ projectPath: z.string().optional().default('.'),
102
+ global: z.boolean().optional().describe('If true, inject into ~/.claude/CLAUDE.md instead of project-level'),
103
+ }),
104
+ handler: async (params) => {
105
+ if (params.global) {
106
+ return injectClaudeMdGlobal();
107
+ }
108
+ return injectClaudeMd((params.projectPath as string) ?? '.');
109
+ },
110
+ },
111
+ {
112
+ name: 'setup',
113
+ description: 'Check setup status — CLAUDE.md configured? Vault has entries? What to do next?',
114
+ auth: 'read',
115
+ schema: z.object({
116
+ projectPath: z.string().optional().default('.'),
117
+ }),
118
+ handler: async (params) => {
119
+ const { existsSync } = await import('node:fs');
120
+ const { join: joinPath } = await import('node:path');
121
+ const { homedir } = await import('node:os');
122
+ const projectPath = (params.projectPath as string) ?? '.';
123
+
124
+ const projectClaudeMd = joinPath(projectPath, 'CLAUDE.md');
125
+ const globalClaudeMd = joinPath(homedir(), '.claude', 'CLAUDE.md');
126
+
127
+ const projectExists = existsSync(projectClaudeMd);
128
+ const projectHasAgent = hasAgentMarker(projectClaudeMd);
129
+ const globalExists = existsSync(globalClaudeMd);
130
+ const globalHasAgent = hasAgentMarker(globalClaudeMd);
131
+
132
+ const s = runtime.vault.stats();
133
+
134
+ const recommendations: string[] = [];
135
+ if (!globalHasAgent && !projectHasAgent) {
136
+ recommendations.push('No CLAUDE.md configured — run inject_claude_md with global: true for all projects, or without for this project');
137
+ } else if (!globalHasAgent) {
138
+ recommendations.push('Global ~/.claude/CLAUDE.md not configured — run inject_claude_md with global: true to enable in all projects');
139
+ }
140
+ if (s.totalEntries === 0) {
141
+ recommendations.push('Vault is empty — add intelligence data or capture knowledge via domain facades');
142
+ }
143
+
144
+ // Check hook status
145
+ const { readdirSync } = await import('node:fs');
146
+ const agentClaudeDir = joinPath(__dirname, '..', '.claude');
147
+ const globalClaudeDir = joinPath(homedir(), '.claude');
148
+
149
+ const hookStatus = { agent: [] as string[], global: [] as string[], missing: [] as string[] };
150
+
151
+ if (existsSync(agentClaudeDir)) {
152
+ try {
153
+ const agentHooks = readdirSync(agentClaudeDir)
154
+ .filter((f: string) => f.startsWith('hookify.') && f.endsWith('.local.md'))
155
+ .map((f: string) => f.replace('hookify.', '').replace('.local.md', ''));
156
+ hookStatus.agent = agentHooks;
157
+
158
+ for (const hook of agentHooks) {
159
+ if (existsSync(joinPath(globalClaudeDir, `hookify.${hook}.local.md`))) {
160
+ hookStatus.global.push(hook);
161
+ } else {
162
+ hookStatus.missing.push(hook);
163
+ }
164
+ }
165
+ } catch {
166
+ // ignore read errors
167
+ }
168
+ }
169
+
170
+ if (hookStatus.missing.length > 0) {
171
+ recommendations.push(`${hookStatus.missing.length} hook(s) not installed globally — run scripts/setup.sh`);
172
+ }
173
+
174
+ if (recommendations.length === 0) {
175
+ recommendations.push('Code Reviewer is fully set up and ready!');
176
+ }
177
+
178
+ return {
179
+ agent: { name: PERSONA.name, role: PERSONA.role },
180
+ claude_md: {
181
+ project: { exists: projectExists, has_agent_section: projectHasAgent },
182
+ global: { exists: globalExists, has_agent_section: globalHasAgent },
183
+ },
184
+ vault: { entries: s.totalEntries, domains: Object.keys(s.byDomain) },
185
+ hooks: hookStatus,
186
+ recommendations,
187
+ };
188
+ },
189
+ },
190
+ ];
191
+
192
+ // ─── Assemble facades ──────────────────────────────────────────
193
+ const semanticFacades = createSemanticFacades(runtime, 'code-reviewer');
194
+ const agentFacade = {
195
+ name: 'code-reviewer_core',
196
+ description: 'Agent-specific operations — health, identity, activation, CLAUDE.md injection, setup.',
197
+ ops: agentOps,
198
+ };
199
+
200
+ const domainFacades = createDomainFacades(runtime, 'code-reviewer', ["code-review","architecture"]);
201
+
202
+ // ─── User extensions (auto-discovered from src/extensions/) ────
203
+ let extensions: AgentExtensions = {};
204
+ try {
205
+ const ext = await import('./extensions/index.js');
206
+ const loader = ext.default ?? (ext as Record<string, unknown>).loadExtensions;
207
+ if (typeof loader === 'function') {
208
+ extensions = loader(runtime);
209
+ } else if (typeof loader === 'object') {
210
+ extensions = loader;
211
+ }
212
+ if (extensions.ops?.length || extensions.facades?.length || extensions.middleware?.length) {
213
+ console.error(`[${tag}] Extensions loaded: ${extensions.ops?.length ?? 0} ops, ${extensions.facades?.length ?? 0} facades, ${extensions.middleware?.length ?? 0} middleware`);
214
+ }
215
+ } catch {
216
+ // No extensions directory or load error — run vanilla
217
+ }
218
+
219
+ // Merge user ops into agent facade
220
+ if (extensions.ops?.length) {
221
+ agentFacade.ops.push(...extensions.ops);
222
+ }
223
+
224
+ // Collect user facades
225
+ const userFacades = extensions.facades ?? [];
226
+
227
+ // Apply middleware to all facades
228
+ const allFacades = [...semanticFacades, agentFacade, ...domainFacades, ...userFacades];
229
+ if (extensions.middleware?.length) {
230
+ wrapWithMiddleware(allFacades, extensions.middleware);
231
+ }
232
+
233
+ // Lifecycle: onStartup
234
+ if (extensions.hooks?.onStartup) {
235
+ await extensions.hooks.onStartup(runtime);
236
+ }
237
+
238
+ // ─── MCP server ────────────────────────────────────────────────
239
+ const server = new McpServer({
240
+ name: 'code-reviewer-mcp',
241
+ version: '1.0.0',
242
+ });
243
+
244
+ server.prompt('persona', 'Get agent persona and principles', async () => ({
245
+ messages: [{ role: 'assistant' as const, content: { type: 'text' as const, text: getPersonaPrompt() } }],
246
+ }));
247
+
248
+ registerAllFacades(server, allFacades);
249
+
250
+ console.error(`[${tag}] ${PERSONA.name} — ${PERSONA.role}`);
251
+ console.error(`[${tag}] Registered ${allFacades.length} facades with ${allFacades.reduce((sum, f) => sum + f.ops.length, 0)} operations`);
252
+
253
+ // ─── Transport + shutdown ──────────────────────────────────────
254
+ const transport = new StdioServerTransport();
255
+ await server.connect(transport);
256
+ console.error(`[${tag}] Connected via stdio transport`);
257
+ console.error(`[${tag}] Say "Hello, ${PERSONA.name}!" to activate`);
258
+
259
+ const shutdown = async (): Promise<void> => {
260
+ console.error(`[${tag}] Shutting down...`);
261
+ if (extensions.hooks?.onShutdown) {
262
+ try {
263
+ await extensions.hooks.onShutdown(runtime);
264
+ } catch (err) {
265
+ console.error(`[${tag}] Extension shutdown error:`, err);
266
+ }
267
+ }
268
+ runtime.close();
269
+ process.exit(0);
270
+ };
271
+ process.on('SIGTERM', shutdown);
272
+ process.on('SIGINT', shutdown);
273
+ }
274
+
275
+ main().catch((err) => {
276
+ console.error('[code-reviewer] Fatal error:', err);
277
+ process.exit(1);
278
+ });
@@ -0,0 +1,5 @@
1
+ {
2
+ "domain": "architecture",
3
+ "version": "1.0.0",
4
+ "entries": []
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "domain": "code-review",
3
+ "version": "1.0.0",
4
+ "entries": []
5
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": [
7
+ "ES2022"
8
+ ],
9
+ "outDir": "dist",
10
+ "rootDir": "src",
11
+ "strict": true,
12
+ "esModuleInterop": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationMap": true,
16
+ "sourceMap": true,
17
+ "forceConsistentCasingInFileNames": true,
18
+ "skipLibCheck": true,
19
+ "noEmitOnError": true
20
+ },
21
+ "include": [
22
+ "src/**/*.ts"
23
+ ],
24
+ "exclude": [
25
+ "node_modules",
26
+ "dist",
27
+ "src/**/*.test.ts",
28
+ "src/__tests__/**"
29
+ ]
30
+ }
@@ -0,0 +1,23 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: 'node',
6
+ pool: 'forks',
7
+ poolOptions: {
8
+ forks: {
9
+ singleFork: true,
10
+ maxForks: 2,
11
+ minForks: 1,
12
+ },
13
+ },
14
+ testTimeout: 30_000,
15
+ hookTimeout: 10_000,
16
+ teardownTimeout: 5_000,
17
+ coverage: {
18
+ provider: 'v8',
19
+ include: ['src/**/*.ts'],
20
+ exclude: ['src/**/*.test.ts', 'src/__tests__/**', 'src/index.ts'],
21
+ },
22
+ },
23
+ });
@@ -74,6 +74,12 @@ export function registerCreate(program) {
74
74
  p.log.info(`Will create ${preview.files.length} files in ${preview.agentDir}`);
75
75
  p.log.info(`Facades: ${preview.facades.map((f) => f.name).join(', ')}`);
76
76
  p.log.info(`Domains: ${preview.domains.join(', ')}`);
77
+ if (config.tone) {
78
+ p.log.info(`Tone: ${config.tone}`);
79
+ }
80
+ if (config.skills?.length) {
81
+ p.log.info(`Skills: ${config.skills.length} selected`);
82
+ }
77
83
  if (selectedPacks.length > 0) {
78
84
  p.log.info(`Hook packs: ${selectedPacks.join(', ')}`);
79
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerExtend(program: Command): void;
@@ -0,0 +1,167 @@
1
+ import * as p from '@clack/prompts';
2
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { detectAgent } from '../utils/agent-context.js';
5
+ export function registerExtend(program) {
6
+ const extend = program
7
+ .command('extend')
8
+ .description('Manage agent extensions — custom ops, facades, middleware');
9
+ extend
10
+ .command('init')
11
+ .description('Initialize the extensions directory (if not already present)')
12
+ .action(async () => {
13
+ const ctx = detectAgent();
14
+ if (!ctx) {
15
+ p.log.error('No agent project detected. Run this from an agent root.');
16
+ process.exit(1);
17
+ }
18
+ const extDir = join(ctx.agentPath, 'src', 'extensions');
19
+ if (existsSync(join(extDir, 'index.ts'))) {
20
+ p.log.info('Extensions directory already exists.');
21
+ return;
22
+ }
23
+ const dirs = ['', 'ops', 'facades', 'middleware'];
24
+ for (const d of dirs) {
25
+ mkdirSync(join(extDir, d), { recursive: true });
26
+ }
27
+ const { generateExtensionsIndex, generateExampleOp } = await import('@soleri/forge/lib');
28
+ const config = { id: ctx.agentId, name: ctx.agentId };
29
+ writeFileSync(join(extDir, 'index.ts'), generateExtensionsIndex(config), 'utf-8');
30
+ writeFileSync(join(extDir, 'ops', 'example.ts'), generateExampleOp(config), 'utf-8');
31
+ p.log.success('Extensions directory created at src/extensions/');
32
+ p.log.info('Edit src/extensions/index.ts to register your custom ops, facades, and middleware.');
33
+ });
34
+ extend
35
+ .command('add-op')
36
+ .argument('<name>', 'Operation name in snake_case (e.g., "summarize_pr")')
37
+ .description('Scaffold a new custom op')
38
+ .action(async (name) => {
39
+ const ctx = detectAgent();
40
+ if (!ctx) {
41
+ p.log.error('No agent project detected. Run this from an agent root.');
42
+ process.exit(1);
43
+ }
44
+ const opsDir = join(ctx.agentPath, 'src', 'extensions', 'ops');
45
+ mkdirSync(opsDir, { recursive: true });
46
+ const fileName = name.replace(/_/g, '-');
47
+ const filePath = join(opsDir, `${fileName}.ts`);
48
+ if (existsSync(filePath)) {
49
+ p.log.error(`File already exists: src/extensions/ops/${fileName}.ts`);
50
+ process.exit(1);
51
+ }
52
+ const fnName = 'create' +
53
+ name
54
+ .split('_')
55
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
56
+ .join('') +
57
+ 'Op';
58
+ const content = `import { z } from 'zod';
59
+ import type { OpDefinition, AgentRuntime } from '@soleri/core';
60
+
61
+ export function ${fnName}(runtime: AgentRuntime): OpDefinition {
62
+ return {
63
+ name: '${name}',
64
+ description: 'TODO: describe what this op does',
65
+ auth: 'read',
66
+ schema: z.object({
67
+ // TODO: define your parameters
68
+ }),
69
+ handler: async (params) => {
70
+ // TODO: implement your logic
71
+ // You have access to runtime.vault, runtime.brain, runtime.planner, etc.
72
+ return { status: 'ok' };
73
+ },
74
+ };
75
+ }
76
+ `;
77
+ writeFileSync(filePath, content, 'utf-8');
78
+ p.log.success(`Created src/extensions/ops/${fileName}.ts`);
79
+ p.log.info(`Import ${fnName} in src/extensions/index.ts and add it to the ops array.`);
80
+ });
81
+ extend
82
+ .command('add-facade')
83
+ .argument('<name>', 'Facade name in kebab-case (e.g., "github")')
84
+ .description('Scaffold a new custom facade')
85
+ .action(async (name) => {
86
+ const ctx = detectAgent();
87
+ if (!ctx) {
88
+ p.log.error('No agent project detected. Run this from an agent root.');
89
+ process.exit(1);
90
+ }
91
+ const facadesDir = join(ctx.agentPath, 'src', 'extensions', 'facades');
92
+ mkdirSync(facadesDir, { recursive: true });
93
+ const filePath = join(facadesDir, `${name}.ts`);
94
+ if (existsSync(filePath)) {
95
+ p.log.error(`File already exists: src/extensions/facades/${name}.ts`);
96
+ process.exit(1);
97
+ }
98
+ const facadeName = `${ctx.agentId}_${name.replace(/-/g, '_')}`;
99
+ const className = name
100
+ .split('-')
101
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
102
+ .join('');
103
+ const content = `import { z } from 'zod';
104
+ import type { FacadeConfig, AgentRuntime } from '@soleri/core';
105
+
106
+ export function create${className}Facade(runtime: AgentRuntime): FacadeConfig {
107
+ return {
108
+ name: '${facadeName}',
109
+ description: 'TODO: describe this facade',
110
+ ops: [
111
+ {
112
+ name: 'status',
113
+ description: 'TODO: describe this op',
114
+ auth: 'read',
115
+ schema: z.object({}),
116
+ handler: async () => {
117
+ return { status: 'ok' };
118
+ },
119
+ },
120
+ ],
121
+ };
122
+ }
123
+ `;
124
+ writeFileSync(filePath, content, 'utf-8');
125
+ p.log.success(`Created src/extensions/facades/${name}.ts`);
126
+ p.log.info(`Import and add the facade to src/extensions/index.ts facades array.`);
127
+ p.log.info(`This will register as MCP tool: ${facadeName}`);
128
+ });
129
+ extend
130
+ .command('add-middleware')
131
+ .argument('<name>', 'Middleware name in kebab-case (e.g., "audit-logger")')
132
+ .description('Scaffold a new middleware')
133
+ .action(async (name) => {
134
+ const ctx = detectAgent();
135
+ if (!ctx) {
136
+ p.log.error('No agent project detected. Run this from an agent root.');
137
+ process.exit(1);
138
+ }
139
+ const mwDir = join(ctx.agentPath, 'src', 'extensions', 'middleware');
140
+ mkdirSync(mwDir, { recursive: true });
141
+ const filePath = join(mwDir, `${name}.ts`);
142
+ if (existsSync(filePath)) {
143
+ p.log.error(`File already exists: src/extensions/middleware/${name}.ts`);
144
+ process.exit(1);
145
+ }
146
+ const varName = name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
147
+ const content = `import type { OpMiddleware } from '@soleri/core';
148
+
149
+ export const ${varName}: OpMiddleware = {
150
+ name: '${name}',
151
+ before: async (ctx) => {
152
+ // Runs before every op. Return modified params or throw to reject.
153
+ // console.error(\`[\${ctx.facade}.\${ctx.op}] called\`);
154
+ return ctx.params;
155
+ },
156
+ after: async (ctx) => {
157
+ // Runs after every op. Return modified result or throw.
158
+ return ctx.result;
159
+ },
160
+ };
161
+ `;
162
+ writeFileSync(filePath, content, 'utf-8');
163
+ p.log.success(`Created src/extensions/middleware/${name}.ts`);
164
+ p.log.info('Import and add to src/extensions/index.ts middleware array.');
165
+ });
166
+ }
167
+ //# sourceMappingURL=extend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"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"}
package/dist/main.js CHANGED
@@ -11,6 +11,7 @@ import { registerHooks } from './commands/hooks.js';
11
11
  import { registerGovernance } from './commands/governance.js';
12
12
  import { registerTest } from './commands/test.js';
13
13
  import { registerUpgrade } from './commands/upgrade.js';
14
+ import { registerExtend } from './commands/extend.js';
14
15
  const require = createRequire(import.meta.url);
15
16
  const { version } = require('../package.json');
16
17
  const program = new Command();
@@ -28,5 +29,6 @@ registerHooks(program);
28
29
  registerGovernance(program);
29
30
  registerTest(program);
30
31
  registerUpgrade(program);
32
+ registerExtend(program);
31
33
  program.parse();
32
34
  //# 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,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,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;AAExD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,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,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;AAEtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Pre-built agent archetypes that pre-fill the wizard.
3
+ * Each archetype provides sensible defaults for role, description,
4
+ * domains, principles, skills, and greeting — so the user can
5
+ * scaffold a full agent with minimal typing.
6
+ */
7
+ export interface Archetype {
8
+ value: string;
9
+ label: string;
10
+ hint: string;
11
+ defaults: {
12
+ role: string;
13
+ description: string;
14
+ domains: string[];
15
+ principles: string[];
16
+ skills: string[];
17
+ tone: 'precise' | 'mentor' | 'pragmatic';
18
+ greetingTemplate: (name: string) => string;
19
+ };
20
+ }
21
+ export declare const ARCHETYPES: Archetype[];