dot-agents 0.2.0 → 0.3.1

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 (42) hide show
  1. package/README.md +151 -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 +1 -0
  7. package/dist/cli/commands/index.d.ts.map +1 -1
  8. package/dist/cli/commands/index.js +1 -0
  9. package/dist/cli/commands/index.js.map +1 -1
  10. package/dist/cli/commands/init.d.ts.map +1 -1
  11. package/dist/cli/commands/init.js +58 -52
  12. package/dist/cli/commands/init.js.map +1 -1
  13. package/dist/cli/commands/list.d.ts.map +1 -1
  14. package/dist/cli/commands/list.js +21 -7
  15. package/dist/cli/commands/list.js.map +1 -1
  16. package/dist/cli/index.js +3 -2
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/lib/index.d.ts +1 -0
  19. package/dist/lib/index.d.ts.map +1 -1
  20. package/dist/lib/index.js +2 -0
  21. package/dist/lib/index.js.map +1 -1
  22. package/dist/lib/validation/cron.d.ts +29 -0
  23. package/dist/lib/validation/cron.d.ts.map +1 -0
  24. package/dist/lib/validation/cron.js +159 -0
  25. package/dist/lib/validation/cron.js.map +1 -0
  26. package/dist/lib/validation/index.d.ts +18 -0
  27. package/dist/lib/validation/index.d.ts.map +1 -0
  28. package/dist/lib/validation/index.js +135 -0
  29. package/dist/lib/validation/index.js.map +1 -0
  30. package/dist/lib/validation/persona.d.ts +9 -0
  31. package/dist/lib/validation/persona.d.ts.map +1 -0
  32. package/dist/lib/validation/persona.js +143 -0
  33. package/dist/lib/validation/persona.js.map +1 -0
  34. package/dist/lib/validation/types.d.ts +64 -0
  35. package/dist/lib/validation/types.d.ts.map +1 -0
  36. package/dist/lib/validation/types.js +25 -0
  37. package/dist/lib/validation/types.js.map +1 -0
  38. package/dist/lib/validation/workflow.d.ts +10 -0
  39. package/dist/lib/validation/workflow.d.ts.map +1 -0
  40. package/dist/lib/validation/workflow.js +242 -0
  41. package/dist/lib/validation/workflow.js.map +1 -0
  42. package/package.json +1 -1
@@ -22,16 +22,30 @@ export const listCommand = new Command("list")
22
22
  const relPath = relative(config.workflowsDir, workflowPath);
23
23
  console.log(chalk.white(` ${workflow.name}`));
24
24
  console.log(chalk.dim(` ${workflow.description}`));
