byterover-cli 0.2.1 → 0.3.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 (490) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +48 -3
  18. package/dist/commands/init.js +242 -70
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/pull.d.ts +33 -0
  21. package/dist/commands/pull.js +115 -0
  22. package/dist/commands/push.d.ts +13 -13
  23. package/dist/commands/push.js +81 -101
  24. package/dist/commands/query.d.ts +63 -0
  25. package/dist/commands/query.js +349 -0
  26. package/dist/commands/space/list.d.ts +5 -2
  27. package/dist/commands/space/list.js +60 -56
  28. package/dist/commands/space/switch.d.ts +16 -0
  29. package/dist/commands/space/switch.js +102 -53
  30. package/dist/commands/status.d.ts +5 -2
  31. package/dist/commands/status.js +43 -33
  32. package/dist/commands/watch.d.ts +23 -0
  33. package/dist/commands/watch.js +171 -0
  34. package/dist/config/auth.config.js +14 -2
  35. package/dist/config/context-tree-domains.d.ts +12 -0
  36. package/dist/config/context-tree-domains.js +29 -0
  37. package/dist/config/environment.d.ts +6 -0
  38. package/dist/config/environment.js +9 -2
  39. package/dist/constants.d.ts +5 -0
  40. package/dist/constants.js +6 -0
  41. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  42. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  43. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  44. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  45. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  46. package/dist/core/domain/cipher/agent/index.js +7 -0
  47. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  48. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  50. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  51. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  52. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  53. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  54. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  55. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  56. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  57. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  58. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  59. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  60. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  61. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  62. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  63. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  64. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  65. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  66. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  67. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  68. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  69. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  70. package/dist/core/domain/cipher/memory/types.js +4 -0
  71. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  72. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  73. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  74. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  75. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  76. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  77. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  78. package/dist/core/domain/cipher/todos/index.js +4 -0
  79. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  80. package/dist/core/domain/cipher/todos/types.js +5 -0
  81. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  82. package/dist/core/domain/cipher/tools/constants.js +24 -0
  83. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  84. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  85. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  86. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  87. package/dist/core/domain/entities/brv-config.js +115 -17
  88. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  89. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  90. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  91. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  92. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  93. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  94. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  95. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  96. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  97. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  98. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  99. package/dist/core/domain/entities/context-tree-index.js +27 -0
  100. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  101. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  102. package/dist/core/domain/entities/event.d.ts +1 -1
  103. package/dist/core/domain/entities/event.js +3 -1
  104. package/dist/core/domain/entities/parser.d.ts +567 -0
  105. package/dist/core/domain/entities/parser.js +10 -0
  106. package/dist/core/domain/entities/playbook.d.ts +2 -23
  107. package/dist/core/domain/entities/playbook.js +2 -70
  108. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  109. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  110. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  111. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  112. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  113. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  114. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  115. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  116. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  117. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  118. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  119. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  120. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  121. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  122. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  123. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  124. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  125. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  128. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  129. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  130. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  131. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  132. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  133. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  134. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  135. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  136. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  137. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  139. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  140. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  141. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  142. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  143. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  144. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  145. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  146. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  147. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  148. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  149. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  150. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  151. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  153. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  155. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  156. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  157. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  158. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  159. package/dist/core/interfaces/cipher/message-types.js +5 -0
  160. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  161. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  162. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  163. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  164. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  165. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  166. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  167. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  168. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  169. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  171. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  173. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  174. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  175. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  176. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  177. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  178. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  179. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  180. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  181. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  182. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  183. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  184. package/dist/hooks/error/clean-errors.d.ts +7 -0
  185. package/dist/hooks/error/clean-errors.js +50 -0
  186. package/dist/hooks/init/welcome.js +72 -1
  187. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  188. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  189. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  190. package/dist/infra/cipher/agent-service-factory.js +212 -0
  191. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  192. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  193. package/dist/infra/cipher/blob/index.d.ts +10 -0
  194. package/dist/infra/cipher/blob/index.js +12 -0
  195. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  196. package/dist/infra/cipher/blob/migrations.js +148 -0
  197. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  198. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  199. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  200. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  201. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  202. package/dist/infra/cipher/cipher-agent.js +317 -0
  203. package/dist/infra/cipher/command-parser.d.ts +23 -0
  204. package/dist/infra/cipher/command-parser.js +85 -0
  205. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  206. package/dist/infra/cipher/display/todo-display.js +129 -0
  207. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  208. package/dist/infra/cipher/events/event-emitter.js +158 -0
  209. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  210. package/dist/infra/cipher/exit-codes.js +58 -0
  211. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  212. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  213. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  214. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  215. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  216. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  217. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  218. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  219. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  220. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  221. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  222. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  223. package/dist/infra/cipher/interactive-commands.js +198 -0
  224. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  225. package/dist/infra/cipher/interactive-loop.js +352 -0
  226. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  227. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  228. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  229. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  230. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  231. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  232. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  233. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  234. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  235. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  236. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  237. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  238. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  239. package/dist/infra/cipher/llm/context/index.js +2 -0
  240. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  241. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  242. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  243. package/dist/infra/cipher/llm/context/utils.js +89 -0
  244. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  245. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  246. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  247. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  248. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  249. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  250. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  251. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  252. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  253. package/dist/infra/cipher/llm/generators/index.js +13 -0
  254. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  255. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  256. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  257. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  258. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  259. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  260. package/dist/infra/cipher/llm/index.d.ts +9 -0
  261. package/dist/infra/cipher/llm/index.js +13 -0
  262. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  263. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  264. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  265. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  266. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  267. package/dist/infra/cipher/llm/response-validator.js +157 -0
  268. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  269. package/dist/infra/cipher/llm/retry/index.js +10 -0
  270. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  271. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  272. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  273. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  274. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  275. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  276. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  277. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  278. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  279. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  280. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  281. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  282. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  283. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  284. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  285. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  286. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  287. package/dist/infra/cipher/logger/console-logger.js +63 -0
  288. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  289. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  290. package/dist/infra/cipher/memory/index.d.ts +6 -0
  291. package/dist/infra/cipher/memory/index.js +7 -0
  292. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  293. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  294. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  295. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  296. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  297. package/dist/infra/cipher/process/command-validator.js +266 -0
  298. package/dist/infra/cipher/process/index.d.ts +8 -0
  299. package/dist/infra/cipher/process/index.js +8 -0
  300. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  301. package/dist/infra/cipher/process/process-service.js +439 -0
  302. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  303. package/dist/infra/cipher/session/chat-session.js +165 -0
  304. package/dist/infra/cipher/session/index.d.ts +6 -0
  305. package/dist/infra/cipher/session/index.js +5 -0
  306. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  307. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  308. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  309. package/dist/infra/cipher/session/session-manager.js +172 -0
  310. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  311. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  312. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  313. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  314. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  315. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  316. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  317. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  318. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  319. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  320. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  321. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  322. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  323. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  324. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  326. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  327. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  328. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  329. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  330. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  331. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  332. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  333. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  334. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  335. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  336. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  337. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  338. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  339. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  340. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  342. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  344. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  346. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  347. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  348. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  350. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  351. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  352. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  353. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  354. package/dist/infra/cipher/tools/index.d.ts +18 -0
  355. package/dist/infra/cipher/tools/index.js +19 -0
  356. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  357. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  358. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  359. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  360. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  361. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  362. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  363. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  364. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  365. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  366. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  367. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  368. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  369. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  370. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  371. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  372. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  373. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  374. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  375. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  376. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  377. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  378. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  379. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  380. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  381. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  382. package/dist/infra/config/file-config-store.js +9 -3
  383. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  384. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  385. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  386. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  387. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  388. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  389. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  390. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  391. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  392. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  393. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  394. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  395. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  396. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  397. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  398. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  399. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  400. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  401. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  402. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  403. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  404. package/dist/infra/parsers/clean/shared.js +273 -0
  405. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  406. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  407. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  408. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  409. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  410. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  411. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  412. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  413. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  414. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  415. package/dist/infra/space/http-space-service.js +2 -1
  416. package/dist/infra/team/http-team-service.js +2 -1
  417. package/dist/infra/user/http-user-service.js +2 -1
  418. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  419. package/dist/infra/watcher/file-watcher-service.js +81 -0
  420. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  421. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  422. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  423. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  424. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  425. package/dist/resources/prompts/reflection.yml +27 -0
  426. package/dist/resources/prompts/system-prompt.yml +82 -0
  427. package/dist/resources/prompts/tool-outputs.yml +30 -0
  428. package/dist/templates/README.md +6 -7
  429. package/dist/templates/sections/command-reference.md +40 -111
  430. package/dist/templates/sections/workflow.md +3 -30
  431. package/dist/utils/emoji-helpers.d.ts +38 -0
  432. package/dist/utils/emoji-helpers.js +42 -0
  433. package/dist/utils/error-handler.d.ts +51 -0
  434. package/dist/utils/error-handler.js +169 -0
  435. package/dist/utils/error-helpers.d.ts +30 -0
  436. package/dist/utils/error-helpers.js +47 -0
  437. package/dist/utils/file-helpers.d.ts +15 -0
  438. package/dist/utils/file-helpers.js +44 -0
  439. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  440. package/dist/utils/oclif-error-helpers.js +46 -0
  441. package/dist/utils/tool-display-formatter.d.ts +53 -0
  442. package/dist/utils/tool-display-formatter.js +257 -0
  443. package/oclif.manifest.json +381 -141
  444. package/package.json +27 -6
  445. package/dist/commands/add.d.ts +0 -49
  446. package/dist/commands/add.js +0 -192
  447. package/dist/commands/complete.d.ts +0 -108
  448. package/dist/commands/complete.js +0 -340
  449. package/dist/commands/retrieve.d.ts +0 -26
  450. package/dist/commands/retrieve.js +0 -101
  451. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  452. package/dist/core/domain/entities/curator-output.js +0 -23
  453. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  454. package/dist/core/domain/entities/delta-batch.js +0 -52
  455. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  456. package/dist/core/domain/entities/delta-operation.js +0 -50
  457. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  458. package/dist/core/domain/entities/executor-output.js +0 -33
  459. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  460. package/dist/core/domain/entities/reflector-output.js +0 -44
  461. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  462. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  463. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  464. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  465. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  466. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  467. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  468. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  469. package/dist/infra/ace/ace-file-utils.js +0 -83
  470. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  471. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  472. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  473. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  474. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  475. package/dist/infra/ace/file-delta-store.js +0 -26
  476. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  477. package/dist/infra/ace/file-executor-output-store.js +0 -26
  478. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  479. package/dist/infra/ace/file-playbook-store.js +0 -107
  480. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  481. package/dist/infra/ace/file-reflection-store.js +0 -55
  482. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  483. package/dist/infra/playbook/file-playbook-service.js +0 -132
  484. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  485. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  486. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  487. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  488. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  489. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  490. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -1,18 +1,33 @@
