dot-agents 0.1.5 → 0.3.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 (40) hide show
  1. package/README.md +274 -7
  2. package/dist/cli/commands/check.d.ts +3 -0
  3. package/dist/cli/commands/check.d.ts.map +1 -0
  4. package/dist/cli/commands/check.js +152 -0
  5. package/dist/cli/commands/check.js.map +1 -0
  6. package/dist/cli/commands/index.d.ts +2 -0
  7. package/dist/cli/commands/index.d.ts.map +1 -1
  8. package/dist/cli/commands/index.js +2 -0
  9. package/dist/cli/commands/index.js.map +1 -1
  10. package/dist/cli/commands/init.d.ts +3 -0
  11. package/dist/cli/commands/init.d.ts.map +1 -0
  12. package/dist/cli/commands/init.js +248 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/index.js +4 -2
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/lib/index.d.ts +1 -0
  17. package/dist/lib/index.d.ts.map +1 -1
  18. package/dist/lib/index.js +2 -0
  19. package/dist/lib/index.js.map +1 -1
  20. package/dist/lib/validation/cron.d.ts +29 -0
  21. package/dist/lib/validation/cron.d.ts.map +1 -0
  22. package/dist/lib/validation/cron.js +159 -0
  23. package/dist/lib/validation/cron.js.map +1 -0
  24. package/dist/lib/validation/index.d.ts +18 -0
  25. package/dist/lib/validation/index.d.ts.map +1 -0
  26. package/dist/lib/validation/index.js +135 -0
  27. package/dist/lib/validation/index.js.map +1 -0
  28. package/dist/lib/validation/persona.d.ts +9 -0
  29. package/dist/lib/validation/persona.d.ts.map +1 -0
  30. package/dist/lib/validation/persona.js +143 -0
  31. package/dist/lib/validation/persona.js.map +1 -0
  32. package/dist/lib/validation/types.d.ts +64 -0
  33. package/dist/lib/validation/types.d.ts.map +1 -0
  34. package/dist/lib/validation/types.js +25 -0
  35. package/dist/lib/validation/types.js.map +1 -0
  36. package/dist/lib/validation/workflow.d.ts +10 -0
  37. package/dist/lib/validation/workflow.d.ts.map +1 -0
  38. package/dist/lib/validation/workflow.js +242 -0
  39. package/dist/lib/validation/workflow.js.map +1 -0
  40. package/package.json +1 -1
