claude-flow-novice 2.18.13 → 2.18.14

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 (300) hide show
  1. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  2. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  3. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  4. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  5. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  6. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  7. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  8. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  9. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  10. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/metadata.json +8 -0
  11. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/original +1212 -0
  12. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/revert.sh +7 -0
  13. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/metadata.json +8 -0
  14. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/original +1212 -0
  15. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/revert.sh +7 -0
  16. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/metadata.json +8 -0
  17. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/original +1212 -0
  18. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/revert.sh +7 -0
  19. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/metadata.json +8 -0
  20. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/original +1228 -0
  21. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/revert.sh +7 -0
  22. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/metadata.json +8 -0
  23. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/original +1237 -0
  24. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/revert.sh +7 -0
  25. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/metadata.json +8 -0
  26. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/original +1240 -0
  27. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/revert.sh +7 -0
  28. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/metadata.json +8 -0
  29. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/original +1216 -0
  30. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/revert.sh +7 -0
  31. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/metadata.json +8 -0
  32. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/original +1238 -0
  33. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/revert.sh +7 -0
  34. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/metadata.json +8 -0
  35. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/original +1167 -0
  36. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/revert.sh +7 -0
  37. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/metadata.json +8 -0
  38. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/original +1242 -0
  39. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/revert.sh +7 -0
  40. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/metadata.json +8 -0
  41. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/original +2 -0
  42. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/revert.sh +7 -0
  43. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/metadata.json +8 -0
  44. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/original +1169 -0
  45. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/revert.sh +7 -0
  46. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/metadata.json +8 -0
  47. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/original +1171 -0
  48. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/revert.sh +7 -0
  49. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/metadata.json +8 -0
  50. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/original +1170 -0
  51. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/revert.sh +7 -0
  52. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/metadata.json +8 -0
  53. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/original +1173 -0
  54. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/revert.sh +7 -0
  55. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/metadata.json +8 -0
  56. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/original +1170 -0
  57. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/revert.sh +7 -0
  58. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/metadata.json +8 -0
  59. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/original +1172 -0
  60. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/revert.sh +7 -0
  61. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/metadata.json +8 -0
  62. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/original +1175 -0
  63. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/revert.sh +7 -0
  64. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/metadata.json +8 -0
  65. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/original +1178 -0
  66. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/revert.sh +7 -0
  67. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/metadata.json +8 -0
  68. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/original +1174 -0
  69. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/revert.sh +7 -0
  70. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/metadata.json +8 -0
  71. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/original +1194 -0
  72. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/revert.sh +7 -0
  73. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/metadata.json +8 -0
  74. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/original +1186 -0
  75. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/revert.sh +7 -0
  76. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/metadata.json +8 -0
  77. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/original +1180 -0
  78. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/revert.sh +7 -0
  79. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/metadata.json +8 -0
  80. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/original +1198 -0
  81. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/revert.sh +7 -0
  82. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/metadata.json +8 -0
  83. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/original +1202 -0
  84. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/revert.sh +7 -0
  85. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/metadata.json +8 -0
  86. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/original +1202 -0
  87. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/revert.sh +7 -0
  88. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/metadata.json +8 -0
  89. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/original +1209 -0
  90. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/revert.sh +7 -0
  91. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/metadata.json +8 -0
  92. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/original +1207 -0
  93. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/revert.sh +7 -0
  94. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/metadata.json +8 -0
  95. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/original +1207 -0
  96. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/revert.sh +7 -0
  97. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/metadata.json +8 -0
  98. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/original +1193 -0
  99. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/revert.sh +7 -0
  100. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/metadata.json +8 -0
  101. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/original +1194 -0
  102. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/revert.sh +7 -0
  103. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/metadata.json +8 -0
  104. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/original +1193 -0
  105. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/revert.sh +7 -0
  106. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/metadata.json +8 -0
  107. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/original +1191 -0
  108. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/revert.sh +7 -0
  109. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/metadata.json +8 -0
  110. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/original +1190 -0
  111. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/revert.sh +7 -0
  112. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/metadata.json +8 -0
  113. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/original +1191 -0
  114. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/revert.sh +7 -0
  115. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/metadata.json +8 -0
  116. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/original +1189 -0
  117. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/revert.sh +7 -0
  118. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/metadata.json +8 -0
  119. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/original +1197 -0
  120. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/revert.sh +7 -0
  121. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/metadata.json +8 -0
  122. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/original +1190 -0
  123. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/revert.sh +7 -0
  124. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/metadata.json +8 -0
  125. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/original +1197 -0
  126. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/revert.sh +7 -0
  127. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/metadata.json +8 -0
  128. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/original +1197 -0
  129. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/revert.sh +7 -0
  130. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.md +194 -2
  131. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.sh +264 -0
  132. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.sh.backup +698 -0
  133. package/.claude/hooks/README.md +148 -0
  134. package/.claude/hooks/SessionStart:cfn-load-openai-key.sh +35 -0
  135. package/.claude/hooks/cfn-invoke-pre-edit.sh +1 -1
  136. package/.claude/hooks/cfn-load-cerebras-env.sh +65 -0
  137. package/.claude/hooks/cfn-precompact-enhanced.sh +283 -0
  138. package/.claude/hooks/deprecated/README.md +27 -0
  139. package/.claude/settings.json +71 -6
  140. package/.claude/skills/cfn-cerebras-coordinator/QUICKSTART.md +348 -0
  141. package/.claude/skills/cfn-cerebras-coordinator/README.md +525 -0
  142. package/.claude/skills/cfn-cerebras-coordinator/TDD_COORDINATOR_OVERVIEW.md +284 -0
  143. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v2-test-1733854200.json +36 -0
  144. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v3-test-1765383241.json +36 -0
  145. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v2-test-1765381361.json +36 -0
  146. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v3-test-1765383242.json +46 -0
  147. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v2-test-1733864400.json +66 -0
  148. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v3-test-1765383238.json +66 -0
  149. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v4-test-1765386506.json +66 -0
  150. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v5-test-1765393100.json +66 -0
  151. package/.claude/skills/cfn-cerebras-coordinator/example-usage.sh +206 -0
  152. package/.claude/skills/cfn-cerebras-coordinator/lib/tdd-conversation-coordinator.ts +569 -0
  153. package/.claude/skills/cfn-cerebras-coordinator/test-tdd-coordinator.sh +250 -0
  154. package/.claude/skills/cfn-epic-creator/SKILL.md +392 -0
  155. package/.claude/skills/cfn-epic-creator/estimate-costs.sh +524 -0
  156. package/.claude/skills/cfn-epic-creator/invoke.sh +445 -0
  157. package/.claude/skills/cfn-epic-creator/parse-personas.sh +533 -0
  158. package/.claude/skills/cfn-epic-creator/security-utils.sh +268 -0
  159. package/.claude/skills/cfn-epic-creator/security-verification-demo.sh +127 -0
  160. package/.claude/skills/cfn-epic-creator/test-invoke.sh +620 -0
  161. package/.claude/skills/cfn-epic-creator/test-security-fixes.sh +195 -0
  162. package/.claude/skills/cfn-epic-creator/test-security-simple.sh +165 -0
  163. package/.claude/skills/cfn-epic-creator/validate-epic.sh +474 -0
  164. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/metadata.json +8 -0
  165. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/original +209 -0
  166. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/revert.sh +7 -0
  167. package/.claude/skills/cfn-local-ruvector-accelerator/AGENT_INTEGRATION_PATTERNS.md +255 -0
  168. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml +8 -1
  169. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml.backup +47 -0
  170. package/.claude/skills/cfn-local-ruvector-accelerator/EXTRACTION_EXAMPLES.md +287 -0
  171. package/.claude/skills/cfn-local-ruvector-accelerator/README.md +2 -563
  172. package/.claude/skills/cfn-local-ruvector-accelerator/SCHEMA_V2_IMPLEMENTATION.md +151 -0
  173. package/.claude/skills/cfn-local-ruvector-accelerator/SECURITY_IMPLEMENTATION.md +185 -0
  174. package/.claude/skills/cfn-local-ruvector-accelerator/SKILL.md +8 -351
  175. package/.claude/skills/cfn-local-ruvector-accelerator/docs/EXECUTIVE_SUMMARY.txt +90 -0
  176. package/.claude/skills/cfn-local-ruvector-accelerator/docs/PHASE_4_QUERY_API.md +210 -0
  177. package/.claude/skills/cfn-local-ruvector-accelerator/docs/RUST_AST_EXTRACTOR_IMPLEMENTATION.md +222 -0
  178. package/.claude/skills/cfn-local-ruvector-accelerator/docs/TRANSACTION_MANAGEMENT.md +241 -0
  179. package/.claude/skills/cfn-local-ruvector-accelerator/docs/VALIDATION_FINDINGS.txt +250 -0
  180. package/.claude/skills/cfn-local-ruvector-accelerator/epic-ast-indexer.json +335 -0
  181. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh +292 -96
  182. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh.backup +249 -0
  183. package/.claude/skills/cfn-local-ruvector-accelerator/index_all.sh +65 -0
  184. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/find.rs +214 -0
  185. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index.rs +259 -103
  186. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_ast.rs +767 -0
  187. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_modified.rs +37 -0
  188. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/init.rs +17 -12
  189. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/migration.rs +34 -1
  190. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/mod.rs +6 -0
  191. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/refs.rs +209 -0
  192. package/.claude/skills/cfn-local-ruvector-accelerator/src/embeddings.rs +82 -33
  193. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/mod.rs +251 -0
  194. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust.rs +425 -0
  195. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust_placeholder.rs +420 -0
  196. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/text_fallback.rs +490 -0
  197. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript.rs +520 -0
  198. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript_full.rs +531 -0
  199. package/.claude/skills/cfn-local-ruvector-accelerator/src/lib.rs +20 -0
  200. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs +33 -2
  201. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs.backup +360 -0
  202. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration.rs +325 -318
  203. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_backup.rs +325 -0
  204. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_tx.rs +513 -0
  205. package/.claude/skills/cfn-local-ruvector-accelerator/src/paths.rs +29 -0
  206. package/.claude/skills/cfn-local-ruvector-accelerator/src/query_api.rs +609 -0
  207. package/.claude/skills/cfn-local-ruvector-accelerator/src/schema_v2.rs +603 -0
  208. package/.claude/skills/cfn-local-ruvector-accelerator/src/security_tests.rs +154 -0
  209. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2.rs +583 -0
  210. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_backup.rs +560 -0
  211. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_fixed.rs +0 -0
  212. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_tx.rs +397 -0
  213. package/.claude/skills/cfn-local-ruvector-accelerator/src/test_schema.rs +228 -0
  214. package/.claude/skills/cfn-local-ruvector-accelerator/src/transaction_tests.rs +410 -0
  215. package/.claude/skills/cfn-local-ruvector-accelerator/test_ast_indexing.rs +59 -0
  216. package/.claude/skills/cfn-local-ruvector-accelerator/test_query_api.sh +103 -0
  217. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema.sql +158 -0
  218. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema_v2.sql +147 -0
  219. package/.claude/skills/cfn-mdap-context-injection/SKILL.md +31 -10
  220. package/.claude/skills/cfn-mdap-error-fixer/skill.md +15 -205
  221. package/.claude/skills/cfn-session-handoff/SKILL.md +1 -53
  222. package/.claude/skills/cfn-task-decomposition/SKILL.md +1 -0
  223. package/.claude/skills/cfn-task-intelligence/SKILL.md +39 -18
  224. package/.claude/skills/cfn-task-planning/SKILL.md +37 -12
  225. package/.claude/skills/cfn-validation-framework/SKILL.md +3 -60
  226. package/.claude/skills/cfn-vision-analysis/SKILL.md +3 -20
  227. package/.claude-flow/metrics/performance.json +3 -3
  228. package/.claude-flow/metrics/task-metrics.json +3 -3
  229. package/.ruvector/index_v2.db-shm +0 -0
  230. package/.ruvector/index_v2.db-wal +0 -0
  231. package/CLAUDE.md +9 -1
  232. package/README.md +56 -0
  233. package/docs/AGENT_PRODUCTION_FEEDBACK_PATTERNS.md +389 -0
  234. package/docs/CEREBRAS_TDD_COORDINATOR_TEST_RESULTS.md +213 -0
  235. package/docs/CEREBRAS_TDD_ROUND1_VS_ROUND2_COMPARISON.md +225 -0
  236. package/docs/CEREBRAS_TDD_ROUND3_FINAL_RESULTS.md +264 -0
  237. package/docs/EPIC_CREATOR_V2_ARCHITECTURE.md +629 -0
  238. package/docs/HOOKS_IMPLEMENTATION_PRIORITY.md +585 -0
  239. package/docs/SKILLS_HOOKS_INTEGRATION.md +1074 -0
  240. package/epic-with-personas-2025-12-09-17-15-13.json +253 -0
  241. package/package.json +2 -1
  242. package/test-epic-creator-security.sh +203 -0
  243. package/.claude/skills/cfn-local-ruvector-accelerator/__pycache__/search_engine_v2.cpython-312.pyc +0 -0
  244. package/.claude/skills/cfn-local-ruvector-accelerator/search_engine.py +0 -200
  245. package/jest.config.ts.cjs +0 -17
  246. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/SKILL.md +0 -0
  247. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/context-analyzer.sh +0 -0
  248. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/generate-code.sh +0 -0
  249. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/SKILL.md +0 -0
  250. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/execute.sh +0 -0
  251. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/INTEGRATION.md +0 -0
  252. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SAMPLE_OUTPUTS.md +0 -0
  253. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SKILL.md +0 -0
  254. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/capture-container-logs.sh +0 -0
  255. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/enable-logging.sh +0 -0
  256. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/init-hybrid-logging.sh +0 -0
  257. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/analytics-summary.sh +0 -0
  258. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-agent-timeline.sh +0 -0
  259. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-consensus-history.sh +0 -0
  260. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-coordination-timeline.sh +0 -0
  261. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-failed-containers.sh +0 -0
  262. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-gate-checks.sh +0 -0
  263. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/schema.sql +0 -0
  264. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/sqlite-helpers.sh +0 -0
  265. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/test-hybrid-logging.sh +0 -0
  266. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/SKILL.md +0 -0
  267. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/skill-mcp-selector.js +0 -0
  268. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/SKILL.md +0 -0
  269. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/orchestrate.sh +0 -0
  270. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/SKILL.md +0 -0
  271. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/spawn-agent.sh +0 -0
  272. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/SKILL.md +0 -0
  273. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/cleanup-wave.sh +0 -0
  274. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/lib/docker-helpers.sh +0 -0
  275. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/monitor-wave.sh +0 -0
  276. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/spawn-wave.sh +0 -0
  277. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/SKILL.md +0 -0
  278. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/task-mode-heap-limiter.sh +0 -0
  279. /package/.claude/{skills → cfn-extras/skills/deprecated}/deprecated/analyze-patterns.sh +0 -0
  280. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/README.md +0 -0
  281. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SECURITY.md +0 -0
  282. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SKILL.md +0 -0
  283. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/package.json +0 -0
  284. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/solve.sh +0 -0
  285. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver-minimal.sh +0 -0
  286. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver.sh +0 -0
  287. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test.cjs +0 -0
  288. /package/.claude/hooks/{cfn-credential-scanner.sh → deprecated/cfn-credential-scanner.sh} +0 -0
  289. /package/.claude/hooks/{cfn-detect-hardcoded-credentials.sh → deprecated/cfn-detect-hardcoded-credentials.sh} +0 -0
  290. /package/.claude/hooks/{cfn-invoke-post-edit-ts.sh → deprecated/cfn-invoke-post-edit-ts.sh} +0 -0
  291. /package/.claude/hooks/{cfn-invoke-pre-edit-ts.sh → deprecated/cfn-invoke-pre-edit-ts.sh} +0 -0
  292. /package/.claude/hooks/{cfn-invoke-security-validation.sh → deprecated/cfn-invoke-security-validation.sh} +0 -0
  293. /package/.claude/hooks/{cfn-lint-sql-injection.sh → deprecated/cfn-lint-sql-injection.sh} +0 -0
  294. /package/.claude/hooks/{cfn-post-edit.sh → deprecated/cfn-post-edit.sh} +0 -0
  295. /package/.claude/hooks/{cfn-pre-edit-backup.sh → deprecated/cfn-pre-edit-backup.sh} +0 -0
  296. /package/.claude/skills/cfn-local-ruvector-accelerator/{embeddings_manager.py → embeddings_manager.py.backup} +0 -0
  297. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/index.bin +0 -0
  298. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/metadata.json +0 -0
  299. /package/.claude/skills/cfn-local-ruvector-accelerator/{search_engine_v2.py → search_engine_v2.py.backup} +0 -0
  300. /package/.claude/skills/cfn-local-ruvector-accelerator/{sqlite_store.py → sqlite_store.py.backup} +0 -0
