byterover-cli 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +48 -3
  18. package/dist/commands/init.js +242 -70
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/pull.d.ts +33 -0
  21. package/dist/commands/pull.js +115 -0
  22. package/dist/commands/push.d.ts +13 -13
  23. package/dist/commands/push.js +81 -101
  24. package/dist/commands/query.d.ts +63 -0
  25. package/dist/commands/query.js +349 -0
  26. package/dist/commands/space/list.d.ts +5 -2
  27. package/dist/commands/space/list.js +60 -56
  28. package/dist/commands/space/switch.d.ts +16 -0
  29. package/dist/commands/space/switch.js +102 -53
  30. package/dist/commands/status.d.ts +5 -2
  31. package/dist/commands/status.js +43 -33
  32. package/dist/commands/watch.d.ts +23 -0
  33. package/dist/commands/watch.js +171 -0
  34. package/dist/config/auth.config.js +14 -2
  35. package/dist/config/context-tree-domains.d.ts +12 -0
  36. package/dist/config/context-tree-domains.js +29 -0
  37. package/dist/config/environment.d.ts +6 -0
  38. package/dist/config/environment.js +9 -2
  39. package/dist/constants.d.ts +5 -0
  40. package/dist/constants.js +6 -0
  41. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  42. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  43. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  44. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  45. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  46. package/dist/core/domain/cipher/agent/index.js +7 -0
  47. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  48. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  50. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  51. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  52. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  53. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  54. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  55. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  56. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  57. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  58. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  59. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  60. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  61. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  62. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  63. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  64. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  65. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  66. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  67. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  68. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  69. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  70. package/dist/core/domain/cipher/memory/types.js +4 -0
  71. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  72. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  73. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  74. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  75. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  76. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  77. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  78. package/dist/core/domain/cipher/todos/index.js +4 -0
  79. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  80. package/dist/core/domain/cipher/todos/types.js +5 -0
  81. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  82. package/dist/core/domain/cipher/tools/constants.js +24 -0
  83. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  84. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  85. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  86. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  87. package/dist/core/domain/entities/brv-config.js +115 -17
  88. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  89. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  90. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  91. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  92. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  93. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  94. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  95. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  96. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  97. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  98. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  99. package/dist/core/domain/entities/context-tree-index.js +27 -0
  100. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  101. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  102. package/dist/core/domain/entities/event.d.ts +1 -1
  103. package/dist/core/domain/entities/event.js +3 -1
  104. package/dist/core/domain/entities/parser.d.ts +567 -0
  105. package/dist/core/domain/entities/parser.js +10 -0
  106. package/dist/core/domain/entities/playbook.d.ts +2 -23
  107. package/dist/core/domain/entities/playbook.js +2 -70
  108. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  109. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  110. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  111. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  112. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  113. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  114. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  115. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  116. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  117. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  118. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  119. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  120. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  121. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  122. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  123. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  124. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  125. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  128. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  129. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  130. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  131. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  132. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  133. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  134. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  135. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  136. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  137. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  139. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  140. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  141. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  142. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  143. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  144. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  145. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  146. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  147. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  148. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  149. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  150. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  151. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  153. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  155. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  156. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  157. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  158. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  159. package/dist/core/interfaces/cipher/message-types.js +5 -0
  160. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  161. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  162. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  163. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  164. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  165. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  166. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  167. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  168. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  169. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  171. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  173. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  174. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  175. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  176. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  177. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  178. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  179. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  180. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  181. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  182. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  183. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  184. package/dist/hooks/error/clean-errors.d.ts +7 -0
  185. package/dist/hooks/error/clean-errors.js +50 -0
  186. package/dist/hooks/init/welcome.js +72 -1
  187. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  188. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  189. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  190. package/dist/infra/cipher/agent-service-factory.js +212 -0
  191. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  192. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  193. package/dist/infra/cipher/blob/index.d.ts +10 -0
  194. package/dist/infra/cipher/blob/index.js +12 -0
  195. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  196. package/dist/infra/cipher/blob/migrations.js +148 -0
  197. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  198. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  199. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  200. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  201. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  202. package/dist/infra/cipher/cipher-agent.js +317 -0
  203. package/dist/infra/cipher/command-parser.d.ts +23 -0
  204. package/dist/infra/cipher/command-parser.js +85 -0
  205. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  206. package/dist/infra/cipher/display/todo-display.js +129 -0
  207. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  208. package/dist/infra/cipher/events/event-emitter.js +158 -0
  209. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  210. package/dist/infra/cipher/exit-codes.js +58 -0
  211. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  212. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  213. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  214. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  215. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  216. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  217. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  218. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  219. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  220. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  221. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  222. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  223. package/dist/infra/cipher/interactive-commands.js +198 -0
  224. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  225. package/dist/infra/cipher/interactive-loop.js +352 -0
  226. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  227. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  228. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  229. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  230. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  231. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  232. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  233. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  234. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  235. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  236. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  237. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  238. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  239. package/dist/infra/cipher/llm/context/index.js +2 -0
  240. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  241. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  242. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  243. package/dist/infra/cipher/llm/context/utils.js +89 -0
  244. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  245. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  246. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  247. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  248. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  249. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  250. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  251. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  252. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  253. package/dist/infra/cipher/llm/generators/index.js +13 -0
  254. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  255. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  256. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  257. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  258. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  259. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  260. package/dist/infra/cipher/llm/index.d.ts +9 -0
  261. package/dist/infra/cipher/llm/index.js +13 -0
  262. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  263. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  264. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  265. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  266. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  267. package/dist/infra/cipher/llm/response-validator.js +157 -0
  268. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  269. package/dist/infra/cipher/llm/retry/index.js +10 -0
  270. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  271. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  272. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  273. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  274. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  275. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  276. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  277. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  278. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  279. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  280. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  281. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  282. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  283. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  284. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  285. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  286. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  287. package/dist/infra/cipher/logger/console-logger.js +63 -0
  288. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  289. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  290. package/dist/infra/cipher/memory/index.d.ts +6 -0
  291. package/dist/infra/cipher/memory/index.js +7 -0
  292. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  293. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  294. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  295. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  296. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  297. package/dist/infra/cipher/process/command-validator.js +266 -0
  298. package/dist/infra/cipher/process/index.d.ts +8 -0
  299. package/dist/infra/cipher/process/index.js +8 -0
  300. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  301. package/dist/infra/cipher/process/process-service.js +439 -0
  302. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  303. package/dist/infra/cipher/session/chat-session.js +165 -0
  304. package/dist/infra/cipher/session/index.d.ts +6 -0
  305. package/dist/infra/cipher/session/index.js +5 -0
  306. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  307. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  308. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  309. package/dist/infra/cipher/session/session-manager.js +172 -0
  310. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  311. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  312. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  313. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  314. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  315. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  316. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  317. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  318. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  319. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  320. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  321. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  322. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  323. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  324. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  326. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  327. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  328. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  329. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  330. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  331. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  332. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  333. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  334. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  335. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  336. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  337. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  338. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  339. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  340. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  342. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  344. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  346. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  347. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  348. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  350. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  351. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  352. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  353. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  354. package/dist/infra/cipher/tools/index.d.ts +18 -0
  355. package/dist/infra/cipher/tools/index.js +19 -0
  356. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  357. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  358. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  359. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  360. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  361. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  362. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  363. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  364. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  365. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  366. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  367. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  368. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  369. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  370. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  371. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  372. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  373. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  374. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  375. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  376. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  377. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  378. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  379. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  380. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  381. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  382. package/dist/infra/config/file-config-store.js +9 -3
  383. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  384. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  385. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  386. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  387. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  388. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  389. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  390. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  391. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  392. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  393. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  394. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  395. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  396. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  397. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  398. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  399. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  400. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  401. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  402. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  403. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  404. package/dist/infra/parsers/clean/shared.js +273 -0
  405. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  406. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  407. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  408. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  409. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  410. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  411. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  412. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  413. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  414. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  415. package/dist/infra/space/http-space-service.js +2 -1
  416. package/dist/infra/team/http-team-service.js +2 -1
  417. package/dist/infra/user/http-user-service.js +2 -1
  418. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  419. package/dist/infra/watcher/file-watcher-service.js +81 -0
  420. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  421. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  422. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  423. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  424. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  425. package/dist/resources/prompts/reflection.yml +27 -0
  426. package/dist/resources/prompts/system-prompt.yml +82 -0
  427. package/dist/resources/prompts/tool-outputs.yml +30 -0
  428. package/dist/templates/README.md +6 -7
  429. package/dist/templates/sections/command-reference.md +40 -111
  430. package/dist/templates/sections/workflow.md +3 -30
  431. package/dist/utils/emoji-helpers.d.ts +38 -0
  432. package/dist/utils/emoji-helpers.js +42 -0
  433. package/dist/utils/error-handler.d.ts +51 -0
  434. package/dist/utils/error-handler.js +169 -0
  435. package/dist/utils/error-helpers.d.ts +30 -0
  436. package/dist/utils/error-helpers.js +47 -0
  437. package/dist/utils/file-helpers.d.ts +15 -0
  438. package/dist/utils/file-helpers.js +44 -0
  439. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  440. package/dist/utils/oclif-error-helpers.js +46 -0
  441. package/dist/utils/tool-display-formatter.d.ts +53 -0
  442. package/dist/utils/tool-display-formatter.js +257 -0
  443. package/oclif.manifest.json +381 -141
  444. package/package.json +27 -6
  445. package/dist/commands/add.d.ts +0 -49
  446. package/dist/commands/add.js +0 -192
  447. package/dist/commands/complete.d.ts +0 -108
  448. package/dist/commands/complete.js +0 -340
  449. package/dist/commands/retrieve.d.ts +0 -26
  450. package/dist/commands/retrieve.js +0 -101
  451. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  452. package/dist/core/domain/entities/curator-output.js +0 -23
  453. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  454. package/dist/core/domain/entities/delta-batch.js +0 -52
  455. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  456. package/dist/core/domain/entities/delta-operation.js +0 -50
  457. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  458. package/dist/core/domain/entities/executor-output.js +0 -33
  459. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  460. package/dist/core/domain/entities/reflector-output.js +0 -44
  461. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  462. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  463. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  464. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  465. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  466. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  467. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  468. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  469. package/dist/infra/ace/ace-file-utils.js +0 -83
  470. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  471. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  472. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  473. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  474. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  475. package/dist/infra/ace/file-delta-store.js +0 -26
  476. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  477. package/dist/infra/ace/file-executor-output-store.js +0 -26
  478. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  479. package/dist/infra/ace/file-playbook-store.js +0 -107
  480. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  481. package/dist/infra/ace/file-reflection-store.js +0 -55
  482. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  483. package/dist/infra/playbook/file-playbook-service.js +0 -132
  484. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  485. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  486. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  487. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  488. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  489. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  490. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -1,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,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';
