@symplek/cli 0.0.0-stage → 0.2.0-beta.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 (75) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +74 -2
  4. package/bin/symplek.js +5 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +44 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/add.d.ts +36 -0
  10. package/dist/commands/add.d.ts.map +1 -0
  11. package/dist/commands/add.js +467 -0
  12. package/dist/commands/add.js.map +1 -0
  13. package/dist/commands/generate.d.ts +26 -0
  14. package/dist/commands/generate.d.ts.map +1 -0
  15. package/dist/commands/generate.js +491 -0
  16. package/dist/commands/generate.js.map +1 -0
  17. package/dist/commands/init.d.ts +46 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +350 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/migrate.d.ts +41 -0
  22. package/dist/commands/migrate.d.ts.map +1 -0
  23. package/dist/commands/migrate.js +518 -0
  24. package/dist/commands/migrate.js.map +1 -0
  25. package/dist/commands/validate.d.ts +252 -0
  26. package/dist/commands/validate.d.ts.map +1 -0
  27. package/dist/commands/validate.js +515 -0
  28. package/dist/commands/validate.js.map +1 -0
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +46 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/models.d.ts +24 -0
  34. package/dist/models.d.ts.map +1 -0
  35. package/dist/models.js +39 -0
  36. package/dist/models.js.map +1 -0
  37. package/dist/naming.d.ts +20 -0
  38. package/dist/naming.d.ts.map +1 -0
  39. package/dist/naming.js +48 -0
  40. package/dist/naming.js.map +1 -0
  41. package/dist/templates/agent/agent.ts.template +41 -0
  42. package/dist/templates/agent/general.yaml.template +34 -0
  43. package/dist/templates/agent/researcher.yaml.template +42 -0
  44. package/dist/templates/agent/reviewer.yaml.template +51 -0
  45. package/dist/templates/project/full/.github/workflows/ci.yml.template +34 -0
  46. package/dist/templates/project/full/.gitignore.template +6 -0
  47. package/dist/templates/project/full/Dockerfile.template +43 -0
  48. package/dist/templates/project/full/README.md.template +77 -0
  49. package/dist/templates/project/full/agents/example.yaml.template +16 -0
  50. package/dist/templates/project/full/package.json.template +30 -0
  51. package/dist/templates/project/full/src/index.ts.template +43 -0
  52. package/dist/templates/project/full/src/symplek.config.ts.template +20 -0
  53. package/dist/templates/project/full/src/tools/index.ts.template +73 -0
  54. package/dist/templates/project/full/tests/example.test.ts.template +49 -0
  55. package/dist/templates/project/full/tsconfig.json.template +18 -0
  56. package/dist/templates/project/minimal/.gitignore.template +6 -0
  57. package/dist/templates/project/minimal/agents/example.yaml.template +16 -0
  58. package/dist/templates/project/minimal/package.json.template +27 -0
  59. package/dist/templates/project/minimal/src/index.ts.template +43 -0
  60. package/dist/templates/project/minimal/src/symplek.config.ts.template +20 -0
  61. package/dist/templates/project/minimal/tsconfig.json.template +18 -0
  62. package/dist/templates/project/standard/.gitignore.template +6 -0
  63. package/dist/templates/project/standard/README.md.template +77 -0
  64. package/dist/templates/project/standard/agents/example.yaml.template +16 -0
  65. package/dist/templates/project/standard/package.json.template +30 -0
  66. package/dist/templates/project/standard/src/index.ts.template +43 -0
  67. package/dist/templates/project/standard/src/symplek.config.ts.template +20 -0
  68. package/dist/templates/project/standard/src/tools/index.ts.template +73 -0
  69. package/dist/templates/project/standard/tests/example.test.ts.template +49 -0
  70. package/dist/templates/project/standard/tsconfig.json.template +18 -0
  71. package/dist/utils/templates.d.ts +41 -0
  72. package/dist/utils/templates.d.ts.map +1 -0
  73. package/dist/utils/templates.js +133 -0
  74. package/dist/utils/templates.js.map +1 -0
  75. package/package.json +60 -3
