claude-flow-novice 2.18.13 → 2.18.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  2. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  3. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  4. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  5. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  6. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  7. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  8. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  9. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  10. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/metadata.json +8 -0
  11. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/original +1212 -0
  12. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/revert.sh +7 -0
  13. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/metadata.json +8 -0
  14. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/original +1212 -0
  15. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/revert.sh +7 -0
  16. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/metadata.json +8 -0
  17. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/original +1212 -0
  18. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/revert.sh +7 -0
  19. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/metadata.json +8 -0
  20. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/original +1228 -0
  21. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/revert.sh +7 -0
  22. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/metadata.json +8 -0
  23. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/original +1237 -0
  24. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/revert.sh +7 -0
  25. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/metadata.json +8 -0
  26. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/original +1240 -0
  27. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/revert.sh +7 -0
  28. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/metadata.json +8 -0
  29. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/original +1216 -0
  30. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/revert.sh +7 -0
  31. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/metadata.json +8 -0
  32. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/original +1238 -0
  33. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/revert.sh +7 -0
  34. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/metadata.json +8 -0
  35. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/original +1167 -0
  36. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/revert.sh +7 -0
  37. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/metadata.json +8 -0
  38. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/original +1242 -0
  39. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/revert.sh +7 -0
  40. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/metadata.json +8 -0
  41. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/original +2 -0
  42. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/revert.sh +7 -0
  43. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/metadata.json +8 -0
  44. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/original +1169 -0
  45. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/revert.sh +7 -0
  46. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/metadata.json +8 -0
  47. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/original +1171 -0
  48. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/revert.sh +7 -0
  49. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/metadata.json +8 -0
  50. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/original +1170 -0
  51. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/revert.sh +7 -0
  52. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/metadata.json +8 -0
  53. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/original +1173 -0
  54. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/revert.sh +7 -0
  55. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/metadata.json +8 -0
  56. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/original +1170 -0
  57. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/revert.sh +7 -0
  58. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/metadata.json +8 -0
  59. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/original +1172 -0
  60. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/revert.sh +7 -0
  61. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/metadata.json +8 -0
  62. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/original +1175 -0
  63. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/revert.sh +7 -0
  64. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/metadata.json +8 -0
  65. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/original +1178 -0
  66. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/revert.sh +7 -0
  67. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/metadata.json +8 -0
  68. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/original +1174 -0
  69. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/revert.sh +7 -0
  70. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/metadata.json +8 -0
  71. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/original +1194 -0
  72. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/revert.sh +7 -0
  73. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/metadata.json +8 -0
  74. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/original +1186 -0
  75. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/revert.sh +7 -0
  76. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/metadata.json +8 -0
  77. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/original +1180 -0
  78. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/revert.sh +7 -0
  79. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/metadata.json +8 -0
  80. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/original +1198 -0
  81. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/revert.sh +7 -0
  82. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/metadata.json +8 -0
  83. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/original +1202 -0
  84. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/revert.sh +7 -0
  85. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/metadata.json +8 -0
  86. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/original +1202 -0
  87. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/revert.sh +7 -0
  88. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/metadata.json +8 -0
  89. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/original +1209 -0
  90. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/revert.sh +7 -0
  91. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/metadata.json +8 -0
  92. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/original +1207 -0
  93. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/revert.sh +7 -0
  94. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/metadata.json +8 -0
  95. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/original +1207 -0
  96. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/revert.sh +7 -0
  97. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/metadata.json +8 -0
  98. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/original +1193 -0
  99. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/revert.sh +7 -0
  100. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/metadata.json +8 -0
  101. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/original +1194 -0
  102. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/revert.sh +7 -0
  103. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/metadata.json +8 -0
  104. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/original +1193 -0
  105. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/revert.sh +7 -0
  106. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/metadata.json +8 -0
  107. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/original +1191 -0
  108. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/revert.sh +7 -0
  109. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/metadata.json +8 -0
  110. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/original +1190 -0
  111. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/revert.sh +7 -0
  112. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/metadata.json +8 -0
  113. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/original +1191 -0
  114. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/revert.sh +7 -0
  115. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/metadata.json +8 -0
  116. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/original +1189 -0
  117. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/revert.sh +7 -0
  118. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/metadata.json +8 -0
  119. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/original +1197 -0
  120. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/revert.sh +7 -0
  121. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/metadata.json +8 -0
  122. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/original +1190 -0
  123. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/revert.sh +7 -0
  124. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/metadata.json +8 -0
  125. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/original +1197 -0
  126. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/revert.sh +7 -0
  127. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/metadata.json +8 -0
  128. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/original +1197 -0
  129. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/revert.sh +7 -0
  130. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.md +194 -2
  131. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.sh +264 -0
  132. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.sh.backup +698 -0
  133. package/.claude/hooks/README.md +148 -0
  134. package/.claude/hooks/SessionStart:cfn-load-openai-key.sh +35 -0
  135. package/.claude/hooks/cfn-invoke-pre-edit.sh +1 -1
  136. package/.claude/hooks/cfn-load-cerebras-env.sh +65 -0
  137. package/.claude/hooks/cfn-precompact-enhanced.sh +283 -0
  138. package/.claude/hooks/deprecated/README.md +27 -0
  139. package/.claude/settings.json +71 -6
  140. package/.claude/skills/cfn-cerebras-coordinator/QUICKSTART.md +348 -0
  141. package/.claude/skills/cfn-cerebras-coordinator/README.md +525 -0
  142. package/.claude/skills/cfn-cerebras-coordinator/TDD_COORDINATOR_OVERVIEW.md +284 -0
  143. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v2-test-1733854200.json +36 -0
  144. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v3-test-1765383241.json +36 -0
  145. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v2-test-1765381361.json +36 -0
  146. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v3-test-1765383242.json +46 -0
  147. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v2-test-1733864400.json +66 -0
  148. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v3-test-1765383238.json +66 -0
  149. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v4-test-1765386506.json +66 -0
  150. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v5-test-1765393100.json +66 -0
  151. package/.claude/skills/cfn-cerebras-coordinator/example-usage.sh +206 -0
  152. package/.claude/skills/cfn-cerebras-coordinator/lib/tdd-conversation-coordinator.ts +569 -0
  153. package/.claude/skills/cfn-cerebras-coordinator/test-tdd-coordinator.sh +250 -0
  154. package/.claude/skills/cfn-epic-creator/SKILL.md +392 -0
  155. package/.claude/skills/cfn-epic-creator/estimate-costs.sh +524 -0
  156. package/.claude/skills/cfn-epic-creator/invoke.sh +445 -0
  157. package/.claude/skills/cfn-epic-creator/parse-personas.sh +533 -0
  158. package/.claude/skills/cfn-epic-creator/security-utils.sh +268 -0
  159. package/.claude/skills/cfn-epic-creator/security-verification-demo.sh +127 -0
  160. package/.claude/skills/cfn-epic-creator/test-invoke.sh +620 -0
  161. package/.claude/skills/cfn-epic-creator/test-security-fixes.sh +195 -0
  162. package/.claude/skills/cfn-epic-creator/test-security-simple.sh +165 -0
  163. package/.claude/skills/cfn-epic-creator/validate-epic.sh +474 -0
  164. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/metadata.json +8 -0
  165. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/original +209 -0
  166. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/revert.sh +7 -0
  167. package/.claude/skills/cfn-local-ruvector-accelerator/AGENT_INTEGRATION_PATTERNS.md +255 -0
  168. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml +8 -1
  169. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml.backup +47 -0
  170. package/.claude/skills/cfn-local-ruvector-accelerator/EXTRACTION_EXAMPLES.md +287 -0
  171. package/.claude/skills/cfn-local-ruvector-accelerator/README.md +2 -563
  172. package/.claude/skills/cfn-local-ruvector-accelerator/SCHEMA_V2_IMPLEMENTATION.md +151 -0
  173. package/.claude/skills/cfn-local-ruvector-accelerator/SECURITY_IMPLEMENTATION.md +185 -0
  174. package/.claude/skills/cfn-local-ruvector-accelerator/SKILL.md +8 -351
  175. package/.claude/skills/cfn-local-ruvector-accelerator/docs/EXECUTIVE_SUMMARY.txt +90 -0
  176. package/.claude/skills/cfn-local-ruvector-accelerator/docs/PHASE_4_QUERY_API.md +210 -0
  177. package/.claude/skills/cfn-local-ruvector-accelerator/docs/RUST_AST_EXTRACTOR_IMPLEMENTATION.md +222 -0
  178. package/.claude/skills/cfn-local-ruvector-accelerator/docs/TRANSACTION_MANAGEMENT.md +241 -0
  179. package/.claude/skills/cfn-local-ruvector-accelerator/docs/VALIDATION_FINDINGS.txt +250 -0
  180. package/.claude/skills/cfn-local-ruvector-accelerator/epic-ast-indexer.json +335 -0
  181. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh +292 -96
  182. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh.backup +249 -0
  183. package/.claude/skills/cfn-local-ruvector-accelerator/index_all.sh +65 -0
  184. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/find.rs +214 -0
  185. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index.rs +259 -103
  186. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_ast.rs +767 -0
  187. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_modified.rs +37 -0
  188. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/init.rs +17 -12
  189. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/migration.rs +34 -1
  190. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/mod.rs +6 -0
  191. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/refs.rs +209 -0
  192. package/.claude/skills/cfn-local-ruvector-accelerator/src/embeddings.rs +82 -33
  193. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/mod.rs +251 -0
  194. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust.rs +425 -0
  195. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust_placeholder.rs +420 -0
  196. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/text_fallback.rs +490 -0
  197. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript.rs +520 -0
  198. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript_full.rs +531 -0
  199. package/.claude/skills/cfn-local-ruvector-accelerator/src/lib.rs +20 -0
  200. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs +33 -2
  201. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs.backup +360 -0
  202. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration.rs +325 -318
  203. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_backup.rs +325 -0
  204. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_tx.rs +513 -0
  205. package/.claude/skills/cfn-local-ruvector-accelerator/src/paths.rs +29 -0
  206. package/.claude/skills/cfn-local-ruvector-accelerator/src/query_api.rs +609 -0
  207. package/.claude/skills/cfn-local-ruvector-accelerator/src/schema_v2.rs +603 -0
  208. package/.claude/skills/cfn-local-ruvector-accelerator/src/security_tests.rs +154 -0
  209. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2.rs +583 -0
  210. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_backup.rs +560 -0
  211. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_fixed.rs +0 -0
  212. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_tx.rs +397 -0
  213. package/.claude/skills/cfn-local-ruvector-accelerator/src/test_schema.rs +228 -0
  214. package/.claude/skills/cfn-local-ruvector-accelerator/src/transaction_tests.rs +410 -0
  215. package/.claude/skills/cfn-local-ruvector-accelerator/test_ast_indexing.rs +59 -0
  216. package/.claude/skills/cfn-local-ruvector-accelerator/test_query_api.sh +103 -0
  217. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema.sql +158 -0
  218. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema_v2.sql +147 -0
  219. package/.claude/skills/cfn-mdap-context-injection/SKILL.md +31 -10
  220. package/.claude/skills/cfn-mdap-error-fixer/skill.md +15 -205
  221. package/.claude/skills/cfn-session-handoff/SKILL.md +1 -53
  222. package/.claude/skills/cfn-task-decomposition/SKILL.md +1 -0
  223. package/.claude/skills/cfn-task-intelligence/SKILL.md +39 -18
  224. package/.claude/skills/cfn-task-planning/SKILL.md +37 -12
  225. package/.claude/skills/cfn-validation-framework/SKILL.md +3 -60
  226. package/.claude/skills/cfn-vision-analysis/SKILL.md +3 -20
  227. package/.claude-flow/metrics/performance.json +3 -3
  228. package/.claude-flow/metrics/task-metrics.json +3 -3
  229. package/.ruvector/index_v2.db-shm +0 -0
  230. package/.ruvector/index_v2.db-wal +0 -0
  231. package/CLAUDE.md +9 -1
  232. package/README.md +56 -0
  233. package/docs/AGENT_PRODUCTION_FEEDBACK_PATTERNS.md +389 -0
  234. package/docs/CEREBRAS_TDD_COORDINATOR_TEST_RESULTS.md +213 -0
  235. package/docs/CEREBRAS_TDD_ROUND1_VS_ROUND2_COMPARISON.md +225 -0
  236. package/docs/CEREBRAS_TDD_ROUND3_FINAL_RESULTS.md +264 -0
  237. package/docs/EPIC_CREATOR_V2_ARCHITECTURE.md +629 -0
  238. package/docs/HOOKS_IMPLEMENTATION_PRIORITY.md +585 -0
  239. package/docs/SKILLS_HOOKS_INTEGRATION.md +1074 -0
  240. package/epic-with-personas-2025-12-09-17-15-13.json +253 -0
  241. package/package.json +2 -1
  242. package/test-epic-creator-security.sh +203 -0
  243. package/.claude/skills/cfn-local-ruvector-accelerator/__pycache__/search_engine_v2.cpython-312.pyc +0 -0
  244. package/.claude/skills/cfn-local-ruvector-accelerator/search_engine.py +0 -200
  245. package/jest.config.ts.cjs +0 -17
  246. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/SKILL.md +0 -0
  247. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/context-analyzer.sh +0 -0
  248. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/generate-code.sh +0 -0
  249. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/SKILL.md +0 -0
  250. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/execute.sh +0 -0
  251. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/INTEGRATION.md +0 -0
  252. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SAMPLE_OUTPUTS.md +0 -0
  253. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SKILL.md +0 -0
  254. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/capture-container-logs.sh +0 -0
  255. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/enable-logging.sh +0 -0
  256. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/init-hybrid-logging.sh +0 -0
  257. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/analytics-summary.sh +0 -0
  258. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-agent-timeline.sh +0 -0
  259. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-consensus-history.sh +0 -0
  260. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-coordination-timeline.sh +0 -0
  261. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-failed-containers.sh +0 -0
  262. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-gate-checks.sh +0 -0
  263. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/schema.sql +0 -0
  264. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/sqlite-helpers.sh +0 -0
  265. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/test-hybrid-logging.sh +0 -0
  266. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/SKILL.md +0 -0
  267. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/skill-mcp-selector.js +0 -0
  268. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/SKILL.md +0 -0
  269. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/orchestrate.sh +0 -0
  270. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/SKILL.md +0 -0
  271. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/spawn-agent.sh +0 -0
  272. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/SKILL.md +0 -0
  273. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/cleanup-wave.sh +0 -0
  274. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/lib/docker-helpers.sh +0 -0
  275. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/monitor-wave.sh +0 -0
  276. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/spawn-wave.sh +0 -0
  277. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/SKILL.md +0 -0
  278. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/task-mode-heap-limiter.sh +0 -0
  279. /package/.claude/{skills → cfn-extras/skills/deprecated}/deprecated/analyze-patterns.sh +0 -0
  280. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/README.md +0 -0
  281. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SECURITY.md +0 -0
  282. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SKILL.md +0 -0
  283. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/package.json +0 -0
  284. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/solve.sh +0 -0
  285. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver-minimal.sh +0 -0
  286. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver.sh +0 -0
  287. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test.cjs +0 -0
  288. /package/.claude/hooks/{cfn-credential-scanner.sh → deprecated/cfn-credential-scanner.sh} +0 -0
  289. /package/.claude/hooks/{cfn-detect-hardcoded-credentials.sh → deprecated/cfn-detect-hardcoded-credentials.sh} +0 -0
  290. /package/.claude/hooks/{cfn-invoke-post-edit-ts.sh → deprecated/cfn-invoke-post-edit-ts.sh} +0 -0
  291. /package/.claude/hooks/{cfn-invoke-pre-edit-ts.sh → deprecated/cfn-invoke-pre-edit-ts.sh} +0 -0
  292. /package/.claude/hooks/{cfn-invoke-security-validation.sh → deprecated/cfn-invoke-security-validation.sh} +0 -0
  293. /package/.claude/hooks/{cfn-lint-sql-injection.sh → deprecated/cfn-lint-sql-injection.sh} +0 -0
  294. /package/.claude/hooks/{cfn-post-edit.sh → deprecated/cfn-post-edit.sh} +0 -0
  295. /package/.claude/hooks/{cfn-pre-edit-backup.sh → deprecated/cfn-pre-edit-backup.sh} +0 -0
  296. /package/.claude/skills/cfn-local-ruvector-accelerator/{embeddings_manager.py → embeddings_manager.py.backup} +0 -0
  297. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/index.bin +0 -0
  298. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/metadata.json +0 -0
  299. /package/.claude/skills/cfn-local-ruvector-accelerator/{search_engine_v2.py → search_engine_v2.py.backup} +0 -0
  300. /package/.claude/skills/cfn-local-ruvector-accelerator/{sqlite_store.py → sqlite_store.py.backup} +0 -0
