@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,6 @@
1
+ export declare function readFileOrNull(path: string): string | null;
2
+ export declare function writeFileSafe(path: string, content: string): void;
3
+ export declare function ensureDir(path: string): void;
4
+ export declare function slugify(input: string): string;
5
+ export declare function todayDate(): string;
6
+ //# sourceMappingURL=fs-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -0,0 +1,24 @@
1
+ import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ export function readFileOrNull(path) {
4
+ try {
5
+ return readFileSync(path, "utf-8");
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ }
11
+ export function writeFileSafe(path, content) {
12
+ ensureDir(path);
13
+ writeFileSync(path, content, "utf-8");
14
+ }
15
+ export function ensureDir(path) {
16
+ mkdirSync(dirname(path), { recursive: true });
17
+ }
18
+ export function slugify(input) {
19
+ return input.replace(/\//g, "-");
20
+ }
21
+ export function todayDate() {
22
+ return new Date().toISOString().slice(0, 10);
23
+ }
24
+ //# sourceMappingURL=fs-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function interpolate(template: string, variables: Record<string, string>): string;
2
+ //# sourceMappingURL=interpolate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolate.d.ts","sourceRoot":"","sources":["../../src/lib/interpolate.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEvF"}
@@ -0,0 +1,4 @@
1
+ export function interpolate(template, variables) {
2
+ return template.replace(/\{\{(\w+)\}\}/g, (_match, key) => variables[key] ?? "");
3
+ }
4
+ //# sourceMappingURL=interpolate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolate.js","sourceRoot":"","sources":["../../src/lib/interpolate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAiC;IAC7E,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,27 @@
1
+ export declare const icon: {
2
+ readonly success: "✅";
3
+ readonly warning: "⚠️";
4
+ readonly error: "❌";
5
+ readonly pending: "○";
6
+ readonly running: "→";
7
+ readonly done: "✓";
8
+ readonly vault: "📦";
9
+ readonly task: "📋";
10
+ readonly workflow: "🔄";
11
+ readonly search: "🔍";
12
+ readonly doctor: "🏥";
13
+ readonly init: "⚡";
14
+ readonly agent: "🤖";
15
+ readonly config: "⚙️";
16
+ readonly git: "🔀";
17
+ readonly tip: "💡";
18
+ };
19
+ export declare function table(headers: string[], rows: string[][]): string;
20
+ export declare function progressBar(filled: number, total: number, width?: number): string;
21
+ export declare function box(title: string, lines: string[]): string;
22
+ export declare function section(titleIcon: string, title: string): string;
23
+ export declare function statusIcon(status: string): string;
24
+ export declare function stepLine(_index: number, name: string, status: string, detail?: string): string;
25
+ export declare function keyValue(key: string, value: string, keyWidth?: number): string;
26
+ export declare function divider(char?: string, width?: number): string;
27
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;CAiBP,CAAC;AAEX,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAsBjE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAIrF;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ1D;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAWlG;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAElF;AAED,wBAAgB,OAAO,CAAC,IAAI,GAAE,MAAiB,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,85 @@
1
+ export const icon = {
2
+ success: "\u2705",
3
+ warning: "\u26A0\uFE0F",
4
+ error: "\u274C",
5
+ pending: "\u25CB",
6
+ running: "\u2192",
7
+ done: "\u2713",
8
+ vault: "\uD83D\uDCE6",
9
+ task: "\uD83D\uDCCB",
10
+ workflow: "\uD83D\uDD04",
11
+ search: "\uD83D\uDD0D",
12
+ doctor: "\uD83C\uDFE5",
13
+ init: "\u26A1",
14
+ agent: "\uD83E\uDD16",
15
+ config: "\u2699\uFE0F",
16
+ git: "\uD83D\uDD00",
17
+ tip: "\uD83D\uDCA1",
18
+ };
19
+ export function table(headers, rows) {
20
+ const widths = headers.map((header, index) => {
21
+ const columnValues = rows.map((row) => row[index]?.length ?? 0);
22
+ return Math.max(header.length, ...columnValues);
23
+ });
24
+ const separator = "\u251C" + widths.map((w) => "\u2500".repeat(w + 2)).join("\u253C") + "\u2524";
25
+ const topBorder = "\u250C" + widths.map((w) => "\u2500".repeat(w + 2)).join("\u252C") + "\u2510";
26
+ const bottomBorder = "\u2514" + widths.map((w) => "\u2500".repeat(w + 2)).join("\u2534") + "\u2518";
27
+ const formatRow = (cells) => "\u2502" + cells.map((cell, i) => ` ${cell.padEnd(widths[i])} `).join("\u2502") + "\u2502";
28
+ const lines = [
29
+ topBorder,
30
+ formatRow(headers),
31
+ separator,
32
+ ...rows.map(formatRow),
33
+ bottomBorder,
34
+ ];
35
+ return lines.join("\n");
36
+ }
37
+ export function progressBar(filled, total, width = 10) {
38
+ if (total === 0)
39
+ return "\u2591".repeat(width);
40
+ const filledCount = Math.round((filled / total) * width);
41
+ return "\u2588".repeat(filledCount) + "\u2591".repeat(width - filledCount);
42
+ }
43
+ export function box(title, lines) {
44
+ const maxWidth = Math.max(title.length + 4, ...lines.map((line) => line.length + 4));
45
+ const topBorder = `\u250C\u2500 ${title} ${"\u2500".repeat(Math.max(0, maxWidth - title.length - 4))}\u2510`;
46
+ const bottomBorder = `\u2514${"\u2500".repeat(maxWidth)}\u2518`;
47
+ const formatted = lines.map((line) => `\u2502 ${line.padEnd(maxWidth - 2)}\u2502`);
48
+ return [topBorder, ...formatted, bottomBorder].join("\n");
49
+ }
50
+ export function section(titleIcon, title) {
51
+ return `\n${titleIcon} ${title}`;
52
+ }
53
+ export function statusIcon(status) {
54
+ switch (status) {
55
+ case "done":
56
+ case "completed": return "\uD83D\uDFE2";
57
+ case "in-progress":
58
+ case "running": return "\uD83D\uDD35";
59
+ case "pending": return "\u26AA";
60
+ case "blocked":
61
+ case "failed": return "\uD83D\uDD34";
62
+ case "paused": return "\uD83D\uDFE1";
63
+ case "review": return "\uD83D\uDFE0";
64
+ default: return "\u26AA";
65
+ }
66
+ }
67
+ export function stepLine(_index, name, status, detail = "") {
68
+ const icons = {
69
+ pending: "\u25CB",
70
+ running: "\u2192",
71
+ completed: "\u2713",
72
+ failed: "\u2717",
73
+ skipped: "\u2015",
74
+ };
75
+ const statusIcon = icons[status] ?? "\u25CB";
76
+ const detailStr = detail ? ` ${detail}` : "";
77
+ return ` ${statusIcon} ${name.padEnd(12)}${detailStr}`;
78
+ }
79
+ export function keyValue(key, value, keyWidth = 16) {
80
+ return ` ${key.padEnd(keyWidth)} ${value}`;
81
+ }
82
+ export function divider(char = "\u2500", width = 40) {
83
+ return char.repeat(width);
84
+ }
85
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ProjectContext, VaultData, BranchContext, DailyLog } from "./types.js";
2
+ export declare class VaultReader {
3
+ private readonly vaultPath;
4
+ constructor(context: ProjectContext);
5
+ exists(): boolean;
6
+ readStack(): string | null;
7
+ readConventions(): string | null;
8
+ readKnowledge(): string | null;
9
+ readGameplan(): string | null;
10
+ readBranch(branchName: string): BranchContext | null;
11
+ readRecentDailyLogs(count?: number): DailyLog[];
12
+ readAll(branchName: string): VaultData;
13
+ }
14
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/lib/reader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAerF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,cAAc;IAInC,MAAM,IAAI,OAAO;IAIjB,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAgBpD,mBAAmB,CAAC,KAAK,GAAE,MAAU,GAAG,QAAQ,EAAE;IAiBlD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;CAUvC"}
@@ -0,0 +1,75 @@
1
+ import { readFileSync, readdirSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { readFileOrNull, slugify } from "./fs-helpers.js";
4
+ import { parseFrontmatter } from "./frontmatter.js";
5
+ function parseBranchFrontmatter(raw) {
6
+ const { fields } = parseFrontmatter(raw);
7
+ return {
8
+ branch: fields["branch"] ?? "",
9
+ status: fields["status"] ?? "in-progress",
10
+ created: fields["created"] ?? "",
11
+ parent: fields["parent"] ?? "",
12
+ };
13
+ }
14
+ export class VaultReader {
15
+ vaultPath;
16
+ constructor(context) {
17
+ this.vaultPath = context.vaultPath;
18
+ }
19
+ exists() {
20
+ return existsSync(this.vaultPath);
21
+ }
22
+ readStack() {
23
+ return readFileOrNull(join(this.vaultPath, "stack.md"));
24
+ }
25
+ readConventions() {
26
+ return readFileOrNull(join(this.vaultPath, "conventions.md"));
27
+ }
28
+ readKnowledge() {
29
+ return readFileOrNull(join(this.vaultPath, "knowledge.md"));
30
+ }
31
+ readGameplan() {
32
+ return readFileOrNull(join(this.vaultPath, "gameplan.md"));
33
+ }
34
+ readBranch(branchName) {
35
+ const slug = slugify(branchName);
36
+ const branchPath = join(this.vaultPath, "branches", `${slug}.md`);
37
+ const raw = readFileOrNull(branchPath);
38
+ if (!raw)
39
+ return null;
40
+ const parsed = parseBranchFrontmatter(raw);
41
+ return {
42
+ raw,
43
+ branch: parsed.branch ?? branchName,
44
+ status: parsed.status ?? "in-progress",
45
+ created: parsed.created ?? "",
46
+ parent: parsed.parent ?? "",
47
+ };
48
+ }
49
+ readRecentDailyLogs(count = 3) {
50
+ const dailyPath = join(this.vaultPath, "daily");
51
+ if (!existsSync(dailyPath))
52
+ return [];
53
+ const files = readdirSync(dailyPath)
54
+ .filter((f) => f.endsWith(".md"))
55
+ .sort()
56
+ .reverse()
57
+ .slice(0, count);
58
+ return files.map((filename) => ({
59
+ date: filename.replace(".md", ""),
60
+ filename,
61
+ content: readFileSync(join(dailyPath, filename), "utf-8"),
62
+ }));
63
+ }
64
+ readAll(branchName) {
65
+ return {
66
+ stack: this.readStack(),
67
+ conventions: this.readConventions(),
68
+ knowledge: this.readKnowledge(),
69
+ gameplan: this.readGameplan(),
70
+ branch: this.readBranch(branchName),
71
+ recentDailyLogs: this.readRecentDailyLogs(),
72
+ };
73
+ }
74
+ }
75
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/lib/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface StackInfo {
2
+ languages: string[];
3
+ frameworks: string[];
4
+ database: string[];
5
+ testing: string[];
6
+ infrastructure: string[];
7
+ devTools: string[];
8
+ }
9
+ export declare function detectStack(projectRoot: string): StackInfo;
10
+ export declare function renderStackMarkdown(projectName: string, stack: StackInfo): string;
11
+ export {};
12
+ //# sourceMappingURL=stack-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-detect.d.ts","sourceRoot":"","sources":["../../src/lib/stack-detect.ts"],"names":[],"mappings":"AAGA,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAsQD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CA8B1D;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA6BjF"}
@@ -0,0 +1,302 @@
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import { join, basename } from "node:path";
3
+ const SKIP_DIRS = new Set([
4
+ "node_modules", "vendor", "bower_components",
5
+ "dist", "build", "out", "target",
6
+ "__pycache__", "coverage",
7
+ ]);
8
+ const MARKER_NAMES = new Set([
9
+ "Cargo.toml", "package.json", "go.mod", "go.work",
10
+ "pyproject.toml", "requirements.txt",
11
+ "Gemfile", "composer.json", "pubspec.yaml",
12
+ ]);
13
+ function findProjectMarkers(root, maxDepth = 4) {
14
+ const found = [];
15
+ function scan(directory, depth) {
16
+ if (depth > maxDepth)
17
+ return;
18
+ let entries;
19
+ try {
20
+ entries = readdirSync(directory, { withFileTypes: true });
21
+ }
22
+ catch {
23
+ return;
24
+ }
25
+ for (const entry of entries) {
26
+ if (entry.isFile() && MARKER_NAMES.has(entry.name)) {
27
+ found.push(join(directory, entry.name));
28
+ }
29
+ }
30
+ if (depth < maxDepth) {
31
+ for (const entry of entries) {
32
+ if (!entry.isDirectory())
33
+ continue;
34
+ if (entry.name.startsWith("."))
35
+ continue;
36
+ if (SKIP_DIRS.has(entry.name))
37
+ continue;
38
+ scan(join(directory, entry.name), depth + 1);
39
+ }
40
+ }
41
+ }
42
+ scan(root, 0);
43
+ return found;
44
+ }
45
+ function readJsonOrNull(filepath) {
46
+ try {
47
+ return JSON.parse(readFileSync(filepath, "utf-8"));
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ function readFileOrNull(filepath) {
54
+ try {
55
+ return readFileSync(filepath, "utf-8");
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function processPackageJson(filepath, stack) {
62
+ const packageJson = readJsonOrNull(filepath);
63
+ if (!packageJson)
64
+ return;
65
+ const allDeps = {
66
+ ...(packageJson["dependencies"] ?? {}),
67
+ ...(packageJson["devDependencies"] ?? {}),
68
+ };
69
+ const devDeps = packageJson["devDependencies"] ?? {};
70
+ const engines = packageJson["engines"] ?? {};
71
+ if (devDeps["typescript"])
72
+ stack.languages.push(`TypeScript ${devDeps["typescript"]}`);
73
+ if (engines["node"])
74
+ stack.languages.push(`Node.js ${engines["node"]}`);
75
+ const frameworkMap = {
76
+ "react": "React", "next": "Next.js", "vue": "Vue", "nuxt": "Nuxt",
77
+ "svelte": "Svelte", "express": "Express", "fastify": "Fastify",
78
+ "nestjs": "NestJS", "@nestjs/core": "NestJS", "hono": "Hono",
79
+ "astro": "Astro", "remix": "Remix", "@remix-run/node": "Remix",
80
+ };
81
+ for (const [dep, name] of Object.entries(frameworkMap)) {
82
+ if (allDeps[dep])
83
+ stack.frameworks.push(`${name} ${allDeps[dep]}`);
84
+ }
85
+ const dbMap = {
86
+ "prisma": "Prisma", "@prisma/client": "Prisma",
87
+ "drizzle-orm": "Drizzle", "typeorm": "TypeORM",
88
+ "mongoose": "Mongoose", "pg": "PostgreSQL (pg)",
89
+ "mysql2": "MySQL", "better-sqlite3": "SQLite",
90
+ "redis": "Redis", "ioredis": "Redis (ioredis)",
91
+ };
92
+ for (const [dep, name] of Object.entries(dbMap)) {
93
+ if (allDeps[dep])
94
+ stack.database.push(`${name} ${allDeps[dep]}`);
95
+ }
96
+ const testMap = {
97
+ "vitest": "Vitest", "jest": "Jest", "mocha": "Mocha",
98
+ "playwright": "Playwright", "cypress": "Cypress",
99
+ "@testing-library/react": "Testing Library",
100
+ };
101
+ for (const [dep, name] of Object.entries(testMap)) {
102
+ if (allDeps[dep])
103
+ stack.testing.push(`${name} ${allDeps[dep]}`);
104
+ }
105
+ const toolMap = {
106
+ "eslint": "ESLint", "prettier": "Prettier", "biome": "Biome",
107
+ "turbo": "Turborepo", "nx": "Nx", "lerna": "Lerna",
108
+ };
109
+ for (const [dep, name] of Object.entries(toolMap)) {
110
+ if (allDeps[dep])
111
+ stack.devTools.push(`${name} ${allDeps[dep]}`);
112
+ }
113
+ const packageManager = packageJson["packageManager"];
114
+ if (packageManager)
115
+ stack.devTools.push(packageManager);
116
+ const workspaces = packageJson["workspaces"];
117
+ if (workspaces)
118
+ stack.devTools.push("Monorepo (workspaces)");
119
+ }
120
+ function extractSection(content, header) {
121
+ const headerIndex = content.indexOf(header);
122
+ if (headerIndex === -1)
123
+ return "";
124
+ const start = headerIndex + header.length;
125
+ const nextSection = content.indexOf("\n[", start);
126
+ return nextSection === -1 ? content.slice(start) : content.slice(start, nextSection);
127
+ }
128
+ function processCargoToml(filepath, stack) {
129
+ const content = readFileOrNull(filepath);
130
+ if (!content)
131
+ return;
132
+ const edition = content.match(/^edition\s*=\s*"(\d+)"/m);
133
+ stack.languages.push(edition ? `Rust ${edition[1]} edition` : "Rust");
134
+ const dependenciesSection = extractSection(content, "[dependencies]");
135
+ const rustFrameworkMap = {
136
+ "clap": "Clap (CLI)", "tokio": "Tokio (async runtime)",
137
+ "serde": "Serde (serialization)", "axum": "Axum (web)",
138
+ "actix-web": "Actix (web)", "rocket": "Rocket (web)",
139
+ "reqwest": "Reqwest (HTTP)", "hyper": "Hyper (HTTP)",
140
+ "tracing": "Tracing (observability)", "anyhow": "Anyhow (errors)",
141
+ "thiserror": "Thiserror (errors)", "tonic": "Tonic (gRPC)",
142
+ "warp": "Warp (web)",
143
+ };
144
+ const rustDbMap = {
145
+ "diesel": "Diesel (ORM)", "sqlx": "SQLx",
146
+ "sea-orm": "SeaORM", "rusqlite": "Rusqlite (SQLite)",
147
+ "redis": "Redis",
148
+ };
149
+ const rustTestMap = {
150
+ "assert_cmd": "assert_cmd", "predicates": "predicates",
151
+ "insta": "Insta (snapshots)", "criterion": "Criterion (bench)",
152
+ "proptest": "Proptest", "mockall": "Mockall",
153
+ };
154
+ for (const [dep, label] of Object.entries(rustFrameworkMap)) {
155
+ if (dependenciesSection.includes(dep))
156
+ stack.frameworks.push(label);
157
+ }
158
+ for (const [dep, label] of Object.entries(rustDbMap)) {
159
+ if (dependenciesSection.includes(dep))
160
+ stack.database.push(label);
161
+ }
162
+ const devDepsSection = extractSection(content, "[dev-dependencies]");
163
+ for (const [dep, label] of Object.entries(rustTestMap)) {
164
+ if (devDepsSection.includes(dep))
165
+ stack.testing.push(label);
166
+ }
167
+ if (content.includes("[workspace]")) {
168
+ stack.devTools.push("Cargo workspace");
169
+ }
170
+ }
171
+ function processGoMod(filepath, stack) {
172
+ const content = readFileOrNull(filepath);
173
+ if (!content)
174
+ return;
175
+ stack.languages.push("Go");
176
+ const goVersion = content.match(/^go\s+(\d+\.\d+)/m);
177
+ if (goVersion)
178
+ stack.languages.push(`Go ${goVersion[1]}`);
179
+ }
180
+ function processPyproject(filepath, stack) {
181
+ stack.languages.push("Python");
182
+ const content = readFileOrNull(filepath);
183
+ if (!content)
184
+ return;
185
+ if (content.includes("[tool.poetry]"))
186
+ stack.devTools.push("Poetry");
187
+ if (content.includes("[tool.pytest]"))
188
+ stack.testing.push("pytest");
189
+ if (content.includes("[tool.ruff]"))
190
+ stack.devTools.push("Ruff (linter)");
191
+ if (content.includes("[tool.mypy]"))
192
+ stack.devTools.push("mypy (types)");
193
+ }
194
+ function processRequirementsTxt(filepath, stack) {
195
+ stack.languages.push("Python");
196
+ const content = readFileOrNull(filepath);
197
+ if (!content)
198
+ return;
199
+ const pyDepMap = {
200
+ "django": "Django", "flask": "Flask", "fastapi": "FastAPI",
201
+ "sqlalchemy": "SQLAlchemy (ORM)", "pytest": "pytest",
202
+ };
203
+ for (const [dep, label] of Object.entries(pyDepMap)) {
204
+ if (content.toLowerCase().includes(dep))
205
+ stack.frameworks.push(label);
206
+ }
207
+ }
208
+ function detectInfrastructure(projectRoot, stack) {
209
+ if (existsSync(join(projectRoot, "docker-compose.yml")) || existsSync(join(projectRoot, "docker-compose.yaml"))) {
210
+ stack.infrastructure.push("Docker Compose");
211
+ }
212
+ if (existsSync(join(projectRoot, "Dockerfile"))) {
213
+ stack.infrastructure.push("Docker");
214
+ }
215
+ if (existsSync(join(projectRoot, ".github", "workflows"))) {
216
+ stack.infrastructure.push("GitHub Actions");
217
+ }
218
+ if (existsSync(join(projectRoot, "vercel.json"))) {
219
+ stack.infrastructure.push("Vercel");
220
+ }
221
+ if (existsSync(join(projectRoot, "netlify.toml"))) {
222
+ stack.infrastructure.push("Netlify");
223
+ }
224
+ if (existsSync(join(projectRoot, "lefthook.yml")) || existsSync(join(projectRoot, "lefthook.yaml"))) {
225
+ stack.devTools.push("Lefthook (git hooks)");
226
+ }
227
+ }
228
+ function deduplicate(items) {
229
+ const seen = new Set();
230
+ return items.filter((item) => {
231
+ const key = item.split(" ")[0].toLowerCase();
232
+ if (seen.has(key))
233
+ return false;
234
+ seen.add(key);
235
+ return true;
236
+ });
237
+ }
238
+ const MARKER_PROCESSORS = {
239
+ "package.json": processPackageJson,
240
+ "Cargo.toml": processCargoToml,
241
+ "go.mod": processGoMod,
242
+ "go.work": processGoMod,
243
+ "pyproject.toml": processPyproject,
244
+ "requirements.txt": processRequirementsTxt,
245
+ "Gemfile": (_, stack) => { stack.languages.push("Ruby"); },
246
+ "composer.json": (_, stack) => { stack.languages.push("PHP"); },
247
+ "pubspec.yaml": (_, stack) => { stack.languages.push("Dart/Flutter"); },
248
+ };
249
+ export function detectStack(projectRoot) {
250
+ const stack = {
251
+ languages: [],
252
+ frameworks: [],
253
+ database: [],
254
+ testing: [],
255
+ infrastructure: [],
256
+ devTools: [],
257
+ };
258
+ const markers = findProjectMarkers(projectRoot);
259
+ for (const markerPath of markers) {
260
+ const markerName = basename(markerPath);
261
+ const processor = MARKER_PROCESSORS[markerName];
262
+ if (processor) {
263
+ processor(markerPath, stack);
264
+ }
265
+ }
266
+ detectInfrastructure(projectRoot, stack);
267
+ stack.languages = deduplicate(stack.languages);
268
+ stack.frameworks = deduplicate(stack.frameworks);
269
+ stack.database = deduplicate(stack.database);
270
+ stack.testing = deduplicate(stack.testing);
271
+ stack.infrastructure = deduplicate(stack.infrastructure);
272
+ stack.devTools = deduplicate(stack.devTools);
273
+ return stack;
274
+ }
275
+ export function renderStackMarkdown(projectName, stack) {
276
+ const today = new Date().toISOString().slice(0, 10);
277
+ const sections = [
278
+ `---`,
279
+ `updated: ${today}`,
280
+ `tags: [stack, ${projectName}]`,
281
+ `---`,
282
+ `# ${projectName} — Stack`,
283
+ ];
284
+ const categories = [
285
+ ["Languages", stack.languages],
286
+ ["Frameworks", stack.frameworks],
287
+ ["Database", stack.database],
288
+ ["Testing", stack.testing],
289
+ ["Infrastructure", stack.infrastructure],
290
+ ["Dev Tools", stack.devTools],
291
+ ];
292
+ for (const [title, items] of categories) {
293
+ sections.push("", `## ${title}`);
294
+ if (items.length > 0) {
295
+ for (const item of items) {
296
+ sections.push(`- ${item}`);
297
+ }
298
+ }
299
+ }
300
+ return sections.join("\n") + "\n";
301
+ }
302
+ //# sourceMappingURL=stack-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-detect.js","sourceRoot":"","sources":["../../src/lib/stack-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=statusline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../../src/lib/statusline.ts"],"names":[],"mappings":""}