@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.
- package/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +74 -2
- package/bin/symplek.js +5 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +44 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +36 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +467 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/generate.d.ts +26 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +491 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +46 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +350 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +41 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +518 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/validate.d.ts +252 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +515 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +24 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +39 -0
- package/dist/models.js.map +1 -0
- package/dist/naming.d.ts +20 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +48 -0
- package/dist/naming.js.map +1 -0
- package/dist/templates/agent/agent.ts.template +41 -0
- package/dist/templates/agent/general.yaml.template +34 -0
- package/dist/templates/agent/researcher.yaml.template +42 -0
- package/dist/templates/agent/reviewer.yaml.template +51 -0
- package/dist/templates/project/full/.github/workflows/ci.yml.template +34 -0
- package/dist/templates/project/full/.gitignore.template +6 -0
- package/dist/templates/project/full/Dockerfile.template +43 -0
- package/dist/templates/project/full/README.md.template +77 -0
- package/dist/templates/project/full/agents/example.yaml.template +16 -0
- package/dist/templates/project/full/package.json.template +30 -0
- package/dist/templates/project/full/src/index.ts.template +43 -0
- package/dist/templates/project/full/src/symplek.config.ts.template +20 -0
- package/dist/templates/project/full/src/tools/index.ts.template +73 -0
- package/dist/templates/project/full/tests/example.test.ts.template +49 -0
- package/dist/templates/project/full/tsconfig.json.template +18 -0
- package/dist/templates/project/minimal/.gitignore.template +6 -0
- package/dist/templates/project/minimal/agents/example.yaml.template +16 -0
- package/dist/templates/project/minimal/package.json.template +27 -0
- package/dist/templates/project/minimal/src/index.ts.template +43 -0
- package/dist/templates/project/minimal/src/symplek.config.ts.template +20 -0
- package/dist/templates/project/minimal/tsconfig.json.template +18 -0
- package/dist/templates/project/standard/.gitignore.template +6 -0
- package/dist/templates/project/standard/README.md.template +77 -0
- package/dist/templates/project/standard/agents/example.yaml.template +16 -0
- package/dist/templates/project/standard/package.json.template +30 -0
- package/dist/templates/project/standard/src/index.ts.template +43 -0
- package/dist/templates/project/standard/src/symplek.config.ts.template +20 -0
- package/dist/templates/project/standard/src/tools/index.ts.template +73 -0
- package/dist/templates/project/standard/tests/example.test.ts.template +49 -0
- package/dist/templates/project/standard/tsconfig.json.template +18 -0
- package/dist/utils/templates.d.ts +41 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +133 -0
- package/dist/utils/templates.js.map +1 -0
- 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"}
|