@ai-coders/context 0.4.0 → 0.5.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 (403) hide show
  1. package/README.md +260 -22
  2. package/dist/fragments/compose.d.ts +30 -0
  3. package/dist/fragments/compose.d.ts.map +1 -0
  4. package/dist/fragments/compose.js +274 -0
  5. package/dist/fragments/compose.js.map +1 -0
  6. package/dist/fragments/extractors/index.d.ts +26 -0
  7. package/dist/fragments/extractors/index.d.ts.map +1 -0
  8. package/dist/fragments/extractors/index.js +58 -0
  9. package/dist/fragments/extractors/index.js.map +1 -0
  10. package/dist/fragments/extractors/module.d.ts +12 -0
  11. package/dist/fragments/extractors/module.d.ts.map +1 -0
  12. package/dist/fragments/extractors/module.js +302 -0
  13. package/dist/fragments/extractors/module.js.map +1 -0
  14. package/dist/fragments/extractors/project.d.ts +12 -0
  15. package/dist/fragments/extractors/project.d.ts.map +1 -0
  16. package/dist/fragments/extractors/project.js +274 -0
  17. package/dist/fragments/extractors/project.js.map +1 -0
  18. package/dist/fragments/extractors/semantic.d.ts +12 -0
  19. package/dist/fragments/extractors/semantic.d.ts.map +1 -0
  20. package/dist/fragments/extractors/semantic.js +329 -0
  21. package/dist/fragments/extractors/semantic.js.map +1 -0
  22. package/dist/fragments/index.d.ts +47 -0
  23. package/dist/fragments/index.d.ts.map +1 -0
  24. package/dist/fragments/index.js +75 -0
  25. package/dist/fragments/index.js.map +1 -0
  26. package/dist/fragments/query.d.ts +101 -0
  27. package/dist/fragments/query.d.ts.map +1 -0
  28. package/dist/fragments/query.js +200 -0
  29. package/dist/fragments/query.js.map +1 -0
  30. package/dist/fragments/render/compact.d.ts +15 -0
  31. package/dist/fragments/render/compact.d.ts.map +1 -0
  32. package/dist/fragments/render/compact.js +209 -0
  33. package/dist/fragments/render/compact.js.map +1 -0
  34. package/dist/fragments/render/index.d.ts +17 -0
  35. package/dist/fragments/render/index.d.ts.map +1 -0
  36. package/dist/fragments/render/index.js +40 -0
  37. package/dist/fragments/render/index.js.map +1 -0
  38. package/dist/fragments/render/json.d.ts +9 -0
  39. package/dist/fragments/render/json.d.ts.map +1 -0
  40. package/dist/fragments/render/json.js +44 -0
  41. package/dist/fragments/render/json.js.map +1 -0
  42. package/dist/fragments/render/markdown.d.ts +9 -0
  43. package/dist/fragments/render/markdown.d.ts.map +1 -0
  44. package/dist/fragments/render/markdown.js +291 -0
  45. package/dist/fragments/render/markdown.js.map +1 -0
  46. package/dist/fragments/store.d.ts +49 -0
  47. package/dist/fragments/store.d.ts.map +1 -0
  48. package/dist/fragments/store.js +161 -0
  49. package/dist/fragments/store.js.map +1 -0
  50. package/dist/fragments/types.d.ts +241 -0
  51. package/dist/fragments/types.d.ts.map +1 -0
  52. package/dist/fragments/types.js +8 -0
  53. package/dist/fragments/types.js.map +1 -0
  54. package/dist/generators/agents/agentGenerator.d.ts +8 -1
  55. package/dist/generators/agents/agentGenerator.d.ts.map +1 -1
  56. package/dist/generators/agents/agentGenerator.js +108 -10
  57. package/dist/generators/agents/agentGenerator.js.map +1 -1
  58. package/dist/generators/agents/templates/playbookTemplate.d.ts +3 -2
  59. package/dist/generators/agents/templates/playbookTemplate.d.ts.map +1 -1
  60. package/dist/generators/agents/templates/playbookTemplate.js +143 -45
  61. package/dist/generators/agents/templates/playbookTemplate.js.map +1 -1
  62. package/dist/generators/agents/templates/types.d.ts +9 -1
  63. package/dist/generators/agents/templates/types.d.ts.map +1 -1
  64. package/dist/generators/documentation/documentationGenerator.d.ts +2 -0
  65. package/dist/generators/documentation/documentationGenerator.d.ts.map +1 -1
  66. package/dist/generators/documentation/documentationGenerator.js +18 -3
  67. package/dist/generators/documentation/documentationGenerator.js.map +1 -1
  68. package/dist/generators/documentation/guideRegistry.d.ts.map +1 -1
  69. package/dist/generators/documentation/guideRegistry.js +0 -8
  70. package/dist/generators/documentation/guideRegistry.js.map +1 -1
  71. package/dist/generators/documentation/templates/apiReferenceTemplate.d.ts.map +1 -1
  72. package/dist/generators/documentation/templates/apiReferenceTemplate.js +1 -22
  73. package/dist/generators/documentation/templates/apiReferenceTemplate.js.map +1 -1
  74. package/dist/generators/documentation/templates/architectureTemplate.d.ts.map +1 -1
  75. package/dist/generators/documentation/templates/architectureTemplate.js +160 -26
  76. package/dist/generators/documentation/templates/architectureTemplate.js.map +1 -1
  77. package/dist/generators/documentation/templates/common.d.ts +28 -1
  78. package/dist/generators/documentation/templates/common.d.ts.map +1 -1
  79. package/dist/generators/documentation/templates/common.js +130 -10
  80. package/dist/generators/documentation/templates/common.js.map +1 -1
  81. package/dist/generators/documentation/templates/dataFlowTemplate.d.ts.map +1 -1
  82. package/dist/generators/documentation/templates/dataFlowTemplate.js +98 -18
  83. package/dist/generators/documentation/templates/dataFlowTemplate.js.map +1 -1
  84. package/dist/generators/documentation/templates/developmentWorkflowTemplate.d.ts.map +1 -1
  85. package/dist/generators/documentation/templates/developmentWorkflowTemplate.js +1 -18
  86. package/dist/generators/documentation/templates/developmentWorkflowTemplate.js.map +1 -1
  87. package/dist/generators/documentation/templates/glossaryTemplate.d.ts +1 -1
  88. package/dist/generators/documentation/templates/glossaryTemplate.d.ts.map +1 -1
  89. package/dist/generators/documentation/templates/glossaryTemplate.js +51 -23
  90. package/dist/generators/documentation/templates/glossaryTemplate.js.map +1 -1
  91. package/dist/generators/documentation/templates/indexTemplate.d.ts.map +1 -1
  92. package/dist/generators/documentation/templates/indexTemplate.js +1 -18
  93. package/dist/generators/documentation/templates/indexTemplate.js.map +1 -1
  94. package/dist/generators/documentation/templates/migrationTemplate.d.ts.map +1 -1
  95. package/dist/generators/documentation/templates/migrationTemplate.js +1 -23
  96. package/dist/generators/documentation/templates/migrationTemplate.js.map +1 -1
  97. package/dist/generators/documentation/templates/onboardingTemplate.d.ts.map +1 -1
  98. package/dist/generators/documentation/templates/onboardingTemplate.js +1 -23
  99. package/dist/generators/documentation/templates/onboardingTemplate.js.map +1 -1
  100. package/dist/generators/documentation/templates/projectOverviewTemplate.d.ts.map +1 -1
  101. package/dist/generators/documentation/templates/projectOverviewTemplate.js +81 -19
  102. package/dist/generators/documentation/templates/projectOverviewTemplate.js.map +1 -1
  103. package/dist/generators/documentation/templates/securityTemplate.d.ts.map +1 -1
  104. package/dist/generators/documentation/templates/securityTemplate.js +1 -18
  105. package/dist/generators/documentation/templates/securityTemplate.js.map +1 -1
  106. package/dist/generators/documentation/templates/testingTemplate.d.ts.map +1 -1
  107. package/dist/generators/documentation/templates/testingTemplate.js +1 -19
  108. package/dist/generators/documentation/templates/testingTemplate.js.map +1 -1
  109. package/dist/generators/documentation/templates/toolingTemplate.d.ts.map +1 -1
  110. package/dist/generators/documentation/templates/toolingTemplate.js +2 -19
  111. package/dist/generators/documentation/templates/toolingTemplate.js.map +1 -1
  112. package/dist/generators/documentation/templates/troubleshootingTemplate.d.ts.map +1 -1
  113. package/dist/generators/documentation/templates/troubleshootingTemplate.js +1 -23
  114. package/dist/generators/documentation/templates/troubleshootingTemplate.js.map +1 -1
  115. package/dist/generators/documentation/templates/types.d.ts +2 -1
  116. package/dist/generators/documentation/templates/types.d.ts.map +1 -1
  117. package/dist/generators/plans/planGenerator.d.ts +4 -0
  118. package/dist/generators/plans/planGenerator.d.ts.map +1 -1
  119. package/dist/generators/plans/planGenerator.js +30 -2
  120. package/dist/generators/plans/planGenerator.js.map +1 -1
  121. package/dist/generators/plans/templates/indexTemplate.d.ts.map +1 -1
  122. package/dist/generators/plans/templates/indexTemplate.js +3 -12
  123. package/dist/generators/plans/templates/indexTemplate.js.map +1 -1
  124. package/dist/generators/plans/templates/planTemplate.d.ts.map +1 -1
  125. package/dist/generators/plans/templates/planTemplate.js +54 -32
  126. package/dist/generators/plans/templates/planTemplate.js.map +1 -1
  127. package/dist/generators/plans/templates/types.d.ts +10 -0
  128. package/dist/generators/plans/templates/types.d.ts.map +1 -1
  129. package/dist/generators/shared/generatorUtils.d.ts.map +1 -1
  130. package/dist/generators/shared/generatorUtils.js +6 -9
  131. package/dist/generators/shared/generatorUtils.js.map +1 -1
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +430 -90
  134. package/dist/index.js.map +1 -1
  135. package/dist/prompts/defaults.d.ts +2 -2
  136. package/dist/prompts/defaults.d.ts.map +1 -1
  137. package/dist/prompts/defaults.js +26 -56
  138. package/dist/prompts/defaults.js.map +1 -1
  139. package/dist/services/ai/agentEvents.d.ts +45 -0
  140. package/dist/services/ai/agentEvents.d.ts.map +1 -0
  141. package/dist/services/ai/agentEvents.js +61 -0
  142. package/dist/services/ai/agentEvents.js.map +1 -0
  143. package/dist/services/ai/agents/documentationAgent.d.ts +53 -0
  144. package/dist/services/ai/agents/documentationAgent.d.ts.map +1 -0
  145. package/dist/services/ai/agents/documentationAgent.js +243 -0
  146. package/dist/services/ai/agents/documentationAgent.js.map +1 -0
  147. package/dist/services/ai/agents/index.d.ts +7 -0
  148. package/dist/services/ai/agents/index.d.ts.map +1 -0
  149. package/dist/services/ai/agents/index.js +10 -0
  150. package/dist/services/ai/agents/index.js.map +1 -0
  151. package/dist/services/ai/agents/planAgent.d.ts +68 -0
  152. package/dist/services/ai/agents/planAgent.d.ts.map +1 -0
  153. package/dist/services/ai/agents/planAgent.js +389 -0
  154. package/dist/services/ai/agents/planAgent.js.map +1 -0
  155. package/dist/services/ai/agents/playbookAgent.d.ts +54 -0
  156. package/dist/services/ai/agents/playbookAgent.d.ts.map +1 -0
  157. package/dist/services/ai/agents/playbookAgent.js +265 -0
  158. package/dist/services/ai/agents/playbookAgent.js.map +1 -0
  159. package/dist/services/ai/aiSdkClient.d.ts +67 -0
  160. package/dist/services/ai/aiSdkClient.d.ts.map +1 -0
  161. package/dist/services/ai/aiSdkClient.js +143 -0
  162. package/dist/services/ai/aiSdkClient.js.map +1 -0
  163. package/dist/services/ai/index.d.ts +7 -0
  164. package/dist/services/ai/index.d.ts.map +1 -0
  165. package/dist/services/ai/index.js +49 -0
  166. package/dist/services/ai/index.js.map +1 -0
  167. package/dist/services/ai/providerFactory.d.ts +35 -0
  168. package/dist/services/ai/providerFactory.d.ts.map +1 -0
  169. package/dist/services/ai/providerFactory.js +107 -0
  170. package/dist/services/ai/providerFactory.js.map +1 -0
  171. package/dist/services/ai/schemas.d.ts +331 -0
  172. package/dist/services/ai/schemas.d.ts.map +1 -0
  173. package/dist/services/ai/schemas.js +236 -0
  174. package/dist/services/ai/schemas.js.map +1 -0
  175. package/dist/services/ai/tools/analyzeSymbolsTool.d.ts +33 -0
  176. package/dist/services/ai/tools/analyzeSymbolsTool.d.ts.map +1 -0
  177. package/dist/services/ai/tools/analyzeSymbolsTool.js +57 -0
  178. package/dist/services/ai/tools/analyzeSymbolsTool.js.map +1 -0
  179. package/dist/services/ai/tools/checkScaffoldingTool.d.ts +18 -0
  180. package/dist/services/ai/tools/checkScaffoldingTool.d.ts.map +1 -0
  181. package/dist/services/ai/tools/checkScaffoldingTool.js +86 -0
  182. package/dist/services/ai/tools/checkScaffoldingTool.js.map +1 -0
  183. package/dist/services/ai/tools/fillScaffoldingTool.d.ts +38 -0
  184. package/dist/services/ai/tools/fillScaffoldingTool.d.ts.map +1 -0
  185. package/dist/services/ai/tools/fillScaffoldingTool.js +259 -0
  186. package/dist/services/ai/tools/fillScaffoldingTool.js.map +1 -0
  187. package/dist/services/ai/tools/getFileStructureTool.d.ts +29 -0
  188. package/dist/services/ai/tools/getFileStructureTool.d.ts.map +1 -0
  189. package/dist/services/ai/tools/getFileStructureTool.js +48 -0
  190. package/dist/services/ai/tools/getFileStructureTool.js.map +1 -0
  191. package/dist/services/ai/tools/index.d.ts +20 -0
  192. package/dist/services/ai/tools/index.d.ts.map +1 -0
  193. package/dist/services/ai/tools/index.js +62 -0
  194. package/dist/services/ai/tools/index.js.map +1 -0
  195. package/dist/services/ai/tools/initializeContextTool.d.ts +25 -0
  196. package/dist/services/ai/tools/initializeContextTool.d.ts.map +1 -0
  197. package/dist/services/ai/tools/initializeContextTool.js +121 -0
  198. package/dist/services/ai/tools/initializeContextTool.js.map +1 -0
  199. package/dist/services/ai/tools/listFilesTool.d.ts +18 -0
  200. package/dist/services/ai/tools/listFilesTool.d.ts.map +1 -0
  201. package/dist/services/ai/tools/listFilesTool.js +34 -0
  202. package/dist/services/ai/tools/listFilesTool.js.map +1 -0
  203. package/dist/services/ai/tools/readFileTool.d.ts +17 -0
  204. package/dist/services/ai/tools/readFileTool.d.ts.map +1 -0
  205. package/dist/services/ai/tools/readFileTool.js +63 -0
  206. package/dist/services/ai/tools/readFileTool.js.map +1 -0
  207. package/dist/services/ai/tools/scaffoldPlanTool.d.ts +19 -0
  208. package/dist/services/ai/tools/scaffoldPlanTool.d.ts.map +1 -0
  209. package/dist/services/ai/tools/scaffoldPlanTool.js +81 -0
  210. package/dist/services/ai/tools/scaffoldPlanTool.js.map +1 -0
  211. package/dist/services/ai/tools/searchCodeTool.d.ts +25 -0
  212. package/dist/services/ai/tools/searchCodeTool.d.ts.map +1 -0
  213. package/dist/services/ai/tools/searchCodeTool.js +96 -0
  214. package/dist/services/ai/tools/searchCodeTool.js.map +1 -0
  215. package/dist/services/fill/fillService.d.ts +11 -1
  216. package/dist/services/fill/fillService.d.ts.map +1 -1
  217. package/dist/services/fill/fillService.js +151 -39
  218. package/dist/services/fill/fillService.js.map +1 -1
  219. package/dist/services/init/initService.d.ts +1 -0
  220. package/dist/services/init/initService.d.ts.map +1 -1
  221. package/dist/services/init/initService.js +12 -7
  222. package/dist/services/init/initService.js.map +1 -1
  223. package/dist/services/llmClientFactory.d.ts +36 -2
  224. package/dist/services/llmClientFactory.d.ts.map +1 -1
  225. package/dist/services/llmClientFactory.js +57 -11
  226. package/dist/services/llmClientFactory.js.map +1 -1
  227. package/dist/services/mcp/index.d.ts +2 -0
  228. package/dist/services/mcp/index.d.ts.map +1 -0
  229. package/dist/services/mcp/index.js +7 -0
  230. package/dist/services/mcp/index.js.map +1 -0
  231. package/dist/services/mcp/mcpServer.d.ts +45 -0
  232. package/dist/services/mcp/mcpServer.d.ts.map +1 -0
  233. package/dist/services/mcp/mcpServer.js +371 -0
  234. package/dist/services/mcp/mcpServer.js.map +1 -0
  235. package/dist/services/openRouterClient.js +1 -1
  236. package/dist/services/openRouterClient.js.map +1 -1
  237. package/dist/services/passthrough/commandRouter.d.ts +53 -0
  238. package/dist/services/passthrough/commandRouter.d.ts.map +1 -0
  239. package/dist/services/passthrough/commandRouter.js +349 -0
  240. package/dist/services/passthrough/commandRouter.js.map +1 -0
  241. package/dist/services/passthrough/index.d.ts +7 -0
  242. package/dist/services/passthrough/index.d.ts.map +1 -0
  243. package/dist/services/passthrough/index.js +23 -0
  244. package/dist/services/passthrough/index.js.map +1 -0
  245. package/dist/services/passthrough/protocol.d.ts +269 -0
  246. package/dist/services/passthrough/protocol.d.ts.map +1 -0
  247. package/dist/services/passthrough/protocol.js +151 -0
  248. package/dist/services/passthrough/protocol.js.map +1 -0
  249. package/dist/services/passthrough/stdinReader.d.ts +42 -0
  250. package/dist/services/passthrough/stdinReader.d.ts.map +1 -0
  251. package/dist/services/passthrough/stdinReader.js +111 -0
  252. package/dist/services/passthrough/stdinReader.js.map +1 -0
  253. package/dist/services/plan/planService.d.ts +3 -1
  254. package/dist/services/plan/planService.d.ts.map +1 -1
  255. package/dist/services/plan/planService.js +49 -41
  256. package/dist/services/plan/planService.js.map +1 -1
  257. package/dist/services/semantic/codebaseAnalyzer.d.ts +40 -0
  258. package/dist/services/semantic/codebaseAnalyzer.d.ts.map +1 -0
  259. package/dist/services/semantic/codebaseAnalyzer.js +540 -0
  260. package/dist/services/semantic/codebaseAnalyzer.js.map +1 -0
  261. package/dist/services/semantic/contextBuilder.d.ts +79 -0
  262. package/dist/services/semantic/contextBuilder.d.ts.map +1 -0
  263. package/dist/services/semantic/contextBuilder.js +538 -0
  264. package/dist/services/semantic/contextBuilder.js.map +1 -0
  265. package/dist/services/semantic/index.d.ts +12 -0
  266. package/dist/services/semantic/index.d.ts.map +1 -0
  267. package/dist/services/semantic/index.js +33 -0
  268. package/dist/services/semantic/index.js.map +1 -0
  269. package/dist/services/semantic/lsp/index.d.ts +2 -0
  270. package/dist/services/semantic/lsp/index.d.ts.map +1 -0
  271. package/dist/services/semantic/lsp/index.js +6 -0
  272. package/dist/services/semantic/lsp/index.js.map +1 -0
  273. package/dist/services/semantic/lsp/lspLayer.d.ts +32 -0
  274. package/dist/services/semantic/lsp/lspLayer.d.ts.map +1 -0
  275. package/dist/services/semantic/lsp/lspLayer.js +378 -0
  276. package/dist/services/semantic/lsp/lspLayer.js.map +1 -0
  277. package/dist/services/semantic/treeSitter/index.d.ts +2 -0
  278. package/dist/services/semantic/treeSitter/index.d.ts.map +1 -0
  279. package/dist/services/semantic/treeSitter/index.js +6 -0
  280. package/dist/services/semantic/treeSitter/index.js.map +1 -0
  281. package/dist/services/semantic/treeSitter/treeSitterLayer.d.ts +37 -0
  282. package/dist/services/semantic/treeSitter/treeSitterLayer.d.ts.map +1 -0
  283. package/dist/services/semantic/treeSitter/treeSitterLayer.js +518 -0
  284. package/dist/services/semantic/treeSitter/treeSitterLayer.js.map +1 -0
  285. package/dist/services/semantic/types.d.ts +122 -0
  286. package/dist/services/semantic/types.d.ts.map +1 -0
  287. package/dist/services/semantic/types.js +31 -0
  288. package/dist/services/semantic/types.js.map +1 -0
  289. package/dist/services/serve/index.d.ts +2 -0
  290. package/dist/services/serve/index.d.ts.map +1 -0
  291. package/dist/services/serve/index.js +6 -0
  292. package/dist/services/serve/index.js.map +1 -0
  293. package/dist/services/serve/serveService.d.ts +38 -0
  294. package/dist/services/serve/serveService.d.ts.map +1 -0
  295. package/dist/services/serve/serveService.js +99 -0
  296. package/dist/services/serve/serveService.js.map +1 -0
  297. package/dist/services/shared/llmConfig.d.ts +19 -3
  298. package/dist/services/shared/llmConfig.d.ts.map +1 -1
  299. package/dist/services/shared/llmConfig.js +39 -10
  300. package/dist/services/shared/llmConfig.js.map +1 -1
  301. package/dist/services/sync/index.d.ts +6 -0
  302. package/dist/services/sync/index.d.ts.map +1 -0
  303. package/dist/services/sync/index.js +16 -0
  304. package/dist/services/sync/index.js.map +1 -0
  305. package/dist/services/sync/markdownReferenceHandler.d.ts +3 -0
  306. package/dist/services/sync/markdownReferenceHandler.d.ts.map +1 -0
  307. package/dist/services/sync/markdownReferenceHandler.js +133 -0
  308. package/dist/services/sync/markdownReferenceHandler.js.map +1 -0
  309. package/dist/services/sync/presets.d.ts +6 -0
  310. package/dist/services/sync/presets.d.ts.map +1 -0
  311. package/dist/services/sync/presets.js +49 -0
  312. package/dist/services/sync/presets.js.map +1 -0
  313. package/dist/services/sync/symlinkHandler.d.ts +7 -0
  314. package/dist/services/sync/symlinkHandler.d.ts.map +1 -0
  315. package/dist/services/sync/symlinkHandler.js +129 -0
  316. package/dist/services/sync/symlinkHandler.js.map +1 -0
  317. package/dist/services/sync/syncService.d.ts +15 -0
  318. package/dist/services/sync/syncService.d.ts.map +1 -0
  319. package/dist/services/sync/syncService.js +222 -0
  320. package/dist/services/sync/syncService.js.map +1 -0
  321. package/dist/services/sync/types.d.ts +62 -0
  322. package/dist/services/sync/types.d.ts.map +1 -0
  323. package/dist/services/sync/types.js +3 -0
  324. package/dist/services/sync/types.js.map +1 -0
  325. package/dist/types.d.ts +2 -1
  326. package/dist/types.d.ts.map +1 -1
  327. package/dist/utils/cliUI.d.ts +33 -0
  328. package/dist/utils/cliUI.d.ts.map +1 -1
  329. package/dist/utils/cliUI.js +157 -107
  330. package/dist/utils/cliUI.js.map +1 -1
  331. package/dist/utils/contentSanitizer.d.ts +42 -0
  332. package/dist/utils/contentSanitizer.d.ts.map +1 -0
  333. package/dist/utils/contentSanitizer.js +238 -0
  334. package/dist/utils/contentSanitizer.js.map +1 -0
  335. package/dist/utils/gitService.d.ts.map +1 -1
  336. package/dist/utils/gitService.js +12 -14
  337. package/dist/utils/gitService.js.map +1 -1
  338. package/dist/utils/i18n.d.ts +87 -13
  339. package/dist/utils/i18n.d.ts.map +1 -1
  340. package/dist/utils/i18n.js +176 -28
  341. package/dist/utils/i18n.js.map +1 -1
  342. package/dist/utils/prompts/configSummary.d.ts +7 -0
  343. package/dist/utils/prompts/configSummary.d.ts.map +1 -0
  344. package/dist/utils/prompts/configSummary.js +63 -0
  345. package/dist/utils/prompts/configSummary.js.map +1 -0
  346. package/dist/utils/prompts/index.d.ts +22 -0
  347. package/dist/utils/prompts/index.d.ts.map +1 -0
  348. package/dist/utils/prompts/index.js +122 -0
  349. package/dist/utils/prompts/index.js.map +1 -0
  350. package/dist/utils/prompts/llmPrompts.d.ts +11 -0
  351. package/dist/utils/prompts/llmPrompts.d.ts.map +1 -0
  352. package/dist/utils/prompts/llmPrompts.js +96 -0
  353. package/dist/utils/prompts/llmPrompts.js.map +1 -0
  354. package/dist/utils/prompts/smartDefaults.d.ts +15 -0
  355. package/dist/utils/prompts/smartDefaults.d.ts.map +1 -0
  356. package/dist/utils/prompts/smartDefaults.js +105 -0
  357. package/dist/utils/prompts/smartDefaults.js.map +1 -0
  358. package/dist/utils/prompts/types.d.ts +38 -0
  359. package/dist/utils/prompts/types.d.ts.map +1 -0
  360. package/dist/utils/prompts/types.js +3 -0
  361. package/dist/utils/prompts/types.js.map +1 -0
  362. package/dist/utils/theme.d.ts +66 -0
  363. package/dist/utils/theme.d.ts.map +1 -0
  364. package/dist/utils/theme.js +93 -0
  365. package/dist/utils/theme.js.map +1 -0
  366. package/dist/version.d.ts +8 -0
  367. package/dist/version.d.ts.map +1 -0
  368. package/dist/version.js +15 -0
  369. package/dist/version.js.map +1 -0
  370. package/package.json +12 -2
  371. package/prompts/update_scaffold_prompt.md +14 -34
  372. package/dist/commands/shared/agents.d.ts +0 -2
  373. package/dist/commands/shared/agents.d.ts.map +0 -1
  374. package/dist/commands/shared/agents.js +0 -15
  375. package/dist/commands/shared/agents.js.map +0 -1
  376. package/dist/commands/shared/selection.d.ts +0 -12
  377. package/dist/commands/shared/selection.d.ts.map +0 -1
  378. package/dist/commands/shared/selection.js +0 -95
  379. package/dist/commands/shared/selection.js.map +0 -1
  380. package/dist/generators/documentation/templates/frontMatter.d.ts +0 -11
  381. package/dist/generators/documentation/templates/frontMatter.d.ts.map +0 -1
  382. package/dist/generators/documentation/templates/frontMatter.js +0 -29
  383. package/dist/generators/documentation/templates/frontMatter.js.map +0 -1
  384. package/dist/services/anthropicClient.d.ts +0 -12
  385. package/dist/services/anthropicClient.d.ts.map +0 -1
  386. package/dist/services/anthropicClient.js +0 -98
  387. package/dist/services/anthropicClient.js.map +0 -1
  388. package/dist/services/geminiClient.d.ts +0 -12
  389. package/dist/services/geminiClient.d.ts.map +0 -1
  390. package/dist/services/geminiClient.js +0 -96
  391. package/dist/services/geminiClient.js.map +0 -1
  392. package/dist/services/grokClient.d.ts +0 -12
  393. package/dist/services/grokClient.d.ts.map +0 -1
  394. package/dist/services/grokClient.js +0 -101
  395. package/dist/services/grokClient.js.map +0 -1
  396. package/dist/services/openaiClient.d.ts +0 -12
  397. package/dist/services/openaiClient.d.ts.map +0 -1
  398. package/dist/services/openaiClient.js +0 -98
  399. package/dist/services/openaiClient.js.map +0 -1
  400. package/dist/utils/pricing.d.ts +0 -14
  401. package/dist/utils/pricing.d.ts.map +0 -1
  402. package/dist/utils/pricing.js +0 -115
  403. package/dist/utils/pricing.js.map +0 -1