1
- import { select } from '@inquirer/prompts';
1
+ import { search, select } from '@inquirer/prompts';
2
2
  import { Command, ux } from '@oclif/core';
3
3
  import { getCurrentConfig } from '../../config/environment.js';
4
4
  import { BRV_DIR, PROJECT_CONFIG_FILE } from '../../constants.js';
5
+ import { AGENT_VALUES } from '../../core/domain/entities/agent.js';
5
6
  import { BrvConfig } from '../../core/domain/entities/brv-config.js';
7
+ import { ExitCode, ExitError, exitWithCode } from '../../infra/cipher/exit-codes.js';
6
8
  import { ProjectConfigStore } from '../../infra/config/file-config-store.js';
7
9
  import { HttpSpaceService } from '../../infra/space/http-space-service.js';
8
10
  import { KeychainTokenStore } from '../../infra/storage/keychain-token-store.js';
9
11
  import { HttpTeamService } from '../../infra/team/http-team-service.js';
12
+ import { WorkspaceDetectorService } from '../../infra/workspace/workspace-detector-service.js';
10
13
  export default class SpaceSwitch extends Command {
11
14
  static description = `Switch to a different team or space (updates ${BRV_DIR}/${PROJECT_CONFIG_FILE})`;
12
15
  static examples = [
13
16
  '<%= config.bin %> <%= command.id %>',
14
17
  '# Shows current configuration, then prompts for new team/space selection',
15
18
  ];
19
+ async catch(error) {
20
+ // Check if error is ExitError (message already displayed)
21
+ if (error instanceof ExitError) {
22
+ return;
23
+ }
24
+ // Backwards compatibility: also check oclif.exit property
25
+ if (error.oclif?.exit !== undefined) {
26
+ return;
27
+ }
28
+ // For unexpected errors, show the message
29
+ this.error(error instanceof Error ? error.message : 'Switch failed');
30
+ }
16
31
  createServices() {
17
32
  const envConfig = getCurrentConfig();
18
33
  return {
@@ -26,6 +41,35 @@ export default class SpaceSwitch extends Command {
26
41
  tokenStore: new KeychainTokenStore(),
27
42
  };
28
43
  }
44
+ detectWorkspacesForAgent(agent) {
45
+ const detector = new WorkspaceDetectorService();
46
+ const result = detector.detectWorkspaces(agent);
47
+ return {
48
+ chatLogPath: result.chatLogPath,
49
+ cwd: result.cwd,
50
+ };
51
+ }
52
+ /**
53
+ * Prompts the user to select an agent.
54
+ * This method is protected to allow test overrides.
55
+ * @returns The selected agent
56
+ */
57
+ async promptForAgentSelection() {
58
+ const AGENTS = AGENT_VALUES.map((agent) => ({
59
+ name: agent,
60
+ value: agent,
61
+ }));
62
+ const answer = await search({
63
+ message: 'Which agent you are using (type to search):',
64
+ async source(input) {
65
+ if (!input)
66
+ return AGENTS;
67
+ return AGENTS.filter((agent) => agent.name.toLowerCase().includes(input.toLowerCase()) ||
68
+ agent.value.toLowerCase().includes(input.toLowerCase()));
69
+ },
70
+ });
71
+ return answer;
72
+ }
29
73
  async promptForSpaceSelection(spaces) {
30
74
  const selectedSpaceId = await select({
31
75
  choices: spaces.map((space) => ({
@@ -36,7 +80,7 @@ export default class SpaceSwitch extends Command {
36
80
  });
37
81
  const selectedSpace = spaces.find((space) => space.id === selectedSpaceId);
38
82
  if (!selectedSpace) {
39
- this.error('Space selection failed');
83
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Space selection failed');
40
84
  }
41
85
  return selectedSpace;
42
86
  }
@@ -50,62 +94,67 @@ export default class SpaceSwitch extends Command {
50
94
  });
51
95
  const selectedTeam = teams.find((team) => team.id === selectedTeamId);
52
96
  if (!selectedTeam) {
53
- this.error('Team selection failed');
97
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Team selection failed');
54
98
  }
55
99
  return selectedTeam;
56
100
  }
57
101
  async run() {
58
- try {
59
- const { projectConfigStore, spaceService, teamService, tokenStore } = this.createServices();
60
- // Check project initialization (MUST exist for switch)
61
- const currentConfig = await projectConfigStore.read();
62
- if (currentConfig === undefined) {
63
- this.error('Project not initialized. Run "brv init" first.');
64
- }
65
- // Show current configuration
66
- this.log('Current configuration:');
67
- this.log(` Team: ${currentConfig.teamName}`);
68
- this.log(` Space: ${currentConfig.spaceName}`);
69
- this.log();
70
- // Validate authentication
71
- const token = await tokenStore.load();
72
- if (token === undefined) {
73
- this.error('Not authenticated. Please run "brv login" first.');
74
- }
75
- if (!token.isValid()) {
76
- this.error('Authentication token expired. Please run "brv login" again.');
77
- }
78
- // Fetch all teams
79
- ux.action.start('Fetching all teams');
80
- const teamResult = await teamService.getTeams(token.accessToken, token.sessionKey, { fetchAll: true });
81
- ux.action.stop();
82
- if (teamResult.teams.length === 0) {
83
- this.error('No teams found. Please create a team in the ByteRover dashboard first.');
84
- }
85
- // Prompt for team selection
86
- this.log();
87
- const selectedTeam = await this.promptForTeamSelection(teamResult.teams);
88
- // Fetch spaces for selected team
89
- ux.action.start('Fetching all spaces');
90
- const spaceResult = await spaceService.getSpaces(token.accessToken, token.sessionKey, selectedTeam.id, {
91
- fetchAll: true,
92
- });
93
- ux.action.stop();
94
- if (spaceResult.spaces.length === 0) {
95
- this.error(`No spaces found in team "${selectedTeam.getDisplayName()}". Please create a space in the ByteRover dashboard first.`);
96
- }
97
- // Prompt for space selection
98
- this.log();
99
- const selectedSpace = await this.promptForSpaceSelection(spaceResult.spaces);
100
- // Update configuration
101
- const newConfig = BrvConfig.fromSpace(selectedSpace);
102
- await projectConfigStore.write(newConfig);
103
- // Display success
104
- this.log(`\n✓ Successfully switched to space: ${selectedSpace.getDisplayName()}`);
105
- this.log(`✓ Configuration updated in: ${BRV_DIR}/${PROJECT_CONFIG_FILE}`);
102
+ const { projectConfigStore, spaceService, teamService, tokenStore } = this.createServices();
103
+ // Check project initialization (MUST exist for switch)
104
+ const currentConfig = await projectConfigStore.read();
105
+ if (!currentConfig) {
106
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Project not initialized. Please run "brv init" first.');
107
+ }
108
+ // Show current configuration
109
+ this.log('Current configuration:');
110
+ this.log(` Team: ${currentConfig.teamName}`);
111
+ this.log(` Space: ${currentConfig.spaceName}`);
112
+ this.log();
113
+ // Validate authentication
114
+ const token = await tokenStore.load();
115
+ if (!token) {
116
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Not authenticated. Please run "brv login" first.');
117
+ }
118
+ if (!token.isValid()) {
119
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Authentication token expired. Please run "brv login" again.');
106
120
  }
107
- catch (error) {
108
- this.error(error instanceof Error ? error.message : 'Switch failed');
121
+ // Fetch all teams
122
+ ux.action.start('Fetching all teams');
123
+ const teamResult = await teamService.getTeams(token.accessToken, token.sessionKey, { fetchAll: true });
124
+ ux.action.stop();
125
+ if (teamResult.teams.length === 0) {
126
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'No teams found. Please create a team in the ByteRover dashboard first.');
109
127
  }
128
+ // Prompt for team selection
129
+ this.log();
130
+ const selectedTeam = await this.promptForTeamSelection(teamResult.teams);
131
+ // Fetch spaces for selected team
132
+ ux.action.start('Fetching all spaces');
133
+ const spaceResult = await spaceService.getSpaces(token.accessToken, token.sessionKey, selectedTeam.id, {
134
+ fetchAll: true,
135
+ });
136
+ ux.action.stop();
137
+ if (spaceResult.spaces.length === 0) {
138
+ exitWithCode(ExitCode.VALIDATION_ERROR, `No spaces found in team "${selectedTeam.getDisplayName()}". Please create a space in the ByteRover dashboard first.`);
139
+ }
140
+ // Prompt for space selection
141
+ this.log();
142
+ const selectedSpace = await this.promptForSpaceSelection(spaceResult.spaces);
143
+ // Prompt for agent selection
144
+ this.log();
145
+ const selectedAgent = await this.promptForAgentSelection();
146
+ this.log();
147
+ const { chatLogPath, cwd } = this.detectWorkspacesForAgent(selectedAgent);
148
+ // Update configuration
149
+ const newConfig = BrvConfig.fromSpace({
150
+ chatLogPath,
151
+ cwd,
152
+ ide: selectedAgent,
153
+ space: selectedSpace,
154
+ });
155
+ await projectConfigStore.write(newConfig);
156
+ // Display success
157
+ this.log(`\n✓ Successfully switched to space: ${selectedSpace.getDisplayName()}`);
158
+ this.log(`✓ Configuration updated in: ${BRV_DIR}/${PROJECT_CONFIG_FILE}`);
110
159
  }
111
160
  }
@@ -1,5 +1,6 @@
1
1
  import { Command } from '@oclif/core';
2
- import type { IPlaybookStore } from '../core/interfaces/i-playbook-store.js';
2
+ import type { IContextTreeService } from '../core/interfaces/i-context-tree-service.js';
3
+ import type { IContextTreeSnapshotService } from '../core/interfaces/i-context-tree-snapshot-service.js';
3
4
  import type { IProjectConfigStore } from '../core/interfaces/i-project-config-store.js';
4
5
  import type { ITokenStore } from '../core/interfaces/i-token-store.js';
5
6
  import { ITrackingService } from '../core/interfaces/i-tracking-service.js';
@@ -12,8 +13,10 @@ export default class Status extends Command {
12
13
  static flags: {
13
14
  format: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
15
  };
16
+ catch(error: Error): Promise<void>;
15
17
  protected createServices(): {
16
- playbookStore: IPlaybookStore;
18
+ contextTreeService: IContextTreeService;
19
+ contextTreeSnapshotService: IContextTreeSnapshotService;
17
20
  projectConfigStore: IProjectConfigStore;
18
21
  tokenStore: ITokenStore;
19
22
  trackingService: ITrackingService;
@@ -1,15 +1,18 @@
1
1
  import { Args, Command, Flags } from '@oclif/core';
2
2
  import chalk from 'chalk';
3
- import { ACE_DIR, BRV_DIR, BULLETS_DIR } from '../constants.js';
4
- import { FilePlaybookStore } from '../infra/ace/file-playbook-store.js';
3
+ import { join } from 'node:path';
4
+ import { BRV_DIR, CONTEXT_TREE_DIR } from '../constants.js';
5
5
  import { ProjectConfigStore } from '../infra/config/file-config-store.js';
6
+ import { FileContextTreeService } from '../infra/context-tree/file-context-tree-service.js';
7
+ import { FileContextTreeSnapshotService } from '../infra/context-tree/file-context-tree-snapshot-service.js';
6
8
  import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
7
9
  import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
10
+ import { getErrorMessage } from '../utils/error-helpers.js';
8
11
  export default class Status extends Command {
9
12
  static args = {
10
13
  directory: Args.string({ description: 'Project directory (defaults to current directory)', required: false }),
11
14
  };
12
- static description = 'Show CLI status and project information. Display local ACE context (ACE playbook) managed by ByteRover CLI';
15
+ static description = 'Show CLI status and project information. Display local context tree managed by ByteRover CLI';
13
16
  static examples = [
14
17
  '<%= config.bin %> <%= command.id %>',
15
18
  '# Check status after login:\n<%= config.bin %> login\n<%= config.bin %> <%= command.id %>',
@@ -26,19 +29,25 @@ export default class Status extends Command {
26
29
  options: ['table', 'json'],
27
30
  }),
28
31
  };
32
+ // Override catch to prevent oclif from displaying errors again
33
+ async catch(error) {
34
+ // Status command should always succeed and just show status
35
+ // Any errors are already handled and logged in run()
36
+ throw error;
37
+ }
29
38
  createServices() {
30
39
  const tokenStore = new KeychainTokenStore();
31
40
  const trackingService = new MixpanelTrackingService(tokenStore);
32
41
  return {
33
- playbookStore: new FilePlaybookStore(),
42
+ contextTreeService: new FileContextTreeService(),
43
+ contextTreeSnapshotService: new FileContextTreeSnapshotService(),
34
44
  projectConfigStore: new ProjectConfigStore(),
35
45
  tokenStore,
36
46
  trackingService,
37
47
  };
38
48
  }
39
49
  async run() {
40
- const { playbookStore, projectConfigStore, tokenStore } = this.createServices();
41
- const { args, flags } = await this.parse(Status);
50
+ const { contextTreeService, contextTreeSnapshotService, projectConfigStore, tokenStore } = this.createServices();
42
51
  this.log(`CLI Version: ${this.config.version}`);
43
52
  try {
44
53
  const token = await tokenStore.load();
@@ -54,7 +63,7 @@ export default class Status extends Command {
54
63
  }
55
64
  catch (error) {
56
65
  this.log('Status: Unable to check authentication status');
57
- this.warn(`Warning: ${error.message}`);
66
+ this.warn(`Warning: ${getErrorMessage(error)}`);
58
67
  }
59
68
  const cwd = process.cwd();
60
69
  this.log(`Current Directory: ${cwd}`);
@@ -75,41 +84,42 @@ export default class Status extends Command {
75
84
  }
76
85
  catch (error) {
77
86
  this.log('Project Status: Unable to read project configuration');
78
- this.warn(`Warning: ${error.message}`);
87
+ this.warn(`Warning: ${getErrorMessage(error)}`);
79
88
  }
89
+ // Context tree status
80
90
  try {
81
- const playbook = await playbookStore.load(args.directory);
82
- if (!playbook) {
83
- this.error('Playbook not found. Run `brv init` to initialize.');
91
+ const contextTreeExists = await contextTreeService.exists();
92
+ if (!contextTreeExists) {
93
+ this.log('Context Tree: Not initialized');
94
+ return;
84
95
  }
85
- // Display based on format
86
- if (flags.format === 'json') {
87
- return this.log(JSON.stringify(playbook.toJson(), null, 2));
96
+ const hasSnapshot = await contextTreeSnapshotService.hasSnapshot();
97
+ // Auto-create empty snapshot if none exists (all files will show as "added")
98
+ if (!hasSnapshot) {
99
+ await contextTreeSnapshotService.initEmptySnapshot();
88
100
  }
89
- // Display file URLs like git status
90
- const bullets = playbook.getBullets();
91
- const sections = playbook.getSections();
92
- if (bullets.length === 0) {
93
- this.log('Playbook is empty. Use "brv add" commands to add knowledge.');
101
+ const changes = await contextTreeSnapshotService.getChanges();
102
+ const hasChanges = changes.added.length > 0 || changes.modified.length > 0 || changes.deleted.length > 0;
103
+ if (!hasChanges) {
104
+ this.log('Context Tree: No changes');
94
105
  return;
95
106
  }
96
- this.log(`\nMemory not pushed to cloud:`);
97
- for (const section of sections) {
98
- // Space between sections
99
- this.log(' ');
100
- // Section title
101
- this.log(`# ${section}`);
102
- const sectionBullets = playbook.getBulletsInSection(section);
103
- for (const bullet of sectionBullets) {
104
- const relativePath = `${BRV_DIR}/${ACE_DIR}/${BULLETS_DIR}/${bullet.id}.md`;
105
- // Display like git status: red path
106
- this.log(` ${chalk.red(relativePath)}`);
107
- }
107
+ const contextTreeRelPath = join(BRV_DIR, CONTEXT_TREE_DIR);
108
+ const formatPath = (file) => join(contextTreeRelPath, file);
109
+ // Build unified list with status, sort by path ascending
110
+ const allChanges = [
111
+ ...changes.modified.map((f) => ({ color: chalk.red, path: f, status: 'modified:' })),
112
+ ...changes.added.map((f) => ({ color: chalk.red, path: f, status: 'new file:' })),
113
+ ...changes.deleted.map((f) => ({ color: chalk.red, path: f, status: 'deleted:' })),
114
+ ].sort((a, b) => a.path.localeCompare(b.path));
115
+ this.log('Context Tree Changes:');
116
+ for (const change of allChanges) {
117
+ this.log(`\t${change.color(`${change.status.padEnd(10)} ${formatPath(change.path)}`)}`);
108
118
  }
109
- this.log(`\nUse "brv push" to push playbook to ByteRover memory storage.`);
110
119
  }
111
120
  catch (error) {
112
- this.error(error instanceof Error ? error.message : 'Failed to load playbook statistics');
121
+ this.log('Context Tree: Unable to check status');
122
+ this.warn(`Warning: ${error instanceof Error ? error.message : 'Context Tree unable to check status'}`);
113
123
  }
114
124
  }
115
125
  }
@@ -0,0 +1,23 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { IFileWatcherService } from '../core/interfaces/i-file-watcher-service.js';
3
+ import type { IProjectConfigStore } from '../core/interfaces/i-project-config-store.js';
4
+ export default class Watch extends Command {
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ clean: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ debounce: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
10
+ paths: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ };
12
+ static hidden: boolean;
13
+ private lastParseTime;
14
+ private parsingInProgress;
15
+ private pendingParse;
16
+ protected createServices(): {
17
+ fileWatcherService: IFileWatcherService;
18
+ projectConfigStore: IProjectConfigStore;
19
+ };
20
+ run(): Promise<void>;
21
+ protected waitForShutdownSignal(): Promise<void>;
22
+ private triggerParsing;
23
+ }
@@ -0,0 +1,171 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { isDevelopment } from '../config/environment.js';
3
+ import { ProjectConfigStore } from '../infra/config/file-config-store.js';
4
+ import { CleanParserServiceFactory } from '../infra/parsers/clean/clean-parser-service-factory.js';
5
+ import { RawParserServiceFactory } from '../infra/parsers/raw/raw-parser-service-factory.js';
6
+ import { FileWatcherService } from '../infra/watcher/file-watcher-service.js';
7
+ export default class Watch extends Command {
8
+ static description = 'Watch file system directories for changes and trigger parsing pipeline [Development only]';
9
+ static examples = [
10
+ '<%= config.bin %> <%= command.id %> --paths ./agent-logs',
11
+ '<%= config.bin %> <%= command.id %> --paths ./logs,./outputs,./workspace',
12
+ '<%= config.bin %> <%= command.id %> -p ./src,./lib',
13
+ '# Use chat log path from config (if IDE was configured during init):',
14
+ '<%= config.bin %> <%= command.id %>',
15
+ ];
16
+ static flags = {
17
+ clean: Flags.boolean({
18
+ allowNo: true,
19
+ default: true,
20
+ description: 'Run clean parsing after raw parsing (default: true)',
21
+ }),
22
+ debounce: Flags.integer({
23
+ default: 2000,
24
+ description: 'Debounce time in milliseconds before triggering parsing (default: 2000)',
25
+ }),
26
+ paths: Flags.string({
27
+ char: 'p',
28
+ description: 'Comma-separated list of directories to watch (defaults to configured chat log path)',
29
+ required: false,
30
+ }),
31
+ };
32
+ static hidden = !isDevelopment();
33
+ lastParseTime = 0;
34
+ parsingInProgress = false;
35
+ pendingParse = false;
36
+ createServices() {
37
+ return {
38
+ fileWatcherService: new FileWatcherService(),
39
+ projectConfigStore: new ProjectConfigStore(),
40
+ };
41
+ }
42
+ async run() {
43
+ if (!isDevelopment()) {
44
+ this.error('This command is only available in development environment');
45
+ }
46
+ const { flags } = await this.parse(Watch);
47
+ const { fileWatcherService, projectConfigStore } = this.createServices();
48
+ let paths = [];
49
+ let ideConfig = null;
50
+ // Use explicit paths if provided
51
+ if (flags.paths) {
52
+ paths = flags.paths.split(',').map((p) => p.trim());
53
+ }
54
+ else {
55
+ // Try to load chat log path from config
56
+ try {
57
+ const configExists = await projectConfigStore.exists();
58
+ if (configExists) {
59
+ const config = await projectConfigStore.read();
60
+ if (config?.chatLogPath && config?.ide) {
61
+ paths = [config.chatLogPath];
62
+ ideConfig = config.ide;
63
+ this.log(`ℹ Using chat log path from config (${config.ide})`);
64
+ }
65
+ }
66
+ }
67
+ catch {
68
+ // Silently ignore config loading errors
69
+ }
70
+ if (paths.length === 0) {
71
+ this.error('No paths specified. Either:\n' +
72
+ ' 1. Use --paths flag: brv watch --paths ./logs,./outputs\n' +
73
+ ' 2. Run "brv init" to configure IDE and detect workspaces');
74
+ }
75
+ }
76
+ try {
77
+ // Set up file event handler with parsing pipeline
78
+ fileWatcherService.setFileEventHandler(async (event) => {
79
+ this.log(`[${event.type}] ${event.path}`);
80
+ // Only trigger parsing if IDE is configured
81
+ if (ideConfig && (event.type === 'add' || event.type === 'change' || event.type === 'unlink')) {
82
+ this.pendingParse = true;
83
+ // Debounce parsing to avoid too frequent triggers
84
+ if (!this.parsingInProgress && Date.now() - this.lastParseTime > flags.debounce) {
85
+ this.triggerParsing(ideConfig, paths[0]).catch((error) => {
86
+ this.warn(`⚠️ Parsing error: ${error instanceof Error ? error.message : String(error)}`);
87
+ });
88
+ }
89
+ }
90
+ });
91
+ await fileWatcherService.start(paths);
92
+ this.log(`\n🔍 Watching paths: ${paths.join(', ')}`);
93
+ if (ideConfig) {
94
+ this.log(`📊 Parsing pipeline enabled for: ${ideConfig}`);
95
+ }
96
+ this.log('Press Ctrl+C to stop...\n');
97
+ await this.waitForShutdownSignal();
98
+ }
99
+ catch (error) {
100
+ this.error(error instanceof Error ? error.message : 'Unknown Error');
101
+ }
102
+ finally {
103
+ await fileWatcherService.stop();
104
+ }
105
+ }
106
+ async waitForShutdownSignal() {
107
+ return new Promise((resolve) => {
108
+ const handleSignal = () => {
109
+ this.log('\nShutting down watcher...');
110
+ process.off('SIGINT', handleSignal);
111
+ process.off('SIGTERM', handleSignal);
112
+ resolve();
113
+ };
114
+ process.on('SIGINT', handleSignal);
115
+ process.on('SIGTERM', handleSignal);
116
+ });
117
+ }
118
+ async triggerParsing(ide, chatLogPath) {
119
+ if (this.parsingInProgress) {
120
+ return;
121
+ }
122
+ this.parsingInProgress = true;
123
+ this.pendingParse = false;
124
+ this.lastParseTime = Date.now();
125
+ try {
126
+ // Normalize IDE name for factory
127
+ // Validate IDE is supported
128
+ if (!RawParserServiceFactory.isSupported(ide)) {
129
+ this.warn(`⚠️ Unsupported IDE: ${ide}`);
130
+ return;
131
+ }
132
+ this.log('\n📥 Parsing triggered...');
133
+ // Raw parsing phase
134
+ let isRawSuccess = false;
135
+ try {
136
+ // Cast is safe because we already validated with isSupported()
137
+ isRawSuccess = await RawParserServiceFactory.parseConversations(ide, chatLogPath);
138
+ }
139
+ catch (error) {
140
+ this.warn(`⚠️ Raw parsing error: ${error instanceof Error ? error.message : String(error)}`);
141
+ return;
142
+ }
143
+ // Clean parsing phase (if enabled)
144
+ const { flags } = await this.parse(Watch);
145
+ if (isRawSuccess && flags.clean) {
146
+ try {
147
+ const rawOutputDir = `${process.cwd()}/.brv/logs/${ide}/raw`;
148
+ const cleanSessions = await CleanParserServiceFactory.parseConversations(ide, rawOutputDir);
149
+ if (cleanSessions.length > 0) {
150
+ this.log('✅ Clean parsing complete\n');
151
+ }
152
+ else {
153
+ this.warn('⚠️ Clean parsing failed');
154
+ }
155
+ }
156
+ catch (error) {
157
+ this.warn(`⚠️ Clean parsing error: ${error instanceof Error ? error.message : String(error)}`);
158
+ }
159
+ }
160
+ }
161
+ finally {
162
+ this.parsingInProgress = false;
163
+ // If more files were added while parsing, queue another parse
164
+ if (this.pendingParse) {
165
+ this.triggerParsing(ide, chatLogPath).catch((error) => {
166
+ this.warn(`⚠️ Parsing error: ${error instanceof Error ? error.message : String(error)}`);
167
+ });
168
+ }
169
+ }
170
+ }
171
+ }
@@ -23,8 +23,20 @@ export const getAuthConfig = async (discoveryService) => {
23
23
  // Fallback to hardcoded environment-specific URLs
24
24
  authorizationUrl = envConfig.authorizationUrl;
25
25
  tokenUrl = envConfig.tokenUrl;
26
- // Warn user about fallback
27
- console.warn(`Warning: OIDC discovery failed, using fallback URLs for ${ENVIRONMENT} environment.`, error instanceof Error ? error.message : 'Unknown error');
26
+ // Warn user about fallback with user-friendly error message
27
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
28
+ const isNetworkError = errorMessage.includes('ENOTFOUND') ||
29
+ errorMessage.includes('ECONNREFUSED') ||
30
+ errorMessage.includes('ETIMEDOUT') ||
31
+ errorMessage.includes('getaddrinfo') ||
32
+ errorMessage.includes('network');
33
+ if (isNetworkError) {
34
+ // Throw error and let command handle exit
35
+ throw new Error('❌ Network error: Unable to connect to ByteRover servers. Please check your internet connection and try again.');
36
+ }
37
+ else {
38
+ console.warn(`Warning: OIDC discovery failed, using fallback URLs for ${ENVIRONMENT} environment.`, errorMessage);
39
+ }
28
40
  }
29
41
  return {
30
42
  authorizationUrl,
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Domain configurations for the context tree structure.
3
+ * Each domain represents a specific area of knowledge in the project.
4
+ */
5
+ export interface DomainConfig {
6
+ description: string;
7
+ name: string;
8
+ }
9
+ /**
10
+ * Predefined domains that will be scaffolded during project initialization.
11
+ */
12
+ export declare const CONTEXT_TREE_DOMAINS: DomainConfig[];
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Predefined domains that will be scaffolded during project initialization.
3
+ */
4
+ export const CONTEXT_TREE_DOMAINS = [
5
+ {
6
+ description: 'Ensure all code follows style guidelines and quality standards',
7
+ name: 'code_style',
8
+ },
9
+ {
10
+ description: 'UI libraries, themes, and design guidelines',
11
+ name: 'design',
12
+ },
13
+ {
14
+ description: 'Project structure, components, and related context',
15
+ name: 'structure',
16
+ },
17
+ {
18
+ description: 'Security and compliance information',
19
+ name: 'compliance',
20
+ },
21
+ {
22
+ description: 'Testing implementation context',
23
+ name: 'testing',
24
+ },
25
+ {
26
+ description: 'Bug fixing logic and procedures',
27
+ name: 'bug_fixes',
28
+ },
29
+ ];
@@ -17,6 +17,7 @@ type EnvironmentConfig = {
17
17
  clientId: string;
18
18
  cogitApiBaseUrl: string;
19
19
  issuerUrl: string;
20
+ llmGrpcEndpoint: string;
20
21
  memoraApiBaseUrl: string;
21
22
  mixpanelToken: string;
22
23
  scopes: string[];
@@ -33,4 +34,9 @@ export declare const ENV_CONFIG: Record<Environment, EnvironmentConfig>;
33
34
  * @returns The environment configuration.
34
35
  */
35
36
  export declare const getCurrentConfig: () => EnvironmentConfig;
37
+ /**
38
+ * Check if the current environment is development.
39
+ * @returns True if in development mode, false otherwise.
40
+ */
41
+ export declare const isDevelopment: () => boolean;
36
42
  export {};