byterover-cli 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +63 -3
  18. package/dist/commands/init.js +285 -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,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,30 +1,90 @@
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 { ICogitPullService } from '../core/interfaces/i-cogit-pull-service.js';
6
+ import type { IContextTreeService } from '../core/interfaces/i-context-tree-service.js';
7
+ import type { IContextTreeSnapshotService } from '../core/interfaces/i-context-tree-snapshot-service.js';
8
+ import type { IContextTreeWriterService } from '../core/interfaces/i-context-tree-writer-service.js';
5
9
  import type { IProjectConfigStore } from '../core/interfaces/i-project-config-store.js';
10
+ import type { IRuleWriterService } from '../core/interfaces/i-rule-writer-service.js';
6
11
  import type { ISpaceService } from '../core/interfaces/i-space-service.js';
7
12
  import type { ITeamService } from '../core/interfaces/i-team-service.js';
8
13
  import type { ITokenStore } from '../core/interfaces/i-token-store.js';
14
+ import { type Agent } from '../core/domain/entities/agent.js';
9
15
  import { BrvConfig } from '../core/domain/entities/brv-config.js';
10
16
  import { ITrackingService } from '../core/interfaces/i-tracking-service.js';
17
+ /**
18
+ * Represents a legacy config that exists but has version issues.
19
+ * Used to display config info during re-initialization prompt.
20
+ */
21
+ export type LegacyProjectConfigInfo = {
22
+ /**
23
+ * undefined = missing, string = mismatched
24
+ */
25
+ currentVersion: string | undefined;
26
+ spaceName: string;
27
+ teamName: string;
28
+ type: 'legacy';
29
+ };
11
30
  export default class Init extends Command {
12
31
  static description: string;
13
32
  static examples: string[];
14
33
  static flags: {
15
34
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
35
  };
36
+ protected aceDirectoryExists(baseDir?: string): Promise<boolean>;
17
37
  protected cleanupBeforeReInitialization(): Promise<void>;
18
- protected confirmReInitialization(config: BrvConfig): Promise<boolean>;
38
+ protected confirmReInitialization(config: BrvConfig | LegacyProjectConfigInfo): Promise<boolean>;
19
39
  protected createServices(): {
20
- playbookService: IPlaybookService;
40
+ cogitPullService: ICogitPullService;
41
+ contextTreeService: IContextTreeService;
42
+ contextTreeSnapshotService: IContextTreeSnapshotService;
43
+ contextTreeWriterService: IContextTreeWriterService;
21
44
  projectConfigStore: IProjectConfigStore;
45
+ ruleWriterService: IRuleWriterService;
22
46
  spaceService: ISpaceService;
23
47
  teamService: ITeamService;
24
48
  tokenStore: ITokenStore;
25
49
  trackingService: ITrackingService;
26
50
  };
51
+ protected detectWorkspacesForAgent(agent: Agent): {
52
+ chatLogPath: string;
53
+ cwd: string;
54
+ };
55
+ protected ensureAuthenticated(tokenStore: ITokenStore): Promise<AuthToken>;
56
+ protected fetchAndSelectSpace(spaceService: ISpaceService, token: AuthToken, team: Team): Promise<Space | undefined>;
57
+ protected fetchAndSelectTeam(teamService: ITeamService, token: AuthToken): Promise<Team | undefined>;
58
+ protected generateRulesForAgent(ruleWriterService: IRuleWriterService, agent: Agent): Promise<void>;
59
+ protected getExistingConfig(projectConfigStore: IProjectConfigStore): Promise<BrvConfig | LegacyProjectConfigInfo | undefined>;
60
+ protected initializeMemoryContextDir(name: string, initFn: () => Promise<string>): Promise<void>;
61
+ protected isLegacyProjectConfig(config: BrvConfig | LegacyProjectConfigInfo): config is LegacyProjectConfigInfo;
62
+ protected promptAceDeprecationRemoval(): Promise<boolean>;
63
+ /**
64
+ * Prompts the user to select an agent.
65
+ * This method is protected to allow test overrides.
66
+ * @returns The selected agent
67
+ */
68
+ protected promptForAgentSelection(): Promise<Agent>;
69
+ /**
70
+ * Prompts the user to confirm overwriting an existing rule file.
71
+ * This method is protected to allow test overrides.
72
+ */
73
+ protected promptForOverwriteConfirmation(agent: Agent): Promise<boolean>;
27
74
  protected promptForSpaceSelection(spaces: Space[]): Promise<Space>;
28
75
  protected promptForTeamSelection(teams: Team[]): Promise<Team>;
76
+ protected removeAceDirectory(baseDir?: string): Promise<void>;
29
77
  run(): Promise<void>;
78
+ protected syncFromRemoteOrInitialize(params: {
79
+ cogitPullService: ICogitPullService;
80
+ contextTreeService: IContextTreeService;
81
+ contextTreeSnapshotService: IContextTreeSnapshotService;
82
+ contextTreeWriterService: IContextTreeWriterService;
83
+ projectConfig: {
84
+ spaceId: string;
85
+ teamId: string;
86
+ };
87
+ token: AuthToken;
88
+ }): Promise<void>;
89
+ private logSuccess;
30
90
  }