25
+ // Always show triggers
26
+ const triggers = [];
27
+ if (workflow.on?.manual) {
28
+ triggers.push("manual");
29
+ }
30
+ if (workflow.on?.schedule && workflow.on.schedule.length > 0) {
31
+ const crons = workflow.on.schedule.map((s) => s.cron);
32
+ triggers.push(...crons.map((c) => `cron(${c})`));
33
+ }
34
+ if (workflow.on?.file_change) {
35
+ triggers.push("file_change");
36
+ }
37
+ if (workflow.on?.webhook) {
38
+ triggers.push("webhook");
39
+ }
40
+ if (triggers.length > 0) {
41
+ console.log(chalk.cyan(` triggers: ${triggers.join(", ")}`));
42
+ }
43
+ else {
44
+ console.log(chalk.yellow(` triggers: none`));
45
+ }
25
46
  if (options.verbose) {
26
47
  console.log(chalk.dim(` Path: ${relPath}`));
27
48
  console.log(chalk.dim(` Persona: ${workflow.persona}`));
28
- if (workflow.on?.schedule) {
29
- const crons = workflow.on.schedule.map((s) => s.cron).join(", ");
30
- console.log(chalk.dim(` Schedule: ${crons}`));
31
- }
32
- if (workflow.on?.manual) {
33
- console.log(chalk.dim(` Manual: enabled`));
34
- }
35
49
  if (workflow.inputs && workflow.inputs.length > 0) {
36
50
  const inputNames = workflow.inputs.map((i) => i.name).join(", ");
37
51
  console.log(chalk.dim(` Inputs: ${inputNames}`));
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
- import { initCommand, 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.2.0")
8
+ .version("0.3.1")
9
9
  .action(() => {
10
10
  program.help();
11
11
  });
12
12
  program.addCommand(initCommand);
13
+ program.addCommand(checkCommand);
13
14
  program.addCommand(runCommand);
14
15
  program.addCommand(listCommand);
15
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,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExH,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,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"}
@@ -0,0 +1,135 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { join, relative } from "node:path";
3
+ import { createError, } from "./types.js";
4
+ import { validateWorkflow, getWorkflowPersonaRef } from "./workflow.js";
5
+ import { validatePersona } from "./persona.js";
6
+ export * from "./types.js";
7
+ export { validateWorkflow } from "./workflow.js";
8
+ export { validatePersona } from "./persona.js";
9
+ export { validateCron } from "./cron.js";
10
+ const PERSONA_FILENAME = "PERSONA.md";
11
+ const WORKFLOW_FILENAME = "WORKFLOW.md";
12
+ /**
13
+ * Check if a directory contains a specific file
14
+ */
15
+ async function hasFile(dirPath, filename) {
16
+ try {
17
+ const filePath = join(dirPath, filename);
18
+ const stats = await stat(filePath);
19
+ return stats.isFile();
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Recursively find all directories containing a specific file
27
+ */
28
+ async function findDirectoriesWithFile(root, filename) {
29
+ const results = [];
30
+ async function scanDir(dir) {
31
+ try {
32
+ const entries = await readdir(dir, { withFileTypes: true });
33
+ for (const entry of entries) {
34
+ if (entry.isDirectory()) {
35
+ const subDir = join(dir, entry.name);
36
+ if (await hasFile(subDir, filename)) {
37
+ results.push(subDir);
38
+ }
39
+ await scanDir(subDir);
40
+ }
41
+ }
42
+ }
43
+ catch {
44
+ // Directory doesn't exist or not readable
45
+ }
46
+ }
47
+ await scanDir(root);
48
+ return results;
49
+ }
50
+ /**
51
+ * Check if a persona path exists
52
+ */
53
+ async function personaExists(personaRef, personasDir) {
54
+ const personaPath = join(personasDir, personaRef);
55
+ return hasFile(personaPath, PERSONA_FILENAME);
56
+ }
57
+ /**
58
+ * Determine if a persona is a root persona (no parent with PERSONA.md)
59
+ */
60
+ async function isRootPersona(personaPath, personasRoot) {
61
+ const relativePath = relative(personasRoot, personaPath);
62
+ const parts = relativePath.split("/").filter(Boolean);
63
+ // If it's directly under personasRoot, it's a root persona
64
+ if (parts.length <= 1) {
65
+ return true;
66
+ }
67
+ // Check if any parent directory has a PERSONA.md
68
+ let currentPath = personasRoot;
69
+ for (let i = 0; i < parts.length - 1; i++) {
70
+ currentPath = join(currentPath, parts[i]);
71
+ if (await hasFile(currentPath, PERSONA_FILENAME)) {
72
+ return false; // Has a parent persona
73
+ }
74
+ }
75
+ return true;
76
+ }
77
+ /**
78
+ * Validate all workflows in a directory
79
+ */
80
+ export async function validateAllWorkflows(workflowsDir, personasDir) {
81
+ const workflowPaths = await findDirectoriesWithFile(workflowsDir, WORKFLOW_FILENAME);
82
+ const results = [];
83
+ for (const workflowPath of workflowPaths) {
84
+ const result = await validateWorkflow(workflowPath);
85
+ // Cross-validate persona reference if personasDir provided
86
+ if (personasDir && result.valid) {
87
+ const personaRef = await getWorkflowPersonaRef(workflowPath);
88
+ if (personaRef && !(await personaExists(personaRef, personasDir))) {
89
+ result.issues.push(createError("reference_not_found", "persona", `Persona '${personaRef}' not found`, `Create persona at: ${join(personasDir, personaRef, PERSONA_FILENAME)}`));
90
+ result.valid = false;
91
+ }
92
+ }
93
+ results.push(result);
94
+ }
95
+ return results;
96
+ }
97
+ /**
98
+ * Validate all personas in a directory
99
+ */
100
+ export async function validateAllPersonas(personasDir) {
101
+ const personaPaths = await findDirectoriesWithFile(personasDir, PERSONA_FILENAME);
102
+ const results = [];
103
+ for (const personaPath of personaPaths) {
104
+ const isRoot = await isRootPersona(personaPath, personasDir);
105
+ const result = await validatePersona(personaPath, isRoot);
106
+ results.push(result);
107
+ }
108
+ return results;
109
+ }
110
+ /**
111
+ * Validate entire .agents directory
112
+ */
113
+ export async function validateAll(agentsDir) {
114
+ const personasDir = join(agentsDir, "personas");
115
+ const workflowsDir = join(agentsDir, "workflows");
116
+ const personaResults = await validateAllPersonas(personasDir);
117
+ const workflowResults = await validateAllWorkflows(workflowsDir, personasDir);
118
+ const validPersonas = personaResults.filter((r) => r.valid).length;
119
+ const validWorkflows = workflowResults.filter((r) => r.valid).length;
120
+ return {
121
+ personas: {
122
+ total: personaResults.length,
123
+ valid: validPersonas,
124
+ results: personaResults,
125
+ },
126
+ workflows: {
127
+ total: workflowResults.length,
128
+ valid: validWorkflows,
129
+ results: workflowResults,
130
+ },
131
+ valid: validPersonas === personaResults.length &&
132
+ validWorkflows === workflowResults.length,
133
+ };
134
+ }
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/validation/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ValidationResult } from "./types.js";
2
+ /**
3
+ * Validate a persona file
4
+ *
5
+ * @param personaPath Path to the persona directory or PERSONA.md file
6
+ * @param isRootPersona Whether this is a root persona (requires cmd)
7
+ */
8
+ export declare function validatePersona(personaPath: string, isRootPersona?: boolean): Promise<ValidationResult>;
9
+ //# sourceMappingURL=persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../../src/lib/validation/persona.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AA4CpB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAyL3B"}
@@ -0,0 +1,143 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join, dirname } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { createError, createWarning, } from "./types.js";
5
+ const PERSONA_FILENAME = "PERSONA.md";
6
+ /**
7
+ * Known persona frontmatter fields
8
+ */
9
+ const KNOWN_FIELDS = new Set(["name", "description", "cmd", "env", "skills"]);
10
+ /**
11
+ * Common legacy/misnamed fields and their correct names
12
+ */
13
+ const FIELD_SUGGESTIONS = {
14
+ command: "cmd",
15
+ commands: "cmd",
16
+ skill: "skills",
17
+ environment: "env",
18
+ variables: "env",
19
+ model: "env.CLAUDE_MODEL or similar",
20
+ };
21
+ /**
22
+ * Parse frontmatter from markdown content without full validation
23
+ */
24
+ function parseFrontmatter(content) {
25
+ const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
26
+ const match = content.match(frontmatterRegex);
27
+ if (!match) {
28
+ return null;
29
+ }
30
+ const [, yamlContent, body] = match;
31
+ try {
32
+ const frontmatter = parseYaml(yamlContent);
33
+ return { frontmatter, body: body.trim() };
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Validate a persona file
41
+ *
42
+ * @param personaPath Path to the persona directory or PERSONA.md file
43
+ * @param isRootPersona Whether this is a root persona (requires cmd)
44
+ */
45
+ export async function validatePersona(personaPath, isRootPersona = true) {
46
+ const filePath = personaPath.endsWith(PERSONA_FILENAME)
47
+ ? personaPath
48
+ : join(personaPath, PERSONA_FILENAME);
49
+ const issues = [];
50
+ let name;
51
+ try {
52
+ const content = await readFile(filePath, "utf-8");
53
+ const parsed = parseFrontmatter(content);
54
+ if (!parsed) {
55
+ issues.push(createError("invalid_value", "frontmatter", "No valid YAML frontmatter found", "File must start with --- followed by YAML and another ---"));
56
+ return {
57
+ path: filePath,
58
+ valid: false,
59
+ issues,
60
+ };
61
+ }
62
+ const { frontmatter } = parsed;
63
+ name = frontmatter.name;
64
+ // Check required fields
65
+ if (!frontmatter.name) {
66
+ issues.push(createError("missing_field", "name", "Missing required 'name' field", "Add: name: my-persona"));
67
+ }
68
+ else if (typeof frontmatter.name !== "string") {
69
+ issues.push(createError("invalid_type", "name", "'name' must be a string"));
70
+ }
71
+ // cmd is required for root personas, optional for child personas (inherited)
72
+ if (isRootPersona && !frontmatter.cmd) {
73
+ issues.push(createError("missing_field", "cmd", "Missing required 'cmd' field for root persona", "Add: cmd: \"claude --print\" or cmd: [\"claude --print\", \"claude -p\"]"));
74
+ }
75
+ // Validate cmd type if present
76
+ if (frontmatter.cmd !== undefined) {
77
+ if (typeof frontmatter.cmd !== "string" &&
78
+ !Array.isArray(frontmatter.cmd)) {
79
+ issues.push(createError("invalid_type", "cmd", "'cmd' must be a string or array of strings", "Use: cmd: \"claude --print\" or cmd: [\"claude --print\"]"));
80
+ }
81
+ else if (Array.isArray(frontmatter.cmd)) {
82
+ frontmatter.cmd.forEach((c, index) => {
83
+ if (typeof c !== "string") {
84
+ issues.push(createError("invalid_type", `cmd[${index}]`, "Command must be a string"));
85
+ }
86
+ });
87
+ }
88
+ }
89
+ // Validate env if present
90
+ if (frontmatter.env !== undefined) {
91
+ if (typeof frontmatter.env !== "object" ||
92
+ Array.isArray(frontmatter.env) ||
93
+ frontmatter.env === null) {
94
+ issues.push(createError("invalid_type", "env", "'env' must be an object", "Use: env: { CLAUDE_MODEL: 'sonnet' }"));
95
+ }
96
+ else {
97
+ // Check that all env values are strings
98
+ const env = frontmatter.env;
99
+ for (const [key, value] of Object.entries(env)) {
100
+ if (typeof value !== "string") {
101
+ issues.push(createWarning("unknown_field", `env.${key}`, `Environment variable '${key}' should be a string, got ${typeof value}`, "Convert to string or use ${VAR} expansion"));
102
+ }
103
+ }
104
+ }
105
+ }
106
+ // Validate skills if present
107
+ if (frontmatter.skills !== undefined) {
108
+ if (!Array.isArray(frontmatter.skills)) {
109
+ issues.push(createError("invalid_type", "skills", "'skills' must be an array of glob patterns", "Use: skills: [\"productivity/**\", \"!experimental/*\"]"));
110
+ }
111
+ else {
112
+ frontmatter.skills.forEach((skill, index) => {
113
+ if (typeof skill !== "string") {
114
+ issues.push(createError("invalid_type", `skills[${index}]`, "Skill pattern must be a string"));
115
+ }
116
+ });
117
+ }
118
+ }
119
+ // Check for unknown/legacy fields
120
+ for (const key of Object.keys(frontmatter)) {
121
+ if (!KNOWN_FIELDS.has(key)) {
122
+ const suggestion = FIELD_SUGGESTIONS[key];
123
+ if (suggestion) {
124
+ issues.push(createWarning("unknown_field", key, `Unknown field '${key}'`, `Did you mean '${suggestion}'?`));
125
+ }
126
+ else {
127
+ issues.push(createWarning("unknown_field", key, `Unknown field '${key}'`));
128
+ }
129
+ }
130
+ }
131
+ }
132
+ catch (error) {
133
+ issues.push(createError("invalid_value", "file", `Failed to read persona: ${error.message}`));
134
+ }
135
+ const hasErrors = issues.some((i) => i.severity === "error");
136
+ return {
137
+ path: dirname(filePath),
138
+ name,
139
+ valid: !hasErrors,
140
+ issues,
141
+ };
142
+ }
143
+ //# sourceMappingURL=persona.js.map