@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,298 @@
1
+ /**
2
+ * Error thrown when cyclic dependencies are detected among tasks.
3
+ */
4
+ export class CyclicDependencyError extends Error {
5
+ /** The task IDs forming the cycle */
6
+ cycle;
7
+ constructor(cycle) {
8
+ const cycleStr = cycle.join(' -> ');
9
+ super(`Cyclic dependency detected: ${cycleStr}`);
10
+ this.name = 'CyclicDependencyError';
11
+ this.cycle = cycle;
12
+ }
13
+ }
14
+ /**
15
+ * Normalize a filesystem path for comparison.
16
+ */
17
+ export function normalizePath(p) {
18
+ const backslashRe = new RegExp('\\\\', 'g');
19
+ const dotSlashRe = new RegExp('^\\.\\/');
20
+ let result = p
21
+ .trim()
22
+ .replace(backslashRe, '/')
23
+ .replace(dotSlashRe, '')
24
+ .toLowerCase();
25
+ if (!result.endsWith('/')) {
26
+ result += '/';
27
+ }
28
+ return result;
29
+ }
30
+ /**
31
+ * Parse affected area paths from a task body markdown.
32
+ * Returns null if no Affected Areas section found, or string[] of normalized paths.
33
+ */
34
+ export function parseAffectedAreas(body) {
35
+ const headingRe = new RegExp('^#{2,3}\\s+affected\\s+areas\\s*$', 'im');
36
+ const match = headingRe.exec(body);
37
+ if (!match)
38
+ return null;
39
+ // Extract content between this heading and the next heading (or end of string)
40
+ const startIdx = match.index + match[0].length;
41
+ const nextHeadingRe = new RegExp('^#{2,}\\s', 'm');
42
+ const restOfBody = body.slice(startIdx);
43
+ const nextMatch = nextHeadingRe.exec(restOfBody);
44
+ const sectionContent = nextMatch ? restOfBody.slice(0, nextMatch.index) : restOfBody;
45
+ // Extract paths from bullet lines
46
+ const paths = [];
47
+ const bulletRe = new RegExp('^[-*]\\s+(.+)$', 'gm');
48
+ const backtickRe = new RegExp('`([^`]+)`');
49
+ const descStripRe = new RegExp('\\s+(--|—|–).*$');
50
+ let bulletMatch;
51
+ while ((bulletMatch = bulletRe.exec(sectionContent)) !== null) {
52
+ const lineContent = bulletMatch[1];
53
+ // Try backtick-wrapped path first
54
+ const btMatch = backtickRe.exec(lineContent);
55
+ if (btMatch) {
56
+ paths.push(normalizePath(btMatch[1]));
57
+ }
58
+ else {
59
+ // Bare path: strip description after -- or em-dash/en-dash
60
+ const barePath = lineContent.replace(descStripRe, '').trim();
61
+ if (barePath) {
62
+ paths.push(normalizePath(barePath));
63
+ }
64
+ }
65
+ }
66
+ return paths;
67
+ }
68
+ /**
69
+ * Check if two sets of paths have hierarchical overlap.
70
+ * Paths should already be normalized (trailing slash, lowercase).
71
+ */
72
+ export function pathsOverlap(pathsA, pathsB) {
73
+ for (const a of pathsA) {
74
+ for (const b of pathsB) {
75
+ // Exact match or one is a prefix of the other
76
+ // With trailing slashes, prefix check handles parent-child correctly:
77
+ // src/utils/ startsWith src/utils/ (exact)
78
+ // src/utils/worktree/ startsWith src/utils/ (child)
79
+ // src/utils/ does NOT startsWith src/utilsExtra/ (partial name)
80
+ if (a === b || a.startsWith(b) || b.startsWith(a)) {
81
+ return true;
82
+ }
83
+ }
84
+ }
85
+ return false;
86
+ }
87
+ /**
88
+ * Detect cycles in the dependency graph using iterative DFS (three-color).
89
+ * Returns the cycle path as an array, or null if no cycles.
90
+ */
91
+ function detectCycles(taskIds, adjacency) {
92
+ const WHITE = 0, GRAY = 1, BLACK = 2;
93
+ const color = new Map();
94
+ const parent = new Map();
95
+ for (const id of taskIds) {
96
+ color.set(id, WHITE);
97
+ }
98
+ for (const startId of taskIds) {
99
+ if (color.get(startId) !== WHITE)
100
+ continue;
101
+ const stack = [[startId, false]];
102
+ parent.set(startId, null);
103
+ while (stack.length > 0) {
104
+ const [nodeId, isBacktrack] = stack.pop();
105
+ if (isBacktrack) {
106
+ color.set(nodeId, BLACK);
107
+ continue;
108
+ }
109
+ if (color.get(nodeId) === GRAY || color.get(nodeId) === BLACK) {
110
+ continue;
111
+ }
112
+ color.set(nodeId, GRAY);
113
+ stack.push([nodeId, true]);
114
+ const neighbors = adjacency.get(nodeId) ?? new Set();
115
+ for (const neighbor of neighbors) {
116
+ if (!color.has(neighbor))
117
+ continue;
118
+ if (color.get(neighbor) === GRAY) {
119
+ // Cycle found - reconstruct path
120
+ return reconstructCyclePath(parent, nodeId, neighbor);
121
+ }
122
+ if (color.get(neighbor) === WHITE) {
123
+ parent.set(neighbor, nodeId);
124
+ stack.push([neighbor, false]);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return null;
130
+ }
131
+ function reconstructCyclePath(parent, current, cycleTarget) {
132
+ const path = [];
133
+ let node = current;
134
+ while (node !== null && node !== cycleTarget) {
135
+ path.push(node);
136
+ node = parent.get(node) ?? null;
137
+ }
138
+ path.push(cycleTarget);
139
+ path.reverse();
140
+ path.push(cycleTarget);
141
+ return path;
142
+ }
143
+ /**
144
+ * Produce topological levels using Kahn's algorithm.
145
+ * Returns array of arrays, where each sub-array is a level of task IDs.
146
+ */
147
+ function topologicalLevels(taskIds, adjacency) {
148
+ // Build in-degree map (only for task IDs in the input)
149
+ const inDegree = new Map();
150
+ for (const id of taskIds) {
151
+ inDegree.set(id, 0);
152
+ }
153
+ for (const [from, neighbors] of adjacency) {
154
+ if (!inDegree.has(from))
155
+ continue;
156
+ for (const to of neighbors) {
157
+ if (!inDegree.has(to))
158
+ continue;
159
+ inDegree.set(to, (inDegree.get(to) ?? 0) + 1);
160
+ }
161
+ }
162
+ // Start with all zero-in-degree nodes
163
+ let currentLevel = taskIds.filter(id => inDegree.get(id) === 0);
164
+ const levels = [];
165
+ let processed = 0;
166
+ while (currentLevel.length > 0) {
167
+ levels.push(currentLevel);
168
+ processed += currentLevel.length;
169
+ const nextLevel = [];
170
+ for (const nodeId of currentLevel) {
171
+ const neighbors = adjacency.get(nodeId) ?? new Set();
172
+ for (const neighbor of neighbors) {
173
+ if (!inDegree.has(neighbor))
174
+ continue;
175
+ const newDeg = (inDegree.get(neighbor) ?? 1) - 1;
176
+ inDegree.set(neighbor, newDeg);
177
+ if (newDeg === 0) {
178
+ nextLevel.push(neighbor);
179
+ }
180
+ }
181
+ }
182
+ currentLevel = nextLevel;
183
+ }
184
+ // Defensive check (critical reviewer recommendation #2)
185
+ if (processed !== taskIds.length) {
186
+ throw new Error(`Internal error: topological sort processed ${processed}/${taskIds.length} tasks`);
187
+ }
188
+ return levels;
189
+ }
190
+ /**
191
+ * Split tasks at a single topological level into non-conflicting execution groups.
192
+ * Tasks with null affected areas are isolated into singleton sequential groups.
193
+ * Tasks with defined areas are grouped using greedy bin-packing: each task is placed
194
+ * in the first bin that has no path overlap, or a new bin is created.
195
+ */
196
+ function splitByConflicts(tasks, affectedAreasMap) {
197
+ const groups = [];
198
+ // Separate tasks with null areas (singletons) from those with defined areas
199
+ const nullAreaTasks = [];
200
+ const definedAreaTasks = [];
201
+ for (const task of tasks) {
202
+ const areas = affectedAreasMap.get(task.frontmatter.id);
203
+ if (areas === null || areas === undefined) {
204
+ nullAreaTasks.push(task);
205
+ }
206
+ else {
207
+ definedAreaTasks.push(task);
208
+ }
209
+ }
210
+ // Null-area tasks go first as singletons (front-load risk)
211
+ for (const task of nullAreaTasks) {
212
+ groups.push({ tasks: [task], parallel: false });
213
+ }
214
+ // Greedy bin-packing for defined-area tasks
215
+ // Each bin tracks its aggregated paths
216
+ const bins = [];
217
+ for (const task of definedAreaTasks) {
218
+ const taskPaths = affectedAreasMap.get(task.frontmatter.id) ?? [];
219
+ let placed = false;
220
+ for (const bin of bins) {
221
+ if (!pathsOverlap(bin.paths, taskPaths)) {
222
+ bin.tasks.push(task);
223
+ bin.paths.push(...taskPaths);
224
+ placed = true;
225
+ break;
226
+ }
227
+ }
228
+ if (!placed) {
229
+ bins.push({ tasks: [task], paths: [...taskPaths] });
230
+ }
231
+ }
232
+ // Convert bins to ExecutionGroups
233
+ for (const bin of bins) {
234
+ groups.push({
235
+ tasks: bin.tasks,
236
+ parallel: bin.tasks.length > 1,
237
+ });
238
+ }
239
+ return groups;
240
+ }
241
+ /**
242
+ * Build an execution graph from task specs.
243
+ * Returns an ordered list of execution groups where tasks within a group
244
+ * are independent (can run in parallel) and groups must execute sequentially.
245
+ *
246
+ * Note: Only `depends_on` is consulted for explicit dependencies.
247
+ * The `blocks` field is not used by this function.
248
+ */
249
+ export function buildExecutionGraph(tasks) {
250
+ // Edge case: empty input
251
+ if (tasks.length === 0)
252
+ return [];
253
+ // Build task ID map, validate no duplicates
254
+ const idMap = new Map();
255
+ for (const task of tasks) {
256
+ const id = task.frontmatter.id;
257
+ if (idMap.has(id)) {
258
+ throw new Error(`Duplicate task ID: ${id}`);
259
+ }
260
+ idMap.set(id, task);
261
+ }
262
+ const taskIds = [...idMap.keys()];
263
+ // Build adjacency list from explicit depends_on
264
+ // Edge direction: depId -> taskId (depId must complete before taskId)
265
+ const adjacency = new Map();
266
+ for (const id of taskIds) {
267
+ adjacency.set(id, new Set());
268
+ }
269
+ for (const task of tasks) {
270
+ for (const depId of task.frontmatter.depends_on) {
271
+ // Only add edge if the dependency is in our task set (silently ignore unresolved refs)
272
+ if (adjacency.has(depId)) {
273
+ adjacency.get(depId).add(task.frontmatter.id);
274
+ }
275
+ }
276
+ }
277
+ // Detect cycles
278
+ const cyclePath = detectCycles(taskIds, adjacency);
279
+ if (cyclePath) {
280
+ throw new CyclicDependencyError(cyclePath);
281
+ }
282
+ // Topological sort to produce levels
283
+ const levels = topologicalLevels(taskIds, adjacency);
284
+ // Parse affected areas for each task
285
+ const affectedAreasMap = new Map();
286
+ for (const task of tasks) {
287
+ affectedAreasMap.set(task.frontmatter.id, parseAffectedAreas(task.body));
288
+ }
289
+ // Within each level, split by module-overlap conflicts
290
+ const result = [];
291
+ for (const level of levels) {
292
+ const levelTasks = level.map(id => idMap.get(id));
293
+ const subGroups = splitByConflicts(levelTasks, affectedAreasMap);
294
+ result.push(...subGroups);
295
+ }
296
+ return result;
297
+ }
298
+ //# sourceMappingURL=dependency-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-analysis.js","sourceRoot":"","sources":["../../src/utils/dependency-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { GitConfig, GitignoreValidation, GitPatterns } from '../types/index.js';
2
+ /**
3
+ * Check if the current directory is a Git repository.
4
+ */
5
+ export declare function detectGitRepo(): Promise<boolean>;
6
+ /**
7
+ * Check if the current directory is inside a linked git worktree.
8
+ * Returns true if .git is a file (linked worktree), false if directory (main repo) or missing.
9
+ */
10
+ export declare function isWorktree(): Promise<boolean>;
11
+ /**
12
+ * Discover Git defaults by running local git commands.
13
+ * No network calls are made.
14
+ */
15
+ export declare function discoverGitDefaults(): Promise<GitConfig>;
16
+ /**
17
+ * Validate that .gitignore contains all required archai entries.
18
+ */
19
+ export declare function validateGitignore(): Promise<GitignoreValidation>;
20
+ /**
21
+ * Fix .gitignore by appending missing archai entries.
22
+ */
23
+ export declare function fixGitignore(missing: string[]): Promise<void>;
24
+ /**
25
+ * Parse git for-each-ref output into cleaned branch names.
26
+ * Strips remote prefixes, deduplicates, and filters HEAD pointers.
27
+ */
28
+ export declare function parseBranchNames(rawOutput: string): string[];
29
+ /**
30
+ * Classify branch names by their prefix (first path segment before /).
31
+ * Returns a map of prefix/ -> count for all branches containing a slash.
32
+ */
33
+ export declare function classifyBranchPrefixes(branches: string[]): Map<string, number>;
34
+ /**
35
+ * Parse git log output (format: %H %P\n%s) to detect merge commits and PR platforms.
36
+ */
37
+ export declare function parseMergeCommits(rawLogOutput: string): {
38
+ mergeCount: number;
39
+ totalCount: number;
40
+ prPlatform: 'github' | 'gitlab' | 'bitbucket' | 'azure' | null;
41
+ usesPRs: boolean;
42
+ };
43
+ /**
44
+ * Determine the dominant merge strategy based on merge commit ratio.
45
+ */
46
+ export declare function determineMergeStrategy(mergeCount: number, totalCount: number): GitPatterns['mergeStrategy'];
47
+ /**
48
+ * Build the agent branch naming convention based on detected patterns.
49
+ */
50
+ export declare function buildAgentConvention(topPrefix: string, isUsernamePattern: boolean, isJiraPattern: boolean): string;
51
+ /**
52
+ * Detect git branching and merge patterns from repository history.
53
+ * Analyzes branch names (up to 100) and merge commits (up to 200).
54
+ * Never throws -- returns sensible defaults on any error.
55
+ */
56
+ export declare function detectGitPatterns(projectRoot?: string): Promise<GitPatterns>;
57
+ //# sourceMappingURL=detect-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-git.d.ts","sourceRoot":"","sources":["../../src/utils/detect-git.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAarF;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAOnD;AAoBD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,CAwF9D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAiBtE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnE;AAkBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkE5D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,IAAI,CAAC;IAC/D,OAAO,EAAE,OAAO,CAAC;CAClB,CAsDA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,WAAW,CAAC,eAAe,CAAC,CAW9B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,EAC1B,aAAa,EAAE,OAAO,GACrB,MAAM,CAcR;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgGlF"}