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.
- package/README.md +274 -7
- package/dist/cli/commands/check.d.ts +3 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +152 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +248 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/validation/cron.d.ts +29 -0
- package/dist/lib/validation/cron.d.ts.map +1 -0
- package/dist/lib/validation/cron.js +159 -0
- package/dist/lib/validation/cron.js.map +1 -0
- package/dist/lib/validation/index.d.ts +18 -0
- package/dist/lib/validation/index.d.ts.map +1 -0
- package/dist/lib/validation/index.js +135 -0
- package/dist/lib/validation/index.js.map +1 -0
- package/dist/lib/validation/persona.d.ts +9 -0
- package/dist/lib/validation/persona.d.ts.map +1 -0
- package/dist/lib/validation/persona.js +143 -0
- package/dist/lib/validation/persona.js.map +1 -0
- package/dist/lib/validation/types.d.ts +64 -0
- package/dist/lib/validation/types.d.ts.map +1 -0
- package/dist/lib/validation/types.js +25 -0
- package/dist/lib/validation/types.js.map +1 -0
- package/dist/lib/validation/workflow.d.ts +10 -0
- package/dist/lib/validation/workflow.d.ts.map +1 -0
- package/dist/lib/validation/workflow.js +242 -0
- package/dist/lib/validation/workflow.js.map +1 -0
- 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.
|
|
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);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/lib/index.d.ts
CHANGED
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -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
package/dist/lib/index.js.map
CHANGED
|
@@ -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"}
|