scai 0.1.178 → 1.0.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 (770) hide show
  1. package/README.md +162 -267
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Covers eval batch summary helpers without running the full eval harness.
3
+ *
4
+ * Why this file exists:
5
+ * - batch result accounting should stay correct even when runs fail partway through
6
+ * - summary output and saved summary artifacts should come from the same data
7
+ */
8
+ import fs from "fs";
9
+ import os from "os";
10
+ import path from "path";
11
+ import { describe, expect, it } from "vitest";
12
+ import { assertEvalSummaryInvariant, buildEvalBatchSummary, formatEvalSummaryLine, writeEvalBatchSummaryArtifact, } from "../commands/evalCommands.js";
13
+ describe("evalCommands summary helpers", () => {
14
+ it("counts incomplete evals in the final batch summary", () => {
15
+ const outcomesById = new Map([
16
+ ["pass", { kind: "passed", applicable: true, failures: [] }],
17
+ ["fail", { kind: "failed", applicable: true, failures: ["oops"] }],
18
+ ["skip", { kind: "skipped", applicable: false, failures: ["not applicable"] }],
19
+ ["pending", { kind: "incomplete", applicable: true, failures: ["eval did not finish"] }],
20
+ ]);
21
+ const summary = buildEvalBatchSummary(outcomesById);
22
+ expect(summary).toEqual({
23
+ total: 4,
24
+ applicable: 3,
25
+ completed: 2,
26
+ passed: 1,
27
+ failed: 1,
28
+ skipped: 1,
29
+ incomplete: 1,
30
+ });
31
+ expect(() => assertEvalSummaryInvariant(summary)).not.toThrow();
32
+ });
33
+ it("formats the printed summary from the same totals used on disk", () => {
34
+ const summary = {
35
+ total: 4,
36
+ applicable: 3,
37
+ completed: 2,
38
+ passed: 1,
39
+ failed: 1,
40
+ skipped: 1,
41
+ incomplete: 1,
42
+ };
43
+ expect(formatEvalSummaryLine(summary, "12.3")).toContain("[EVAL SUMMARY] total=4, applicable=3, completed=2, passed=1, failed=1, skipped=1, incomplete=1, duration=12.3s");
44
+ });
45
+ it("writes the same batch summary numbers to one saved artifact", () => {
46
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "scai-eval-batch-summary-"));
47
+ try {
48
+ const outcomesById = new Map([
49
+ ["pass", { kind: "passed", applicable: true, failures: [], artifactDir: "/tmp/pass" }],
50
+ ["pending", { kind: "incomplete", applicable: true, failures: ["eval did not finish"] }],
51
+ ]);
52
+ const summary = buildEvalBatchSummary(outcomesById);
53
+ const outputPath = writeEvalBatchSummaryArtifact(tempDir, {
54
+ selectedEvalIds: ["pass", "pending"],
55
+ summary,
56
+ outcomesById,
57
+ durationSec: "45.6",
58
+ });
59
+ const written = JSON.parse(fs.readFileSync(outputPath, "utf8"));
60
+ expect(written.summary).toEqual(summary);
61
+ expect(written.outcomes.pending.kind).toBe("incomplete");
62
+ }
63
+ finally {
64
+ fs.rmSync(tempDir, { recursive: true, force: true });
65
+ }
66
+ });
67
+ });
68
+ //# sourceMappingURL=evalCommandsSummary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evalCommandsSummary.test.js","sourceRoot":"","sources":["../../src/__tests__/evalCommandsSummary.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers eval batch summary helpers without running the full eval harness.\n *\n * Why this file exists:\n * - batch result accounting should stay correct even when runs fail partway through\n * - summary output and saved summary artifacts should come from the same data\n */\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport {\n type EvalOutcomeRecord,\n assertEvalSummaryInvariant,\n buildEvalBatchSummary,\n formatEvalSummaryLine,\n writeEvalBatchSummaryArtifact,\n} from \"../commands/evalCommands.js\";\n\ndescribe(\"evalCommands summary helpers\", () => {\n it(\"counts incomplete evals in the final batch summary\", () => {\n const outcomesById = new Map<string, EvalOutcomeRecord>([\n [\"pass\", { kind: \"passed\", applicable: true, failures: [] }],\n [\"fail\", { kind: \"failed\", applicable: true, failures: [\"oops\"] }],\n [\"skip\", { kind: \"skipped\", applicable: false, failures: [\"not applicable\"] }],\n [\"pending\", { kind: \"incomplete\", applicable: true, failures: [\"eval did not finish\"] }],\n ]);\n\n const summary = buildEvalBatchSummary(outcomesById);\n\n expect(summary).toEqual({\n total: 4,\n applicable: 3,\n completed: 2,\n passed: 1,\n failed: 1,\n skipped: 1,\n incomplete: 1,\n });\n expect(() => assertEvalSummaryInvariant(summary)).not.toThrow();\n });\n\n it(\"formats the printed summary from the same totals used on disk\", () => {\n const summary = {\n total: 4,\n applicable: 3,\n completed: 2,\n passed: 1,\n failed: 1,\n skipped: 1,\n incomplete: 1,\n };\n\n expect(formatEvalSummaryLine(summary, \"12.3\")).toContain(\n \"[EVAL SUMMARY] total=4, applicable=3, completed=2, passed=1, failed=1, skipped=1, incomplete=1, duration=12.3s\"\n );\n });\n\n it(\"writes the same batch summary numbers to one saved artifact\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-eval-batch-summary-\"));\n try {\n const outcomesById = new Map<string, EvalOutcomeRecord>([\n [\"pass\", { kind: \"passed\", applicable: true, failures: [], artifactDir: \"/tmp/pass\" }],\n [\"pending\", { kind: \"incomplete\", applicable: true, failures: [\"eval did not finish\"] }],\n ]);\n const summary = buildEvalBatchSummary(outcomesById);\n\n const outputPath = writeEvalBatchSummaryArtifact(tempDir, {\n selectedEvalIds: [\"pass\", \"pending\"],\n summary,\n outcomesById,\n durationSec: \"45.6\",\n });\n\n const written = JSON.parse(fs.readFileSync(outputPath, \"utf8\")) as {\n summary: typeof summary;\n outcomes: Record<string, { kind: string }>;\n };\n expect(written.summary).toEqual(summary);\n expect(written.outcomes.pending.kind).toBe(\"incomplete\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n});\n"]}
@@ -8,3 +8,4 @@ describe("CLI src basic test", () => {
8
8
  expect(typeof SCAI_HOME).not.toBe("undefined");
9
9
  });
