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
@@ -7,14 +7,24 @@ use regex::Regex;
7
7
  use std::sync::Arc;
8
8
  use std::sync::RwLock;
9
9
  use sha2::{Sha256, Digest};
10
+ use rusqlite::params;
10
11
 
11
12
  use crate::embeddings::EmbeddingsManager;
12
13
  use crate::search_engine::{SearchEngine, IndexMetadata};
13
14
  use crate::sqlite_store::SqliteStore;
15
+ use crate::extractors::{Extractor, ExtractionResult, Entity, Reference};
16
+ use crate::extractors::rust::RustExtractor;
17
+ use crate::extractors::typescript::TypeScriptExtractor;
18
+ use crate::extractors::text_fallback::TextFallbackExtractor;
19
+ use crate::store_v2::{StoreV2, Entity as StoreEntity, Reference as StoreReference, TypeUsage};
20
+ use crate::schema_v2::{EntityKind, RefKind, Visibility};
21
+ use local_ruvector::paths::{get_ruvector_dir, get_database_path, get_v1_index_dir};
14
22
 
15
23
  #[derive(Debug)]
16
24
  pub struct IndexStats {
17
25
  pub files_processed: usize,
26
+ pub entities_extracted: usize,
27
+ pub references_extracted: usize,
18
28
  pub embeddings_generated: usize,
19
29
  pub errors: Vec<String>,
20
30
  }
