@engramm/dev-workflow 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 (234) hide show
  1. package/dist/agents/context-builder.d.ts +11 -0
  2. package/dist/agents/context-builder.d.ts.map +1 -0
  3. package/dist/agents/context-builder.js +62 -0
  4. package/dist/agents/context-builder.js.map +1 -0
  5. package/dist/agents/loader.d.ts +3 -0
  6. package/dist/agents/loader.d.ts.map +1 -0
  7. package/dist/agents/loader.js +54 -0
  8. package/dist/agents/loader.js.map +1 -0
  9. package/dist/agents/registry.d.ts +10 -0
  10. package/dist/agents/registry.d.ts.map +1 -0
  11. package/dist/agents/registry.js +35 -0
  12. package/dist/agents/registry.js.map +1 -0
  13. package/dist/agents/types.d.ts +20 -0
  14. package/dist/agents/types.d.ts.map +1 -0
  15. package/dist/agents/types.js +2 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/cli/agent.d.ts +2 -0
  18. package/dist/cli/agent.d.ts.map +1 -0
  19. package/dist/cli/agent.js +101 -0
  20. package/dist/cli/agent.js.map +1 -0
  21. package/dist/cli/config.d.ts +2 -0
  22. package/dist/cli/config.d.ts.map +1 -0
  23. package/dist/cli/config.js +100 -0
  24. package/dist/cli/config.js.map +1 -0
  25. package/dist/cli/doctor.d.ts +2 -0
  26. package/dist/cli/doctor.d.ts.map +1 -0
  27. package/dist/cli/doctor.js +123 -0
  28. package/dist/cli/doctor.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +94 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/init.d.ts +7 -0
  34. package/dist/cli/init.d.ts.map +1 -0
  35. package/dist/cli/init.js +177 -0
  36. package/dist/cli/init.js.map +1 -0
  37. package/dist/cli/run.d.ts +4 -0
  38. package/dist/cli/run.d.ts.map +1 -0
  39. package/dist/cli/run.js +191 -0
  40. package/dist/cli/run.js.map +1 -0
  41. package/dist/cli/search.d.ts +2 -0
  42. package/dist/cli/search.d.ts.map +1 -0
  43. package/dist/cli/search.js +75 -0
  44. package/dist/cli/search.js.map +1 -0
  45. package/dist/cli/serve.d.ts +2 -0
  46. package/dist/cli/serve.d.ts.map +1 -0
  47. package/dist/cli/serve.js +34 -0
  48. package/dist/cli/serve.js.map +1 -0
  49. package/dist/cli/status.d.ts +2 -0
  50. package/dist/cli/status.d.ts.map +1 -0
  51. package/dist/cli/status.js +89 -0
  52. package/dist/cli/status.js.map +1 -0
  53. package/dist/cli/task.d.ts +2 -0
  54. package/dist/cli/task.d.ts.map +1 -0
  55. package/dist/cli/task.js +153 -0
  56. package/dist/cli/task.js.map +1 -0
  57. package/dist/cli/vault-io.d.ts +3 -0
  58. package/dist/cli/vault-io.d.ts.map +1 -0
  59. package/dist/cli/vault-io.js +75 -0
  60. package/dist/cli/vault-io.js.map +1 -0
  61. package/dist/hooks/post-edit.d.ts +3 -0
  62. package/dist/hooks/post-edit.d.ts.map +1 -0
  63. package/dist/hooks/post-edit.js +43 -0
  64. package/dist/hooks/post-edit.js.map +1 -0
  65. package/dist/hooks/post-task.d.ts +3 -0
  66. package/dist/hooks/post-task.d.ts.map +1 -0
  67. package/dist/hooks/post-task.js +25 -0
  68. package/dist/hooks/post-task.js.map +1 -0
  69. package/dist/hooks/pre-compact.d.ts +7 -0
  70. package/dist/hooks/pre-compact.d.ts.map +1 -0
  71. package/dist/hooks/pre-compact.js +34 -0
  72. package/dist/hooks/pre-compact.js.map +1 -0
  73. package/dist/hooks/session-end.d.ts +3 -0
  74. package/dist/hooks/session-end.d.ts.map +1 -0
  75. package/dist/hooks/session-end.js +80 -0
  76. package/dist/hooks/session-end.js.map +1 -0
  77. package/dist/hooks/session-start.d.ts +3 -0
  78. package/dist/hooks/session-start.d.ts.map +1 -0
  79. package/dist/hooks/session-start.js +108 -0
  80. package/dist/hooks/session-start.js.map +1 -0
  81. package/dist/index.d.ts +33 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +27 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/intelligence/collector.d.ts +12 -0
  86. package/dist/intelligence/collector.d.ts.map +1 -0
  87. package/dist/intelligence/collector.js +93 -0
  88. package/dist/intelligence/collector.js.map +1 -0
  89. package/dist/intelligence/ranker.d.ts +5 -0
  90. package/dist/intelligence/ranker.d.ts.map +1 -0
  91. package/dist/intelligence/ranker.js +107 -0
  92. package/dist/intelligence/ranker.js.map +1 -0
  93. package/dist/intelligence/store.d.ts +17 -0
  94. package/dist/intelligence/store.d.ts.map +1 -0
  95. package/dist/intelligence/store.js +75 -0
  96. package/dist/intelligence/store.js.map +1 -0
  97. package/dist/intelligence/sync.d.ts +3 -0
  98. package/dist/intelligence/sync.d.ts.map +1 -0
  99. package/dist/intelligence/sync.js +83 -0
  100. package/dist/intelligence/sync.js.map +1 -0
  101. package/dist/intelligence/types.d.ts +35 -0
  102. package/dist/intelligence/types.d.ts.map +1 -0
  103. package/dist/intelligence/types.js +2 -0
  104. package/dist/intelligence/types.js.map +1 -0
  105. package/dist/lib/context.d.ts +3 -0
  106. package/dist/lib/context.d.ts.map +1 -0
  107. package/dist/lib/context.js +56 -0
  108. package/dist/lib/context.js.map +1 -0
  109. package/dist/lib/conventions-detect.d.ts +12 -0
  110. package/dist/lib/conventions-detect.d.ts.map +1 -0
  111. package/dist/lib/conventions-detect.js +337 -0
  112. package/dist/lib/conventions-detect.js.map +1 -0
  113. package/dist/lib/frontmatter.d.ts +7 -0
  114. package/dist/lib/frontmatter.d.ts.map +1 -0
  115. package/dist/lib/frontmatter.js +45 -0
  116. package/dist/lib/frontmatter.js.map +1 -0
  117. package/dist/lib/fs-helpers.d.ts +6 -0
  118. package/dist/lib/fs-helpers.d.ts.map +1 -0
  119. package/dist/lib/fs-helpers.js +24 -0
  120. package/dist/lib/fs-helpers.js.map +1 -0
  121. package/dist/lib/interpolate.d.ts +2 -0
  122. package/dist/lib/interpolate.d.ts.map +1 -0
  123. package/dist/lib/interpolate.js +4 -0
  124. package/dist/lib/interpolate.js.map +1 -0
  125. package/dist/lib/output.d.ts +27 -0
  126. package/dist/lib/output.d.ts.map +1 -0
  127. package/dist/lib/output.js +85 -0
  128. package/dist/lib/output.js.map +1 -0
  129. package/dist/lib/reader.d.ts +14 -0
  130. package/dist/lib/reader.d.ts.map +1 -0
  131. package/dist/lib/reader.js +75 -0
  132. package/dist/lib/reader.js.map +1 -0
  133. package/dist/lib/stack-detect.d.ts +12 -0
  134. package/dist/lib/stack-detect.d.ts.map +1 -0
  135. package/dist/lib/stack-detect.js +302 -0
  136. package/dist/lib/stack-detect.js.map +1 -0
  137. package/dist/lib/statusline.d.ts +3 -0
  138. package/dist/lib/statusline.d.ts.map +1 -0
  139. package/dist/lib/statusline.js +40 -0
  140. package/dist/lib/statusline.js.map +1 -0
  141. package/dist/lib/templates.d.ts +3 -0
  142. package/dist/lib/templates.d.ts.map +1 -0
  143. package/dist/lib/templates.js +174 -0
  144. package/dist/lib/templates.js.map +1 -0
  145. package/dist/lib/types.d.ts +44 -0
  146. package/dist/lib/types.d.ts.map +1 -0
  147. package/dist/lib/types.js +2 -0
  148. package/dist/lib/types.js.map +1 -0
  149. package/dist/lib/writer.d.ts +13 -0
  150. package/dist/lib/writer.d.ts.map +1 -0
  151. package/dist/lib/writer.js +97 -0
  152. package/dist/lib/writer.js.map +1 -0
  153. package/dist/mcp/handlers.d.ts +34 -0
  154. package/dist/mcp/handlers.d.ts.map +1 -0
  155. package/dist/mcp/handlers.js +256 -0
  156. package/dist/mcp/handlers.js.map +1 -0
  157. package/dist/mcp/server.d.ts +20 -0
  158. package/dist/mcp/server.d.ts.map +1 -0
  159. package/dist/mcp/server.js +89 -0
  160. package/dist/mcp/server.js.map +1 -0
  161. package/dist/mcp/tools.d.ts +11 -0
  162. package/dist/mcp/tools.d.ts.map +1 -0
  163. package/dist/mcp/tools.js +148 -0
  164. package/dist/mcp/tools.js.map +1 -0
  165. package/dist/tasks/manager.d.ts +14 -0
  166. package/dist/tasks/manager.d.ts.map +1 -0
  167. package/dist/tasks/manager.js +151 -0
  168. package/dist/tasks/manager.js.map +1 -0
  169. package/dist/tasks/tracker.d.ts +11 -0
  170. package/dist/tasks/tracker.d.ts.map +1 -0
  171. package/dist/tasks/tracker.js +31 -0
  172. package/dist/tasks/tracker.js.map +1 -0
  173. package/dist/tasks/types.d.ts +19 -0
  174. package/dist/tasks/types.d.ts.map +1 -0
  175. package/dist/tasks/types.js +2 -0
  176. package/dist/tasks/types.js.map +1 -0
  177. package/dist/workflow/builtin.d.ts +4 -0
  178. package/dist/workflow/builtin.d.ts.map +1 -0
  179. package/dist/workflow/builtin.js +93 -0
  180. package/dist/workflow/builtin.js.map +1 -0
  181. package/dist/workflow/engine.d.ts +38 -0
  182. package/dist/workflow/engine.d.ts.map +1 -0
  183. package/dist/workflow/engine.js +217 -0
  184. package/dist/workflow/engine.js.map +1 -0
  185. package/dist/workflow/loader.d.ts +4 -0
  186. package/dist/workflow/loader.d.ts.map +1 -0
  187. package/dist/workflow/loader.js +106 -0
  188. package/dist/workflow/loader.js.map +1 -0
  189. package/dist/workflow/state.d.ts +11 -0
  190. package/dist/workflow/state.d.ts.map +1 -0
  191. package/dist/workflow/state.js +49 -0
  192. package/dist/workflow/state.js.map +1 -0
  193. package/dist/workflow/types.d.ts +36 -0
  194. package/dist/workflow/types.d.ts.map +1 -0
  195. package/dist/workflow/types.js +2 -0
  196. package/dist/workflow/types.js.map +1 -0
  197. package/package.json +54 -0
  198. package/templates/agents/architect.md +46 -0
  199. package/templates/agents/coder.md +46 -0
  200. package/templates/agents/committer.md +29 -0
  201. package/templates/agents/debugger.md +54 -0
  202. package/templates/agents/planner.md +45 -0
  203. package/templates/agents/reader.md +48 -0
  204. package/templates/agents/reviewer.md +48 -0
  205. package/templates/agents/tester.md +41 -0
  206. package/templates/claude/agents/researcher.md +47 -0
  207. package/templates/claude/agents/writer.md +29 -0
  208. package/templates/claude/commands/git/changelog.md +41 -0
  209. package/templates/claude/commands/git/merge.md +37 -0
  210. package/templates/claude/commands/git/new-branch.md +34 -0
  211. package/templates/claude/commands/git/pr-review.md +64 -0
  212. package/templates/claude/commands/session/handover.md +49 -0
  213. package/templates/claude/commands/session/resume.md +43 -0
  214. package/templates/claude/commands/session/review.md +81 -0
  215. package/templates/claude/commands/task.md +52 -0
  216. package/templates/claude/commands/vault/adr.md +39 -0
  217. package/templates/claude/commands/vault/analyze.md +110 -0
  218. package/templates/claude/commands/vault/bug.md +31 -0
  219. package/templates/claude/commands/vault/debt.md +28 -0
  220. package/templates/claude/commands/vault/deps.md +36 -0
  221. package/templates/claude/commands/vault/from-spec.md +306 -0
  222. package/templates/claude/commands/vault/search.md +31 -0
  223. package/templates/claude/commands/vault/security-scan.md +50 -0
  224. package/templates/claude/commands/vault/test-gaps.md +38 -0
  225. package/templates/claude/commands/workflow/dev.md +913 -0
  226. package/templates/claude/commands/workflow.md +47 -0
  227. package/templates/claude/settings.json +52 -0
  228. package/templates/claude/skills/obsidian-markdown/SKILL.md +196 -0
  229. package/templates/claude/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
  230. package/templates/claude/skills/obsidian-markdown/references/EMBEDS.md +63 -0
  231. package/templates/claude/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
  232. package/templates/workflows/deploy.yaml +21 -0
  233. package/templates/workflows/release.yaml +26 -0
  234. package/templates/workflows/spike.yaml +14 -0
