@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,446 @@
1
+ import fs from 'fs-extra';
2
+ import { execSync } from 'child_process';
3
+ import path from 'path';
4
+ import { logger } from './logger.js';
5
+ import { isWorktree } from './detect-git.js';
6
+ import { findByCwd, killSingle } from './process-tree.js';
7
+ /** Directories to junction/symlink from main .claude/ into worktree .claude/ */
8
+ const SHARED_DIRS = ['agents', 'scripts'];
9
+ /** Files to hard-link from main .claude/ into worktree .claude/ */
10
+ const SHARED_FILES = ['settings.local.json', 'version.json'];
11
+ /** Directories to create fresh (empty) in worktree .claude/ */
12
+ const FRESH_DIRS = ['state', 'plans'];
13
+ /**
14
+ * Run a git command and return trimmed stdout, or null on failure.
15
+ * Supports custom cwd and 15s timeout for worktree operations.
16
+ * Clears GIT_DIR/GIT_WORK_TREE/GIT_INDEX_FILE to avoid leaking
17
+ * parent git context (e.g., when running inside a git hook).
18
+ */
19
+ function gitCommand(cmd, cwd) {
20
+ try {
21
+ // Strip git environment variables that may leak from parent git processes
22
+ // (e.g., pre-commit hooks set GIT_DIR/GIT_INDEX_FILE which break child git ops)
23
+ const env = { ...process.env };
24
+ delete env.GIT_DIR;
25
+ delete env.GIT_WORK_TREE;
26
+ delete env.GIT_INDEX_FILE;
27
+ delete env.GIT_QUARANTINE_PATH;
28
+ const result = execSync(cmd, {
29
+ encoding: 'utf-8',
30
+ stdio: ['pipe', 'pipe', 'pipe'],
31
+ timeout: 15_000,
32
+ cwd: cwd || process.cwd(),
33
+ env,
34
+ });
35
+ return result.trim() || null;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Sanitize a string for use in branch names and directory names.
43
+ * @internal Exported for direct testability.
44
+ */
45
+ export function sanitize(input) {
46
+ let result = input
47
+ .toLowerCase()
48
+ .replace(/[^a-z0-9-]/g, '-')
49
+ .replace(/-+/g, '-')
50
+ .replace(/^-+|-+$/g, '');
51
+ result = result.slice(0, 50);
52
+ result = result.replace(/-+$/g, '');
53
+ return result || 'unnamed';
54
+ }
55
+ /**
56
+ * Derive a short ID from a task ID string.
57
+ */
58
+ function deriveShortId(taskId) {
59
+ return sanitize(taskId);
60
+ }
61
+ /**
62
+ * Create a directory junction (Windows) or symlink (Unix).
63
+ */
64
+ async function createJunction(target, linkPath) {
65
+ const type = process.platform === 'win32' ? 'junction' : 'dir';
66
+ await fs.symlink(target, linkPath, type);
67
+ }
68
+ /**
69
+ * Create a hard link for a file.
70
+ */
71
+ async function createFileLink(target, linkPath) {
72
+ await fs.link(target, linkPath);
73
+ }
74
+ /**
75
+ * Bootstrap a worktree's .claude/ directory with junctions, links, and fresh dirs.
76
+ *
77
+ * @param worktreePath - Absolute path to the new worktree root
78
+ * @param mainClaudeDir - Absolute path to the main worktree's .claude/ dir
79
+ * @param options - Task metadata for context file generation
80
+ */
81
+ export async function bootstrapWorktree(worktreePath, mainClaudeDir, options) {
82
+ // 1. Create .claude/ directory inside worktree
83
+ await fs.ensureDir(path.join(worktreePath, '.claude'));
84
+ // 2. Directory junctions - remove git-checkout copies before creating junctions
85
+ for (const dirName of SHARED_DIRS) {
86
+ const target = path.join(mainClaudeDir, dirName);
87
+ const linkPath = path.join(worktreePath, '.claude', dirName);
88
+ if (!(await fs.pathExists(target))) {
89
+ logger.warn(`Skipping junction for ${dirName}: directory not found in main .claude/`);
90
+ continue;
91
+ }
92
+ // Remove any existing directory from git checkout before creating junction
93
+ if (await fs.pathExists(linkPath)) {
94
+ await fs.remove(linkPath);
95
+ }
96
+ await createJunction(target, linkPath);
97
+ }
98
+ // 3. File hard links - remove git-checkout copies before creating hard links
99
+ for (const fileName of SHARED_FILES) {
100
+ const target = path.join(mainClaudeDir, fileName);
101
+ const linkPath = path.join(worktreePath, '.claude', fileName);
102
+ if (!(await fs.pathExists(target))) {
103
+ logger.warn(`Skipping hard link for ${fileName}: file not found in main .claude/`);
104
+ continue;
105
+ }
106
+ // Remove any existing file from git checkout before creating hard link
107
+ if (await fs.pathExists(linkPath)) {
108
+ await fs.remove(linkPath);
109
+ }
110
+ await createFileLink(target, linkPath);
111
+ }
112
+ // 4. Fresh empty directories - clear any git-checkout content
113
+ for (const dirName of FRESH_DIRS) {
114
+ const dirPath = path.join(worktreePath, '.claude', dirName);
115
+ if (await fs.pathExists(dirPath)) {
116
+ await fs.remove(dirPath);
117
+ }
118
+ await fs.ensureDir(dirPath);
119
+ }
120
+ // 5. Generate worktree_context.md
121
+ const contextContent = `# Worktree Context
122
+
123
+ **Task ID:** ${options.taskId}
124
+ **Description:** ${options.description}
125
+ **Branch:** ${options.branchName}
126
+ **Created:** ${new Date().toISOString()}
127
+ **Main worktree:** ${path.dirname(mainClaudeDir)}
128
+
129
+ ## Notes
130
+ This is a linked worktree. Shared directories (agents/, scripts/) are junctions/symlinks
131
+ to the main worktree. Do not delete them directly.
132
+ State (state/, plans/) is local to this worktree.
133
+ `;
134
+ await fs.writeFile(path.join(worktreePath, '.claude', 'worktree_context.md'), contextContent);
135
+ }
136
+ /**
137
+ * Create a new git worktree for a task, with bootstrapped .claude/ directory.
138
+ *
139
+ * @param taskId - The task identifier (e.g., 'WORKTREE-001')
140
+ * @param description - Human-readable description (e.g., 'core worktree utilities')
141
+ * @returns WorktreeInfo for the created worktree
142
+ */
143
+ export async function createWorktree(taskId, description) {
144
+ // 1. Resolve repo root
145
+ const rawRoot = gitCommand('git rev-parse --show-toplevel', process.cwd());
146
+ if (!rawRoot) {
147
+ throw new Error('Not inside a git repository');
148
+ }
149
+ const repoRoot = path.resolve(rawRoot);
150
+ // 2. Compute shortId
151
+ const shortId = deriveShortId(taskId);
152
+ // 3. Compute worktree path
153
+ const worktreePath = path.join(repoRoot, '.claude', 'worktrees', shortId);
154
+ // 4. Compute branch name
155
+ const sanitizedDesc = sanitize(description);
156
+ const branchName = sanitizedDesc ? `agent/${shortId}-${sanitizedDesc}` : `agent/${shortId}`;
157
+ // 5. Handle existing directory
158
+ if (await fs.pathExists(worktreePath)) {
159
+ // If it's a real worktree (has .git file), refuse
160
+ if (await fs.pathExists(path.join(worktreePath, '.git'))) {
161
+ throw new Error(`Worktree already exists for task: ${taskId} at ${worktreePath}`);
162
+ }
163
+ // Otherwise it's a stale empty directory (common on Windows when OS holds a handle).
164
+ // Try to remove it; if that fails, let git worktree add populate it — git handles
165
+ // existing empty directories gracefully.
166
+ try {
167
+ await fs.remove(worktreePath);
168
+ }
169
+ catch {
170
+ logger.warn(`Stale directory ${worktreePath} could not be removed (likely locked by OS). Attempting git worktree add into it.`);
171
+ }
172
+ }
173
+ // 6. Error: branch exists
174
+ const branchCheck = gitCommand(`git rev-parse --verify refs/heads/${branchName}`, repoRoot);
175
+ if (branchCheck !== null) {
176
+ throw new Error(`Branch already exists: ${branchName}`);
177
+ }
178
+ // 7. Ensure parent directory
179
+ await fs.ensureDir(path.join(repoRoot, '.claude', 'worktrees'));
180
+ // 8. Run git worktree add
181
+ const addResult = gitCommand(`git worktree add "${worktreePath}" -b ${branchName}`, repoRoot);
182
+ if (addResult === null) {
183
+ // git worktree add outputs to stderr on success, so check if worktree was actually created
184
+ if (!(await fs.pathExists(worktreePath))) {
185
+ throw new Error('Failed to create worktree: git worktree add returned error');
186
+ }
187
+ }
188
+ // 9-10. Bootstrap
189
+ const mainClaudeDir = path.join(repoRoot, '.claude');
190
+ await bootstrapWorktree(worktreePath, mainClaudeDir, { taskId, description, branchName });
191
+ // 11. Return WorktreeInfo
192
+ return {
193
+ path: worktreePath,
194
+ head: gitCommand('git rev-parse HEAD', worktreePath) || 'unknown',
195
+ branch: branchName,
196
+ isMain: false,
197
+ taskId: shortId,
198
+ locked: false,
199
+ stale: false,
200
+ };
201
+ }
202
+ /**
203
+ * Remove a worktree, cleaning up junctions/links BEFORE calling git worktree remove.
204
+ *
205
+ * @param worktreePath - Absolute path to the worktree to remove
206
+ * @param force - Whether to pass --force to git worktree remove
207
+ */
208
+ export async function removeWorktree(worktreePath, force = false) {
209
+ // 1. Validate
210
+ if (!(await fs.pathExists(worktreePath))) {
211
+ throw new Error(`Worktree path does not exist: ${worktreePath}`);
212
+ }
213
+ // 2. Remove directory junctions/symlinks
214
+ for (const dirName of SHARED_DIRS) {
215
+ const linkPath = path.join(worktreePath, '.claude', dirName);
216
+ try {
217
+ if (await fs.pathExists(linkPath)) {
218
+ await fs.remove(linkPath);
219
+ }
220
+ }
221
+ catch (error) {
222
+ const msg = error instanceof Error ? error.message : String(error);
223
+ logger.warn(`Failed to remove junction ${linkPath}: ${msg}`);
224
+ }
225
+ }
226
+ // 3. Remove file hard links
227
+ for (const fileName of SHARED_FILES) {
228
+ const linkPath = path.join(worktreePath, '.claude', fileName);
229
+ try {
230
+ if (await fs.pathExists(linkPath)) {
231
+ await fs.remove(linkPath);
232
+ }
233
+ }
234
+ catch (error) {
235
+ const msg = error instanceof Error ? error.message : String(error);
236
+ logger.warn(`Failed to remove hard link ${linkPath}: ${msg}`);
237
+ }
238
+ }
239
+ // 4. Remove generated context file
240
+ try {
241
+ await fs.remove(path.join(worktreePath, '.claude', 'worktree_context.md'));
242
+ }
243
+ catch {
244
+ // ignore
245
+ }
246
+ // 5. Remove fresh directories
247
+ for (const dirName of FRESH_DIRS) {
248
+ try {
249
+ await fs.remove(path.join(worktreePath, '.claude', dirName));
250
+ }
251
+ catch {
252
+ // ignore
253
+ }
254
+ }
255
+ // 6. Remove .claude directory itself
256
+ try {
257
+ await fs.remove(path.join(worktreePath, '.claude'));
258
+ }
259
+ catch {
260
+ // ignore
261
+ }
262
+ // 7. Run git worktree remove
263
+ // Our cleanup modifies tracked content, so try force if non-force fails
264
+ try {
265
+ const forceFlag = force ? ' --force' : '';
266
+ const cmd = `git worktree remove${forceFlag} "${worktreePath}"`;
267
+ gitCommand(cmd, process.cwd());
268
+ // If non-force failed (worktree still exists), retry with --force
269
+ // since our cleanup steps always make the worktree dirty
270
+ if (!force && await fs.pathExists(worktreePath)) {
271
+ const forceCmd = `git worktree remove --force "${worktreePath}"`;
272
+ gitCommand(forceCmd, process.cwd());
273
+ }
274
+ // If still exists, zombie processes may hold file handles (common on Windows
275
+ // after crashed maestro sessions). Kill them and retry.
276
+ if (await fs.pathExists(worktreePath)) {
277
+ try {
278
+ const procs = findByCwd(worktreePath);
279
+ for (const proc of procs) {
280
+ killSingle(proc.pid);
281
+ }
282
+ }
283
+ catch {
284
+ // Non-fatal -- same as current behavior
285
+ }
286
+ // Brief pause to let OS release handles after process death
287
+ await new Promise(r => setTimeout(r, 500));
288
+ gitCommand(`git worktree remove --force "${worktreePath}"`, process.cwd());
289
+ // If git worktree remove still fails, try direct fs removal
290
+ if (await fs.pathExists(worktreePath)) {
291
+ try {
292
+ await fs.remove(worktreePath);
293
+ }
294
+ catch {
295
+ // will be caught by final check below
296
+ }
297
+ }
298
+ }
299
+ // Final check
300
+ if (await fs.pathExists(worktreePath)) {
301
+ throw new Error(`Failed to remove worktree (processes may still hold handles): ${worktreePath}`);
302
+ }
303
+ }
304
+ finally {
305
+ // Guard against git worktree remove --force corrupting core.bare
306
+ // Must target the main repo, not the worktree being removed
307
+ const mainRepoRoot = gitCommand('git rev-parse --show-toplevel', path.resolve(worktreePath, '..'));
308
+ if (mainRepoRoot) {
309
+ gitCommand('git config core.bare false', mainRepoRoot);
310
+ }
311
+ }
312
+ }
313
+ /**
314
+ * List all git worktrees in the current repository.
315
+ *
316
+ * @returns Array of WorktreeInfo objects
317
+ */
318
+ export async function listWorktrees() {
319
+ const output = gitCommand('git worktree list --porcelain', process.cwd());
320
+ if (!output) {
321
+ return [];
322
+ }
323
+ const worktrees = [];
324
+ const blocks = output.split('\n\n').filter(Boolean);
325
+ for (let i = 0; i < blocks.length; i++) {
326
+ const block = blocks[i];
327
+ const lines = block.split('\n');
328
+ let wtPath = '';
329
+ let head = '';
330
+ let branch = null;
331
+ let locked = false;
332
+ let prunable = false;
333
+ for (const line of lines) {
334
+ if (line.startsWith('worktree ')) {
335
+ wtPath = line.substring('worktree '.length);
336
+ }
337
+ else if (line.startsWith('HEAD ')) {
338
+ head = line.substring('HEAD '.length);
339
+ }
340
+ else if (line.startsWith('branch ')) {
341
+ const ref = line.substring('branch '.length);
342
+ // Strip refs/heads/ prefix
343
+ branch = ref.startsWith('refs/heads/') ? ref.substring('refs/heads/'.length) : ref;
344
+ }
345
+ else if (line === 'detached') {
346
+ branch = null;
347
+ }
348
+ else if (line === 'locked' || line.startsWith('locked ')) {
349
+ locked = true;
350
+ }
351
+ else if (line === 'prunable' || line.startsWith('prunable ')) {
352
+ prunable = true;
353
+ }
354
+ }
355
+ if (!wtPath)
356
+ continue;
357
+ const isMain = i === 0;
358
+ // Extract taskId from directory basename for worktrees under .claude/worktrees/
359
+ let taskId = null;
360
+ if (!isMain) {
361
+ const normalizedPath = wtPath.replace(/\\/g, '/');
362
+ if (normalizedPath.includes('.claude/worktrees/')) {
363
+ taskId = path.basename(wtPath);
364
+ }
365
+ }
366
+ // Determine stale status
367
+ let stale = prunable;
368
+ if (!isMain && !stale) {
369
+ stale = !(await fs.pathExists(wtPath));
370
+ }
371
+ worktrees.push({
372
+ path: wtPath,
373
+ head,
374
+ branch,
375
+ isMain,
376
+ taskId,
377
+ locked,
378
+ stale,
379
+ });
380
+ }
381
+ return worktrees;
382
+ }
383
+ /**
384
+ * Check if the current directory is inside a linked git worktree.
385
+ * Re-export of isWorktree from detect-git.ts for convenience.
386
+ */
387
+ export const isInsideWorktree = isWorktree;
388
+ /**
389
+ * Get the main worktree (repo root) path from inside a linked worktree.
390
+ * Returns null if .git is a directory (main worktree), missing, or has unexpected format.
391
+ */
392
+ export async function getMainWorktreePath() {
393
+ try {
394
+ const stat = await fs.stat('.git');
395
+ if (!stat.isFile()) {
396
+ return null; // .git is a directory -- this IS the main worktree
397
+ }
398
+ const content = await fs.readFile('.git', 'utf-8');
399
+ const match = content.trim().match(/^gitdir:\s+(.+)$/);
400
+ if (!match) {
401
+ return null; // Unexpected format
402
+ }
403
+ const gitdir = path.resolve(match[1]);
404
+ // gitdir = /path/to/main/.git/worktrees/<name>
405
+ const dotGitDir = path.dirname(path.dirname(gitdir)); // .git dir
406
+ const repoRoot = path.dirname(dotGitDir); // repo root
407
+ if (path.basename(dotGitDir) !== '.git') {
408
+ logger.warn('Unexpected gitdir format: ' + gitdir);
409
+ return null;
410
+ }
411
+ return repoRoot;
412
+ }
413
+ catch {
414
+ return null;
415
+ }
416
+ }
417
+ /**
418
+ * Prune stale worktree entries from git's tracking.
419
+ *
420
+ * @returns Array of pruned entry descriptions from git output
421
+ */
422
+ export async function pruneWorktrees() {
423
+ const output = gitCommand('git worktree prune --verbose', process.cwd());
424
+ if (!output) {
425
+ return [];
426
+ }
427
+ // Parse verbose output lines like "Removing worktrees/abc123: gitdir file points to non-existing location"
428
+ const pruned = [];
429
+ const lines = output.split('\n');
430
+ for (const line of lines) {
431
+ if (line.startsWith('Removing ')) {
432
+ pruned.push(line);
433
+ }
434
+ }
435
+ return pruned;
436
+ }
437
+ /**
438
+ * Detect worktrees whose paths no longer exist on disk.
439
+ *
440
+ * @returns Array of stale WorktreeInfo objects
441
+ */
442
+ export async function detectStaleWorktrees() {
443
+ const worktrees = await listWorktrees();
444
+ return worktrees.filter(wt => wt.stale);
445
+ }
446
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@bhimudev/gnanai",
3
+ "version": "0.4.0",
4
+ "description": "Multi-agent AI development workflow setup for any project",
5
+ "keywords": [
6
+ "claude",
7
+ "ai",
8
+ "agents",
9
+ "development",
10
+ "workflow",
11
+ "automation",
12
+ "claude-code"
13
+ ],
14
+ "author": "",
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": ""
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "type": "module",
24
+ "bin": {
25
+ "gnanai": "dist/bin/cli.js",
26
+ "archai": "dist/bin/cli.js"
27
+ },
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "files": [
31
+ "dist",
32
+ "templates"
33
+ ],
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "dev": "tsc --watch",
37
+ "start": "node dist/bin/cli.js",
38
+ "test": "vitest run",
39
+ "test:run": "vitest run",
40
+ "test:unit": "vitest run tests/unit tests/integration",
41
+ "test:scenarios": "vitest run tests/scenarios",
42
+ "test:watch": "vitest --watch",
43
+ "test:coverage": "vitest run --coverage",
44
+ "test:ui": "vitest --ui",
45
+ "lint": "eslint src --ext .ts",
46
+ "prepare": "git config core.hooksPath .githooks",
47
+ "prepublishOnly": "npm run build"
48
+ },
49
+ "dependencies": {
50
+ "@huggingface/transformers": "^3.8.1",
51
+ "@modelcontextprotocol/sdk": "^1.0.0",
52
+ "better-sqlite3": "^12.6.2",
53
+ "chalk": "^5.3.0",
54
+ "commander": "^12.1.0",
55
+ "fs-extra": "^11.2.0",
56
+ "inquirer": "^9.2.15",
57
+ "minisearch": "^7.2.0",
58
+ "ora": "^8.0.1",
59
+ "yaml": "^2.4.1"
60
+ },
61
+ "devDependencies": {
62
+ "@types/better-sqlite3": "^7.6.13",
63
+ "@types/fs-extra": "^11.0.4",
64
+ "@types/inquirer": "^9.0.9",
65
+ "@types/node": "^20.11.0",
66
+ "@typescript-eslint/eslint-plugin": "^6.19.0",
67
+ "@typescript-eslint/parser": "^6.19.0",
68
+ "@vitest/coverage-v8": "^1.2.0",
69
+ "@vitest/ui": "^1.2.0",
70
+ "eslint": "^8.56.0",
71
+ "typescript": "^5.3.3",
72
+ "vitest": "^1.2.0"
73
+ },
74
+ "engines": {
75
+ "node": ">=18.0.0"
76
+ }
77
+ }