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,8 +1,8 @@
1
1
  import { Bullet } from './bullet.js';
2
2
  /**
3
3
  * The central knowledge repository that stores and manages bullets.
4
- * Playbooks are organized into sections and support delta operations.
5
- * Playbooks are used as an temporary notes then will be pushed to byterover for usage
4
+ * Playbooks are organized into sections.
5
+ * Playbooks are used as temporary notes then will be pushed to byterover for usage.
6
6
  */
7
7
  export class Playbook {
8
8
  bullets;
@@ -13,46 +13,6 @@ export class Playbook {
13
13
  this.sections = new Map(sections);
14
14
  this.nextId = nextId;
15
15
  }
16
- // ===== Static Factory Methods =====
17
- /**
18
- * Creates a Playbook instance from a JSON object
19
- * @param json The playbook JSON data
20
- * @param contentStore Optional content store for loading bullet content from files
21
- * @param directory Optional directory for loading content files
22
- */
23
- static async fromJson(json, contentStore, directory) {
24
- const bullets = new Map();
25
- const sections = new Map();
26
- // Deserialize bullets
27
- const bulletEntries = Object.entries(json.bullets ?? {});
28
- // Load all content in parallel if needed
29
- const contentPromises = bulletEntries.map(async ([id, bulletData]) => {
30
- if (bulletData.content) {
31
- return bulletData.content;
32
- }
33
- return contentStore.load(id, directory);
34
- });
35
- const contents = await Promise.all(contentPromises);
36
- // Create bullets with loaded content
37
- for (const [index, [id, bulletData]] of bulletEntries.entries()) {
38
- bullets.set(id, Bullet.fromJson(bulletData, contents[index]));
39
- }
40
- // Deserialize sections
41
- for (const [section, bulletIds] of Object.entries(json.sections ?? {})) {
42
- sections.set(section, bulletIds);
43
- }
44
- return new Playbook(bullets, sections, json.nextId ?? 1);
45
- }
46
- /**
47
- * Deserializes from JSON string
48
- * @param data The JSON string
49
- * @param contentStore Optional content store for loading bullet content from files
50
- * @param directory Optional directory for loading content files
51
- */
52
- static async loads(data, contentStore, directory) {
53
- const json = JSON.parse(data);
54
- return Playbook.fromJson(json, contentStore, directory);
55
- }
56
16
  // ===== CRUD Operations =====
57
17
  /**
58
18
  * Adds a new bullet to the playbook
@@ -96,14 +56,6 @@ export class Playbook {
96
56
  this.bullets.set(bulletId, updatedBullet);
97
57
  return updatedBullet;
98
58
  }
99
- /**
100
- * Applies a batch of delta operations to the playbook
101
- */
102
- applyDelta(delta) {
103
- for (const operation of delta.operations) {
104
- this._applyOperation(operation);
105
- }
106
- }
107
59
  /**
108
60
  * Converts playbook to markdown format for LLM prompts
109
61
  */
@@ -162,7 +114,6 @@ export class Playbook {
162
114
  getSections() {
163
115
  return [...this.sections.keys()].sort();
164
116
  }
165
- // ===== Delta Operations =====
166
117
  /**
167
118
  * Removes a bullet from the playbook
168
119
  */
@@ -249,25 +200,6 @@ export class Playbook {
249
200
  this.bullets.set(bulletId, updatedBullet);
250
201
  return updatedBullet;
251
202
  }
252
- _applyOperation(operation) {
253
- switch (operation.type) {
254
- case 'ADD': {
255
- this.addBullet(operation.section, operation.content, operation.bulletId, operation.metadata);
256
- break;
257
- }
258
- case 'REMOVE': {
259
- this.removeBullet(operation.bulletId);
260
- break;
261
- }
262
- case 'UPDATE': {
263
- this.updateBullet(operation.bulletId, {
264
- content: operation.content,
265
- metadata: operation.metadata,
266
- });
267
- break;
268
- }
269
- }
270
- }
271
203
  // ===== Private Helpers =====
272
204
  _generateId(section) {
273
205
  // Convert section to prefix: "Common Errors" -> "common"
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Error thrown when the BrvConfig version is missing or incompatible.
3
+ *
4
+ * This error is used to detect outdated `.brv/config.json` files that need
5
+ * to be reinitialized via `brv init`.
6
+ */
7
+ export declare class BrvConfigVersionError extends Error {
8
+ /** The version found in the config file, or undefined if missing. */
9
+ readonly currentVersion: string | undefined;
10
+ /** The version expected by the current CLI. */
11
+ readonly expectedVersion: string;
12
+ constructor(params: {
13
+ currentVersion: string | undefined;
14
+ expectedVersion: string;
15
+ });
16
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Error thrown when the BrvConfig version is missing or incompatible.
3
+ *
4
+ * This error is used to detect outdated `.brv/config.json` files that need
5
+ * to be reinitialized via `brv init`.
6
+ */
7
+ export class BrvConfigVersionError extends Error {
8
+ /** The version found in the config file, or undefined if missing. */
9
+ currentVersion;
10
+ /** The version expected by the current CLI. */
11
+ expectedVersion;
12
+ constructor(params) {
13
+ const message = params.currentVersion
14
+ ? `Config version mismatch (found: ${params.currentVersion}, expected: ${params.expectedVersion}). Please run 'brv init' to reinitialize.`
15
+ : `Config version missing. Please run 'brv init' to reinitialize.`;
16
+ super(message);
17
+ this.name = 'BrvConfigVersionError';
18
+ this.currentVersion = params.currentVersion;
19
+ this.expectedVersion = params.expectedVersion;
20
+ }
21
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Result of ensuring knowledge structure exists.
3
+ */
4
+ export interface EnsureStructureResult {
5
+ contextTreeExisted: boolean;
6
+ indexExisted: boolean;
7
+ }
8
+ /**
9
+ * Result of creating or updating a domain/topic.
10
+ */
11
+ export interface CreateOrUpdateResult {
12
+ created: boolean;
13
+ skipped: boolean;
14
+ updated: boolean;
15
+ }
16
+ /**
17
+ * Manages directory and file operations for knowledge structure.
18
+ * Handles existing directories and files without recreating them.
19
+ */
20
+ export declare const DirectoryManager: {
21
+ /**
22
+ * Create or update a domain folder.
23
+ * If domain exists, returns indication to update; if new, creates folder.
24
+ *
25
+ * @param domainPath - Full path to domain folder
26
+ * @returns Whether domain was created, updated, or skipped
27
+ */
28
+ createOrUpdateDomain(domainPath: string): Promise<CreateOrUpdateResult>;
29
+ /**
30
+ * Create or update a topic folder.
31
+ * If topic exists, returns indication to update; if new, creates folder.
32
+ *
33
+ * @param topicPath - Full path to topic folder
34
+ * @returns Whether topic was created, updated, or skipped
35
+ */
36
+ createOrUpdateTopic(topicPath: string): Promise<CreateOrUpdateResult>;
37
+ /**
38
+ * Ensure the base knowledge structure exists.
39
+ * Creates .brv/context-tree/ directory if it doesn't exist.
40
+ *
41
+ * @param basePath - Base path for knowledge storage (typically .brv/context-tree)
42
+ * @returns Information about what existed and what was created
43
+ */
44
+ ensureKnowledgeStructure(basePath: string): Promise<EnsureStructureResult>;
45
+ /**
46
+ * Ensure parent directory exists for a file path.
47
+ *
48
+ * @param filePath - Path to file
49
+ */
50
+ ensureParentDirectory(filePath: string): Promise<void>;
51
+ /**
52
+ * Check if a file exists.
53
+ *
54
+ * @param filePath - Path to file
55
+ * @returns true if file exists, false otherwise
56
+ */
57
+ fileExists(filePath: string): Promise<boolean>;
58
+ /**
59
+ * List all markdown files recursively in a directory.
60
+ *
61
+ * @param dirPath - Directory to scan
62
+ * @returns Array of absolute paths to .md files
63
+ */
64
+ listMarkdownFiles(dirPath: string): Promise<string[]>;
65
+ /**
66
+ * Read a file's content.
67
+ *
68
+ * @param filePath - Path to file
69
+ * @returns File content as string
70
+ */
71
+ readFile(filePath: string): Promise<string>;
72
+ /**
73
+ * Write a file atomically (write to temp, then rename).
74
+ * This ensures the file is never in a partially written state.
75
+ *
76
+ * @param filePath - Path to file
77
+ * @param content - Content to write
78
+ */
79
+ writeFileAtomic(filePath: string, content: string): Promise<void>;
80
+ };
@@ -0,0 +1,145 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ /**
4
+ * Manages directory and file operations for knowledge structure.
5
+ * Handles existing directories and files without recreating them.
6
+ */
7
+ export const DirectoryManager = {
8
+ /**
9
+ * Create or update a domain folder.
10
+ * If domain exists, returns indication to update; if new, creates folder.
11
+ *
12
+ * @param domainPath - Full path to domain folder
13
+ * @returns Whether domain was created, updated, or skipped
14
+ */
15
+ async createOrUpdateDomain(domainPath) {
16
+ try {
17
+ await fs.access(domainPath);
18
+ // Domain exists
19
+ return { created: false, skipped: false, updated: true };
20
+ }
21
+ catch {
22
+ // Domain doesn't exist, create it
23
+ await fs.mkdir(domainPath, { recursive: true });
24
+ return { created: true, skipped: false, updated: false };
25
+ }
26
+ },
27
+ /**
28
+ * Create or update a topic folder.
29
+ * If topic exists, returns indication to update; if new, creates folder.
30
+ *
31
+ * @param topicPath - Full path to topic folder
32
+ * @returns Whether topic was created, updated, or skipped
33
+ */
34
+ async createOrUpdateTopic(topicPath) {
35
+ try {
36
+ await fs.access(topicPath);
37
+ // Topic exists
38
+ return { created: false, skipped: false, updated: true };
39
+ }
40
+ catch {
41
+ // Topic doesn't exist, create it
42
+ await fs.mkdir(topicPath, { recursive: true });
43
+ return { created: true, skipped: false, updated: false };
44
+ }
45
+ },
46
+ /**
47
+ * Ensure the base knowledge structure exists.
48
+ * Creates .brv/context-tree/ directory if it doesn't exist.
49
+ *
50
+ * @param basePath - Base path for knowledge storage (typically .brv/context-tree)
51
+ * @returns Information about what existed and what was created
52
+ */
53
+ async ensureKnowledgeStructure(basePath) {
54
+ // Check if .brv/context-tree/ exists
55
+ let contextTreeExisted = false;
56
+ try {
57
+ await fs.access(basePath);
58
+ contextTreeExisted = true;
59
+ }
60
+ catch {
61
+ // Directory doesn't exist, create it
62
+ await fs.mkdir(basePath, { recursive: true });
63
+ }
64
+ return {
65
+ contextTreeExisted,
66
+ indexExisted: false, // No longer creating index.json
67
+ };
68
+ },
69
+ /**
70
+ * Ensure parent directory exists for a file path.
71
+ *
72
+ * @param filePath - Path to file
73
+ */
74
+ async ensureParentDirectory(filePath) {
75
+ const parentDir = dirname(filePath);
76
+ await fs.mkdir(parentDir, { recursive: true });
77
+ },
78
+ /**
79
+ * Check if a file exists.
80
+ *
81
+ * @param filePath - Path to file
82
+ * @returns true if file exists, false otherwise
83
+ */
84
+ async fileExists(filePath) {
85
+ try {
86
+ await fs.access(filePath);
87
+ return true;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ },
93
+ /**
94
+ * List all markdown files recursively in a directory.
95
+ *
96
+ * @param dirPath - Directory to scan
97
+ * @returns Array of absolute paths to .md files
98
+ */
99
+ async listMarkdownFiles(dirPath) {
100
+ const mdFiles = [];
101
+ const scanDirectory = async (currentPath) => {
102
+ try {
103
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
104
+ const subdirectories = [];
105
+ for (const entry of entries) {
106
+ const fullPath = join(currentPath, entry.name);
107
+ if (entry.isDirectory()) {
108
+ subdirectories.push(fullPath);
109
+ }
110
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
111
+ mdFiles.push(fullPath);
112
+ }
113
+ }
114
+ // Process subdirectories recursively
115
+ await Promise.all(subdirectories.map((subdir) => scanDirectory(subdir)));
116
+ }
117
+ catch {
118
+ // Directory doesn't exist or not accessible, skip it
119
+ }
120
+ };
121
+ await scanDirectory(dirPath);
122
+ return mdFiles;
123
+ },
124
+ /**
125
+ * Read a file's content.
126
+ *
127
+ * @param filePath - Path to file
128
+ * @returns File content as string
129
+ */
130
+ async readFile(filePath) {
131
+ return fs.readFile(filePath, 'utf8');
132
+ },
133
+ /**
134
+ * Write a file atomically (write to temp, then rename).
135
+ * This ensures the file is never in a partially written state.
136
+ *
137
+ * @param filePath - Path to file
138
+ * @param content - Content to write
139
+ */
140
+ async writeFileAtomic(filePath, content) {
141
+ const tempPath = `${filePath}.tmp`;
142
+ await fs.writeFile(tempPath, content, 'utf8');
143
+ await fs.rename(tempPath, filePath);
144
+ },
145
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Context data for generating context.md files.
3
+ */
4
+ export interface ContextData {
5
+ name: string;
6
+ relations?: string[];
7
+ snippets: string[];
8
+ }
9
+ /**
10
+ * Generates Markdown files for knowledge context.
11
+ */
12
+ export declare const MarkdownWriter: {
13
+ /**
14
+ * Generate context.md content with snippets and optional relations.
15
+ * Used for both topics and subtopics in the knowledge hierarchy.
16
+ */
17
+ generateContext(data: ContextData): string;
18
+ };
@@ -0,0 +1,18 @@
1
+ import { generateRelationsSection } from './relation-parser.js';
2
+ /**
3
+ * Generates Markdown files for knowledge context.
4
+ */
5
+ export const MarkdownWriter = {
6
+ /**
7
+ * Generate context.md content with snippets and optional relations.
8
+ * Used for both topics and subtopics in the knowledge hierarchy.
9
+ */
10
+ generateContext(data) {
11
+ const snippets = data.snippets || [];
12
+ const relations = data.relations || [];
13
+ const relationsSection = generateRelationsSection(relations);
14
+ return `${relationsSection}
15
+ ${snippets.length > 0 ? snippets.map(s => `${s}`).join('\n\n---\n\n') : 'No context available.'}
16
+ `;
17
+ },
18
+ };
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Utilities for parsing and managing context relations.
3
+ * Relations are expressed using @ notation: @domain/topic or @domain/topic/subtopic
4
+ */
5
+ /**
6
+ * Parse relations from context.md content.
7
+ * Extracts all @domain/topic or @domain/topic/subtopic references.
8
+ *
9
+ * @param content - Markdown content to parse
10
+ * @returns Array of unique relation paths (without @ prefix)
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const content = `
15
+ * ## Relations
16
+ * @code_style/error-handling
17
+ * @structure/api-endpoints
18
+ * `
19
+ * parseRelations(content) // ['code_style/error-handling', 'structure/api-endpoints']
20
+ * ```
21
+ */
22
+ export declare function parseRelations(content: string): string[];
23
+ /**
24
+ * Validate a relation path format.
25
+ * Valid formats: domain/topic or domain/topic/subtopic
26
+ *
27
+ * @param path - Relation path to validate (without @ prefix)
28
+ * @returns True if path format is valid
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * validateRelationPath('code_style/error-handling') // true
33
+ * validateRelationPath('code_style/error-handling/try-catch') // true
34
+ * validateRelationPath('invalid') // false
35
+ * validateRelationPath('too/many/parts/here') // false
36
+ * ```
37
+ */
38
+ export declare function validateRelationPath(path: string): boolean;
39
+ /**
40
+ * Resolve a relation path to an absolute file system path.
41
+ *
42
+ * @param basePath - Base path to context tree (e.g., '.brv/context-tree')
43
+ * @param relation - Relation path (e.g., 'domain/topic' or 'domain/topic/subtopic')
44
+ * @returns Absolute path to the context.md file
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * resolveRelationPath('.brv/context-tree', 'code_style/error-handling')
49
+ * // => '.brv/context-tree/code_style/error-handling/context.md'
50
+ *
51
+ * resolveRelationPath('.brv/context-tree', 'structure/api/endpoints')
52
+ * // => '.brv/context-tree/structure/api/endpoints/context.md'
53
+ * ```
54
+ */
55
+ export declare function resolveRelationPath(basePath: string, relation: string): string;
56
+ /**
57
+ * Format a relation path using @ notation.
58
+ *
59
+ * @param domain - Domain name
60
+ * @param topic - Topic name
61
+ * @param subtopic - Optional subtopic name
62
+ * @returns Formatted relation string with @ prefix
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * formatRelation('code_style', 'error-handling')
67
+ * // => '@code_style/error-handling'
68
+ *
69
+ * formatRelation('structure', 'api', 'endpoints')
70
+ * // => '@structure/api/endpoints'
71
+ * ```
72
+ */
73
+ export declare function formatRelation(domain: string, topic: string, subtopic?: string): string;
74
+ /**
75
+ * Generate the Relations section for context.md.
76
+ * Returns empty string if no relations provided.
77
+ *
78
+ * @param relations - Array of relation paths (without @ prefix)
79
+ * @returns Markdown formatted Relations section or empty string
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * generateRelationsSection(['code_style/error-handling', 'structure/api'])
84
+ * // => '\n## Relations\n@code_style/error-handling\n@structure/api\n'
85
+ *
86
+ * generateRelationsSection([])
87
+ * // => ''
88
+ * ```
89
+ */
90
+ export declare function generateRelationsSection(relations: string[]): string;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Utilities for parsing and managing context relations.
3
+ * Relations are expressed using @ notation: @domain/topic or @domain/topic/subtopic
4
+ */
5
+ /**
6
+ * Regular expression to match relation paths in markdown content.
7
+ * Matches: @domain/topic or @domain/topic/subtopic
8
+ */
9
+ const RELATION_PATTERN = /@([\w-]+)\/([\w-]+)(?:\/([\w-]+))?/g;
10
+ /**
11
+ * Parse relations from context.md content.
12
+ * Extracts all @domain/topic or @domain/topic/subtopic references.
13
+ *
14
+ * @param content - Markdown content to parse
15
+ * @returns Array of unique relation paths (without @ prefix)
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const content = `
20
+ * ## Relations
21
+ * @code_style/error-handling
22
+ * @structure/api-endpoints
23
+ * `
24
+ * parseRelations(content) // ['code_style/error-handling', 'structure/api-endpoints']
25
+ * ```
26
+ */
27
+ export function parseRelations(content) {
28
+ const relations = new Set();
29
+ // Extract all @domain/topic or @domain/topic/subtopic patterns
30
+ const matches = content.matchAll(RELATION_PATTERN);
31
+ for (const match of matches) {
32
+ const [, domain, topic, subtopic] = match;
33
+ const relation = subtopic
34
+ ? `${domain}/${topic}/${subtopic}`
35
+ : `${domain}/${topic}`;
36
+ relations.add(relation);
37
+ }
38
+ return [...relations];
39
+ }
40
+ /**
41
+ * Validate a relation path format.
42
+ * Valid formats: domain/topic or domain/topic/subtopic
43
+ *
44
+ * @param path - Relation path to validate (without @ prefix)
45
+ * @returns True if path format is valid
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * validateRelationPath('code_style/error-handling') // true
50
+ * validateRelationPath('code_style/error-handling/try-catch') // true
51
+ * validateRelationPath('invalid') // false
52
+ * validateRelationPath('too/many/parts/here') // false
53
+ * ```
54
+ */
55
+ export function validateRelationPath(path) {
56
+ const parts = path.split('/');
57
+ // Must have 2 or 3 parts: domain/topic or domain/topic/subtopic
58
+ if (parts.length < 2 || parts.length > 3) {
59
+ return false;
60
+ }
61
+ // Each part must be non-empty and contain only valid characters
62
+ const validPartPattern = /^[\w-]+$/;
63
+ return parts.every(part => validPartPattern.test(part));
64
+ }
65
+ /**
66
+ * Resolve a relation path to an absolute file system path.
67
+ *
68
+ * @param basePath - Base path to context tree (e.g., '.brv/context-tree')
69
+ * @param relation - Relation path (e.g., 'domain/topic' or 'domain/topic/subtopic')
70
+ * @returns Absolute path to the context.md file
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * resolveRelationPath('.brv/context-tree', 'code_style/error-handling')
75
+ * // => '.brv/context-tree/code_style/error-handling/context.md'
76
+ *
77
+ * resolveRelationPath('.brv/context-tree', 'structure/api/endpoints')
78
+ * // => '.brv/context-tree/structure/api/endpoints/context.md'
79
+ * ```
80
+ */
81
+ export function resolveRelationPath(basePath, relation) {
82
+ const parts = relation.split('/');
83
+ return `${basePath}/${parts.join('/')}/context.md`;
84
+ }
85
+ /**
86
+ * Format a relation path using @ notation.
87
+ *
88
+ * @param domain - Domain name
89
+ * @param topic - Topic name
90
+ * @param subtopic - Optional subtopic name
91
+ * @returns Formatted relation string with @ prefix
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * formatRelation('code_style', 'error-handling')
96
+ * // => '@code_style/error-handling'
97
+ *
98
+ * formatRelation('structure', 'api', 'endpoints')
99
+ * // => '@structure/api/endpoints'
100
+ * ```
101
+ */
102
+ export function formatRelation(domain, topic, subtopic) {
103
+ return subtopic
104
+ ? `@${domain}/${topic}/${subtopic}`
105
+ : `@${domain}/${topic}`;
106
+ }
107
+ /**
108
+ * Generate the Relations section for context.md.
109
+ * Returns empty string if no relations provided.
110
+ *
111
+ * @param relations - Array of relation paths (without @ prefix)
112
+ * @returns Markdown formatted Relations section or empty string
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * generateRelationsSection(['code_style/error-handling', 'structure/api'])
117
+ * // => '\n## Relations\n@code_style/error-handling\n@structure/api\n'
118
+ *
119
+ * generateRelationsSection([])
120
+ * // => ''
121
+ * ```
122
+ */
123
+ export function generateRelationsSection(relations) {
124
+ if (relations.length === 0) {
125
+ return '';
126
+ }
127
+ const formattedRelations = relations
128
+ .map(rel => `@${rel}`)
129
+ .join('\n');
130
+ return `\n## Relations\n${formattedRelations}\n`;
131
+ }