@bhimudev/gnanai 0.4.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 (274) hide show
  1. package/README.md +270 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +188 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/commands/cleanup.d.ts +21 -0
  7. package/dist/commands/cleanup.d.ts.map +1 -0
  8. package/dist/commands/cleanup.js +380 -0
  9. package/dist/commands/cleanup.js.map +1 -0
  10. package/dist/commands/dispatch.d.ts +13 -0
  11. package/dist/commands/dispatch.d.ts.map +1 -0
  12. package/dist/commands/dispatch.js +85 -0
  13. package/dist/commands/dispatch.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +2 -0
  15. package/dist/commands/doctor.d.ts.map +1 -0
  16. package/dist/commands/doctor.js +155 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/generate.d.ts +3 -0
  19. package/dist/commands/generate.d.ts.map +1 -0
  20. package/dist/commands/generate.js +167 -0
  21. package/dist/commands/generate.js.map +1 -0
  22. package/dist/commands/init.d.ts +10 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +711 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/knowledge-sync.d.ts +69 -0
  27. package/dist/commands/knowledge-sync.d.ts.map +1 -0
  28. package/dist/commands/knowledge-sync.js +661 -0
  29. package/dist/commands/knowledge-sync.js.map +1 -0
  30. package/dist/commands/knowledge.d.ts +35 -0
  31. package/dist/commands/knowledge.d.ts.map +1 -0
  32. package/dist/commands/knowledge.js +254 -0
  33. package/dist/commands/knowledge.js.map +1 -0
  34. package/dist/commands/rollback.d.ts +13 -0
  35. package/dist/commands/rollback.d.ts.map +1 -0
  36. package/dist/commands/rollback.js +186 -0
  37. package/dist/commands/rollback.js.map +1 -0
  38. package/dist/commands/setup-config.d.ts +6 -0
  39. package/dist/commands/setup-config.d.ts.map +1 -0
  40. package/dist/commands/setup-config.js +663 -0
  41. package/dist/commands/setup-config.js.map +1 -0
  42. package/dist/commands/setup-project.d.ts +6 -0
  43. package/dist/commands/setup-project.d.ts.map +1 -0
  44. package/dist/commands/setup-project.js +361 -0
  45. package/dist/commands/setup-project.js.map +1 -0
  46. package/dist/commands/setup.d.ts +3 -0
  47. package/dist/commands/setup.d.ts.map +1 -0
  48. package/dist/commands/setup.js +293 -0
  49. package/dist/commands/setup.js.map +1 -0
  50. package/dist/commands/status.d.ts +51 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +182 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/commands/uninstall.d.ts +3 -0
  55. package/dist/commands/uninstall.d.ts.map +1 -0
  56. package/dist/commands/uninstall.js +173 -0
  57. package/dist/commands/uninstall.js.map +1 -0
  58. package/dist/commands/update.d.ts +10 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +435 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/commands/worktree.d.ts +30 -0
  63. package/dist/commands/worktree.d.ts.map +1 -0
  64. package/dist/commands/worktree.js +262 -0
  65. package/dist/commands/worktree.js.map +1 -0
  66. package/dist/generator/claude-cli.d.ts +24 -0
  67. package/dist/generator/claude-cli.d.ts.map +1 -0
  68. package/dist/generator/claude-cli.js +239 -0
  69. package/dist/generator/claude-cli.js.map +1 -0
  70. package/dist/generator/prompt-builder.d.ts +7 -0
  71. package/dist/generator/prompt-builder.d.ts.map +1 -0
  72. package/dist/generator/prompt-builder.js +144 -0
  73. package/dist/generator/prompt-builder.js.map +1 -0
  74. package/dist/index.d.ts +36 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +45 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/mcp/embeddings.d.ts +53 -0
  79. package/dist/mcp/embeddings.d.ts.map +1 -0
  80. package/dist/mcp/embeddings.js +68 -0
  81. package/dist/mcp/embeddings.js.map +1 -0
  82. package/dist/mcp/hybrid-search.d.ts +25 -0
  83. package/dist/mcp/hybrid-search.d.ts.map +1 -0
  84. package/dist/mcp/hybrid-search.js +72 -0
  85. package/dist/mcp/hybrid-search.js.map +1 -0
  86. package/dist/mcp/knowledge-server.d.ts +4 -0
  87. package/dist/mcp/knowledge-server.d.ts.map +1 -0
  88. package/dist/mcp/knowledge-server.js +294 -0
  89. package/dist/mcp/knowledge-server.js.map +1 -0
  90. package/dist/mcp/knowledge-utils.d.ts +65 -0
  91. package/dist/mcp/knowledge-utils.d.ts.map +1 -0
  92. package/dist/mcp/knowledge-utils.js +207 -0
  93. package/dist/mcp/knowledge-utils.js.map +1 -0
  94. package/dist/mcp/search-factory.d.ts +9 -0
  95. package/dist/mcp/search-factory.d.ts.map +1 -0
  96. package/dist/mcp/search-factory.js +23 -0
  97. package/dist/mcp/search-factory.js.map +1 -0
  98. package/dist/mcp/search-index.d.ts +45 -0
  99. package/dist/mcp/search-index.d.ts.map +1 -0
  100. package/dist/mcp/search-index.js +2 -0
  101. package/dist/mcp/search-index.js.map +1 -0
  102. package/dist/mcp/search-minisearch.d.ts +46 -0
  103. package/dist/mcp/search-minisearch.d.ts.map +1 -0
  104. package/dist/mcp/search-minisearch.js +99 -0
  105. package/dist/mcp/search-minisearch.js.map +1 -0
  106. package/dist/mcp/search-sqlite.d.ts +30 -0
  107. package/dist/mcp/search-sqlite.d.ts.map +1 -0
  108. package/dist/mcp/search-sqlite.js +188 -0
  109. package/dist/mcp/search-sqlite.js.map +1 -0
  110. package/dist/mcp/vector-store.d.ts +52 -0
  111. package/dist/mcp/vector-store.d.ts.map +1 -0
  112. package/dist/mcp/vector-store.js +183 -0
  113. package/dist/mcp/vector-store.js.map +1 -0
  114. package/dist/scaffold/copy-core-agents.d.ts +2 -0
  115. package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
  116. package/dist/scaffold/copy-core-agents.js +90 -0
  117. package/dist/scaffold/copy-core-agents.js.map +1 -0
  118. package/dist/scaffold/create-claude-settings.d.ts +40 -0
  119. package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
  120. package/dist/scaffold/create-claude-settings.js +422 -0
  121. package/dist/scaffold/create-claude-settings.js.map +1 -0
  122. package/dist/scaffold/create-config.d.ts +14 -0
  123. package/dist/scaffold/create-config.d.ts.map +1 -0
  124. package/dist/scaffold/create-config.js +199 -0
  125. package/dist/scaffold/create-config.js.map +1 -0
  126. package/dist/scaffold/create-project-description.d.ts +12 -0
  127. package/dist/scaffold/create-project-description.d.ts.map +1 -0
  128. package/dist/scaffold/create-project-description.js +104 -0
  129. package/dist/scaffold/create-project-description.js.map +1 -0
  130. package/dist/scaffold/create-structure.d.ts +2 -0
  131. package/dist/scaffold/create-structure.d.ts.map +1 -0
  132. package/dist/scaffold/create-structure.js +146 -0
  133. package/dist/scaffold/create-structure.js.map +1 -0
  134. package/dist/types/dependency-analysis.d.ts +11 -0
  135. package/dist/types/dependency-analysis.d.ts.map +1 -0
  136. package/dist/types/dependency-analysis.js +2 -0
  137. package/dist/types/dependency-analysis.js.map +1 -0
  138. package/dist/types/index.d.ts +526 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +3 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/types/task.d.ts +25 -0
  143. package/dist/types/task.d.ts.map +1 -0
  144. package/dist/types/task.js +3 -0
  145. package/dist/types/task.js.map +1 -0
  146. package/dist/utils/analyze-files.d.ts +7 -0
  147. package/dist/utils/analyze-files.d.ts.map +1 -0
  148. package/dist/utils/analyze-files.js +27 -0
  149. package/dist/utils/analyze-files.js.map +1 -0
  150. package/dist/utils/backup.d.ts +102 -0
  151. package/dist/utils/backup.d.ts.map +1 -0
  152. package/dist/utils/backup.js +352 -0
  153. package/dist/utils/backup.js.map +1 -0
  154. package/dist/utils/ci-provider.d.ts +23 -0
  155. package/dist/utils/ci-provider.d.ts.map +1 -0
  156. package/dist/utils/ci-provider.js +525 -0
  157. package/dist/utils/ci-provider.js.map +1 -0
  158. package/dist/utils/ci-status.d.ts +57 -0
  159. package/dist/utils/ci-status.d.ts.map +1 -0
  160. package/dist/utils/ci-status.js +349 -0
  161. package/dist/utils/ci-status.js.map +1 -0
  162. package/dist/utils/dependency-analysis.d.ts +34 -0
  163. package/dist/utils/dependency-analysis.d.ts.map +1 -0
  164. package/dist/utils/dependency-analysis.js +298 -0
  165. package/dist/utils/dependency-analysis.js.map +1 -0
  166. package/dist/utils/detect-git.d.ts +57 -0
  167. package/dist/utils/detect-git.d.ts.map +1 -0
  168. package/dist/utils/detect-git.js +439 -0
  169. package/dist/utils/detect-git.js.map +1 -0
  170. package/dist/utils/detect-mcp.d.ts +32 -0
  171. package/dist/utils/detect-mcp.d.ts.map +1 -0
  172. package/dist/utils/detect-mcp.js +178 -0
  173. package/dist/utils/detect-mcp.js.map +1 -0
  174. package/dist/utils/detect-project.d.ts +3 -0
  175. package/dist/utils/detect-project.d.ts.map +1 -0
  176. package/dist/utils/detect-project.js +155 -0
  177. package/dist/utils/detect-project.js.map +1 -0
  178. package/dist/utils/file-comparison.d.ts +89 -0
  179. package/dist/utils/file-comparison.d.ts.map +1 -0
  180. package/dist/utils/file-comparison.js +301 -0
  181. package/dist/utils/file-comparison.js.map +1 -0
  182. package/dist/utils/file-merger.d.ts +74 -0
  183. package/dist/utils/file-merger.d.ts.map +1 -0
  184. package/dist/utils/file-merger.js +350 -0
  185. package/dist/utils/file-merger.js.map +1 -0
  186. package/dist/utils/logger.d.ts +26 -0
  187. package/dist/utils/logger.d.ts.map +1 -0
  188. package/dist/utils/logger.js +72 -0
  189. package/dist/utils/logger.js.map +1 -0
  190. package/dist/utils/managed-process.d.ts +109 -0
  191. package/dist/utils/managed-process.d.ts.map +1 -0
  192. package/dist/utils/managed-process.js +481 -0
  193. package/dist/utils/managed-process.js.map +1 -0
  194. package/dist/utils/merge-claude-settings.d.ts +65 -0
  195. package/dist/utils/merge-claude-settings.d.ts.map +1 -0
  196. package/dist/utils/merge-claude-settings.js +133 -0
  197. package/dist/utils/merge-claude-settings.js.map +1 -0
  198. package/dist/utils/migration.d.ts +74 -0
  199. package/dist/utils/migration.d.ts.map +1 -0
  200. package/dist/utils/migration.js +345 -0
  201. package/dist/utils/migration.js.map +1 -0
  202. package/dist/utils/process-health.d.ts +51 -0
  203. package/dist/utils/process-health.d.ts.map +1 -0
  204. package/dist/utils/process-health.js +123 -0
  205. package/dist/utils/process-health.js.map +1 -0
  206. package/dist/utils/process-registry.d.ts +20 -0
  207. package/dist/utils/process-registry.d.ts.map +1 -0
  208. package/dist/utils/process-registry.js +151 -0
  209. package/dist/utils/process-registry.js.map +1 -0
  210. package/dist/utils/process-tree.d.ts +51 -0
  211. package/dist/utils/process-tree.d.ts.map +1 -0
  212. package/dist/utils/process-tree.js +499 -0
  213. package/dist/utils/process-tree.js.map +1 -0
  214. package/dist/utils/repair-mcp-config.d.ts +15 -0
  215. package/dist/utils/repair-mcp-config.d.ts.map +1 -0
  216. package/dist/utils/repair-mcp-config.js +129 -0
  217. package/dist/utils/repair-mcp-config.js.map +1 -0
  218. package/dist/utils/task-lifecycle.d.ts +60 -0
  219. package/dist/utils/task-lifecycle.d.ts.map +1 -0
  220. package/dist/utils/task-lifecycle.js +310 -0
  221. package/dist/utils/task-lifecycle.js.map +1 -0
  222. package/dist/utils/update-agent-mcp.d.ts +7 -0
  223. package/dist/utils/update-agent-mcp.d.ts.map +1 -0
  224. package/dist/utils/update-agent-mcp.js +115 -0
  225. package/dist/utils/update-agent-mcp.js.map +1 -0
  226. package/dist/utils/update-agent-templates.d.ts +6 -0
  227. package/dist/utils/update-agent-templates.d.ts.map +1 -0
  228. package/dist/utils/update-agent-templates.js +56 -0
  229. package/dist/utils/update-agent-templates.js.map +1 -0
  230. package/dist/utils/update-config-ci.d.ts +7 -0
  231. package/dist/utils/update-config-ci.d.ts.map +1 -0
  232. package/dist/utils/update-config-ci.js +72 -0
  233. package/dist/utils/update-config-ci.js.map +1 -0
  234. package/dist/utils/update-config-git.d.ts +18 -0
  235. package/dist/utils/update-config-git.d.ts.map +1 -0
  236. package/dist/utils/update-config-git.js +146 -0
  237. package/dist/utils/update-config-git.js.map +1 -0
  238. package/dist/utils/update-config-mcp.d.ts +7 -0
  239. package/dist/utils/update-config-mcp.d.ts.map +1 -0
  240. package/dist/utils/update-config-mcp.js +98 -0
  241. package/dist/utils/update-config-mcp.js.map +1 -0
  242. package/dist/utils/validate-config.d.ts +3 -0
  243. package/dist/utils/validate-config.d.ts.map +1 -0
  244. package/dist/utils/validate-config.js +109 -0
  245. package/dist/utils/validate-config.js.map +1 -0
  246. package/dist/utils/version-tracker.d.ts +130 -0
  247. package/dist/utils/version-tracker.d.ts.map +1 -0
  248. package/dist/utils/version-tracker.js +298 -0
  249. package/dist/utils/version-tracker.js.map +1 -0
  250. package/dist/utils/worktree.d.ts +68 -0
  251. package/dist/utils/worktree.d.ts.map +1 -0
  252. package/dist/utils/worktree.js +446 -0
  253. package/dist/utils/worktree.js.map +1 -0
  254. package/package.json +77 -0
  255. package/templates/ARCHAI_README.md +329 -0
  256. package/templates/CLAUDE.md +67 -0
  257. package/templates/PROMPTS.md +506 -0
  258. package/templates/core-agents/boss-agent.md +671 -0
  259. package/templates/core-agents/cleanup-agent.md +145 -0
  260. package/templates/core-agents/code-reviewer.md +175 -0
  261. package/templates/core-agents/critical-reviewer.md +117 -0
  262. package/templates/core-agents/deep-analyst.md +216 -0
  263. package/templates/core-agents/finalization-agent.md +252 -0
  264. package/templates/core-agents/git-coordinator.md +240 -0
  265. package/templates/core-agents/implementation-agent.md +151 -0
  266. package/templates/core-agents/maestro-agent.md +413 -0
  267. package/templates/core-agents/maestro-headless-agent.md +422 -0
  268. package/templates/core-agents/plan-validator.md +198 -0
  269. package/templates/core-agents/quick-fix.md +56 -0
  270. package/templates/core-agents/routing-templates.md +338 -0
  271. package/templates/core-agents/task-orchestrator.md +143 -0
  272. package/templates/core-agents/task-prep.md +202 -0
  273. package/templates/core-agents/tdd-designer.md +143 -0
  274. package/templates/specialist-meta.md +275 -0
