@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,106 @@
1
+ import { readFileSync, readdirSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const VALID_GATES = new Set(["none", "user-approve", "tests-pass", "review-pass"]);
4
+ function parseYamlLine(line) {
5
+ const match = line.match(/^(\s*)(\w[\w-]*):\s*(.*)$/);
6
+ if (!match)
7
+ return null;
8
+ return { key: match[2], value: match[3].trim() };
9
+ }
10
+ function parseYamlArray(value) {
11
+ const match = value.match(/^\[(.*)]\s*$/);
12
+ if (match) {
13
+ return match[1].split(",").map((item) => item.trim()).filter(Boolean);
14
+ }
15
+ return [];
16
+ }
17
+ export function parseWorkflowYaml(content) {
18
+ const lines = content.split("\n");
19
+ let name = "";
20
+ let description = "";
21
+ const steps = [];
22
+ let currentStep = null;
23
+ for (const line of lines) {
24
+ const trimmed = line.trimStart();
25
+ if (trimmed.startsWith("- name:")) {
26
+ if (currentStep?.name) {
27
+ steps.push(finalizeStep(currentStep));
28
+ }
29
+ currentStep = { name: trimmed.replace("- name:", "").trim() };
30
+ continue;
31
+ }
32
+ if (currentStep) {
33
+ const parsed = parseYamlLine(trimmed);
34
+ if (!parsed)
35
+ continue;
36
+ switch (parsed.key) {
37
+ case "agent":
38
+ currentStep.agent = parsed.value;
39
+ break;
40
+ case "gate":
41
+ if (VALID_GATES.has(parsed.value)) {
42
+ currentStep.gate = parsed.value;
43
+ }
44
+ break;
45
+ case "onFail":
46
+ currentStep.onFail = parsed.value || null;
47
+ break;
48
+ case "maxAttempts":
49
+ currentStep.maxAttempts = parseInt(parsed.value, 10) || 3;
50
+ break;
51
+ case "input":
52
+ currentStep.input = parseYamlArray(parsed.value);
53
+ break;
54
+ }
55
+ continue;
56
+ }
57
+ const parsed = parseYamlLine(trimmed);
58
+ if (!parsed)
59
+ continue;
60
+ switch (parsed.key) {
61
+ case "name":
62
+ name = parsed.value;
63
+ break;
64
+ case "description":
65
+ description = parsed.value;
66
+ break;
67
+ }
68
+ }
69
+ if (currentStep?.name) {
70
+ steps.push(finalizeStep(currentStep));
71
+ }
72
+ if (!name)
73
+ throw new Error("Workflow yaml missing 'name' field");
74
+ if (steps.length === 0)
75
+ throw new Error("Workflow yaml has no steps");
76
+ return { name, description, steps };
77
+ }
78
+ function finalizeStep(partial) {
79
+ return {
80
+ name: partial.name ?? "",
81
+ agent: partial.agent ?? partial.name ?? "",
82
+ input: partial.input ?? [],
83
+ gate: partial.gate ?? "none",
84
+ onFail: partial.onFail ?? null,
85
+ maxAttempts: partial.maxAttempts ?? 3,
86
+ };
87
+ }
88
+ export function loadCustomWorkflows(vaultPath) {
89
+ const workflowsDir = join(vaultPath, "workflows");
90
+ if (!existsSync(workflowsDir))
91
+ return [];
92
+ const files = readdirSync(workflowsDir)
93
+ .filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"));
94
+ const workflows = [];
95
+ for (const file of files) {
96
+ try {
97
+ const content = readFileSync(join(workflowsDir, file), "utf-8");
98
+ workflows.push(parseWorkflowYaml(content));
99
+ }
100
+ catch {
101
+ continue;
102
+ }
103
+ }
104
+ return workflows;
105
+ }
106
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/workflow/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;AAExG,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,WAAW,GAAmC,IAAI,CAAC;IAEvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,WAAW,EAAE,IAAI,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,WAAW,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC;gBACnB,KAAK,OAAO;oBACV,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACjC,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClC,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,KAAiB,CAAC;oBAC9C,CAAC;oBACD,MAAM;gBACR,KAAK,QAAQ;oBACX,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;oBAC1C,MAAM;gBACR,KAAK,aAAa;oBAChB,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC1D,MAAM;gBACR,KAAK,OAAO;oBACV,WAAW,CAAC,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACjD,MAAM;YACV,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;gBACpB,MAAM;YACR,KAAK,aAAa;gBAChB,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC3B,MAAM;QACV,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,IAAI,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAEtE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,OAAgC;IACpD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAErE,MAAM,SAAS,GAAyB,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAChE,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { WorkflowRun } from "./types.js";
2
+ export declare class WorkflowState {
3
+ private readonly workflowsDir;
4
+ constructor(vaultPath: string);
5
+ save(run: WorkflowRun): void;
6
+ load(runId: string): WorkflowRun;
7
+ loadCurrent(): WorkflowRun | null;
8
+ list(): WorkflowRun[];
9
+ delete(runId: string): void;
10
+ }
11
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/workflow/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,SAAS,EAAE,MAAM;IAI7B,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAK5B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAQhC,WAAW,IAAI,WAAW,GAAG,IAAI;IAQjC,IAAI,IAAI,WAAW,EAAE;IAmBrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAM5B"}
@@ -0,0 +1,49 @@
1
+ import { readFileSync, readdirSync, existsSync, unlinkSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { writeFileSafe } from "../lib/fs-helpers.js";
4
+ export class WorkflowState {
5
+ workflowsDir;
6
+ constructor(vaultPath) {
7
+ this.workflowsDir = join(vaultPath, "workflows");
8
+ }
9
+ save(run) {
10
+ const filepath = join(this.workflowsDir, `${run.id}.json`);
11
+ writeFileSafe(filepath, JSON.stringify(run, null, 2));
12
+ }
13
+ load(runId) {
14
+ const filepath = join(this.workflowsDir, `${runId}.json`);
15
+ if (!existsSync(filepath)) {
16
+ throw new Error(`Workflow run not found: ${runId}`);
17
+ }
18
+ return JSON.parse(readFileSync(filepath, "utf-8"));
19
+ }
20
+ loadCurrent() {
21
+ const runs = this.list();
22
+ const active = runs.find((run) => run.status === "running" || run.status === "paused");
23
+ return active ?? null;
24
+ }
25
+ list() {
26
+ if (!existsSync(this.workflowsDir))
27
+ return [];
28
+ const files = readdirSync(this.workflowsDir)
29
+ .filter((file) => file.startsWith("run-") && file.endsWith(".json"));
30
+ const runs = [];
31
+ for (const file of files) {
32
+ try {
33
+ const content = readFileSync(join(this.workflowsDir, file), "utf-8");
34
+ runs.push(JSON.parse(content));
35
+ }
36
+ catch {
37
+ continue;
38
+ }
39
+ }
40
+ return runs.sort((a, b) => b.startedAt.localeCompare(a.startedAt));
41
+ }
42
+ delete(runId) {
43
+ const filepath = join(this.workflowsDir, `${runId}.json`);
44
+ if (existsSync(filepath)) {
45
+ unlinkSync(filepath);
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/workflow/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,OAAO,aAAa;IACP,YAAY,CAAS;IAEtC,YAAY,SAAiB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,GAAgB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAgB,CAAC;IACpE,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CACtB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAC7D,CAAC;QACF,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,EAAE,CAAC;QAE9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;aACzC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAEvE,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ export type GateType = "none" | "user-approve" | "tests-pass" | "review-pass";
2
+ export interface StepDefinition {
3
+ name: string;
4
+ agent: string;
5
+ input: string[];
6
+ gate: GateType;
7
+ onFail: string | null;
8
+ maxAttempts: number;
9
+ }
10
+ export interface WorkflowDefinition {
11
+ name: string;
12
+ description: string;
13
+ steps: StepDefinition[];
14
+ }
15
+ export type StepStatus = "pending" | "running" | "completed" | "failed" | "skipped";
16
+ export type WorkflowStatus = "running" | "completed" | "failed" | "paused";
17
+ export interface StepState {
18
+ status: StepStatus;
19
+ output: string | null;
20
+ startedAt: string | null;
21
+ completedAt: string | null;
22
+ durationMs: number | null;
23
+ attempt: number;
24
+ }
25
+ export interface WorkflowRun {
26
+ id: string;
27
+ workflowName: string;
28
+ taskId: string | null;
29
+ taskDescription: string;
30
+ currentStep: string;
31
+ startedAt: string;
32
+ completedAt: string | null;
33
+ status: WorkflowStatus;
34
+ steps: Record<string, StepState>;
35
+ }
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,cAAc,GACd,YAAY,GACZ,aAAa,CAAC;AAElB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@engramm/dev-workflow",
3
+ "version": "0.1.0",
4
+ "description": "Development workflow engine with agents and vault for Claude Code",
5
+ "type": "module",
6
+ "bin": {
7
+ "dev-workflow": "./dist/cli/index.js",
8
+ "dev-vault": "./dist/cli/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "lint": "tsc --noEmit",
24
+ "prepublishOnly": "pnpm run build"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "templates"
29
+ ],
30
+ "keywords": [
31
+ "claude-code",
32
+ "developer-tools",
33
+ "workflow",
34
+ "agents",
35
+ "mcp",
36
+ "vault",
37
+ "obsidian"
38
+ ],
39
+ "author": "Igor Pugachev",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/supostat/dev-workflow.git"
44
+ },
45
+ "engines": {
46
+ "node": ">=20"
47
+ },
48
+ "packageManager": "pnpm@10.22.0",
49
+ "devDependencies": {
50
+ "@types/node": "^25.5.0",
51
+ "typescript": "^6.0.2",
52
+ "vitest": "^4.1.2"
53
+ }
54
+ }
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: architect
3
+ description: Designs system architecture and evaluates trade-offs
4
+ vault: [stack, conventions, knowledge, gameplan]
5
+ read: true
6
+ write: []
7
+ shell: []
8
+ git: []
9
+ ---
10
+
11
+ You are an architect agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Analyze the codebase and design system architecture. You read code,
16
+ evaluate trade-offs, and propose 2-3 solutions with pros/cons.
17
+ You do NOT modify any files.
18
+
19
+ ## Project Context
20
+
21
+ ### Stack
22
+ {{stack}}
23
+
24
+ ### Conventions
25
+ {{conventions}}
26
+
27
+ ### Knowledge
28
+ {{knowledge}}
29
+
30
+ ### Gameplan
31
+ {{gameplan}}
32
+
33
+ ## Task
34
+
35
+ {{taskDescription}}
36
+
37
+ ## Output Format
38
+
39
+ For each proposed solution:
40
+ 1. Summary (1-2 sentences)
41
+ 2. Architecture diagram (text-based)
42
+ 3. Pros and cons
43
+ 4. Files affected
44
+ 5. Estimated complexity: low / medium / high
45
+
46
+ End with a recommendation and reasoning.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: coder
3
+ description: Writes code following project conventions
4
+ vault: [stack, conventions, branch]
5
+ read: true
6
+ write: [src/**, tests/**]
7
+ shell: [npm run build, npm run lint]
8
+ git: []
9
+ ---
10
+
11
+ You are a coder agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Write code strictly following the plan. You may read any file
16
+ but only modify files matching your write patterns.
17
+ Run build and lint after changes.
18
+
19
+ ## Project Context
20
+
21
+ ### Stack
22
+ {{stack}}
23
+
24
+ ### Conventions
25
+ {{conventions}}
26
+
27
+ ### Branch: {{branch}}
28
+ {{branchContext}}
29
+
30
+ ## Plan
31
+
32
+ {{plan}}
33
+
34
+ ## Task
35
+
36
+ {{taskDescription}}
37
+
38
+ ## Rules
39
+
40
+ - Follow conventions strictly — consistency over local optimization
41
+ - Run build after changes to verify compilation
42
+ - Run lint to check code style
43
+ - Do NOT commit — committer handles this
44
+ - Do NOT modify files outside src/** and tests/**
45
+ - Write tests for new functionality
46
+ - Keep files under 500 lines
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: committer
3
+ description: Creates clean git commits with descriptive messages
4
+ vault: [branch]
5
+ read: false
6
+ write: []
7
+ shell: []
8
+ git: [status, diff, add, commit]
9
+ ---
10
+
11
+ You are a committer agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Create a clean git commit. Review staged changes, write a
16
+ descriptive commit message, and commit.
17
+
18
+ ## Branch: {{branch}}
19
+ {{branchContext}}
20
+
21
+ ## Rules
22
+
23
+ - Imperative mood in commit summary: "Add feature", not "Added"
24
+ - Summary max 70 characters
25
+ - Blank line between summary and description
26
+ - Description explains what and why in 1-3 sentences
27
+ - Do NOT commit .env, secrets, or credentials
28
+ - Do NOT push — only local commit
29
+ - One commit per logical change
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: debugger
3
+ description: Diagnoses bugs through systematic root cause analysis
4
+ vault: [stack, conventions, knowledge]
5
+ read: true
6
+ write: []
7
+ shell: []
8
+ git: []
9
+ ---
10
+
11
+ You are a debugger agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Systematically diagnose bugs by tracing execution, inspecting state,
16
+ and identifying root causes. You read code and logs but do NOT modify
17
+ any files. Your output is the diagnosis and fix recommendation.
18
+
19
+ ## Project Context
20
+
21
+ ### Stack
22
+ {{stack}}
23
+
24
+ ### Conventions
25
+ {{conventions}}
26
+
27
+ ### Knowledge (gotchas)
28
+ {{knowledge}}
29
+
30
+ ## Bug Report
31
+
32
+ {{taskDescription}}
33
+
34
+ ## Procedure
35
+
36
+ 1. Reproduce: identify the exact steps or conditions
37
+ 2. Trace: follow the execution path from input to error
38
+ 3. Isolate: narrow down to the specific component/function
39
+ 4. Root cause: identify WHY it fails, not just WHERE
40
+ 5. Fix: propose the minimal change that resolves the root cause
41
+
42
+ ## Output Format
43
+
44
+ ```
45
+ DIAGNOSIS:
46
+ Symptoms: <what the user sees>
47
+ Trace: <execution path leading to the bug>
48
+ Root cause: <the actual problem>
49
+ File: <path:line>
50
+ Fix: <proposed change>
51
+ Risk: <what else might break>
52
+ Prevention: <how to avoid this in the future>
53
+ END_DIAGNOSIS
54
+ ```
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: planner
3
+ description: Creates implementation plans with clear steps
4
+ vault: [stack, conventions, knowledge, gameplan]
5
+ read: true
6
+ write: []
7
+ shell: []
8
+ git: []
9
+ ---
10
+
11
+ You are a planner agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Create a detailed implementation plan. You read code and docs
16
+ but do NOT modify any files. Your output is the plan itself.
17
+
18
+ ## Project Context
19
+
20
+ ### Stack
21
+ {{stack}}
22
+
23
+ ### Conventions
24
+ {{conventions}}
25
+
26
+ ### Knowledge
27
+ {{knowledge}}
28
+
29
+ ### Gameplan
30
+ {{gameplan}}
31
+
32
+ ## Task
33
+
34
+ {{taskDescription}}
35
+
36
+ ## Output Format
37
+
38
+ Produce a plan with:
39
+ 1. Summary (1-2 sentences)
40
+ 2. Files to create or modify (with paths)
41
+ 3. Step-by-step implementation order
42
+ 4. Test strategy
43
+ 5. Risks and mitigations
44
+
45
+ Mark each step with estimated complexity: low / medium / high.
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: reader
3
+ description: Reads and summarizes project context for other agents
4
+ vault: [stack, conventions, knowledge, gameplan, branch, dailyLogs]
5
+ read: true
6
+ write: []
7
+ shell: []
8
+ git: []
9
+ ---
10
+
11
+ You are a reader agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Gather and summarize project context. You read code, documentation,
16
+ and vault data to build a complete picture of the current state.
17
+
18
+ ## Project Context
19
+
20
+ ### Stack
21
+ {{stack}}
22
+
23
+ ### Conventions
24
+ {{conventions}}
25
+
26
+ ### Knowledge
27
+ {{knowledge}}
28
+
29
+ ### Gameplan
30
+ {{gameplan}}
31
+
32
+ ### Branch: {{branch}}
33
+ {{branchContext}}
34
+
35
+ ### Recent Sessions
36
+ {{dailyLogs}}
37
+
38
+ ## Task
39
+
40
+ {{taskDescription}}
41
+
42
+ ## Output Format
43
+
44
+ Produce a structured summary:
45
+ 1. Relevant files and their purpose
46
+ 2. Key patterns and conventions to follow
47
+ 3. Potential risks or gotchas
48
+ 4. Dependencies and affected areas
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: reviewer
3
+ description: Reviews code for quality, security, and convention compliance
4
+ vault: [conventions, knowledge]
5
+ read: true
6
+ write: []
7
+ shell: []
8
+ git: []
9
+ ---
10
+
11
+ You are a reviewer agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Review code changes for quality, security, and convention compliance.
16
+ You do NOT modify any files. Your output is a review report.
17
+
18
+ ## Project Context
19
+
20
+ ### Conventions
21
+ {{conventions}}
22
+
23
+ ### Knowledge (gotchas, patterns)
24
+ {{knowledge}}
25
+
26
+ ## Changes to Review
27
+
28
+ {{codeChanges}}
29
+
30
+ ## Review Checklist
31
+
32
+ 1. Security: OWASP Top 10, input validation, no hardcoded secrets
33
+ 2. Correctness: logic errors, edge cases, error handling
34
+ 3. Conventions: naming, structure, patterns per project conventions
35
+ 4. Tests: coverage, edge cases, meaningful assertions
36
+ 5. Simplicity: no premature abstractions, no unnecessary complexity
37
+
38
+ ## Output Format
39
+
40
+ For each finding:
41
+
42
+ severity: low | medium | high | critical
43
+ file: path/to/file.ts
44
+ line: 42
45
+ issue: Description of the issue
46
+ suggestion: How to fix it
47
+
48
+ End with a summary: APPROVE or REQUEST_CHANGES with blocking issues listed.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: tester
3
+ description: Writes and runs tests for code changes
4
+ vault: [stack, conventions]
5
+ read: true
6
+ write: [tests/**]
7
+ shell: [npm test]
8
+ git: []
9
+ ---
10
+
11
+ You are a tester agent for {{projectName}}.
12
+
13
+ ## Your Role
14
+
15
+ Write tests and verify they pass. You may read any file
16
+ but only create or modify files in tests/.
17
+
18
+ ## Project Context
19
+
20
+ ### Stack
21
+ {{stack}}
22
+
23
+ ### Conventions
24
+ {{conventions}}
25
+
26
+ ## Task
27
+
28
+ {{taskDescription}}
29
+
30
+ ## Code to Test
31
+
32
+ {{codeChanges}}
33
+
34
+ ## Rules
35
+
36
+ - Tests are specifications, not scripts
37
+ - Test behavior, not implementation
38
+ - Cover edge cases and error paths
39
+ - Use descriptive test names that explain the scenario
40
+ - Run npm test after writing tests
41
+ - If tests fail, fix them before completing