@@ -0,0 +1,491 @@
1
+ "use strict";
2
+ /**
3
+ * `symplek generate` command - generates TypeScript from YAML agent definitions
4
+ * @description Converts YAML agent definitions to type-safe TypeScript code
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.isHandWritten = isHandWritten;
44
+ exports.generateFile = generateFile;
45
+ exports.generateCommand = generateCommand;
46
+ const node_fs_1 = require("node:fs");
47
+ const path = __importStar(require("node:path"));
48
+ const chalk_1 = __importDefault(require("chalk"));
49
+ const chokidar_1 = require("chokidar");
50
+ const commander_1 = require("commander");
51
+ const glob_1 = require("glob");
52
+ const js_yaml_1 = __importDefault(require("js-yaml"));
53
+ const models_js_1 = require("../models.js");
54
+ const naming_js_1 = require("../naming.js");
55
+ // ─────────────────────────────────────────────────────────────────────────────
56
+ // HELPER FUNCTIONS
57
+ // ─────────────────────────────────────────────────────────────────────────────
58
+ function isToolConfig(tool) {
59
+ return typeof tool === "object" && "name" in tool;
60
+ }
61
+ /** First characters of every file this command writes. */
62
+ const GENERATED_HEADER = "// Generated from";
63
+ /**
64
+ * True when a file is at `filePath` and this command did not write it. Such a
65
+ * file is somebody's work, so nothing here may replace it.
66
+ */
67
+ function isHandWritten(filePath) {
68
+ return ((0, node_fs_1.existsSync)(filePath) &&
69
+ !(0, node_fs_1.readFileSync)(filePath, "utf-8").startsWith(GENERATED_HEADER));
70
+ }
71
+ function toPascalCase(str) {
72
+ const camel = (0, naming_js_1.kebabToCamel)(str);
73
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
74
+ }
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ // SAFE EMITTERS — defend the generated code against injection from the
77
+ // YAML source.
78
+ //
79
+ // Every value that crosses from YAML into the emitted TypeScript MUST pass
80
+ // through one of these helpers. The previous `'${field}'` style template
81
+ // interpolation was unsafe: a YAML name like `x'); evil(); //` produced
82
+ // runnable malicious TS.
83
+ // ─────────────────────────────────────────────────────────────────────────────
84
+ /** Valid JavaScript identifier (used for exported symbols and function refs). */
85
+ const JS_IDENTIFIER_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
86
+ /**
87
+ * Emit a string value as a safe JS string literal. JSON.stringify produces
88
+ * a double-quoted JS string with all needed escapes (quotes, backslashes,
89
+ * newlines, unicode, etc.) — strictly safer than hand-rolled quoting.
90
+ */
91
+ function emitString(value) {
92
+ return JSON.stringify(value);
93
+ }
94
+ /**
95
+ * Emit a number as a JS numeric literal. Rejects non-finite values to
96
+ * prevent `NaN`/`Infinity` literals and to catch type-shape drift early.
97
+ */
98
+ function emitNumber(value, field) {
99
+ if (!Number.isFinite(value)) {
100
+ throw new Error(`Field "${field}" must be a finite number; got ${String(value)}`);
101
+ }
102
+ return JSON.stringify(value);
103
+ }
104
+ /**
105
+ * Validate a string is a safe JavaScript identifier and return it
106
+ * unchanged. Throws on any character outside `/^[a-zA-Z_$][a-zA-Z0-9_$]*$/`.
107
+ * Use this for every value that's emitted UNQUOTED into the generated TS
108
+ * (export names, function-name references, type names).
109
+ */
110
+ function emitIdentifier(value, field) {
111
+ if (!JS_IDENTIFIER_RE.test(value)) {
112
+ throw new Error(`Field "${field}" is not a valid JavaScript identifier: "${value}"`);
113
+ }
114
+ if ((0, naming_js_1.isReservedWord)(value)) {
115
+ throw new Error(`Field "${field}" is a JavaScript reserved word and cannot name an export: "${value}"`);
116
+ }
117
+ return value;
118
+ }
119
+ /**
120
+ * Calculate output file path from input YAML path
121
+ */
122
+ function getOutputPath(yamlPath, outputDir) {
123
+ const baseName = path.basename(yamlPath, ".yaml");
124
+ const dir = outputDir || path.dirname(yamlPath);
125
+ return path.join(dir, `${baseName}.ts`);
126
+ }
127
+ function parseYamlFile(filePath) {
128
+ const errors = [];
129
+ const content = (0, node_fs_1.readFileSync)(filePath, "utf-8");
130
+ const parsed = js_yaml_1.default.load(content);
131
+ // Validate required fields
132
+ if (!parsed.name || typeof parsed.name !== "string") {
133
+ errors.push("Missing required field: name");
134
+ }
135
+ if (!parsed.model || typeof parsed.model !== "string") {
136
+ errors.push("Missing required field: model");
137
+ }
138
+ else if (!(0, models_js_1.isModelId)(parsed.model)) {
139
+ errors.push(`Invalid model id: ${parsed.model}. ${models_js_1.MODEL_ID_HINT}`);
140
+ }
141
+ if (!parsed.systemPrompt || typeof parsed.systemPrompt !== "string") {
142
+ errors.push("Missing required field: systemPrompt");
143
+ }
144
+ // Validate name pattern
145
+ if (parsed.name && !naming_js_1.KEBAB_CASE_REGEX.test(parsed.name)) {
146
+ errors.push(`Invalid agent name: ${parsed.name}. Use kebab-case.`);
147
+ }
148
+ // Validate version is semver-ish if present
149
+ if (parsed.version !== undefined && typeof parsed.version !== "string") {
150
+ errors.push(`version must be a string, got ${typeof parsed.version}`);
151
+ }
152
+ // Validate tags are strings if present
153
+ if (parsed.tags !== undefined) {
154
+ if (!Array.isArray(parsed.tags)) {
155
+ errors.push("tags must be an array of strings");
156
+ }
157
+ else {
158
+ for (const tag of parsed.tags) {
159
+ if (typeof tag !== "string") {
160
+ errors.push(`tag must be a string, got ${typeof tag}`);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ const config = {
166
+ name: parsed.name || "unknown",
167
+ model: parsed.model || models_js_1.DEFAULT_MODEL,
168
+ systemPrompt: parsed.systemPrompt || "",
169
+ description: parsed.description,
170
+ version: parsed.version,
171
+ temperature: parsed.temperature,
172
+ maxTokens: parsed.maxTokens,
173
+ timeout: parsed.timeout,
174
+ tools: parsed.tools,
175
+ operators: parsed.operators,
176
+ tags: parsed.tags,
177
+ metadata: parsed.metadata,
178
+ };
179
+ return { config, errors };
180
+ }
181
+ // ─────────────────────────────────────────────────────────────────────────────
182
+ // TYPESCRIPT GENERATOR (inline for standalone CLI)
183
+ // ─────────────────────────────────────────────────────────────────────────────
184
+ function generateTypeScript(config, sourceFile) {
185
+ const exportName = (0, naming_js_1.kebabToCamel)(config.name);
186
+ const lines = [];
187
+ // Validate identifiers up-front so failures surface before any code is emitted.
188
+ const safeExportName = emitIdentifier(exportName, "exportName");
189
+ // Collect extra import lines required by operators (e.g. fallback agent).
190
+ const extraImports = [];
191
+ // Build ai() options object fields.
192
+ const aiOptions = [];
193
+ aiOptions.push(` model: ${emitString(config.model)},`);
194
+ aiOptions.push(` system: ${emitString(config.systemPrompt)},`);
195
+ if (config.temperature !== undefined) {
196
+ aiOptions.push(` temperature: ${emitNumber(config.temperature, "temperature")},`);
197
+ }
198
+ if (config.maxTokens !== undefined) {
199
+ aiOptions.push(` maxTokens: ${emitNumber(config.maxTokens, "maxTokens")},`);
200
+ }
201
+ if (config.timeout !== undefined) {
202
+ // timeout is a top-level YAML field; wire through the ai() options object.
203
+ aiOptions.push(` timeout: ${emitNumber(config.timeout, "timeout")},`);
204
+ }
205
+ // Tool stubs comment — tool integration requires custom wiring; emit a
206
+ // reminder so the developer knows what to add, but no speculative code.
207
+ if (config.tools && config.tools.length > 0) {
208
+ const toolNames = config.tools.map((tool) => isToolConfig(tool) ? tool.name : tool);
209
+ aiOptions.push(` // TODO: wire tools: ${toolNames.map((n) => emitString(n)).join(", ")}`);
210
+ }
211
+ // Resolve operator chains — must happen before header emit so we can
212
+ // collect extraImports that need to appear at the top of the file.
213
+ const operatorChains = [];
214
+ let enhancedName = "";
215
+ if (config.operators) {
216
+ if (config.operators.retry) {
217
+ const { maxAttempts = 3, baseDelayMs = 1000 } = config.operators.retry;
218
+ operatorChains.push(`.retry(${emitNumber(maxAttempts, "operators.retry.maxAttempts")}, { baseDelayMs: ${emitNumber(baseDelayMs, "operators.retry.baseDelayMs")} })`);
219
+ }
220
+ if (config.operators.timeout) {
221
+ const { ms = 30000 } = config.operators.timeout;
222
+ operatorChains.push(`.timeout(${emitNumber(ms, "operators.timeout.ms")})`);
223
+ }
224
+ if (config.operators.fallback) {
225
+ if (config.operators.fallback.agent) {
226
+ // .fallback() takes an AgentUnit<T>, not a factory function.
227
+ // We call the fallback factory with the same prompt so the caller's
228
+ // intent (retry with a different model) is preserved.
229
+ const fallbackModule = config.operators.fallback.agent;
230
+ const fallbackAgent = emitIdentifier((0, naming_js_1.kebabToCamel)(fallbackModule), "operators.fallback.agent");
231
+ // Import the fallback agent from its module (assumed same directory).
232
+ extraImports.push(`import { ${fallbackAgent} } from "./${fallbackModule}";`);
233
+ // Pass prompt to the fallback factory so it returns an AgentUnit<string>.
234
+ operatorChains.push(`.fallback(${fallbackAgent}(prompt))`);
235
+ }
236
+ else if (config.operators.fallback.value !== undefined) {
237
+ operatorChains.push(`.orElse(${JSON.stringify(config.operators.fallback.value)})`);
238
+ }
239
+ }
240
+ if (operatorChains.length > 0) {
241
+ enhancedName = emitIdentifier(`${safeExportName}WithOperators`, "enhancedName");
242
+ }
243
+ }
244
+ // ── Emit ───────────────────────────────────────────────────────────────────
245
+ // Header
246
+ lines.push(`${GENERATED_HEADER} ${emitString(sourceFile)}`);
247
+ lines.push("// Do not edit directly - regenerate with: symplek generate");
248
+ lines.push("");
249
+ // Imports: AgentUnit from the public @symplek/core root; ai() from the server
250
+ // subpath (requires "@symplek/core" in the consuming project's dependencies).
251
+ lines.push('import { AgentUnit } from "@symplek/core";');
252
+ lines.push('import { ai } from "@symplek/core/server";');
253
+ for (const imp of extraImports) {
254
+ lines.push(imp);
255
+ }
256
+ lines.push("");
257
+ if (config.description !== undefined) {
258
+ // The description lands inside a block comment. JSON escaping leaves
259
+ // `*/` intact, which would end the comment and turn the rest of the
260
+ // description into code, so the closing sequence is broken up.
261
+ const description = emitString(config.description)
262
+ .slice(1, -1)
263
+ .replace(/\*\//g, "*\\/");
264
+ lines.push(`/** ${description} */`);
265
+ }
266
+ // The agent is a factory function that binds the static config (model,
267
+ // system prompt, etc.) and defers the runtime prompt to the caller.
268
+ // Using AgentUnit.from — the correct factory for async computations.
269
+ lines.push(`export function ${safeExportName}(prompt: string): AgentUnit<string> {`);
270
+ lines.push(" return AgentUnit.from((_ctx) =>");
271
+ lines.push(" ai(prompt, {");
272
+ for (const opt of aiOptions) {
273
+ lines.push(` ${opt}`);
274
+ }
275
+ lines.push(" }),");
276
+ lines.push(" );");
277
+ lines.push("}");
278
+ lines.push("");
279
+ // Type alias — ReturnType of the function (an AgentUnit), then of its .run().
280
+ const typeName = emitIdentifier(`${toPascalCase(safeExportName)}Result`, "typeName");
281
+ lines.push(`export type ${typeName} = Awaited<ReturnType<ReturnType<typeof ${safeExportName}>["run"]>>;`);
282
+ // Add operator-enhanced variant if operators are configured in the YAML.
283
+ if (enhancedName && operatorChains.length > 0) {
284
+ lines.push("");
285
+ lines.push("/** Agent with operators from YAML operators block. */");
286
+ lines.push(`export function ${enhancedName}(prompt: string): AgentUnit<string> {`);
287
+ lines.push(` return ${safeExportName}(prompt)`);
288
+ for (const chain of operatorChains) {
289
+ lines.push(` ${chain}`);
290
+ }
291
+ lines.push(" ;");
292
+ lines.push("}");
293
+ lines.push("");
294
+ const enhancedTypeName = emitIdentifier(`${toPascalCase(enhancedName)}Result`, "enhancedTypeName");
295
+ lines.push(`export type ${enhancedTypeName} = Awaited<ReturnType<ReturnType<typeof ${enhancedName}>["run"]>>;`);
296
+ }
297
+ return lines.join("\n");
298
+ }
299
+ // ─────────────────────────────────────────────────────────────────────────────
300
+ // FILE GENERATION
301
+ // ─────────────────────────────────────────────────────────────────────────────
302
+ /**
303
+ * Generate TypeScript for a single YAML file
304
+ */
305
+ function generateFile(inputPath, outputDir, quiet = false) {
306
+ const outputPath = getOutputPath(inputPath, outputDir);
307
+ try {
308
+ // Parse YAML
309
+ const { config, errors } = parseYamlFile(inputPath);
310
+ if (errors.length > 0) {
311
+ return {
312
+ inputFile: inputPath,
313
+ outputFile: outputPath,
314
+ success: false,
315
+ error: errors.join("; "),
316
+ };
317
+ }
318
+ // Generate TypeScript
319
+ const typescript = generateTypeScript(config, inputPath);
320
+ // The output sits next to the YAML under the same name, where a
321
+ // hand-written agent could already be.
322
+ if (isHandWritten(outputPath)) {
323
+ return {
324
+ inputFile: inputPath,
325
+ outputFile: outputPath,
326
+ success: false,
327
+ error: `${outputPath} already exists and was not generated by this command. Move or delete it, or pass --output to write somewhere else.`,
328
+ };
329
+ }
330
+ // Ensure output directory exists
331
+ const outputDirPath = path.dirname(outputPath);
332
+ if (!(0, node_fs_1.existsSync)(outputDirPath)) {
333
+ (0, node_fs_1.mkdirSync)(outputDirPath, { recursive: true });
334
+ }
335
+ // Write file
336
+ (0, node_fs_1.writeFileSync)(outputPath, typescript, "utf-8");
337
+ if (!quiet) {
338
+ console.log(chalk_1.default.green(`✓ Generated ${outputPath}`));
339
+ }
340
+ return {
341
+ inputFile: inputPath,
342
+ outputFile: outputPath,
343
+ success: true,
344
+ };
345
+ }
346
+ catch (err) {
347
+ const errorMsg = err instanceof Error ? err.message : String(err);
348
+ return {
349
+ inputFile: inputPath,
350
+ outputFile: outputPath,
351
+ success: false,
352
+ error: errorMsg,
353
+ };
354
+ }
355
+ }
356
+ /**
357
+ * Generate TypeScript for all matching YAML files
358
+ */
359
+ async function generateAll(pattern, outputDir, quiet = false) {
360
+ const files = await (0, glob_1.glob)(pattern, {
361
+ cwd: process.cwd(),
362
+ nodir: true,
363
+ absolute: false,
364
+ });
365
+ if (files.length === 0) {
366
+ if (!quiet) {
367
+ console.log(chalk_1.default.yellow(`No YAML files found matching: ${pattern}`));
368
+ }
369
+ return [];
370
+ }
371
+ const results = [];
372
+ for (const file of files) {
373
+ const result = generateFile(file, outputDir, quiet);
374
+ results.push(result);
375
+ }
376
+ return results;
377
+ }
378
+ /**
379
+ * Print generation summary
380
+ */
381
+ function printSummary(results, quiet) {
382
+ if (quiet)
383
+ return;
384
+ const successful = results.filter((r) => r.success);
385
+ const failed = results.filter((r) => !r.success);
386
+ console.log();
387
+ if (failed.length > 0) {
388
+ for (const result of failed) {
389
+ console.log(chalk_1.default.red(`✗ ${result.inputFile}: ${result.error}`));
390
+ }
391
+ console.log();
392
+ }
393
+ if (successful.length > 0) {
394
+ console.log(chalk_1.default.green(`Generated ${successful.length} file${successful.length === 1 ? "" : "s"}`));
395
+ }
396
+ if (failed.length > 0) {
397
+ console.log(chalk_1.default.red(`Failed: ${failed.length} file${failed.length === 1 ? "" : "s"}`));
398
+ }
399
+ }
400
+ // ─────────────────────────────────────────────────────────────────────────────
401
+ // WATCH MODE
402
+ // ─────────────────────────────────────────────────────────────────────────────
403
+ /**
404
+ * Debounce function to prevent rapid regeneration
405
+ */
406
+ function debounce(fn, ms) {
407
+ let timeoutId = null;
408
+ return (filePath) => {
409
+ if (timeoutId) {
410
+ clearTimeout(timeoutId);
411
+ }
412
+ timeoutId = setTimeout(() => {
413
+ fn(filePath);
414
+ timeoutId = null;
415
+ }, ms);
416
+ };
417
+ }
418
+ /**
419
+ * Start watch mode for continuous generation
420
+ */
421
+ function startWatchMode(pattern, outputDir, quiet = false) {
422
+ if (!quiet) {
423
+ console.log(chalk_1.default.cyan(`Watching for changes: ${pattern}`));
424
+ console.log(chalk_1.default.dim("Press Ctrl+C to stop"));
425
+ console.log();
426
+ }
427
+ const handleChange = debounce((filePath) => {
428
+ if (!quiet) {
429
+ console.log(chalk_1.default.dim(`Change detected: ${filePath}`));
430
+ }
431
+ generateFile(filePath, outputDir, quiet);
432
+ }, 300);
433
+ const handleAdd = (filePath) => {
434
+ if (!quiet) {
435
+ console.log(chalk_1.default.dim(`New file: ${filePath}`));
436
+ }
437
+ generateFile(filePath, outputDir, quiet);
438
+ };
439
+ const watcher = (0, chokidar_1.watch)(pattern, {
440
+ persistent: true,
441
+ ignoreInitial: false,
442
+ awaitWriteFinish: {
443
+ stabilityThreshold: 100,
444
+ pollInterval: 100,
445
+ },
446
+ });
447
+ watcher.on("add", handleAdd);
448
+ watcher.on("change", handleChange);
449
+ watcher.on("error", (error) => {
450
+ console.error(chalk_1.default.red(`Watcher error: ${error.message}`));
451
+ });
452
+ // Handle graceful shutdown
453
+ process.on("SIGINT", () => {
454
+ if (!quiet) {
455
+ console.log(chalk_1.default.dim("\nStopping watch mode..."));
456
+ }
457
+ watcher.close().then(() => {
458
+ process.exit(0);
459
+ });
460
+ });
461
+ }
462
+ // ─────────────────────────────────────────────────────────────────────────────
463
+ // COMMAND
464
+ // ─────────────────────────────────────────────────────────────────────────────
465
+ /**
466
+ * Create the generate command
467
+ */
468
+ function generateCommand() {
469
+ return new commander_1.Command("generate")
470
+ .description("Generate TypeScript from YAML agent definitions")
471
+ .argument("[pattern]", "Glob pattern for YAML files", "agents/**/*.yaml")
472
+ .option("-w, --watch", "Watch mode for continuous generation")
473
+ .option("-o, --output <dir>", "Output directory (default: same as input)")
474
+ .option("-q, --quiet", "Suppress output")
475
+ .action(async (pattern, options) => {
476
+ const { watch: watchMode = false, output, quiet = false } = options;
477
+ if (watchMode) {
478
+ // Watch mode - runs indefinitely
479
+ startWatchMode(pattern, output, quiet);
480
+ }
481
+ else {
482
+ // One-shot generation
483
+ const results = await generateAll(pattern, output, quiet);
484
+ printSummary(results, quiet);
485
+ // Exit with appropriate code
486
+ const hasFailures = results.some((r) => !r.success);
487
+ process.exit(hasFailures ? 1 : 0);
488
+ }
489
+ });
490
+ }
491
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * symplek init command - scaffolds new Symplek projects
3
+ */
4
+ import { Command } from "commander";
5
+ import { type ProjectTier } from "../utils/templates.js";
6
+ /** Package manager options */
7
+ export type PackageManager = "npm" | "pnpm" | "yarn" | "bun";
8
+ /** TypeScript configuration level */
9
+ export type TypeScriptConfig = "strict" | "standard";
10
+ /** Project configuration */
11
+ export interface ProjectConfig {
12
+ name: string;
13
+ template: ProjectTier;
14
+ packageManager: PackageManager;
15
+ typescript: TypeScriptConfig;
16
+ targetDir: string;
17
+ }
18
+ /** Command line options from commander */
19
+ interface CommandOptions {
20
+ name?: string;
21
+ template?: ProjectTier;
22
+ pm?: PackageManager;
23
+ yes?: boolean;
24
+ }
25
+ /**
26
+ * Prompt user for project configuration
27
+ */
28
+ export declare function promptForConfig(options: CommandOptions): Promise<ProjectConfig>;
29
+ /**
30
+ * Create project from template
31
+ */
32
+ export declare function createProject(config: ProjectConfig): Promise<void>;
33
+ /**
34
+ * Install project dependencies
35
+ */
36
+ export declare function installDependencies(packageManager: PackageManager, targetDir: string): Promise<void>;
37
+ /**
38
+ * Print success message with next steps
39
+ */
40
+ export declare function printSuccess(config: ProjectConfig): void;
41
+ /**
42
+ * Create the init command
43
+ */
44
+ export declare function initCommand(): Command;
45
+ export {};
46
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,uBAAuB,CAAC;AAE/B,8BAA8B;AAC9B,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,qCAAqC;AACrC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErD,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0CAA0C;AAC1C,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAqLD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAsBxB;AAiCD;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAyBxD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAuCrC"}