dot-agents 0.1.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -0
  3. package/dist/cli/commands/daemon.d.ts +3 -0
  4. package/dist/cli/commands/daemon.d.ts.map +1 -0
  5. package/dist/cli/commands/daemon.js +179 -0
  6. package/dist/cli/commands/daemon.js.map +1 -0
  7. package/dist/cli/commands/index.d.ts +6 -0
  8. package/dist/cli/commands/index.d.ts.map +1 -0
  9. package/dist/cli/commands/index.js +6 -0
  10. package/dist/cli/commands/index.js.map +1 -0
  11. package/dist/cli/commands/list.d.ts +3 -0
  12. package/dist/cli/commands/list.d.ts.map +1 -0
  13. package/dist/cli/commands/list.js +100 -0
  14. package/dist/cli/commands/list.js.map +1 -0
  15. package/dist/cli/commands/run.d.ts +3 -0
  16. package/dist/cli/commands/run.d.ts.map +1 -0
  17. package/dist/cli/commands/run.js +107 -0
  18. package/dist/cli/commands/run.js.map +1 -0
  19. package/dist/cli/commands/schedule.d.ts +3 -0
  20. package/dist/cli/commands/schedule.d.ts.map +1 -0
  21. package/dist/cli/commands/schedule.js +172 -0
  22. package/dist/cli/commands/schedule.js.map +1 -0
  23. package/dist/cli/commands/show.d.ts +3 -0
  24. package/dist/cli/commands/show.d.ts.map +1 -0
  25. package/dist/cli/commands/show.js +122 -0
  26. package/dist/cli/commands/show.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +38 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/cli/lib/index.d.ts +2 -0
  32. package/dist/cli/lib/index.d.ts.map +1 -0
  33. package/dist/cli/lib/index.js +2 -0
  34. package/dist/cli/lib/index.js.map +1 -0
  35. package/dist/cli/lib/runner.d.ts +41 -0
  36. package/dist/cli/lib/runner.d.ts.map +1 -0
  37. package/dist/cli/lib/runner.js +179 -0
  38. package/dist/cli/lib/runner.js.map +1 -0
  39. package/dist/daemon/api/index.d.ts +2 -0
  40. package/dist/daemon/api/index.d.ts.map +1 -0
  41. package/dist/daemon/api/index.js +2 -0
  42. package/dist/daemon/api/index.js.map +1 -0
  43. package/dist/daemon/api/server.d.ts +12 -0
  44. package/dist/daemon/api/server.d.ts.map +1 -0
  45. package/dist/daemon/api/server.js +111 -0
  46. package/dist/daemon/api/server.js.map +1 -0
  47. package/dist/daemon/daemon.d.ts +95 -0
  48. package/dist/daemon/daemon.d.ts.map +1 -0
  49. package/dist/daemon/daemon.js +265 -0
  50. package/dist/daemon/daemon.js.map +1 -0
  51. package/dist/daemon/index.d.ts +4 -0
  52. package/dist/daemon/index.d.ts.map +1 -0
  53. package/dist/daemon/index.js +4 -0
  54. package/dist/daemon/index.js.map +1 -0
  55. package/dist/daemon/lib/executor.d.ts +17 -0
  56. package/dist/daemon/lib/executor.d.ts.map +1 -0
  57. package/dist/daemon/lib/executor.js +169 -0
  58. package/dist/daemon/lib/executor.js.map +1 -0
  59. package/dist/daemon/lib/index.d.ts +4 -0
  60. package/dist/daemon/lib/index.d.ts.map +1 -0
  61. package/dist/daemon/lib/index.js +4 -0
  62. package/dist/daemon/lib/index.js.map +1 -0
  63. package/dist/daemon/lib/scheduler.d.ts +90 -0
  64. package/dist/daemon/lib/scheduler.d.ts.map +1 -0
  65. package/dist/daemon/lib/scheduler.js +176 -0
  66. package/dist/daemon/lib/scheduler.js.map +1 -0
  67. package/dist/daemon/lib/watcher.d.ts +48 -0
  68. package/dist/daemon/lib/watcher.d.ts.map +1 -0
  69. package/dist/daemon/lib/watcher.js +77 -0
  70. package/dist/daemon/lib/watcher.js.map +1 -0
  71. package/dist/lib/config.d.ts +14 -0
  72. package/dist/lib/config.d.ts.map +1 -0
  73. package/dist/lib/config.js +76 -0
  74. package/dist/lib/config.js.map +1 -0
  75. package/dist/lib/frontmatter.d.ts +18 -0
  76. package/dist/lib/frontmatter.d.ts.map +1 -0
  77. package/dist/lib/frontmatter.js +26 -0
  78. package/dist/lib/frontmatter.js.map +1 -0
  79. package/dist/lib/index.d.ts +7 -0
  80. package/dist/lib/index.d.ts.map +1 -0
  81. package/dist/lib/index.js +9 -0
  82. package/dist/lib/index.js.map +1 -0
  83. package/dist/lib/persona.d.ts +32 -0
  84. package/dist/lib/persona.d.ts.map +1 -0
  85. package/dist/lib/persona.js +177 -0
  86. package/dist/lib/persona.js.map +1 -0
  87. package/dist/lib/types/index.d.ts +69 -0
  88. package/dist/lib/types/index.d.ts.map +1 -0
  89. package/dist/lib/types/index.js +4 -0
  90. package/dist/lib/types/index.js.map +1 -0
  91. package/dist/lib/types/persona.d.ts +46 -0
  92. package/dist/lib/types/persona.d.ts.map +1 -0
  93. package/dist/lib/types/persona.js +2 -0
  94. package/dist/lib/types/persona.js.map +1 -0
  95. package/dist/lib/types/triggers.d.ts +96 -0
  96. package/dist/lib/types/triggers.d.ts.map +1 -0
  97. package/dist/lib/types/triggers.js +2 -0
  98. package/dist/lib/types/triggers.js.map +1 -0
  99. package/dist/lib/types/workflow.d.ts +75 -0
  100. package/dist/lib/types/workflow.d.ts.map +1 -0
  101. package/dist/lib/types/workflow.js +2 -0
  102. package/dist/lib/types/workflow.js.map +1 -0
  103. package/dist/lib/variables.d.ts +28 -0
  104. package/dist/lib/variables.d.ts.map +1 -0
  105. package/dist/lib/variables.js +113 -0
  106. package/dist/lib/variables.js.map +1 -0
  107. package/dist/lib/workflow.d.ts +29 -0
  108. package/dist/lib/workflow.d.ts.map +1 -0
  109. package/dist/lib/workflow.js +155 -0
  110. package/dist/lib/workflow.js.map +1 -0
  111. package/package.json +71 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Generate a unique run ID
