@ai-coders/context 0.4.0 → 0.5.1

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 (435) hide show
  1. package/README.md +117 -146
  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 +147 -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 +3 -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 +174 -36
  76. package/dist/generators/documentation/templates/architectureTemplate.js.map +1 -1
  77. package/dist/generators/documentation/templates/common.d.ts +33 -1
  78. package/dist/generators/documentation/templates/common.d.ts.map +1 -1
  79. package/dist/generators/documentation/templates/common.js +144 -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 +106 -22
  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 +4 -19
  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 +57 -25
  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 +3 -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 +3 -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 +94 -28
  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 +11 -22
  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 +4 -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 +11 -25
  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 +3 -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 +57 -33
  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 +646 -114
  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 +217 -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 +342 -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 +244 -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/prompts/index.d.ts +2 -0
  168. package/dist/services/ai/prompts/index.d.ts.map +1 -0
  169. package/dist/services/ai/prompts/index.js +12 -0
  170. package/dist/services/ai/prompts/index.js.map +1 -0
  171. package/dist/services/ai/prompts/sharedPrompts.d.ts +33 -0
  172. package/dist/services/ai/prompts/sharedPrompts.d.ts.map +1 -0
  173. package/dist/services/ai/prompts/sharedPrompts.js +136 -0
  174. package/dist/services/ai/prompts/sharedPrompts.js.map +1 -0
  175. package/dist/services/ai/providerFactory.d.ts +35 -0
  176. package/dist/services/ai/providerFactory.d.ts.map +1 -0
  177. package/dist/services/ai/providerFactory.js +107 -0
  178. package/dist/services/ai/providerFactory.js.map +1 -0
  179. package/dist/services/ai/schemas.d.ts +331 -0
  180. package/dist/services/ai/schemas.d.ts.map +1 -0
  181. package/dist/services/ai/schemas.js +236 -0
  182. package/dist/services/ai/schemas.js.map +1 -0
  183. package/dist/services/ai/toolRegistry.d.ts +27 -0
  184. package/dist/services/ai/toolRegistry.d.ts.map +1 -0
  185. package/dist/services/ai/toolRegistry.js +126 -0
  186. package/dist/services/ai/toolRegistry.js.map +1 -0
  187. package/dist/services/ai/tools/analyzeSymbolsTool.d.ts +33 -0
  188. package/dist/services/ai/tools/analyzeSymbolsTool.d.ts.map +1 -0
  189. package/dist/services/ai/tools/analyzeSymbolsTool.js +57 -0
  190. package/dist/services/ai/tools/analyzeSymbolsTool.js.map +1 -0
  191. package/dist/services/ai/tools/checkScaffoldingTool.d.ts +18 -0
  192. package/dist/services/ai/tools/checkScaffoldingTool.d.ts.map +1 -0
  193. package/dist/services/ai/tools/checkScaffoldingTool.js +86 -0
  194. package/dist/services/ai/tools/checkScaffoldingTool.js.map +1 -0
  195. package/dist/services/ai/tools/fillScaffoldingTool.d.ts +108 -0
  196. package/dist/services/ai/tools/fillScaffoldingTool.d.ts.map +1 -0
  197. package/dist/services/ai/tools/fillScaffoldingTool.js +463 -0
  198. package/dist/services/ai/tools/fillScaffoldingTool.js.map +1 -0
  199. package/dist/services/ai/tools/getFileStructureTool.d.ts +29 -0
  200. package/dist/services/ai/tools/getFileStructureTool.d.ts.map +1 -0
  201. package/dist/services/ai/tools/getFileStructureTool.js +48 -0
  202. package/dist/services/ai/tools/getFileStructureTool.js.map +1 -0
  203. package/dist/services/ai/tools/index.d.ts +20 -0
  204. package/dist/services/ai/tools/index.d.ts.map +1 -0
  205. package/dist/services/ai/tools/index.js +68 -0
  206. package/dist/services/ai/tools/index.js.map +1 -0
  207. package/dist/services/ai/tools/initializeContextTool.d.ts +25 -0
  208. package/dist/services/ai/tools/initializeContextTool.d.ts.map +1 -0
  209. package/dist/services/ai/tools/initializeContextTool.js +121 -0
  210. package/dist/services/ai/tools/initializeContextTool.js.map +1 -0
  211. package/dist/services/ai/tools/listFilesTool.d.ts +18 -0
  212. package/dist/services/ai/tools/listFilesTool.d.ts.map +1 -0
  213. package/dist/services/ai/tools/listFilesTool.js +34 -0
  214. package/dist/services/ai/tools/listFilesTool.js.map +1 -0
  215. package/dist/services/ai/tools/readFileTool.d.ts +17 -0
  216. package/dist/services/ai/tools/readFileTool.d.ts.map +1 -0
  217. package/dist/services/ai/tools/readFileTool.js +63 -0
  218. package/dist/services/ai/tools/readFileTool.js.map +1 -0
  219. package/dist/services/ai/tools/scaffoldPlanTool.d.ts +19 -0
  220. package/dist/services/ai/tools/scaffoldPlanTool.d.ts.map +1 -0
  221. package/dist/services/ai/tools/scaffoldPlanTool.js +81 -0
  222. package/dist/services/ai/tools/scaffoldPlanTool.js.map +1 -0
  223. package/dist/services/ai/tools/searchCodeTool.d.ts +25 -0
  224. package/dist/services/ai/tools/searchCodeTool.d.ts.map +1 -0
  225. package/dist/services/ai/tools/searchCodeTool.js +96 -0
  226. package/dist/services/ai/tools/searchCodeTool.js.map +1 -0
  227. package/dist/services/fill/fillService.d.ts +11 -1
  228. package/dist/services/fill/fillService.d.ts.map +1 -1
  229. package/dist/services/fill/fillService.js +157 -40
  230. package/dist/services/fill/fillService.js.map +1 -1
  231. package/dist/services/init/initService.d.ts +1 -0
  232. package/dist/services/init/initService.d.ts.map +1 -1
  233. package/dist/services/init/initService.js +12 -7
  234. package/dist/services/init/initService.js.map +1 -1
  235. package/dist/services/llmClientFactory.d.ts +36 -2
  236. package/dist/services/llmClientFactory.d.ts.map +1 -1
  237. package/dist/services/llmClientFactory.js +57 -11
  238. package/dist/services/llmClientFactory.js.map +1 -1
  239. package/dist/services/mcp/index.d.ts +2 -0
  240. package/dist/services/mcp/index.d.ts.map +1 -0
  241. package/dist/services/mcp/index.js +7 -0
  242. package/dist/services/mcp/index.js.map +1 -0
  243. package/dist/services/mcp/mcpServer.d.ts +45 -0
  244. package/dist/services/mcp/mcpServer.d.ts.map +1 -0
  245. package/dist/services/mcp/mcpServer.js +411 -0
  246. package/dist/services/mcp/mcpServer.js.map +1 -0
  247. package/dist/services/openRouterClient.js +1 -1
  248. package/dist/services/openRouterClient.js.map +1 -1
  249. package/dist/services/passthrough/commandRouter.d.ts +53 -0
  250. package/dist/services/passthrough/commandRouter.d.ts.map +1 -0
  251. package/dist/services/passthrough/commandRouter.js +349 -0
  252. package/dist/services/passthrough/commandRouter.js.map +1 -0
  253. package/dist/services/passthrough/index.d.ts +7 -0
  254. package/dist/services/passthrough/index.d.ts.map +1 -0
  255. package/dist/services/passthrough/index.js +23 -0
  256. package/dist/services/passthrough/index.js.map +1 -0
  257. package/dist/services/passthrough/protocol.d.ts +269 -0
  258. package/dist/services/passthrough/protocol.d.ts.map +1 -0
  259. package/dist/services/passthrough/protocol.js +151 -0
  260. package/dist/services/passthrough/protocol.js.map +1 -0
  261. package/dist/services/passthrough/stdinReader.d.ts +42 -0
  262. package/dist/services/passthrough/stdinReader.d.ts.map +1 -0
  263. package/dist/services/passthrough/stdinReader.js +111 -0
  264. package/dist/services/passthrough/stdinReader.js.map +1 -0
  265. package/dist/services/plan/planService.d.ts +3 -1
  266. package/dist/services/plan/planService.d.ts.map +1 -1
  267. package/dist/services/plan/planService.js +49 -41
  268. package/dist/services/plan/planService.js.map +1 -1
  269. package/dist/services/semantic/codebaseAnalyzer.d.ts +40 -0
  270. package/dist/services/semantic/codebaseAnalyzer.d.ts.map +1 -0
  271. package/dist/services/semantic/codebaseAnalyzer.js +540 -0
  272. package/dist/services/semantic/codebaseAnalyzer.js.map +1 -0
  273. package/dist/services/semantic/contextBuilder.d.ts +79 -0
  274. package/dist/services/semantic/contextBuilder.d.ts.map +1 -0
  275. package/dist/services/semantic/contextBuilder.js +538 -0
  276. package/dist/services/semantic/contextBuilder.js.map +1 -0
  277. package/dist/services/semantic/index.d.ts +12 -0
  278. package/dist/services/semantic/index.d.ts.map +1 -0
  279. package/dist/services/semantic/index.js +33 -0
  280. package/dist/services/semantic/index.js.map +1 -0
  281. package/dist/services/semantic/lsp/index.d.ts +2 -0
  282. package/dist/services/semantic/lsp/index.d.ts.map +1 -0
  283. package/dist/services/semantic/lsp/index.js +6 -0
  284. package/dist/services/semantic/lsp/index.js.map +1 -0
  285. package/dist/services/semantic/lsp/lspLayer.d.ts +32 -0
  286. package/dist/services/semantic/lsp/lspLayer.d.ts.map +1 -0
  287. package/dist/services/semantic/lsp/lspLayer.js +378 -0
  288. package/dist/services/semantic/lsp/lspLayer.js.map +1 -0
  289. package/dist/services/semantic/treeSitter/index.d.ts +2 -0
  290. package/dist/services/semantic/treeSitter/index.d.ts.map +1 -0
  291. package/dist/services/semantic/treeSitter/index.js +6 -0
  292. package/dist/services/semantic/treeSitter/index.js.map +1 -0
  293. package/dist/services/semantic/treeSitter/treeSitterLayer.d.ts +37 -0
  294. package/dist/services/semantic/treeSitter/treeSitterLayer.d.ts.map +1 -0
  295. package/dist/services/semantic/treeSitter/treeSitterLayer.js +518 -0
  296. package/dist/services/semantic/treeSitter/treeSitterLayer.js.map +1 -0
  297. package/dist/services/semantic/types.d.ts +122 -0
  298. package/dist/services/semantic/types.d.ts.map +1 -0
  299. package/dist/services/semantic/types.js +31 -0
  300. package/dist/services/semantic/types.js.map +1 -0
  301. package/dist/services/serve/index.d.ts +2 -0
  302. package/dist/services/serve/index.d.ts.map +1 -0
  303. package/dist/services/serve/index.js +6 -0
  304. package/dist/services/serve/index.js.map +1 -0
  305. package/dist/services/serve/serveService.d.ts +38 -0
  306. package/dist/services/serve/serveService.d.ts.map +1 -0
  307. package/dist/services/serve/serveService.js +99 -0
  308. package/dist/services/serve/serveService.js.map +1 -0
  309. package/dist/services/shared/llmConfig.d.ts +19 -3
  310. package/dist/services/shared/llmConfig.d.ts.map +1 -1
  311. package/dist/services/shared/llmConfig.js +39 -10
  312. package/dist/services/shared/llmConfig.js.map +1 -1
  313. package/dist/services/state/index.d.ts +2 -0
  314. package/dist/services/state/index.d.ts.map +1 -0
  315. package/dist/services/state/index.js +6 -0
  316. package/dist/services/state/index.js.map +1 -0
  317. package/dist/services/state/stateDetector.d.ts +53 -0
  318. package/dist/services/state/stateDetector.d.ts.map +1 -0
  319. package/dist/services/state/stateDetector.js +189 -0
  320. package/dist/services/state/stateDetector.js.map +1 -0
  321. package/dist/services/sync/index.d.ts +6 -0
  322. package/dist/services/sync/index.d.ts.map +1 -0
  323. package/dist/services/sync/index.js +16 -0
  324. package/dist/services/sync/index.js.map +1 -0
  325. package/dist/services/sync/markdownReferenceHandler.d.ts +3 -0
  326. package/dist/services/sync/markdownReferenceHandler.d.ts.map +1 -0
  327. package/dist/services/sync/markdownReferenceHandler.js +133 -0
  328. package/dist/services/sync/markdownReferenceHandler.js.map +1 -0
  329. package/dist/services/sync/presets.d.ts +6 -0
  330. package/dist/services/sync/presets.d.ts.map +1 -0
  331. package/dist/services/sync/presets.js +49 -0
  332. package/dist/services/sync/presets.js.map +1 -0
  333. package/dist/services/sync/symlinkHandler.d.ts +7 -0
  334. package/dist/services/sync/symlinkHandler.d.ts.map +1 -0
  335. package/dist/services/sync/symlinkHandler.js +129 -0
  336. package/dist/services/sync/symlinkHandler.js.map +1 -0
  337. package/dist/services/sync/syncService.d.ts +15 -0
  338. package/dist/services/sync/syncService.d.ts.map +1 -0
  339. package/dist/services/sync/syncService.js +222 -0
  340. package/dist/services/sync/syncService.js.map +1 -0
  341. package/dist/services/sync/types.d.ts +62 -0
  342. package/dist/services/sync/types.d.ts.map +1 -0
  343. package/dist/services/sync/types.js +3 -0
  344. package/dist/services/sync/types.js.map +1 -0
  345. package/dist/services/update/index.d.ts +2 -0
  346. package/dist/services/update/index.d.ts.map +1 -0
  347. package/dist/services/update/index.js +6 -0
  348. package/dist/services/update/index.js.map +1 -0
  349. package/dist/services/update/updateService.d.ts +64 -0
  350. package/dist/services/update/updateService.d.ts.map +1 -0
  351. package/dist/services/update/updateService.js +295 -0
  352. package/dist/services/update/updateService.js.map +1 -0
  353. package/dist/types.d.ts +2 -6
  354. package/dist/types.d.ts.map +1 -1
  355. package/dist/utils/cliUI.d.ts +33 -0
  356. package/dist/utils/cliUI.d.ts.map +1 -1
  357. package/dist/utils/cliUI.js +157 -107
  358. package/dist/utils/cliUI.js.map +1 -1
  359. package/dist/utils/contentSanitizer.d.ts +42 -0
  360. package/dist/utils/contentSanitizer.d.ts.map +1 -0
  361. package/dist/utils/contentSanitizer.js +238 -0
  362. package/dist/utils/contentSanitizer.js.map +1 -0
  363. package/dist/utils/frontMatter.d.ts +55 -0
  364. package/dist/utils/frontMatter.d.ts.map +1 -0
  365. package/dist/utils/frontMatter.js +173 -0
  366. package/dist/utils/frontMatter.js.map +1 -0
  367. package/dist/utils/gitService.d.ts.map +1 -1
  368. package/dist/utils/gitService.js +12 -14
  369. package/dist/utils/gitService.js.map +1 -1
  370. package/dist/utils/i18n.d.ts +101 -13
  371. package/dist/utils/i18n.d.ts.map +1 -1
  372. package/dist/utils/i18n.js +204 -28
  373. package/dist/utils/i18n.js.map +1 -1
  374. package/dist/utils/prompts/configSummary.d.ts +7 -0
  375. package/dist/utils/prompts/configSummary.d.ts.map +1 -0
  376. package/dist/utils/prompts/configSummary.js +63 -0
  377. package/dist/utils/prompts/configSummary.js.map +1 -0
  378. package/dist/utils/prompts/index.d.ts +22 -0
  379. package/dist/utils/prompts/index.d.ts.map +1 -0
  380. package/dist/utils/prompts/index.js +122 -0
  381. package/dist/utils/prompts/index.js.map +1 -0
  382. package/dist/utils/prompts/llmPrompts.d.ts +11 -0
  383. package/dist/utils/prompts/llmPrompts.d.ts.map +1 -0
  384. package/dist/utils/prompts/llmPrompts.js +96 -0
  385. package/dist/utils/prompts/llmPrompts.js.map +1 -0
  386. package/dist/utils/prompts/smartDefaults.d.ts +15 -0
  387. package/dist/utils/prompts/smartDefaults.d.ts.map +1 -0
  388. package/dist/utils/prompts/smartDefaults.js +105 -0
  389. package/dist/utils/prompts/smartDefaults.js.map +1 -0
  390. package/dist/utils/prompts/types.d.ts +38 -0
  391. package/dist/utils/prompts/types.d.ts.map +1 -0
  392. package/dist/utils/prompts/types.js +3 -0
  393. package/dist/utils/prompts/types.js.map +1 -0
  394. package/dist/utils/theme.d.ts +66 -0
  395. package/dist/utils/theme.d.ts.map +1 -0
  396. package/dist/utils/theme.js +93 -0
  397. package/dist/utils/theme.js.map +1 -0
  398. package/dist/version.d.ts +8 -0
  399. package/dist/version.d.ts.map +1 -0
  400. package/dist/version.js +15 -0
  401. package/dist/version.js.map +1 -0
  402. package/package.json +12 -2
  403. package/prompts/update_scaffold_prompt.md +14 -34
  404. package/dist/commands/shared/agents.d.ts +0 -2
  405. package/dist/commands/shared/agents.d.ts.map +0 -1
  406. package/dist/commands/shared/agents.js +0 -15
  407. package/dist/commands/shared/agents.js.map +0 -1
  408. package/dist/commands/shared/selection.d.ts +0 -12
  409. package/dist/commands/shared/selection.d.ts.map +0 -1
  410. package/dist/commands/shared/selection.js +0 -95
  411. package/dist/commands/shared/selection.js.map +0 -1
  412. package/dist/generators/documentation/templates/frontMatter.d.ts +0 -11
  413. package/dist/generators/documentation/templates/frontMatter.d.ts.map +0 -1
  414. package/dist/generators/documentation/templates/frontMatter.js +0 -29
  415. package/dist/generators/documentation/templates/frontMatter.js.map +0 -1
  416. package/dist/services/anthropicClient.d.ts +0 -12
  417. package/dist/services/anthropicClient.d.ts.map +0 -1
  418. package/dist/services/anthropicClient.js +0 -98
  419. package/dist/services/anthropicClient.js.map +0 -1
  420. package/dist/services/geminiClient.d.ts +0 -12
  421. package/dist/services/geminiClient.d.ts.map +0 -1
  422. package/dist/services/geminiClient.js +0 -96
  423. package/dist/services/geminiClient.js.map +0 -1
  424. package/dist/services/grokClient.d.ts +0 -12
  425. package/dist/services/grokClient.d.ts.map +0 -1
  426. package/dist/services/grokClient.js +0 -101
  427. package/dist/services/grokClient.js.map +0 -1
  428. package/dist/services/openaiClient.d.ts +0 -12
  429. package/dist/services/openaiClient.d.ts.map +0 -1
  430. package/dist/services/openaiClient.js +0 -98
  431. package/dist/services/openaiClient.js.map +0 -1
  432. package/dist/utils/pricing.d.ts +0 -14
  433. package/dist/utils/pricing.d.ts.map +0 -1
  434. package/dist/utils/pricing.js +0 -115
  435. 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,13 @@ 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 state_1 = require("./services/state");