@@ -0,0 +1,248 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { mkdir, writeFile, stat } from "node:fs/promises";
4
+ import { join, relative } from "node:path";
5
+ import { createInterface } from "node:readline";
6
+ import { findAgentsDir } from "../../lib/config.js";
7
+ import { validateAllWorkflows, validateAllPersonas, } from "../../lib/validation/index.js";
8
+ const AGENTS_DIR = ".agents";
9
+ const PERSONAS_DIR = "personas";
10
+ const WORKFLOWS_DIR = "workflows";
11
+ const SKILLS_DIR = "skills";
12
+ const SESSIONS_DIR = "sessions";
13
+ const DEFAULT_PERSONA_NAME = "claude";
14
+ const DEFAULT_PERSONA_CONTENT = `---
15
+ name: claude
16
+ description: Base Claude persona
17
+ cmd:
18
+ - "claude --print"
19
+ - "claude -p"
20
+ env:
21
+ CLAUDE_MODEL: sonnet
22
+ ---
23
+
24
+ You are a helpful assistant. Execute tasks thoroughly and report results clearly.
25
+ `;
26
+ const SAMPLE_WORKFLOW_CONTENT = `---
27
+ name: hello-world
28
+ description: A simple hello world workflow
29
+ persona: claude
30
+ on:
31
+ manual: true
32
+ ---
33
+
34
+ Say hello and tell me today's date.
35
+ `;
36
+ async function prompt(question) {
37
+ const rl = createInterface({
38
+ input: process.stdin,
39
+ output: process.stdout,
40
+ });
41
+ return new Promise((resolve) => {
42
+ rl.question(question, (answer) => {
43
+ rl.close();
44
+ resolve(answer.trim());
45
+ });
46
+ });
47
+ }
48
+ async function confirm(question, defaultYes = true) {
49
+ const hint = defaultYes ? "[Y/n]" : "[y/N]";
50
+ const answer = await prompt(`${question} ${hint} `);
51
+ if (answer === "") {
52
+ return defaultYes;
53
+ }
54
+ return answer.toLowerCase().startsWith("y");
55
+ }
56
+ async function dirExists(path) {
57
+ try {
58
+ const stats = await stat(path);
59
+ return stats.isDirectory();
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ async function fileExists(path) {
66
+ try {
67
+ const stats = await stat(path);
68
+ return stats.isFile();
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ async function analyzeMigration(agentsDir) {
75
+ const personasDir = join(agentsDir, PERSONAS_DIR);
76
+ const workflowsDir = join(agentsDir, WORKFLOWS_DIR);
77
+ const skillsDir = join(agentsDir, SKILLS_DIR);
78
+ const sessionsDir = join(agentsDir, SESSIONS_DIR);
79
+ const status = {
80
+ hasPersonas: await dirExists(personasDir),
81
+ hasWorkflows: await dirExists(workflowsDir),
82
+ hasSkills: await dirExists(skillsDir),
83
+ hasSessions: await dirExists(sessionsDir),
84
+ personaResults: [],
85
+ workflowResults: [],
86
+ };
87
+ // Validate personas
88
+ if (status.hasPersonas) {
89
+ status.personaResults = await validateAllPersonas(personasDir);
90
+ // Update hasPersonas based on whether any valid personas exist
91
+ status.hasPersonas = status.personaResults.some((r) => r.valid);
92
+ }
93
+ // Validate workflows
94
+ if (status.hasWorkflows) {
95
+ status.workflowResults = await validateAllWorkflows(workflowsDir, status.hasPersonas ? personasDir : undefined);
96
+ }
97
+ return status;
98
+ }
99
+ /**
100
+ * Format a validation issue for display
101
+ */
102
+ function formatIssue(issue) {
103
+ const icon = issue.severity === "error" ? chalk.red("✗") : chalk.yellow("⚠");
104
+ let line = ` ${icon} ${issue.message}`;
105
+ if (issue.path && issue.path !== "file" && issue.path !== "frontmatter") {
106
+ line += chalk.dim(` [${issue.path}]`);
107
+ }
108
+ if (issue.suggestion) {
109
+ line += `\n ${chalk.dim("→")} ${chalk.cyan(issue.suggestion)}`;
110
+ }
111
+ return line;
112
+ }
113
+ async function freshInstall(targetDir) {
114
+ const agentsDir = join(targetDir, AGENTS_DIR);
115
+ console.log(chalk.blue("\nCreating .agents directory structure...\n"));
116
+ // Create directories
117
+ const dirs = [
118
+ join(agentsDir, PERSONAS_DIR, DEFAULT_PERSONA_NAME),
119
+ join(agentsDir, WORKFLOWS_DIR, "hello-world"),
120
+ join(agentsDir, SKILLS_DIR),
121
+ join(agentsDir, SESSIONS_DIR),
122
+ ];
123
+ for (const dir of dirs) {
124
+ await mkdir(dir, { recursive: true });
125
+ console.log(chalk.dim(` Created ${dir}`));
126
+ }
127
+ // Create default persona
128
+ const personaPath = join(agentsDir, PERSONAS_DIR, DEFAULT_PERSONA_NAME, "PERSONA.md");
129
+ await writeFile(personaPath, DEFAULT_PERSONA_CONTENT);
130
+ console.log(chalk.green(` Created ${personaPath}`));
131
+ // Create sample workflow
132
+ const workflowPath = join(agentsDir, WORKFLOWS_DIR, "hello-world", "WORKFLOW.md");
133
+ await writeFile(workflowPath, SAMPLE_WORKFLOW_CONTENT);
134
+ console.log(chalk.green(` Created ${workflowPath}`));
135
+ console.log(chalk.green("\n✓ Initialization complete!\n"));
136
+ console.log("Next steps:");
137
+ console.log(chalk.dim(" 1. Review the default persona at:"));
138
+ console.log(chalk.dim(` ${personaPath}`));
139
+ console.log(chalk.dim(" 2. Try running the sample workflow:"));
140
+ console.log(chalk.dim(" dot-agents run hello-world --dry-run"));
141
+ console.log(chalk.dim(" 3. Create your own workflows in:"));
142
+ console.log(chalk.dim(` ${join(agentsDir, WORKFLOWS_DIR)}/`));
143
+ }
144
+ async function migrate(agentsDir) {
145
+ console.log(chalk.blue("\nAnalyzing existing .agents directory...\n"));
146
+ const status = await analyzeMigration(agentsDir);
147
+ const workflowsDir = join(agentsDir, WORKFLOWS_DIR);
148
+ // Report current state
149
+ console.log("Current structure:");
150
+ console.log(` ${status.hasPersonas ? chalk.green("✓") : chalk.red("✗")} personas/`);
151
+ console.log(` ${status.hasWorkflows ? chalk.green("✓") : chalk.yellow("○")} workflows/`);
152
+ console.log(` ${status.hasSkills ? chalk.green("✓") : chalk.dim("○")} skills/`);
153
+ console.log(` ${status.hasSessions ? chalk.green("✓") : chalk.dim("○")} sessions/`);
154
+ // Count valid vs invalid workflows
155
+ const validWorkflows = status.workflowResults.filter((r) => r.valid);
156
+ const invalidWorkflows = status.workflowResults.filter((r) => !r.valid);
157
+ const workflowsWithWarnings = status.workflowResults.filter((r) => r.valid && r.issues.length > 0);
158
+ if (validWorkflows.length > 0) {
159
+ console.log(chalk.green(`\n ${validWorkflows.length} valid workflow(s)`));
160
+ }
161
+ if (workflowsWithWarnings.length > 0) {
162
+ console.log(chalk.yellow(` ${workflowsWithWarnings.length} workflow(s) with warnings`));
163
+ }
164
+ if (invalidWorkflows.length > 0) {
165
+ console.log(chalk.red(` ${invalidWorkflows.length} workflow(s) with errors`));
166
+ }
167
+ let needsAction = false;
168
+ // Create personas directory if missing
169
+ if (!status.hasPersonas) {
170
+ needsAction = true;
171
+ console.log(chalk.yellow("\n⚠ No valid personas found."));
172
+ const createPersona = await confirm("Create default 'claude' persona?");
173
+ if (createPersona) {
174
+ const personaDir = join(agentsDir, PERSONAS_DIR, DEFAULT_PERSONA_NAME);
175
+ await mkdir(personaDir, { recursive: true });
176
+ const personaPath = join(personaDir, "PERSONA.md");
177
+ await writeFile(personaPath, DEFAULT_PERSONA_CONTENT);
178
+ console.log(chalk.green(` Created ${personaPath}`));
179
+ }
180
+ }
181
+ // Report workflow issues with detailed validation feedback
182
+ const workflowsWithIssues = status.workflowResults.filter((r) => r.issues.length > 0);
183
+ if (workflowsWithIssues.length > 0) {
184
+ needsAction = true;
185
+ console.log(chalk.yellow("\n⚠ Workflow issues found:\n"));
186
+ for (const result of workflowsWithIssues) {
187
+ const relPath = relative(workflowsDir, result.path);
188
+ const displayName = result.name || relPath;
189
+ const hasErrors = result.issues.some((i) => i.severity === "error");
190
+ if (hasErrors) {
191
+ console.log(` ${chalk.red("✗")} ${displayName}`);
192
+ }
193
+ else {
194
+ console.log(` ${chalk.yellow("○")} ${displayName}`);
195
+ }
196
+ for (const issue of result.issues) {
197
+ console.log(formatIssue(issue));
198
+ }
199
+ console.log();
200
+ }
201
+ }
202
+ if (!needsAction) {
203
+ console.log(chalk.green("\n✓ Your .agents directory is already set up!"));
204
+ }
205
+ else {
206
+ console.log(chalk.blue("After making changes, verify with:"));
207
+ console.log(chalk.dim(" dot-agents check"));
208
+ }
209
+ }
210
+ export const initCommand = new Command("init")
211
+ .description("Initialize or migrate a .agents directory")
212
+ .option("-d, --dir <path>", "Target directory", process.cwd())
213
+ .option("-f, --force", "Overwrite existing files")
214
+ .action(async (options) => {
215
+ try {
216
+ const targetDir = options.dir;
217
+ // Check if .agents already exists
218
+ const existingAgentsDir = await findAgentsDir(targetDir);
219
+ const localAgentsDir = join(targetDir, AGENTS_DIR);
220
+ const hasLocalAgents = await dirExists(localAgentsDir);
221
+ if (hasLocalAgents) {
222
+ // Migration mode
223
+ console.log(chalk.blue("Found existing .agents directory"));
224
+ await migrate(localAgentsDir);
225
+ }
226
+ else if (existingAgentsDir) {
227
+ // Found .agents in parent directory
228
+ console.log(chalk.yellow(`Found .agents in parent directory: ${existingAgentsDir}`));
229
+ const createLocal = await confirm("Create a new .agents in current directory instead?");
230
+ if (createLocal) {
231
+ await freshInstall(targetDir);
232
+ }
233
+ else {
234
+ console.log(chalk.dim("Using existing .agents directory"));
235
+ await migrate(existingAgentsDir);
236
+ }
237
+ }
238
+ else {
239
+ // Fresh install
240
+ await freshInstall(targetDir);
241
+ }
242
+ }
243
+ catch (error) {
244
+ console.error(chalk.red(`Error: ${error.message}`));
245
+ process.exit(1);
246
+ }
247
+ });
248
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
- import { runCommand, listCommand, showCommand, scheduleCommand, daemonCommand } from "./commands/index.js";
3
+ import { initCommand, checkCommand, runCommand, listCommand, showCommand, scheduleCommand, daemonCommand } from "./commands/index.js";
4
4
  const program = new Command();
5
5
  program
6
6
  .name("dot-agents")
7
7
  .description("Run and manage agentic workflows")
8
- .version("0.1.0")
8
+ .version("0.3.0")
9
9
  .action(() => {
10
10
  program.help();
11
11
  });
12
+ program.addCommand(initCommand);
13
+ program.addCommand(checkCommand);
12
14
  program.addCommand(runCommand);
13
15
  program.addCommand(listCommand);
14
16
  program.addCommand(showCommand);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3G,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,wCAAwC;AACxC,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC9E,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,sCAAsC;AACtC,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC7E,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtI,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,wCAAwC;AACxC,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC9E,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,sCAAsC;AACtC,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC7E,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -4,4 +4,5 @@ export * from "./persona.js";
4
4
  export * from "./workflow.js";
5
5
  export * from "./variables.js";
6
6
  export * from "./config.js";
7
+ export * from "./validation/index.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAG5B,cAAc,uBAAuB,CAAC"}
package/dist/lib/index.js CHANGED
@@ -6,4 +6,6 @@ export * from "./persona.js";
6
6
  export * from "./workflow.js";
7
7
  export * from "./variables.js";
8
8
  export * from "./config.js";
9
+ // Validation
10
+ export * from "./validation/index.js";
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAE5B,aAAa;AACb,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Validate cron expression syntax
3
+ *
4
+ * Supports standard 5-field cron format:
5
+ * minute hour day-of-month month day-of-week
6
+ *
7
+ * Each field can be:
8
+ * - asterisk (any value)
9
+ * - number (specific value)
10
+ * - range (1-5)
11
+ * - step (star/15 or 1-5/2)
12
+ * - list (1,3,5)
13
+ * - combinations of above
14
+ */
15
+ interface CronValidationResult {
16
+ valid: boolean;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Validate a cron expression
21
+ */
22
+ export declare function validateCron(expression: string): CronValidationResult;
23
+ /**
24
+ * Parse a human-readable schedule hint into a cron suggestion
25
+ * This is best-effort for common patterns
26
+ */
27
+ export declare function suggestCronFromHint(hint: string): string | null;
28
+ export {};
29
+ //# sourceMappingURL=cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../../src/lib/validation/cron.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,UAAU,oBAAoB;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CA0BrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2C/D"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Validate cron expression syntax
3
+ *
4
+ * Supports standard 5-field cron format:
5
+ * minute hour day-of-month month day-of-week
6
+ *
7
+ * Each field can be:
8
+ * - asterisk (any value)
9
+ * - number (specific value)
10
+ * - range (1-5)
11
+ * - step (star/15 or 1-5/2)
12
+ * - list (1,3,5)
13
+ * - combinations of above
14
+ */
15
+ const FIELD_RANGES = {
16
+ minute: [0, 59],
17
+ hour: [0, 23],
18
+ dayOfMonth: [1, 31],
19
+ month: [1, 12],
20
+ dayOfWeek: [0, 7], // 0 and 7 both represent Sunday
21
+ };
22
+ const FIELD_NAMES = ["minute", "hour", "dayOfMonth", "month", "dayOfWeek"];
23
+ /**
24
+ * Validate a single cron field value
25
+ */
26
+ function validateField(value, fieldName) {
27
+ const [min, max] = FIELD_RANGES[fieldName];
28
+ // Handle wildcard
29
+ if (value === "*") {
30
+ return { valid: true };
31
+ }
32
+ // Handle step values (*/n or range/n)
33
+ if (value.includes("/")) {
34
+ const [base, step] = value.split("/");
35
+ if (!step || isNaN(Number(step)) || Number(step) < 1) {
36
+ return { valid: false, error: `Invalid step value: ${step}` };
37
+ }
38
+ // Validate the base part
39
+ if (base !== "*") {
40
+ const baseResult = validateField(base, fieldName);
41
+ if (!baseResult.valid) {
42
+ return baseResult;
43
+ }
44
+ }
45
+ return { valid: true };
46
+ }
47
+ // Handle lists (1,2,3)
48
+ if (value.includes(",")) {
49
+ const parts = value.split(",");
50
+ for (const part of parts) {
51
+ const result = validateField(part.trim(), fieldName);
52
+ if (!result.valid) {
53
+ return result;
54
+ }
55
+ }
56
+ return { valid: true };
57
+ }
58
+ // Handle ranges (1-5)
59
+ if (value.includes("-")) {
60
+ const [start, end] = value.split("-").map(Number);
61
+ if (isNaN(start) || isNaN(end)) {
62
+ return { valid: false, error: `Invalid range: ${value}` };
63
+ }
64
+ if (start < min || start > max || end < min || end > max) {
65
+ return {
66
+ valid: false,
67
+ error: `Range ${value} out of bounds (${min}-${max})`,
68
+ };
69
+ }
70
+ if (start > end) {
71
+ return { valid: false, error: `Invalid range: start > end in ${value}` };
72
+ }
73
+ return { valid: true };
74
+ }
75
+ // Handle single number
76
+ const num = Number(value);
77
+ if (isNaN(num)) {
78
+ return { valid: false, error: `Invalid value: ${value}` };
79
+ }
80
+ if (num < min || num > max) {
81
+ return {
82
+ valid: false,
83
+ error: `Value ${num} out of bounds (${min}-${max})`,
84
+ };
85
+ }
86
+ return { valid: true };
87
+ }
88
+ /**
89
+ * Validate a cron expression
90
+ */
91
+ export function validateCron(expression) {
92
+ if (!expression || typeof expression !== "string") {
93
+ return { valid: false, error: "Cron expression must be a non-empty string" };
94
+ }
95
+ const trimmed = expression.trim();
96
+ const fields = trimmed.split(/\s+/);
97
+ if (fields.length !== 5) {
98
+ return {
99
+ valid: false,
100
+ error: `Expected 5 fields (minute hour day month weekday), got ${fields.length}`,
101
+ };
102
+ }
103
+ for (let i = 0; i < fields.length; i++) {
104
+ const result = validateField(fields[i], FIELD_NAMES[i]);
105
+ if (!result.valid) {
106
+ return {
107
+ valid: false,
108
+ error: `Invalid ${FIELD_NAMES[i]}: ${result.error}`,
109
+ };
110
+ }
111
+ }
112
+ return { valid: true };
113
+ }
114
+ /**
115
+ * Parse a human-readable schedule hint into a cron suggestion
116
+ * This is best-effort for common patterns
117
+ */
118
+ export function suggestCronFromHint(hint) {
119
+ const lower = hint.toLowerCase();
120
+ // Common patterns
121
+ if (lower.includes("hourly")) {
122
+ return "0 * * * *";
123
+ }
124
+ if (lower.includes("daily")) {
125
+ // Try to extract time
126
+ const timeMatch = lower.match(/(\d{1,2}):?(\d{2})?\s*(am|pm)?/i);
127
+ if (timeMatch) {
128
+ let hour = parseInt(timeMatch[1], 10);
129
+ const minute = timeMatch[2] ? parseInt(timeMatch[2], 10) : 0;
130
+ const meridiem = timeMatch[3]?.toLowerCase();
131
+ if (meridiem === "pm" && hour < 12)
132
+ hour += 12;
133
+ if (meridiem === "am" && hour === 12)
134
+ hour = 0;
135
+ return `${minute} ${hour} * * *`;
136
+ }
137
+ return "0 9 * * *"; // Default to 9 AM
138
+ }
139
+ if (lower.includes("weekly")) {
140
+ return "0 9 * * 1"; // Monday 9 AM
141
+ }
142
+ if (lower.includes("monthly")) {
143
+ return "0 9 1 * *"; // 1st of month 9 AM
144
+ }
145
+ // Try to extract "every N hours/minutes"
146
+ const everyMatch = lower.match(/every\s+(\d+)\s+(hour|minute|min)/i);
147
+ if (everyMatch) {
148
+ const n = parseInt(everyMatch[1], 10);
149
+ const unit = everyMatch[2].toLowerCase();
150
+ if (unit.startsWith("hour")) {
151
+ return `0 */${n} * * *`;
152
+ }
153
+ if (unit.startsWith("min")) {
154
+ return `*/${n} * * * *`;
155
+ }
156
+ }
157
+ return null;
158
+ }
159
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../../src/lib/validation/cron.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ValidationResult, ValidationSummary } from "./types.js";
2
+ export * from "./types.js";
3
+ export { validateWorkflow } from "./workflow.js";
4
+ export { validatePersona } from "./persona.js";
5
+ export { validateCron } from "./cron.js";
6
+ /**
7
+ * Validate all workflows in a directory
8
+ */
9
+ export declare function validateAllWorkflows(workflowsDir: string, personasDir?: string): Promise<ValidationResult[]>;
10
+ /**
11
+ * Validate all personas in a directory
12
+ */
13
+ export declare function validateAllPersonas(personasDir: string): Promise<ValidationResult[]>;
14
+ /**
15
+ * Validate entire .agents directory
16
+ */
17
+ export declare function validateAll(agentsDir: string): Promise<ValidationSummary>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/validation/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAIpB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAuFzC;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8B7B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAc7B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAyB5B"}