3
+ */
4
+ export function generateRunId() {
5
+ const timestamp = Date.now().toString(36);
6
+ const random = Math.random().toString(36).substring(2, 8);
7
+ return `${timestamp}-${random}`;
8
+ }
9
+ /**
10
+ * Create execution context with built-in variables
11
+ */
12
+ export function createExecutionContext(overrides = {}) {
13
+ const now = new Date();
14
+ return {
15
+ DATE: now.toISOString().split("T")[0],
16
+ DATETIME: now.toISOString(),
17
+ TIME: now.toTimeString().split(" ")[0],
18
+ RUN_ID: generateRunId(),
19
+ ...overrides,
20
+ };
21
+ }
22
+ /**
23
+ * Expand environment variables in a string
24
+ * Supports ${VAR} syntax
25
+ */
26
+ export function expandVariables(template, context, env = process.env) {
27
+ // Combined context: explicit context takes precedence over env
28
+ const combined = { ...env, ...context };
29
+ return template.replace(/\$\{([^}]+)\}/g, (match, varName) => {
30
+ const value = combined[varName];
31
+ if (value !== undefined) {
32
+ return value;
33
+ }
34
+ // Leave unmatched variables as-is
35
+ return match;
36
+ });
37
+ }
38
+ /**
39
+ * Expand variables in an object's string values (recursive)
40
+ */
41
+ export function expandObjectVariables(obj, context, env) {
42
+ const result = {};
43
+ for (const [key, value] of Object.entries(obj)) {
44
+ if (typeof value === "string") {
45
+ result[key] = expandVariables(value, context, env);
46
+ }
47
+ else if (Array.isArray(value)) {
48
+ result[key] = value.map((item) => typeof item === "string"
49
+ ? expandVariables(item, context, env)
50
+ : typeof item === "object" && item !== null
51
+ ? expandObjectVariables(item, context, env)
52
+ : item);
53
+ }
54
+ else if (typeof value === "object" && value !== null) {
55
+ result[key] = expandObjectVariables(value, context, env);
56
+ }
57
+ else {
58
+ result[key] = value;
59
+ }
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Process simple conditionals in a template
65
+ * Supports: {{#if var}}...{{/if}} and {{#unless var}}...{{/unless}}
66
+ */
67
+ export function processConditionals(template, context) {
68
+ let result = template;
69
+ // Process {{#if var}}...{{/if}}
70
+ result = result.replace(/\{\{#if\s+(\w+)\s*\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, varName, content) => {
71
+ const value = context[varName];
72
+ // Truthy check: exists and not empty string/false/0
73
+ if (value && value !== "" && value !== false && value !== 0) {
74
+ return content;
75
+ }
76
+ return "";
77
+ });
78
+ // Process {{#unless var}}...{{/unless}}
79
+ result = result.replace(/\{\{#unless\s+(\w+)\s*\}\}([\s\S]*?)\{\{\/unless\}\}/g, (_, varName, content) => {
80
+ const value = context[varName];
81
+ // Falsy check
82
+ if (!value || value === "" || value === false || value === 0) {
83
+ return content;
84
+ }
85
+ return "";
86
+ });
87
+ // Process {{#if var == "value"}}...{{/if}}
88
+ result = result.replace(/\{\{#if\s+(\w+)\s*==\s*"([^"]+)"\s*\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, varName, compareValue, content) => {
89
+ const value = context[varName];
90
+ if (String(value) === compareValue) {
91
+ return content;
92
+ }
93
+ return "";
94
+ });
95
+ return result;
96
+ }
97
+ /**
98
+ * Full template processing: conditionals then variable expansion
99
+ */
100
+ export function processTemplate(template, context, env) {
101
+ // First process conditionals
102
+ let result = processConditionals(template, context);
103
+ // Then expand variables
104
+ const stringContext = {};
105
+ for (const [key, value] of Object.entries(context)) {
106
+ if (value !== undefined && value !== null) {
107
+ stringContext[key] = String(value);
108
+ }
109
+ }
110
+ result = expandVariables(result, stringContext, env);
111
+ return result;
112
+ }
113
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/lib/variables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Workflow } from "./types/workflow.js";
2
+ /**
3
+ * Load a single workflow file
4
+ */
5
+ export declare function loadWorkflow(workflowPath: string): Promise<Workflow>;
6
+ /**
7
+ * List all workflows in a directory (recursive)
8
+ */
9
+ export declare function listWorkflows(workflowsRoot: string): Promise<string[]>;
10
+ /**
11
+ * Find a workflow by name
12
+ */
13
+ export declare function findWorkflow(name: string, workflowsRoot: string): Promise<Workflow | null>;
14
+ /**
15
+ * Get all scheduled workflows
16
+ */
17
+ export declare function getScheduledWorkflows(workflowsRoot: string): Promise<Workflow[]>;
18
+ /**
19
+ * Validate workflow inputs against definition
20
+ */
21
+ export declare function validateInputs(workflow: Workflow, inputs: Record<string, unknown>): {
22
+ valid: boolean;
23
+ errors: string[];
24
+ };
25
+ /**
26
+ * Get default values for workflow inputs
27
+ */
28
+ export declare function getInputDefaults(workflow: Workflow): Record<string, string | number | boolean>;
29
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/lib/workflow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,qBAAqB,CAAC;AAIzE;;GAEG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+B1E;AAeD;;GAEG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuB5E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAe1B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgBrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2CtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAU3C"}
@@ -0,0 +1,155 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { join, dirname } from "node:path";
3
+ import { loadMarkdownFile } from "./frontmatter.js";
4
+ const WORKFLOW_FILENAME = "WORKFLOW.md";
5
+ /**
6
+ * Load a single workflow file
7
+ */
8
+ export async function loadWorkflow(workflowPath) {
9
+ const filePath = workflowPath.endsWith(WORKFLOW_FILENAME)
10
+ ? workflowPath
11
+ : join(workflowPath, WORKFLOW_FILENAME);
12
+ const { frontmatter, body } = await loadMarkdownFile(filePath);
13
+ if (!frontmatter.name) {
14
+ throw new Error(`Workflow missing required 'name' field: ${filePath}`);
15
+ }
16
+ if (!frontmatter.description) {
17
+ throw new Error(`Workflow missing required 'description' field: ${filePath}`);
18
+ }
19
+ if (!frontmatter.persona) {
20
+ throw new Error(`Workflow missing required 'persona' field: ${filePath}`);
21
+ }
22
+ if (!body) {
23
+ throw new Error(`Workflow missing task body: ${filePath}`);
24
+ }
25
+ return {
26
+ ...frontmatter,
27
+ path: dirname(filePath),
28
+ task: body,
29
+ };
30
+ }
31
+ /**
32
+ * Check if a directory contains a WORKFLOW.md file
33
+ */
34
+ async function hasWorkflowFile(dirPath) {
35
+ try {
36
+ const filePath = join(dirPath, WORKFLOW_FILENAME);
37
+ const stats = await stat(filePath);
38
+ return stats.isFile();
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * List all workflows in a directory (recursive)
46
+ */
47
+ export async function listWorkflows(workflowsRoot) {
48
+ const workflows = [];
49
+ async function scanDir(dir) {
50
+ try {
51
+ const entries = await readdir(dir, { withFileTypes: true });
52
+ for (const entry of entries) {
53
+ if (entry.isDirectory()) {
54
+ const subDir = join(dir, entry.name);
55
+ if (await hasWorkflowFile(subDir)) {
56
+ workflows.push(subDir);
57
+ }
58
+ await scanDir(subDir);
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // Directory doesn't exist or not readable
64
+ }
65
+ }
66
+ await scanDir(workflowsRoot);
67
+ return workflows;
68
+ }
69
+ /**
70
+ * Find a workflow by name
71
+ */
72
+ export async function findWorkflow(name, workflowsRoot) {
73
+ const workflowPaths = await listWorkflows(workflowsRoot);
74
+ for (const workflowPath of workflowPaths) {
75
+ try {
76
+ const workflow = await loadWorkflow(workflowPath);
77
+ if (workflow.name === name) {
78
+ return workflow;
79
+ }
80
+ }
81
+ catch {
82
+ // Skip invalid workflows
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ /**
88
+ * Get all scheduled workflows
89
+ */
90
+ export async function getScheduledWorkflows(workflowsRoot) {
91
+ const workflowPaths = await listWorkflows(workflowsRoot);
92
+ const scheduled = [];
93
+ for (const workflowPath of workflowPaths) {
94
+ try {
95
+ const workflow = await loadWorkflow(workflowPath);
96
+ if (workflow.on?.schedule && workflow.on.schedule.length > 0) {
97
+ scheduled.push(workflow);
98
+ }
99
+ }
100
+ catch {
101
+ // Skip invalid workflows
102
+ }
103
+ }
104
+ return scheduled;
105
+ }
106
+ /**
107
+ * Validate workflow inputs against definition
108
+ */
109
+ export function validateInputs(workflow, inputs) {
110
+ const errors = [];
111
+ for (const inputDef of workflow.inputs ?? []) {
112
+ const value = inputs[inputDef.name];
113
+ // Check required
114
+ if (inputDef.required && value === undefined) {
115
+ errors.push(`Missing required input: ${inputDef.name}`);
116
+ continue;
117
+ }
118
+ // Skip validation for undefined optional inputs
119
+ if (value === undefined)
120
+ continue;
121
+ // Type validation
122
+ if (inputDef.type) {
123
+ const actualType = typeof value;
124
+ if (inputDef.type === "path") {
125
+ if (actualType !== "string") {
126
+ errors.push(`Input '${inputDef.name}' must be a path (string), got ${actualType}`);
127
+ }
128
+ }
129
+ else if (actualType !== inputDef.type) {
130
+ errors.push(`Input '${inputDef.name}' must be ${inputDef.type}, got ${actualType}`);
131
+ }
132
+ }
133
+ // Enum validation
134
+ if (inputDef.enum && !inputDef.enum.includes(value)) {
135
+ errors.push(`Input '${inputDef.name}' must be one of: ${inputDef.enum.join(", ")}`);
136
+ }
137
+ }
138
+ return {
139
+ valid: errors.length === 0,
140
+ errors,
141
+ };
142
+ }
143
+ /**
144
+ * Get default values for workflow inputs
145
+ */
146
+ export function getInputDefaults(workflow) {
147
+ const defaults = {};
148
+ for (const inputDef of workflow.inputs ?? []) {
149
+ if (inputDef.default !== undefined) {
150
+ defaults[inputDef.name] = inputDef.default;
151
+ }
152
+ }
153
+ return defaults;
154
+ }
155
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/lib/workflow.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "dot-agents",
3
+ "version": "0.1.0",
4
+ "description": "A framework for building agentic workflows with personas and scheduled execution",
5
+ "type": "module",
6
+ "main": "./dist/lib/index.js",
7
+ "types": "./dist/lib/index.d.ts",
8
+ "bin": {
9
+ "dot-agents": "./dist/cli/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/lib/index.d.ts",
14
+ "import": "./dist/lib/index.js"
15
+ },
16
+ "./daemon": {
17
+ "types": "./dist/daemon/index.d.ts",
18
+ "import": "./dist/daemon/index.js"
19
+ }
20
+ },
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
+ "typecheck": "tsc --noEmit",
25
+ "clean": "rm -rf dist *.tsbuildinfo",
26
+ "prepublishOnly": "npm run clean && npm run build"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/tnez/dot-agents.git"
36
+ },
37
+ "homepage": "https://github.com/tnez/dot-agents#readme",
38
+ "bugs": {
39
+ "url": "https://github.com/tnez/dot-agents/issues"
40
+ },
41
+ "author": "tnez",
42
+ "license": "MIT",
43
+ "keywords": [
44
+ "agents",
45
+ "ai",
46
+ "workflows",
47
+ "automation",
48
+ "claude",
49
+ "llm",
50
+ "cli"
51
+ ],
52
+ "engines": {
53
+ "node": ">=20.0.0"
54
+ },
55
+ "dependencies": {
56
+ "chalk": "^5.3.0",
57
+ "chokidar": "^4.0.1",
58
+ "commander": "^12.1.0",
59
+ "cron": "^3.1.7",
60
+ "execa": "^9.5.1",
61
+ "express": "^4.21.1",
62
+ "glob": "^11.0.0",
63
+ "handlebars": "^4.7.8",
64
+ "yaml": "^2.6.1"
65
+ },
66
+ "devDependencies": {
67
+ "@types/express": "^5.0.0",
68
+ "@types/node": "^22.10.1",
69
+ "typescript": "^5.7.2"
70
+ }
71
+ }