@@ -0,0 +1,37 @@
1
+ use std::fs;
2
+ use std::path::{Path, PathBuf};
3
+ use std::io;
4
+ use walkdir::{WalkDir, DirEntry};
5
+
6
+ pub fn collect_files(root_dir: &Path, index_path: &Path) -> io::Result<Vec<PathBuf>> {
7
+ let mut files = Vec::new();
8
+
9
+ for entry in WalkDir::new(root_dir)
10
+ .into_iter()
11
+ .filter_entry(|e| {
12
+ let path = e.path();
13
+
14
+ // Skip the index file itself
15
+ if path == index_path {
16
+ return false;
17
+ }
18
+
19
+ // Skip specific directories
20
+ if let Some(name) = path.file_name().and_then(|n| n.to_str()) {
21
+ match name {
22
+ "node_modules" | "target" | "dist" | "build" => return false,
23
+ _ => {}
24
+ }
25
+ }
26
+
27
+ true
28
+ })
29
+ .filter_map(|e| e.ok())
30
+ {
31
+ if entry.file_type().is_file() {
32
+ files.push(entry.path().to_path_buf());
33
+ }
34
+ }
35
+
36
+ Ok(files)
37
+ }
@@ -7,6 +7,7 @@ use serde_json::json;
7
7
  use crate::embeddings::EmbeddingsManager;