package/dist/index.js CHANGED
@@ -47,8 +47,8 @@ exports.runLlmFill = runLlmFill;
47
47
  const commander_1 = require("commander");
48
48
  const path = __importStar(require("path"));
49
49
  const dotenv = __importStar(require("dotenv"));
50
- const chalk_1 = __importDefault(require("chalk"));
51
50
  const inquirer_1 = __importDefault(require("inquirer"));
51
+ const theme_1 = require("./utils/theme");
52
52
  const planGenerator_1 = require("./generators/plans/planGenerator");
53
53
  const cliUI_1 = require("./utils/cliUI");
54
54
  const versionChecker_1 = require("./utils/versionChecker");
@@ -56,6 +56,11 @@ const i18n_1 = require("./utils/i18n");
56
56
  const initService_1 = require("./services/init/initService");
57
57
  const fillService_1 = require("./services/fill/fillService");
58
58
  const planService_1 = require("./services/plan/planService");
59
+ const syncService_1 = require("./services/sync/syncService");
60
+ const serve_1 = require("./services/serve");
61
+ const mcp_1 = require("./services/mcp");
62
+ const prompts_1 = require("./utils/prompts");
63
+ const version_1 = require("./version");
59
64
  dotenv.config();
60
65
  const initialLocale = (0, i18n_1.detectLocale)(process.argv.slice(2), process.env.AI_CONTEXT_LANG);