9
13
  import { BrvConfig } from '../core/domain/entities/brv-config.js';
10
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
+ };
11
28
  export default class Init extends Command {
12
29
  static description: string;
13
30
  static examples: string[];
14
31
  static flags: {
15
32
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
33
  };
34
+ protected aceDirectoryExists(baseDir?: string): Promise<boolean>;
17
35
  protected cleanupBeforeReInitialization(): Promise<void>;
18
- protected confirmReInitialization(config: BrvConfig): Promise<boolean>;
36
+ protected confirmReInitialization(config: BrvConfig | LegacyProjectConfigInfo): Promise<boolean>;
19
37
  protected createServices(): {
20
- playbookService: IPlaybookService;
38
+ contextTreeService: IContextTreeService;
39
+ contextTreeSnapshotService: IContextTreeSnapshotService;
21
40
  projectConfigStore: IProjectConfigStore;
41
+ ruleWriterService: IRuleWriterService;
22
42
  spaceService: ISpaceService;
23
43
  teamService: ITeamService;
24
44
  tokenStore: ITokenStore;
25
45
  trackingService: ITrackingService;
26
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>;
27
70
  protected promptForSpaceSelection(spaces: Space[]): Promise<Space>;
28
71
  protected promptForTeamSelection(teams: Team[]): Promise<Team>;
72
+ protected removeAceDirectory(baseDir?: string): Promise<void>;
29
73
  run(): Promise<void>;
74
+ private logSuccess;
30
75
  }
@@ -1,18 +1,27 @@
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, 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';
8
11
  import { ProjectConfigStore } from '../infra/config/file-config-store.js';
9
- 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';
10
17
  import { HttpSpaceService } from '../infra/space/http-space-service.js';
11
18
  import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
12
19
  import { HttpTeamService } from '../infra/team/http-team-service.js';
20
+ import { FsTemplateLoader } from '../infra/template/fs-template-loader.js';
13
21
  import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
22
+ import { WorkspaceDetectorService } from '../infra/workspace/workspace-detector-service.js';
14
23
  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)`;
24
+ static description = `Initialize a project with ByteRover (creates ${BRV_DIR}/${PROJECT_CONFIG_FILE} with team/space selection and initializes Context Tree)`;
16
25
  static examples = [
17
26
  '<%= config.bin %> <%= command.id %>',
18
27
  '# Re-initialize if config exists (will show current config and exit):\n<%= config.bin %> <%= command.id %>',
@@ -25,6 +34,17 @@ export default class Init extends Command {
25
34
  description: 'Force re-initialization without confirmation prompt',
26
35
  }),
27
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
+ }
28
48
  async cleanupBeforeReInitialization() {
29
49
  const brvDir = join(process.cwd(), BRV_DIR);
30
50
  this.log('\n Cleaning up existing ByteRover directory...');
@@ -35,18 +55,24 @@ export default class Init extends Command {
35
55
  }
36
56
  catch (error) {
37
57
  ux.action.stop('✗');
38
- this.error(`Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`);
58
+ throw new Error(`Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`);
39
59
  }
40
60
  }
41
61
  async confirmReInitialization(config) {
42
- this.log('\n Project is already initialized');
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
+ }
43
69
  this.log(` Team: ${config.teamName}`);
44
70
  this.log(` Space: ${config.spaceName}`);
45
71
  this.log(` Config: ${join(process.cwd(), BRV_DIR, PROJECT_CONFIG_FILE)}`);
46
72
  this.log('\n Re-initializing will:');
47
73
  this.log(` - Remove the entire ${BRV_DIR}/ directory and all its contents`);
48
74
  this.log(' - Allow you to select a new team/space');
49
- this.log(' - Create a fresh configuration and ACE playbook');
75
+ this.log(' - Create a fresh configuration and Context Tree');
50
76
  this.log(' - Regenerate rule instructions\n');
51
77
  return confirm({
52
78
  default: false,
@@ -57,9 +83,14 @@ export default class Init extends Command {
57
83
  const envConfig = getCurrentConfig();
58
84
  const tokenStore = new KeychainTokenStore();
59
85
  const trackingService = new MixpanelTrackingService(tokenStore);
86
+ const fileService = new FsFileService();
87
+ const templateLoader = new FsTemplateLoader(fileService);
88
+ const ruleTemplateService = new RuleTemplateService(templateLoader);
60
89
  return {
61
- playbookService: new FilePlaybookService(),
90
+ contextTreeService: new FileContextTreeService(),
91
+ contextTreeSnapshotService: new FileContextTreeSnapshotService(),
62
92
  projectConfigStore: new ProjectConfigStore(),
93
+ ruleWriterService: new RuleWriterService(fileService, ruleTemplateService),
63
94
  spaceService: new HttpSpaceService({
64
95
  apiBaseUrl: envConfig.apiBaseUrl,
65
96
  }),
@@ -70,6 +101,155 @@ export default class Init extends Command {
70
101
  trackingService,
71
102
  };
72
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
+ }
73
253
  async promptForSpaceSelection(spaces) {
74
254
  const selectedSpaceId = await select({
75
255
  choices: spaces.map((space) => ({
@@ -98,84 +278,76 @@ export default class Init extends Command {
98
278
  }
99
279
  return selectedTeam;
100
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
+ }
101
286
  async run() {
102
- const { flags } = await this.parse(Init);
103
287
  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 {
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) {
119
295
  await this.cleanupBeforeReInitialization();
296
+ this.log('\n');
120
297
  }
121
- catch (error) {
122
- this.error(`Failed to clean up existing data: ${error instanceof Error ? error.message : 'Unknown error'}`);
298
+ else {
299
+ this.log('\nCancelled. Project configuration unchanged.');
300
+ return;
123
301
  }
124
- this.log('\n'); // Spacing before continuing with init flow
125
302
  }
126
303
  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.`);