@@ -23,6 +33,8 @@ impl Default for IndexStats {
23
33
  fn default() -> Self {
24
34
  Self {
25
35
  files_processed: 0,
36
+ entities_extracted: 0,
37
+ references_extracted: 0,
26
38
  embeddings_generated: 0,
27
39
  errors: Vec::new(),
28
40
  }
@@ -31,6 +43,7 @@ impl Default for IndexStats {
31
43
 
32
44
  pub struct IndexCommand {
33
45
  project_dir: PathBuf,
46
+ source_path: PathBuf,
34
47
  index_path: PathBuf,
35
48
  file_types: Vec<String>,
36
49
  patterns: Option<Vec<String>>,
@@ -38,6 +51,10 @@ pub struct IndexCommand {
38
51
  embeddings_manager: EmbeddingsManager,
39
52
  search_engine: SearchEngine,
40
53
  store: SqliteStore,
54
+ store_v2: StoreV2,
55
+ rust_extractor: RustExtractor,
56
+ typescript_extractor: TypeScriptExtractor,
57
+ text_fallback_extractor: TextFallbackExtractor,
41
58
  }
42
59
 
43
60
  impl IndexCommand {
@@ -47,14 +64,22 @@ impl IndexCommand {
47
64
  file_types: Vec<String>,
48
65
  patterns: Option<Vec<String>>,
49
66
  force: bool,
50
- ) -> Self {
51
- let index_path = project_dir.join(".ruvector");
52
- let embeddings_manager = EmbeddingsManager::new(&index_path).unwrap();
53
- let search_engine = SearchEngine::new(project_dir).unwrap();
54
- let store = SqliteStore::new(&index_path.join("index.db")).unwrap();
67
+ ) -> Result<Self> {
68
+ let index_path = get_ruvector_dir()?;
69
+ let embeddings_manager = EmbeddingsManager::new(&index_path)?;
70
+ let search_engine = SearchEngine::new(&index_path)?;
71
+ let store = SqliteStore::new(&index_path.join("index.db"))?;
72
+ let store_v2 = StoreV2::new(&get_database_path()?)?;
73
+
74
+ let source_path = if path.as_os_str().is_empty() || path == Path::new(".") {
75
+ project_dir.to_path_buf()
76
+ } else {
77
+ path.to_path_buf()
78
+ };
55
79
 
56
- Self {
80
+ Ok(Self {
57
81
  project_dir: project_dir.to_path_buf(),
82
+ source_path,
58
83
  index_path,
59
84
  file_types,
60
85
  patterns,
@@ -62,7 +87,11 @@ impl IndexCommand {
62
87
  embeddings_manager,
63
88
  search_engine,
64
89
  store,
65
- }
90
+ store_v2,
91
+ rust_extractor: RustExtractor::new()?,
92
+ typescript_extractor: TypeScriptExtractor::new()?,
93
+ text_fallback_extractor: TextFallbackExtractor::new()?,
94
+ })
66
95
  }
67
96
 
68
97
  pub fn execute(&self) -> Result<IndexStats> {
@@ -72,17 +101,15 @@ impl IndexCommand {
72
101
  info!("Patterns: {:?}", patterns);
73
102
  }
74
103
 
75
- // Initialize components
76
104
  self.initialize()?;
77
105
 
78
- // Walk directory and collect files
79
106
  let files = self.collect_files()?;
80
107
 
81
- // Process files
82
108
  let stats = self.process_files(files)?;
83
109
 
84
- info!("Index complete: {} files, {} embeddings",
85
- stats.files_processed, stats.embeddings_generated);
110
+ info!("Index complete: {} files, {} entities, {} references, {} embeddings",
111
+ stats.files_processed, stats.entities_extracted,
112
+ stats.references_extracted, stats.embeddings_generated);
86
113
 
87
114
  Ok(stats)
88
115
  }
@@ -90,47 +117,61 @@ impl IndexCommand {
90
117
  fn initialize(&self) -> Result<()> {
91
118
  info!("Initializing index components");
92
119
 
93
- // Create index directory
94
120
  fs::create_dir_all(&self.index_path)
95
121
  .context("Failed to create index directory")?;
96
122
 
97
- // Initialize search engine
98
- let mut search_engine = self.search_engine.clone();
123
+ let mut search_engine = self.search_engine.duplicate()?;
99
124
  search_engine.load_or_create()?;
100
125
 
101
- // Initialize database
102
126
  self.store.initialize()?;
103
127
 
128
+ // Initialize Schema V2 tables (entities, refs, etc.)
129
+ crate::schema_v2::SchemaV2::initialize(&self.store_v2.conn)?;
130
+
131
+ self.store_v2.conn.execute(
132
+ "CREATE TABLE IF NOT EXISTS file_hashes (
133
+ file_path TEXT PRIMARY KEY,
134
+ file_hash TEXT NOT NULL,
135
+ indexed_at INTEGER NOT NULL
136
+ )",
137
+ []
138
+ )?;
139
+
104
140
  info!("Components initialized");
105
141
  Ok(())
106
142
  }
107
143
 
108
144
  fn collect_files(&self) -> Result<Vec<PathBuf>> {
109
- info!("Collecting files to index");
145
+ info!("Collecting files to index from: {}", self.source_path.display());
110
146
 
111
147
  let mut files = Vec::new();
112
148
 
113
- let walker = WalkDir::new(&self.project_dir)
149
+ let walker = WalkDir::new(&self.source_path)
114
150
  .into_iter()
115
- .filter_entry(|e| !Self::is_hidden(e))
151
+ .filter_entry(|e| {
152
+ let path = e.path();
153
+ let name = e.file_name().to_string_lossy();
154
+
155
+ // Exclude build artifacts, dependencies, and temporary files
156
+ // Allow .claude and other important hidden folders
157
+ match name.as_ref() {
158
+ "node_modules" | "target" | "dist" | "build" | ".git" | ".artifacts" => false,
159
+ _ => true
160
+ }
161
+ })
116
162
  .filter_map(|e| e.ok())
117
163
  .filter(|e| {
118
- // Skip directories
119
164
  if e.file_type().is_dir() {
120
165
  return false;
121
166
  }
122
167
 
123
- // Skip .ruvector directory
124
168
  if e.path().starts_with(&self.index_path) {
125
169
  return false;
126
170
  }
127
171
 
128
- // Check file extension
129
- if let Some(ext) = e.path().extension() {
130
- self.file_types.contains(&ext.to_string_lossy().to_string())
131
- } else {
132
- false
133
- }
172
+ // Index ALL files regardless of extension
173
+ // File type metadata is captured during processing
174
+ true
134
175
  });
135
176
 
136
177
  for entry in walker {
@@ -144,7 +185,12 @@ impl IndexCommand {
144
185
  fn is_hidden(entry: &DirEntry) -> bool {
145
186
  entry.file_name()
146
187
  .to_str()
147
- .map(|s| s.starts_with('.'))
188
+ .map(|s| {
189
+ if s == ".claude" {
190
+ return false;
191
+ }
192
+ s.starts_with('.')
193
+ })
148
194
  .unwrap_or(false)
149
195
  }
150
196
 
@@ -152,8 +198,9 @@ impl IndexCommand {
152
198
  let stats = Arc::new(RwLock::new(IndexStats::default()));
153
199
  let errors = Arc::new(RwLock::new(Vec::new()));
154
200
 
155
- info!("Processing {} files", files.len());
201
+ info!("Processing {} files (parallel extraction, sequential DB writes)", files.len());
156
202
 
203
+ // Process in chunks for parallel extraction with sequential DB writes
157
204
  for file_path in files {
158
205
  debug!("Processing: {}", file_path.display());
159
206
 
@@ -164,11 +211,13 @@ impl IndexCommand {
164
211
  }
165
212
  }
166
213
 
167
- let stats_guard = stats.write().unwrap();
214
+ let stats_guard = stats.read().unwrap();
168
215
  let errors_guard = errors.read().unwrap();
169
216
 
170
217
  let final_stats = IndexStats {
171
218
  files_processed: stats_guard.files_processed,
219
+ entities_extracted: stats_guard.entities_extracted,
220
+ references_extracted: stats_guard.references_extracted,
172
221
  embeddings_generated: stats_guard.embeddings_generated,
173
222
  errors: errors_guard.clone(),
174
223
  };
@@ -182,102 +231,234 @@ impl IndexCommand {
182
231
  stats: &Arc<RwLock<IndexStats>>,
183
232
  errors: &Arc<RwLock<Vec<String>>>,
184
233
  ) -> Result<()> {
185
- // Read file content
234
+ let file_hash = self.calculate_file_hash(file_path)?;
235
+
236
+ if !self.force && self.is_file_indexed(file_path, &file_hash)? {
237
+ debug!("Skipping already indexed file: {}", file_path.display());
238
+ return Ok(());
239
+ }
240
+
186
241
  let content = fs::read_to_string(file_path)
187
242
  .with_context(|| format!("Failed to read file: {}", file_path.display()))?;
188
243
 
189
- // Extract patterns
190
- let patterns = self.extract_patterns(&content, file_path)?;
244
+ let extraction_result = self.process_ast_extraction(file_path, &content)?;
191
245
 
192
- if patterns.is_empty() {
193
- debug!("No patterns found in {}", file_path.display());
246
+ if extraction_result.entities.is_empty() {
247
+ debug!("No entities found in {}", file_path.display());
194
248
  return Ok(());
195
249
  }
196
250
 
197
- // Generate embeddings for patterns
198
- let embeddings = self.embeddings_manager.generate_embeddings(&patterns)?;
251
+ let entity_ids = self.store_entities(file_path, &extraction_result.entities)?;
252
+ self.store_references(file_path, &extraction_result.references, &entity_ids)?;
253
+ self.store_type_usage(file_path, &extraction_result.entities, &entity_ids)?;
254
+
255
+ let embeddings = self.generate_entity_embeddings(&extraction_result.entities)?;
256
+
257
+ // Store embeddings in entity_embeddings table
258
+ for (entity_id, embedding) in entity_ids.iter().zip(embeddings.iter()) {
259
+ self.store_v2.store_embedding(*entity_id, embedding, "text-embedding-3-small")?;
260
+ }
199
261
 
200
- // Update stats
201
262
  {
202
263
  let mut s = stats.write().unwrap();
203
264
  s.files_processed += 1;
265
+ s.entities_extracted += extraction_result.entities.len();
266
+ s.references_extracted += extraction_result.references.len();
204
267
  s.embeddings_generated += embeddings.len();
205
268
  }
206
269
 
207
- // Store in search engine
208
- self.store_patterns(file_path, patterns, embeddings)?;
270
+ self.mark_file_indexed(file_path, &file_hash)?;
209
271
 
210
272
  Ok(())
211
273
  }
212
274
 
213
- fn extract_patterns(&self, content: &str, file_path: &Path) -> Result<Vec<String>> {
214
- let mut patterns = Vec::new();
275
+ fn process_ast_extraction(&self, file_path: &Path, content: &str) -> Result<ExtractionResult> {
276
+ let language = self.detect_language(file_path)?;
277
+
278
+ let result = match language.as_str() {
279
+ "rust" => {
280
+ let mut extractor = self.rust_extractor.clone();
281
+ extractor.extract(&file_path.to_string_lossy(), content)?
282
+ },
283
+ "typescript" | "javascript" => {
284
+ let mut extractor = self.typescript_extractor.clone();
285
+ extractor.extract(&file_path.to_string_lossy(), content)?
286
+ },
287
+ "text" => {
288
+ // Use text fallback extractor for non-code files
289
+ let mut extractor = self.text_fallback_extractor.clone();
290
+ extractor.extract(&file_path.to_string_lossy(), content)?
291
+ },
292
+ _ => {
293
+ // Try text fallback for unknown types
294
+ let mut extractor = self.text_fallback_extractor.clone();
295
+ extractor.extract(&file_path.to_string_lossy(), content)?
296
+ }
297
+ };
215
298
 
216
- // Extract lines as patterns
217
- for (line_num, line) in content.lines().enumerate() {
218
- let trimmed = line.trim();
219
-
220
- // Skip empty lines and comments
221
- if trimmed.is_empty() || trimmed.starts_with("//") || trimmed.starts_with('#') {
222
- continue;
299
+ Ok(result)
300
+ }
301
+
302
+ fn detect_language(&self, file_path: &Path) -> Result<String> {
303
+ if let Some(ext) = file_path.extension() {
304
+ match ext.to_string_lossy().as_ref() {
305
+ "rs" => Ok("rust".to_string()),
306
+ "ts" => Ok("typescript".to_string()),
307
+ "js" => Ok("javascript".to_string()),
308
+ "tsx" => Ok("typescript".to_string()),
309
+ "jsx" => Ok("javascript".to_string()),
310
+ // Text-based file types
311
+ "json" | "yaml" | "yml" | "md" | "markdown" | "sh" | "bash" | "txt" | "config" | "conf" | "env" => {
312
+ Ok("text".to_string())
313
+ },
314
+ _ => Ok("text".to_string()), // Default to text fallback for unknown types
223
315
  }
316
+ } else {
317
+ Ok("text".to_string())
318
+ }
319
+ }
224
320
 
225
- // Create pattern with context
226
- let pattern = format!("{}:{}:{}",
227
- file_path.file_name().unwrap().to_string_lossy(),
228
- line_num + 1,
229
- trimmed);
321
+ fn store_entities(&self, file_path: &Path, entities: &[Entity]) -> Result<Vec<i64>> {
322
+ let mut entity_ids = Vec::new();
323
+
324
+ for entity in entities {
325
+ let store_entity = StoreEntity {
326
+ id: 0,
327
+ kind: self.convert_entity_kind(&entity.kind),
328
+ name: entity.name.clone(),
329
+ signature: Some(entity.signature.clone()),
330
+ visibility: self.convert_visibility(&entity.visibility),
331
+ parent_id: None,
332
+ file_path: file_path.to_string_lossy().to_string(),
333
+ line_number: entity.line as i64,
334
+ column_number: Some(entity.column as i64),
335
+ doc_comment: None,
336
+ attributes: None,
337
+ metadata: Some(serde_json::to_string(&entity.metadata)?),
338
+ created_at: chrono::Utc::now(),
339
+ updated_at: chrono::Utc::now(),
340
+ };
230
341
 
231
- patterns.push(pattern);
342
+ let id = self.store_v2.insert_entity(&store_entity)?;
343
+ entity_ids.push(id);
232
344
  }
345
+
346
+ Ok(entity_ids)
347
+ }
233
348
 
234
- // If specific patterns are requested, filter
235
- if let Some(ref target_patterns) = self.patterns {
236
- let regexes: Vec<Regex> = target_patterns
237
- .iter()
238
- .filter_map(|p| Regex::new(p).ok())
239
- .collect();
240
-
241
- if !regexes.is_empty() {
242
- patterns = patterns.into_iter()
243
- .filter(|p| regexes.iter().any(|r| r.is_match(p)))
244
- .collect();
349
+ fn store_references(&self, file_path: &Path, references: &[Reference], entity_ids: &[i64]) -> Result<()> {
350
+ for (reference, &entity_id) in references.iter().zip(entity_ids.iter()) {
351
+ let store_reference = StoreReference {
352
+ id: 0,
353
+ source_entity_id: entity_id,
354
+ target_entity_id: 0,
355
+ ref_kind: self.convert_ref_kind(&reference.ref_kind),
356
+ file_path: file_path.to_string_lossy().to_string(),
357
+ line_number: reference.line as i64,
358
+ column_number: Some(reference.column as i64),
359
+ context: Some(serde_json::to_string(&reference.metadata)?),
360
+ created_at: chrono::Utc::now(),
361
+ };
362
+
363
+ self.store_v2.insert_reference(&store_reference)?;
364
+ }
365
+
366
+ Ok(())
367
+ }
368
+
369
+ fn store_type_usage(&self, file_path: &Path, entities: &[Entity], entity_ids: &[i64]) -> Result<()> {
370
+ for (entity, &entity_id) in entities.iter().zip(entity_ids.iter()) {
371
+ if let Some(type_info) = entity.metadata.get("type") {
372
+ let type_usage = TypeUsage {
373
+ id: 0,
374
+ entity_id,
375
+ type_name: type_info.clone(),
376
+ usage_kind: "annotation".to_string(),
377
+ file_path: file_path.to_string_lossy().to_string(),
378
+ line_number: entity.line as i64,
379
+ created_at: chrono::Utc::now(),
380
+ };
381
+
382
+ self.store_v2.insert_type_usage(&type_usage)?;
245
383
  }
246
384
  }
385
+
386
+ Ok(())
387
+ }
247
388
 
248
- Ok(patterns)
389
+ fn generate_entity_embeddings(&self, entities: &[Entity]) -> Result<Vec<Vec<f32>>> {
390
+ let texts: Vec<String> = entities.iter()
391
+ .map(|e| format!("{}:{}:{}", e.kind.as_str(), e.name, e.signature))
392
+ .collect();
393
+
394
+ self.embeddings_manager.generate_embeddings(&texts)
249
395
  }
250
396
 
251
- fn store_patterns(
252
- &self,
253
- file_path: &Path,
254
- patterns: Vec<String>,
255
- embeddings: Vec<Vec<f32>>,
256
- ) -> Result<()> {
257
- let file_hash = self.calculate_file_hash(file_path)?;
397
+ fn convert_entity_kind(&self, kind: &crate::extractors::EntityKind) -> EntityKind {
398
+ match kind {
399
+ crate::extractors::EntityKind::Function => EntityKind::Function,
400
+ crate::extractors::EntityKind::Method => EntityKind::Method,
401
+ crate::extractors::EntityKind::Constructor => EntityKind::Constructor,
402
+ crate::extractors::EntityKind::Getter => EntityKind::Getter,
403
+ crate::extractors::EntityKind::Setter => EntityKind::Setter,
404
+ crate::extractors::EntityKind::Class => EntityKind::Class,
405
+ crate::extractors::EntityKind::Interface => EntityKind::Interface,
406
+ crate::extractors::EntityKind::Struct => EntityKind::Struct,
407
+ crate::extractors::EntityKind::Enum => EntityKind::Enum,
408
+ crate::extractors::EntityKind::Trait => EntityKind::Trait,
409
+ crate::extractors::EntityKind::TypeAlias => EntityKind::TypeAlias,
410
+ crate::extractors::EntityKind::Module => EntityKind::Module,
411
+ crate::extractors::EntityKind::Namespace => EntityKind::Namespace,
412
+ crate::extractors::EntityKind::Variable => EntityKind::Variable,
413
+ crate::extractors::EntityKind::Constant => EntityKind::Constant,
414
+ crate::extractors::EntityKind::Parameter => EntityKind::Parameter,
415
+ crate::extractors::EntityKind::Import => EntityKind::Import,
416
+ }
417
+ }
258
418
 
259
- for (i, pattern) in patterns.into_iter().enumerate() {
260
- let embedding = embeddings.get(i).ok_or_else(|| anyhow!("Missing embedding for pattern"))?;
261
-
262
- let metadata = IndexMetadata {
263
- path: file_path.to_string_lossy().to_string(),
264
- pattern: pattern.clone(),
265
- line_number: None, // We'll extract this from the pattern
266
- context: None,
267
- snippet: None,
268
- file_hash: file_hash.clone(),
269
- indexed_at: std::time::SystemTime::now()
270
- .duration_since(std::time::UNIX_EPOCH)
271
- .unwrap()
272
- .as_secs(),
273
- };
419
+ fn convert_visibility(&self, visibility: &crate::extractors::Visibility) -> Visibility {
420
+ match visibility {
421
+ crate::extractors::Visibility::Public => Visibility::Public,
422
+ crate::extractors::Visibility::Private => Visibility::Private,
423
+ crate::extractors::Visibility::Protected => Visibility::Protected,
424
+ crate::extractors::Visibility::Internal => Visibility::Internal,
425
+ crate::extractors::Visibility::FilePrivate => Visibility::FilePrivate,
426
+ }
427
+ }
274
428
 
275
- // Store in search engine
276
- // Note: We'll need to modify SearchEngine to handle this
277
- // For now, just store in database
278
- self.store.store_embedding(&pattern, embedding, &metadata)?;
429
+ fn convert_ref_kind(&self, ref_kind: &crate::extractors::RefKind) -> RefKind {
430
+ match ref_kind {
431
+ crate::extractors::RefKind::Calls => RefKind::Calls,
432
+ crate::extractors::RefKind::Extends => RefKind::Extends,
433
+ crate::extractors::RefKind::Implements => RefKind::Implements,
434
+ crate::extractors::RefKind::Imports => RefKind::Imports,
435
+ crate::extractors::RefKind::Uses => RefKind::Uses,
436
+ crate::extractors::RefKind::Instantiates => RefKind::Instantiates,
437
+ crate::extractors::RefKind::Overrides => RefKind::Overrides,
438
+ crate::extractors::RefKind::Reads => RefKind::Reads,
439
+ crate::extractors::RefKind::Writes => RefKind::Writes,
279
440
  }
441
+ }
280
442
 
443
+ fn is_file_indexed(&self, file_path: &Path, file_hash: &str) -> Result<bool> {
444
+ let query = "SELECT COUNT(*) FROM file_hashes WHERE file_path = ? AND file_hash = ?";
445
+ let mut stmt = self.store_v2.conn.prepare(query)?;
446
+ let count: i64 = stmt.query_row(
447
+ params![file_path.to_string_lossy(), file_hash],
448
+ |row| row.get(0)
449
+ )?;
450
+ Ok(count > 0)
451
+ }
452
+
453
+ fn mark_file_indexed(&self, file_path: &Path, file_hash: &str) -> Result<()> {
454
+ self.store_v2.conn.execute(
455
+ "INSERT OR REPLACE INTO file_hashes (file_path, file_hash, indexed_at) VALUES (?1, ?2, ?3)",
456
+ params![
457
+ file_path.to_string_lossy(),
458
+ file_hash,
459
+ chrono::Utc::now().timestamp()
460
+ ]
461
+ )?;
281
462
  Ok(())
282
463
  }
283
464
 
@@ -298,4 +479,4 @@ impl IndexCommand {
298
479
 
299
480
  Ok(format!("{:x}", hasher.finalize()))
300
481
  }
301
- }
482
+ }