61
66
  let currentLocale = initialLocale;
@@ -67,37 +72,40 @@ const localeLabelKeys = {
67
72
  };
68
73
  const program = new commander_1.Command();
69
74
  const ui = new cliUI_1.CLIInterface(t);
70
- const VERSION = '0.4.0';
71
- const PACKAGE_NAME = '@ai-coders/context';
72
- const DEFAULT_MODEL = 'x-ai/grok-4-fast';
75
+ const DEFAULT_MODEL = 'gemini-3-flash-preview';
73
76
  const initService = new initService_1.InitService({
74
77
  ui,
75
78
  t,
76
- version: VERSION
79
+ version: version_1.VERSION
77
80
  });
78
81
  const fillService = new fillService_1.FillService({
79
82
  ui,
80
83
  t,
81
- version: VERSION,
84
+ version: version_1.VERSION,
82
85
  defaultModel: DEFAULT_MODEL
83
86
  });
84
87
  const planService = new planService_1.PlanService({
85
88
  ui,
86
89
  t,
87
- version: VERSION,
90
+ version: version_1.VERSION,
88
91
  defaultModel: DEFAULT_MODEL
89
92
  });
93
+ const syncService = new syncService_1.SyncService({
94
+ ui,
95
+ t,
96
+ version: version_1.VERSION
97
+ });
90
98
  program