8
8
  use crate::search_engine::SearchEngine;
9
9
  use crate::sqlite_store::SqliteStore;
10
+ use local_ruvector::paths::{get_ruvector_dir, get_v1_index_dir, get_database_path};
10
11
 
11
12
  pub struct InitCommand {
12
13
  project_dir: PathBuf,
@@ -30,8 +31,8 @@ impl InitCommand {
30
31
  self.project_dir.display()));
31
32
  }
32
33
 
33
- // Check if already initialized
34
- let ruvector_dir = self.project_dir.join(".ruvector");
34
+ // Check if already initialized in centralized location
35
+ let ruvector_dir = get_ruvector_dir()?;
35
36
  if ruvector_dir.exists() && !self.force {
36
37
  eprintln!("⚠️ RuVector already initialized. Use --force to reinitialize.");
37
38
  return Err(anyhow!("Already initialized"));
@@ -42,19 +43,18 @@ impl InitCommand {
42
43
  }
43
44
 
44
45
  pub fn execute(&self) -> Result<()> {
45
- info!("Initializing RuVector in: {}", self.project_dir.display());
46
-
47
- let ruvector_dir = self.project_dir.join(".ruvector");
46
+ let ruvector_dir = get_ruvector_dir()?;
47
+ info!("Initializing centralized RuVector in: {}", ruvector_dir.display());
48
48
 
49
49
  // Remove existing directory if forcing
50
50
  if self.force && ruvector_dir.exists() {
51
51
  fs::remove_dir_all(&ruvector_dir)
52
- .context("Failed to remove existing .ruvector directory")?;
52
+ .context("Failed to remove existing RuVector directory")?;
53
53
  }
54
54
 
55
55
  // Create directory structure
56
56
  fs::create_dir_all(&ruvector_dir)
57
- .context("Failed to create .ruvector directory")?;
57
+ .context("Failed to create RuVector directory")?;
58
58
 
59
59
  // Create subdirectories
60
60
  fs::create_dir_all(ruvector_dir.join("embeddings"))?;
@@ -80,7 +80,8 @@ impl InitCommand {
80
80
  }
81
81
 
82
82
  fn create_config(&self) -> Result<()> {
83
- let config_path = self.project_dir.join(".ruvector").join("config.json");
83
+ let ruvector_dir = get_ruvector_dir()?;
84
+ let config_path = ruvector_dir.join("config.json");
84
85
 
85
86
  let config = json!({
86
87
  "version": "1.0.0",
@@ -100,16 +101,20 @@ impl InitCommand {
100
101
  }
101
102
 
102
103
  fn initialize_database(&self) -> Result<()> {
103
- let db_path = self.project_dir.join(".ruvector").join("index.db");
104
+ let db_path = get_database_path()?;
104
105
  let store = SqliteStore::new(&db_path)?;
105
106
  store.initialize()?;
106
107
 
107
- debug!("Database initialized: {}", db_path.display());
108
+ // Initialize Schema V2 (entities, refs, type_usage, modules, entity_embeddings)
109
+ let conn = rusqlite::Connection::open(&db_path)?;
110
+ local_ruvector::schema_v2::SchemaV2::initialize(&conn)?;
111
+
112
+ debug!("Database initialized (V1 + V2 schemas): {}", db_path.display());
108
113
  Ok(())
109
114
  }
110
115
 
111
116
  fn initialize_embeddings(&self) -> Result<()> {
112
- let embeddings_dir = self.project_dir.join(".ruvector");
117
+ let embeddings_dir = get_ruvector_dir()?;
113
118
  let _ = EmbeddingsManager::new(&embeddings_dir)?;
114
119
 
115
120
  debug!("Embeddings manager initialized");
@@ -124,4 +129,4 @@ impl InitCommand {
124
129
  debug!("Search engine initialized");
125
130
  Ok(())
126
131
  }
127
- }
132
+ }
@@ -1,5 +1,9 @@
1
- use anyhow::{Result, anyhow};
1
+ use anyhow::{Result, Context, anyhow};
2
2
  use std::path::{Path, PathBuf};
3
+ use rusqlite::Connection;
4
+ use tracing::{info, error};
5
+
6
+ use crate::migration_tx::MigrationWithTx;
3
7
 
4
8
  #[derive(Debug, Clone)]
5
9
  pub enum SourceType {
@@ -40,6 +44,35 @@ impl MigrationCommand {
40
44
  }
41
45
  }
42
46
 
47
+ /// Execute migration with transaction support
48
+ pub fn execute_with_tx(&self) -> Result<()> {
49
+ let db_path = self.project_dir.join(".ruvector/index_v2.db");
50
+
51
+ // Ensure database directory exists
52
+ std::fs::create_dir_all(db_path.parent().unwrap())
53
+ .context("Failed to create database directory")?;
54
+
55
+ let mut conn = Connection::open(&db_path)
56
+ .context("Failed to open database for migration")?;
57
+
58
+ info!("Starting migration with transaction support");
59
+
60
+ // Use the transaction-aware migration
61
+ match self.source_type {
62
+ SourceType::RuVectorPython => {
63
+ MigrationWithTx::migrate_v1_to_v2_atomic(&mut conn)?;
64
+ MigrationWithTx::validate_migration(&mut conn)?;
65
+ }
66
+ _ => {
67
+ // For other sources, fall back to the original method
68
+ self.execute()?;
69
+ }
70
+ }
71
+
72
+ info!("Migration completed successfully");
73
+ Ok(())
74
+ }
75
+
43
76
  fn migrate_from_python(&self) -> Result<()> {
44
77
  println!("⚠️ Migration from Python RuVector not yet implemented");
45
78
  if self.dry_run {
@@ -1,18 +1,24 @@
1
1
  pub mod init;
2
2
  pub mod index;
3
+ pub mod index_ast;
3
4
  pub mod query;
4
5
  pub mod stats;
5
6
  pub mod cleanup;
6
7
  pub mod migration;
7
8
  pub mod reset;
8
9
  pub mod export;
10
+ pub mod find;
11
+ pub mod refs;
9
12
 
10
13
  // Re-export the command structs only, not internal types
11
14
  pub use init::InitCommand;
12
15
  pub use index::IndexCommand;
16
+ pub use index_ast::AstIndexCommand;
13
17
  pub use query::{QueryCommand, BatchQueryCommand};
14
18
  pub use stats::StatsCommand;
15
19
  pub use cleanup::CleanupCommand;
16
20
  pub use migration::MigrationCommand;
17
21
  pub use reset::ResetCommand;
18
22
  pub use export::{ExportCommand, ExportFormat};
23
+ pub use find::FindCommand;
24
+ pub use refs::RefsCommand;
@@ -0,0 +1,209 @@
1
+ use anyhow::{Result, Context};
2
+ use clap::Args;
3
+ use serde_json::{json};
4
+ use std::path::{Path, PathBuf};
5
+ use tracing::{info, debug, warn};
6
+
7
+ use crate::query_api::{QueryApi, QueryResultFormatter};
8
+ use crate::store_v2::{StoreV2};
9
+
10
+ #[derive(Debug, Args)]
11
+ pub struct RefsCommand {
12
+ /// Find all references to an entity by name
13
+ #[arg()]
14
+ pub entity_name: String,
15
+
16
+ /// Entity kind to search for (function, struct, enum, etc.)
17
+ #[arg(long)]
18
+ pub kind: Option<String>,
19
+
20
+ /// Reference kind filter (call, import, implement, etc.)
21
+ #[arg(long)]
22
+ pub ref_kind: Option<String>,
23
+
24
+ /// Limit search to specific file
25
+ #[arg(long)]
26
+ pub file: Option<String>,
27
+
28
+ /// Maximum number of results to return
29
+ #[arg(short, long, default_value = "50")]
30
+ pub limit: usize,
31
+
32
+ /// Output format
33
+ #[arg(long, value_enum, default_value = "simple")]
34
+ pub format: RefsOutputFormat,
35
+
36
+ /// Show detailed context
37
+ #[arg(long)]
38
+ pub detailed: bool,
39
+
40
+ /// Output file (optional)
41
+ #[arg(long)]
42
+ pub output: Option<PathBuf>,
43
+
44
+ /// Group results by file
45
+ #[arg(long)]
46
+ pub group_by_file: bool,
47
+
48
+ /// Include only inbound references (references to this entity)
49
+ #[arg(long)]
50
+ pub inbound: bool,
51
+
52
+ /// Include only outbound references (references from this entity)
53
+ #[arg(long)]
54
+ pub outbound: bool,
55
+ }
56
+
57
+ #[derive(Debug, Clone, clap::ValueEnum)]
58
+ pub enum RefsOutputFormat {
59
+ Simple,
60
+ Json,
61
+ Detailed,
62
+ Tree,
63
+ }
64
+
65
+ impl RefsCommand {
66
+ pub fn execute(&self, project_dir: &Path) -> Result<()> {
67
+ // Initialize store and query API
68
+ let db_path = project_dir.join(".ruvector").join("index.db");
69
+ let store = StoreV2::new(&db_path)
70
+ .context("Failed to open database")?;
71
+ let query_api = QueryApi::new(store);
72
+
73
+ // Build a path-like search term
74
+ let search_term = if let Some(kind) = &self.kind {
75
+ format!("{}::{}", kind, self.entity_name)
76
+ } else {
77
+ self.entity_name.clone()
78
+ };
79
+
80
+ // Find references using the query API
81
+ let mut result = query_api.find_references_to_path(&search_term)?;
82
+
83
+ // Filter results based on command options
84
+ let filtered_results: Vec<_> = result.results.into_iter()
85
+ .filter(|item| {
86
+ // Filter by file if specified
87
+ if let Some(file) = &self.file {
88
+ if !item.entity.file_path.contains(file) {
89
+ return false;
90
+ }
91
+ }
92
+
93
+ // Additional filtering could be added here for ref_kind
94
+ true
95
+ })
96
+ .collect();
97
+
98
+ // Update the result with filtered items
99
+ result.results = filtered_results;
100
+ result.total_count = result.results.len();
101
+
102
+ // Apply limit
103
+ let limited_result = crate::query_api::QueryResult {
104
+ query_type: result.query_type,
105
+ results: result.results.into_iter().take(self.limit).collect(),
106
+ total_count: result.total_count,
107
+ };
108
+
109
+ // Format and output results
110
+ let output = match self.format {
111
+ RefsOutputFormat::Simple => self.format_simple(&limited_result),
112
+ RefsOutputFormat::Json => limited_result.format_json()?,
113
+ RefsOutputFormat::Detailed => limited_result.format_detailed(),
114
+ RefsOutputFormat::Tree => self.format_tree(&limited_result),
115
+ };
116
+
117
+ // Write output
118
+ if let Some(output_path) = &self.output {
119
+ std::fs::write(output_path, output)
120
+ .context("Failed to write output file")?;
121
+ info!("Results written to: {}", output_path.display());
122
+ } else {
123
+ println!("{}", output);
124
+ }
125
+
126
+ // Show summary if we truncated results
127
+ if limited_result.total_count > self.limit {
128
+ eprintln!("\n⚠️ Showing {} of {} total results", self.limit, limited_result.total_count);
129
+ }
130
+
131
+ info!("Refs command completed: {} references found", limited_result.total_count);
132
+ Ok(())
133
+ }
134
+
135
+ fn format_simple(&self, result: &crate::query_api::QueryResult) -> String {
136
+ if self.group_by_file {
137
+ let mut groups = std::collections::HashMap::new();
138
+ for item in &result.results {
139
+ groups.entry(&item.entity.file_path)
140
+ .or_insert_with(Vec::new)
141
+ .push(item);
142
+ }
143
+
144
+ let mut output = String::new();
145
+ for (file_path, items) in groups {
146
+ output.push_str(&format!("\n📁 {}\n", file_path));
147
+ for item in items {
148
+ output.push_str(&format!(" {}:{} - {}\n",
149
+ item.entity.line_number,
150
+ item.entity.name,
151
+ item.entity.kind.as_str()
152
+ ));
153
+ }
154
+ }
155
+ output.trim_start().to_string()
156
+ } else {
157
+ result.results.iter()
158
+ .map(|item| format!("{}:{} - {} ({})",
159
+ item.entity.file_path,
160
+ item.entity.line_number,
161
+ item.entity.name,
162
+ item.entity.kind.as_str()))
163
+ .collect::<Vec<_>>()
164
+ .join("\n")
165
+ }
166
+ }
167
+
168
+ fn format_tree(&self, result: &crate::query_api::QueryResult) -> String {
169
+ let mut tree = String::new();
170
+
171
+ // Group by file for tree view
172
+ let mut groups = std::collections::HashMap::new();
173
+ for item in &result.results {
174
+ groups.entry(&item.entity.file_path)
175
+ .or_insert_with(Vec::new)
176
+ .push(item);
177
+ }
178
+
179
+ for (file_path, items) in groups {
180
+ tree.push_str(&format!("📁 {}\n", file_path));
181
+
182
+ // Group by line number to show multiple refs on same line
183
+ let mut line_groups = std::collections::HashMap::new();
184
+ for item in items {
185
+ line_groups.entry(item.entity.line_number)
186
+ .or_insert_with(Vec::new)
187
+ .push(item);
188
+ }
189
+
190
+ for (line, items_at_line) in line_groups {
191
+ tree.push_str(&format!(" 📍 Line {}:\n", line));
192
+ for item in items_at_line {
193
+ tree.push_str(&format!(" ├── {} ({})\n",
194
+ item.entity.name,
195
+ item.entity.kind.as_str()
196
+ ));
197
+ if let Some(context) = &item.context {
198
+ let first_line = context.lines().next().unwrap_or("").trim();
199
+ if !first_line.is_empty() {
200
+ tree.push_str(&format!(" │ └─ {}\n", first_line));
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+
207
+ tree
208
+ }
209
+ }
@@ -1,24 +1,26 @@
1
1
  use anyhow::{Result, Context, anyhow};
2
- use ndarray::Array1;
3
2
  use serde::{Serialize, Deserialize};
4
3
  use std::path::Path;
5
- use std::collections::HashMap;
6
- use std::fs;
7
- use tracing::{info, debug};
4
+ use std::env;
5
+ use reqwest;
6
+ use tokio;
7
+ use tracing::{info, debug, warn, error};
8
8
 
9
9
  #[derive(Debug, Clone, Serialize, Deserialize)]
10
10
  pub struct EmbeddingConfig {
11
11
  pub dimension: usize,
12
12
  pub model: String,
13
13
  pub batch_size: usize,
14
+ pub api_key: Option<String>,
14
15
  }
15
16
 
16
17
  impl Default for EmbeddingConfig {
17
18
  fn default() -> Self {
18
19
  Self {
19
20
  dimension: 1536,
20
- model: "text-embedding-ada-002".to_string(),
21
+ model: "text-embedding-3-small".to_string(),
21
22
  batch_size: 100,
23
+ api_key: env::var("OPENAI_API_KEY").ok(),
22
24
  }
23
25
  }
24
26
  }
@@ -26,65 +28,112 @@ impl Default for EmbeddingConfig {
26
28
  #[derive(Debug, Clone)]
27
29
  pub struct EmbeddingsManager {
28
30
  config: EmbeddingConfig,
29
- cache: HashMap<String, Array1<f32>>,
31
+ client: reqwest::Client,
32
+ }
33
+
34
+ #[derive(Debug, Serialize)]
35
+ struct OpenAIRequest {
36
+ input: Vec<String>,
37
+ model: String,
38
+ }
39
+
40
+ #[derive(Debug, Deserialize)]
41
+ struct OpenAIResponse {
42
+ data: Vec<OpenAIEmbedding>,
43
+ }
44
+
45
+ #[derive(Debug, Deserialize)]
46
+ struct OpenAIEmbedding {
47
+ embedding: Vec<f32>,
30
48
  }
31
49
 
32
50
  impl EmbeddingsManager {
33
51
  pub fn new(cache_dir: &Path) -> Result<Self> {
34
- fs::create_dir_all(cache_dir)
52
+ std::fs::create_dir_all(cache_dir)
35
53
  .context("Failed to create embeddings cache directory")?;
36
54
 
37
55
  let config = EmbeddingConfig::default();
56
+ let client = reqwest::Client::new();
38
57
 
39
58
  Ok(Self {
40
59
  config,
41
- cache: HashMap::new(),
60
+ client,
42
61
  })
43
62
  }
44
63
 
45
- pub fn generate_embeddings(&self, texts: &[String]) -> Result<Vec<Vec<f32>>> {
46
- debug!("Generating embeddings for {} texts", texts.len());
64
+ async fn call_openai_api(&self, texts: &[String]) -> Result<Vec<Vec<f32>>> {
65
+ let api_key = self.config.api_key.as_ref()
66
+ .ok_or_else(|| anyhow!("OpenAI API key not configured"))?;
67
+
68
+ let request = OpenAIRequest {
69
+ input: texts.to_vec(),
70
+ model: self.config.model.clone(),
71
+ };
72
+
73
+ let response = self.client
74
+ .post("https://api.openai.com/v1/embeddings")
75
+ .header("Authorization", format!("Bearer {}", api_key))
76
+ .header("Content-Type", "application/json")
77
+ .json(&request)
78
+ .send()
79
+ .await
80
+ .context("Failed to send request to OpenAI API")?;
81
+
82
+ if !response.status().is_success() {
83
+ let status = response.status();
84
+ let error_text = response.text().await.unwrap_or_default();
85
+ error!("OpenAI API error: {} - {}", status, error_text);
86
+ return Err(anyhow!("OpenAI API request failed: {}", status));
87
+ }
47
88
 
48
- let mut embeddings = Vec::with_capacity(texts.len());
89
+ let openai_response: OpenAIResponse = response.json().await
90
+ .context("Failed to parse OpenAI API response")?;
49
91
 
50
- for text in texts {
51
- // Generate a simple dummy embedding for now
52
- // In a real implementation, this would call an embedding API
53
- let embedding = self.generate_dummy_embedding(text)?;
54
- embeddings.push(embedding);
55
- }
92
+ let embeddings: Vec<Vec<f32>> = openai_response.data
93
+ .into_iter()
94
+ .map(|emb| emb.embedding)
95
+ .collect();
56
96
 
57
- info!("Generated {} embeddings", embeddings.len());
58
97
  Ok(embeddings)
59
98
  }
60
99
 
61
- pub fn generate_embedding(&self, text: &str) -> Result<Vec<f32>> {
62
- // Check cache first
63
- if let Some(embedding) = self.cache.get(text) {
64
- return Ok(embedding.to_vec());
100
+ pub fn generate_embeddings(&self, texts: &[String]) -> Result<Vec<Vec<f32>>> {
101
+ debug!("Generating embeddings for {} texts", texts.len());
102
+
103
+ if self.config.api_key.is_none() {
104
+ warn!("OpenAI API key not found, falling back to dummy embeddings");
105
+ let mut embeddings = Vec::with_capacity(texts.len());
106
+ for text in texts {
107
+ embeddings.push(self.generate_dummy_embedding(text));
108
+ }
109
+ info!("Generated {} dummy embeddings", embeddings.len());
110
+ return Ok(embeddings);
65
111
  }
66
112
 
67
- // Generate new embedding
68
- let embedding = self.generate_dummy_embedding(text)?;
69
-
70
- Ok(embedding)
113
+ let mut all_embeddings = Vec::with_capacity(texts.len());
114
+ let rt = tokio::runtime::Runtime::new()?;
115
+
116
+ for chunk in texts.chunks(self.config.batch_size) {
117
+ let embeddings = rt.block_on(self.call_openai_api(chunk))
118
+ .context("Failed to generate embeddings from OpenAI API")?;
119
+ all_embeddings.extend(embeddings);
120
+ }
121
+
122
+ info!("Generated {} embeddings", all_embeddings.len());
123
+ Ok(all_embeddings)
71
124
  }
72
125
 
73
- fn generate_dummy_embedding(&self, text: &str) -> Result<Vec<f32>> {
74
- // Generate a deterministic but pseudo-random embedding based on text
126
+ fn generate_dummy_embedding(&self, text: &str) -> Vec<f32> {
75
127
  let mut embedding = vec![0.0; self.config.dimension];
76
128
 
77
- // Simple hash-based embedding generation
78
129
  let bytes = text.as_bytes();
79
130
  for (i, &byte) in bytes.iter().enumerate() {
80
131
  let pos = (i * 7) % self.config.dimension;
81
132
  embedding[pos] = ((byte as f32) / 255.0) * 2.0 - 1.0;
82
133
  }
83
134
 
84
- // Apply some transformations to make it more realistic
85
135
  self.normalize_embedding(&mut embedding);
86
-
87
- Ok(embedding)
136
+ embedding
88
137
  }
89
138
 
90
139
  fn normalize_embedding(&self, embedding: &mut [f32]) {
@@ -118,4 +167,4 @@ impl EmbeddingsManager {
118
167
  .map(|emb| self.compute_similarity(query, emb))
119
168
  .collect()
120
169
  }
121
- }
170
+ }