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