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
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
use std::fs;
|
|
2
|
+
use std::path::{Path, PathBuf};
|
|
3
|
+
use std::io;
|
|
4
|
+
use walkdir::{WalkDir, DirEntry};
|
|
5
|
+
|
|
6
|
+
pub fn collect_files(root_dir: &Path, index_path: &Path) -> io::Result<Vec<PathBuf>> {
|
|
7
|
+
let mut files = Vec::new();
|
|
8
|
+
|
|
9
|
+
for entry in WalkDir::new(root_dir)
|
|
10
|
+
.into_iter()
|
|
11
|
+
.filter_entry(|e| {
|
|
12
|
+
let path = e.path();
|
|
13
|
+
|
|
14
|
+
// Skip the index file itself
|
|
15
|
+
if path == index_path {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Skip specific directories
|
|
20
|
+
if let Some(name) = path.file_name().and_then(|n| n.to_str()) {
|
|
21
|
+
match name {
|
|
22
|
+
"node_modules" | "target" | "dist" | "build" => return false,
|
|
23
|
+
_ => {}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
true
|
|
28
|
+
})
|
|
29
|
+
.filter_map(|e| e.ok())
|
|
30
|
+
{
|
|
31
|
+
if entry.file_type().is_file() {
|
|
32
|
+
files.push(entry.path().to_path_buf());
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Ok(files)
|
|
37
|
+
}
|
|
@@ -7,6 +7,7 @@ use serde_json::json;
|
|
|
7
7
|
use crate::embeddings::EmbeddingsManager;
|
|
8
8
|
use crate::search_engine::SearchEngine;
|
|
9
9
|
use crate::sqlite_store::SqliteStore;
|
|
10
|
+
use local_ruvector::paths::{get_ruvector_dir, get_v1_index_dir, get_database_path};
|
|
10
11
|
|
|
11
12
|
pub struct InitCommand {
|
|
12
13
|
project_dir: PathBuf,
|
|
@@ -30,8 +31,8 @@ impl InitCommand {
|
|
|
30
31
|
self.project_dir.display()));
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
// Check if already initialized
|
|
34
|
-
let ruvector_dir =
|
|
34
|
+
// Check if already initialized in centralized location
|
|
35
|
+
let ruvector_dir = get_ruvector_dir()?;
|
|
35
36
|
if ruvector_dir.exists() && !self.force {
|
|
36
37
|
eprintln!("⚠️ RuVector already initialized. Use --force to reinitialize.");
|
|
37
38
|
return Err(anyhow!("Already initialized"));
|
|
@@ -42,19 +43,18 @@ impl InitCommand {
|
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
pub fn execute(&self) -> Result<()> {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let ruvector_dir = self.project_dir.join(".ruvector");
|
|
46
|
+
let ruvector_dir = get_ruvector_dir()?;
|
|
47
|
+
info!("Initializing centralized RuVector in: {}", ruvector_dir.display());
|
|
48
48
|
|
|
49
49
|
// Remove existing directory if forcing
|
|
50
50
|
if self.force && ruvector_dir.exists() {
|
|
51
51
|
fs::remove_dir_all(&ruvector_dir)
|
|
52
|
-
.context("Failed to remove existing
|
|
52
|
+
.context("Failed to remove existing RuVector directory")?;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
// Create directory structure
|
|
56
56
|
fs::create_dir_all(&ruvector_dir)
|
|
57
|
-
.context("Failed to create
|
|
57
|
+
.context("Failed to create RuVector directory")?;
|
|
58
58
|
|
|
59
59
|
// Create subdirectories
|
|
60
60
|
fs::create_dir_all(ruvector_dir.join("embeddings"))?;
|
|
@@ -80,7 +80,8 @@ impl InitCommand {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
fn create_config(&self) -> Result<()> {
|
|
83
|
-
let
|
|
83
|
+
let ruvector_dir = get_ruvector_dir()?;
|
|
84
|
+
let config_path = ruvector_dir.join("config.json");
|
|
84
85
|
|
|
85
86
|
let config = json!({
|
|
86
87
|
"version": "1.0.0",
|
|
@@ -100,16 +101,20 @@ impl InitCommand {
|
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
fn initialize_database(&self) -> Result<()> {
|
|
103
|
-
let db_path =
|
|
104
|
+
let db_path = get_database_path()?;
|
|
104
105
|
let store = SqliteStore::new(&db_path)?;
|
|
105
106
|
store.initialize()?;
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
// Initialize Schema V2 (entities, refs, type_usage, modules, entity_embeddings)
|
|
109
|
+
let conn = rusqlite::Connection::open(&db_path)?;
|
|
110
|
+
local_ruvector::schema_v2::SchemaV2::initialize(&conn)?;
|
|
111
|
+
|
|
112
|
+
debug!("Database initialized (V1 + V2 schemas): {}", db_path.display());
|
|
108
113
|
Ok(())
|
|
109
114
|
}
|
|
110
115
|
|
|
111
116
|
fn initialize_embeddings(&self) -> Result<()> {
|
|
112
|
-
let embeddings_dir =
|
|
117
|
+
let embeddings_dir = get_ruvector_dir()?;
|
|
113
118
|
let _ = EmbeddingsManager::new(&embeddings_dir)?;
|
|
114
119
|
|
|
115
120
|
debug!("Embeddings manager initialized");
|
|
@@ -124,4 +129,4 @@ impl InitCommand {
|
|
|
124
129
|
debug!("Search engine initialized");
|
|
125
130
|
Ok(())
|
|
126
131
|
}
|
|
127
|
-
}
|
|
132
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
use anyhow::{Result, anyhow};
|
|
1
|
+
use anyhow::{Result, Context, anyhow};
|
|
2
2
|
use std::path::{Path, PathBuf};
|
|
3
|
+
use rusqlite::Connection;
|
|
4
|
+
use tracing::{info, error};
|
|
5
|
+
|
|
6
|
+
use crate::migration_tx::MigrationWithTx;
|
|
3
7
|
|
|
4
8
|
#[derive(Debug, Clone)]
|
|
5
9
|
pub enum SourceType {
|
|
@@ -40,6 +44,35 @@ impl MigrationCommand {
|
|
|
40
44
|
}
|
|
41
45
|
}
|
|
42
46
|
|
|
47
|
+
/// Execute migration with transaction support
|
|
48
|
+
pub fn execute_with_tx(&self) -> Result<()> {
|
|
49
|
+
let db_path = self.project_dir.join(".ruvector/index_v2.db");
|
|
50
|
+
|
|
51
|
+
// Ensure database directory exists
|
|
52
|
+
std::fs::create_dir_all(db_path.parent().unwrap())
|
|
53
|
+
.context("Failed to create database directory")?;
|
|
54
|
+
|
|
55
|
+
let mut conn = Connection::open(&db_path)
|
|
56
|
+
.context("Failed to open database for migration")?;
|
|
57
|
+
|
|
58
|
+
info!("Starting migration with transaction support");
|
|
59
|
+
|
|
60
|
+
// Use the transaction-aware migration
|
|
61
|
+
match self.source_type {
|
|
62
|
+
SourceType::RuVectorPython => {
|
|
63
|
+
MigrationWithTx::migrate_v1_to_v2_atomic(&mut conn)?;
|
|
64
|
+
MigrationWithTx::validate_migration(&mut conn)?;
|
|
65
|
+
}
|
|
66
|
+
_ => {
|
|
67
|
+
// For other sources, fall back to the original method
|
|
68
|
+
self.execute()?;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
info!("Migration completed successfully");
|
|
73
|
+
Ok(())
|
|
74
|
+
}
|
|
75
|
+
|
|
43
76
|
fn migrate_from_python(&self) -> Result<()> {
|
|
44
77
|
println!("⚠️ Migration from Python RuVector not yet implemented");
|
|
45
78
|
if self.dry_run {
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
pub mod init;
|
|
2
2
|
pub mod index;
|
|
3
|
+
pub mod index_ast;
|
|
3
4
|
pub mod query;
|
|
4
5
|
pub mod stats;
|
|
5
6
|
pub mod cleanup;
|
|
6
7
|
pub mod migration;
|
|
7
8
|
pub mod reset;
|
|
8
9
|
pub mod export;
|
|
10
|
+
pub mod find;
|
|
11
|
+
pub mod refs;
|
|
9
12
|
|
|
10
13
|
// Re-export the command structs only, not internal types
|
|
11
14
|
pub use init::InitCommand;
|
|
12
15
|
pub use index::IndexCommand;
|
|
16
|
+
pub use index_ast::AstIndexCommand;
|
|
13
17
|
pub use query::{QueryCommand, BatchQueryCommand};
|
|
14
18
|
pub use stats::StatsCommand;
|
|
15
19
|
pub use cleanup::CleanupCommand;
|
|
16
20
|
pub use migration::MigrationCommand;
|
|
17
21
|
pub use reset::ResetCommand;
|
|
18
22
|
pub use export::{ExportCommand, ExportFormat};
|
|
23
|
+
pub use find::FindCommand;
|
|
24
|
+
pub use refs::RefsCommand;
|
|
@@ -62,7 +62,7 @@ impl QueryCommand {
|
|
|
62
62
|
info!("Executing query: {}", self.config.query);
|
|
63
63
|
|
|
64
64
|
// Load the search engine
|
|
65
|
-
let mut search_engine = self.search_engine.
|
|
65
|
+
let mut search_engine = self.search_engine.duplicate()?;
|
|
66
66
|
search_engine.load_or_create()?;
|
|
67
67
|
|
|
68
68
|
// Perform search
|
|
@@ -170,7 +170,7 @@ impl BatchQueryCommand {
|
|
|
170
170
|
info!("Executing batch queries from: {}", self.batch_file.display());
|
|
171
171
|
|
|
172
172
|
// Load the search engine
|
|
173
|
-
let mut search_engine = self.search_engine.
|
|
173
|
+
let mut search_engine = self.search_engine.duplicate()?;
|
|
174
174
|
search_engine.load_or_create()?;
|
|
175
175
|
|
|
176
176
|
// Read batch queries
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
use anyhow::{Result, Context};
|
|
2
|
+
use clap::Args;
|
|
3
|
+
use serde_json::{json};
|
|
4
|
+
use std::path::{Path, PathBuf};
|
|
5
|
+
use tracing::{info, debug, warn};
|
|
6
|
+
|
|
7
|
+
use crate::query_api::{QueryApi, QueryResultFormatter};
|
|
8
|
+
use crate::store_v2::{StoreV2};
|
|
9
|
+
|
|
10
|
+
#[derive(Debug, Args)]
|
|
11
|
+
pub struct RefsCommand {
|
|
12
|
+
/// Find all references to an entity by name
|
|
13
|
+
#[arg()]
|
|
14
|
+
pub entity_name: String,
|
|
15
|
+
|
|
16
|
+
/// Entity kind to search for (function, struct, enum, etc.)
|
|
17
|
+
#[arg(long)]
|
|
18
|
+
pub kind: Option<String>,
|
|
19
|
+
|
|
20
|
+
/// Reference kind filter (call, import, implement, etc.)
|
|
21
|
+
#[arg(long)]
|
|
22
|
+
pub ref_kind: Option<String>,
|
|
23
|
+
|
|
24
|
+
/// Limit search to specific file
|
|
25
|
+
#[arg(long)]
|
|
26
|
+
pub file: Option<String>,
|
|
27
|
+
|
|
28
|
+
/// Maximum number of results to return
|
|
29
|
+
#[arg(short, long, default_value = "50")]
|
|
30
|
+
pub limit: usize,
|
|
31
|
+
|
|
32
|
+
/// Output format
|
|
33
|
+
#[arg(long, value_enum, default_value = "simple")]
|
|
34
|
+
pub format: RefsOutputFormat,
|
|
35
|
+
|
|
36
|
+
/// Show detailed context
|
|
37
|
+
#[arg(long)]
|
|
38
|
+
pub detailed: bool,
|
|
39
|
+
|
|
40
|
+
/// Output file (optional)
|
|
41
|
+
#[arg(long)]
|
|
42
|
+
pub output: Option<PathBuf>,
|
|
43
|
+
|
|
44
|
+
/// Group results by file
|
|
45
|
+
#[arg(long)]
|
|
46
|
+
pub group_by_file: bool,
|
|
47
|
+
|
|
48
|
+
/// Include only inbound references (references to this entity)
|
|
49
|
+
#[arg(long)]
|
|
50
|
+
pub inbound: bool,
|
|
51
|
+
|
|
52
|
+
/// Include only outbound references (references from this entity)
|
|
53
|
+
#[arg(long)]
|
|
54
|
+
pub outbound: bool,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#[derive(Debug, Clone, clap::ValueEnum)]
|
|
58
|
+
pub enum RefsOutputFormat {
|
|
59
|
+
Simple,
|
|
60
|
+
Json,
|
|
61
|
+
Detailed,
|
|
62
|
+
Tree,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
impl RefsCommand {
|
|
66
|
+
pub fn execute(&self, project_dir: &Path) -> Result<()> {
|
|
67
|
+
// Initialize store and query API
|
|
68
|
+
let db_path = project_dir.join(".ruvector").join("index.db");
|
|
69
|
+
let store = StoreV2::new(&db_path)
|
|
70
|
+
.context("Failed to open database")?;
|
|
71
|
+
let query_api = QueryApi::new(store);
|
|
72
|
+
|
|
73
|
+
// Build a path-like search term
|
|
74
|
+
let search_term = if let Some(kind) = &self.kind {
|
|
75
|
+
format!("{}::{}", kind, self.entity_name)
|
|
76
|
+
} else {
|
|
77
|
+
self.entity_name.clone()
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// Find references using the query API
|
|
81
|
+
let mut result = query_api.find_references_to_path(&search_term)?;
|
|
82
|
+
|
|
83
|
+
// Filter results based on command options
|
|
84
|
+
let filtered_results: Vec<_> = result.results.into_iter()
|
|
85
|
+
.filter(|item| {
|
|
86
|
+
// Filter by file if specified
|
|
87
|
+
if let Some(file) = &self.file {
|
|
88
|
+
if !item.entity.file_path.contains(file) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Additional filtering could be added here for ref_kind
|
|
94
|
+
true
|
|
95
|
+
})
|
|
96
|
+
.collect();
|
|
97
|
+
|
|
98
|
+
// Update the result with filtered items
|
|
99
|
+
result.results = filtered_results;
|
|
100
|
+
result.total_count = result.results.len();
|
|
101
|
+
|
|
102
|
+
// Apply limit
|
|
103
|
+
let limited_result = crate::query_api::QueryResult {
|
|
104
|
+
query_type: result.query_type,
|
|
105
|
+
results: result.results.into_iter().take(self.limit).collect(),
|
|
106
|
+
total_count: result.total_count,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Format and output results
|
|
110
|
+
let output = match self.format {
|
|
111
|
+
RefsOutputFormat::Simple => self.format_simple(&limited_result),
|
|
112
|
+
RefsOutputFormat::Json => limited_result.format_json()?,
|
|
113
|
+
RefsOutputFormat::Detailed => limited_result.format_detailed(),
|
|
114
|
+
RefsOutputFormat::Tree => self.format_tree(&limited_result),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Write output
|
|
118
|
+
if let Some(output_path) = &self.output {
|
|
119
|
+
std::fs::write(output_path, output)
|
|
120
|
+
.context("Failed to write output file")?;
|
|
121
|
+
info!("Results written to: {}", output_path.display());
|
|
122
|
+
} else {
|
|
123
|
+
println!("{}", output);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Show summary if we truncated results
|
|
127
|
+
if limited_result.total_count > self.limit {
|
|
128
|
+
eprintln!("\n⚠️ Showing {} of {} total results", self.limit, limited_result.total_count);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
info!("Refs command completed: {} references found", limited_result.total_count);
|
|
132
|
+
Ok(())
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
fn format_simple(&self, result: &crate::query_api::QueryResult) -> String {
|
|
136
|
+
if self.group_by_file {
|
|
137
|
+
let mut groups = std::collections::HashMap::new();
|
|
138
|
+
for item in &result.results {
|
|
139
|
+
groups.entry(&item.entity.file_path)
|
|
140
|
+
.or_insert_with(Vec::new)
|
|
141
|
+
.push(item);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let mut output = String::new();
|
|
145
|
+
for (file_path, items) in groups {
|
|
146
|
+
output.push_str(&format!("\n📁 {}\n", file_path));
|
|
147
|
+
for item in items {
|
|
148
|
+
output.push_str(&format!(" {}:{} - {}\n",
|
|
149
|
+
item.entity.line_number,
|
|
150
|
+
item.entity.name,
|
|
151
|
+
item.entity.kind.as_str()
|
|
152
|
+
));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
output.trim_start().to_string()
|
|
156
|
+
} else {
|
|
157
|
+
result.results.iter()
|
|
158
|
+
.map(|item| format!("{}:{} - {} ({})",
|
|
159
|
+
item.entity.file_path,
|
|
160
|
+
item.entity.line_number,
|
|
161
|
+
item.entity.name,
|
|
162
|
+
item.entity.kind.as_str()))
|
|
163
|
+
.collect::<Vec<_>>()
|
|
164
|
+
.join("\n")
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
fn format_tree(&self, result: &crate::query_api::QueryResult) -> String {
|
|
169
|
+
let mut tree = String::new();
|
|
170
|
+
|
|
171
|
+
// Group by file for tree view
|
|
172
|
+
let mut groups = std::collections::HashMap::new();
|
|
173
|
+
for item in &result.results {
|
|
174
|
+
groups.entry(&item.entity.file_path)
|
|
175
|
+
.or_insert_with(Vec::new)
|
|
176
|
+
.push(item);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
for (file_path, items) in groups {
|
|
180
|
+
tree.push_str(&format!("📁 {}\n", file_path));
|
|
181
|
+
|
|
182
|
+
// Group by line number to show multiple refs on same line
|
|
183
|
+
let mut line_groups = std::collections::HashMap::new();
|
|
184
|
+
for item in items {
|
|
185
|
+
line_groups.entry(item.entity.line_number)
|
|
186
|
+
.or_insert_with(Vec::new)
|
|
187
|
+
.push(item);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
for (line, items_at_line) in line_groups {
|
|
191
|
+
tree.push_str(&format!(" 📍 Line {}:\n", line));
|
|
192
|
+
for item in items_at_line {
|
|
193
|
+
tree.push_str(&format!(" ├── {} ({})\n",
|
|
194
|
+
item.entity.name,
|
|
195
|
+
item.entity.kind.as_str()
|
|
196
|
+
));
|
|
197
|
+
if let Some(context) = &item.context {
|
|
198
|
+
let first_line = context.lines().next().unwrap_or("").trim();
|
|
199
|
+
if !first_line.is_empty() {
|
|
200
|
+
tree.push_str(&format!(" │ └─ {}\n", first_line));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
tree
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
use anyhow::{Result, Context, anyhow};
|
|
2
|
-
use ndarray::Array1;
|
|
3
2
|
use serde::{Serialize, Deserialize};
|
|
4
3
|
use std::path::Path;
|
|
5
|
-
use std::
|
|
6
|
-
use
|
|
7
|
-
use
|
|
4
|
+
use std::env;
|
|
5
|
+
use reqwest;
|
|
6
|
+
use tokio;
|
|
7
|
+
use tracing::{info, debug, warn, error};
|
|
8
8
|
|
|
9
9
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
10
10
|
pub struct EmbeddingConfig {
|
|
11
11
|
pub dimension: usize,
|
|
12
12
|
pub model: String,
|
|
13
13
|
pub batch_size: usize,
|
|
14
|
+
pub api_key: Option<String>,
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
impl Default for EmbeddingConfig {
|
|
17
18
|
fn default() -> Self {
|
|
18
19
|
Self {
|
|
19
20
|
dimension: 1536,
|
|
20
|
-
model: "text-embedding-
|
|
21
|
+
model: "text-embedding-3-small".to_string(),
|
|
21
22
|
batch_size: 100,
|
|
23
|
+
api_key: env::var("OPENAI_API_KEY").ok(),
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
}
|
|
@@ -26,65 +28,112 @@ impl Default for EmbeddingConfig {
|
|
|
26
28
|
#[derive(Debug, Clone)]
|
|
27
29
|
pub struct EmbeddingsManager {
|
|
28
30
|
config: EmbeddingConfig,
|
|
29
|
-
|
|
31
|
+
client: reqwest::Client,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[derive(Debug, Serialize)]
|
|
35
|
+
struct OpenAIRequest {
|
|
36
|
+
input: Vec<String>,
|
|
37
|
+
model: String,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#[derive(Debug, Deserialize)]
|
|
41
|
+
struct OpenAIResponse {
|
|
42
|
+
data: Vec<OpenAIEmbedding>,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#[derive(Debug, Deserialize)]
|
|
46
|
+
struct OpenAIEmbedding {
|
|
47
|
+
embedding: Vec<f32>,
|
|
30
48
|
}
|
|
31
49
|
|
|
32
50
|
impl EmbeddingsManager {
|
|
33
51
|
pub fn new(cache_dir: &Path) -> Result<Self> {
|
|
34
|
-
fs::create_dir_all(cache_dir)
|
|
52
|
+
std::fs::create_dir_all(cache_dir)
|
|
35
53
|
.context("Failed to create embeddings cache directory")?;
|
|
36
54
|
|
|
37
55
|
let config = EmbeddingConfig::default();
|
|
56
|
+
let client = reqwest::Client::new();
|
|
38
57
|
|
|
39
58
|
Ok(Self {
|
|
40
59
|
config,
|
|
41
|
-
|
|
60
|
+
client,
|
|
42
61
|
})
|
|
43
62
|
}
|
|
44
63
|
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
async fn call_openai_api(&self, texts: &[String]) -> Result<Vec<Vec<f32>>> {
|
|
65
|
+
let api_key = self.config.api_key.as_ref()
|
|
66
|
+
.ok_or_else(|| anyhow!("OpenAI API key not configured"))?;
|
|
67
|
+
|
|
68
|
+
let request = OpenAIRequest {
|
|
69
|
+
input: texts.to_vec(),
|
|
70
|
+
model: self.config.model.clone(),
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
let response = self.client
|
|
74
|
+
.post("https://api.openai.com/v1/embeddings")
|
|
75
|
+
.header("Authorization", format!("Bearer {}", api_key))
|
|
76
|
+
.header("Content-Type", "application/json")
|
|
77
|
+
.json(&request)
|
|
78
|
+
.send()
|
|
79
|
+
.await
|
|
80
|
+
.context("Failed to send request to OpenAI API")?;
|
|
81
|
+
|
|
82
|
+
if !response.status().is_success() {
|
|
83
|
+
let status = response.status();
|
|
84
|
+
let error_text = response.text().await.unwrap_or_default();
|
|
85
|
+
error!("OpenAI API error: {} - {}", status, error_text);
|
|
86
|
+
return Err(anyhow!("OpenAI API request failed: {}", status));
|
|
87
|
+
}
|
|
47
88
|
|
|
48
|
-
let
|
|
89
|
+
let openai_response: OpenAIResponse = response.json().await
|
|
90
|
+
.context("Failed to parse OpenAI API response")?;
|
|
49
91
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
embeddings.push(embedding);
|
|
55
|
-
}
|
|
92
|
+
let embeddings: Vec<Vec<f32>> = openai_response.data
|
|
93
|
+
.into_iter()
|
|
94
|
+
.map(|emb| emb.embedding)
|
|
95
|
+
.collect();
|
|
56
96
|
|
|
57
|
-
info!("Generated {} embeddings", embeddings.len());
|
|
58
97
|
Ok(embeddings)
|
|
59
98
|
}
|
|
60
99
|
|
|
61
|
-
pub fn
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
100
|
+
pub fn generate_embeddings(&self, texts: &[String]) -> Result<Vec<Vec<f32>>> {
|
|
101
|
+
debug!("Generating embeddings for {} texts", texts.len());
|
|
102
|
+
|
|
103
|
+
if self.config.api_key.is_none() {
|
|
104
|
+
warn!("OpenAI API key not found, falling back to dummy embeddings");
|
|
105
|
+
let mut embeddings = Vec::with_capacity(texts.len());
|
|
106
|
+
for text in texts {
|
|
107
|
+
embeddings.push(self.generate_dummy_embedding(text));
|
|
108
|
+
}
|
|
109
|
+
info!("Generated {} dummy embeddings", embeddings.len());
|
|
110
|
+
return Ok(embeddings);
|
|
65
111
|
}
|
|
66
112
|
|
|
67
|
-
|
|
68
|
-
let
|
|
69
|
-
|
|
70
|
-
|
|
113
|
+
let mut all_embeddings = Vec::with_capacity(texts.len());
|
|
114
|
+
let rt = tokio::runtime::Runtime::new()?;
|
|
115
|
+
|
|
116
|
+
for chunk in texts.chunks(self.config.batch_size) {
|
|
117
|
+
let embeddings = rt.block_on(self.call_openai_api(chunk))
|
|
118
|
+
.context("Failed to generate embeddings from OpenAI API")?;
|
|
119
|
+
all_embeddings.extend(embeddings);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
info!("Generated {} embeddings", all_embeddings.len());
|
|
123
|
+
Ok(all_embeddings)
|
|
71
124
|
}
|
|
72
125
|
|
|
73
|
-
fn generate_dummy_embedding(&self, text: &str) ->
|
|
74
|
-
// Generate a deterministic but pseudo-random embedding based on text
|
|
126
|
+
fn generate_dummy_embedding(&self, text: &str) -> Vec<f32> {
|
|
75
127
|
let mut embedding = vec![0.0; self.config.dimension];
|
|
76
128
|
|
|
77
|
-
// Simple hash-based embedding generation
|
|
78
129
|
let bytes = text.as_bytes();
|
|
79
130
|
for (i, &byte) in bytes.iter().enumerate() {
|
|
80
131
|
let pos = (i * 7) % self.config.dimension;
|
|
81
132
|
embedding[pos] = ((byte as f32) / 255.0) * 2.0 - 1.0;
|
|
82
133
|
}
|
|
83
134
|
|
|
84
|
-
// Apply some transformations to make it more realistic
|
|
85
135
|
self.normalize_embedding(&mut embedding);
|
|
86
|
-
|
|
87
|
-
Ok(embedding)
|
|
136
|
+
embedding
|
|
88
137
|
}
|
|
89
138
|
|
|
90
139
|
fn normalize_embedding(&self, embedding: &mut [f32]) {
|
|
@@ -118,4 +167,4 @@ impl EmbeddingsManager {
|
|
|
118
167
|
.map(|emb| self.compute_similarity(query, emb))
|
|
119
168
|
.collect()
|
|
120
169
|
}
|
|
121
|
-
}
|
|
170
|
+
}
|