63
+ const update_1 = require("./services/update");
64
+ const prompts_1 = require("./utils/prompts");
65
+ const version_1 = require("./version");
59
66
  dotenv.config();
60
67
  const initialLocale = (0, i18n_1.detectLocale)(process.argv.slice(2), process.env.AI_CONTEXT_LANG);
61
68
  let currentLocale = initialLocale;
@@ -67,37 +74,44 @@ const localeLabelKeys = {
67
74
  };
68
75
  const program = new commander_1.Command();
69
76
  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';
77
+ const DEFAULT_MODEL = 'gemini-3-flash-preview';
73
78
  const initService = new initService_1.InitService({
74
79
  ui,
75
80
  t,
76
- version: VERSION
81
+ version: version_1.VERSION
77
82
  });
78
83
  const fillService = new fillService_1.FillService({
79
84
  ui,
80
85
  t,
81
- version: VERSION,
86
+ version: version_1.VERSION,
82
87
  defaultModel: DEFAULT_MODEL
83
88
  });
84
89
  const planService = new planService_1.PlanService({
85
90
  ui,
86
91
  t,
87
- version: VERSION,
92
+ version: version_1.VERSION,
88
93
  defaultModel: DEFAULT_MODEL
89
94
  });
95
+ const syncService = new syncService_1.SyncService({
96
+ ui,
97
+ t,
98
+ version: version_1.VERSION
99
+ });
100
+ const updateService = new update_1.UpdateService({
101
+ ui,
102
+ t
103
+ });
90
104
  program