@@ -0,0 +1,60 @@
1
+ import type { TaskPriority, TaskStatus, TaskSpec } from '../types/task.js';
2
+ export declare const PRIORITY_ORDER: Record<TaskPriority, number>;
3
+ export declare const ALLOWED_TRANSITIONS: Record<TaskStatus, TaskStatus[]>;
4
+ /**
5
+ * Parse a task spec file, extracting YAML frontmatter and markdown body.
6
+ * Uses failsafe YAML schema to prevent date auto-conversion.
7
+ */
8
+ export declare function parseTaskFile(filePath: string): Promise<TaskSpec>;
9
+ /**
10
+ * Serialize a TaskSpec back to file content (YAML frontmatter + markdown body).
11
+ */
12
+ export declare function serializeTaskFile(task: TaskSpec): string;
13
+ /**
14
+ * Sort tasks by priority: critical > high > medium > low.
15
+ * Stable sort: tasks with same priority preserve original order.
16
+ * Does not mutate the original array.
17
+ */
18
+ export declare function sortByPriority(tasks: TaskSpec[]): TaskSpec[];
19
+ /**
20
+ * Validate whether a status transition is allowed by the state machine.
21
+ */
22
+ export declare function validateTransition(from: TaskStatus, to: TaskStatus): boolean;
23
+ /**
24
+ * Map a directory name to a TaskStatus. Returns null for unknown directories.
25
+ */
26
+ export declare function getStatusForDirectory(dirName: string): TaskStatus | null;
27
+ /**
28
+ * Map a TaskStatus to its corresponding directory name.
29
+ */
30
+ export declare function getDirectoryForStatus(status: TaskStatus): string;
31
+ /**
32
+ * Find a task file in a directory by its frontmatter id.
33
+ * Returns the filename (not full path) of the matching file.
34
+ * Throws if no file matches.
35
+ */
36
+ export declare function findTaskFile(taskId: string, dir: string): Promise<string>;
37
+ /**
38
+ * Move a task file from one directory to another, updating its status.
39
+ * Uses write-new-then-delete-old strategy to prevent data loss.
40
+ * Removes blocked_reason when moving FROM blocked status.
41
+ * Returns the updated TaskSpec.
42
+ */
43
+ export declare function moveTask(fileName: string, fromDir: string, toDir: string): Promise<TaskSpec>;
44
+ /**
45
+ * Move a task to the blocked/ directory with a reason.
46
+ * Derives blocked directory from path.dirname(fromDir).
47
+ */
48
+ export declare function blockTask(fileName: string, fromDir: string, reason: string): Promise<TaskSpec>;
49
+ /**
50
+ * List and parse all task files in a directory, sorted by priority.
51
+ * Reconciles status from directory name when frontmatter disagrees.
52
+ * Silently skips files that fail to parse.
53
+ */
54
+ export declare function listTasks(dirPath: string): Promise<TaskSpec[]>;
55
+ /**
56
+ * List all tasks from the inbox/ directory, sorted by priority.
57
+ * Convenience wrapper around listTasks.
58
+ */
59
+ export declare function listInbox(tasksRoot: string): Promise<TaskSpec[]>;
60
+ //# sourceMappingURL=task-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-lifecycle.d.ts","sourceRoot":"","sources":["../../src/utils/task-lifecycle.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAmB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5F,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,CAOhE,CAAC;AAyEF;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuBvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAmCxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAO5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAI5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAExE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe/E;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CA8CnB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA2BpE;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAEtE"}
@@ -0,0 +1,310 @@
1
+ // Task lifecycle management utilities
2
+ // Provides parsing, sorting, validation, file movement, and listing for .tasks/ spec files
3
+ import fs from 'fs-extra';
4
+ import path from 'path';
5
+ import yaml from 'yaml';
6
+ // ── Constants ────────────────────────────────────────────────────────
7
+ export const PRIORITY_ORDER = {
8
+ critical: 0,
9
+ high: 1,
10
+ medium: 2,
11
+ low: 3,
12
+ };
13
+ export const ALLOWED_TRANSITIONS = {
14
+ inbox: ['claimed'],
15
+ claimed: ['active', 'blocked'],
16
+ active: ['review', 'blocked'],
17
+ review: ['done', 'active', 'blocked'],
18
+ blocked: ['inbox'],
19
+ done: [],
20
+ };
21
+ const DIR_TO_STATUS = {
22
+ inbox: 'inbox',
23
+ claimed: 'claimed',
24
+ active: 'active',
25
+ review: 'review',
26
+ done: 'done',
27
+ blocked: 'blocked',
28
+ };
29
+ const STATUS_TO_DIR = {
30
+ inbox: 'inbox',
31
+ claimed: 'claimed',
32
+ active: 'active',
33
+ review: 'review',
34
+ done: 'done',
35
+ blocked: 'blocked',
36
+ };
37
+ // ── Internal Helpers ─────────────────────────────────────────────────
38
+ /** Split frontmatter from body - handles both LF and CRLF */
39
+ function splitFrontmatter(content) {
40
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
41
+ if (!match)
42
+ throw new Error('No valid YAML frontmatter found');
43
+ return { yaml: match[1], body: match[2] };
44
+ }
45
+ /** Parse YAML array from failsafe schema string representation */
46
+ function parseYamlArray(value) {
47
+ if (Array.isArray(value))
48
+ return value;
49
+ if (typeof value !== 'string')
50
+ return [];
51
+ const trimmed = value.trim();
52
+ if (trimmed === '[]' || trimmed === '')
53
+ return [];
54
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
55
+ const inner = trimmed.slice(1, -1).trim();
56
+ if (inner === '')
57
+ return [];
58
+ return inner.split(',').map(s => s.trim()).filter(s => s.length > 0);
59
+ }
60
+ return [trimmed];
61
+ }
62
+ /** Convert failsafe null string to actual null */
63
+ function parseNullable(value) {
64
+ if (value === null || value === undefined)
65
+ return null;
66
+ if (typeof value === 'string' && value === 'null')
67
+ return null;
68
+ return String(value);
69
+ }
70
+ /** Post-process raw failsafe-parsed object into typed TaskFrontmatter */
71
+ function postProcessFrontmatter(raw) {
72
+ return {
73
+ id: String(raw.id ?? ''),
74
+ title: String(raw.title ?? ''),
75
+ type: String(raw.type ?? 'task'),
76
+ priority: String(raw.priority ?? 'medium'),
77
+ status: String(raw.status ?? 'inbox'),
78
+ created: String(raw.created ?? ''),
79
+ epic: parseNullable(raw.epic),
80
+ depends_on: parseYamlArray(raw.depends_on),
81
+ blocks: parseYamlArray(raw.blocks),
82
+ assignee: parseNullable(raw.assignee),
83
+ branch: parseNullable(raw.branch),
84
+ ...(raw.due !== undefined ? { due: parseNullable(raw.due) } : {}),
85
+ ...(raw.blocked_reason !== undefined && raw.blocked_reason !== 'null'
86
+ ? { blocked_reason: String(raw.blocked_reason) }
87
+ : {}),
88
+ };
89
+ }
90
+ // ── Public API ──────────────────────────────────────────────────────
91
+ /**
92
+ * Parse a task spec file, extracting YAML frontmatter and markdown body.
93
+ * Uses failsafe YAML schema to prevent date auto-conversion.
94
+ */
95
+ export async function parseTaskFile(filePath) {
96
+ const content = await fs.readFile(filePath, 'utf-8');
97
+ const { yaml: yamlStr, body } = splitFrontmatter(content);
98
+ const raw = yaml.parse(yamlStr, { schema: 'failsafe' });
99
+ if (!raw || typeof raw !== 'object') {
100
+ throw new Error(`Failed to parse YAML frontmatter in ${filePath}`);
101
+ }
102
+ const frontmatter = postProcessFrontmatter(raw);
103
+ // Validate required fields
104
+ const required = ['id', 'title', 'status', 'priority'];
105
+ for (const field of required) {
106
+ if (!frontmatter[field]) {
107
+ throw new Error(`Missing required field '${field}' in ${filePath}`);
108
+ }
109
+ }
110
+ return {
111
+ frontmatter,
112
+ body: body.trimEnd(),
113
+ filePath: path.resolve(filePath),
114
+ fileName: path.basename(filePath),
115
+ };
116
+ }
117
+ /**
118
+ * Serialize a TaskSpec back to file content (YAML frontmatter + markdown body).
119
+ */
120
+ export function serializeTaskFile(task) {
121
+ // Build the frontmatter object for serialization
122
+ const fm = {
123
+ id: task.frontmatter.id,
124
+ title: task.frontmatter.title,
125
+ type: task.frontmatter.type,
126
+ priority: task.frontmatter.priority,
127
+ status: task.frontmatter.status,
128
+ created: task.frontmatter.created,
129
+ epic: task.frontmatter.epic,
130
+ depends_on: task.frontmatter.depends_on,
131
+ blocks: task.frontmatter.blocks,
132
+ assignee: task.frontmatter.assignee,
133
+ branch: task.frontmatter.branch,
134
+ };
135
+ // Include optional fields
136
+ if (task.frontmatter.due !== undefined) {
137
+ fm.due = task.frontmatter.due;
138
+ }
139
+ if (task.frontmatter.blocked_reason !== undefined) {
140
+ fm.blocked_reason = task.frontmatter.blocked_reason;
141
+ }
142
+ // Use yaml.Document to set flow style on arrays for inline format
143
+ const doc = new yaml.Document(fm);
144
+ yaml.visit(doc, {
145
+ Seq(_key, node) {
146
+ node.flow = true;
147
+ },
148
+ });
149
+ const yamlStr = doc.toString().trimEnd();
150
+ const NL = String.fromCharCode(10);
151
+ const body = task.body ? NL + task.body : '';
152
+ return '---' + NL + yamlStr + NL + '---' + NL + body + NL;
153
+ }
154
+ /**
155
+ * Sort tasks by priority: critical > high > medium > low.
156
+ * Stable sort: tasks with same priority preserve original order.
157
+ * Does not mutate the original array.
158
+ */
159
+ export function sortByPriority(tasks) {
160
+ const defaultOrder = Object.keys(PRIORITY_ORDER).length;
161
+ return [...tasks].sort((a, b) => {
162
+ const aOrder = PRIORITY_ORDER[a.frontmatter.priority] ?? defaultOrder;
163
+ const bOrder = PRIORITY_ORDER[b.frontmatter.priority] ?? defaultOrder;
164
+ return aOrder - bOrder;
165
+ });
166
+ }
167
+ /**
168
+ * Validate whether a status transition is allowed by the state machine.
169
+ */
170
+ export function validateTransition(from, to) {
171
+ const allowed = ALLOWED_TRANSITIONS[from];
172
+ if (!allowed)
173
+ return false;
174
+ return allowed.includes(to);
175
+ }
176
+ /**
177
+ * Map a directory name to a TaskStatus. Returns null for unknown directories.
178
+ */
179
+ export function getStatusForDirectory(dirName) {
180
+ return DIR_TO_STATUS[dirName] ?? null;
181
+ }
182
+ /**
183
+ * Map a TaskStatus to its corresponding directory name.
184
+ */
185
+ export function getDirectoryForStatus(status) {
186
+ return STATUS_TO_DIR[status];
187
+ }
188
+ /**
189
+ * Find a task file in a directory by its frontmatter id.
190
+ * Returns the filename (not full path) of the matching file.
191
+ * Throws if no file matches.
192
+ */
193
+ export async function findTaskFile(taskId, dir) {
194
+ const entries = await fs.readdir(dir);
195
+ for (const entry of entries) {
196
+ if (!entry.endsWith('.md'))
197
+ continue;
198
+ try {
199
+ const filePath = path.join(dir, entry);
200
+ const task = await parseTaskFile(filePath);
201
+ if (task.frontmatter.id === taskId) {
202
+ return entry;
203
+ }
204
+ }
205
+ catch {
206
+ // Skip unparseable files
207
+ }
208
+ }
209
+ throw new Error(`No task file with id '${taskId}' found in ${dir}`);
210
+ }
211
+ /**
212
+ * Move a task file from one directory to another, updating its status.
213
+ * Uses write-new-then-delete-old strategy to prevent data loss.
214
+ * Removes blocked_reason when moving FROM blocked status.
215
+ * Returns the updated TaskSpec.
216
+ */
217
+ export async function moveTask(fileName, fromDir, toDir) {
218
+ const sourcePath = path.join(fromDir, fileName);
219
+ const task = await parseTaskFile(sourcePath);
220
+ // Determine target status from directory name
221
+ const toDirName = path.basename(toDir);
222
+ const targetStatus = getStatusForDirectory(toDirName);
223
+ if (!targetStatus) {
224
+ throw new Error(`Unknown target directory '${toDirName}'`);
225
+ }
226
+ // Validate the transition
227
+ const fromDirName = path.basename(fromDir);
228
+ const sourceStatus = getStatusForDirectory(fromDirName) ?? task.frontmatter.status;
229
+ if (!validateTransition(sourceStatus, targetStatus)) {
230
+ throw new Error(`Invalid transition: ${sourceStatus} -> ${targetStatus} for task ${task.frontmatter.id}`);
231
+ }
232
+ // Update frontmatter
233
+ task.frontmatter.status = targetStatus;
234
+ // Remove blocked_reason when leaving blocked status
235
+ if (sourceStatus === 'blocked') {
236
+ delete task.frontmatter.blocked_reason;
237
+ }
238
+ // Write to new location, then delete original
239
+ await fs.ensureDir(toDir);
240
+ const targetPath = path.join(toDir, fileName);
241
+ const content = serializeTaskFile(task);
242
+ await fs.writeFile(targetPath, content, 'utf-8');
243
+ // Verify write succeeded before deleting source
244
+ const exists = await fs.pathExists(targetPath);
245
+ if (!exists) {
246
+ throw new Error(`Failed to write task to ${targetPath}`);
247
+ }
248
+ // Delete original
249
+ await fs.remove(sourcePath);
250
+ // Update filePath to reflect new location
251
+ task.filePath = path.resolve(targetPath);
252
+ return task;
253
+ }
254
+ /**
255
+ * Move a task to the blocked/ directory with a reason.
256
+ * Derives blocked directory from path.dirname(fromDir).
257
+ */
258
+ export async function blockTask(fileName, fromDir, reason) {
259
+ // Read and parse the source file first to add blocked_reason
260
+ const sourcePath = path.join(fromDir, fileName);
261
+ const task = await parseTaskFile(sourcePath);
262
+ // Add blocked_reason to frontmatter before moving
263
+ task.frontmatter.blocked_reason = reason;
264
+ // Write updated content back to source before moveTask reads it
265
+ const updatedContent = serializeTaskFile(task);
266
+ await fs.writeFile(sourcePath, updatedContent, 'utf-8');
267
+ // Derive blocked directory and move
268
+ const blockedDir = path.join(path.dirname(fromDir), 'blocked');
269
+ const result = await moveTask(fileName, fromDir, blockedDir);
270
+ return result;
271
+ }
272
+ /**
273
+ * List and parse all task files in a directory, sorted by priority.
274
+ * Reconciles status from directory name when frontmatter disagrees.
275
+ * Silently skips files that fail to parse.
276
+ */
277
+ export async function listTasks(dirPath) {
278
+ const dirExists = await fs.pathExists(dirPath);
279
+ if (!dirExists)
280
+ return [];
281
+ const entries = await fs.readdir(dirPath);
282
+ const tasks = [];
283
+ const dirName = path.basename(dirPath);
284
+ const dirStatus = getStatusForDirectory(dirName);
285
+ for (const entry of entries) {
286
+ if (!entry.endsWith('.md'))
287
+ continue;
288
+ try {
289
+ const filePath = path.join(dirPath, entry);
290
+ const task = await parseTaskFile(filePath);
291
+ // Reconcile status from directory name (BLOCKER-2)
292
+ if (dirStatus !== null && task.frontmatter.status !== dirStatus) {
293
+ task.frontmatter.status = dirStatus;
294
+ }
295
+ tasks.push(task);
296
+ }
297
+ catch {
298
+ // Skip files that fail to parse (MAJOR-1)
299
+ }
300
+ }
301
+ return sortByPriority(tasks);
302
+ }
303
+ /**
304
+ * List all tasks from the inbox/ directory, sorted by priority.
305
+ * Convenience wrapper around listTasks.
306
+ */
307
+ export async function listInbox(tasksRoot) {
308
+ return listTasks(path.join(tasksRoot, 'inbox'));
309
+ }
310
+ //# sourceMappingURL=task-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-lifecycle.js","sourceRoot":"","sources":["../../src/utils/task-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Update agent templates with task manager integration instructions.
3
+ * Updates both installed copies (.claude/agents/) and template sources (templates/core-agents/).
4
+ * Returns the total number of files updated.
5
+ */
6
+ export declare function updateAgentTemplatesWithMcp(): Promise<number>;
7
+ //# sourceMappingURL=update-agent-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-agent-mcp.d.ts","sourceRoot":"","sources":["../../src/utils/update-agent-mcp.ts"],"names":[],"mappings":"AAyGA;;;;GAIG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAAC,CAwBnE"}
@@ -0,0 +1,115 @@
1
+ import fs from 'fs-extra';
2
+ import { logger } from './logger.js';
3
+ /**
4
+ * Agent files to update with task manager integration instructions.
5
+ * Each entry specifies the file path, the section to add, and the heading
6
+ * to insert before.
7
+ */
8
+ const AGENT_UPDATES = [
9
+ {
10
+ installedPath: '.claude/agents/maestro-agent.md',
11
+ templatePath: 'templates/core-agents/maestro-agent.md',
12
+ sectionHeading: '## Task Manager Integration',
13
+ insertBefore: '## Specialists',
14
+ content: [
15
+ '## Task Manager Integration',
16
+ '',
17
+ 'If a task manager MCP is available (e.g., Monday.com, Linear, Jira), sync task status',
18
+ 'at the end of each phase. Mark tasks as in-progress when starting implementation,',
19
+ 'and done when finalization completes.',
20
+ ].join('\n'),
21
+ },
22
+ {
23
+ installedPath: '.claude/agents/maestro-headless-agent.md',
24
+ templatePath: 'templates/core-agents/maestro-headless-agent.md',
25
+ sectionHeading: '## Task Manager Integration',
26
+ insertBefore: '## Specialists',
27
+ content: [
28
+ '## Task Manager Integration',
29
+ '',
30
+ 'If a task manager MCP is available (e.g., Monday.com, Linear, Jira), sync task status',
31
+ 'at the end of each phase. Mark tasks as in-progress when starting implementation,',
32
+ 'and done when finalization completes.',
33
+ ].join('\n'),
34
+ },
35
+ {
36
+ installedPath: '.claude/agents/finalization-agent.md',
37
+ templatePath: 'templates/core-agents/finalization-agent.md',
38
+ sectionHeading: '## Task Manager Sync',
39
+ insertBefore: '## Output Format',
40
+ content: [
41
+ '## Task Manager Sync',
42
+ '',
43
+ 'If a task manager MCP is available, update the task status to reflect completion.',
44
+ 'Move completed items to the appropriate done/completed state.',
45
+ ].join('\n'),
46
+ },
47
+ {
48
+ installedPath: '.claude/agents/task-orchestrator.md',
49
+ templatePath: 'templates/core-agents/task-orchestrator.md',
50
+ sectionHeading: '## External Task Manager',
51
+ insertBefore: '## Output Format',
52
+ content: [
53
+ '## External Task Manager',
54
+ '',
55
+ 'If a task manager MCP is configured, use it to:',
56
+ '- Check for new tasks/assignments',
57
+ '- Update task status as work progresses',
58
+ '- Sync Archai task states with the external board',
59
+ ].join('\n'),
60
+ },
61
+ ];
62
+ /**
63
+ * Add a section to a markdown file before a target heading.
64
+ * Returns true if the file was updated, false if skipped.
65
+ */
66
+ async function addSectionToFile(filePath, sectionHeading, insertBefore, sectionContent) {
67
+ if (!await fs.pathExists(filePath)) {
68
+ logger.debug(`File not found, skipping: ${filePath}`);
69
+ return false;
70
+ }
71
+ let content = await fs.readFile(filePath, 'utf-8');
72
+ // Check if section already exists (idempotent)
73
+ if (content.includes(sectionHeading)) {
74
+ logger.debug(`Section already exists in: ${filePath}`);
75
+ return false;
76
+ }
77
+ // Find the target heading to insert before
78
+ const targetIndex = content.indexOf(insertBefore);
79
+ if (targetIndex === -1) {
80
+ // Fallback: append before the last line
81
+ logger.debug(`Target heading "${insertBefore}" not found in ${filePath}, appending at end`);
82
+ if (!content.endsWith('\n'))
83
+ content += '\n';
84
+ content += '\n---\n\n' + sectionContent + '\n';
85
+ }
86
+ else {
87
+ // Insert the section before the target heading
88
+ // Add a separator between sections
89
+ const insertion = sectionContent + '\n\n---\n\n';
90
+ content = content.slice(0, targetIndex) + insertion + content.slice(targetIndex);
91
+ }
92
+ await fs.writeFile(filePath, content);
93
+ logger.debug(`Updated agent: ${filePath}`);
94
+ return true;
95
+ }
96
+ /**
97
+ * Update agent templates with task manager integration instructions.
98
+ * Updates both installed copies (.claude/agents/) and template sources (templates/core-agents/).
99
+ * Returns the total number of files updated.
100
+ */
101
+ export async function updateAgentTemplatesWithMcp() {
102
+ let updatedCount = 0;
103
+ for (const update of AGENT_UPDATES) {
104
+ // Update installed copy
105
+ const installedUpdated = await addSectionToFile(update.installedPath, update.sectionHeading, update.insertBefore, update.content);
106
+ if (installedUpdated)
107
+ updatedCount++;
108
+ // Update template source (so new installations get the section too)
109
+ const templateUpdated = await addSectionToFile(update.templatePath, update.sectionHeading, update.insertBefore, update.content);
110
+ if (templateUpdated)
111
+ updatedCount++;
112
+ }
113
+ return updatedCount;
114
+ }
115
+ //# sourceMappingURL=update-agent-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-agent-mcp.js","sourceRoot":"","sources":["../../src/utils/update-agent-mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Update installed agent files to reference the discovered default branch
3
+ * instead of hardcoded main/master/develop.
4
+ */
5
+ export declare function updateAgentTemplates(defaultBranch: string): Promise<number>;
6
+ //# sourceMappingURL=update-agent-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-agent-templates.d.ts","sourceRoot":"","sources":["../../src/utils/update-agent-templates.ts"],"names":[],"mappings":"AAqCA;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBjF"}
@@ -0,0 +1,56 @@
1
+ import fs from 'fs-extra';
2
+ import { logger } from './logger.js';
3
+ /**
4
+ * Installed agent files that contain the branch check pattern.
5
+ * These are the files that get updated with the discovered default branch.
6
+ * Template source files in templates/core-agents/ are NOT modified
7
+ * (they keep the generic pattern for new installations).
8
+ */
9
+ const INSTALLED_AGENTS = [
10
+ {
11
+ path: '.claude/agents/iteration-controller.md',
12
+ pattern: /- If on `main`\/`master`\/`develop`/g,
13
+ buildReplacement: (branch) => `- If on \`${branch}\``,
14
+ },
15
+ {
16
+ path: '.claude/agents/task-orchestrator.md',
17
+ pattern: /- If on `main`\/`master`\/`develop`\/`release\/\*`/g,
18
+ buildReplacement: (branch) => `- If on \`${branch}\`/\`release/*\``,
19
+ },
20
+ {
21
+ // Legacy name - may exist in older installations
22
+ path: '.claude/agents/maestro-agent.md',
23
+ pattern: /- If on `main`\/`master`\/`develop`/g,
24
+ buildReplacement: (branch) => `- If on \`${branch}\``,
25
+ },
26
+ {
27
+ path: '.claude/agents/maestro-headless-agent.md',
28
+ pattern: /- If on `main`\/`master`\/`develop`/g,
29
+ buildReplacement: (branch) => `- If on \`${branch}\``,
30
+ },
31
+ ];
32
+ /**
33
+ * Update installed agent files to reference the discovered default branch
34
+ * instead of hardcoded main/master/develop.
35
+ */
36
+ export async function updateAgentTemplates(defaultBranch) {
37
+ let updatedCount = 0;
38
+ for (const target of INSTALLED_AGENTS) {
39
+ const replacement = target.buildReplacement(defaultBranch);
40
+ if (!await fs.pathExists(target.path)) {
41
+ logger.debug(`Agent file not found, skipping: ${target.path}`);
42
+ continue;
43
+ }
44
+ const content = await fs.readFile(target.path, 'utf-8');
45
+ const newContent = content.replace(target.pattern, replacement);
46
+ if (newContent === content) {
47
+ logger.debug(`No changes needed in: ${target.path}`);
48
+ continue;
49
+ }
50
+ await fs.writeFile(target.path, newContent);
51
+ updatedCount++;
52
+ logger.debug(`Updated agent: ${target.path}`);
53
+ }
54
+ return updatedCount;
55
+ }
56
+ //# sourceMappingURL=update-agent-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-agent-templates.js","sourceRoot":"","sources":["../../src/utils/update-agent-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG;IACvB;QACE,IAAI,EAAE,wCAAwC;QAC9C,OAAO,EAAE,sCAAsC;QAC/C,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CACnC,aAAa,MAAM,IAAI;KAC1B;IACD;QACE,IAAI,EAAE,qCAAqC;QAC3C,OAAO,EAAE,qDAAqD;QAC9D,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CACnC,aAAa,MAAM,kBAAkB;KACxC;IACD;QACE,iDAAiD;QACjD,IAAI,EAAE,iCAAiC;QACvC,OAAO,EAAE,sCAAsC;QAC/C,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CACnC,aAAa,MAAM,IAAI;KAC1B;IACD;QACE,IAAI,EAAE,0CAA0C;QAChD,OAAO,EAAE,sCAAsC;QAC/C,gBAAgB,EAAE,CAAC,MAAc,EAAE,EAAE,CACnC,aAAa,MAAM,IAAI;KAC1B;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,aAAqB;IAC9D,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAE3D,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEhE,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5C,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CIDetectionResult } from "../types/index.js";
2
+ /**
3
+ * Update archai.config.md with a CI/CD section.
4
+ * If the section already exists, replaces it. Otherwise inserts before ## Notes.
5
+ */
6
+ export declare function updateConfigWithCI(result: CIDetectionResult): Promise<void>;
7
+ //# sourceMappingURL=update-config-ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-config-ci.d.ts","sourceRoot":"","sources":["../../src/utils/update-config-ci.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAc3D;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDjF"}