@@ -1,18 +1,29 @@
1
- import { confirm, select } from '@inquirer/prompts';
1
+ import { confirm, search, select } from '@inquirer/prompts';
2
2
  import { Command, Flags, ux } from '@oclif/core';
3
- import { rm } from 'node:fs/promises';
3
+ import { access, readFile, rm } from 'node:fs/promises';
4
4
  import { join } from 'node:path';
5
5
  import { getCurrentConfig } from '../config/environment.js';
6
- import { BRV_DIR, PROJECT_CONFIG_FILE } from '../constants.js';
6
+ import { ACE_DIR, BRV_CONFIG_VERSION, BRV_DIR, DEFAULT_BRANCH, PROJECT_CONFIG_FILE } from '../constants.js';
7
+ import { AGENT_VALUES } from '../core/domain/entities/agent.js';
7
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';
11
+ import { HttpCogitPullService } from '../infra/cogit/http-cogit-pull-service.js';
8
12
  import { ProjectConfigStore } from '../infra/config/file-config-store.js';
9
- import { FilePlaybookService } from '../infra/playbook/file-playbook-service.js';
13
+ import { FileContextTreeService } from '../infra/context-tree/file-context-tree-service.js';
14
+ import { FileContextTreeSnapshotService } from '../infra/context-tree/file-context-tree-snapshot-service.js';
15
+ import { FileContextTreeWriterService } from '../infra/context-tree/file-context-tree-writer-service.js';
16
+ import { FsFileService } from '../infra/file/fs-file-service.js';
17
+ import { RuleTemplateService } from '../infra/rule/rule-template-service.js';
18
+ import { RuleWriterService } from '../infra/rule/rule-writer-service.js';
10
19
  import { HttpSpaceService } from '../infra/space/http-space-service.js';
11
20
  import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
12
21
  import { HttpTeamService } from '../infra/team/http-team-service.js';
22
+ import { FsTemplateLoader } from '../infra/template/fs-template-loader.js';
13
23
  import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
24
+ import { WorkspaceDetectorService } from '../infra/workspace/workspace-detector-service.js';
14
25
  export default class Init extends Command {
15
- static description = `Initialize a project with ByteRover (creates ${BRV_DIR}/${PROJECT_CONFIG_FILE} with team/space selection and initializes ACE playbook)`;
26
+ static description = `Initialize a project with ByteRover (creates ${BRV_DIR}/${PROJECT_CONFIG_FILE} with team/space selection and initializes Context Tree)`;
16
27
  static examples = [
17
28
  '<%= config.bin %> <%= command.id %>',
18
29
  '# Re-initialize if config exists (will show current config and exit):\n<%= config.bin %> <%= command.id %>',
@@ -25,6 +36,17 @@ export default class Init extends Command {
25
36
  description: 'Force re-initialization without confirmation prompt',
26
37
  }),
27
38
  };