91
105
  .name('ai-context')
92
106
  .description(t('cli.description'))
93
- .version(VERSION);
107
+ .version(version_1.VERSION);
94
108
  program.option('-l, --lang <locale>', t('global.options.lang'), initialLocale);
95
109
  let versionCheckPromise = null;
96
110
  function scheduleVersionCheck(force = false) {
97
111
  if (!versionCheckPromise || force) {
98
112
  versionCheckPromise = (0, versionChecker_1.checkForUpdates)({
99
- packageName: PACKAGE_NAME,
100
- currentVersion: VERSION,
113
+ packageName: version_1.PACKAGE_NAME,
114
+ currentVersion: version_1.VERSION,
101
115
  ui,
102
116
  t,
103
117
  force
@@ -117,6 +131,7 @@ program
117
131
  .option('--exclude <patterns...>', t('commands.init.options.exclude'))
118
132
  .option('--include <patterns...>', t('commands.init.options.include'))
119
133
  .option('-v, --verbose', t('commands.init.options.verbose'))
134
+ .option('--no-semantic', t('commands.init.options.noSemantic'))
120
135
  .action(async (repoPath, type, options) => {
121
136
  try {
122
137
  await initService.run(repoPath, type, options);
@@ -140,6 +155,9 @@ program
140
155
  .option('--exclude <patterns...>', t('commands.fill.options.exclude'))
141
156
  .option('--include <patterns...>', t('commands.fill.options.include'))
142
157
  .option('-v, --verbose', t('commands.fill.options.verbose'))
158
+ .option('--no-semantic', t('commands.fill.options.noSemantic'))
159
+ .option('--languages <langs>', t('commands.fill.options.languages'))
160
+ .option('--use-lsp', t('commands.fill.options.useLsp'))
143
161
  .action(async (repoPath, options) => {
144
162
  try {
145
163
  await fillService.run(repoPath, options);
@@ -149,6 +167,64 @@ program
149
167
  process.exit(1);
150
168
  }
151
169
  });
170
+ program
171
+ .command('update')
172
+ .description('Analyze code changes and update affected documentation')
173
+ .argument('[repo-path]', 'Repository path to analyze', '.')
174
+ .option('-o, --output <dir>', 'Output directory', './.context')
175
+ .option('--days <number>', 'Days to look back for changes', (v) => parseInt(v, 10), 30)
176
+ .option('--dry-run', 'Show what would be updated without making changes')
177
+ .option('--no-git', 'Use mtime instead of git for change detection')
178
+ .option('-k, --api-key <key>', 'API key for LLM provider')
179
+ .option('-m, --model <model>', 'Model to use', DEFAULT_MODEL)
180
+ .option('-p, --provider <provider>', 'LLM provider')
181
+ .option('--base-url <url>', 'Custom base URL for API')
182
+ .option('-v, --verbose', 'Verbose output')
183
+ .action(async (repoPath, options) => {
184
+ try {
185
+ const outputDir = path.resolve(options.output || './.context');
186
+ const analysis = await updateService.analyze(repoPath, {
187
+ output: options.output,
188
+ days: options.days,
189
+ useGit: options.git !== false,
190
+ verbose: options.verbose
191
+ });
192
+ updateService.displayAnalysis(analysis);
193
+ if (options.dryRun) {
194
+ return;
195
+ }
196
+ const filesToUpdate = updateService.getFilesToUpdate(analysis);
197
+ if (filesToUpdate.length === 0) {
198
+ return;
199
+ }
200
+ const { proceed } = await inquirer_1.default.prompt([{
201
+ type: 'confirm',
202
+ name: 'proceed',
203
+ message: `Update ${filesToUpdate.length} document(s)?`,
204
+ default: true
205
+ }]);
206
+ if (!proceed) {
207
+ return;
208
+ }
209
+ // Run fill on affected docs
210
+ // Convert absolute paths to relative paths from the output directory
211
+ await fillService.run(repoPath, {
212
+ output: options.output,
213
+ include: filesToUpdate.map(f => path.relative(outputDir, f)),
214
+ model: options.model,
215
+ provider: options.provider,
216
+ apiKey: options.apiKey,
217
+ baseUrl: options.baseUrl,
218
+ verbose: options.verbose,
219
+ semantic: true
220
+ });
221
+ ui.displaySuccess('Documentation updated!');
222
+ }
223
+ catch (error) {
224
+ ui.displayError('Failed to update documentation', error);
225
+ process.exit(1);
226
+ }
227
+ });
152
228
  program
153
229
  .command('plan')
154
230
  .description(t('commands.plan.description'))
@@ -168,6 +244,8 @@ program
168
244
  .option('--include <patterns...>', t('commands.plan.options.include'))
169
245
  .option('--exclude <patterns...>', t('commands.plan.options.exclude'))
170
246
  .option('-v, --verbose', t('commands.plan.options.verbose'))
247
+ .option('--no-semantic', t('commands.plan.options.noSemantic'))
248
+ .option('--no-lsp', t('commands.plan.options.noLsp'))
171
249
  .action(async (planName, rawOptions) => {
172
250
  const outputDir = path.resolve(rawOptions.output || './.context');
173
251
  if (rawOptions.fill) {
@@ -195,10 +273,12 @@ program
195
273
  title: rawOptions.title,
196
274
  summary: rawOptions.summary,
197
275
  force: Boolean(rawOptions.force),
198
- verbose: Boolean(rawOptions.verbose)
276
+ verbose: Boolean(rawOptions.verbose),
277
+ semantic: rawOptions.semantic !== false,
278
+ projectPath: rawOptions.repo ? path.resolve(rawOptions.repo) : path.resolve(rawOptions.output || './.context', '..')
199
279
  });
200
280
  ui.updateSpinner(t('spinner.plan.created'), 'success');
201
- ui.displaySuccess(t('success.plan.createdAt', { path: chalk_1.default.cyan(result.relativePath) }));
281
+ ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
202
282
  }
203
283
  catch (error) {
204
284
  ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
@@ -209,6 +289,75 @@ program
209
289
  ui.stopSpinner();
210
290
  }
211
291
  });
292
+ program
293
+ .command('sync-agents')
294
+ .description(t('commands.sync.description'))
295
+ .option('-s, --source <dir>', t('commands.sync.options.source'), './.context/agents')
296
+ .option('-t, --target <paths...>', t('commands.sync.options.target'))
297
+ .option('-m, --mode <type>', t('commands.sync.options.mode'), 'symlink')
298
+ .option('-p, --preset <name>', t('commands.sync.options.preset'))
299
+ .option('--force', t('commands.sync.options.force'))
300
+ .option('--dry-run', t('commands.sync.options.dryRun'))
301
+ .option('-v, --verbose', t('commands.sync.options.verbose'))
302
+ .action(async (options) => {
303
+ try {
304
+ await syncService.run(options);
305
+ }
306
+ catch (error) {
307
+ ui.displayError(t('errors.sync.failed'), error);
308
+ process.exit(1);
309
+ }
310
+ });
311
+ program
312
+ .command('serve')
313
+ .description('Start passthrough server for external AI agents (stdin/stdout JSON)')
314
+ .option('-r, --repo-path <path>', 'Default repository path for tools')
315
+ .option('-f, --format <format>', 'Output format: json or jsonl', 'jsonl')
316
+ .option('-v, --verbose', 'Enable verbose logging to stderr')
317
+ .action(async (options) => {
318
+ const service = new serve_1.ServeService({
319
+ repoPath: options.repoPath,
320
+ format: options.format,
321
+ verbose: options.verbose
322
+ });
323
+ try {
324
+ await service.run();
325
+ }
326
+ catch (error) {
327
+ if (options.verbose) {
328
+ process.stderr.write(`[serve] Error: ${error}\n`);
329
+ }
330
+ process.exit(1);
331
+ }
332
+ });
333
+ program
334
+ .command('mcp')
335
+ .description('Start MCP (Model Context Protocol) server for Claude Code integration')
336
+ .option('-r, --repo-path <path>', 'Default repository path for tools')
337
+ .option('-v, --verbose', 'Enable verbose logging to stderr')
338
+ .action(async (options) => {
339
+ try {
340
+ const server = await (0, mcp_1.startMCPServer)({
341
+ repoPath: options.repoPath,
342
+ verbose: options.verbose
343
+ });
344
+ // Handle graceful shutdown
345
+ process.on('SIGINT', async () => {
346
+ await server.stop();
347
+ process.exit(0);
348
+ });
349
+ process.on('SIGTERM', async () => {
350
+ await server.stop();
351
+ process.exit(0);
352
+ });
353
+ }
354
+ catch (error) {
355
+ if (options.verbose) {
356
+ process.stderr.write(`[mcp] Error: ${error}\n`);
357
+ }
358
+ process.exit(1);
359
+ }
360
+ });
212
361
  async function runInit(repoPath, type, rawOptions) {
213
362
  await initService.run(repoPath, type, rawOptions);
214
363
  }
@@ -255,27 +404,150 @@ async function selectLocale(showWelcome) {
255
404
  currentLocale = normalizedLocale;
256
405
  translateFn = (0, i18n_1.createTranslator)(normalizedLocale);
257
406
  if (showWelcome) {
258
- ui.displayWelcome(VERSION);
407
+ ui.displayWelcome(version_1.VERSION);
259
408
  }
260
409
  }
261
410
  async function runInteractive() {
262
411
  await selectLocale(true);
263
- let exitRequested = false;
264
- while (!exitRequested) {
412
+ const projectPath = process.cwd();
413
+ const detector = new state_1.StateDetector({ projectPath });
414
+ const result = await detector.detect();
415
+ // Display project info
416
+ console.log('');
417
+ ui.displayInfo(`${version_1.PACKAGE_NAME} v${version_1.VERSION}`, `Project: ${projectPath}`);
418
+ // Show state-specific information
419
+ switch (result.state) {
420
+ case 'new':
421
+ console.log(theme_1.colors.secondaryDim(' No context documentation found.\n'));
422
+ break;
423
+ case 'unfilled':
424
+ console.log(theme_1.colors.secondaryDim(` Context: ${result.details.unfilledFiles} files need filling\n`));
425
+ break;
426
+ case 'outdated':
427
+ console.log(theme_1.colors.warning(` Code modified ${result.details.daysBehind} day(s) ago (docs not updated)\n`));
428
+ break;
429
+ case 'ready':
430
+ console.log(theme_1.colors.success(` Context: ${result.details.totalFiles} docs, all up to date\n`));
431
+ break;
432
+ }
433
+ // Handle state-based flow
434
+ if (result.state === 'new') {
265
435
  const { action } = await inquirer_1.default.prompt([
266
436
  {
267
437
  type: 'list',
268
438
  name: 'action',
269
439
  message: t('prompts.main.action'),
270
440
  choices: [
271
- { name: t('prompts.main.choice.scaffold'), value: 'scaffold' },
441
+ { name: t('prompts.main.choice.create'), value: 'create' },
442
+ { name: t('prompts.main.choice.exit'), value: 'exit' }
443
+ ]
444
+ }
445
+ ]);
446
+ if (action === 'create') {
447
+ // Run init + fill automatically
448
+ await runQuickSetup(projectPath);
449
+ }
450
+ return;
451
+ }
452
+ if (result.state === 'unfilled') {
453
+ const { action } = await inquirer_1.default.prompt([
454
+ {
455
+ type: 'list',
456
+ name: 'action',
457
+ message: t('prompts.main.unfilledPrompt', { count: result.details.unfilledFiles }),
458
+ choices: [
272
459
  { name: t('prompts.main.choice.fill'), value: 'fill' },
273
- { name: t('prompts.main.choice.plan'), value: 'plan' },
274
- { name: t('prompts.main.choice.changeLanguage'), value: 'changeLanguage' },
460
+ { name: t('prompts.main.choice.moreOptions'), value: 'menu' },
275
461
  { name: t('prompts.main.choice.exit'), value: 'exit' }
276
462
  ]
277
463
  }
278
464
  ]);
465
+ if (action === 'fill') {
466
+ await runInteractiveLlmFill();
467
+ return;
468
+ }
469
+ else if (action === 'menu') {
470
+ await runFullMenu();
471
+ }
472
+ return;
473
+ }
474
+ // For 'ready' or 'outdated' states, show full menu
475
+ await runFullMenu(result.state === 'outdated' ? result.details.daysBehind : undefined);
476
+ }
477
+ async function runQuickSetup(projectPath) {
478
+ const { confirm } = await inquirer_1.default.prompt([
479
+ {
480
+ type: 'confirm',
481
+ name: 'confirm',
482
+ message: t('prompts.setup.confirmContinue'),
483
+ default: true
484
+ }
485
+ ]);
486
+ if (!confirm) {
487
+ return;
488
+ }
489
+ // Run init
490
+ ui.startSpinner(t('spinner.setup.creatingStructure'));
491
+ try {
492
+ const initService = new initService_1.InitService({ ui, t, version: version_1.VERSION });
493
+ await initService.run(projectPath, 'both', {
494
+ semantic: true
495
+ });
496
+ ui.stopSpinner();
497
+ }
498
+ catch (error) {
499
+ ui.stopSpinner();
500
+ ui.displayError('Failed to create structure', error);
501
+ return;
502
+ }
503
+ // Prompt for LLM config and run fill
504
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t);
505
+ if (!llmConfig) {
506
+ ui.displayInfo(t('info.setup.incomplete.title'), t('info.setup.incomplete.detail'));
507
+ return;
508
+ }
509
+ ui.startSpinner(t('spinner.setup.fillingDocs'));
510
+ try {
511
+ const fillService = new fillService_1.FillService({ ui, t, version: version_1.VERSION, defaultModel: DEFAULT_MODEL });
512
+ await fillService.run(projectPath, {
513
+ model: llmConfig.model,
514
+ provider: llmConfig.provider,
515
+ apiKey: llmConfig.apiKey,
516
+ baseUrl: llmConfig.baseUrl,
517
+ verbose: false,
518
+ semantic: true
519
+ });
520
+ ui.stopSpinner();
521
+ ui.displaySuccess(t('success.setup.docsCreated'));
522
+ console.log(theme_1.colors.secondaryDim(` ${t('info.setup.reviewFiles')}`));
523
+ }
524
+ catch (error) {
525
+ ui.stopSpinner();
526
+ ui.displayError('Failed to fill documentation', error);
527
+ }
528
+ }
529
+ async function runFullMenu(daysBehind) {
530
+ let exitRequested = false;
531
+ while (!exitRequested) {
532
+ const updateLabel = daysBehind
533
+ ? t('prompts.main.choice.updateDocsBehind', { daysBehind })
534
+ : t('prompts.main.choice.updateDocs');
535
+ const choices = [
536
+ { name: t('prompts.main.choice.plan'), value: 'plan' },
537
+ { name: updateLabel, value: 'fill' },
538
+ { name: t('prompts.main.choice.syncAgents'), value: 'syncAgents' },
539
+ { name: t('prompts.main.choice.rescaffold'), value: 'scaffold' },
540
+ { name: t('prompts.main.choice.changeLanguage'), value: 'changeLanguage' },
541
+ { name: t('prompts.main.choice.exit'), value: 'exit' }
542
+ ];
543
+ const { action } = await inquirer_1.default.prompt([
544
+ {
545
+ type: 'list',
546
+ name: 'action',
547
+ message: t('prompts.main.action'),
548
+ choices
549
+ }
550
+ ]);
279
551
  if (action === 'changeLanguage') {
280
552
  await selectLocale(true);
281
553
  continue;
@@ -290,9 +562,12 @@ async function runInteractive() {
290
562
  else if (action === 'fill') {
291
563
  await runInteractiveLlmFill();
292
564
  }
293
- else {
565
+ else if (action === 'plan') {
294
566
  await runInteractivePlan();
295
567
  }
568
+ else if (action === 'syncAgents') {
569
+ await runInteractiveSync();
570
+ }
296
571
  ui.displayInfo(t('info.interactive.returning.title'), t('info.interactive.returning.detail'));
297
572
  }
298
573
  ui.displaySuccess(t('success.interactive.goodbye'));
@@ -339,16 +614,65 @@ async function runInteractiveScaffold() {
339
614
  ]);
340
615
  await runInit(resolvedRepo, scaffoldType, {
341
616
  output: outputDir,
342
- verbose
617
+ verbose,
618
+ semantic: true
343
619
  });
344
620
  }
345
621
  async function runInteractiveLlmFill() {
622
+ const defaults = await (0, prompts_1.detectSmartDefaults)();
623
+ const interactiveMode = await (0, prompts_1.promptInteractiveMode)(t);
624
+ if (interactiveMode === 'quick') {
625
+ // Quick mode: minimal prompts with smart defaults
626
+ const { confirmRepo } = await inquirer_1.default.prompt([
627
+ {
628
+ type: 'confirm',
629
+ name: 'confirmRepo',
630
+ message: `${t('prompts.quick.confirmRepo')} (${defaults.repoPath})`,
631
+ default: true
632
+ }
633
+ ]);
634
+ const resolvedRepo = confirmRepo ? defaults.repoPath : (await inquirer_1.default.prompt([
635
+ { type: 'input', name: 'repoPath', message: t('prompts.fill.repoPath'), default: defaults.repoPath }
636
+ ])).repoPath;
637
+ // Get LLM config (auto-detected or prompt for API key)
638
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: true });
639
+ // Build summary
640
+ const summary = {
641
+ operation: 'fill',
642
+ repoPath: resolvedRepo,
643
+ outputDir: defaults.outputDir,
644
+ provider: llmConfig.provider,
645
+ model: llmConfig.model,
646
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
647
+ options: {
648
+ Semantic: true,
649
+ Languages: defaults.detectedLanguages.join(', '),
650
+ LSP: false
651
+ }
652
+ };
653
+ (0, prompts_1.displayConfigSummary)(summary, t);
654
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
655
+ if (proceed) {
656
+ await fillService.run(resolvedRepo, {
657
+ output: defaults.outputDir,
658
+ model: llmConfig.model,
659
+ provider: llmConfig.provider,
660
+ apiKey: llmConfig.apiKey,
661
+ verbose: false,
662
+ semantic: true,
663
+ languages: defaults.detectedLanguages,
664
+ useLsp: false
665
+ });
666
+ }
667
+ return;
668
+ }
669
+ // Advanced mode: full configuration
346
670
  const { repoPath } = await inquirer_1.default.prompt([
347
671
  {
348
672
  type: 'input',
349
673
  name: 'repoPath',
350
674
  message: t('prompts.fill.repoPath'),
351
- default: process.cwd()
675
+ default: defaults.repoPath
352
676
  }
353
677
  ]);
354
678
  const resolvedRepo = path.resolve(repoPath.trim() || '.');
@@ -378,75 +702,154 @@ async function runInteractiveLlmFill() {
378
702
  ]);
379
703
  const limitValue = limit ? parseInt(limit, 10) : undefined;
380
704
  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
705
+ // Use shared LLM prompt helper
706
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: false });
707
+ // Use shared analysis options prompt
708
+ const analysisOptions = await (0, prompts_1.promptAnalysisOptions)(t, {
709
+ languages: defaults.detectedLanguages,
710
+ useLsp: false
711
+ });
712
+ // Show summary before execution
713
+ const summary = {
714
+ operation: 'fill',
715
+ repoPath: resolvedRepo,
716
+ outputDir,
717
+ provider: llmConfig.provider,
718
+ model: llmConfig.model,
719
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
720
+ options: {
721
+ Semantic: analysisOptions.semantic,
722
+ Languages: analysisOptions.languages?.join(', ') || 'none',
723
+ LSP: analysisOptions.useLsp,
724
+ Verbose: analysisOptions.verbose,
725
+ ...(parsedLimit ? { Limit: String(parsedLimit) } : {})
387
726
  }
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';
727
+ };
728
+ (0, prompts_1.displayConfigSummary)(summary, t);
729
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
730
+ if (proceed) {
731
+ await fillService.run(resolvedRepo, {
732
+ output: outputDir,
733
+ prompt: promptPath,
734
+ limit: parsedLimit,
735
+ model: llmConfig.model,
736
+ provider: llmConfig.provider,
737
+ apiKey: llmConfig.apiKey,
738
+ verbose: analysisOptions.verbose,
739
+ semantic: analysisOptions.semantic,
740
+ languages: analysisOptions.languages,
741
+ useLsp: analysisOptions.useLsp
742
+ });
402
743
  }
403
- const { provideApiKey } = await inquirer_1.default.prompt([
744
+ }
745
+ function generatePlanSlug(goal) {
746
+ return goal
747
+ .toLowerCase()
748
+ .replace(/[àáâãäå]/g, 'a')
749
+ .replace(/[èéêë]/g, 'e')
750
+ .replace(/[ìíîï]/g, 'i')
751
+ .replace(/[òóôõö]/g, 'o')
752
+ .replace(/[ùúûü]/g, 'u')
753
+ .replace(/[ç]/g, 'c')
754
+ .replace(/[ñ]/g, 'n')
755
+ .replace(/[^a-z0-9\s-]/g, '')
756
+ .trim()
757
+ .replace(/\s+/g, '-')
758
+ .replace(/-+/g, '-')
759
+ .substring(0, 50)
760
+ .replace(/-$/, '') || 'new-plan';
761
+ }
762
+ async function runInteractivePlan() {
763
+ const defaults = await (0, prompts_1.detectSmartDefaults)();
764
+ // Ask what should be planned
765
+ const { planGoal } = await inquirer_1.default.prompt([
404
766
  {
405
- type: 'confirm',
406
- name: 'provideApiKey',
407
- message: t('prompts.fill.provideApiKey'),
408
- default: false
767
+ type: 'input',
768
+ name: 'planGoal',
769
+ message: t('prompts.plan.goal'),
770
+ validate: (input) => input.trim().length > 0 || 'Please describe what should be planned'
409
771
  }
410
772
  ]);
411
- let apiKey;
412
- if (provideApiKey) {
413
- const apiKeyAnswer = await inquirer_1.default.prompt([
773
+ const planName = generatePlanSlug(planGoal);
774
+ const planSummary = planGoal;
775
+ const interactiveMode = await (0, prompts_1.promptInteractiveMode)(t);
776
+ if (interactiveMode === 'quick') {
777
+ // Quick mode: choose scaffold or fill with defaults
778
+ const { action } = await inquirer_1.default.prompt([
414
779
  {
415
- type: 'password',
416
- name: 'apiKey',
417
- message: t('prompts.fill.apiKey'),
418
- mask: '*'
780
+ type: 'list',
781
+ name: 'action',
782
+ message: t('prompts.plan.mode'),
783
+ choices: [
784
+ { name: t('prompts.plan.modeScaffold'), value: 'scaffold' },
785
+ { name: t('prompts.plan.modeFill'), value: 'fill' }
786
+ ],
787
+ default: 'scaffold'
419
788
  }
420
789
  ]);
421
- apiKey = apiKeyAnswer.apiKey.trim();
422
- }
423
- const { verbose } = await inquirer_1.default.prompt([
424
- {
425
- type: 'confirm',
426
- name: 'verbose',
427
- message: t('prompts.common.verbose'),
428
- default: false
790
+ if (action === 'scaffold') {
791
+ // Quick scaffold: just create the template
792
+ const generator = new planGenerator_1.PlanGenerator();
793
+ ui.startSpinner(t('spinner.plan.creating'));
794
+ try {
795
+ const result = await generator.generatePlan({
796
+ planName,
797
+ summary: planSummary,
798
+ outputDir: defaults.outputDir,
799
+ verbose: false,
800
+ semantic: true,
801
+ projectPath: defaults.repoPath
802
+ });
803
+ ui.updateSpinner(t('spinner.plan.created'), 'success');
804
+ ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
805
+ }
806
+ catch (error) {
807
+ ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
808
+ ui.displayError(t('errors.plan.creationFailed'), error);
809
+ }
810
+ finally {
811
+ ui.stopSpinner();
812
+ }
813
+ return;
429
814
  }
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
- }
441
- async function runInteractivePlan() {
442
- const { planName } = await inquirer_1.default.prompt([
443
- {
444
- type: 'input',
445
- name: 'planName',
446
- message: t('prompts.plan.name'),
447
- default: 'new-plan'
815
+ // Quick fill: use auto-detected LLM config
816
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: true });
817
+ const configSummary = {
818
+ operation: 'plan',
819
+ repoPath: defaults.repoPath,
820
+ outputDir: defaults.outputDir,
821
+ provider: llmConfig.provider,
822
+ model: llmConfig.model,
823
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
824
+ options: {
825
+ Goal: planSummary,
826
+ 'File': `${planName}.md`,
827
+ LSP: true,
828
+ 'Dry Run': false
829
+ }
830
+ };
831
+ (0, prompts_1.displayConfigSummary)(configSummary, t);
832
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
833
+ if (proceed) {
834
+ try {
835
+ await planService.scaffoldPlanIfNeeded(planName, defaults.outputDir, { summary: planSummary });
836
+ await planService.fillPlan(planName, {
837
+ output: defaults.outputDir,
838
+ repo: defaults.repoPath,
839
+ dryRun: false,
840
+ provider: llmConfig.provider,
841
+ model: llmConfig.model,
842
+ apiKey: llmConfig.apiKey,
843
+ lsp: true
844
+ });
845
+ }
846
+ catch (error) {
847
+ ui.displayError(t('errors.plan.fillFailed'), error);
848
+ }
448
849
  }
449
- ]);
850
+ return;
851
+ }
852
+ // Advanced mode: full configuration
450
853
  const defaultOutput = path.resolve(process.cwd(), '.context');
451
854
  const { mode } = await inquirer_1.default.prompt([
452
855
  {
@@ -469,14 +872,6 @@ async function runInteractivePlan() {
469
872
  }
470
873
  ]);
471
874
  if (mode === 'fill') {
472
- const { summary } = await inquirer_1.default.prompt([
473
- {
474
- type: 'input',
475
- name: 'summary',
476
- message: t('prompts.plan.summary'),
477
- filter: (value) => value.trim()
478
- }
479
- ]);
480
875
  const { repoPath } = await inquirer_1.default.prompt([
481
876
  {
482
877
  type: 'input',
@@ -485,6 +880,8 @@ async function runInteractivePlan() {
485
880
  default: process.cwd()
486
881
  }
487
882
  ]);
883
+ // Use shared LLM prompt helper
884
+ const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: false });
488
885
  const { dryRun } = await inquirer_1.default.prompt([
489
886
  {
490
887
  type: 'confirm',
@@ -493,41 +890,67 @@ async function runInteractivePlan() {
493
890
  default: true
494
891
  }
495
892
  ]);
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);
893
+ const { useLsp } = await inquirer_1.default.prompt([
894
+ {
895
+ type: 'confirm',
896
+ name: 'useLsp',
897
+ message: t('prompts.plan.useLsp'),
898
+ default: true
899
+ }
900
+ ]);
901
+ // Show summary before execution
902
+ const advancedConfigSummary = {
903
+ operation: 'plan',
904
+ repoPath,
905
+ outputDir,
906
+ provider: llmConfig.provider,
907
+ model: llmConfig.model,
908
+ apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
909
+ options: {
910
+ Goal: planSummary,
911
+ 'File': `${planName}.md`,
912
+ LSP: useLsp,
913
+ 'Dry Run': dryRun
914
+ }
915
+ };
916
+ (0, prompts_1.displayConfigSummary)(advancedConfigSummary, t);
917
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
918
+ if (proceed) {
919
+ try {
920
+ const resolvedOutput = path.resolve(outputDir.trim() || defaultOutput);
921
+ await planService.scaffoldPlanIfNeeded(planName, resolvedOutput, {
922
+ summary: planSummary
923
+ });
924
+ await planService.fillPlan(planName, {
925
+ output: resolvedOutput,
926
+ repo: repoPath,
927
+ dryRun,
928
+ provider: llmConfig.provider,
929
+ model: llmConfig.model,
930
+ apiKey: llmConfig.apiKey,
931
+ lsp: useLsp
932
+ });
933
+ }
934
+ catch (error) {
935
+ ui.displayError(t('errors.plan.fillFailed'), error);
936
+ }
509
937
  }
510
938
  return;
511
939
  }
512
- const { summary } = await inquirer_1.default.prompt([
513
- {
514
- type: 'input',
515
- name: 'summary',
516
- message: t('prompts.plan.summary'),
517
- filter: (value) => value.trim()
518
- }
519
- ]);
940
+ // Scaffold mode - use planSummary from goal input
520
941
  const generator = new planGenerator_1.PlanGenerator();
521
942
  ui.startSpinner(t('spinner.plan.creating'));
522
943
  try {
523
944
  const result = await generator.generatePlan({
524
945
  planName,
525
946
  outputDir: path.resolve(outputDir.trim() || defaultOutput),
526
- summary: summary || undefined,
527
- verbose: false
947
+ summary: planSummary,
948
+ verbose: false,
949
+ semantic: true,
950
+ projectPath: path.resolve(outputDir.trim() || defaultOutput, '..')
528
951
  });
529
952
  ui.updateSpinner(t('spinner.plan.created'), 'success');
530
- ui.displaySuccess(t('success.plan.createdAt', { path: chalk_1.default.cyan(result.relativePath) }));
953
+ ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
531
954
  }
532
955
  catch (error) {
533
956
  ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
@@ -537,6 +960,82 @@ async function runInteractivePlan() {
537
960
  ui.stopSpinner();
538
961
  }
539
962
  }
963
+ async function runInteractiveSync() {
964
+ const defaults = await (0, prompts_1.detectSmartDefaults)();
965
+ const defaultSource = path.resolve(defaults.repoPath, '.context/agents');
966
+ // Simplified: single prompt for target selection with common presets
967
+ const { quickTarget } = await inquirer_1.default.prompt([
968
+ {
969
+ type: 'list',
970
+ name: 'quickTarget',
971
+ message: t('prompts.sync.quickTarget'),
972
+ choices: [
973
+ { name: t('prompts.sync.quickTarget.common'), value: 'common' },
974
+ { name: t('prompts.sync.quickTarget.claude'), value: 'claude' },
975
+ { name: t('prompts.sync.quickTarget.all'), value: 'all' },
976
+ { name: t('prompts.sync.quickTarget.custom'), value: 'custom' }
977
+ ],
978
+ default: 'common'
979
+ }
980
+ ]);
981
+ let preset;
982
+ let target;
983
+ let sourcePath = defaultSource;
984
+ if (quickTarget === 'custom') {
985
+ // Custom path: ask for source and target
986
+ const answers = await inquirer_1.default.prompt([
987
+ {
988
+ type: 'input',
989
+ name: 'sourcePath',
990
+ message: t('prompts.sync.source'),
991
+ default: defaultSource
992
+ },
993
+ {
994
+ type: 'input',
995
+ name: 'customPath',
996
+ message: t('prompts.sync.customPath')
997
+ }
998
+ ]);
999
+ sourcePath = answers.sourcePath;
1000
+ target = [answers.customPath];
1001
+ }
1002
+ else if (quickTarget === 'common') {
1003
+ // Common: Claude + GitHub - use explicit target paths instead of preset
1004
+ target = [
1005
+ path.resolve(defaults.repoPath, '.claude/agents'),
1006
+ path.resolve(defaults.repoPath, '.github/agents')
1007
+ ];
1008
+ }
1009
+ else {
1010
+ preset = quickTarget;
1011
+ }
1012
+ // Show summary
1013
+ const summary = {
1014
+ operation: 'sync',
1015
+ repoPath: sourcePath,
1016
+ options: {
1017
+ Target: quickTarget === 'custom' ? (target?.[0] || 'custom') : quickTarget,
1018
+ Mode: 'symlink'
1019
+ }
1020
+ };
1021
+ (0, prompts_1.displayConfigSummary)(summary, t);
1022
+ const proceed = await (0, prompts_1.promptConfirmProceed)(t);
1023
+ if (proceed) {
1024
+ try {
1025
+ await syncService.run({
1026
+ source: sourcePath,
1027
+ mode: 'symlink',
1028
+ preset: preset,
1029
+ target,
1030
+ force: false,
1031
+ dryRun: false
1032
+ });
1033
+ }
1034
+ catch (error) {
1035
+ ui.displayError(t('errors.sync.failed'), error);
1036
+ }
1037
+ }
1038
+ }
540
1039
  function filterOutLocaleArgs(args) {
541
1040
  const filtered = [];
542
1041
  for (let index = 0; index < args.length; index += 1) {
@@ -562,10 +1061,43 @@ async function main() {
562
1061
  }
563
1062
  await program.parseAsync(process.argv);
564
1063
  }
1064
+ /**
1065
+ * Check if an error is from user interrupt (Ctrl+C)
1066
+ */
1067
+ function isUserInterrupt(error) {
1068
+ if (error instanceof Error) {
1069
+ // Inquirer's ExitPromptError when user presses Ctrl+C
1070
+ if (error.name === 'ExitPromptError')
1071
+ return true;
1072
+ // Check message patterns
1073
+ if (error.message.includes('force closed'))
1074
+ return true;
1075
+ if (error.message.includes('User force closed'))
1076
+ return true;
1077
+ }
1078
+ return false;
1079
+ }
1080
+ /**
1081
+ * Handle graceful exit
1082
+ */
1083
+ function handleGracefulExit() {
1084
+ console.log('');
1085
+ ui.displaySuccess(t('success.interactive.goodbye'));
1086
+ process.exit(0);
1087
+ }
1088
+ // Handle SIGINT (Ctrl+C) at process level
1089
+ process.on('SIGINT', () => {
1090
+ handleGracefulExit();
1091
+ });
565
1092
  if (require.main === module) {
566
1093
  main().catch(error => {
567
- ui.displayError(t('errors.cli.executionFailed'), error);
568
- process.exit(1);
1094
+ if (isUserInterrupt(error)) {
1095
+ handleGracefulExit();
1096
+ }
1097
+ else {
1098
+ ui.displayError(t('errors.cli.executionFailed'), error);
1099
+ process.exit(1);
1100
+ }
569
1101
  });
570
1102
  }
571
1103
  //# sourceMappingURL=index.js.map