@@ -0,0 +1,151 @@
1
+ import { readdirSync, existsSync, unlinkSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parseFrontmatter, serializeFrontmatter } from "../lib/frontmatter.js";
4
+ import { readFileOrNull, writeFileSafe, todayDate } from "../lib/fs-helpers.js";
5
+ const VALID_STATUSES = new Set([
6
+ "pending", "in-progress", "review", "done", "blocked",
7
+ ]);
8
+ const VALID_PRIORITIES = new Set(["high", "medium", "low"]);
9
+ const TASK_ID_PATTERN = /^task-\d{3,}$/;
10
+ function validateTaskId(id) {
11
+ if (!TASK_ID_PATTERN.test(id)) {
12
+ throw new Error(`Invalid task ID: ${id}`);
13
+ }
14
+ }
15
+ function parseTaskFile(filepath) {
16
+ const raw = readFileOrNull(filepath);
17
+ if (!raw)
18
+ return null;
19
+ const { fields, body } = parseFrontmatter(raw);
20
+ const id = fields["id"];
21
+ const title = fields["title"];
22
+ if (typeof id !== "string" || typeof title !== "string")
23
+ return null;
24
+ const status = typeof fields["status"] === "string" && VALID_STATUSES.has(fields["status"])
25
+ ? fields["status"]
26
+ : "pending";
27
+ const priority = typeof fields["priority"] === "string" && VALID_PRIORITIES.has(fields["priority"])
28
+ ? fields["priority"]
29
+ : "medium";
30
+ return {
31
+ id,
32
+ title,
33
+ description: body.trim(),
34
+ status,
35
+ priority,
36
+ branch: typeof fields["branch"] === "string" ? fields["branch"] : null,
37
+ workflowRun: typeof fields["workflowRun"] === "string" ? fields["workflowRun"] : null,
38
+ created: typeof fields["created"] === "string" ? fields["created"] : todayDate(),
39
+ updated: typeof fields["updated"] === "string" ? fields["updated"] : todayDate(),
40
+ };
41
+ }
42
+ function serializeTask(task) {
43
+ const fields = {
44
+ id: task.id,
45
+ title: task.title,
46
+ status: task.status,
47
+ priority: task.priority,
48
+ created: task.created,
49
+ updated: task.updated,
50
+ };
51
+ if (task.branch)
52
+ fields["branch"] = task.branch;
53
+ if (task.workflowRun)
54
+ fields["workflowRun"] = task.workflowRun;
55
+ return serializeFrontmatter(fields, task.description);
56
+ }
57
+ export class TaskManager {
58
+ tasksDir;
59
+ constructor(vaultPath) {
60
+ this.tasksDir = join(vaultPath, "tasks");
61
+ }
62
+ create(title, description = "") {
63
+ const id = this.nextId();
64
+ const today = todayDate();
65
+ const task = {
66
+ id,
67
+ title,
68
+ description,
69
+ status: "pending",
70
+ priority: "medium",
71
+ branch: null,
72
+ workflowRun: null,
73
+ created: today,
74
+ updated: today,
75
+ };
76
+ writeFileSafe(join(this.tasksDir, `${id}.md`), serializeTask(task));
77
+ return task;
78
+ }
79
+ get(id) {
80
+ validateTaskId(id);
81
+ const filepath = join(this.tasksDir, `${id}.md`);
82
+ const task = parseTaskFile(filepath);
83
+ if (!task) {
84
+ throw new Error(`Task not found: ${id}`);
85
+ }
86
+ return task;
87
+ }
88
+ list(filter) {
89
+ if (!existsSync(this.tasksDir))
90
+ return [];
91
+ const files = readdirSync(this.tasksDir)
92
+ .filter((file) => file.startsWith("task-") && file.endsWith(".md"));
93
+ const tasks = [];
94
+ for (const file of files) {
95
+ const task = parseTaskFile(join(this.tasksDir, file));
96
+ if (!task)
97
+ continue;
98
+ if (filter?.status && task.status !== filter.status)
99
+ continue;
100
+ if (filter?.priority && task.priority !== filter.priority)
101
+ continue;
102
+ if (filter?.branch && task.branch !== filter.branch)
103
+ continue;
104
+ tasks.push(task);
105
+ }
106
+ return tasks.sort((a, b) => b.updated.localeCompare(a.updated));
107
+ }
108
+ update(id, patch) {
109
+ validateTaskId(id);
110
+ const task = this.get(id);
111
+ if (patch.status !== undefined)
112
+ task.status = patch.status;
113
+ if (patch.priority !== undefined)
114
+ task.priority = patch.priority;
115
+ if (patch.description !== undefined)
116
+ task.description = patch.description;
117
+ if (patch.branch !== undefined)
118
+ task.branch = patch.branch;
119
+ if (patch.workflowRun !== undefined)
120
+ task.workflowRun = patch.workflowRun;
121
+ task.updated = todayDate();
122
+ writeFileSafe(join(this.tasksDir, `${id}.md`), serializeTask(task));
123
+ return task;
124
+ }
125
+ delete(id) {
126
+ validateTaskId(id);
127
+ const filepath = join(this.tasksDir, `${id}.md`);
128
+ if (!existsSync(filepath)) {
129
+ throw new Error(`Task not found: ${id}`);
130
+ }
131
+ unlinkSync(filepath);
132
+ }
133
+ nextId() {
134
+ if (!existsSync(this.tasksDir)) {
135
+ return "task-001";
136
+ }
137
+ const files = readdirSync(this.tasksDir)
138
+ .filter((file) => file.startsWith("task-") && file.endsWith(".md"));
139
+ let maxNumber = 0;
140
+ for (const file of files) {
141
+ const match = file.match(/^task-(\d+)\.md$/);
142
+ if (match) {
143
+ const number = parseInt(match[1], 10);
144
+ if (number > maxNumber)
145
+ maxNumber = number;
146
+ }
147
+ }
148
+ return `task-${String(maxNumber + 1).padStart(3, "0")}`;
149
+ }
150
+ }
151
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tasks/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGhF,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS;CACtD,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAIjF,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,SAAS,cAAc,CAAC,EAAU;IAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAErE,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzF,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAe;QAChC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACjG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAiB;QACpC,CAAC,CAAC,QAAQ,CAAC;IAEb,OAAO;QACL,EAAE;QACF,KAAK;QACL,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;QACxB,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACtE,WAAW,EAAE,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QACrF,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;QAChF,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;KACjF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAU;IAC/B,MAAM,MAAM,GAA4B;QACtC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,IAAI,IAAI,CAAC,WAAW;QAAE,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;IAE/D,OAAO,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,OAAO,WAAW;IACL,QAAQ,CAAS;IAElC,YAAY,SAAiB;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,cAAsB,EAAE;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAE1B,MAAM,IAAI,GAAS;YACjB,EAAE;YACF,KAAK;YACL,WAAW;YACX,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAmB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,IAAI,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBAAE,SAAS;YAC9D,IAAI,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;gBAAE,SAAS;YACpE,IAAI,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBAAE,SAAS;YAE9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,KAAgB;QACjC,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3D,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjE,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3D,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1E,IAAI,CAAC,OAAO,GAAG,SAAS,EAAE,CAAC;QAE3B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAU;QACf,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtE,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,MAAM,GAAG,SAAS;oBAAE,SAAS,GAAG,MAAM,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { TaskManager } from "./manager.js";
2
+ import type { Task } from "./types.js";
3
+ export declare class TaskTracker {
4
+ private readonly projectRoot;
5
+ private readonly taskManager;
6
+ constructor(projectRoot: string, taskManager: TaskManager);
7
+ linkBranch(taskId: string, branch: string): void;
8
+ findByBranch(branch: string): Task | null;
9
+ currentTask(): Task | null;
10
+ }
11
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tasks/tracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUvC,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAKzD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKzC,WAAW,IAAI,IAAI,GAAG,IAAI;CAK3B"}
@@ -0,0 +1,31 @@
1
+ import { execFileSync } from "node:child_process";
2
+ function git(args, cwd) {
3
+ try {
4
+ return execFileSync("git", args, { cwd, encoding: "utf-8" }).trim();
5
+ }
6
+ catch {
7
+ return "";
8
+ }
9
+ }
10
+ export class TaskTracker {
11
+ projectRoot;
12
+ taskManager;
13
+ constructor(projectRoot, taskManager) {
14
+ this.projectRoot = projectRoot;
15
+ this.taskManager = taskManager;
16
+ }
17
+ linkBranch(taskId, branch) {
18
+ this.taskManager.update(taskId, { branch, status: "in-progress" });
19
+ }
20
+ findByBranch(branch) {
21
+ const tasks = this.taskManager.list({ branch });
22
+ return tasks[0] ?? null;
23
+ }
24
+ currentTask() {
25
+ const branch = git(["branch", "--show-current"], this.projectRoot);
26
+ if (!branch)
27
+ return null;
28
+ return this.findByBranch(branch);
29
+ }
30
+ }
31
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tasks/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW;IACtC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,WAAW;IACL,WAAW,CAAS;IACpB,WAAW,CAAc;IAE1C,YAAY,WAAmB,EAAE,WAAwB;QACvD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,MAAc,EAAE,MAAc;QACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ export type TaskStatus = "pending" | "in-progress" | "review" | "done" | "blocked";
2
+ export type TaskPriority = "high" | "medium" | "low";
3
+ export interface Task {
4
+ id: string;
5
+ title: string;
6
+ description: string;
7
+ status: TaskStatus;
8
+ priority: TaskPriority;
9
+ branch: string | null;
10
+ workflowRun: string | null;
11
+ created: string;
12
+ updated: string;
13
+ }
14
+ export interface TaskFilter {
15
+ status?: TaskStatus;
16
+ priority?: TaskPriority;
17
+ branch?: string;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tasks/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,aAAa,GACb,QAAQ,GACR,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tasks/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { WorkflowDefinition } from "./types.js";
2
+ export declare function getBuiltinWorkflows(): WorkflowDefinition[];
3
+ export declare function getBuiltinWorkflow(name: string): WorkflowDefinition;
4
+ //# sourceMappingURL=builtin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/workflow/builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,YAAY,CAAC;AA8FrE,wBAAgB,mBAAmB,IAAI,kBAAkB,EAAE,CAE1D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAMnE"}
@@ -0,0 +1,93 @@
1
+ function step(name, agent, options = {}) {
2
+ return {
3
+ name,
4
+ agent,
5
+ input: options.input ?? [],
6
+ gate: options.gate ?? "none",
7
+ onFail: options.onFail ?? null,
8
+ maxAttempts: options.maxAttempts ?? 3,
9
+ };
10
+ }
11
+ const DEV = {
12
+ name: "dev",
13
+ description: "Full development workflow: read, plan, code, review, test, commit",
14
+ steps: [
15
+ step("read", "reader"),
16
+ step("plan", "planner", {
17
+ input: ["read.output"],
18
+ gate: "user-approve",
19
+ }),
20
+ step("code", "coder", {
21
+ input: ["read.output", "plan.output"],
22
+ }),
23
+ step("review", "reviewer", {
24
+ input: ["code.output"],
25
+ gate: "review-pass",
26
+ onFail: "code",
27
+ }),
28
+ step("test", "tester", {
29
+ input: ["code.output"],
30
+ gate: "tests-pass",
31
+ onFail: "code",
32
+ }),
33
+ step("commit", "committer", {
34
+ input: ["plan.output", "code.output"],
35
+ }),
36
+ ],
37
+ };
38
+ const HOTFIX = {
39
+ name: "hotfix",
40
+ description: "Quick fix workflow: read, code, test, commit",
41
+ steps: [
42
+ step("read", "reader"),
43
+ step("code", "coder", {
44
+ input: ["read.output"],
45
+ }),
46
+ step("test", "tester", {
47
+ input: ["code.output"],
48
+ gate: "tests-pass",
49
+ onFail: "code",
50
+ }),
51
+ step("commit", "committer", {
52
+ input: ["code.output"],
53
+ }),
54
+ ],
55
+ };
56
+ const REVIEW = {
57
+ name: "review",
58
+ description: "Code review only",
59
+ steps: [
60
+ step("read", "reader"),
61
+ step("review", "reviewer", {
62
+ input: ["read.output"],
63
+ }),
64
+ ],
65
+ };
66
+ const TEST = {
67
+ name: "test",
68
+ description: "Run tests only",
69
+ steps: [
70
+ step("read", "reader"),
71
+ step("test", "tester", {
72
+ input: ["read.output"],
73
+ gate: "tests-pass",
74
+ }),
75
+ ],
76
+ };
77
+ const BUILTIN_WORKFLOWS = new Map([
78
+ ["dev", DEV],
79
+ ["hotfix", HOTFIX],
80
+ ["review", REVIEW],
81
+ ["test", TEST],
82
+ ]);
83
+ export function getBuiltinWorkflows() {
84
+ return [...BUILTIN_WORKFLOWS.values()];
85
+ }
86
+ export function getBuiltinWorkflow(name) {
87
+ const workflow = BUILTIN_WORKFLOWS.get(name);
88
+ if (!workflow) {
89
+ throw new Error(`Workflow not found: ${name}`);
90
+ }
91
+ return workflow;
92
+ }
93
+ //# sourceMappingURL=builtin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../src/workflow/builtin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { AgentRegistry } from "../agents/registry.js";
2
+ import type { AgentContextBuilder } from "../agents/context-builder.js";
3
+ import type { PreparedAgent } from "../agents/types.js";
4
+ import type { TaskManager } from "../tasks/manager.js";
5
+ import type { WorkflowDefinition, WorkflowRun } from "./types.js";
6
+ import type { WorkflowState } from "./state.js";
7
+ export interface WorkflowResolver {
8
+ resolve(name: string): WorkflowDefinition;
9
+ }
10
+ export interface StepExecutor {
11
+ execute(agent: PreparedAgent): Promise<string>;
12
+ }
13
+ export interface GateChecker {
14
+ checkTestsPass(command: string): Promise<boolean>;
15
+ checkReviewPass(reviewOutput: string): boolean;
16
+ requestUserApproval(stepName: string, context: string): Promise<boolean>;
17
+ }
18
+ export declare class WorkflowEngine {
19
+ private readonly registry;
20
+ private readonly contextBuilder;
21
+ private readonly state;
22
+ private readonly taskManager;
23
+ private readonly executor;
24
+ private readonly gateChecker;
25
+ private readonly workflowResolver;
26
+ constructor(registry: AgentRegistry, contextBuilder: AgentContextBuilder, state: WorkflowState, taskManager: TaskManager | null, executor: StepExecutor, gateChecker: GateChecker, workflowResolver?: WorkflowResolver);
27
+ start(workflow: WorkflowDefinition, taskDescription: string, taskId?: string): Promise<WorkflowRun>;
28
+ resume(runId: string, stepOutput?: string): Promise<WorkflowRun>;
29
+ abort(runId: string): WorkflowRun;
30
+ getStatus(runId?: string): WorkflowRun | null;
31
+ private executeLoop;
32
+ private collectInputs;
33
+ private checkGate;
34
+ private getNextStep;
35
+ private findWorkflowDefinition;
36
+ private generateRunId;
37
+ }
38
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/workflow/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAWD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAGlD,QAAQ,EAAE,aAAa,EACvB,cAAc,EAAE,mBAAmB,EACnC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,WAAW,EACxB,gBAAgB,CAAC,EAAE,gBAAgB;IAW/B,KAAK,CACT,QAAQ,EAAE,kBAAkB,EAC5B,eAAe,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC;IAoCjB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA4BtE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAQjC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;YAW/B,WAAW;IA6EzB,OAAO,CAAC,aAAa;YAoBP,SAAS;IA8BvB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,217 @@
1
+ import { todayDate } from "../lib/fs-helpers.js";
2
+ function nowISO() {
3
+ return new Date().toISOString();
4
+ }
5
+ function computeDurationMs(startedAt) {
6
+ if (!startedAt)
7
+ return null;
8
+ return Date.now() - new Date(startedAt).getTime();
9
+ }
10
+ export class WorkflowEngine {
11
+ registry;
12
+ contextBuilder;
13
+ state;
14
+ taskManager;
15
+ executor;
16
+ gateChecker;
17
+ workflowResolver;
18
+ constructor(registry, contextBuilder, state, taskManager, executor, gateChecker, workflowResolver) {
19
+ this.registry = registry;
20
+ this.contextBuilder = contextBuilder;
21
+ this.state = state;
22
+ this.taskManager = taskManager;
23
+ this.executor = executor;
24
+ this.gateChecker = gateChecker;
25
+ this.workflowResolver = workflowResolver ?? { resolve: () => { throw new Error("No workflow resolver"); } };
26
+ }
27
+ async start(workflow, taskDescription, taskId) {
28
+ const runId = this.generateRunId();
29
+ const steps = {};
30
+ for (const step of workflow.steps) {
31
+ steps[step.name] = {
32
+ status: "pending",
33
+ output: null,
34
+ startedAt: null,
35
+ completedAt: null,
36
+ durationMs: null,
37
+ attempt: 0,
38
+ };
39
+ }
40
+ const run = {
41
+ id: runId,
42
+ workflowName: workflow.name,
43
+ taskId: taskId ?? null,
44
+ taskDescription,
45
+ currentStep: workflow.steps[0].name,
46
+ startedAt: nowISO(),
47
+ completedAt: null,
48
+ status: "running",
49
+ steps,
50
+ };
51
+ this.state.save(run);
52
+ if (taskId && this.taskManager) {
53
+ this.taskManager.update(taskId, { workflowRun: runId, status: "in-progress" });
54
+ }
55
+ return this.executeLoop(workflow, run);
56
+ }
57
+ async resume(runId, stepOutput) {
58
+ const run = this.state.load(runId);
59
+ if (run.status !== "paused") {
60
+ throw new Error(`Cannot resume workflow with status: ${run.status}`);
61
+ }
62
+ if (stepOutput) {
63
+ const currentStepState = run.steps[run.currentStep];
64
+ if (currentStepState) {
65
+ currentStepState.output = stepOutput;
66
+ currentStepState.status = "completed";
67
+ currentStepState.completedAt = nowISO();
68
+ }
69
+ const workflow = this.findWorkflowDefinition(run);
70
+ const nextStep = this.getNextStep(workflow, run.currentStep);
71
+ if (nextStep) {
72
+ run.currentStep = nextStep;
73
+ }
74
+ }
75
+ run.status = "running";
76
+ this.state.save(run);
77
+ const workflow = this.findWorkflowDefinition(run);
78
+ return this.executeLoop(workflow, run);
79
+ }
80
+ abort(runId) {
81
+ const run = this.state.load(runId);
82
+ run.status = "failed";
83
+ run.completedAt = nowISO();
84
+ this.state.save(run);
85
+ return run;
86
+ }
87
+ getStatus(runId) {
88
+ if (runId) {
89
+ try {
90
+ return this.state.load(runId);
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ return this.state.loadCurrent();
97
+ }
98
+ async executeLoop(workflow, run) {
99
+ while (run.status === "running") {
100
+ const stepDef = workflow.steps.find((s) => s.name === run.currentStep);
101
+ if (!stepDef) {
102
+ run.status = "failed";
103
+ break;
104
+ }
105
+ const stepState = run.steps[run.currentStep];
106
+ const previousOutputs = this.collectInputs(stepDef, run);
107
+ const agent = this.registry.get(stepDef.agent);
108
+ const variables = {
109
+ taskDescription: run.taskDescription,
110
+ ...previousOutputs,
111
+ };
112
+ const prepared = this.contextBuilder.prepare(agent, variables);
113
+ stepState.status = "running";
114
+ stepState.startedAt = nowISO();
115
+ this.state.save(run);
116
+ const output = await this.executor.execute(prepared);
117
+ const gateResult = await this.checkGate(stepDef, output, agent);
118
+ if (gateResult === "passed") {
119
+ stepState.status = "completed";
120
+ stepState.output = output;
121
+ stepState.completedAt = nowISO();
122
+ stepState.durationMs = computeDurationMs(stepState.startedAt);
123
+ const nextStep = this.getNextStep(workflow, run.currentStep);
124
+ if (nextStep) {
125
+ run.currentStep = nextStep;
126
+ }
127
+ else {
128
+ run.status = "completed";
129
+ run.completedAt = nowISO();
130
+ if (run.taskId && this.taskManager) {
131
+ this.taskManager.update(run.taskId, { status: "done" });
132
+ }
133
+ }
134
+ }
135
+ else if (gateResult === "failed") {
136
+ stepState.attempt++;
137
+ if (stepState.attempt >= stepDef.maxAttempts) {
138
+ stepState.status = "failed";
139
+ run.status = "failed";
140
+ run.completedAt = nowISO();
141
+ }
142
+ else if (stepDef.onFail) {
143
+ stepState.output = output;
144
+ run.currentStep = stepDef.onFail;
145
+ const failTarget = run.steps[stepDef.onFail];
146
+ if (failTarget) {
147
+ failTarget.status = "pending";
148
+ }
149
+ }
150
+ else {
151
+ stepState.status = "failed";
152
+ run.status = "failed";
153
+ run.completedAt = nowISO();
154
+ }
155
+ }
156
+ else if (gateResult === "paused") {
157
+ stepState.output = output;
158
+ run.status = "paused";
159
+ this.state.save(run);
160
+ return run;
161
+ }
162
+ this.state.save(run);
163
+ }
164
+ this.state.save(run);
165
+ return run;
166
+ }
167
+ collectInputs(stepDef, run) {
168
+ const result = {};
169
+ for (const ref of stepDef.input) {
170
+ const dotIndex = ref.indexOf(".");
171
+ if (dotIndex === -1)
172
+ continue;
173
+ const stepName = ref.slice(0, dotIndex);
174
+ const stepState = run.steps[stepName];
175
+ if (stepState?.output) {
176
+ result[stepName] = stepState.output;
177
+ }
178
+ }
179
+ return result;
180
+ }
181
+ async checkGate(stepDef, output, agent) {
182
+ switch (stepDef.gate) {
183
+ case "none":
184
+ return "passed";
185
+ case "user-approve": {
186
+ const approved = await this.gateChecker.requestUserApproval(stepDef.name, output);
187
+ return approved ? "passed" : "paused";
188
+ }
189
+ case "tests-pass": {
190
+ const command = agent.permissions.shellCommands[0] ?? "npm test";
191
+ const passed = await this.gateChecker.checkTestsPass(command);
192
+ return passed ? "passed" : "failed";
193
+ }
194
+ case "review-pass": {
195
+ const passed = this.gateChecker.checkReviewPass(output);
196
+ return passed ? "passed" : "failed";
197
+ }
198
+ }
199
+ }
200
+ getNextStep(workflow, currentStepName) {
201
+ const index = workflow.steps.findIndex((s) => s.name === currentStepName);
202
+ if (index === -1 || index >= workflow.steps.length - 1)
203
+ return null;
204
+ return workflow.steps[index + 1].name;
205
+ }
206
+ findWorkflowDefinition(run) {
207
+ return this.workflowResolver.resolve(run.workflowName);
208
+ }
209
+ generateRunId() {
210
+ const date = todayDate();
211
+ const existing = this.state.list()
212
+ .filter((r) => r.id.startsWith(`run-${date}`));
213
+ const seq = String(existing.length + 1).padStart(3, "0");
214
+ return `run-${date}-${seq}`;
215
+ }
216
+ }
217
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/workflow/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WorkflowDefinition } from "./types.js";
2
+ export declare function parseWorkflowYaml(content: string): WorkflowDefinition;
3
+ export declare function loadCustomWorkflows(vaultPath: string): WorkflowDefinition[];
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/workflow/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAA4B,MAAM,YAAY,CAAC;AAkB/E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAkErE;AAaD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkB3E"}