304
+ const selectedTeam = await this.fetchAndSelectTeam(teamService, authToken);
305
+ if (!selectedTeam)
141
306
  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()}.`);
307
+ const selectedSpace = await this.fetchAndSelectSpace(spaceService, authToken, selectedTeam);
308
+ if (!selectedSpace)
154
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
+ }
155
318
  }
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');
156
324
  this.log();
157
- const selectedSpace = await this.promptForSpaceSelection(spaces);
158
- 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
+ });
159
335
  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
336
  this.log(`\nGenerate rule instructions for coding agents to work with ByteRover correctly`);
170
337
  this.log();
171
- await this.config.runCommand('gen-rules');
338
+ await this.generateRulesForAgent(ruleWriterService, selectedAgent);
339
+ await trackingService.track('rule:generate');
172
340
  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}`);
341
+ this.logSuccess(selectedSpace);
176
342
  }
177
343
  catch (error) {
178
- this.error(error instanceof Error ? error.message : 'Initialization failed');
344
+ this.error(`Initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
179
345
  }
180
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
+ }
181
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,33 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { AuthToken } from '../core/domain/entities/auth-token.js';
3
+ import type { BrvConfig } from '../core/domain/entities/brv-config.js';
4
+ import type { ICogitPullService } from '../core/interfaces/i-cogit-pull-service.js';
5
+ import type { IContextTreeSnapshotService } from '../core/interfaces/i-context-tree-snapshot-service.js';
6
+ import type { IContextTreeWriterService } from '../core/interfaces/i-context-tree-writer-service.js';
7
+ import type { IProjectConfigStore } from '../core/interfaces/i-project-config-store.js';
8
+ import type { ITokenStore } from '../core/interfaces/i-token-store.js';
9
+ import type { ITrackingService } from '../core/interfaces/i-tracking-service.js';
10
+ export default class Pull extends Command {
11
+ static description: string;
12
+ static examples: string[];
13
+ static flags: {
14
+ branch: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ catch(error: Error & {
17
+ oclif?: {
18
+ exit: number;
19
+ };
20
+ }): Promise<void>;
21
+ protected checkLocalChanges(contextTreeSnapshotService: IContextTreeSnapshotService): Promise<boolean>;
22
+ protected checkProjectInit(projectConfigStore: IProjectConfigStore): Promise<BrvConfig>;
23
+ protected createServices(): {
24
+ cogitPullService: ICogitPullService;
25
+ contextTreeSnapshotService: IContextTreeSnapshotService;
26
+ contextTreeWriterService: IContextTreeWriterService;
27
+ projectConfigStore: IProjectConfigStore;
28
+ tokenStore: ITokenStore;
29
+ trackingService: ITrackingService;
30
+ };
31
+ run(): Promise<void>;
32
+ protected validateAuth(tokenStore: ITokenStore): Promise<AuthToken>;
33
+ }