91
99
  .name('ai-context')
92
100
  .description(t('cli.description'))
93
- .version(VERSION);
101
+ .version(version_1.VERSION);
94
102
  program.option('-l, --lang <locale>', t('global.options.lang'), initialLocale);
95
103
  let versionCheckPromise = null;
96
104
  function scheduleVersionCheck(force = false) {
97
105
  if (!versionCheckPromise || force) {
98
106
  versionCheckPromise = (0, versionChecker_1.checkForUpdates)({
99
- packageName: PACKAGE_NAME,
100
- currentVersion: VERSION,
107
+ packageName: version_1.PACKAGE_NAME,
108
+ currentVersion: version_1.VERSION,
101
109
  ui,
102
110
  t,
103
111
  force
@@ -117,6 +125,7 @@ program
117
125
  .option('--exclude <patterns...>', t('commands.init.options.exclude'))
118
126
  .option('--include <patterns...>', t('commands.init.options.include'))
119
127
  .option('-v, --verbose', t('commands.init.options.verbose'))
128
+ .option('--no-semantic', t('commands.init.options.noSemantic'))
120
129
  .action(async (repoPath, type, options) => {
121
130
  try {
122
131
  await initService.run(repoPath, type, options);
@@ -140,6 +149,9 @@ program
140
149
  .option('--exclude <patterns...>', t('commands.fill.options.exclude'))
141
150
  .option('--include <patterns...>', t('commands.fill.options.include'))
142
151
  .option('-v, --verbose', t('commands.fill.options.verbose'))
152
+ .option('--no-semantic', t('commands.fill.options.noSemantic'))
153
+ .option('--languages <langs>', t('commands.fill.options.languages'))
154
+ .option('--use-lsp', t('commands.fill.options.useLsp'))
143
155
  .action(async (repoPath, options) => {
144
156
  try {
145
157
  await fillService.run(repoPath, options);
@@ -168,6 +180,8 @@ program
168
180
  .option('--include <patterns...>', t('commands.plan.options.include'))
169
181
  .option('--exclude <patterns...>', t('commands.plan.options.exclude'))
170
182
  .option('-v, --verbose', t('commands.plan.options.verbose'))
183
+ .option('--no-semantic', t('commands.plan.options.noSemantic'))
184
+ .option('--no-lsp', t('commands.plan.options.noLsp'))
171
185
  .action(async (planName, rawOptions) => {
172
186
  const outputDir = path.resolve(rawOptions.output || './.context');
173
187
  if (rawOptions.fill) {
@@ -195,10 +209,12 @@ program
195
209
  title: rawOptions.title,
196
210
  summary: rawOptions.summary,
197
211
  force: Boolean(rawOptions.force),
198
- verbose: Boolean(rawOptions.verbose)
212
+ verbose: Boolean(rawOptions.verbose),
213
+ semantic: rawOptions.semantic !== false,
214
+ projectPath: rawOptions.repo ? path.resolve(rawOptions.repo) : path.resolve(rawOptions.output || './.context', '..')
199
215
  });
200
216
  ui.updateSpinner(t('spinner.plan.created'), 'success');
201
- ui.displaySuccess(t('success.plan.createdAt', { path: chalk_1.default.cyan(result.relativePath) }));
217
+ ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
202
218
  }
203
219
  catch (error) {
204
220
  ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
@@ -209,6 +225,75 @@ program
209
225
  ui.stopSpinner();
210
226
  }
211
227
  });
228
+ program
229
+ .command('sync-agents')
230
+ .description(t('commands.sync.description'))
231
+ .option('-s, --source <dir>', t('commands.sync.options.source'), './.context/agents')
232
+ .option('-t, --target <paths...>', t('commands.sync.options.target'))
233
+ .option('-m, --mode <type>', t('commands.sync.options.mode'), 'symlink')
234
+ .option('-p, --preset <name>', t('commands.sync.options.preset'))
235
+ .option('--force', t('commands.sync.options.force'))
236
+ .option('--dry-run', t('commands.sync.options.dryRun'))
237
+ .option('-v, --verbose', t('commands.sync.options.verbose'))
238
+ .action(async (options) => {
239
+ try {
240
+ await syncService.run(options);
241
+ }
242
+ catch (error) {
243
+ ui.displayError(t('errors.sync.failed'), error);
244
+ process.exit(1);
245
+ }
246
+ });
247
+ program
248
+ .command('serve')
249
+ .description('Start passthrough server for external AI agents (stdin/stdout JSON)')
250
+ .option('-r, --repo-path <path>', 'Default repository path for tools')
251
+ .option('-f, --format <format>', 'Output format: json or jsonl', 'jsonl')
252
+ .option('-v, --verbose', 'Enable verbose logging to stderr')
253
+ .action(async (options) => {
254
+ const service = new serve_1.ServeService({
255
+ repoPath: options.repoPath,
256
+ format: options.format,
257
+ verbose: options.verbose
258
+ });
259
+ try {
260
+ await service.run();
261
+ }
262
+ catch (error) {
263
+ if (options.verbose) {
264
+ process.stderr.write(`[serve] Error: ${error}\n`);
265
+ }
266
+ process.exit(1);
267
+ }
268
+ });
269
+ program
270
+ .command('mcp')
271
+ .description('Start MCP (Model Context Protocol) server for Claude Code integration')
272
+ .option('-r, --repo-path <path>', 'Default repository path for tools')
273
+ .option('-v, --verbose', 'Enable verbose logging to stderr')
274
+ .action(async (options) => {
275
+ try {
276
+ const server = await (0, mcp_1.startMCPServer)({
277
+ repoPath: options.repoPath,
278
+ verbose: options.verbose
279
+ });
280
+ // Handle graceful shutdown
281
+ process.on('SIGINT', async () => {
282
+ await server.stop();
283
+ process.exit(0);
284
+ });
285
+ process.on('SIGTERM', async () => {
286
+ await server.stop();
287
+ process.exit(0);
288
+ });
289
+ }
290
+ catch (error) {
291
+ if (options.verbose) {
292
+ process.stderr.write(`[mcp] Error: ${error}\n`);
293
+ }
294
+ process.exit(1);
295
+ }
296
+ });
212
297
  async function runInit(repoPath, type, rawOptions) {
213
298
  await initService.run(repoPath, type, rawOptions);
214
299
  }
@@ -255,7 +340,7 @@ async function selectLocale(showWelcome) {
255
340
  currentLocale = normalizedLocale;
256
341
  translateFn = (0, i18n_1.createTranslator)(normalizedLocale);
257
342
  if (showWelcome) {
258
- ui.displayWelcome(VERSION);
343
+ ui.displayWelcome(version_1.VERSION);
259
344
  }
260
345
  }
261
346
  async function runInteractive() {
@@ -271,6 +356,7 @@ async function runInteractive() {
271
356
  { name: t('prompts.main.choice.scaffold'), value: 'scaffold' },
272
357
  { name: t('prompts.main.choice.fill'), value: 'fill' },
273
358
  { name: t('prompts.main.choice.plan'), value: 'plan' },
359
+ { name: t('prompts.main.choice.syncAgents'), value: 'syncAgents' },
274
360
  { name: t('prompts.main.choice.changeLanguage'), value: 'changeLanguage' },
275
361
  { name: t('prompts.main.choice.exit'), value: 'exit' }
276
362
  ]
@@ -290,9 +376,12 @@ async function runInteractive() {
290
376
  else if (action === 'fill') {
291
377
  await runInteractiveLlmFill();
292
378
  }
293
- else {
379
+ else if (action === 'plan') {
294
380
  await runInteractivePlan();
295
381
  }
382
+ else if (action === 'syncAgents') {
383
+ await runInteractiveSync();
384
+ }
296
385
  ui.displayInfo(t('info.interactive.returning.title'), t('info.interactive.returning.detail'));
297
386
  }
298
387
  ui.displaySuccess(t('success.interactive.goodbye'));
@@ -339,16 +428,65 @@ async function runInteractiveScaffold() {
339
428
  ]);
340
429
  await runInit(resolvedRepo, scaffoldType, {
341
430
  output: outputDir,
342
- verbose
431
+ verbose,
432
+ semantic: true
343
433
  });
344
434
  }
345
435
  async function runInteractiveLlmFill() {
436
+ const defaults = await (0, prompts_1.detectSmartDefaults)();
437
+ const interactiveMode = await (0, prompts_1.promptInteractiveMode)(t);
438
+ if (interactiveMode === 'quick') {
439
+ // Quick mode: minimal prompts with smart defaults
440
+ const { confirmRepo } = await inquirer_1.default.prompt([
441
+ {
442
+ type: 'confirm',
443
+ name: 'confirmRepo',
444
+ message: `${t('prompts.quick.confirmRepo')} (${defaults.repoPath})`,
445
+ default: true
446
+ }
447
+ ]);
448
+ const resolvedRepo = confirmRepo ? defaults.repoPath : (await inquirer_1.default.prompt([
449
+ { type: 'input', name: 'repoPath', message: t('prompts.fill.repoPath'), default: defaults.repoPath }
450
+ ])).repoPath;
451
+ // Get LLM config (auto-detected or prompt for API key)
452
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: true });
453
+ // Build summary
454
+ const summary = {
455
+ operation: 'fill',
456
+ repoPath: resolvedRepo,
457
+ outputDir: defaults.outputDir,
458
+ provider: llmConfig.provider,
459
+ model: llmConfig.model,
460
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
461
+ options: {
462
+ Semantic: true,
463
+ Languages: defaults.detectedLanguages.join(', '),
464
+ LSP: false
465
+ }
466
+ };
467
+ (0, prompts_1.displayConfigSummary)(summary, t);
468
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
469
+ if (proceed) {
470
+ await fillService.run(resolvedRepo, {
471
+ output: defaults.outputDir,
472
+ model: llmConfig.model,
473
+ provider: llmConfig.provider,
474
+ apiKey: llmConfig.apiKey,
475
+ verbose: false,
476
+ semantic: true,
477
+ languages: defaults.detectedLanguages,
478
+ useLsp: false
479
+ });
480
+ }
481
+ return;
482
+ }
483
+ // Advanced mode: full configuration
346
484
  const { repoPath } = await inquirer_1.default.prompt([
347
485
  {
348
486
  type: 'input',
349
487
  name: 'repoPath',
350
488
  message: t('prompts.fill.repoPath'),
351
- default: process.cwd()
489
+ default: defaults.repoPath
352
490
  }
353
491
  ]);
354
492
  const resolvedRepo = path.resolve(repoPath.trim() || '.');
@@ -378,67 +516,49 @@ async function runInteractiveLlmFill() {
378
516
  ]);
379
517
  const limitValue = limit ? parseInt(limit, 10) : undefined;
380
518
  const parsedLimit = Number.isNaN(limitValue) ? undefined : limitValue;
381
- const { specifyModel } = await inquirer_1.default.prompt([
382
- {
383
- type: 'confirm',
384
- name: 'specifyModel',
385
- message: t('prompts.fill.overrideModel'),
386
- default: false
387
- }
388
- ]);
389
- let provider;
390
- let model;
391
- if (specifyModel) {
392
- const modelAnswer = await inquirer_1.default.prompt([
393
- {
394
- type: 'input',
395
- name: 'model',
396
- message: t('prompts.fill.model'),
397
- default: DEFAULT_MODEL
398
- }
399
- ]);
400
- model = modelAnswer.model.trim();
401
- provider = 'openrouter';
402
- }
403
- const { provideApiKey } = await inquirer_1.default.prompt([
404
- {
405
- type: 'confirm',
406
- name: 'provideApiKey',
407
- message: t('prompts.fill.provideApiKey'),
408
- default: false
519
+ // Use shared LLM prompt helper
520
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: false });
521
+ // Use shared analysis options prompt
522
+ const analysisOptions = await (0, prompts_1.promptAnalysisOptions)(t, {
523
+ languages: defaults.detectedLanguages,
524
+ useLsp: false
525
+ });
526
+ // Show summary before execution
527
+ const summary = {
528
+ operation: 'fill',
529
+ repoPath: resolvedRepo,
530
+ outputDir,
531
+ provider: llmConfig.provider,
532
+ model: llmConfig.model,
533
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
534
+ options: {
535
+ Semantic: analysisOptions.semantic,
536
+ Languages: analysisOptions.languages?.join(', ') || 'none',
537
+ LSP: analysisOptions.useLsp,
538
+ Verbose: analysisOptions.verbose,
539
+ ...(parsedLimit ? { Limit: String(parsedLimit) } : {})
409
540
  }
410
- ]);
411
- let apiKey;
412
- if (provideApiKey) {
413
- const apiKeyAnswer = await inquirer_1.default.prompt([
414
- {
415
- type: 'password',
416
- name: 'apiKey',
417
- message: t('prompts.fill.apiKey'),
418
- mask: '*'
419
- }
420
- ]);
421
- apiKey = apiKeyAnswer.apiKey.trim();
541
+ };
542
+ (0, prompts_1.displayConfigSummary)(summary, t);
543
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
544
+ if (proceed) {
545
+ await fillService.run(resolvedRepo, {
546
+ output: outputDir,
547
+ prompt: promptPath,
548
+ limit: parsedLimit,
549
+ model: llmConfig.model,
550
+ provider: llmConfig.provider,
551
+ apiKey: llmConfig.apiKey,
552
+ verbose: analysisOptions.verbose,
553
+ semantic: analysisOptions.semantic,
554
+ languages: analysisOptions.languages,
555
+ useLsp: analysisOptions.useLsp
556
+ });
422
557
  }
423
- const { verbose } = await inquirer_1.default.prompt([
424
- {
425
- type: 'confirm',
426
- name: 'verbose',
427
- message: t('prompts.common.verbose'),
428
- default: false
429
- }
430
- ]);
431
- await fillService.run(resolvedRepo, {
432
- output: outputDir,
433
- prompt: promptPath,
434
- limit: parsedLimit,
435
- model,
436
- provider,
437
- apiKey,
438
- verbose
439
- });
440
558
  }
441
559
  async function runInteractivePlan() {
560
+ const defaults = await (0, prompts_1.detectSmartDefaults)();
561
+ // Always ask for plan name first
442
562
  const { planName } = await inquirer_1.default.prompt([
443
563
  {
444
564
  type: 'input',
@@ -447,6 +567,82 @@ async function runInteractivePlan() {
447
567
  default: 'new-plan'
448
568
  }
449
569
  ]);
570
+ const interactiveMode = await (0, prompts_1.promptInteractiveMode)(t);
571
+ if (interactiveMode === 'quick') {
572
+ // Quick mode: choose scaffold or fill with defaults
573
+ const { action } = await inquirer_1.default.prompt([
574
+ {
575
+ type: 'list',
576
+ name: 'action',
577
+ message: t('prompts.plan.mode'),
578
+ choices: [
579
+ { name: t('prompts.plan.modeScaffold'), value: 'scaffold' },
580
+ { name: t('prompts.plan.modeFill'), value: 'fill' }
581
+ ],
582
+ default: 'scaffold'
583
+ }
584
+ ]);
585
+ if (action === 'scaffold') {
586
+ // Quick scaffold: just create the template
587
+ const generator = new planGenerator_1.PlanGenerator();
588
+ ui.startSpinner(t('spinner.plan.creating'));
589
+ try {
590
+ const result = await generator.generatePlan({
591
+ planName,
592
+ outputDir: defaults.outputDir,
593
+ verbose: false,
594
+ semantic: true,
595
+ projectPath: defaults.repoPath
596
+ });
597
+ ui.updateSpinner(t('spinner.plan.created'), 'success');
598
+ ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
599
+ }
600
+ catch (error) {
601
+ ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
602
+ ui.displayError(t('errors.plan.creationFailed'), error);
603
+ }
604
+ finally {
605
+ ui.stopSpinner();
606
+ }
607
+ return;
608
+ }
609
+ // Quick fill: use auto-detected LLM config
610
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: true });
611
+ const summary = {
612
+ operation: 'plan',
613
+ repoPath: defaults.repoPath,
614
+ outputDir: defaults.outputDir,
615
+ provider: llmConfig.provider,
616
+ model: llmConfig.model,
617
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
618
+ options: {
619
+ 'Plan Name': planName,
620
+ LSP: true,
621
+ 'Dry Run': false
622
+ }
623
+ };
624
+ (0, prompts_1.displayConfigSummary)(summary, t);
625
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
626
+ if (proceed) {
627
+ try {
628
+ await planService.scaffoldPlanIfNeeded(planName, defaults.outputDir, {});
629
+ await planService.fillPlan(planName, {
630
+ output: defaults.outputDir,
631
+ repo: defaults.repoPath,
632
+ dryRun: false,
633
+ provider: llmConfig.provider,
634
+ model: llmConfig.model,
635
+ apiKey: llmConfig.apiKey,
636
+ lsp: true
637
+ });
638
+ }
639
+ catch (error) {
640
+ ui.displayError(t('errors.plan.fillFailed'), error);
641
+ }
642
+ }
643
+ return;
644
+ }
645
+ // Advanced mode: full configuration
450
646
  const defaultOutput = path.resolve(process.cwd(), '.context');
451
647
  const { mode } = await inquirer_1.default.prompt([
452
648
  {
@@ -485,6 +681,8 @@ async function runInteractivePlan() {
485
681
  default: process.cwd()
486
682
  }
487
683
  ]);
684
+ // Use shared LLM prompt helper
685
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: false });
488
686
  const { dryRun } = await inquirer_1.default.prompt([
489
687
  {
490
688
  type: 'confirm',
@@ -493,22 +691,53 @@ async function runInteractivePlan() {
493
691
  default: true
494
692
  }
495
693
  ]);
496
- try {
497
- const resolvedOutput = path.resolve(outputDir.trim() || defaultOutput);
498
- await planService.scaffoldPlanIfNeeded(planName, resolvedOutput, {
499
- summary: summary || undefined
500
- });
501
- await planService.fillPlan(planName, {
502
- output: resolvedOutput,
503
- repo: repoPath,
504
- dryRun
505
- });
506
- }
507
- catch (error) {
508
- ui.displayError(t('errors.plan.fillFailed'), error);
694
+ const { useLsp } = await inquirer_1.default.prompt([
695
+ {
696
+ type: 'confirm',
697
+ name: 'useLsp',
698
+ message: t('prompts.plan.useLsp'),
699
+ default: true
700
+ }
701
+ ]);
702
+ // Show summary before execution
703
+ const configSummary = {
704
+ operation: 'plan',
705
+ repoPath,
706
+ outputDir,
707
+ provider: llmConfig.provider,
708
+ model: llmConfig.model,
709
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
710
+ options: {
711
+ 'Plan Name': planName,
712
+ LSP: useLsp,
713
+ 'Dry Run': dryRun
714
+ }
715
+ };
716
+ (0, prompts_1.displayConfigSummary)(configSummary, t);
717
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
718
+ if (proceed) {
719
+ try {
720
+ const resolvedOutput = path.resolve(outputDir.trim() || defaultOutput);
721
+ await planService.scaffoldPlanIfNeeded(planName, resolvedOutput, {
722
+ summary: summary || undefined
723
+ });
724
+ await planService.fillPlan(planName, {
725
+ output: resolvedOutput,
726
+ repo: repoPath,
727
+ dryRun,
728
+ provider: llmConfig.provider,
729
+ model: llmConfig.model,
730
+ apiKey: llmConfig.apiKey,
731
+ lsp: useLsp
732
+ });
733
+ }
734
+ catch (error) {
735
+ ui.displayError(t('errors.plan.fillFailed'), error);
736
+ }
509
737
  }
510
738
  return;
511
739
  }
740
+ // Scaffold mode
512
741
  const { summary } = await inquirer_1.default.prompt([
513
742
  {
514
743
  type: 'input',
@@ -524,10 +753,12 @@ async function runInteractivePlan() {
524
753
  planName,
525
754
  outputDir: path.resolve(outputDir.trim() || defaultOutput),
526
755
  summary: summary || undefined,
527
- verbose: false
756
+ verbose: false,
757
+ semantic: true,
758
+ projectPath: path.resolve(outputDir.trim() || defaultOutput, '..')
528
759
  });
529
760
  ui.updateSpinner(t('spinner.plan.created'), 'success');
530
- ui.displaySuccess(t('success.plan.createdAt', { path: chalk_1.default.cyan(result.relativePath) }));
761
+ ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
531
762
  }
532
763
  catch (error) {
533
764
  ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
@@ -537,6 +768,82 @@ async function runInteractivePlan() {
537
768
  ui.stopSpinner();
538
769
  }
539
770
  }
771
+ async function runInteractiveSync() {
772
+ const defaults = await (0, prompts_1.detectSmartDefaults)();
773
+ const defaultSource = path.resolve(defaults.repoPath, '.context/agents');
774
+ // Simplified: single prompt for target selection with common presets
775
+ const { quickTarget } = await inquirer_1.default.prompt([
776
+ {
777
+ type: 'list',
778
+ name: 'quickTarget',
779
+ message: t('prompts.sync.quickTarget'),
780
+ choices: [
781
+ { name: t('prompts.sync.quickTarget.common'), value: 'common' },
782
+ { name: t('prompts.sync.quickTarget.claude'), value: 'claude' },
783
+ { name: t('prompts.sync.quickTarget.all'), value: 'all' },
784
+ { name: t('prompts.sync.quickTarget.custom'), value: 'custom' }
785
+ ],
786
+ default: 'common'
787
+ }
788
+ ]);
789
+ let preset;
790
+ let target;
791
+ let sourcePath = defaultSource;
792
+ if (quickTarget === 'custom') {
793
+ // Custom path: ask for source and target
794
+ const answers = await inquirer_1.default.prompt([
795
+ {
796
+ type: 'input',
797
+ name: 'sourcePath',
798
+ message: t('prompts.sync.source'),
799
+ default: defaultSource
800
+ },
801
+ {
802
+ type: 'input',
803
+ name: 'customPath',
804
+ message: t('prompts.sync.customPath')
805
+ }
806
+ ]);
807
+ sourcePath = answers.sourcePath;
808
+ target = [answers.customPath];
809
+ }
810
+ else if (quickTarget === 'common') {
811
+ // Common: Claude + GitHub - use explicit target paths instead of preset
812
+ target = [
813
+ path.resolve(defaults.repoPath, '.claude/agents'),
814
+ path.resolve(defaults.repoPath, '.github/agents')
815
+ ];
816
+ }
817
+ else {
818
+ preset = quickTarget;
819
+ }
820
+ // Show summary
821
+ const summary = {
822
+ operation: 'sync',
823
+ repoPath: sourcePath,
824
+ options: {
825
+ Target: quickTarget === 'custom' ? (target?.[0] || 'custom') : quickTarget,
826
+ Mode: 'symlink'
827
+ }
828
+ };
829
+ (0, prompts_1.displayConfigSummary)(summary, t);
830
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
831
+ if (proceed) {
832
+ try {
833
+ await syncService.run({
834
+ source: sourcePath,
835
+ mode: 'symlink',
836
+ preset: preset,
837
+ target,
838
+ force: false,
839
+ dryRun: false
840
+ });
841
+ }
842
+ catch (error) {
843
+ ui.displayError(t('errors.sync.failed'), error);
844
+ }
845
+ }
846
+ }
540
847
  function filterOutLocaleArgs(args) {
541
848
  const filtered = [];
542
849
  for (let index = 0; index < args.length; index += 1) {
@@ -562,10 +869,43 @@ async function main() {
562
869
  }
563
870
  await program.parseAsync(process.argv);
564
871
  }
872
+ /**
873
+ * Check if an error is from user interrupt (Ctrl+C)
874
+ */
875
+ function isUserInterrupt(error) {
876
+ if (error instanceof Error) {
877
+ // Inquirer's ExitPromptError when user presses Ctrl+C
878
+ if (error.name === 'ExitPromptError')
879
+ return true;
880
+ // Check message patterns
881
+ if (error.message.includes('force closed'))
882
+ return true;
883
+ if (error.message.includes('User force closed'))
884
+ return true;
885
+ }
886
+ return false;
887
+ }
888
+ /**
889
+ * Handle graceful exit
890
+ */
891
+ function handleGracefulExit() {
892
+ console.log('');
893
+ ui.displaySuccess(t('success.interactive.goodbye'));
894
+ process.exit(0);
895
+ }
896
+ // Handle SIGINT (Ctrl+C) at process level
897
+ process.on('SIGINT', () => {
898
+ handleGracefulExit();
899
+ });
565
900
  if (require.main === module) {
566
901
  main().catch(error => {
567
- ui.displayError(t('errors.cli.executionFailed'), error);
568
- process.exit(1);
902
+ if (isUserInterrupt(error)) {
903
+ handleGracefulExit();
904
+ }
905
+ else {
906
+ ui.displayError(t('errors.cli.executionFailed'), error);
907
+ process.exit(1);
908
+ }
569
909
  });
570
910
  }
571
911
  //# sourceMappingURL=index.js.map