claude-flow-novice 2.18.12 → 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 (332) 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/agents/custom/claude-code-expert.md +56 -0
  134. package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/SKILL.md +1 -1
  135. package/.claude/hooks/README.md +148 -0
  136. package/.claude/hooks/SessionStart:cfn-load-openai-key.sh +35 -0
  137. package/.claude/hooks/cfn-invoke-pre-edit.sh +1 -1
  138. package/.claude/hooks/cfn-load-cerebras-env.sh +65 -0
  139. package/.claude/hooks/cfn-precompact-enhanced.sh +283 -0
  140. package/.claude/hooks/deprecated/README.md +27 -0
  141. package/.claude/settings.json +71 -6
  142. package/.claude/skills/cfn-agent-lifecycle/SKILL.md +1 -1
  143. package/.claude/skills/cfn-agent-tooling/SKILL.md +1 -1
  144. package/.claude/skills/cfn-cerebras-coordinator/QUICKSTART.md +348 -0
  145. package/.claude/skills/cfn-cerebras-coordinator/README.md +525 -0
  146. package/.claude/skills/cfn-cerebras-coordinator/TDD_COORDINATOR_OVERVIEW.md +284 -0
  147. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v2-test-1733854200.json +36 -0
  148. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v3-test-1765383241.json +36 -0
  149. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v2-test-1765381361.json +36 -0
  150. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v3-test-1765383242.json +46 -0
  151. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v2-test-1733864400.json +66 -0
  152. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v3-test-1765383238.json +66 -0
  153. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v4-test-1765386506.json +66 -0
  154. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v5-test-1765393100.json +66 -0
  155. package/.claude/skills/cfn-cerebras-coordinator/example-usage.sh +206 -0
  156. package/.claude/skills/cfn-cerebras-coordinator/lib/tdd-conversation-coordinator.ts +569 -0
  157. package/.claude/skills/cfn-cerebras-coordinator/test-tdd-coordinator.sh +250 -0
  158. package/.claude/skills/cfn-compilation-error-fixer/SKILL.md +1 -1
  159. package/.claude/skills/cfn-compilation-error-fixer/lib/fixer/cerebras-gated-fixer-v2.ts +1 -1
  160. package/.claude/skills/cfn-config/SKILL.md +1 -1
  161. package/.claude/skills/cfn-dependency-management/SKILL.md +1 -1
  162. package/.claude/skills/cfn-deployment-lifecycle/SKILL.md +1 -1
  163. package/.claude/skills/cfn-edit-safety/SKILL.md +1 -1
  164. package/.claude/skills/cfn-epic-creator/SKILL.md +392 -0
  165. package/.claude/skills/cfn-epic-creator/estimate-costs.sh +524 -0
  166. package/.claude/skills/cfn-epic-creator/invoke.sh +445 -0
  167. package/.claude/skills/cfn-epic-creator/parse-personas.sh +533 -0
  168. package/.claude/skills/cfn-epic-creator/security-utils.sh +268 -0
  169. package/.claude/skills/cfn-epic-creator/security-verification-demo.sh +127 -0
  170. package/.claude/skills/cfn-epic-creator/test-invoke.sh +620 -0
  171. package/.claude/skills/cfn-epic-creator/test-security-fixes.sh +195 -0
  172. package/.claude/skills/cfn-epic-creator/test-security-simple.sh +165 -0
  173. package/.claude/skills/cfn-epic-creator/validate-epic.sh +474 -0
  174. package/.claude/skills/cfn-epic-parser/SKILL.md +8 -0
  175. package/.claude/skills/cfn-error-management/SKILL.md +1 -1
  176. package/.claude/skills/cfn-intervention-system/SKILL.md +1 -1
  177. package/.claude/skills/cfn-knowledge-base/SKILL.md +1 -1
  178. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/metadata.json +8 -0
  179. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/original +209 -0
  180. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/revert.sh +7 -0
  181. package/.claude/skills/cfn-local-ruvector-accelerator/AGENT_INTEGRATION_PATTERNS.md +255 -0
  182. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml +8 -1
  183. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml.backup +47 -0
  184. package/.claude/skills/cfn-local-ruvector-accelerator/EXTRACTION_EXAMPLES.md +287 -0
  185. package/.claude/skills/cfn-local-ruvector-accelerator/README.md +2 -563
  186. package/.claude/skills/cfn-local-ruvector-accelerator/SCHEMA_V2_IMPLEMENTATION.md +151 -0
  187. package/.claude/skills/cfn-local-ruvector-accelerator/SECURITY_IMPLEMENTATION.md +185 -0
  188. package/.claude/skills/cfn-local-ruvector-accelerator/SKILL.md +8 -343
  189. package/.claude/skills/cfn-local-ruvector-accelerator/docs/EXECUTIVE_SUMMARY.txt +90 -0
  190. package/.claude/skills/cfn-local-ruvector-accelerator/docs/PHASE_4_QUERY_API.md +210 -0
  191. package/.claude/skills/cfn-local-ruvector-accelerator/docs/RUST_AST_EXTRACTOR_IMPLEMENTATION.md +222 -0
  192. package/.claude/skills/cfn-local-ruvector-accelerator/docs/TRANSACTION_MANAGEMENT.md +241 -0
  193. package/.claude/skills/cfn-local-ruvector-accelerator/docs/VALIDATION_FINDINGS.txt +250 -0
  194. package/.claude/skills/cfn-local-ruvector-accelerator/epic-ast-indexer.json +335 -0
  195. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh +292 -96
  196. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh.backup +249 -0
  197. package/.claude/skills/cfn-local-ruvector-accelerator/index_all.sh +65 -0
  198. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/find.rs +214 -0
  199. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index.rs +275 -94
  200. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_ast.rs +767 -0
  201. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_modified.rs +37 -0
  202. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/init.rs +17 -12
  203. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/migration.rs +34 -1
  204. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/mod.rs +6 -0
  205. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/query.rs +2 -2
  206. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/refs.rs +209 -0
  207. package/.claude/skills/cfn-local-ruvector-accelerator/src/embeddings.rs +82 -33
  208. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/mod.rs +251 -0
  209. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust.rs +425 -0
  210. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust_placeholder.rs +420 -0
  211. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/text_fallback.rs +490 -0
  212. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript.rs +520 -0
  213. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript_full.rs +531 -0
  214. package/.claude/skills/cfn-local-ruvector-accelerator/src/lib.rs +20 -0
  215. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs +33 -2
  216. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs.backup +360 -0
  217. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration.rs +325 -318
  218. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_backup.rs +325 -0
  219. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_tx.rs +513 -0
  220. package/.claude/skills/cfn-local-ruvector-accelerator/src/paths.rs +29 -0
  221. package/.claude/skills/cfn-local-ruvector-accelerator/src/query_api.rs +609 -0
  222. package/.claude/skills/cfn-local-ruvector-accelerator/src/schema_v2.rs +603 -0
  223. package/.claude/skills/cfn-local-ruvector-accelerator/src/search_engine.rs +150 -29
  224. package/.claude/skills/cfn-local-ruvector-accelerator/src/security_tests.rs +154 -0
  225. package/.claude/skills/cfn-local-ruvector-accelerator/src/sqlite_store.rs +1 -1
  226. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2.rs +583 -0
  227. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_backup.rs +560 -0
  228. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_fixed.rs +0 -0
  229. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_tx.rs +397 -0
  230. package/.claude/skills/cfn-local-ruvector-accelerator/src/test_schema.rs +228 -0
  231. package/.claude/skills/cfn-local-ruvector-accelerator/src/transaction_tests.rs +410 -0
  232. package/.claude/skills/cfn-local-ruvector-accelerator/test_ast_indexing.rs +59 -0
  233. package/.claude/skills/cfn-local-ruvector-accelerator/test_query_api.sh +103 -0
  234. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema.sql +158 -0
  235. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema_v2.sql +147 -0
  236. package/.claude/skills/cfn-loop-orchestration-v2/SKILL.md +1 -1
  237. package/.claude/skills/cfn-loop-orchestration-v2/lib/decision/SKILL.md +8 -0
  238. package/.claude/skills/cfn-loop-orchestration-v2/lib/orchestrator/SKILL.md +1 -1
  239. package/.claude/skills/cfn-loop-orchestration-v2/lib/output/SKILL.md +8 -0
  240. package/.claude/skills/cfn-loop-orchestration-v2/lib/validation/SKILL.md +11 -2
  241. package/.claude/skills/cfn-mdap-context-injection/SKILL.md +31 -10
  242. package/.claude/skills/cfn-mdap-error-fixer/skill.md +15 -205
  243. package/.claude/skills/cfn-memory-persistence/lib/auto/SKILL.md +7 -0
  244. package/.claude/skills/cfn-memory-persistence/lib/management/SKILL.md +7 -0
  245. package/.claude/skills/cfn-parameterized-queries/SKILL.md +8 -0
  246. package/.claude/skills/cfn-planning/SKILL.md +1 -1
  247. package/.claude/skills/cfn-session-handoff/SKILL.md +1 -53
  248. package/.claude/skills/cfn-skill-management/SKILL.md +1 -1
  249. package/.claude/skills/cfn-task-decomposition/SKILL.md +1 -0
  250. package/.claude/skills/cfn-task-intelligence/SKILL.md +39 -18
  251. package/.claude/skills/cfn-task-planning/SKILL.md +37 -12
  252. package/.claude/skills/cfn-transparency-middleware/SKILL.md +1 -1
  253. package/.claude/skills/cfn-utilities/SKILL.md +1 -1
  254. package/.claude/skills/cfn-validation-framework/SKILL.md +3 -60
  255. package/.claude/skills/cfn-vision-analysis/SKILL.md +3 -20
  256. package/.claude-flow/metrics/performance.json +3 -3
  257. package/.claude-flow/metrics/task-metrics.json +3 -3
  258. package/.ruvector/index_v2.db-shm +0 -0
  259. package/.ruvector/index_v2.db-wal +0 -0
  260. package/CLAUDE.md +9 -1
  261. package/README.md +56 -0
  262. package/docs/AGENT_PRODUCTION_FEEDBACK_PATTERNS.md +389 -0
  263. package/docs/CEREBRAS_TDD_COORDINATOR_TEST_RESULTS.md +213 -0
  264. package/docs/CEREBRAS_TDD_ROUND1_VS_ROUND2_COMPARISON.md +225 -0
  265. package/docs/CEREBRAS_TDD_ROUND3_FINAL_RESULTS.md +264 -0
  266. package/docs/EPIC_CREATOR_V2_ARCHITECTURE.md +629 -0
  267. package/docs/HOOKS_IMPLEMENTATION_PRIORITY.md +585 -0
  268. package/docs/SKILLS_HOOKS_INTEGRATION.md +1074 -0
  269. package/epic-with-personas-2025-12-09-17-15-13.json +253 -0
  270. package/index/index.bin +0 -0
  271. package/index/metadata.json +1 -0
  272. package/package.json +2 -1
  273. package/test-epic-creator-security.sh +203 -0
  274. package/.claude/skills/cfn-compilation-error-fixer/HANDOFF.md +0 -29
  275. package/.claude/skills/cfn-local-ruvector-accelerator/__pycache__/search_engine_v2.cpython-312.pyc +0 -0
  276. package/.claude/skills/cfn-local-ruvector-accelerator/search_engine.py +0 -200
  277. package/.ruvector/index.db-journal +0 -0
  278. package/jest.config.ts.cjs +0 -17
  279. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/SKILL.md +0 -0
  280. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/context-analyzer.sh +0 -0
  281. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/generate-code.sh +0 -0
  282. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/execute.sh +0 -0
  283. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/INTEGRATION.md +0 -0
  284. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SAMPLE_OUTPUTS.md +0 -0
  285. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SKILL.md +0 -0
  286. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/capture-container-logs.sh +0 -0
  287. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/enable-logging.sh +0 -0
  288. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/init-hybrid-logging.sh +0 -0
  289. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/analytics-summary.sh +0 -0
  290. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-agent-timeline.sh +0 -0
  291. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-consensus-history.sh +0 -0
  292. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-coordination-timeline.sh +0 -0
  293. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-failed-containers.sh +0 -0
  294. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-gate-checks.sh +0 -0
  295. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/schema.sql +0 -0
  296. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/sqlite-helpers.sh +0 -0
  297. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/test-hybrid-logging.sh +0 -0
  298. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/SKILL.md +0 -0
  299. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/skill-mcp-selector.js +0 -0
  300. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/SKILL.md +0 -0
  301. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/orchestrate.sh +0 -0
  302. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/SKILL.md +0 -0
  303. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/spawn-agent.sh +0 -0
  304. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/SKILL.md +0 -0
  305. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/cleanup-wave.sh +0 -0
  306. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/lib/docker-helpers.sh +0 -0
  307. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/monitor-wave.sh +0 -0
  308. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/spawn-wave.sh +0 -0
  309. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/SKILL.md +0 -0
  310. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/task-mode-heap-limiter.sh +0 -0
  311. /package/.claude/{skills → cfn-extras/skills/deprecated}/deprecated/analyze-patterns.sh +0 -0
  312. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/README.md +0 -0
  313. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SECURITY.md +0 -0
  314. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SKILL.md +0 -0
  315. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/package.json +0 -0
  316. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/solve.sh +0 -0
  317. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver-minimal.sh +0 -0
  318. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver.sh +0 -0
  319. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test.cjs +0 -0
  320. /package/.claude/hooks/{cfn-credential-scanner.sh → deprecated/cfn-credential-scanner.sh} +0 -0
  321. /package/.claude/hooks/{cfn-detect-hardcoded-credentials.sh → deprecated/cfn-detect-hardcoded-credentials.sh} +0 -0
  322. /package/.claude/hooks/{cfn-invoke-post-edit-ts.sh → deprecated/cfn-invoke-post-edit-ts.sh} +0 -0
  323. /package/.claude/hooks/{cfn-invoke-pre-edit-ts.sh → deprecated/cfn-invoke-pre-edit-ts.sh} +0 -0
  324. /package/.claude/hooks/{cfn-invoke-security-validation.sh → deprecated/cfn-invoke-security-validation.sh} +0 -0
  325. /package/.claude/hooks/{cfn-lint-sql-injection.sh → deprecated/cfn-lint-sql-injection.sh} +0 -0
  326. /package/.claude/hooks/{cfn-post-edit.sh → deprecated/cfn-post-edit.sh} +0 -0
  327. /package/.claude/hooks/{cfn-pre-edit-backup.sh → deprecated/cfn-pre-edit-backup.sh} +0 -0
  328. /package/.claude/skills/cfn-local-ruvector-accelerator/{embeddings_manager.py → embeddings_manager.py.backup} +0 -0
  329. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/index.bin +0 -0
  330. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/metadata.json +0 -0
  331. /package/.claude/skills/cfn-local-ruvector-accelerator/{search_engine_v2.py → search_engine_v2.py.backup} +0 -0
  332. /package/.claude/skills/cfn-local-ruvector-accelerator/{sqlite_store.py → sqlite_store.py.backup} +0 -0