39
+ async aceDirectoryExists(baseDir) {
40
+ const dir = baseDir ?? process.cwd();
41
+ const acePath = join(dir, BRV_DIR, ACE_DIR);
42
+ try {
43
+ await access(acePath);
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
28
50
  async cleanupBeforeReInitialization() {
29
51
  const brvDir = join(process.cwd(), BRV_DIR);
30
52
  this.log('\n Cleaning up existing ByteRover directory...');
@@ -35,18 +57,24 @@ export default class Init extends Command {
35
57
  }
36
58
  catch (error) {
37
59
  ux.action.stop('✗');
38
- this.error(`Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`);
60
+ throw new Error(`Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`);
39
61
  }
40
62
  }
41
63
  async confirmReInitialization(config) {
42
- this.log('\n Project is already initialized');
64
+ if (this.isLegacyProjectConfig(config)) {
65
+ const versionStatus = config.currentVersion === undefined ? 'missing' : `${config.currentVersion} → ${BRV_CONFIG_VERSION}`;
66
+ this.log(`\n⚠️ Project has an outdated configuration (version: ${versionStatus})`);
67
+ }
68
+ else {
69
+ this.log('\n Project is already initialized');
70
+ }
43
71
  this.log(` Team: ${config.teamName}`);
44
72
  this.log(` Space: ${config.spaceName}`);
45
73
  this.log(` Config: ${join(process.cwd(), BRV_DIR, PROJECT_CONFIG_FILE)}`);
46
74
  this.log('\n Re-initializing will:');
47
75
  this.log(` - Remove the entire ${BRV_DIR}/ directory and all its contents`);
48
76
  this.log(' - Allow you to select a new team/space');
49
- this.log(' - Create a fresh configuration and ACE playbook');
77
+ this.log(' - Create a fresh configuration and Context Tree');
50
78
  this.log(' - Regenerate rule instructions\n');
51
79
  return confirm({
52
80
  default: false,
@@ -57,9 +85,19 @@ export default class Init extends Command {
57
85
  const envConfig = getCurrentConfig();
58
86
  const tokenStore = new KeychainTokenStore();
59
87
  const trackingService = new MixpanelTrackingService(tokenStore);
88
+ const fileService = new FsFileService();
89
+ const templateLoader = new FsTemplateLoader(fileService);
90
+ const ruleTemplateService = new RuleTemplateService(templateLoader);
91
+ const contextTreeSnapshotService = new FileContextTreeSnapshotService();
60
92
  return {
61
- playbookService: new FilePlaybookService(),
93
+ cogitPullService: new HttpCogitPullService({
94
+ apiBaseUrl: envConfig.cogitApiBaseUrl,
95
+ }),
96
+ contextTreeService: new FileContextTreeService(),
97
+ contextTreeSnapshotService,
98
+ contextTreeWriterService: new FileContextTreeWriterService({ snapshotService: contextTreeSnapshotService }),
62
99
  projectConfigStore: new ProjectConfigStore(),
100
+ ruleWriterService: new RuleWriterService(fileService, ruleTemplateService),
63
101
  spaceService: new HttpSpaceService({
64
102
  apiBaseUrl: envConfig.apiBaseUrl,
65
103
  }),
@@ -70,6 +108,155 @@ export default class Init extends Command {
70
108
  trackingService,
71
109
  };
72
110
  }
111
+ detectWorkspacesForAgent(agent) {
112
+ const detector = new WorkspaceDetectorService();
113
+ const result = detector.detectWorkspaces(agent);
114
+ return {
115
+ chatLogPath: result.chatLogPath,
116
+ cwd: result.cwd,
117
+ };
118
+ }
119
+ async ensureAuthenticated(tokenStore) {
120
+ const token = await tokenStore.load();
121
+ if (token === undefined) {
122
+ this.error('Not authenticated. Please run "brv login" first.');
123
+ }
124
+ if (!token.isValid()) {
125
+ this.error('Authentication token expired. Please run "brv login" again.');
126
+ }
127
+ return token;
128
+ }
129
+ async fetchAndSelectSpace(spaceService, token, team) {
130
+ ux.action.start('\nFetching all spaces');
131
+ const { spaces } = await spaceService.getSpaces(token.accessToken, token.sessionKey, team.id, { fetchAll: true });
132
+ ux.action.stop();
133
+ if (spaces.length === 0) {
134
+ this.log(`No spaces found in team "${team.getDisplayName()}"`);
135
+ this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first space for ${team.getDisplayName()}.`);
136
+ return undefined;
137
+ }
138
+ this.log();
139
+ return this.promptForSpaceSelection(spaces);
140
+ }
141
+ async fetchAndSelectTeam(teamService, token) {
142
+ ux.action.start('Fetching all teams');
143
+ const { teams } = await teamService.getTeams(token.accessToken, token.sessionKey, { fetchAll: true });
144
+ ux.action.stop();
145
+ if (teams.length === 0) {
146
+ this.log('No teams found.');
147
+ this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first team.`);
148
+ return undefined;
149
+ }
150
+ this.log();
151
+ return this.promptForTeamSelection(teams);
152
+ }
153
+ async generateRulesForAgent(ruleWriterService, agent) {
154
+ this.log(`Generating rules for: ${agent}`);
155
+ try {
156
+ await ruleWriterService.writeRule(agent, false);
157
+ this.log(`✅ Successfully generated rule file for ${agent}`);
158
+ }
159
+ catch (error) {
160
+ if (error instanceof RuleExistsError) {
161
+ const overwrite = await this.promptForOverwriteConfirmation(agent);
162
+ if (overwrite) {
163
+ await ruleWriterService.writeRule(agent, true);
164
+ this.log(`✅ Successfully generated rule file for ${agent}`);
165
+ }
166
+ else {
167
+ this.log(`Skipping rule file generation for ${agent}`);
168
+ }
169
+ }
170
+ else {
171
+ throw error;
172
+ }
173
+ }
174
+ }
175
+ async getExistingConfig(projectConfigStore) {
176
+ const exists = await projectConfigStore.exists();
177
+ if (!exists)
178
+ return undefined;
179
+ try {
180
+ const projectConfig = await projectConfigStore.read();
181
+ if (projectConfig === undefined) {
182
+ throw new Error('Configuration file exists but cannot be read. Please check .brv/config.json');
183
+ }
184
+ return projectConfig;
185
+ }
186
+ catch (error) {
187
+ if (error instanceof BrvConfigVersionError) {
188
+ // Legacy/outdated config - read raw JSON for display info
189
+ const configPath = join(process.cwd(), BRV_DIR, PROJECT_CONFIG_FILE);
190
+ const content = await readFile(configPath, 'utf8');
191
+ // As type assertion here since rawJson is default to any/unknown anyway
192
+ const rawJson = JSON.parse(content);
193
+ return {
194
+ currentVersion: error.currentVersion,
195
+ spaceName: typeof rawJson.spaceName === 'string' ? rawJson.spaceName : 'Unknown',
196
+ teamName: typeof rawJson.teamName === 'string' ? rawJson.teamName : 'Unknown',
197
+ type: 'legacy',
198
+ };
199
+ }
200
+ // Re-throw other errors
201
+ throw error;
202
+ }
203
+ }
204
+ async initializeMemoryContextDir(name, initFn) {
205
+ this.log(`\nInitializing ${name}...`);
206
+ try {
207
+ const path = await initFn();
208
+ this.log(`✓ ${name} initialized in ${path}`);
209
+ }
210
+ catch (error) {
211
+ this.warn(`${name} initialization skipped: ${error instanceof Error ? error.message : 'Unknown error'}`);
212
+ }
213
+ }
214
+ isLegacyProjectConfig(config) {
215
+ return 'type' in config && config.type === 'legacy';
216
+ }
217
+ async promptAceDeprecationRemoval() {
218
+ this.log('\n The ACE system is being deprecated.');
219
+ this.log(' ByteRover is migrating to the new Context Tree system for improved');
220
+ this.log(' memory organization and retrieval.');
221
+ this.log('');
222
+ this.log(' We detected an existing ACE folder at .brv/ace/');
223
+ this.log(' This folder and all its contents can be safely removed.\n');
224
+ return confirm({
225
+ default: true,
226
+ message: 'Remove the ACE folder and its contents?',
227
+ });
228
+ }
229
+ /**
230
+ * Prompts the user to select an agent.
231
+ * This method is protected to allow test overrides.
232
+ * @returns The selected agent
233
+ */
234
+ async promptForAgentSelection() {
235
+ const AGENTS = AGENT_VALUES.map((agent) => ({
236
+ name: agent,
237
+ value: agent,
238
+ }));
239
+ const answer = await search({
240
+ message: 'Which agent you are using (type to search):',
241
+ async source(input) {
242
+ if (!input)
243
+ return AGENTS;
244
+ return AGENTS.filter((agent) => agent.name.toLowerCase().includes(input.toLowerCase()) ||
245
+ agent.value.toLowerCase().includes(input.toLowerCase()));
246
+ },
247
+ });
248
+ return answer;
249
+ }
250
+ /**
251
+ * Prompts the user to confirm overwriting an existing rule file.
252
+ * This method is protected to allow test overrides.
253
+ */
254
+ async promptForOverwriteConfirmation(agent) {
255
+ return confirm({
256
+ default: true,
257
+ message: `Rule file already exists for ${agent}. Overwrite?`,
258
+ });
259
+ }
73
260
  async promptForSpaceSelection(spaces) {
74
261
  const selectedSpaceId = await select({
75
262
  choices: spaces.map((space) => ({
@@ -98,84 +285,112 @@ export default class Init extends Command {
98
285
  }
99
286
  return selectedTeam;
100
287
  }
288
+ async removeAceDirectory(baseDir) {
289
+ const dir = baseDir ?? process.cwd();
290
+ const acePath = join(dir, BRV_DIR, ACE_DIR);
291
+ await rm(acePath, { force: true, recursive: true });
292
+ }
101
293
  async run() {
102
- const { flags } = await this.parse(Init);
103
294
  try {
104
- const { playbookService, projectConfigStore, spaceService, teamService, tokenStore, trackingService } = this.createServices();
105
- const alreadyInitialized = await projectConfigStore.exists();
106
- if (alreadyInitialized) {
107
- const currentConfig = await projectConfigStore.read();
108
- if (currentConfig === undefined) {
109
- this.error('Configuration file exists but cannot be read. Please check .brv/config.json');
110
- }
111
- if (!flags.force) {
112
- const confirmed = await this.confirmReInitialization(currentConfig);
113
- if (!confirmed) {
114
- this.log('\nCancelled. Project configuration unchanged.');
115
- return;
116
- }
117
- }
118
- try {
295
+ const { flags } = await this.parse(Init);
296
+ const { cogitPullService, contextTreeService, contextTreeSnapshotService, contextTreeWriterService, projectConfigStore, ruleWriterService, spaceService, teamService, tokenStore, trackingService, } = this.createServices();
297
+ const authToken = await this.ensureAuthenticated(tokenStore);
298
+ const existingConfig = await this.getExistingConfig(projectConfigStore);
299
+ if (existingConfig) {
300
+ const shouldCleanup = flags.force ? true : await this.confirmReInitialization(existingConfig);
301
+ if (shouldCleanup) {
119
302
  await this.cleanupBeforeReInitialization();
303
+ this.log('\n');
120
304
  }
121
- catch (error) {
122
- this.error(`Failed to clean up existing data: ${error instanceof Error ? error.message : 'Unknown error'}`);
305
+ else {
306
+ this.log('\nCancelled. Project configuration unchanged.');
307
+ return;
123
308
  }
124
- this.log('\n'); // Spacing before continuing with init flow
125
309
  }
126
310
  this.log('Initializing ByteRover project...\n');
127
- const token = await tokenStore.load();
128
- if (token === undefined) {
129
- this.error('Not authenticated. Please run "brv login" first.');
130
- }
131
- if (!token.isValid()) {
132
- this.error('Authentication token expired. Please run "brv login" again.');
133
- }
134
- ux.action.start('Fetching all teams');
135
- const teamResult = await teamService.getTeams(token.accessToken, token.sessionKey, { fetchAll: true });
136
- ux.action.stop();
137
- const { teams } = teamResult;
138
- if (teams.length === 0) {
139
- this.log('No teams found.');
140
- this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first team.`);
311
+ const selectedTeam = await this.fetchAndSelectTeam(teamService, authToken);
312
+ if (!selectedTeam)
141
313
  return;
142
- }
143
- this.log();
144
- const selectedTeam = await this.promptForTeamSelection(teams);
145
- ux.action.start('Fetching all spaces');
146
- const spaceResult = await spaceService.getSpaces(token.accessToken, token.sessionKey, selectedTeam.id, {
147
- fetchAll: true,
148
- });
149
- ux.action.stop();
150
- const { spaces } = spaceResult;
151
- if (spaces.length === 0) {
152
- this.log(`No spaces found in team "${selectedTeam.getDisplayName()}"`);
153
- this.log(`Please visit ${getCurrentConfig().webAppUrl} to create your first space for ${selectedTeam.getDisplayName()}.`);
314
+ const selectedSpace = await this.fetchAndSelectSpace(spaceService, authToken, selectedTeam);
315
+ if (!selectedSpace)
154
316
  return;
317
+ // Handle ACE deprecation - check for existing ACE folder and offer removal
318
+ const aceExists = await this.aceDirectoryExists();
319
+ if (aceExists) {
320
+ const shouldRemoveAce = await this.promptAceDeprecationRemoval();
321
+ if (shouldRemoveAce) {
322
+ await this.removeAceDirectory();
323
+ this.log('✓ ACE folder removed');
324
+ }
155
325
  }
326
+ // Sync from remote or initialize context tree with templates
327
+ await this.syncFromRemoteOrInitialize({
328
+ cogitPullService,
329
+ contextTreeService,
330
+ contextTreeSnapshotService,
331
+ contextTreeWriterService,
332
+ projectConfig: { spaceId: selectedSpace.id, teamId: selectedTeam.id },
333
+ token: authToken,
334
+ });
156
335
  this.log();
157
- const selectedSpace = await this.promptForSpaceSelection(spaces);
158
- const config = BrvConfig.fromSpace(selectedSpace);
336
+ const selectedAgent = await this.promptForAgentSelection();
337
+ this.log('Detecting workspaces...');
338
+ const { chatLogPath, cwd } = this.detectWorkspacesForAgent(selectedAgent);
339
+ this.log(`✓ Detected workspace: ${cwd}`);
340
+ const config = BrvConfig.fromSpace({
341
+ chatLogPath,
342
+ cwd,
343
+ ide: selectedAgent,
344
+ space: selectedSpace,
345
+ });
159
346
  await projectConfigStore.write(config);
160
- this.log('\nInitializing ACE context...');
161
- try {
162
- const playbookPath = await playbookService.initialize();
163
- this.log(`✓ ACE playbook initialized in ${playbookPath}`);
164
- }
165
- catch (error) {
166
- // Warn but don't fail if ACE init fails
167
- this.warn(`ACE initialization skipped: ${error instanceof Error ? error.message : 'Unknown error'}`);
168
- }
169
347
  this.log(`\nGenerate rule instructions for coding agents to work with ByteRover correctly`);
170
348
  this.log();
171
- await this.config.runCommand('gen-rules');
349
+ await this.generateRulesForAgent(ruleWriterService, selectedAgent);
350
+ await trackingService.track('rule:generate');
172
351
  await trackingService.track('space:init');
173
- this.log(`\n✓ Project initialized successfully!`);
174
- this.log(`✓ Connected to space: ${selectedSpace.getDisplayName()}`);
175
- this.log(`✓ Configuration saved to: ${BRV_DIR}/${PROJECT_CONFIG_FILE}`);
352
+ this.logSuccess(selectedSpace);
176
353
  }
177
354
  catch (error) {
178
- this.error(error instanceof Error ? error.message : 'Initialization failed');
355
+ this.error(`Initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
179
356
  }
180
357
  }
358
+ async syncFromRemoteOrInitialize(params) {
359
+ // Pull from remote - fail if network/API error
360
+ this.log('\nSyncing from ByteRover...');
361
+ try {
362
+ const coGitSnapshot = await params.cogitPullService.pull({
363
+ accessToken: params.token.accessToken,
364
+ branch: DEFAULT_BRANCH,
365
+ sessionKey: params.token.sessionKey,
366
+ spaceId: params.projectConfig.spaceId,
367
+ teamId: params.projectConfig.teamId,
368
+ });
369
+ // Check if space is "empty" (no files, or only README.md placeholder)
370
+ // CoGit follows Git semantics - empty repos have a README.md placeholder
371
+ const isEmptySpace = coGitSnapshot.files.length === 0 ||
372
+ (coGitSnapshot.files.length === 1 && coGitSnapshot.files[0].path === '/README.md');
373
+ if (isEmptySpace) {
374
+ // Remote is empty - ignore placeholder, create templates with empty snapshot
375
+ await this.initializeMemoryContextDir('context tree', () => params.contextTreeService.initialize());
376
+ await params.contextTreeSnapshotService.initEmptySnapshot();
377
+ this.log('✓ Context tree initialized');
378
+ }
379
+ else {
380
+ // Remote has real data - sync it to local
381
+ await params.contextTreeWriterService.sync({ files: [...coGitSnapshot.files] });
382
+ await params.contextTreeSnapshotService.saveSnapshot();
383
+ this.log(`✓ Synced ${coGitSnapshot.files.length} context files from remote`);
384
+ }
385
+ }
386
+ catch (error) {
387
+ throw new Error(`Failed to sync from ByteRover: ${error instanceof Error ? error.message : 'Unknown error'}. Please try again.`);
388
+ }
389
+ }
390
+ logSuccess(space) {
391
+ this.log(`\n✓ Project initialized successfully!`);
392
+ this.log(`✓ Connected to space: ${space.getDisplayName()}`);
393
+ this.log(`✓ Configuration saved to: ${BRV_DIR}/${PROJECT_CONFIG_FILE}`);
394
+ this.log("NOTE: It's recommended to add .brv/ to your .gitignore file since ByteRover already takes care of memory/context versioning for you.");
395
+ }
181
396
  }
@@ -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