10
10
  });
11
+ //# sourceMappingURL=example.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.test.js","sourceRoot":"","sources":["../../src/__tests__/example.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC,CAAC,mBAAmB;AAE7D,oCAAoC;AACpC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["import { SCAI_HOME } from \"../constants\"; // example constant\r\n\r\n// cli/src/__tests__/example.test.ts\r\ndescribe(\"CLI src basic test\", () => {\r\n it(\"should pass a simple truthy test\", () => {\r\n expect(true).toBe(true);\r\n });\r\n\r\n it(\"should import a constant from cli/src/constants.ts\", () => {\r\n expect(typeof SCAI_HOME).not.toBe(\"undefined\");\r\n });\r\n});\r\n"]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Verifies commit command registration and git review visibility rules.
3
+ *
4
+ * Why this file exists:
5
+ * - `scai commit` should be the main public path for commit suggestions
6
+ * - `scai git commit` should stay available as a compatibility alias
7
+ * - `git review` should stay hidden unless dev commands are enabled
8
+ */
9
+ import { beforeEach, describe, expect, it, vi } from "vitest";
10
+ describe("factory commit command registration", () => {
11
+ beforeEach(() => {
12
+ vi.resetModules();
13
+ delete process.env.SCAI_ENABLE_DEV_COMMANDS;
14
+ });
15
+ it("registers top-level commit and git commit without the hidden changelog flag", async () => {
16
+ const { createProgram } = await import("../commands/factory.js");
17
+ const program = createProgram();
18
+ const topLevelCommit = program.commands.find(command => command.name() === "commit");
19
+ const git = program.commands.find(command => command.name() === "git");
20
+ const gitCommit = git?.commands.find(command => command.name() === "commit");
21
+ expect(topLevelCommit?.description()).toBe("Suggest a commit message from staged changes");
22
+ expect(gitCommit?.description()).toBe("Suggest a commit message from staged changes");
23
+ expect(topLevelCommit?.options.some(option => option.long === "--changelog")).toBe(false);
24
+ expect(gitCommit?.options.some(option => option.long === "--changelog")).toBe(false);
25
+ });
26
+ it("keeps git review hidden by default", async () => {
27
+ const { createProgram } = await import("../commands/factory.js");
28
+ const program = createProgram();
29
+ const git = program.commands.find(command => command.name() === "git");
30
+ expect(git?.commands.some(command => command.name() === "review")).toBe(false);
31
+ });
32
+ it("shows git review when dev commands are enabled", async () => {
33
+ process.env.SCAI_ENABLE_DEV_COMMANDS = "1";
34
+ const { createProgram } = await import("../commands/factory.js");
35
+ const program = createProgram();
36
+ const git = program.commands.find(command => command.name() === "git");
37
+ expect(git?.commands.some(command => command.name() === "review")).toBe(true);
38
+ });
39
+ it("shows commit as the advertised path in --help", async () => {
40
+ const { createProgram } = await import("../commands/factory.js");
41
+ const helpText = createProgram().helpInformation();
42
+ expect(helpText).toContain("commit");
43
+ });
44
+ });
45
+ //# sourceMappingURL=factory.commitCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.commitCommand.test.js","sourceRoot":"","sources":["../../src/__tests__/factory.commitCommand.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Verifies commit command registration and git review visibility rules.\n *\n * Why this file exists:\n * - `scai commit` should be the main public path for commit suggestions\n * - `scai git commit` should stay available as a compatibility alias\n * - `git review` should stay hidden unless dev commands are enabled\n */\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\ndescribe(\"factory commit command registration\", () => {\n beforeEach(() => {\n vi.resetModules();\n delete process.env.SCAI_ENABLE_DEV_COMMANDS;\n });\n\n it(\"registers top-level commit and git commit without the hidden changelog flag\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n const program = createProgram();\n\n const topLevelCommit = program.commands.find(command => command.name() === \"commit\");\n const git = program.commands.find(command => command.name() === \"git\");\n const gitCommit = git?.commands.find(command => command.name() === \"commit\");\n\n expect(topLevelCommit?.description()).toBe(\"Suggest a commit message from staged changes\");\n expect(gitCommit?.description()).toBe(\"Suggest a commit message from staged changes\");\n expect(topLevelCommit?.options.some(option => option.long === \"--changelog\")).toBe(false);\n expect(gitCommit?.options.some(option => option.long === \"--changelog\")).toBe(false);\n });\n\n it(\"keeps git review hidden by default\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n const program = createProgram();\n const git = program.commands.find(command => command.name() === \"git\");\n\n expect(git?.commands.some(command => command.name() === \"review\")).toBe(false);\n });\n\n it(\"shows git review when dev commands are enabled\", async () => {\n process.env.SCAI_ENABLE_DEV_COMMANDS = \"1\";\n const { createProgram } = await import(\"../commands/factory.js\");\n const program = createProgram();\n const git = program.commands.find(command => command.name() === \"git\");\n\n expect(git?.commands.some(command => command.name() === \"review\")).toBe(true);\n });\n\n it(\"shows commit as the advertised path in --help\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n const helpText = createProgram().helpInformation();\n\n expect(helpText).toContain(\"commit\");\n });\n});\n"]}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Tests small config command behaviors that only need the command factory path.
3
+ */
4
+ import fs from "fs";
5
+ import os from "os";
6
+ import path from "path";
7
+ import { afterEach, describe, expect, it, vi } from "vitest";
8
+ const ORIGINAL_ENV = { ...process.env };
9
+ function createTempHome() {
10
+ const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "scai-dev-output-command-"));
11
+ process.env.HOME = homeDir;
12
+ process.env.USERPROFILE = homeDir;
13
+ delete process.env.SCAI_SUPPRESS_FINAL_CONTEXT;
14
+ return homeDir;
15
+ }
16
+ afterEach(() => {
17
+ vi.resetModules();
18
+ vi.restoreAllMocks();
19
+ vi.doUnmock("../context.js");
20
+ process.env = { ...ORIGINAL_ENV };
21
+ });
22
+ describe("config dev-output command", () => {
23
+ it("writes repo-local devOutput=false", async () => {
24
+ createTempHome();
25
+ vi.doMock("../context.js", () => ({
26
+ updateContext: vi.fn().mockResolvedValue(true),
27
+ }));
28
+ const { writeConfig, readConfig } = await import("../config.js");
29
+ writeConfig({
30
+ activeRepo: "repo-a",
31
+ repos: {
32
+ "repo-a": {
33
+ indexDir: "/repo-a",
34
+ },
35
+ },
36
+ });
37
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
38
+ const { createProgram } = await import("../commands/factory.js");
39
+ await createProgram().parseAsync(["node", "scai", "config", "dev-output", "off"]);
40
+ const cfg = readConfig();
41
+ expect(cfg.repos["repo-a"]?.devOutput).toBe(false);
42
+ expect(logSpy).toHaveBeenCalledWith("✅ Effective dev output: off");
43
+ });
44
+ it("writes repo-local devOutput=true", async () => {
45
+ createTempHome();
46
+ vi.doMock("../context.js", () => ({
47
+ updateContext: vi.fn().mockResolvedValue(true),
48
+ }));
49
+ const { writeConfig, readConfig } = await import("../config.js");
50
+ writeConfig({
51
+ activeRepo: "repo-a",
52
+ repos: {
53
+ "repo-a": {
54
+ indexDir: "/repo-a",
55
+ },
56
+ },
57
+ });
58
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
59
+ const { createProgram } = await import("../commands/factory.js");
60
+ await createProgram().parseAsync(["node", "scai", "config", "dev-output", "on"]);
61
+ const cfg = readConfig();
62
+ expect(cfg.repos["repo-a"]?.devOutput).toBe(true);
63
+ expect(logSpy).toHaveBeenCalledWith("✅ Effective dev output: on");
64
+ });
65
+ it("accepts true as an alias for on", async () => {
66
+ createTempHome();
67
+ vi.doMock("../context.js", () => ({
68
+ updateContext: vi.fn().mockResolvedValue(true),
69
+ }));
70
+ const { writeConfig, readConfig } = await import("../config.js");
71
+ writeConfig({
72
+ activeRepo: "repo-a",
73
+ repos: {
74
+ "repo-a": {
75
+ indexDir: "/repo-a",
76
+ },
77
+ },
78
+ });
79
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
80
+ const { createProgram } = await import("../commands/factory.js");
81
+ await createProgram().parseAsync(["node", "scai", "config", "dev-output", "true"]);
82
+ const cfg = readConfig();
83
+ expect(cfg.repos["repo-a"]?.devOutput).toBe(true);
84
+ expect(logSpy).toHaveBeenCalledWith("✅ Effective dev output: on");
85
+ });
86
+ it("unloads the previous Ollama model when set-model changes the effective repo model", async () => {
87
+ createTempHome();
88
+ const unloadOllamaModelIfRunning = vi.fn().mockResolvedValue({
89
+ ok: true,
90
+ unloaded: true,
91
+ skipped: false,
92
+ detail: "Model 'granite4.1:30b' was unloaded from Ollama.",
93
+ });
94
+ vi.doMock("../context.js", () => ({
95
+ updateContext: vi.fn().mockResolvedValue(true),
96
+ }));
97
+ vi.doMock("../utils/ollamaService.js", async () => {
98
+ const actual = await vi.importActual("../utils/ollamaService.js");
99
+ return {
100
+ ...actual,
101
+ unloadOllamaModelIfRunning,
102
+ };
103
+ });
104
+ const { writeConfig, readConfig } = await import("../config.js");
105
+ writeConfig({
106
+ activeRepo: "repo-a",
107
+ repos: {
108
+ "repo-a": {
109
+ indexDir: "/repo-a",
110
+ model: "granite4.1:30b",
111
+ },
112
+ },
113
+ });
114
+ vi.spyOn(console, "log").mockImplementation(() => { });
115
+ const { createProgram } = await import("../commands/factory.js");
116
+ await createProgram().parseAsync(["node", "scai", "config", "set-model", "qwen3-coder:30b"]);
117
+ const cfg = readConfig();
118
+ expect(cfg.repos["repo-a"]?.model).toBe("qwen3-coder:30b");
119
+ expect(unloadOllamaModelIfRunning).toHaveBeenCalledWith("granite4.1:30b");
120
+ });
121
+ });
122
+ //# sourceMappingURL=factory.devOutputCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.devOutputCommand.test.js","sourceRoot":"","sources":["../../src/__tests__/factory.devOutputCommand.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,MAAM,YAAY,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAExC,SAAS,cAAc;IACnB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAC/C,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACX,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,EAAE,CAAC,eAAe,EAAE,CAAC;IACrB,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,cAAc,EAAE,CAAC;QACjB,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACjD,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACjE,WAAW,CAAC;YACR,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE;gBACH,QAAQ,EAAE;oBACN,QAAQ,EAAE,SAAS;iBACtB;aACJ;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;QAElF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAC9C,cAAc,EAAE,CAAC;QACjB,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACjD,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACjE,WAAW,CAAC;YACR,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE;gBACH,QAAQ,EAAE;oBACN,QAAQ,EAAE,SAAS;iBACtB;aACJ;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;QAEjF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC7C,cAAc,EAAE,CAAC;QACjB,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACjD,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACjE,WAAW,CAAC;YACR,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE;gBACH,QAAQ,EAAE;oBACN,QAAQ,EAAE,SAAS;iBACtB;aACJ;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAEnF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QAC/F,cAAc,EAAE,CAAC;QACjB,MAAM,0BAA0B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACzD,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,kDAAkD;SAC7D,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACjD,CAAC,CAAC,CAAC;QACJ,EAAE,CAAC,MAAM,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC;YAClE,OAAO;gBACH,GAAG,MAAM;gBACT,0BAA0B;aAC7B,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACjE,WAAW,CAAC;YACR,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE;gBACH,QAAQ,EAAE;oBACN,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE,gBAAgB;iBAC1B;aACJ;SACJ,CAAC,CAAC;QAEH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAE7F,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,CAAC,0BAA0B,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Tests small config command behaviors that only need the command factory path.\n */\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\n\nconst ORIGINAL_ENV = { ...process.env };\n\nfunction createTempHome(): string {\n const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-dev-output-command-\"));\n process.env.HOME = homeDir;\n process.env.USERPROFILE = homeDir;\n delete process.env.SCAI_SUPPRESS_FINAL_CONTEXT;\n return homeDir;\n}\n\nafterEach(() => {\n vi.resetModules();\n vi.restoreAllMocks();\n vi.doUnmock(\"../context.js\");\n process.env = { ...ORIGINAL_ENV };\n});\n\ndescribe(\"config dev-output command\", () => {\n it(\"writes repo-local devOutput=false\", async () => {\n createTempHome();\n vi.doMock(\"../context.js\", () => ({\n updateContext: vi.fn().mockResolvedValue(true),\n }));\n\n const { writeConfig, readConfig } = await import(\"../config.js\");\n writeConfig({\n activeRepo: \"repo-a\",\n repos: {\n \"repo-a\": {\n indexDir: \"/repo-a\",\n },\n },\n });\n\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"node\", \"scai\", \"config\", \"dev-output\", \"off\"]);\n\n const cfg = readConfig();\n expect(cfg.repos[\"repo-a\"]?.devOutput).toBe(false);\n expect(logSpy).toHaveBeenCalledWith(\"✅ Effective dev output: off\");\n });\n\n it(\"writes repo-local devOutput=true\", async () => {\n createTempHome();\n vi.doMock(\"../context.js\", () => ({\n updateContext: vi.fn().mockResolvedValue(true),\n }));\n\n const { writeConfig, readConfig } = await import(\"../config.js\");\n writeConfig({\n activeRepo: \"repo-a\",\n repos: {\n \"repo-a\": {\n indexDir: \"/repo-a\",\n },\n },\n });\n\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"node\", \"scai\", \"config\", \"dev-output\", \"on\"]);\n\n const cfg = readConfig();\n expect(cfg.repos[\"repo-a\"]?.devOutput).toBe(true);\n expect(logSpy).toHaveBeenCalledWith(\"✅ Effective dev output: on\");\n });\n\n it(\"accepts true as an alias for on\", async () => {\n createTempHome();\n vi.doMock(\"../context.js\", () => ({\n updateContext: vi.fn().mockResolvedValue(true),\n }));\n\n const { writeConfig, readConfig } = await import(\"../config.js\");\n writeConfig({\n activeRepo: \"repo-a\",\n repos: {\n \"repo-a\": {\n indexDir: \"/repo-a\",\n },\n },\n });\n\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"node\", \"scai\", \"config\", \"dev-output\", \"true\"]);\n\n const cfg = readConfig();\n expect(cfg.repos[\"repo-a\"]?.devOutput).toBe(true);\n expect(logSpy).toHaveBeenCalledWith(\"✅ Effective dev output: on\");\n });\n\n it(\"unloads the previous Ollama model when set-model changes the effective repo model\", async () => {\n createTempHome();\n const unloadOllamaModelIfRunning = vi.fn().mockResolvedValue({\n ok: true,\n unloaded: true,\n skipped: false,\n detail: \"Model 'granite4.1:30b' was unloaded from Ollama.\",\n });\n\n vi.doMock(\"../context.js\", () => ({\n updateContext: vi.fn().mockResolvedValue(true),\n }));\n vi.doMock(\"../utils/ollamaService.js\", async () => {\n const actual = await vi.importActual(\"../utils/ollamaService.js\");\n return {\n ...actual,\n unloadOllamaModelIfRunning,\n };\n });\n\n const { writeConfig, readConfig } = await import(\"../config.js\");\n writeConfig({\n activeRepo: \"repo-a\",\n repos: {\n \"repo-a\": {\n indexDir: \"/repo-a\",\n model: \"granite4.1:30b\",\n },\n },\n });\n\n vi.spyOn(console, \"log\").mockImplementation(() => {});\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"node\", \"scai\", \"config\", \"set-model\", \"qwen3-coder:30b\"]);\n\n const cfg = readConfig();\n expect(cfg.repos[\"repo-a\"]?.model).toBe(\"qwen3-coder:30b\");\n expect(unloadOllamaModelIfRunning).toHaveBeenCalledWith(\"granite4.1:30b\");\n });\n});\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Verifies that dev eval CLI commands route into the shared eval owner.
3
+ *
4
+ * Why this file exists:
5
+ * - `scai --help` should list the same eval capabilities maintainers can run
6
+ * - CLI eval registration should stay aligned with shell eval registration
7
+ */
8
+ import { beforeEach, describe, expect, it, vi } from "vitest";
9
+ const registerEvalCommands = vi.fn();
10
+ const registerDevCliCommands = vi.fn();
11
+ vi.mock("../commands/evalCommands.js", async () => {
12
+ const actual = await vi.importActual("../commands/evalCommands.js");
13
+ return {
14
+ ...actual,
15
+ registerEvalCommands,
16
+ };
17
+ });
18
+ vi.mock("../testing/registerDevCliCommands.js", async () => {
19
+ const actual = await vi.importActual("../testing/registerDevCliCommands.js");
20
+ return {
21
+ ...actual,
22
+ registerDevCliCommands,
23
+ };
24
+ });
25
+ describe("factory eval command registration", () => {
26
+ beforeEach(() => {
27
+ registerEvalCommands.mockReset();
28
+ registerDevCliCommands.mockReset();
29
+ process.env.SCAI_ENABLE_DEV_COMMANDS = "1";
30
+ });
31
+ it("registers eval CLI commands when dev commands are enabled", async () => {
32
+ const { createProgram } = await import("../commands/factory.js");
33
+ createProgram();
34
+ expect(registerEvalCommands).toHaveBeenCalledTimes(1);
35
+ expect(registerDevCliCommands).toHaveBeenCalledTimes(1);
36
+ });
37
+ });
38
+ //# sourceMappingURL=factory.evalCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.evalCommands.test.js","sourceRoot":"","sources":["../../src/__tests__/factory.evalCommands.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,sBAAsB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEvC,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;IAChD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;IACpE,OAAO;QACL,GAAG,MAAM;QACT,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;IACzD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,sCAAsC,CAAC,CAAC;IAC7E,OAAO;QACL,GAAG,MAAM;QACT,sBAAsB;KACvB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,UAAU,CAAC,GAAG,EAAE;QACd,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACjC,sBAAsB,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,aAAa,EAAE,CAAC;QAChB,MAAM,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,sBAAsB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Verifies that dev eval CLI commands route into the shared eval owner.\n *\n * Why this file exists:\n * - `scai --help` should list the same eval capabilities maintainers can run\n * - CLI eval registration should stay aligned with shell eval registration\n */\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst registerEvalCommands = vi.fn();\nconst registerDevCliCommands = vi.fn();\n\nvi.mock(\"../commands/evalCommands.js\", async () => {\n const actual = await vi.importActual(\"../commands/evalCommands.js\");\n return {\n ...actual,\n registerEvalCommands,\n };\n});\n\nvi.mock(\"../testing/registerDevCliCommands.js\", async () => {\n const actual = await vi.importActual(\"../testing/registerDevCliCommands.js\");\n return {\n ...actual,\n registerDevCliCommands,\n };\n});\n\ndescribe(\"factory eval command registration\", () => {\n beforeEach(() => {\n registerEvalCommands.mockReset();\n registerDevCliCommands.mockReset();\n process.env.SCAI_ENABLE_DEV_COMMANDS = \"1\";\n });\n\n it(\"registers eval CLI commands when dev commands are enabled\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n createProgram();\n expect(registerEvalCommands).toHaveBeenCalledTimes(1);\n expect(registerDevCliCommands).toHaveBeenCalledTimes(1);\n });\n});\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Verifies the top-level `plan` command stays hidden unless dev commands are enabled.
3
+ *
4
+ * Why this file exists:
5
+ * - unfinished plan mode should stay out of the normal user command surface
6
+ * - maintainers should still be able to opt in with the dev flag
7
+ */
8
+ import { beforeEach, describe, expect, it, vi } from "vitest";
9
+ const runQueryWithDaemonControl = vi.fn();
10
+ vi.mock("../utils/runQueryWithDaemonControl.js", () => ({
11
+ runQueryWithDaemonControl,
12
+ }));
13
+ describe("factory plan command", () => {
14
+ beforeEach(() => {
15
+ vi.resetModules();
16
+ runQueryWithDaemonControl.mockReset();
17
+ delete process.env.SCAI_ENABLE_DEV_COMMANDS;
18
+ });
19
+ it("does not register the plan command by default", async () => {
20
+ const { createProgram } = await import("../commands/factory.js");
21
+ expect(createProgram().commands.some(command => command.name() === "plan")).toBe(false);
22
+ });
23
+ it("runs the query in new-agent plan-only mode when dev commands are enabled", async () => {
24
+ process.env.SCAI_ENABLE_DEV_COMMANDS = "1";
25
+ const { createProgram } = await import("../commands/factory.js");
26
+ await createProgram().parseAsync(["plan", "map", "routing"], { from: "user" });
27
+ expect(runQueryWithDaemonControl).toHaveBeenCalledWith("map routing", {
28
+ continueCurrentTask: false,
29
+ bindAsCurrentTask: false,
30
+ runtime: "agent",
31
+ planOnly: true,
32
+ });
33
+ });
34
+ });
35
+ //# sourceMappingURL=factory.planCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.planCommand.test.js","sourceRoot":"","sources":["../../src/__tests__/factory.planCommand.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,yBAAyB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE1C,EAAE,CAAC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,yBAAyB;CAC5B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,yBAAyB,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAEjE,MAAM,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACtF,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC;QAC3C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/E,MAAM,CAAC,yBAAyB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;YAClE,mBAAmB,EAAE,KAAK;YAC1B,iBAAiB,EAAE,KAAK;YACxB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Verifies the top-level `plan` command stays hidden unless dev commands are enabled.\n *\n * Why this file exists:\n * - unfinished plan mode should stay out of the normal user command surface\n * - maintainers should still be able to opt in with the dev flag\n */\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst runQueryWithDaemonControl = vi.fn();\n\nvi.mock(\"../utils/runQueryWithDaemonControl.js\", () => ({\n runQueryWithDaemonControl,\n}));\n\ndescribe(\"factory plan command\", () => {\n beforeEach(() => {\n vi.resetModules();\n runQueryWithDaemonControl.mockReset();\n delete process.env.SCAI_ENABLE_DEV_COMMANDS;\n });\n\n it(\"does not register the plan command by default\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n\n expect(createProgram().commands.some(command => command.name() === \"plan\")).toBe(false);\n });\n\n it(\"runs the query in new-agent plan-only mode when dev commands are enabled\", async () => {\n process.env.SCAI_ENABLE_DEV_COMMANDS = \"1\";\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"plan\", \"map\", \"routing\"], { from: \"user\" });\n\n expect(runQueryWithDaemonControl).toHaveBeenCalledWith(\"map routing\", {\n continueCurrentTask: false,\n bindAsCurrentTask: false,\n runtime: \"agent\",\n planOnly: true,\n });\n });\n});\n"]}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Verifies that the public setup commands share one setup owner.
3
+ *
4
+ * Why this file exists:
5
+ * - `scai setup` should be the preferred onboarding path
6
+ * - `scai init` should stay as a compatibility alias
7
+ * - command wiring should not drift between the two entrypoints
8
+ */
9
+ import { beforeEach, describe, expect, it, vi } from "vitest";
10
+ const runSetupCommand = vi.fn().mockResolvedValue(undefined);
11
+ vi.mock("../setup/setupOwner.js", async () => {
12
+ const actual = await vi.importActual("../setup/setupOwner.js");
13
+ return {
14
+ ...actual,
15
+ runSetupCommand,
16
+ };
17
+ });
18
+ describe("factory setup commands", () => {
19
+ beforeEach(() => {
20
+ runSetupCommand.mockReset();
21
+ runSetupCommand.mockResolvedValue(undefined);
22
+ });
23
+ it("routes `scai setup` into the shared setup owner", async () => {
24
+ const { createProgram } = await import("../commands/factory.js");
25
+ await createProgram().parseAsync(["setup"], { from: "user" });
26
+ expect(runSetupCommand).toHaveBeenCalledTimes(1);
27
+ });
28
+ it("routes `scai init` into the same shared setup owner", async () => {
29
+ const { createProgram } = await import("../commands/factory.js");
30
+ await createProgram().parseAsync(["init"], { from: "user" });
31
+ expect(runSetupCommand).toHaveBeenCalledTimes(1);
32
+ });
33
+ });
34
+ //# sourceMappingURL=factory.setupCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.setupCommand.test.js","sourceRoot":"","sources":["../../src/__tests__/factory.setupCommand.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAE7D,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;IAC3C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;IAC/D,OAAO;QACL,GAAG,MAAM;QACT,eAAe;KAChB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,UAAU,CAAC,GAAG,EAAE;QACd,eAAe,CAAC,SAAS,EAAE,CAAC;QAC5B,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Verifies that the public setup commands share one setup owner.\n *\n * Why this file exists:\n * - `scai setup` should be the preferred onboarding path\n * - `scai init` should stay as a compatibility alias\n * - command wiring should not drift between the two entrypoints\n */\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst runSetupCommand = vi.fn().mockResolvedValue(undefined);\n\nvi.mock(\"../setup/setupOwner.js\", async () => {\n const actual = await vi.importActual(\"../setup/setupOwner.js\");\n return {\n ...actual,\n runSetupCommand,\n };\n});\n\ndescribe(\"factory setup commands\", () => {\n beforeEach(() => {\n runSetupCommand.mockReset();\n runSetupCommand.mockResolvedValue(undefined);\n });\n\n it(\"routes `scai setup` into the shared setup owner\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"setup\"], { from: \"user\" });\n expect(runSetupCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"routes `scai init` into the same shared setup owner\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"init\"], { from: \"user\" });\n expect(runSetupCommand).toHaveBeenCalledTimes(1);\n });\n});\n"]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Verifies that public status commands route into the shared read-only status renderers.
3
+ *
4
+ * Why this file exists:
5
+ * - `scai status` should stay outside the setup validation gate
6
+ * - `scai index status` should keep working through the same status source
7
+ * - command visibility should not drift from the implemented CLI surface
8
+ */
9
+ import { beforeEach, describe, expect, it, vi } from "vitest";
10
+ const showStatusCommand = vi.fn().mockResolvedValue(undefined);
11
+ const showIndexStatusCommand = vi.fn().mockResolvedValue(undefined);
12
+ const updateContext = vi.fn().mockResolvedValue(true);
13
+ vi.mock("../commands/StatusCmd.js", async () => {
14
+ const actual = await vi.importActual("../commands/StatusCmd.js");
15
+ return {
16
+ ...actual,
17
+ showStatusCommand,
18
+ showIndexStatusCommand,
19
+ };
20
+ });
21
+ vi.mock("../context.js", async () => {
22
+ const actual = await vi.importActual("../context.js");
23
+ return {
24
+ ...actual,
25
+ updateContext,
26
+ };
27
+ });
28
+ describe("factory status commands", () => {
29
+ beforeEach(() => {
30
+ showStatusCommand.mockReset();
31
+ showStatusCommand.mockResolvedValue(undefined);
32
+ showIndexStatusCommand.mockReset();
33
+ showIndexStatusCommand.mockResolvedValue(undefined);
34
+ updateContext.mockReset();
35
+ updateContext.mockResolvedValue(true);
36
+ });
37
+ it("shows top-level `status` in the public command list", async () => {
38
+ const { createProgram } = await import("../commands/factory.js");
39
+ expect(createProgram().commands.some((command) => command.name() === "status")).toBe(true);
40
+ });
41
+ it("routes `scai status` into the shared status renderer without context setup", async () => {
42
+ const { createProgram } = await import("../commands/factory.js");
43
+ await createProgram().parseAsync(["status"], { from: "user" });
44
+ expect(showStatusCommand).toHaveBeenCalledTimes(1);
45
+ expect(updateContext).not.toHaveBeenCalled();
46
+ });
47
+ it("routes `scai index status` into the shared index status renderer", async () => {
48
+ const { createProgram } = await import("../commands/factory.js");
49
+ await createProgram().parseAsync(["index", "status"], { from: "user" });
50
+ expect(showIndexStatusCommand).toHaveBeenCalledTimes(1);
51
+ expect(updateContext).not.toHaveBeenCalled();
52
+ });
53
+ });
54
+ //# sourceMappingURL=factory.statusCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.statusCommand.test.js","sourceRoot":"","sources":["../../src/__tests__/factory.statusCommand.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/D,MAAM,sBAAsB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACpE,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAEtD,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;IAC7C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IACjE,OAAO;QACL,GAAG,MAAM;QACT,iBAAiB;QACjB,sBAAsB;KACvB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;IAClC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IACtD,OAAO;QACL,GAAG,MAAM;QACT,aAAa;KACd,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAC9B,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,sBAAsB,CAAC,SAAS,EAAE,CAAC;QACnC,sBAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACpD,aAAa,CAAC,SAAS,EAAE,CAAC;QAC1B,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,sBAAsB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Verifies that public status commands route into the shared read-only status renderers.\n *\n * Why this file exists:\n * - `scai status` should stay outside the setup validation gate\n * - `scai index status` should keep working through the same status source\n * - command visibility should not drift from the implemented CLI surface\n */\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst showStatusCommand = vi.fn().mockResolvedValue(undefined);\nconst showIndexStatusCommand = vi.fn().mockResolvedValue(undefined);\nconst updateContext = vi.fn().mockResolvedValue(true);\n\nvi.mock(\"../commands/StatusCmd.js\", async () => {\n const actual = await vi.importActual(\"../commands/StatusCmd.js\");\n return {\n ...actual,\n showStatusCommand,\n showIndexStatusCommand,\n };\n});\n\nvi.mock(\"../context.js\", async () => {\n const actual = await vi.importActual(\"../context.js\");\n return {\n ...actual,\n updateContext,\n };\n});\n\ndescribe(\"factory status commands\", () => {\n beforeEach(() => {\n showStatusCommand.mockReset();\n showStatusCommand.mockResolvedValue(undefined);\n showIndexStatusCommand.mockReset();\n showIndexStatusCommand.mockResolvedValue(undefined);\n updateContext.mockReset();\n updateContext.mockResolvedValue(true);\n });\n\n it(\"shows top-level `status` in the public command list\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n expect(createProgram().commands.some((command) => command.name() === \"status\")).toBe(true);\n });\n\n it(\"routes `scai status` into the shared status renderer without context setup\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"status\"], { from: \"user\" });\n expect(showStatusCommand).toHaveBeenCalledTimes(1);\n expect(updateContext).not.toHaveBeenCalled();\n });\n\n it(\"routes `scai index status` into the shared index status renderer\", async () => {\n const { createProgram } = await import(\"../commands/factory.js\");\n await createProgram().parseAsync([\"index\", \"status\"], { from: \"user\" });\n expect(showIndexStatusCommand).toHaveBeenCalledTimes(1);\n expect(updateContext).not.toHaveBeenCalled();\n });\n});\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Verifies shared query-token rules stay consistent across extraction and routing.
3
+ *
4
+ * Why this exists:
5
+ * - `/resume` should stay a command token, not a fake file path
6
+ * - code-call prose should stay separate from true operator snippets
7
+ * - one shared classifier should stop search callers from drifting apart
8
+ */
9
+ import { describe, expect, it } from "vitest";
10
+ import { classifyQueryToken, queryLooksLikeOperatorPattern, queryNeedsRegexMode, } from "../../fileRules/queryTokenRules.js";
11
+ describe("queryTokenRules", () => {
12
+ it("classifies command tokens, code mentions, member expressions, operators, and explicit refs", () => {
13
+ expect(classifyQueryToken("/resume").kind).toBe("command-token");
14
+ expect(classifyQueryToken("generate()").kind).toBe("code-mention");
15
+ expect(classifyQueryToken("lines.push()").kind).toBe("code-mention");
16
+ expect(classifyQueryToken("task.id").kind).toBe("member-expression");
17
+ expect(classifyQueryToken("runSearch|plannerSearchFiles").kind).toBe("operator-pattern-candidate");
18
+ expect(classifyQueryToken("foo.*bar").kind).toBe("operator-pattern-candidate");
19
+ expect(classifyQueryToken("[A-Z].*Step").kind).toBe("operator-pattern-candidate");
20
+ expect(classifyQueryToken("cli/src/commands/TasksCmd.ts").kind).toBe("explicit-ref-candidate");
21
+ expect(classifyQueryToken("agents/guards").kind).toBe("explicit-ref-candidate");
22
+ expect(classifyQueryToken("MainAgent.ts").kind).toBe("explicit-ref-candidate");
23
+ });
24
+ it("keeps prose with code-call text out of operator routing", () => {
25
+ expect(queryLooksLikeOperatorPattern("Trace how generate() timing reaches logs")).toBe(false);
26
+ expect(queryNeedsRegexMode("Trace how generate() timing reaches logs")).toBe(false);
27
+ });
28
+ it("keeps focused snippets on operator routing", () => {
29
+ expect(queryLooksLikeOperatorPattern("generate()")).toBe(true);
30
+ expect(queryNeedsRegexMode("generate()")).toBe(false);
31
+ expect(queryLooksLikeOperatorPattern("runSearch|plannerSearchFiles")).toBe(true);
32
+ expect(queryNeedsRegexMode("runSearch|plannerSearchFiles")).toBe(true);
33
+ });
34
+ });
35
+ //# sourceMappingURL=queryTokenRules.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryTokenRules.test.js","sourceRoot":"","sources":["../../../src/__tests__/fileRules/queryTokenRules.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAE5C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,4FAA4F,EAAE,GAAG,EAAE;QACpG,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnE,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrE,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrE,MAAM,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnG,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC/E,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAClF,MAAM,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/F,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChF,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,6BAA6B,CAAC,0CAA0C,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9F,MAAM,CAAC,mBAAmB,CAAC,0CAA0C,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,6BAA6B,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Verifies shared query-token rules stay consistent across extraction and routing.\n *\n * Why this exists:\n * - `/resume` should stay a command token, not a fake file path\n * - code-call prose should stay separate from true operator snippets\n * - one shared classifier should stop search callers from drifting apart\n */\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n classifyQueryToken,\n queryLooksLikeOperatorPattern,\n queryNeedsRegexMode,\n} from \"../../fileRules/queryTokenRules.js\";\n\ndescribe(\"queryTokenRules\", () => {\n it(\"classifies command tokens, code mentions, member expressions, operators, and explicit refs\", () => {\n expect(classifyQueryToken(\"/resume\").kind).toBe(\"command-token\");\n expect(classifyQueryToken(\"generate()\").kind).toBe(\"code-mention\");\n expect(classifyQueryToken(\"lines.push()\").kind).toBe(\"code-mention\");\n expect(classifyQueryToken(\"task.id\").kind).toBe(\"member-expression\");\n expect(classifyQueryToken(\"runSearch|plannerSearchFiles\").kind).toBe(\"operator-pattern-candidate\");\n expect(classifyQueryToken(\"foo.*bar\").kind).toBe(\"operator-pattern-candidate\");\n expect(classifyQueryToken(\"[A-Z].*Step\").kind).toBe(\"operator-pattern-candidate\");\n expect(classifyQueryToken(\"cli/src/commands/TasksCmd.ts\").kind).toBe(\"explicit-ref-candidate\");\n expect(classifyQueryToken(\"agents/guards\").kind).toBe(\"explicit-ref-candidate\");\n expect(classifyQueryToken(\"MainAgent.ts\").kind).toBe(\"explicit-ref-candidate\");\n });\n\n it(\"keeps prose with code-call text out of operator routing\", () => {\n expect(queryLooksLikeOperatorPattern(\"Trace how generate() timing reaches logs\")).toBe(false);\n expect(queryNeedsRegexMode(\"Trace how generate() timing reaches logs\")).toBe(false);\n });\n\n it(\"keeps focused snippets on operator routing\", () => {\n expect(queryLooksLikeOperatorPattern(\"generate()\")).toBe(true);\n expect(queryNeedsRegexMode(\"generate()\")).toBe(false);\n expect(queryLooksLikeOperatorPattern(\"runSearch|plannerSearchFiles\")).toBe(true);\n expect(queryNeedsRegexMode(\"runSearch|plannerSearchFiles\")).toBe(true);\n });\n});\n"]}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Covers shared file-rule path classes consumed by search lanes.
3
+ *
4
+ * Why this file exists:
5
+ * - generated and artifact path rules should stay in one shared owner
6
+ * - search lanes should rely on these classes instead of local ad hoc checks
7
+ */
8
+ import fs from "fs";
9
+ import os from "os";
10
+ import path from "path";
11
+ import { afterEach, describe, expect, it } from "vitest";
12
+ import { classifyFileRulePath } from "../../fileRules/searchPathClassification.js";
13
+ const tempDirs = [];
14
+ afterEach(() => {
15
+ while (tempDirs.length > 0) {
16
+ const dir = tempDirs.pop();
17
+ if (dir)
18
+ fs.rmSync(dir, { recursive: true, force: true });
19
+ }
20
+ });
21
+ describe("classifyFileRulePath", () => {
22
+ it("classifies build, source-map, artifact, and documentation paths", () => {
23
+ expect(classifyFileRulePath("/repo/cli/dist/foo.js")).toEqual(expect.objectContaining({
24
+ isGeneratedBuild: true,
25
+ }));
26
+ expect(classifyFileRulePath("/repo/cli/dist/foo.js.map")).toEqual(expect.objectContaining({
27
+ isGeneratedBuild: true,
28
+ isSourceMap: true,
29
+ }));
30
+ expect(classifyFileRulePath("/repo/artifacts/evals/run.log")).toEqual(expect.objectContaining({
31
+ isArtifact: true,
32
+ isLogLike: true,
33
+ }));
34
+ expect(classifyFileRulePath("/repo/llm_calls/step-001.jsonl")).toEqual(expect.objectContaining({
35
+ isArtifact: true,
36
+ isLogLike: true,
37
+ }));
38
+ expect(classifyFileRulePath("/repo/README.md")).toEqual(expect.objectContaining({
39
+ isDocumentation: true,
40
+ }));
41
+ });
42
+ it("marks generated harness mirrors when a source peer exists", () => {
43
+ const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "scai-file-rule-harness-"));
44
+ tempDirs.push(repoRoot);
45
+ const sourceFile = path.join(repoRoot, "cli", "src", "__tests__", "search", "SearchOrchestrator.test.ts");
46
+ const distFile = path.join(repoRoot, "cli", "dist", "__tests__", "search", "SearchOrchestrator.test.js");
47
+ fs.mkdirSync(path.dirname(sourceFile), { recursive: true });
48
+ fs.mkdirSync(path.dirname(distFile), { recursive: true });
49
+ fs.writeFileSync(sourceFile, "export {};\n", "utf8");
50
+ fs.writeFileSync(distFile, "export {};\n", "utf8");
51
+ expect(classifyFileRulePath(distFile)).toEqual(expect.objectContaining({
52
+ isGeneratedBuild: true,
53
+ isHarnessLike: true,
54
+ }));
55
+ });
56
+ });
57
+ //# sourceMappingURL=searchPathClassification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchPathClassification.test.js","sourceRoot":"","sources":["../../../src/__tests__/fileRules/searchPathClassification.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers shared file-rule path classes consumed by search lanes.\n *\n * Why this file exists:\n * - generated and artifact path rules should stay in one shared owner\n * - search lanes should rely on these classes instead of local ad hoc checks\n */\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { classifyFileRulePath } from \"../../fileRules/searchPathClassification.js\";\n\nconst tempDirs: string[] = [];\n\nafterEach(() => {\n while (tempDirs.length > 0) {\n const dir = tempDirs.pop();\n if (dir) fs.rmSync(dir, { recursive: true, force: true });\n }\n});\n\ndescribe(\"classifyFileRulePath\", () => {\n it(\"classifies build, source-map, artifact, and documentation paths\", () => {\n expect(classifyFileRulePath(\"/repo/cli/dist/foo.js\")).toEqual(expect.objectContaining({\n isGeneratedBuild: true,\n }));\n expect(classifyFileRulePath(\"/repo/cli/dist/foo.js.map\")).toEqual(expect.objectContaining({\n isGeneratedBuild: true,\n isSourceMap: true,\n }));\n expect(classifyFileRulePath(\"/repo/artifacts/evals/run.log\")).toEqual(expect.objectContaining({\n isArtifact: true,\n isLogLike: true,\n }));\n expect(classifyFileRulePath(\"/repo/llm_calls/step-001.jsonl\")).toEqual(expect.objectContaining({\n isArtifact: true,\n isLogLike: true,\n }));\n expect(classifyFileRulePath(\"/repo/README.md\")).toEqual(expect.objectContaining({\n isDocumentation: true,\n }));\n });\n\n it(\"marks generated harness mirrors when a source peer exists\", () => {\n const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-file-rule-harness-\"));\n tempDirs.push(repoRoot);\n const sourceFile = path.join(repoRoot, \"cli\", \"src\", \"__tests__\", \"search\", \"SearchOrchestrator.test.ts\");\n const distFile = path.join(repoRoot, \"cli\", \"dist\", \"__tests__\", \"search\", \"SearchOrchestrator.test.js\");\n fs.mkdirSync(path.dirname(sourceFile), { recursive: true });\n fs.mkdirSync(path.dirname(distFile), { recursive: true });\n fs.writeFileSync(sourceFile, \"export {};\\n\", \"utf8\");\n fs.writeFileSync(distFile, \"export {};\\n\", \"utf8\");\n\n expect(classifyFileRulePath(distFile)).toEqual(expect.objectContaining({\n isGeneratedBuild: true,\n isHarnessLike: true,\n }));\n });\n});\n"]}