@@ -1,14 +1,157 @@
1
+ use anyhow::{Result, Context, anyhow};
2
+ use ndarray::{Array1, Array2};
3
+ use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
4
+ use std::path::{Path, PathBuf};
5
+ use std::fs::{File, OpenOptions};
6
+ use std::io::{Read, Write, BufReader, BufWriter};
7
+ use std::collections::HashMap;
8
+ use serde::{Serialize, Deserialize};
9
+ use tracing::info;
10
+ use memmap2::MmapOptions;
11
+ use crate::embeddings::EmbeddingsManager;
12
+ use crate::sqlite_store::SqliteStore;
13
+
14
+ #[derive(Debug, Clone, Serialize, Deserialize)]
15
+ pub struct SearchConfig {
16
+ pub dimension: usize,
17
+ pub batch_size: usize,
18
+ pub max_results: usize,
19
+ pub index_path: PathBuf,
20
+ pub use_mmap: bool,
21
+ }
22
+
23
+ impl Default for SearchConfig {
24
+ fn default() -> Self {
25
+ Self {
26
+ dimension: 1536,
27
+ batch_size: 100,
28
+ max_results: 10,
29
+ index_path: PathBuf::from("index"),
30
+ use_mmap: true,
31
+ }
32
+ }
33
+ }
34
+
35
+ #[derive(Debug, Clone)]
36
+ pub struct VectorIndex {
37
+ pub vectors: Array2<f32>,
38
+ pub ids: Vec<String>,
39
+ pub metadata: HashMap<String, IndexMetadata>,
40
+ }
41
+
42
+ impl VectorIndex {
43
+ pub fn new(dimension: usize) -> Self {
44
+ Self {
45
+ vectors: Array2::zeros((0, dimension)),
46
+ ids: Vec::new(),
47
+ metadata: HashMap::new(),
48
+ }
49
+ }
50
+
51
+ pub fn add_vector(&mut self, id: String, vector: Array1<f32>, metadata: IndexMetadata) -> Result<()> {
52
+ if vector.len() != self.vectors.ncols() {
53
+ return Err(anyhow!("Vector dimension mismatch"));
54
+ }
55
+
56
+ let new_row = self.vectors.nrows();
57
+ self.vectors.push_row(vector.view())?;
58
+ self.ids.push(id.clone());
59
+ self.metadata.insert(id, metadata);
60
+
61
+ Ok(())
62
+ }
63
+
64
+ pub fn add_vectors(&mut self, vectors: Vec<Array1<f32>>, ids: Vec<String>, metadata: HashMap<String, IndexMetadata>) -> Result<()> {
65
+ if vectors.len() != ids.len() {
66
+ return Err(anyhow!("Vectors and IDs length mismatch"));
67
+ }
68
+
69
+ for (vector, id) in vectors.into_iter().zip(ids.into_iter()) {
70
+ let meta = metadata.get(&id).cloned().unwrap_or_else(|| IndexMetadata::default());
71
+ self.add_vector(id, vector, meta)?;
72
+ }
73
+
74
+ Ok(())
75
+ }
76
+ }
77
+
78
+ #[derive(Debug, Clone, Serialize, Deserialize, Default)]
79
+ pub struct IndexMetadata {
80
+ pub path: String,
81
+ pub pattern: String,
82
+ pub context: Option<String>,
83
+ pub line_number: Option<usize>,
84
+ pub snippet: Option<String>,
85
+ pub file_hash: String,
86
+ pub indexed_at: u64,
87
+ }
88
+
89
+ #[derive(Debug, Clone)]
90
+ pub struct SearchResult {
91
+ pub id: String,
92
+ pub path: String,
93
+ pub pattern: String,
94
+ pub score: f32,
95
+ pub context: Option<String>,
96
+ pub line_number: Option<usize>,
97
+ pub snippet: Option<String>,
98
+ }
99
+
100
+ #[derive(Debug, Clone)]
101
+ pub struct IndexStats {
102
+ pub num_vectors: usize,
103
+ pub dimension: usize,
104
+ pub index_size_bytes: u64,
105
+ pub metadata_count: usize,
106
+ }
107
+
108
+ pub struct SearchEngine {
109
+ pub index: VectorIndex,
110
+ pub config: SearchConfig,
111
+ pub embedding_manager: EmbeddingsManager,
112
+ pub store: SqliteStore,
113
+ }
114
+
115
+ impl std::fmt::Debug for SearchEngine {
116
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
117
+ f.debug_struct("SearchEngine")
118
+ .field("index", &self.index)
119
+ .field("config", &self.config)
120
+ .finish_non_exhaustive()
121
+ }
122
+ }
123
+
124
+ impl SearchEngine {
125
+ /// Create a copy of the search engine by recreating connections
126
+ pub fn duplicate(&self) -> Result<Self> {
127
+ let index_path = &self.config.index_path;
128
+ let embedding_manager = EmbeddingsManager::new(index_path)?;
129
+ let store = SqliteStore::new(&index_path.join("index.db"))?;
130
+
131
+ Ok(Self {
132
+ index: self.index.clone(),
133
+ config: self.config.clone(),
134
+ embedding_manager,
135
+ store,
136
+ })
137
+ }
138
+ }
139
+
1
140
  impl SearchEngine {
2
141
  pub fn new(project_dir: &Path) -> Result<Self> {
3
- let config = SearchConfig::default();
142
+ let mut config = SearchConfig::default();
4
143
  let index_path = project_dir.join(&config.index_path);
144
+ // Update config with absolute path for consistent usage
145
+ config.index_path = index_path.clone();
5
146
 
6
147
  let embedding_manager = EmbeddingsManager::new(&index_path)?;
148
+ let store = SqliteStore::new(&index_path.join("index.db"))?;
7
149
 
8
150
  Ok(Self {
9
151
  index: VectorIndex::new(config.dimension),
10
152
  config,
11
153
  embedding_manager,
154
+ store,
12
155
  })
13
156
  }
14
157
 
@@ -36,14 +179,12 @@ impl SearchEngine {
36
179
  pub fn search(&self, query: &str, max_results: Option<usize>) -> Result<Vec<SearchResult>> {
37
180
  let max_results = max_results.unwrap_or(self.config.max_results);
38
181
 
39
- // Search patterns using SQLite store
40
- let pattern_results = self.embedding_manager.store.search_patterns(query, max_results)?;
182
+ let pattern_results = self.store.search_patterns(query, max_results)?;
41
183
 
42
184
  let mut results = Vec::new();
43
185
 
44
186
  for (pattern, score) in pattern_results {
45
- // Get full metadata for each pattern
46
- if let Some((_, metadata)) = self.embedding_manager.store.get_embedding(&pattern)? {
187
+ if let Some((_, metadata)) = self.store.get_embedding(&pattern)? {
47
188
  results.push(SearchResult {
48
189
  id: pattern.clone(),
49
190
  path: metadata.path.clone(),
@@ -56,7 +197,6 @@ impl SearchEngine {
56
197
  }
57
198
  }
58
199
 
59
- // Sort and limit results
60
200
  results.sort_by(|a, b| b.score.partial_cmp(&a.score).unwrap());
61
201
  results.truncate(max_results);
62
202
 
@@ -94,10 +234,8 @@ impl SearchEngine {
94
234
  let index_file = self.config.index_path.join("index.bin");
95
235
  let metadata_file = self.config.index_path.join("metadata.json");
96
236
 
97
- // Save vectors and IDs
98
237
  self.save_vectors(&index_file)?;
99
238
 
100
- // Save metadata
101
239
  let metadata_json = serde_json::to_string_pretty(&self.index.metadata)?;
102
240
  std::fs::write(&metadata_file, metadata_json)?;
103
241
 
@@ -114,22 +252,18 @@ impl SearchEngine {
114
252
 
115
253
  let mut writer = BufWriter::new(file);
116
254
 
117
- // Write magic number and version
118
- writer.write_u32::<LittleEndian>(0x52554345)?; // "RUCE"
119
- writer.write_u32::<LittleEndian>(1)?; // Version
255
+ writer.write_u32::<LittleEndian>(0x52554345)?;
256
+ writer.write_u32::<LittleEndian>(1)?;
120
257
 
121
- // Write dimensions and count
122
258
  writer.write_u32::<LittleEndian>(self.config.dimension as u32)?;
123
259
  writer.write_u32::<LittleEndian>(self.index.vectors.nrows() as u32)?;
124
260
 
125
- // Write vectors
126
261
  for vector in self.index.vectors.rows() {
127
262
  for &value in vector.iter() {
128
263
  writer.write_f32::<LittleEndian>(value)?;
129
264
  }
130
265
  }
131
266
 
132
- // Write IDs (length-prefixed strings)
133
267
  for id in &self.index.ids {
134
268
  writer.write_u32::<LittleEndian>(id.len() as u32)?;
135
269
  writer.write_all(id.as_bytes())?;
@@ -143,10 +277,8 @@ impl SearchEngine {
143
277
  let index_file = self.config.index_path.join("index.bin");
144
278
  let metadata_file = self.config.index_path.join("metadata.json");
145
279
 
146
- // Load vectors and IDs
147
280
  self.load_vectors(&index_file)?;
148
281
 
149
- // Load metadata
150
282
  let metadata_json = std::fs::read_to_string(&metadata_file)
151
283
  .context("Failed to read metadata file")?;
152
284
  self.index.metadata = serde_json::from_str(&metadata_json)
@@ -159,11 +291,9 @@ impl SearchEngine {
159
291
  let file = File::open(path)?;
160
292
 
161
293
  if self.config.use_mmap {
162
- // Use memory mapping for large files
163
294
  let mmap = unsafe { MmapOptions::new().map(&file)? };
164
295
  self.load_vectors_from_slice(&mmap)?;
165
296
  } else {
166
- // Read normally for smaller files
167
297
  let mut reader = BufReader::new(file);
168
298
  self.load_vectors_from_reader(&mut reader)?;
169
299
  }
@@ -179,19 +309,16 @@ impl SearchEngine {
179
309
  }
180
310
 
181
311
  fn load_vectors_from_reader<R: Read>(&mut self, reader: &mut R) -> Result<()> {
182
- // Read and verify magic number
183
312
  let magic = reader.read_u32::<LittleEndian>()?;
184
313
  if magic != 0x52554345 {
185
314
  return Err(anyhow!("Invalid file format"));
186
315
  }
187
316
 
188
- // Read version
189
317
  let version = reader.read_u32::<LittleEndian>()?;
190
318
  if version != 1 {
191
319
  return Err(anyhow!("Unsupported version: {}", version));
192
320
  }
193
321
 
194
- // Read dimensions and count
195
322
  let dimension = reader.read_u32::<LittleEndian>()? as usize;
196
323
  let count = reader.read_u32::<LittleEndian>()? as usize;
197
324
 
@@ -203,7 +330,6 @@ impl SearchEngine {
203
330
  ));
204
331
  }
205
332
 
206
- // Read vectors
207
333
  let mut vectors = Vec::with_capacity(count * dimension);
208
334
  for _ in 0..count * dimension {
209
335
  vectors.push(reader.read_f32::<LittleEndian>()?);
@@ -211,7 +337,6 @@ impl SearchEngine {
211
337
 
212
338
  let vectors_array = Array2::from_shape_vec((count, dimension), vectors)?;
213
339
 
214
- // Read IDs
215
340
  let mut ids = Vec::with_capacity(count);
216
341
  for _ in 0..count {
217
342
  let len = reader.read_u32::<LittleEndian>()? as usize;
@@ -236,7 +361,7 @@ impl SearchEngine {
236
361
  }
237
362
 
238
363
  fn estimate_index_size(&self) -> u64 {
239
- let vectors_size = self.index.vectors.nrows() * self.index.vectors.ncols() * 4; // f32 = 4 bytes
364
+ let vectors_size = self.index.vectors.nrows() * self.index.vectors.ncols() * 4;
240
365
  let ids_size: usize = self.index.ids.iter().map(|id| id.len()).sum();
241
366
  (vectors_size + ids_size) as u64
242
367
  }
@@ -244,7 +369,6 @@ impl SearchEngine {
244
369
  pub fn optimize_index(&mut self) -> Result<()> {
245
370
  info!("Optimizing index...");
246
371
 
247
- // Normalize all vectors
248
372
  for mut vector in self.index.vectors.rows_mut() {
249
373
  let norm = vector.iter().map(|x| x * x).sum::<f32>().sqrt();
250
374
  if norm > 0.0 {
@@ -254,15 +378,13 @@ impl SearchEngine {
254
378
  }
255
379
  }
256
380
 
257
- // Optional: Rebuild metadata index for faster lookups
258
- self.rebuild_metadata_indexlettes()?;
381
+ self.rebuild_metadata_index()?;
259
382
 
260
383
  info!("Index optimized successfully");
261
384
  Ok(())
262
385
  }
263
386
 
264
387
  fn rebuild_metadata_index(&mut self) -> Result<()> {
265
- // Create path-based index for faster filtering
266
388
  let mut path_index: HashMap<String, Vec<String>> = HashMap::new();
267
389
 
268
390
  for (id, metadata) in &self.index.metadata {
@@ -271,7 +393,6 @@ impl SearchEngine {
271
393
  .push(id.clone());
272
394
  }
273
395
 
274
- // Store path index as metadata
275
396
  let path_index_json = serde_json::to_string(&path_index)?;
276
397
  let path_index_file = self.config.index_path.join("path_index.json");
277
398
  std::fs::write(path_index_file, path_index_json)?;
@@ -0,0 +1,154 @@
1
+ #[cfg(test)]
2
+ mod security_tests {
3
+ use super::*;
4
+ use crate::store_v2::StoreV2;
5
+ use tempfile::TempDir;
6
+ use std::path::Path;
7
+
8
+ #[test]
9
+ fn test_sql_injection_prevention_in_query_api() {
10
+ let temp_dir = TempDir::new().unwrap();
11
+ let db_path = temp_dir.path().join("test.db");
12
+ let store = StoreV2::new(&db_path).unwrap();
13
+ let query_api = super::QueryApi::new(store);
14
+
15
+ // Test 1: SQL injection attempt in function name
16
+ let malicious_input = "test'; DROP TABLE entities; --";
17
+ let result = query_api.find_callers_of_function(malicious_input, None);
18
+ assert!(result.is_ok());
19
+
20
+ // Should return empty results, not execute the DROP TABLE
21
+ let query_result = result.unwrap();
22
+ assert_eq!(query_result.total_count, 0);
23
+
24
+ // Test 2: SQL injection in type name
25
+ let result = query_api.find_functions_using_type("'; DELETE FROM entities; --");
26
+ assert!(result.is_ok());
27
+ let query_result = result.unwrap();
28
+ assert_eq!(query_result.total_count, 0);
29
+
30
+ // Test 3: SQL injection in module path
31
+ let result = query_api.find_public_api("'; DROP TABLE refs; --");
32
+ assert!(result.is_ok());
33
+ let query_result = result.unwrap();
34
+ assert_eq!(query_result.total_count, 0);
35
+
36
+ // Test 4: SQL injection in pattern search
37
+ let result = query_api.find_functions_by_pattern("'; INSERT INTO entities");
38
+ assert!(result.is_ok());
39
+ let query_result = result.unwrap();
40
+ assert_eq!(query_result.total_count, 0);
41
+
42
+ // Test 5: Empty inputs should be handled safely
43
+ let result = query_api.find_callers_of_function("", None);
44
+ assert!(result.is_ok());
45
+ let query_result = result.unwrap();
46
+ assert_eq!(query_result.total_count, 0);
47
+ }
48
+
49
+ #[test]
50
+ fn test_sql_injection_prevention_in_store_v2() {
51
+ let temp_dir = TempDir::new().unwrap();
52
+ let db_path = temp_dir.path().join("test.db");
53
+ let store = StoreV2::new(&db_path).unwrap();
54
+
55
+ // Test 1: Malicious ID values (should be safely handled)
56
+ // This test assumes the validate_ids function is public or we have another way to test it
57
+ // For now, we'll test that negative IDs don't cause issues
58
+
59
+ // Test with potentially malicious IDs
60
+ let malicious_ids = vec![-1, 999999999999999999];
61
+ let result = store.get_entities_by_ids(&malicious_ids);
62
+ assert!(result.is_ok()); // Should not panic or execute SQL injection
63
+ assert!(result.unwrap().is_empty()); // Should return empty
64
+
65
+ // Test 2: SQL injection attempt in search
66
+ let malicious_query = "'; DROP TABLE entities; --";
67
+ let result = store.search_entities(malicious_query, 10);
68
+ assert!(result.is_ok());
69
+ assert!(result.unwrap().is_empty());
70
+ }
71
+
72
+ #[test]
73
+ fn test_input_validation_edge_cases() {
74
+ let temp_dir = TempDir::new().unwrap();
75
+ let db_path = temp_dir.path().join("test.db");
76
+ let store = StoreV2::new(&db_path).unwrap();
77
+ let query_api = super::QueryApi::new(store);
78
+
79
+ // Test various edge cases that could be injection attempts
80
+ let test_cases = vec![
81
+ "'; SELECT * FROM users; --",
82
+ "1' OR '1'='1",
83
+ "'; UPDATE entities SET name='hacked'; --",
84
+ "'; INSERT INTO entities VALUES('hacked'); --",
85
+ "\\' OR \\'1\\'=\\'1",
86
+ "%'; DROP TABLE refs; --",
87
+ "test%"; // Wildcard in pattern
88
+ ];
89
+
90
+ for malicious_input in test_cases {
91
+ // Test in find_callers_of_function
92
+ let result = query_api.find_callers_of_function(malicious_input, None);
93
+ assert!(result.is_ok(), "Should handle input: {}", malicious_input);
94
+
95
+ // Test in find_functions_using_type
96
+ let result = query_api.find_functions_using_type(malicious_input);
97
+ assert!(result.is_ok(), "Should handle input: {}", malicious_input);
98
+
99
+ // Test in find_implementations
100
+ let result = query_api.find_implementations(malicious_input);
101
+ assert!(result.is_ok(), "Should handle input: {}", malicious_input);
102
+
103
+ // Test in pattern search
104
+ let result = query_api.find_functions_by_pattern(malicious_input);
105
+ assert!(result.is_ok(), "Should handle pattern: {}", malicious_input);
106
+ }
107
+ }
108
+
109
+ #[test]
110
+ fn test_like_clause_safety() {
111
+ let temp_dir = TempDir::new().unwrap();
112
+ let db_path = temp_dir.path().join("test.db");
113
+ let store = StoreV2::new(&db_path).unwrap();
114
+ let query_api = super::QueryApi::new(store);
115
+
116
+ // Test that % and _ characters in patterns are properly escaped
117
+ let test_cases = vec![
118
+ "test%pattern", // Contains wildcard
119
+ "test_pattern", // Contains underscore wildcard
120
+ "test\\%escape", // Attempted escape sequence
121
+ "test\\\\%double_escape",
122
+ ];
123
+
124
+ for pattern in test_cases {
125
+ let result = query_api.find_functions_by_pattern(pattern);
126
+ assert!(result.is_ok(), "Should handle pattern with wildcards: {}", pattern);
127
+ }
128
+ }
129
+
130
+ #[test]
131
+ fn test_parameter_binding() {
132
+ // This test ensures that all queries are using parameter binding
133
+ // rather than string interpolation
134
+
135
+ let temp_dir = TempDir::new().unwrap();
136
+ let db_path = temp_dir.path().join("test.db");
137
+ let store = StoreV2::new(&db_path).unwrap();
138
+ let query_api = super::QueryApi::new(store);
139
+
140
+ // Create some test data
141
+ // (This would require more setup code to actually insert entities)
142
+
143
+ // Test that parameters are properly bound and not interpolated
144
+ let test_input = "test_param_123";
145
+ let result = query_api.find_callers_of_function(test_input, Some("test_module"));
146
+ assert!(result.is_ok());
147
+
148
+ // The query should use the parameter value exactly as provided,
149
+ // not interpret it as SQL
150
+ let query_result = result.unwrap();
151
+ // In a real test with data, we would verify the correct results
152
+ // For now, just ensure no SQL injection occurred
153
+ }
154
+ }
@@ -122,7 +122,7 @@ impl SqliteStore {
122
122
  "SELECT pattern FROM embeddings WHERE pattern LIKE ? LIMIT ?"
123
123
  )?;
124
124
 
125
- let mut rows = stmt.query([&format!("%{}%", query)])?;
125
+ let mut rows = stmt.query(params![format!("%{}%", query), limit as i64])?;
126
126
 
127
127
  let mut results = Vec::new();
128
128
  while let Some(row) = rows.next()? {