byterover-cli 0.2.0 → 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 (498) 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 +53 -2
  18. package/dist/commands/init.js +279 -66
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/logout.d.ts +16 -0
  21. package/dist/commands/logout.js +61 -0
  22. package/dist/commands/pull.d.ts +33 -0
  23. package/dist/commands/pull.js +115 -0
  24. package/dist/commands/push.d.ts +13 -13
  25. package/dist/commands/push.js +81 -101
  26. package/dist/commands/query.d.ts +63 -0
  27. package/dist/commands/query.js +349 -0
  28. package/dist/commands/space/list.d.ts +5 -2
  29. package/dist/commands/space/list.js +60 -56
  30. package/dist/commands/space/switch.d.ts +16 -0
  31. package/dist/commands/space/switch.js +102 -53
  32. package/dist/commands/status.d.ts +5 -2
  33. package/dist/commands/status.js +43 -33
  34. package/dist/commands/watch.d.ts +23 -0
  35. package/dist/commands/watch.js +171 -0
  36. package/dist/config/auth.config.js +14 -2
  37. package/dist/config/context-tree-domains.d.ts +12 -0
  38. package/dist/config/context-tree-domains.js +29 -0
  39. package/dist/config/environment.d.ts +6 -0
  40. package/dist/config/environment.js +9 -2
  41. package/dist/constants.d.ts +5 -0
  42. package/dist/constants.js +6 -0
  43. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  44. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  45. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  46. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  47. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  48. package/dist/core/domain/cipher/agent/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  50. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  51. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  52. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  53. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  54. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  55. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  56. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  57. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  58. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  59. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  60. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  61. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  62. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  63. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  64. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  65. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  66. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  67. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  68. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  69. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  70. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  71. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  72. package/dist/core/domain/cipher/memory/types.js +4 -0
  73. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  74. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  75. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  76. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  77. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  78. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  79. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  80. package/dist/core/domain/cipher/todos/index.js +4 -0
  81. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  82. package/dist/core/domain/cipher/todos/types.js +5 -0
  83. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  84. package/dist/core/domain/cipher/tools/constants.js +24 -0
  85. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  86. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  87. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  88. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  89. package/dist/core/domain/entities/brv-config.js +115 -17
  90. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  91. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  92. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  93. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  94. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  95. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  96. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  97. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  98. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  99. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  100. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  101. package/dist/core/domain/entities/context-tree-index.js +27 -0
  102. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  103. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  104. package/dist/core/domain/entities/event.d.ts +1 -1
  105. package/dist/core/domain/entities/event.js +4 -1
  106. package/dist/core/domain/entities/parser.d.ts +567 -0
  107. package/dist/core/domain/entities/parser.js +10 -0
  108. package/dist/core/domain/entities/playbook.d.ts +2 -23
  109. package/dist/core/domain/entities/playbook.js +2 -70
  110. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  111. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  112. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  113. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  114. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  115. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  116. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  117. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  118. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  119. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  120. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  121. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  122. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  123. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  124. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  125. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  128. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  129. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  130. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  131. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  132. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  133. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  134. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  135. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  136. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  137. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  139. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  140. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  141. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  142. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  143. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  144. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  145. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  146. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  147. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  148. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  149. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  150. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  151. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  153. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  155. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  156. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  157. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  158. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  159. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  160. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  161. package/dist/core/interfaces/cipher/message-types.js +5 -0
  162. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  163. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  164. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  165. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  166. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  167. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  168. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  169. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  171. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  173. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  174. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  175. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  176. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  177. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  178. package/dist/core/interfaces/i-rule-template-service.d.ts +0 -4
  179. package/dist/core/interfaces/i-rule-template-service.js +1 -4
  180. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  181. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  182. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  183. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  184. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  185. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  186. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  187. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  188. package/dist/hooks/error/clean-errors.d.ts +7 -0
  189. package/dist/hooks/error/clean-errors.js +50 -0
  190. package/dist/hooks/init/welcome.js +72 -1
  191. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  192. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  193. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  194. package/dist/infra/cipher/agent-service-factory.js +212 -0
  195. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  196. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  197. package/dist/infra/cipher/blob/index.d.ts +10 -0
  198. package/dist/infra/cipher/blob/index.js +12 -0
  199. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  200. package/dist/infra/cipher/blob/migrations.js +148 -0
  201. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  202. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  203. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  204. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  205. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  206. package/dist/infra/cipher/cipher-agent.js +317 -0
  207. package/dist/infra/cipher/command-parser.d.ts +23 -0
  208. package/dist/infra/cipher/command-parser.js +85 -0
  209. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  210. package/dist/infra/cipher/display/todo-display.js +129 -0
  211. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  212. package/dist/infra/cipher/events/event-emitter.js +158 -0
  213. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  214. package/dist/infra/cipher/exit-codes.js +58 -0
  215. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  216. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  217. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  218. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  219. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  220. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  221. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  222. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  223. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  224. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  225. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  226. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  227. package/dist/infra/cipher/interactive-commands.js +198 -0
  228. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  229. package/dist/infra/cipher/interactive-loop.js +352 -0
  230. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  231. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  232. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  233. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  234. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  235. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  236. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  237. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  238. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  239. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  240. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  241. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  242. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  243. package/dist/infra/cipher/llm/context/index.js +2 -0
  244. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  245. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  246. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  247. package/dist/infra/cipher/llm/context/utils.js +89 -0
  248. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  249. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  250. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  251. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  252. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  253. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  254. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  255. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  256. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  257. package/dist/infra/cipher/llm/generators/index.js +13 -0
  258. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  259. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  260. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  261. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  262. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  263. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  264. package/dist/infra/cipher/llm/index.d.ts +9 -0
  265. package/dist/infra/cipher/llm/index.js +13 -0
  266. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  267. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  268. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  269. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  270. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  271. package/dist/infra/cipher/llm/response-validator.js +157 -0
  272. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  273. package/dist/infra/cipher/llm/retry/index.js +10 -0
  274. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  275. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  276. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  277. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  278. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  279. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  280. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  281. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  282. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  283. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  284. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  285. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  286. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  287. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  288. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  289. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  290. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  291. package/dist/infra/cipher/logger/console-logger.js +63 -0
  292. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  293. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  294. package/dist/infra/cipher/memory/index.d.ts +6 -0
  295. package/dist/infra/cipher/memory/index.js +7 -0
  296. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  297. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  298. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  299. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  300. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  301. package/dist/infra/cipher/process/command-validator.js +266 -0
  302. package/dist/infra/cipher/process/index.d.ts +8 -0
  303. package/dist/infra/cipher/process/index.js +8 -0
  304. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  305. package/dist/infra/cipher/process/process-service.js +439 -0
  306. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  307. package/dist/infra/cipher/session/chat-session.js +165 -0
  308. package/dist/infra/cipher/session/index.d.ts +6 -0
  309. package/dist/infra/cipher/session/index.js +5 -0
  310. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  311. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  312. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  313. package/dist/infra/cipher/session/session-manager.js +172 -0
  314. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  315. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  316. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  317. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  318. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  319. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  320. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  321. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  322. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  323. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  324. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  326. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  327. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  328. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  329. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  330. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  331. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  332. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  333. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  334. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  335. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  336. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  337. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  338. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  339. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  340. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  342. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  344. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  346. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  347. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  348. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  350. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  351. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  352. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  353. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  354. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  355. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  356. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  357. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  358. package/dist/infra/cipher/tools/index.d.ts +18 -0
  359. package/dist/infra/cipher/tools/index.js +19 -0
  360. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  361. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  362. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  363. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  364. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  365. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  366. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  367. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  368. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  369. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  370. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  371. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  372. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  373. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  374. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  375. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  376. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  377. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  378. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  379. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  380. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  381. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  382. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  383. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  384. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  385. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  386. package/dist/infra/config/file-config-store.js +9 -3
  387. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  388. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  389. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  390. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  391. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  392. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  393. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  394. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  395. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  396. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  397. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  398. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  399. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  400. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  401. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  402. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  403. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  404. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  405. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  406. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  407. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  408. package/dist/infra/parsers/clean/shared.js +273 -0
  409. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  410. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  411. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  412. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  413. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  414. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  415. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  416. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  417. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  418. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  419. package/dist/infra/rule/constants.d.ts +4 -0
  420. package/dist/infra/rule/constants.js +4 -0
  421. package/dist/infra/rule/rule-template-service.js +1 -1
  422. package/dist/infra/rule/rule-writer-service.js +1 -5
  423. package/dist/infra/space/http-space-service.js +2 -1
  424. package/dist/infra/team/http-team-service.js +2 -1
  425. package/dist/infra/user/http-user-service.js +2 -1
  426. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  427. package/dist/infra/watcher/file-watcher-service.js +81 -0
  428. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  429. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  430. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  431. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  432. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  433. package/dist/resources/prompts/reflection.yml +27 -0
  434. package/dist/resources/prompts/system-prompt.yml +82 -0
  435. package/dist/resources/prompts/tool-outputs.yml +30 -0
  436. package/dist/templates/README.md +6 -7
  437. package/dist/templates/sections/command-reference.md +40 -93
  438. package/dist/templates/sections/workflow.md +3 -30
  439. package/dist/utils/emoji-helpers.d.ts +38 -0
  440. package/dist/utils/emoji-helpers.js +42 -0
  441. package/dist/utils/error-handler.d.ts +51 -0
  442. package/dist/utils/error-handler.js +169 -0
  443. package/dist/utils/error-helpers.d.ts +30 -0
  444. package/dist/utils/error-helpers.js +47 -0
  445. package/dist/utils/file-helpers.d.ts +15 -0
  446. package/dist/utils/file-helpers.js +44 -0
  447. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  448. package/dist/utils/oclif-error-helpers.js +46 -0
  449. package/dist/utils/tool-display-formatter.d.ts +53 -0
  450. package/dist/utils/tool-display-formatter.js +257 -0
  451. package/oclif.manifest.json +422 -142
  452. package/package.json +29 -10
  453. package/dist/commands/add.d.ts +0 -49
  454. package/dist/commands/add.js +0 -192
  455. package/dist/commands/complete.d.ts +0 -108
  456. package/dist/commands/complete.js +0 -340
  457. package/dist/commands/retrieve.d.ts +0 -26
  458. package/dist/commands/retrieve.js +0 -101
  459. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  460. package/dist/core/domain/entities/curator-output.js +0 -23
  461. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  462. package/dist/core/domain/entities/delta-batch.js +0 -52
  463. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  464. package/dist/core/domain/entities/delta-operation.js +0 -50
  465. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  466. package/dist/core/domain/entities/executor-output.js +0 -33
  467. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  468. package/dist/core/domain/entities/reflector-output.js +0 -44
  469. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  470. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  471. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  472. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  473. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  474. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  475. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  476. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  477. package/dist/infra/ace/ace-file-utils.js +0 -83
  478. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  479. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  480. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  481. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  482. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  483. package/dist/infra/ace/file-delta-store.js +0 -26
  484. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  485. package/dist/infra/ace/file-executor-output-store.js +0 -26
  486. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  487. package/dist/infra/ace/file-playbook-store.js +0 -107
  488. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  489. package/dist/infra/ace/file-reflection-store.js +0 -55
  490. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  491. package/dist/infra/playbook/file-playbook-service.js +0 -132
  492. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  493. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  494. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  495. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  496. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  497. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  498. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { confirm, search } from '@inquirer/prompts';