@@ -1,318 +1,325 @@
1
- use anyhow::{Result, anyhow};
2
- use std::path::Path;
3
- use tracing::{info, warn};
4
-
5
- use crate::sqlite_store::SqliteStore;
6
-
7
- /// Migrate embeddings from centralized RuVector database
8
- pub async fn from_centralized(
9
- ruvector_dir: &Path,
10
- db_url: &str,
11
- project_id: Option<String>,
12
- batch_size: usize,
13
- ) -> Result<()> {
14
- info!("Migrating from centralized RuVector at {}", db_url);
15
-
16
- // Initialize local store
17
- let store = SqliteStore::new(&ruvector_dir.join("store.db"))?;
18
-
19
- // TODO: Implement migration from centralized database
20
- // This would involve:
21
- // 1. Connecting to the centralized database
22
- // 2. Querying embeddings for the specified project (or all projects)
23
- // 3. Batch processing to transfer embeddings
24
- // 4. Converting metadata format if needed
25
-
26
- warn!("Centralized migration not yet implemented");
27
- Err(anyhow!("Centralized migration feature coming soon"))
28
- }
29
-
30
- /// Sync local changes back to centralized database
31
- pub async fn sync_to_centralized(
32
- ruvector_dir: &Path,
33
- db_url: &str,
34
- project_id: String,
35
- ) -> Result<()> {
36
- info!("Syncing local changes to centralized database");
37
-
38
- // TODO: Implement sync to centralized database
39
- // This would involve:
40
- // 1. Finding local changes not yet synced
41
- // 2. Uploading to centralized database
42
- // 3. Handling conflicts and resolutions
43
-
44
- warn!("Sync to centralized not yet implemented");
45
- Err(anyhow!("Sync to centralized feature coming soon"))
46
- }
47
-
48
- /// Check for conflicts between local and centralized versions
49
- pub async fn check_conflicts(
50
- ruvector_dir: &Path,
51
- db_url: &str,
52
- project_id: String,
53
- ) -> Result<Vec<Conflict>> {
54
- info!("Checking for conflicts with centralized database");
55
-
56
- // TODO: Implement conflict detection
57
- // This would compare local and remote versions to identify:
58
- // 1. Files modified in both places
59
- // 2. Embeddings with different versions
60
- // 3. Metadata discrepancies
61
-
62
- warn!("Conflict detection not yet implemented");
63
- Ok(vec![])
64
- }
65
-
66
- #[derive(Debug)]
67
- pub struct Conflict {
68
- pub file_path: String,
69
- pub conflict_type: ConflictType,
70
- pub local_version: String,
71
- pub remote_version: String,
72
- }
73
-
74
- #[derive(Debug)]
75
- pub enum ConflictType {
76
- ModifiedBoth,
77
- DeletedRemote,
78
- DeletedLocal,
79
- MetadataMismatch,
80
- }
81
-
82
- pub struct ConflictResolver {
83
- pub strategy: ConflictStrategy,
84
- }
85
-
86
- #[derive(Debug, Clone)]
87
- pub enum ConflictStrategy {
88
- LocalWins,
89
- RemoteWins,
90
- KeepBoth,
91
- Manual,
92
- }
93
-
94
- impl ConflictResolver {
95
- pub async fn resolve_conflicts(
96
- &self,
97
- conflicts: Vec<Conflict>,
98
- ) -> Result<Vec<Resolution>> {
99
- let mut resolutions = Vec::new();
100
-
101
- for conflict in conflicts {
102
- let resolution = match self.strategy {
103
- ConflictStrategy::LocalWins => Resolution {
104
- file_path: conflict.file_path.clone(),
105
- action: ResolutionAction::UseLocal,
106
- },
107
- ConflictStrategy::RemoteWins => Resolution {
108
- file_path: conflict.file_path.clone(),
109
- action: ResolutionAction::UseRemote,
110
- },
111
- ConflictStrategy::KeepBoth => Resolution {
112
- file_path: conflict.file_path.clone(),
113
- action: ResolutionAction::KeepBoth {
114
- local_suffix: ".local".to_string(),
115
- remote_suffix: ".remote".to_string(),
116
- },
117
- },
118
- ConflictStrategy::Manual => {
119
- // TODO: Implement interactive resolution
120
- Resolution {
121
- file_path: conflict.file_path.clone(),
122
- action: ResolutionAction::Manual,
123
- }
124
- }
125
- };
126
-
127
- resolutions.push(resolution);
128
- }
129
-
130
- Ok(resolutions)
131
- }
132
- }
133
-
134
- #[derive(Debug)]
135
- pub struct Resolution {
136
- pub file_path: String,
137
- pub action: ResolutionAction,
138
- }
139
-
140
- #[derive(Debug)]
141
- pub enum ResolutionAction {
142
- UseLocal,
143
- UseRemote,
144
- KeepBoth { local_suffix: String, remote_suffix: String },
145
- Manual,
146
- }
147
-
148
- /// Import embeddings from various file formats
149
- pub async fn import_from_file(
150
- ruvector_dir: &Path,
151
- file_path: &Path,
152
- format: ImportFormat,
153
- ) -> Result<usize> {
154
- info!("Importing embeddings from {:?} in {:?} format", file_path, format);
155
-
156
- match format {
157
- ImportFormat::Json => import_from_json(ruvector_dir, file_path).await,
158
- ImportFormat::Csv => import_from_csv(ruvector_dir, file_path).await,
159
- ImportFormat::Numpy => import_from_numpy(ruvector_dir, file_path).await,
160
- ImportFormat::Pickle => import_from_pickle(ruvector_dir, file_path).await,
161
- }
162
- }
163
-
164
- #[derive(Debug)]
165
- pub enum ImportFormat {
166
- Json,
167
- Csv,
168
- Numpy,
169
- Pickle,
170
- }
171
-
172
- async fn import_from_json(ruvector_dir: &Path, file_path: &Path) -> Result<usize> {
173
- // TODO: Implement JSON import
174
- Err(anyhow!("JSON import not yet implemented"))
175
- }
176
-
177
- async fn import_from_csv(ruvector_dir: &Path, file_path: &Path) -> Result<usize> {
178
- // TODO: Implement CSV import
179
- Err(anyhow!("CSV import not yet implemented"))
180
- }
181
-
182
- async fn import_from_numpy(ruvector_dir: &Path, file_path: &Path) -> Result<usize> {
183
- // TODO: Implement NumPy import
184
- // This would require parsing .npy files
185
- Err(anyhow!("NumPy import not yet implemented"))
186
- }
187
-
188
- async fn import_from_pickle(ruvector_dir: &Path, file_path: &Path) -> Result<usize> {
189
- // TODO: Implement pickle import
190
- // This would require Python integration or understanding pickle format
191
- Err(anyhow!("Pickle import not yet implemented"))
192
- }
193
-
194
- /// Export embeddings to various file formats
195
- pub async fn export_to_file(
196
- ruvector_dir: &Path,
197
- file_path: &Path,
198
- format: ExportFormat,
199
- include_embeddings: bool,
200
- ) -> Result<usize> {
201
- info!("Exporting embeddings to {:?} in {:?} format", file_path, format);
202
-
203
- let store = SqliteStore::new(&ruvector_dir.join("store.db"))?;
204
- let all_embeddings = store.get_all_embeddings()?;
205
-
206
- match format {
207
- ExportFormat::Json => export_to_json(file_path, &all_embeddings, include_embeddings),
208
- ExportFormat::Csv => export_to_csv(file_path, &all_embeddings, include_embeddings),
209
- ExportFormat::Numpy => export_to_numpy(file_path, &all_embeddings),
210
- ExportFormat::Tensorflow => export_to_tensorflow(file_path, &all_embeddings),
211
- }
212
- }
213
-
214
- #[derive(Debug)]
215
- pub enum ExportFormat {
216
- Json,
217
- Csv,
218
- Numpy,
219
- Tensorflow,
220
- }
221
-
222
- fn export_to_json(
223
- file_path: &Path,
224
- embeddings: &[(String, Vec<f32>, serde_json::Value)],
225
- include_vectors: bool,
226
- ) -> Result<usize> {
227
- use std::io::Write;
228
-
229
- let mut file = std::fs::File::create(file_path)?;
230
-
231
- let mut export_data = serde_json::Map::new();
232
- let mut items = Vec::new();
233
-
234
- for (id, vector, metadata) in embeddings {
235
- let mut item = serde_json::Map::new();
236
- item.insert("id".to_string(), serde_json::Value::String(id.clone()));
237
- item.insert("metadata".to_string(), metadata.clone());
238
-
239
- if include_vectors {
240
- item.insert("vector".to_string(), serde_json::Value::Array(
241
- vector.iter().map(|v| serde_json::Value::Number(serde_json::Number::from_f64(*v as f64).unwrap())).collect()
242
- ));
243
- }
244
-
245
- items.push(serde_json::Value::Object(item));
246
- }
247
-
248
- export_data.insert("embeddings".to_string(), serde_json::Value::Array(items));
249
- export_data.insert("count".to_string(), serde_json::Value::Number(
250
- serde_json::Number::from(embeddings.len())
251
- ));
252
- export_data.insert("exported_at".to_string(), serde_json::Value::String(
253
- chrono::Utc::now().to_rfc3339()
254
- ));
255
-
256
- let json_str = serde_json::to_string_pretty(&export_data)?;
257
- file.write_all(json_str.as_bytes())?;
258
-
259
- Ok(embeddings.len())
260
- }
261
-
262
- fn export_to_csv(
263
- file_path: &Path,
264
- embeddings: &[(String, Vec<f32>, serde_json::Value)],
265
- include_vectors: bool,
266
- ) -> Result<usize> {
267
- use std::io::Write;
268
-
269
- let mut file = std::fs::File::create(file_path)?;
270
-
271
- // Write header
272
- writeln!(file, "id,path,pattern,line_number")?;
273
-
274
- if include_vectors {
275
- // Determine vector dimension
276
- let dim = embeddings.first().map(|(_, v, _)| v.len()).unwrap_or(0);
277
- for i in 0..dim {
278
- write!(file, ",dim_{}", i)?;
279
- }
280
- writeln!(file)?;
281
- }
282
-
283
- // Write data
284
- for (id, vector, metadata) in embeddings {
285
- let path = metadata["path"].as_str().unwrap_or("");
286
- let pattern = metadata["pattern"].as_str().unwrap_or("");
287
- let line_number = metadata["line_number"].as_u64().unwrap_or(0);
288
-
289
- write!(file, "{},{},{},{}", id, path, pattern, line_number)?;
290
-
291
- if include_vectors {
292
- for &value in vector {
293
- write!(file, ",{}", value)?;
294
- }
295
- }
296
- writeln!(file)?;
297
- }
298
-
299
- Ok(embeddings.len())
300
- }
301
-
302
- fn export_to_numpy(
303
- file_path: &Path,
304
- embeddings: &[(String, Vec<f32>, serde_json::Value)],
305
- ) -> Result<usize> {
306
- // TODO: Implement NumPy export
307
- // This would require generating .npy files
308
- Err(anyhow!("NumPy export not yet implemented"))
309
- }
310
-
311
- fn export_to_tensorflow(
312
- file_path: &Path,
313
- embeddings: &[(String, Vec<f32>, serde_json::Value)],
314
- ) -> Result<usize> {
315
- // TODO: Implement TensorFlow export
316
- // This would require generating TFRecord files
317
- Err(anyhow!("TensorFlow export not yet implemented"))
318
- }
1
+ use anyhow::{Result, Context, bail};
2
+ use rusqlite::Connection;
3
+ use std::path::Path;
4
+ use tracing::{info, warn, error, debug};
5
+ use std::time::{SystemTime, UNIX_EPOCH};
6
+
7
+ use crate::schema_v2::SchemaV2;
8
+
9
+ pub struct MigrationManager {
10
+ conn: Connection,
11
+ }
12
+
13
+ impl MigrationManager {
14
+ pub fn new(db_path: &Path) -> Result<Self> {
15
+ let conn = Connection::open(db_path)
16
+ .context("Failed to open database for migration")?;
17
+
18
+ // Enable foreign key constraints
19
+ conn.execute("PRAGMA foreign_keys = ON", [])?;
20
+
21
+ Ok(Self { conn })
22
+ }
23
+
24
+ /// Get the current schema version
25
+ pub fn current_version(&self) -> Result<u32> {
26
+ let mut stmt = self.conn.prepare(
27
+ "SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
28
+ )?;
29
+
30
+ match stmt.query_row([], |row| row.get(0)) {
31
+ Ok(version) => Ok(version),
32
+ Err(rusqlite::Error::QueryReturnedNoRows) => {
33
+ // Check if this is a pre-versioned database (v1)
34
+ if self.has_v1_tables()? {
35
+ Ok(1)
36
+ } else {
37
+ Ok(0) // New database
38
+ }
39
+ }
40
+ Err(e) => Err(e.into()),
41
+ }
42
+ }
43
+
44
+ /// Check if database has v1 tables
45
+ fn has_v1_tables(&self) -> Result<bool> {
46
+ let count: i64 = self.conn.query_row(
47
+ "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name IN ('embeddings', 'files')",
48
+ [],
49
+ |row| row.get(0)
50
+ )?;
51
+ Ok(count > 0)
52
+ }
53
+
54
+ /// Run all necessary migrations to bring database to latest version
55
+ pub fn migrate_to_latest(&mut self) -> Result<()> {
56
+ let current_version = self.current_version()?;
57
+ let target_version = 2; // Current latest version
58
+
59
+ info!("Starting migration from version {} to {}", current_version, target_version);
60
+
61
+ if current_version == 0 {
62
+ // Fresh installation
63
+ info!("Initializing fresh database with latest schema");
64
+ self.initialize_schema_version_table()?;
65
+ SchemaV2::initialize(&self.conn)?;
66
+ self.set_schema_version(2)?;
67
+ } else if current_version < target_version {
68
+ // Need to migrate
69
+ self.run_migrations(current_version, target_version)?;
70
+ } else {
71
+ info!("Database is already at latest version {}", current_version);
72
+ }
73
+
74
+ Ok(())
75
+ }
76
+
77
+ fn run_migrations(&mut self, from_version: u32, to_version: u32) -> Result<()> {
78
+ // Ensure schema version table exists
79
+ self.ensure_schema_version_table()?;
80
+
81
+ for version in (from_version + 1)..=to_version {
82
+ info!("Running migration to version {}", version);
83
+
84
+ match version {
85
+ 2 => {
86
+ // Create backup before migration
87
+ self.create_database_backup(version - 1)?;
88
+
89
+ // Run v1 to v2 migration
90
+ SchemaV2::migrate_v1_to_v2(&mut self.conn)?;
91
+
92
+ // Clean up old data after successful migration
93
+ self.cleanup_after_migration(version - 1)?;
94
+ }
95
+ _ => bail!("Unknown migration version: {}", version),
96
+ }
97
+
98
+ // Record successful migration
99
+ self.set_schema_version(version)?;
100
+
101
+ info!("Successfully migrated to version {}", version);
102
+ }
103
+
104
+ Ok(())
105
+ }
106
+
107
+ fn initialize_schema_version_table(&self) -> Result<()> {
108
+ self.conn.execute(
109
+ "CREATE TABLE IF NOT EXISTS schema_version (version INTEGER PRIMARY KEY, applied_at INTEGER NOT NULL)",
110
+ []
111
+ )?;
112
+ Ok(())
113
+ }
114
+
115
+ fn ensure_schema_version_table(&self) -> Result<()> {
116
+ let table_exists: bool = self.conn.prepare(
117
+ "SELECT 1 FROM sqlite_master WHERE type='table' AND name='schema_version'"
118
+ )?.exists([])?;
119
+
120
+ if !table_exists {
121
+ self.initialize_schema_version_table()?;
122
+ // Set initial version based on current schema
123
+ let initial_version = if self.has_v1_tables()? { 1 } else { 0 };
124
+ self.set_schema_version(initial_version)?;
125
+ }
126
+
127
+ Ok(())
128
+ }
129
+
130
+ fn set_schema_version(&self, version: u32) -> Result<()> {
131
+ let now = SystemTime::now()
132
+ .duration_since(UNIX_EPOCH)
133
+ .unwrap()
134
+ .as_secs();
135
+
136
+ self.conn.execute(
137
+ "INSERT OR REPLACE INTO schema_version (version, applied_at) VALUES (?1, ?2)",
138
+ rusqlite::params![version, now as u32]
139
+ )?;
140
+
141
+ Ok(())
142
+ }
143
+
144
+ fn create_database_backup(&self, version: u32) -> Result<()> {
145
+ info!("Creating backup before migration from version {}", version);
146
+
147
+ // Rename old tables with version suffix
148
+ self.conn.execute_batch(
149
+ r#"
150
+ ALTER TABLE embeddings RENAME TO embeddings_v1_backup;
151
+ ALTER TABLE files RENAME TO files_v1_backup;
152
+ "#
153
+ )?;
154
+
155
+ info!("Backup created successfully");
156
+ Ok(())
157
+ }
158
+
159
+ fn cleanup_after_migration(&self, old_version: u32) -> Result<()> {
160
+ info!("Cleaning up after migration from version {}", old_version);
161
+
162
+ // Verify migration was successful before dropping backups
163
+ let new_entities_count: i64 = self.conn.query_row(
164
+ "SELECT COUNT(*) FROM entities",
165
+ [],
166
+ |row| row.get(0)
167
+ )?;
168
+
169
+ if new_entities_count == 0 && old_version > 0 {
170
+ warn!("No entities found after migration, keeping backup tables");
171
+ return Ok(());
172
+ }
173
+
174
+ // Drop backup tables after successful migration
175
+ self.conn.execute_batch(
176
+ r#"
177
+ DROP TABLE IF EXISTS embeddings_v1_backup;
178
+ DROP TABLE IF EXISTS files_v1_backup;
179
+ "#
180
+ )?;
181
+
182
+ // Run VACUUM to reclaim space
183
+ debug!("Running VACUUM to reclaim database space");
184
+ self.conn.execute("VACUUM", [])?;
185
+
186
+ info!("Cleanup completed successfully");
187
+ Ok(())
188
+ }
189
+
190
+ /// Validate migration integrity
191
+ pub fn validate_migration(&self) -> Result<bool> {
192
+ info!("Validating migration integrity");
193
+
194
+ let version = self.current_version()?;
195
+ if version < 2 {
196
+ return Ok(false);
197
+ }
198
+
199
+ // Check that all required tables exist
200
+ let required_tables = vec![
201
+ "entities", "refs", "type_usage", "modules",
202
+ "entity_embeddings", "schema_version"
203
+ ];
204
+
205
+ for table in required_tables {
206
+ let exists: bool = self.conn.prepare(
207
+ &format!("SELECT 1 FROM sqlite_master WHERE type='table' AND name='{}'", table)
208
+ )?.exists([])?;
209
+
210
+ if !exists {
211
+ error!("Required table '{}' does not exist", table);
212
+ return Ok(false);
213
+ }
214
+ }
215
+
216
+ // Check indexes exist
217
+ let required_indexes = vec![
218
+ "idx_entities_kind", "idx_entities_name", "idx_entities_file_path",
219
+ "idx_refs_source", "idx_refs_target", "idx_type_usage_type_name"
220
+ ];
221
+
222
+ for index in required_indexes {
223
+ let exists: bool = self.conn.prepare(
224
+ &format!("SELECT 1 FROM sqlite_master WHERE type='index' AND name='{}'", index)
225
+ )?.exists([])?;
226
+
227
+ if !exists {
228
+ warn!("Required index '{}' does not exist", index);
229
+ // Not failing validation as indexes can be recreated
230
+ }
231
+ }
232
+
233
+ // Validate foreign key constraints
234
+ let fk_check: i64 = self.conn.query_row(
235
+ "PRAGMA foreign_key_check(entities)",
236
+ [],
237
+ |row| row.get(0)
238
+ ).unwrap_or(0);
239
+
240
+ if fk_check > 0 {
241
+ error!("Foreign key constraint violations detected: {}", fk_check);
242
+ return Ok(false);
243
+ }
244
+
245
+ info!("Migration validation passed");
246
+ Ok(true)
247
+ }
248
+
249
+ /// Get migration statistics
250
+ pub fn migration_stats(&self) -> Result<MigrationStats> {
251
+ let version = self.current_version()?;
252
+
253
+ let entities_count: i64 = if version >= 2 {
254
+ self.conn.query_row("SELECT COUNT(*) FROM entities", [], |row| row.get(0))?
255
+ } else {
256
+ self.conn.query_row("SELECT COUNT(*) FROM embeddings", [], |row| row.get(0))?
257
+ };
258
+
259
+ let files_count: i64 = self.conn.query_row("SELECT COUNT(*) FROM files", [], |row| row.get(0))?;
260
+
261
+ let refs_count: i64 = if version >= 2 {
262
+ self.conn.query_row("SELECT COUNT(*) FROM refs", [], |row| row.get(0))?
263
+ } else {
264
+ 0
265
+ };
266
+
267
+ let db_size = std::fs::metadata("index.db")
268
+ .map(|m| m.len())
269
+ .unwrap_or(0);
270
+
271
+ Ok(MigrationStats {
272
+ version,
273
+ entities_count: entities_count as usize,
274
+ files_count: files_count as usize,
275
+ refs_count: refs_count as usize,
276
+ database_size_bytes: db_size,
277
+ })
278
+ }
279
+ }
280
+
281
+ #[derive(Debug)]
282
+ pub struct MigrationStats {
283
+ pub version: u32,
284
+ pub entities_count: usize,
285
+ pub files_count: usize,
286
+ pub refs_count: usize,
287
+ pub database_size_bytes: u64,
288
+ }
289
+
290
+ #[cfg(test)]
291
+ mod tests {
292
+ use super::*;
293
+ use tempfile::tempdir;
294
+
295
+ #[test]
296
+ fn test_fresh_installation() -> Result<()> {
297
+ let dir = tempdir()?;
298
+ let db_path = dir.path().join("test_fresh.db");
299
+ let manager = MigrationManager::new(&db_path)?;
300
+
301
+ manager.migrate_to_latest()?;
302
+
303
+ assert_eq!(manager.current_version()?, 2);
304
+ assert!(manager.validate_migration()?);
305
+
306
+ Ok(())
307
+ }
308
+
309
+ #[test]
310
+ fn test_version_tracking() -> Result<()> {
311
+ let dir = tempdir()?;
312
+ let db_path = dir.path().join("test_version.db");
313
+ let manager = MigrationManager::new(&db_path)?;
314
+
315
+ // Fresh database should have version 0
316
+ assert_eq!(manager.current_version()?, 0);
317
+
318
+ manager.migrate_to_latest()?;
319
+
320
+ // Should now be at version 2
321
+ assert_eq!(manager.current_version()?, 2);
322
+
323
+ Ok(())
324
+ }
325
+ }