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,583 @@
1
+ use anyhow::{Result, Context, anyhow};
2
+ use rusqlite::{Connection, params, Row, OptionalExtension};
3
+ use std::path::Path;
4
+ use serde::{Serialize, Deserialize};
5
+ use tracing::{info, debug, error, warn};
6
+ use chrono::{DateTime, Utc};
7
+
8
+ use crate::schema_v2::{EntityKind, RefKind, Visibility};
9
+ use crate::search_engine::SearchResult;
10
+
11
+ #[derive(Debug, Clone, Serialize, Deserialize)]
12
+ pub struct Entity {
13
+ pub id: i64,
14
+ pub kind: EntityKind,
15
+ pub name: String,
16
+ pub signature: Option<String>,
17
+ pub visibility: Visibility,
18
+ pub parent_id: Option<i64>,
19
+ pub file_path: String,
20
+ pub line_number: i64,
21
+ pub column_number: Option<i64>,
22
+ pub doc_comment: Option<String>,
23
+ pub attributes: Option<String>,
24
+ pub metadata: Option<String>,
25
+ pub created_at: DateTime<Utc>,
26
+ pub updated_at: DateTime<Utc>,
27
+ }
28
+
29
+ #[derive(Debug, Clone, Serialize, Deserialize)]
30
+ pub struct Reference {
31
+ pub id: i64,
32
+ pub source_entity_id: i64,
33
+ pub target_entity_id: i64,
34
+ pub ref_kind: RefKind,
35
+ pub file_path: String,
36
+ pub line_number: i64,
37
+ pub column_number: Option<i64>,
38
+ pub context: Option<String>,
39
+ pub created_at: DateTime<Utc>,
40
+ }
41
+
42
+ #[derive(Debug, Clone, Serialize, Deserialize)]
43
+ pub struct TypeUsage {
44
+ pub id: i64,
45
+ pub entity_id: i64,
46
+ pub type_name: String,
47
+ pub usage_kind: String,
48
+ pub file_path: String,
49
+ pub line_number: i64,
50
+ pub created_at: DateTime<Utc>,
51
+ }
52
+
53
+ #[derive(Debug, Clone, Serialize, Deserialize)]
54
+ pub struct Module {
55
+ pub id: i64,
56
+ pub name: String,
57
+ pub file_path: String,
58
+ pub module_type: String,
59
+ pub is_root: bool,
60
+ pub parent_module_id: Option<i64>,
61
+ pub created_at: DateTime<Utc>,
62
+ }
63
+
64
+ pub struct StoreV2 {
65
+ pub(crate) conn: Connection,
66
+ }
67
+
68
+
69
+ /// Validate that IDs are valid integers to prevent injection
70
+ fn validate_ids(ids: &[i64]) -> Result<()> {
71
+ for id in ids {
72
+ if *id < 0 || *id > 9223372036854775807 {
73
+ return Err(anyhow::anyhow!("Invalid ID value: {}", id));
74
+ }
75
+ }
76
+ Ok(())
77
+ }
78
+
79
+
80
+ impl StoreV2 {
81
+ pub fn new(db_path: &Path) -> Result<Self> {
82
+ let conn = Connection::open(db_path)
83
+ .context("Failed to open database")?;
84
+
85
+ // Performance optimizations
86
+ conn.pragma_update(None, "journal_mode", "WAL")?;
87
+ conn.pragma_update(None, "synchronous", "NORMAL")?;
88
+ conn.pragma_update(None, "cache_size", 10000)?; // 10MB cache
89
+ conn.pragma_update(None, "temp_store", "memory")?;
90
+ conn.pragma_update(None, "mmap_size", 268435456)?; // 256MB memory map
91
+
92
+ Ok(Self { conn })
93
+ }
94
+
95
+ pub fn transaction(&self) -> Result<rusqlite::Transaction> {
96
+ Ok(self.conn.unchecked_transaction()?)
97
+ }
98
+
99
+ // Entity operations
100
+ pub fn insert_entity(&self, entity: &Entity) -> Result<i64> {
101
+ debug!("Inserting entity: {} ({})", entity.name, entity.kind.as_str());
102
+
103
+ self.conn.execute(
104
+ r#"
105
+ INSERT INTO entities (
106
+ kind, name, signature, visibility, parent_id, file_path,
107
+ line_number, column_number, doc_comment, attributes, metadata
108
+ ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)
109
+ "#,
110
+ params![
111
+ entity.kind.as_str(),
112
+ entity.name,
113
+ entity.signature,
114
+ entity.visibility.as_str(),
115
+ entity.parent_id,
116
+ entity.file_path,
117
+ entity.line_number,
118
+ entity.column_number,
119
+ entity.doc_comment,
120
+ entity.attributes,
121
+ entity.metadata
122
+ ],
123
+ )?;
124
+
125
+ Ok(self.conn.last_insert_rowid())
126
+ }
127
+
128
+ pub fn get_entity(&self, id: i64) -> Result<Option<Entity>> {
129
+ debug!("Getting entity with id: {}", id);
130
+
131
+ let mut stmt = self.conn.prepare(
132
+ "SELECT * FROM entities WHERE id = ?"
133
+ )?;
134
+
135
+ let entity = stmt.query_row([id], |row| {
136
+ self.row_to_entity(row)
137
+ }).optional()?;
138
+
139
+ Ok(entity)
140
+ }
141
+
142
+ pub fn find_entities_by_name(&self, name: &str, limit: usize) -> Result<Vec<Entity>> {
143
+ debug!("Finding entities with name: {}", name);
144
+
145
+ let mut stmt = self.conn.prepare(
146
+ "SELECT * FROM entities WHERE name = ? ORDER BY file_path, line_number LIMIT ?"
147
+ )?;
148
+
149
+ let entities = stmt.query_map(
150
+ params![name, limit as i64],
151
+ |row| self.row_to_entity(row)
152
+ )?.collect::<Result<Vec<_>, _>>()?;
153
+
154
+ Ok(entities)
155
+ }
156
+
157
+ pub fn find_entities_by_kind(&self, kind: EntityKind, limit: usize) -> Result<Vec<Entity>> {
158
+ debug!("Finding entities of kind: {}", kind.as_str());
159
+
160
+ let mut stmt = self.conn.prepare(
161
+ "SELECT * FROM entities WHERE kind = ? ORDER BY name LIMIT ?"
162
+ )?;
163
+
164
+ let entities = stmt.query_map(
165
+ params![kind.as_str(), limit as i64],
166
+ |row| self.row_to_entity(row)
167
+ )?.collect::<Result<Vec<_>, _>>()?;
168
+
169
+ Ok(entities)
170
+ }
171
+
172
+ pub fn find_entities_in_file(&self, file_path: &str) -> Result<Vec<Entity>> {
173
+ debug!("Finding entities in file: {}", file_path);
174
+
175
+ let mut stmt = self.conn.prepare(
176
+ "SELECT * FROM entities WHERE file_path = ? ORDER BY line_number"
177
+ )?;
178
+
179
+ let entities = stmt.query_map([file_path], |row| {
180
+ self.row_to_entity(row)
181
+ })?.collect::<Result<Vec<_>, _>>()?;
182
+
183
+ Ok(entities)
184
+ }
185
+
186
+ pub fn search_entities(&self, query: &str, limit: usize) -> Result<Vec<Entity>> {
187
+ debug!("Searching entities with query: {}", query);
188
+
189
+ let mut stmt = self.conn.prepare(
190
+ r#"
191
+ SELECT * FROM entities
192
+ WHERE name LIKE ? OR signature LIKE ? OR doc_comment LIKE ?
193
+ ORDER BY
194
+ CASE WHEN name LIKE ? THEN 1 ELSE 2 END,
195
+ name
196
+ LIMIT ?
197
+ "#
198
+ )?;
199
+
200
+ let pattern = format!("%{}%", query);
201
+ let entities = stmt.query_map(
202
+ params![pattern, pattern, pattern, pattern, limit as i64],
203
+ |row| self.row_to_entity(row)
204
+ )?.collect::<Result<Vec<_>, _>>()?;
205
+
206
+ Ok(entities)
207
+ }
208
+
209
+ // Reference operations
210
+ pub fn insert_reference(&self, reference: &Reference) -> Result<i64> {
211
+ debug!("Inserting reference: {} -> {}", reference.source_entity_id, reference.target_entity_id);
212
+
213
+ self.conn.execute(
214
+ r#"
215
+ INSERT INTO refs (
216
+ source_entity_id, target_entity_id, ref_kind, file_path,
217
+ line_number, column_number, context
218
+ ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)
219
+ "#,
220
+ params![
221
+ reference.source_entity_id,
222
+ reference.target_entity_id,
223
+ reference.ref_kind.as_str(),
224
+ reference.file_path,
225
+ reference.line_number,
226
+ reference.column_number,
227
+ reference.context
228
+ ],
229
+ )?;
230
+
231
+ Ok(self.conn.last_insert_rowid())
232
+ }
233
+
234
+ pub fn find_references_to_entity(&self, entity_id: i64) -> Result<Vec<Reference>> {
235
+ debug!("Finding references to entity: {}", entity_id);
236
+
237
+ let mut stmt = self.conn.prepare(
238
+ "SELECT * FROM refs WHERE target_entity_id = ? ORDER BY file_path, line_number"
239
+ )?;
240
+
241
+ let refs = stmt.query_map([entity_id], |row| {
242
+ self.row_to_reference(row)
243
+ })?.collect::<Result<Vec<_>, _>>()?;
244
+
245
+ Ok(refs)
246
+ }
247
+
248
+ pub fn find_references_from_entity(&self, entity_id: i64) -> Result<Vec<Reference>> {
249
+ debug!("Finding references from entity: {}", entity_id);
250
+
251
+ let mut stmt = self.conn.prepare(
252
+ "SELECT * FROM refs WHERE source_entity_id = ? ORDER BY ref_kind, file_path"
253
+ )?;
254
+
255
+ let refs = stmt.query_map([entity_id], |row| {
256
+ self.row_to_reference(row)
257
+ })?.collect::<Result<Vec<_>, _>>()?;
258
+
259
+ Ok(refs)
260
+ }
261
+
262
+ // Type usage operations
263
+ pub fn insert_type_usage(&self, type_usage: &TypeUsage) -> Result<i64> {
264
+ debug!("Inserting type usage: {} uses {}", type_usage.entity_id, type_usage.type_name);
265
+
266
+ self.conn.execute(
267
+ r#"
268
+ INSERT INTO type_usage (
269
+ entity_id, type_name, usage_kind, file_path, line_number
270
+ ) VALUES (?1, ?2, ?3, ?4, ?5)
271
+ "#,
272
+ params![
273
+ type_usage.entity_id,
274
+ type_usage.type_name,
275
+ type_usage.usage_kind,
276
+ type_usage.file_path,
277
+ type_usage.line_number
278
+ ],
279
+ )?;
280
+
281
+ Ok(self.conn.last_insert_rowid())
282
+ }
283
+
284
+ pub fn find_entities_using_type(&self, type_name: &str) -> Result<Vec<i64>> {
285
+ debug!("Finding entities using type: {}", type_name);
286
+
287
+ let mut stmt = self.conn.prepare(
288
+ "SELECT DISTINCT entity_id FROM type_usage WHERE type_name = ?"
289
+ )?;
290
+
291
+ let entity_ids = stmt.query_map([type_name], |row| {
292
+ row.get(0)
293
+ })?.collect::<Result<Vec<_>, _>>()?;
294
+
295
+ Ok(entity_ids)
296
+ }
297
+
298
+ // Module operations
299
+ pub fn insert_module(&self, module: &Module) -> Result<i64> {
300
+ debug!("Inserting module: {}", module.name);
301
+
302
+ self.conn.execute(
303
+ r#"
304
+ INSERT INTO modules (
305
+ name, file_path, module_type, is_root, parent_module_id
306
+ ) VALUES (?1, ?2, ?3, ?4, ?5)
307
+ "#,
308
+ params![
309
+ module.name,
310
+ module.file_path,
311
+ module.module_type,
312
+ module.is_root,
313
+ module.parent_module_id
314
+ ],
315
+ )?;
316
+
317
+ Ok(self.conn.last_insert_rowid())
318
+ }
319
+
320
+ pub fn find_module_by_file(&self, file_path: &str) -> Result<Option<Module>> {
321
+ debug!("Finding module for file: {}", file_path);
322
+
323
+ let mut stmt = self.conn.prepare(
324
+ "SELECT * FROM modules WHERE file_path = ?"
325
+ )?;
326
+
327
+ let module = stmt.query_row([file_path], |row| {
328
+ self.row_to_module(row)
329
+ }).optional()?;
330
+
331
+ Ok(module)
332
+ }
333
+
334
+ // Embedding operations
335
+ pub fn store_embedding(&self, entity_id: i64, embedding: &[f32], model: &str) -> Result<()> {
336
+ debug!("Storing embedding for entity: {}", entity_id);
337
+
338
+ // Serialize embedding to bytes
339
+ let embedding_bytes: Vec<u8> = embedding
340
+ .iter()
341
+ .flat_map(|&v| v.to_le_bytes().to_vec())
342
+ .collect();
343
+
344
+ self.conn.execute(
345
+ "INSERT OR REPLACE INTO entity_embeddings (entity_id, embedding, embedding_model) VALUES (?1, ?2, ?3)",
346
+ params![entity_id, embedding_bytes, model]
347
+ )?;
348
+
349
+ Ok(())
350
+ }
351
+
352
+ pub fn get_embedding(&self, entity_id: i64) -> Result<Option<Vec<f32>>> {
353
+ debug!("Getting embedding for entity: {}", entity_id);
354
+
355
+ let mut stmt = self.conn.prepare(
356
+ "SELECT embedding FROM entity_embeddings WHERE entity_id = ?"
357
+ )?;
358
+
359
+ let embedding = stmt.query_row([entity_id], |row| {
360
+ let embedding_bytes: Vec<u8> = row.get(0)?;
361
+ let mut embedding: Vec<f32> = Vec::with_capacity(embedding_bytes.len() / 4);
362
+
363
+ for chunk in embedding_bytes.chunks_exact(4) {
364
+ let bytes: [u8; 4] = chunk.try_into().unwrap();
365
+ embedding.push(f32::from_le_bytes(bytes));
366
+ }
367
+
368
+ Ok(embedding)
369
+ }).optional()?;
370
+
371
+ Ok(embedding)
372
+ }
373
+
374
+ // Performance optimization methods
375
+ pub fn get_entity_batch(&self, ids: &[i64]) -> Result<Vec<Entity>> {
376
+ debug!("Getting batch of {} entities", ids.len());
377
+
378
+ if ids.is_empty() {
379
+ return Ok(Vec::new());
380
+ }
381
+
382
+ let placeholders = ids.iter().map(|_| "?").collect::<Vec<_>>().join(",");
383
+ let query = format!(
384
+ "SELECT * FROM entities WHERE id IN ({}) ORDER BY id",
385
+ placeholders
386
+ );
387
+
388
+ let params: Vec<&dyn rusqlite::ToSql> = ids
389
+ .iter()
390
+ .map(|id| id as &dyn rusqlite::ToSql)
391
+ .collect();
392
+
393
+ let mut stmt = self.conn.prepare(&query)?;
394
+ let entities = stmt.query_map(&params[..], |row| {
395
+ self.row_to_entity(row)
396
+ })?
397
+ .collect::<Result<Vec<_>, _>>()
398
+ .map_err(|e| anyhow::anyhow!("Failed to collect entities: {}", e))?;
399
+
400
+ Ok(entities)
401
+ }
402
+
403
+ // Statistics
404
+ pub fn get_stats(&self) -> Result<StoreStats> {
405
+ debug!("Getting store statistics");
406
+
407
+ let entities_count: i64 = self.conn.query_row(
408
+ "SELECT COUNT(*) FROM entities",
409
+ [],
410
+ |row| row.get(0)
411
+ )?;
412
+
413
+ let refs_count: i64 = self.conn.query_row(
414
+ "SELECT COUNT(*) FROM refs",
415
+ [],
416
+ |row| row.get(0)
417
+ )?;
418
+
419
+ let type_usage_count: i64 = self.conn.query_row(
420
+ "SELECT COUNT(*) FROM type_usage",
421
+ [],
422
+ |row| row.get(0)
423
+ )?;
424
+
425
+ let modules_count: i64 = self.conn.query_row(
426
+ "SELECT COUNT(*) FROM modules",
427
+ [],
428
+ |row| row.get(0)
429
+ )?;
430
+
431
+ let embeddings_count: i64 = self.conn.query_row(
432
+ "SELECT COUNT(*) FROM entity_embeddings",
433
+ [],
434
+ |row| row.get(0)
435
+ )?;
436
+
437
+ let files_count: i64 = self.conn.query_row(
438
+ "SELECT COUNT(DISTINCT file_path) FROM entities",
439
+ [],
440
+ |row| row.get(0)
441
+ )?;
442
+
443
+ let db_size = std::fs::metadata("index.db")
444
+ .map(|m| m.len())
445
+ .unwrap_or(0);
446
+
447
+ Ok(StoreStats {
448
+ entities_count: entities_count as usize,
449
+ refs_count: refs_count as usize,
450
+ type_usage_count: type_usage_count as usize,
451
+ modules_count: modules_count as usize,
452
+ embeddings_count: embeddings_count as usize,
453
+ files_count: files_count as usize,
454
+ database_size_bytes: db_size,
455
+ })
456
+ }
457
+
458
+ // Helper methods to convert rows to structs
459
+ pub(crate) fn row_to_entity(&self, row: &Row) -> rusqlite::Result<Entity> {
460
+ let created_timestamp: i64 = row.get(14)?;
461
+ let updated_timestamp: i64 = row.get(15)?;
462
+
463
+ let kind_str = row.get::<_, String>(1)?;
464
+ let kind = EntityKind::from_str(&kind_str)
465
+ .ok_or_else(|| rusqlite::Error::InvalidParameterName(format!("Invalid entity kind: {}", kind_str)))?;
466
+
467
+ let visibility_str = row.get::<_, String>(4)?;
468
+ let visibility = Visibility::from_str(&visibility_str)
469
+ .ok_or_else(|| rusqlite::Error::InvalidParameterName(format!("Invalid visibility: {}", visibility_str)))?;
470
+
471
+ Ok(Entity {
472
+ id: row.get(0)?,
473
+ kind,
474
+ name: row.get(2)?,
475
+ signature: row.get(3)?,
476
+ visibility,
477
+ parent_id: row.get(5)?,
478
+ file_path: row.get(6)?,
479
+ line_number: row.get(7)?,
480
+ column_number: row.get(8)?,
481
+ doc_comment: row.get(9)?,
482
+ attributes: row.get(10)?,
483
+ metadata: row.get(11)?,
484
+ created_at: DateTime::from_timestamp(created_timestamp, 0).unwrap_or_default(),
485
+ updated_at: DateTime::from_timestamp(updated_timestamp, 0).unwrap_or_default(),
486
+ })
487
+ }
488
+
489
+ fn row_to_reference(&self, row: &Row) -> rusqlite::Result<Reference> {
490
+ let created_timestamp: i64 = row.get(7)?;
491
+
492
+ let ref_kind_str = row.get::<_, String>(3)?;
493
+ let ref_kind = RefKind::from_str(&ref_kind_str)
494
+ .ok_or_else(|| rusqlite::Error::InvalidParameterName(format!("Invalid reference kind: {}", ref_kind_str)))?;
495
+
496
+ Ok(Reference {
497
+ id: row.get(0)?,
498
+ source_entity_id: row.get(1)?,
499
+ target_entity_id: row.get(2)?,
500
+ ref_kind,
501
+ file_path: row.get(4)?,
502
+ line_number: row.get(5)?,
503
+ column_number: row.get(6)?,
504
+ context: row.get(7)?,
505
+ created_at: DateTime::from_timestamp(created_timestamp, 0).unwrap_or_default(),
506
+ })
507
+ }
508
+
509
+ fn row_to_module(&self, row: &Row) -> rusqlite::Result<Module> {
510
+ let created_timestamp: i64 = row.get(5)?;
511
+
512
+ Ok(Module {
513
+ id: row.get(0)?,
514
+ name: row.get(1)?,
515
+ file_path: row.get(2)?,
516
+ module_type: row.get(3)?,
517
+ is_root: row.get(4)?,
518
+ parent_module_id: row.get(5)?,
519
+ created_at: DateTime::from_timestamp(created_timestamp, 0).unwrap_or_default(),
520
+ })
521
+ }
522
+ }
523
+
524
+ #[derive(Debug)]
525
+ pub struct StoreStats {
526
+ pub entities_count: usize,
527
+ pub refs_count: usize,
528
+ pub type_usage_count: usize,
529
+ pub modules_count: usize,
530
+ pub embeddings_count: usize,
531
+ pub files_count: usize,
532
+ pub database_size_bytes: u64,
533
+ }
534
+
535
+ #[cfg(test)]
536
+ mod tests {
537
+ use super::*;
538
+ use tempfile::tempdir;
539
+ use crate::schema_v2::SchemaV2;
540
+
541
+ #[test]
542
+ fn test_entity_crud() -> Result<()> {
543
+ let dir = tempdir()?;
544
+ let db_path = dir.path().join("test_entities.db");
545
+ let conn = Connection::open(&db_path)?;
546
+
547
+ // Initialize schema
548
+ SchemaV2::initialize(&conn)?;
549
+
550
+ let store = StoreV2::new(&db_path)?;
551
+
552
+ // Insert entity
553
+ let entity = Entity {
554
+ id: 0,
555
+ kind: EntityKind::Function,
556
+ name: "test_function".to_string(),
557
+ signature: Some("fn test_function() -> Result<()>".to_string()),
558
+ visibility: Visibility::Public,
559
+ parent_id: None,
560
+ file_path: "/test.rs".to_string(),
561
+ line_number: 10,
562
+ column_number: Some(0),
563
+ doc_comment: Some("Test function".to_string()),
564
+ attributes: None,
565
+ metadata: None,
566
+ created_at: Utc::now(),
567
+ updated_at: Utc::now(),
568
+ };
569
+
570
+ let entity_id = store.insert_entity(&entity)?;
571
+ assert!(entity_id > 0);
572
+
573
+ // Retrieve entity
574
+ let retrieved = store.get_entity(entity_id)?;
575
+ assert!(retrieved.is_some());
576
+
577
+ let retrieved = retrieved.unwrap();
578
+ assert_eq!(retrieved.name, "test_function");
579
+ assert_eq!(retrieved.kind, EntityKind::Function);
580
+
581
+ Ok(())
582
+ }
583
+ }