2
- import { Command } from '@oclif/core';
2
+ import { Command, Flags } from '@oclif/core';
3
3
  import { AGENT_VALUES } from '../core/domain/entities/agent.js';
4
4
  import { RuleExistsError } from '../core/domain/errors/rule-error.js';
5
5
  import { FsFileService } from '../infra/file/fs-file-service.js';
@@ -19,6 +19,12 @@ const AGENTS = AGENT_VALUES.map((agent) => ({
19
19
  export default class GenRules extends Command {
20
20
  static description = 'Generate rule instructions for coding agents to work with ByteRover correctly';
21
21
  static examples = ['<%= config.bin %> <%= command.id %>'];
22
+ static flags = {
23
+ agent: Flags.string({
24
+ char: 'a',
25
+ description: 'Agent to generate rules for (optional, will prompt if not provided)',
26
+ }),
27
+ };
22
28
  createServices() {
23
29
  const fileService = new FsFileService();
24
30
  const templateLoader = new FsTemplateLoader(fileService);
@@ -58,32 +64,45 @@ export default class GenRules extends Command {
58
64
  });
59
65
  }
60
66
  async run() {
67
+ const { flags } = await this.parse(GenRules);
61
68
  const { ruleWriterService, trackingService } = this.createServices();
62
- // Track rule generation
63
- await trackingService.track('rule:generate');
64
- // Interactive selection with search
65
- const answer = await this.promptForAgentSelection();
66
- this.log(`Generating rules for: ${answer}`);
67
69
  try {
68
- await ruleWriterService.writeRule(answer, false);
69
- this.log(`✅ Successfully generated rule file for ${answer}`);
70
- }
71
- catch (error) {
72
- if (error instanceof RuleExistsError) {
73
- const overwrite = await this.promptForOverwriteConfirmation(answer);
74
- if (overwrite) {
75
- // Retry with forced=true
76
- await ruleWriterService.writeRule(answer, true);
77
- this.log(`✅ Successfully generated rule file for ${answer}`);
70
+ // Track rule generation
71
+ await trackingService.track('rule:generate');
72
+ // Use provided agent or prompt for selection
73
+ const answer = flags.agent ? flags.agent : await this.promptForAgentSelection();
74
+ this.log(`Generating rules for: ${answer}`);
75
+ try {
76
+ await ruleWriterService.writeRule(answer, false);
77
+ this.log(`✅ Successfully generated rule file for ${answer}`);
78
+ }
79
+ catch (error) {
80
+ if (error instanceof RuleExistsError) {
81
+ const overwrite = await this.promptForOverwriteConfirmation(answer);
82
+ if (overwrite) {
83
+ // Retry with forced=true
84
+ await ruleWriterService.writeRule(answer, true);
85
+ this.log(`✅ Successfully generated rule file for ${answer}`);
86
+ }
87
+ else {
88
+ this.log(`Skipping rule file generation for ${answer}`);
89
+ }
78
90
  }
79
91
  else {
80
- this.log(`Skipping rule file generation for ${answer}`);
92
+ // Non-recoverable error - throw to let oclif handle display
93
+ this.error(`Failed to generate rule file: ${error instanceof Error ? error.message : String(error)}`);
81
94
  }
82
95
  }
83
- else {
84
- // Non-recoverable error
85
- this.error(`Failed to generate rule file: ${error instanceof Error ? error.message : String(error)}`);
96
+ }
97
+ catch (error) {
98
+ // Handle user cancelling any prompt (Ctrl+C or closing stdin)
99
+ const errorMessage = error instanceof Error ? error.message : String(error);
100
+ if (errorMessage.includes('User force closed') || errorMessage.includes('force closed')) {
101
+ this.log('Cancelled.');
102
+ return;
86
103
  }
104
+ // For other errors, throw to let oclif handle display
105
+ this.error(error instanceof Error ? error.message : 'An error occurred');
87
106
  }
88
107
  }
89
108
  }
@@ -1,24 +1,75 @@
1
1
  import { Command } from '@oclif/core';
2
+ import type { AuthToken } from '../core/domain/entities/auth-token.js';
2
3
  import type { Space } from '../core/domain/entities/space.js';
3
4
  import type { Team } from '../core/domain/entities/team.js';
4
- import type { IPlaybookService } from '../core/interfaces/i-playbook-service.js';
5
+ import type { IContextTreeService } from '../core/interfaces/i-context-tree-service.js';
6
+ import type { IContextTreeSnapshotService } from '../core/interfaces/i-context-tree-snapshot-service.js';
5
7
  import type { IProjectConfigStore } from '../core/interfaces/i-project-config-store.js';
8
+ import type { IRuleWriterService } from '../core/interfaces/i-rule-writer-service.js';
6
9
  import type { ISpaceService } from '../core/interfaces/i-space-service.js';
7
10
  import type { ITeamService } from '../core/interfaces/i-team-service.js';
8
11
  import type { ITokenStore } from '../core/interfaces/i-token-store.js';
12
+ import { type Agent } from '../core/domain/entities/agent.js';
13
+ import { BrvConfig } from '../core/domain/entities/brv-config.js';
9
14
  import { ITrackingService } from '../core/interfaces/i-tracking-service.js';
15
+ /**
16
+ * Represents a legacy config that exists but has version issues.
17
+ * Used to display config info during re-initialization prompt.
18
+ */
19
+ export type LegacyProjectConfigInfo = {
20
+ /**
21
+ * undefined = missing, string = mismatched
22
+ */
23
+ currentVersion: string | undefined;
24
+ spaceName: string;
25
+ teamName: string;
26
+ type: 'legacy';
27
+ };
10
28
  export default class Init extends Command {
11
29
  static description: string;
12
30
  static examples: string[];
31
+ static flags: {
32
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
33
+ };
34
+ protected aceDirectoryExists(baseDir?: string): Promise<boolean>;
35
+ protected cleanupBeforeReInitialization(): Promise<void>;
36
+ protected confirmReInitialization(config: BrvConfig | LegacyProjectConfigInfo): Promise<boolean>;
13
37
  protected createServices(): {
14
- playbookService: IPlaybookService;
38
+ contextTreeService: IContextTreeService;
39
+ contextTreeSnapshotService: IContextTreeSnapshotService;
15
40
  projectConfigStore: IProjectConfigStore;
41
+ ruleWriterService: IRuleWriterService;
16
42
  spaceService: ISpaceService;
17
43
  teamService: ITeamService;
18
44
  tokenStore: ITokenStore;
19
45
  trackingService: ITrackingService;
20
46
  };
47
+ protected detectWorkspacesForAgent(agent: Agent): {
48
+ chatLogPath: string;
49
+ cwd: string;
50
+ };
51
+ protected ensureAuthenticated(tokenStore: ITokenStore): Promise<AuthToken>;
52
+ protected fetchAndSelectSpace(spaceService: ISpaceService, token: AuthToken, team: Team): Promise<Space | undefined>;
53
+ protected fetchAndSelectTeam(teamService: ITeamService, token: AuthToken): Promise<Team | undefined>;
54
+ protected generateRulesForAgent(ruleWriterService: IRuleWriterService, agent: Agent): Promise<void>;
55
+ protected getExistingConfig(projectConfigStore: IProjectConfigStore): Promise<BrvConfig | LegacyProjectConfigInfo | undefined>;
56
+ protected initializeMemoryContextDir(name: string, initFn: () => Promise<string>): Promise<void>;
57
+ protected isLegacyProjectConfig(config: BrvConfig | LegacyProjectConfigInfo): config is LegacyProjectConfigInfo;
58
+ protected promptAceDeprecationRemoval(): Promise<boolean>;
59
+ /**
60
+ * Prompts the user to select an agent.
61
+ * This method is protected to allow test overrides.
62
+ * @returns The selected agent
63
+ */
64
+ protected promptForAgentSelection(): Promise<Agent>;
65
+ /**
66
+ * Prompts the user to confirm overwriting an existing rule file.
67
+ * This method is protected to allow test overrides.
68
+ */
69
+ protected promptForOverwriteConfirmation(agent: Agent): Promise<boolean>;
21
70
  protected promptForSpaceSelection(spaces: Space[]): Promise<Space>;
22
71
  protected promptForTeamSelection(teams: Team[]): Promise<Team>;
72
+ protected removeAceDirectory(baseDir?: string): Promise<void>;
23
73
  run(): Promise<void>;
74
+ private logSuccess;
24
75
  }
@@ -1,28 +1,96 @@
1
- import { select } from '@inquirer/prompts';
2
- import { Command, ux } from '@oclif/core';
1
+ import { confirm, search, select } from '@inquirer/prompts';
2
+ import { Command, Flags, ux } from '@oclif/core';
3
+ import { access, readFile, rm } from 'node:fs/promises';
4
+ import { join } from 'node:path';
3
5
  import { getCurrentConfig } from '../config/environment.js';
4
- import { BRV_DIR, PROJECT_CONFIG_FILE } from '../constants.js';
6
+ import { ACE_DIR, BRV_CONFIG_VERSION, BRV_DIR, PROJECT_CONFIG_FILE } from '../constants.js';
7
+ import { AGENT_VALUES } from '../core/domain/entities/agent.js';
5
8
  import { BrvConfig } from '../core/domain/entities/brv-config.js';
9
+ import { BrvConfigVersionError } from '../core/domain/errors/brv-config-version-error.js';
10
+ import { RuleExistsError } from '../core/domain/errors/rule-error.js';
6
11
  import { ProjectConfigStore } from '../infra/config/file-config-store.js';
7
- import { FilePlaybookService } from '../infra/playbook/file-playbook-service.js';
12
+ import { FileContextTreeService } from '../infra/context-tree/file-context-tree-service.js';
13
+ import { FileContextTreeSnapshotService } from '../infra/context-tree/file-context-tree-snapshot-service.js';
14
+ import { FsFileService } from '../infra/file/fs-file-service.js';
15
+ import { RuleTemplateService } from '../infra/rule/rule-template-service.js';
16
+ import { RuleWriterService } from '../infra/rule/rule-writer-service.js';
8
17
  import { HttpSpaceService } from '../infra/space/http-space-service.js';
9
18
  import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
10
19
  import { HttpTeamService } from '../infra/team/http-team-service.js';
20
+ import { FsTemplateLoader } from '../infra/template/fs-template-loader.js';
11
21
  import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
22
+ import { WorkspaceDetectorService } from '../infra/workspace/workspace-detector-service.js';
12
23
  export default class Init extends Command {
13
- static description = `Initialize a project with ByteRover (creates ${BRV_DIR}/${PROJECT_CONFIG_FILE} with team/space selection and initializes ACE playbook)`;
24
+ static description = `Initialize a project with ByteRover (creates ${BRV_DIR}/${PROJECT_CONFIG_FILE} with team/space selection and initializes Context Tree)`;
14
25
  static examples = [
15
26
  '<%= config.bin %> <%= command.id %>',
16
27
  '# Re-initialize if config exists (will show current config and exit):\n<%= config.bin %> <%= command.id %>',
17
28
  '# Full workflow: login then initialize:\n<%= config.bin %> login\n<%= config.bin %> <%= command.id %>',
18
29
  ];
30
+ static flags = {
31
+ force: Flags.boolean({
32
+ char: 'f',
33
+ default: false,
34
+ description: 'Force re-initialization without confirmation prompt',
35
+ }),
36
+ };
37
+ async aceDirectoryExists(baseDir) {
38
+ const dir = baseDir ?? process.cwd();
39
+ const acePath = join(dir, BRV_DIR, ACE_DIR);
40
+ try {
41
+ await access(acePath);
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ async cleanupBeforeReInitialization() {
49
+ const brvDir = join(process.cwd(), BRV_DIR);
50
+ this.log('\n Cleaning up existing ByteRover directory...');
51
+ ux.action.start(` Removing ${BRV_DIR}/`);
52
+ try {
53
+ await rm(brvDir, { force: true, recursive: true });
54
+ ux.action.stop('✓');
55
+ }
56
+ catch (error) {
57
+ ux.action.stop('✗');
58
+ throw new Error(`Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`);
59
+ }
60
+ }
61
+ async confirmReInitialization(config) {
62
+ if (this.isLegacyProjectConfig(config)) {
63
+ const versionStatus = config.currentVersion === undefined ? 'missing' : `${config.currentVersion} → ${BRV_CONFIG_VERSION}`;
64
+ this.log(`\n⚠️ Project has an outdated configuration (version: ${versionStatus})`);
65
+ }
66
+ else {
67
+ this.log('\n Project is already initialized');
68
+ }
69
+ this.log(` Team: ${config.teamName}`);
70
+ this.log(` Space: ${config.spaceName}`);
71
+ this.log(` Config: ${join(process.cwd(), BRV_DIR, PROJECT_CONFIG_FILE)}`);
72
+ this.log('\n Re-initializing will:');
73
+ this.log(` - Remove the entire ${BRV_DIR}/ directory and all its contents`);
74
+ this.log(' - Allow you to select a new team/space');
75
+ this.log(' - Create a fresh configuration and Context Tree');
76
+ this.log(' - Regenerate rule instructions\n');
77
+ return confirm({
78
+ default: false,
79
+ message: 'Continue with re-initialization?',
80
+ });
81
+ }
19
82
  createServices() {
20
83
  const envConfig = getCurrentConfig();
21
84
  const tokenStore = new KeychainTokenStore();
22
85
  const trackingService = new MixpanelTrackingService(tokenStore);
86
+ const fileService = new FsFileService();
87
+ const templateLoader = new FsTemplateLoader(fileService);
88
+ const ruleTemplateService = new RuleTemplateService(templateLoader);
23
89
  return {
24
- playbookService: new FilePlaybookService(),
90
+ contextTreeService: new FileContextTreeService(),
91
+ contextTreeSnapshotService: new FileContextTreeSnapshotService(),
25
92
  projectConfigStore: new ProjectConfigStore(),
93
+ ruleWriterService: new RuleWriterService(fileService, ruleTemplateService),
26
94
  spaceService: new HttpSpaceService({
27
95
  apiBaseUrl: envConfig.apiBaseUrl,
28
96
  }),
@@ -33,6 +101,155 @@ export default class Init extends Command {
33
101
  trackingService,
34
102
  };
35
103
  }
104
+ detectWorkspacesForAgent(agent) {
105
+ const detector = new WorkspaceDetectorService();
106
+ const result = detector.detectWorkspaces(agent);
107
+ return {
108
+ chatLogPath: result.chatLogPath,
109
+ cwd: result.cwd,
110
+ };
111
+ }
112
+ async ensureAuthenticated(tokenStore) {
113
+ const token = await tokenStore.load();
114
+ if (token === undefined) {
115
+ this.error('Not authenticated. Please run "brv login" first.');
116
+ }
117
+ if (!token.isValid()) {
118
+ this.error('Authentication token expired. Please run "brv login" again.');
119
+ }
120
+ return token;
121
+ }
122
+ async fetchAndSelectSpace(spaceService, token, team) {
123
+ ux.action.start('\nFetching all spaces');
124
+ const { spaces } = await spaceService.getSpaces(token.accessToken, token.sessionKey, team.id, { fetchAll: true });
125
+ ux.action.stop();
126
+ if (spaces.length === 0) {
127
+ this.log(`No spaces found in team "${team.getDisplayName()}"`);
128
+ this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first space for ${team.getDisplayName()}.`);
129
+ return undefined;
130
+ }
131
+ this.log();
132
+ return this.promptForSpaceSelection(spaces);
133
+ }
134
+ async fetchAndSelectTeam(teamService, token) {
135
+ ux.action.start('Fetching all teams');
136
+ const { teams } = await teamService.getTeams(token.accessToken, token.sessionKey, { fetchAll: true });
137
+ ux.action.stop();
138
+ if (teams.length === 0) {
139
+ this.log('No teams found.');
140
+ this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first team.`);
141
+ return undefined;
142
+ }
143
+ this.log();
144
+ return this.promptForTeamSelection(teams);
145
+ }
146
+ async generateRulesForAgent(ruleWriterService, agent) {
147
+ this.log(`Generating rules for: ${agent}`);
148
+ try {
149
+ await ruleWriterService.writeRule(agent, false);
150
+ this.log(`✅ Successfully generated rule file for ${agent}`);
151
+ }
152
+ catch (error) {
153
+ if (error instanceof RuleExistsError) {
154
+ const overwrite = await this.promptForOverwriteConfirmation(agent);
155
+ if (overwrite) {
156
+ await ruleWriterService.writeRule(agent, true);
157
+ this.log(`✅ Successfully generated rule file for ${agent}`);
158
+ }
159
+ else {
160
+ this.log(`Skipping rule file generation for ${agent}`);
161
+ }
162
+ }
163
+ else {
164
+ throw error;
165
+ }
166
+ }
167
+ }
168
+ async getExistingConfig(projectConfigStore) {
169
+ const exists = await projectConfigStore.exists();
170
+ if (!exists)
171
+ return undefined;
172
+ try {
173
+ const projectConfig = await projectConfigStore.read();
174
+ if (projectConfig === undefined) {
175
+ throw new Error('Configuration file exists but cannot be read. Please check .brv/config.json');
176
+ }
177
+ return projectConfig;
178
+ }
179
+ catch (error) {
180
+ if (error instanceof BrvConfigVersionError) {
181
+ // Legacy/outdated config - read raw JSON for display info
182
+ const configPath = join(process.cwd(), BRV_DIR, PROJECT_CONFIG_FILE);
183
+ const content = await readFile(configPath, 'utf8');
184
+ // As type assertion here since rawJson is default to any/unknown anyway
185
+ const rawJson = JSON.parse(content);
186
+ return {
187
+ currentVersion: error.currentVersion,
188
+ spaceName: typeof rawJson.spaceName === 'string' ? rawJson.spaceName : 'Unknown',
189
+ teamName: typeof rawJson.teamName === 'string' ? rawJson.teamName : 'Unknown',
190
+ type: 'legacy',
191
+ };
192
+ }
193
+ // Re-throw other errors
194
+ throw error;
195
+ }
196
+ }
197
+ async initializeMemoryContextDir(name, initFn) {
198
+ this.log(`\nInitializing ${name}...`);
199
+ try {
200
+ const path = await initFn();
201
+ this.log(`✓ ${name} initialized in ${path}`);
202
+ }
203
+ catch (error) {
204
+ this.warn(`${name} initialization skipped: ${error instanceof Error ? error.message : 'Unknown error'}`);
205
+ }
206
+ }
207
+ isLegacyProjectConfig(config) {
208
+ return 'type' in config && config.type === 'legacy';
209
+ }
210
+ async promptAceDeprecationRemoval() {
211
+ this.log('\n The ACE system is being deprecated.');
212
+ this.log(' ByteRover is migrating to the new Context Tree system for improved');
213
+ this.log(' memory organization and retrieval.');
214
+ this.log('');
215
+ this.log(' We detected an existing ACE folder at .brv/ace/');
216
+ this.log(' This folder and all its contents can be safely removed.\n');
217
+ return confirm({
218
+ default: true,
219
+ message: 'Remove the ACE folder and its contents?',
220
+ });
221
+ }
222
+ /**
223
+ * Prompts the user to select an agent.
224
+ * This method is protected to allow test overrides.
225
+ * @returns The selected agent
226
+ */
227
+ async promptForAgentSelection() {
228
+ const AGENTS = AGENT_VALUES.map((agent) => ({
229
+ name: agent,
230
+ value: agent,
231
+ }));
232
+ const answer = await search({
233
+ message: 'Which agent you are using (type to search):',
234
+ async source(input) {
235
+ if (!input)
236
+ return AGENTS;
237
+ return AGENTS.filter((agent) => agent.name.toLowerCase().includes(input.toLowerCase()) ||
238
+ agent.value.toLowerCase().includes(input.toLowerCase()));
239
+ },
240
+ });
241
+ return answer;
242
+ }
243
+ /**
244
+ * Prompts the user to confirm overwriting an existing rule file.
245
+ * This method is protected to allow test overrides.
246
+ */
247
+ async promptForOverwriteConfirmation(agent) {
248
+ return confirm({
249
+ default: true,
250
+ message: `Rule file already exists for ${agent}. Overwrite?`,
251
+ });
252
+ }
36
253
  async promptForSpaceSelection(spaces) {
37
254
  const selectedSpaceId = await select({
38
255
  choices: spaces.map((space) => ({
@@ -61,80 +278,76 @@ export default class Init extends Command {
61
278
  }
62
279
  return selectedTeam;
63
280
  }
281
+ async removeAceDirectory(baseDir) {
282
+ const dir = baseDir ?? process.cwd();
283
+ const acePath = join(dir, BRV_DIR, ACE_DIR);
284
+ await rm(acePath, { force: true, recursive: true });
285
+ }
64
286
  async run() {
65
287
  try {
66
- const { playbookService, projectConfigStore, spaceService, teamService, tokenStore, trackingService } = this.createServices();
67
- // 1. Check if already initialized
68
- const isInitialized = await projectConfigStore.exists();
69
- if (isInitialized) {
70
- this.log('Project is already initialized with ByteRover.');
71
- const existingProjectConfig = await projectConfigStore.read();
72
- this.log(`Your space for this project is: ${existingProjectConfig?.teamName}/${existingProjectConfig?.spaceName}`);
73
- return;
288
+ const { flags } = await this.parse(Init);
289
+ const { contextTreeService, contextTreeSnapshotService, projectConfigStore, ruleWriterService, spaceService, teamService, tokenStore, trackingService, } = this.createServices();
290
+ const authToken = await this.ensureAuthenticated(tokenStore);
291
+ const existingConfig = await this.getExistingConfig(projectConfigStore);
292
+ if (existingConfig) {
293
+ const shouldCleanup = flags.force ? true : await this.confirmReInitialization(existingConfig);
294
+ if (shouldCleanup) {
295
+ await this.cleanupBeforeReInitialization();
296
+ this.log('\n');
297
+ }
298
+ else {
299
+ this.log('\nCancelled. Project configuration unchanged.');
300
+ return;
301
+ }
74
302
  }
75
303
  this.log('Initializing ByteRover project...\n');
76
- // 2. Load and validate authentication token
77
- const token = await tokenStore.load();
78
- if (token === undefined) {
79
- this.error('Not authenticated. Please run "brv login" first.');
80
- }
81
- if (!token.isValid()) {
82
- this.error('Authentication token expired. Please run "brv login" again.');
83
- }
84
- // 3. Fetch all teams with spinner
85
- ux.action.start('Fetching all teams');
86
- const teamResult = await teamService.getTeams(token.accessToken, token.sessionKey, { fetchAll: true });
87
- ux.action.stop();
88
- const { teams } = teamResult;
89
- if (teams.length === 0) {
90
- this.log('No teams found.');
91
- this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first team.`);
304
+ const selectedTeam = await this.fetchAndSelectTeam(teamService, authToken);
305
+ if (!selectedTeam)
92
306
  return;
93
- }
94
- // 4. Prompt for team selection
95
- this.log();
96
- const selectedTeam = await this.promptForTeamSelection(teams);
97
- // 5. Fetch all spaces for the selected team with spinner
98
- ux.action.start('Fetching all spaces');
99
- const spaceResult = await spaceService.getSpaces(token.accessToken, token.sessionKey, selectedTeam.id, {
100
- fetchAll: true,
101
- });
102
- ux.action.stop();
103
- const { spaces } = spaceResult;
104
- if (spaces.length === 0) {
105
- this.log(`No spaces found in team "${selectedTeam.getDisplayName()}"`);
106
- this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first space for ${selectedTeam.getDisplayName()}.`);
307
+ const selectedSpace = await this.fetchAndSelectSpace(spaceService, authToken, selectedTeam);
308
+ if (!selectedSpace)
107
309
  return;
310
+ // Handle ACE deprecation - check for existing ACE folder and offer removal
311
+ const aceExists = await this.aceDirectoryExists();
312
+ if (aceExists) {
313
+ const shouldRemoveAce = await this.promptAceDeprecationRemoval();
314
+ if (shouldRemoveAce) {
315
+ await this.removeAceDirectory();
316
+ this.log('✓ ACE folder removed');
317
+ }
108
318
  }
109
- // 6. Prompt for space selection
319
+ // ACE is deprecated - only initialize context tree
320
+ await this.initializeMemoryContextDir('context tree', () => contextTreeService.initialize());
321
+ // Create initial snapshot for change tracking (includes the template files just created)
322
+ await contextTreeSnapshotService.saveSnapshot();
323
+ this.log('✓ Context tree snapshot created');
110
324
  this.log();
111
- const selectedSpace = await this.promptForSpaceSelection(spaces);
112
- // 7. Create and save configuration
113
- const config = BrvConfig.fromSpace(selectedSpace);
325
+ const selectedAgent = await this.promptForAgentSelection();
326
+ this.log('Detecting workspaces...');
327
+ const { chatLogPath, cwd } = this.detectWorkspacesForAgent(selectedAgent);
328
+ this.log(`✓ Detected workspace: ${cwd}`);
329
+ const config = BrvConfig.fromSpace({
330
+ chatLogPath,
331
+ cwd,
332
+ ide: selectedAgent,
333
+ space: selectedSpace,
334
+ });
114
335
  await projectConfigStore.write(config);
115
- // 8. Initialize ACE playbook
116
- this.log('\nInitializing ACE context...');
117
- try {
118
- const playbookPath = await playbookService.initialize();
119
- this.log(`✓ ACE playbook initialized in ${playbookPath}`);
120
- }
121
- catch (error) {
122
- // Warn but don't fail if ACE init fails
123
- this.warn(`ACE initialization skipped: ${error instanceof Error ? error.message : 'Unknown error'}`);
124
- }
125
- // 9. Generate rules
126
336
  this.log(`\nGenerate rule instructions for coding agents to work with ByteRover correctly`);
127
337
  this.log();
128
- await this.config.runCommand('gen-rules');
129
- // Track space initialization
338
+ await this.generateRulesForAgent(ruleWriterService, selectedAgent);
339
+ await trackingService.track('rule:generate');
130
340
  await trackingService.track('space:init');
131
- // 10. Display success
132
- this.log(`\n✓ Project initialized successfully!`);
133
- this.log(`✓ Connected to space: ${selectedSpace.getDisplayName()}`);
134
- this.log(`✓ Configuration saved to: ${BRV_DIR}/${PROJECT_CONFIG_FILE}`);
341
+ this.logSuccess(selectedSpace);
135
342
  }
136
343
  catch (error) {
137
- this.error(error instanceof Error ? error.message : 'Initialization failed');
344
+ this.error(`Initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
138
345
  }
139
346
  }
347
+ logSuccess(space) {
348
+ this.log(`\n✓ Project initialized successfully!`);
349
+ this.log(`✓ Connected to space: ${space.getDisplayName()}`);
350
+ this.log(`✓ Configuration saved to: ${BRV_DIR}/${PROJECT_CONFIG_FILE}`);
351
+ this.log("NOTE: It's recommended to add .brv/ to your .gitignore file since ByteRover already takes care of memory/context versioning for you.");
352
+ }
140
353
  }
@@ -85,15 +85,20 @@ export default class Login extends Command {
85
85
  this.log('Successfully authenticated!');
86
86
  }
87
87
  catch (error) {
88
- this.error(error instanceof Error ? error.message : 'Authentication failed');
88
+ // Throw error to let oclif handle display
89
+ const errorMessage = error instanceof Error ? error.message : 'Authentication failed';
90
+ this.error(errorMessage);
89
91
  }
90
92
  }
91
93
  catch (error) {
92
94
  if (error instanceof DiscoveryError) {
93
- this.error(`Failed to configure authentication: ${error.message}\n` +
94
- 'Please check your network connection and try again.');
95
+ const errorMessage = `Failed to configure authentication: ${error.message}\n` +
96
+ 'Please check your network connection and try again.';
97
+ this.error(errorMessage);
95
98
  }
96
- this.error(error instanceof Error ? error.message : 'Authentication failed');
99
+ // Throw error to let oclif handle display
100
+ const errorMessage = error instanceof Error ? error.message : 'Authentication failed';
101
+ this.error(errorMessage);
97
102
  }
98
103
  finally {
99
104
  // Always cleanup server
@@ -0,0 +1,16 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { ITokenStore } from '../core/interfaces/i-token-store.js';
3
+ import type { ITrackingService } from '../core/interfaces/i-tracking-service.js';
4
+ export default class Logout extends Command {
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ };
10
+ protected confirmLogout(userEmail: string): Promise<boolean>;
11
+ protected createServices(): {
12
+ tokenStore: ITokenStore;
13
+ trackingService: ITrackingService;
14
+ };
15
+ run(): Promise<void>;
16
+ }
@@ -0,0 +1,61 @@
1
+ import { confirm } from '@inquirer/prompts';
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
4
+ import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
5
+ export default class Logout extends Command {
6
+ static description = 'Log out of ByteRover CLI and clear authentication (does not affect local project files)';
7
+ static examples = ['<%= config.bin %> <%= command.id %>', '<%= config.bin %> <%= command.id %> --yes'];
8
+ static flags = {
9
+ yes: Flags.boolean({
10
+ char: 'y',
11
+ default: false,
12
+ description: 'Skip confirmation prompt',
13
+ }),
14
+ };
15
+ async confirmLogout(userEmail) {
16
+ return confirm({
17
+ // Pressing 'Enter' = Yes
18
+ default: true,
19
+ message: `Logging out ${userEmail}. Are you sure?`,
20
+ });
21
+ }
22
+ createServices() {
23
+ const tokenStore = new KeychainTokenStore();
24
+ const trackingService = new MixpanelTrackingService(tokenStore);
25
+ return {
26
+ tokenStore,
27
+ trackingService,
28
+ };
29
+ }
30
+ async run() {
31
+ const { flags } = await this.parse(Logout);
32
+ const { tokenStore, trackingService } = this.createServices();
33
+ try {
34
+ const token = await tokenStore.load();
35
+ if (token === undefined) {
36
+ this.log('You are not currently logged in.');
37
+ return;
38
+ }
39
+ if (!flags.yes) {
40
+ const confirmed = await this.confirmLogout(token.userEmail);
41
+ if (!confirmed) {
42
+ this.log('Logout cancelled.');
43
+ return;
44
+ }
45
+ }
46
+ try {
47
+ await trackingService.track('auth:signed_out');
48
+ }
49
+ catch { }
50
+ await tokenStore.clear();
51
+ this.log('Successfully logged out.');
52
+ this.log("Run 'brv login' to authenticate again.");
53
+ }
54
+ catch (error) {
55
+ if (error instanceof Error && error.message.includes('keychain')) {
56
+ this.error('Unable to access system keychain. Please check your system permissions and try again.');
57
+ }
58
+ this.error(error instanceof Error ? error.message : 'Logout failed');
59
+ }
60
+ }
61
+ }