claude-flow-novice 2.18.13 → 2.18.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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-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-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-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 -351
- 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 +259 -103
- 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/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/security_tests.rs +154 -0
- 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-mdap-context-injection/SKILL.md +31 -10
- package/.claude/skills/cfn-mdap-error-fixer/skill.md +15 -205
- package/.claude/skills/cfn-session-handoff/SKILL.md +1 -53
- 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-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/package.json +2 -1
- package/test-epic-creator-security.sh +203 -0
- 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/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/SKILL.md +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,5 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# index-code.sh - Index codebase patterns for local RuVector
|
|
2
|
+
# index-code.sh - Index codebase patterns for local RuVector with security controls
|
|
3
3
|
|
|
4
4
|
set -e
|
|
5
5
|
|
|
@@ -7,12 +7,18 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
7
7
|
STORAGE_PATH="${HOME}/.local-ruvector"
|
|
8
8
|
DEFAULT_PATH="."
|
|
9
9
|
|
|
10
|
+
# Security configuration
|
|
11
|
+
MAX_FILES_TO_PROCESS=10000
|
|
12
|
+
MAX_DEPTH=10
|
|
13
|
+
SUSPICIOUS_PATTERNS=("node_modules" ".git" "/dist/" "/build/" "/target/" ".svn" ".hg" "__pycache__" ".pytest_cache")
|
|
14
|
+
|
|
10
15
|
# Parse arguments
|
|
11
16
|
PATH_TO_INDEX=""
|
|
12
17
|
FILE_TYPES=("")
|
|
13
18
|
PATTERNS=""
|
|
14
19
|
VERBOSE=false
|
|
15
20
|
HELP=false
|
|
21
|
+
MAX_FILES=${MAX_FILES_TO_PROCESS}
|
|
16
22
|
|
|
17
23
|
while [[ $# -gt 0 ]]; do
|
|
18
24
|
case $1 in
|
|
@@ -28,6 +34,10 @@ while [[ $# -gt 0 ]]; do
|
|
|
28
34
|
PATTERNS="$2"
|
|
29
35
|
shift 2
|
|
30
36
|
;;
|
|
37
|
+
--max-files)
|
|
38
|
+
MAX_FILES="$2"
|
|
39
|
+
shift 2
|
|
40
|
+
;;
|
|
31
41
|
--verbose)
|
|
32
42
|
VERBOSE=true
|
|
33
43
|
shift
|
|
@@ -45,12 +55,53 @@ while [[ $# -gt 0 ]]; do
|
|
|
45
55
|
esac
|
|
46
56
|
done
|
|
47
57
|
|
|
58
|
+
# Security validation functions
|
|
59
|
+
validate_path() {
|
|
60
|
+
local path="$1"
|
|
61
|
+
|
|
62
|
+
# Reject null bytes and control characters
|
|
63
|
+
if [[ "$path" =~ $'\0' ]]; then
|
|
64
|
+
echo "❌ Error: Path contains null bytes" >&2
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Reject absolute paths that aren't under the base
|
|
69
|
+
if [[ "$path" == /* && "$path" != "$PATH_TO_INDEX"/* ]]; then
|
|
70
|
+
echo "❌ Error: Absolute path outside base directory: $path" >&2
|
|
71
|
+
exit 1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Reject suspicious patterns
|
|
75
|
+
for pattern in "${SUSPICIOUS_PATTERNS[@]}"; do
|
|
76
|
+
if [[ "$path" == *"$pattern"* ]]; then
|
|
77
|
+
echo "❌ Error: Path contains suspicious pattern '$pattern': $path" >&2
|
|
78
|
+
exit 1
|
|
79
|
+
fi
|
|
80
|
+
done
|
|
81
|
+
|
|
82
|
+
# Reject paths with too many ..
|
|
83
|
+
if [[ $(echo "$path" | grep -o '\.\.' | wc -l) -gt 5 ]]; then
|
|
84
|
+
echo "❌ Error: Too many parent directory references: $path" >&2
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
validate_file_type() {
|
|
90
|
+
local ft="$1"
|
|
91
|
+
|
|
92
|
+
# Only allow alphanumeric and common extensions
|
|
93
|
+
if [[ ! "$ft" =~ ^[a-zA-Z0-9._-]+$ ]]; then
|
|
94
|
+
echo "❌ Error: Invalid file type format: $ft" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
}
|
|
98
|
+
|
|
48
99
|
# Show help
|
|
49
100
|
if [[ "$HELP" == true ]]; then
|
|
50
101
|
cat << EOF
|
|
51
102
|
Usage: index-code [OPTIONS] [PATH]
|
|
52
103
|
|
|
53
|
-
Index codebase patterns for local RuVector search
|
|
104
|
+
Index codebase patterns for local RuVector search with security controls
|
|
54
105
|
|
|
55
106
|
Arguments:
|
|
56
107
|
PATH Path to directory to index (default: current directory)
|
|
@@ -59,13 +110,21 @@ Options:
|
|
|
59
110
|
--path PATH Path to directory to index
|
|
60
111
|
--types TYPES Comma-separated file types (default: rs,py,js,ts,go,java)
|
|
61
112
|
--patterns PATTERNS Comma-separated patterns to focus on
|
|
113
|
+
--max-files N Maximum files to process (default: 10000)
|
|
62
114
|
--verbose Show detailed progress
|
|
63
115
|
--help, -h Show this help
|
|
64
116
|
|
|
117
|
+
Security Features:
|
|
118
|
+
- Path traversal protection
|
|
119
|
+
- File size limits (10MB per file)
|
|
120
|
+
- Maximum files limit
|
|
121
|
+
- Suspicious pattern detection
|
|
122
|
+
- Input sanitization
|
|
123
|
+
|
|
65
124
|
Examples:
|
|
66
125
|
index-code --path ~/projects/my-rust-app
|
|
67
126
|
index-code --types rs,py --patterns "error-handling,authentication"
|
|
68
|
-
index-code --verbose
|
|
127
|
+
index-code --max-files 5000 --verbose
|
|
69
128
|
|
|
70
129
|
EOF
|
|
71
130
|
exit 0
|
|
@@ -77,23 +136,39 @@ if [[ -z "$PATH_TO_INDEX" ]]; then
|
|
|
77
136
|
fi
|
|
78
137
|
|
|
79
138
|
if [[ ${#FILE_TYPES[@]} -eq 0 ]]; then
|
|
80
|
-
FILE_TYPES=("rs" "py" "js" "ts" "go" "java" "tsx" "jsx" "cpp" "c" "h")
|
|
139
|
+
FILE_TYPES=("rs" "py" "js" "ts" "go" "java" "tsx" "jsx" "cpp" "c" "h" "cs" "php" "rb" "swift" "kt")
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
# Validate max_files
|
|
143
|
+
if ! [[ "$MAX_FILES" =~ ^[0-9]+$ ]] || [[ "$MAX_FILES" -lt 1 ]] || [[ "$MAX_FILES" -gt 100000 ]]; then
|
|
144
|
+
echo "❌ Error: Invalid max-files value: $MAX_FILES (must be 1-100000)" >&2
|
|
145
|
+
exit 1
|
|
81
146
|
fi
|
|
82
147
|
|
|
83
148
|
# Validate path
|
|
84
|
-
|
|
85
|
-
|
|
149
|
+
validate_path "$PATH_TO_INDEX"
|
|
150
|
+
|
|
151
|
+
# Convert to absolute path and canonicalize
|
|
152
|
+
PATH_TO_INDEX="$(cd "$PATH_TO_INDEX" && pwd -P)"
|
|
153
|
+
|
|
154
|
+
# Additional security check - ensure we're not in a system directory
|
|
155
|
+
if [[ "$PATH_TO_INDEX" == /etc/* ]] || [[ "$PATH_TO_INDEX" == /usr/bin/* ]] || [[ "$PATH_TO_INDEX" == /bin/* ]] || [[ "$PATH_TO_INDEX" == /sbin/* ]]; then
|
|
156
|
+
echo "❌ Error: Cannot index system directory: $PATH_TO_INDEX" >&2
|
|
86
157
|
exit 1
|
|
87
158
|
fi
|
|
88
159
|
|
|
89
|
-
#
|
|
90
|
-
|
|
160
|
+
# Validate file types
|
|
161
|
+
for ft in "${FILE_TYPES[@]}"; do
|
|
162
|
+
validate_file_type "$ft"
|
|
163
|
+
done
|
|
91
164
|
|
|
92
165
|
# Convert array to comma-separated string for Python
|
|
93
166
|
FILE_TYPES_STR=$(IFS=','; echo "${FILE_TYPES[*]}")
|
|
94
167
|
|
|
95
168
|
echo "🔍 Indexing code patterns in: $PATH_TO_INDEX"
|
|
96
169
|
echo "📄 File types: ${FILE_TYPES[*]}"
|
|
170
|
+
echo "🔒 Security: Path traversal protection enabled"
|
|
171
|
+
echo "📊 Maximum files: $MAX_FILES"
|
|
97
172
|
if [[ -n "$PATTERNS" ]]; then
|
|
98
173
|
echo "🎯 Focusing on patterns: $PATTERNS"
|
|
99
174
|
fi
|
|
@@ -105,27 +180,61 @@ import sys
|
|
|
105
180
|
import os
|
|
106
181
|
import json
|
|
107
182
|
import hashlib
|
|
183
|
+
import stat
|
|
108
184
|
from pathlib import Path
|
|
109
185
|
from search_engine_v2 import SearchEngine
|
|
186
|
+
from security import SecurityError, PathValidator, ResourceMonitor, safe_file_read
|
|
187
|
+
|
|
188
|
+
# Security checks
|
|
189
|
+
def is_safe_file(file_path):
|
|
190
|
+
\"\"\"Check if file is safe to process\"\"\"
|
|
191
|
+
try:
|
|
192
|
+
# Check file permissions
|
|
193
|
+
file_stat = file_path.stat()
|
|
194
|
+
|
|
195
|
+
# Reject world-writable files
|
|
196
|
+
if file_stat.st_mode & stat.S_IWOTH:
|
|
197
|
+
return False, \"File is world-writable\"
|
|
198
|
+
|
|
199
|
+
# Reject files with suspicious permissions
|
|
200
|
+
if file_stat.st_mode & 0o7777 != 0o644 and file_stat.st_mode & 0o7777 != 0o755:
|
|
201
|
+
return False, f\"Suspicious file permissions: {oct(file_stat.st_mode & 0o7777)}\"
|
|
202
|
+
|
|
203
|
+
# Check if file is owned by current user (on Unix systems)
|
|
204
|
+
if hasattr(os, 'getuid') and file_stat.st_uid != os.getuid():
|
|
205
|
+
return False, \"File not owned by current user\"
|
|
206
|
+
|
|
207
|
+
return True, None
|
|
208
|
+
|
|
209
|
+
except Exception as e:
|
|
210
|
+
return False, f\"Error checking file: {e}\"
|
|
110
211
|
|
|
111
212
|
def generate_pattern_id(file_path, content):
|
|
112
|
-
\"\"\"Generate unique pattern ID\"\"\"
|
|
113
|
-
|
|
213
|
+
\"\"\"Generate unique pattern ID with security\"\"\"
|
|
214
|
+
# Use SHA-256 for better security
|
|
215
|
+
hash_input = f'{file_path}:{len(content)}:{hashlib.sha256(content.encode()).hexdigest()}'
|
|
216
|
+
hash_obj = hashlib.md5(hash_input.encode('utf-8'))
|
|
114
217
|
return f'pattern_{hash_obj.hexdigest()[:16]}'
|
|
115
218
|
|
|
116
219
|
def extract_functions(content, file_type):
|
|
117
|
-
\"\"\"Extract functions/classes from code\"\"\"
|
|
220
|
+
\"\"\"Extract functions/classes from code safely\"\"\"
|
|
118
221
|
patterns = []
|
|
119
222
|
|
|
223
|
+
# Limit content size for processing
|
|
224
|
+
if len(content) > 50000:
|
|
225
|
+
content = content[:50000]
|
|
226
|
+
|
|
120
227
|
# Simple extraction based on language
|
|
121
228
|
if file_type == 'rs':
|
|
122
|
-
# Rust functions, structs, impls
|
|
123
229
|
import re
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
impl_pattern = r'^impl\s+(\w+)\s*(for\s+(\w+))?'
|
|
230
|
+
# Limit regex operations
|
|
231
|
+
lines = content.split('\\n')[:1000] # Limit to first 1000 lines
|
|
127
232
|
|
|
128
|
-
|
|
233
|
+
fn_pattern = r'^(pub\\s+)?(async\\s+)?(unsafe\\s+)?fn\\s+(\\w+)'
|
|
234
|
+
struct_pattern = r'^(pub\\s+)?struct\\s+(\\w+)'
|
|
235
|
+
impl_pattern = r'^impl\\s+(\\w+)\\s*(for\\s+(\\w+))?'
|
|
236
|
+
|
|
237
|
+
for i, line in enumerate(lines):
|
|
129
238
|
for pattern, type_name in [(fn_pattern, 'function'),
|
|
130
239
|
(struct_pattern, 'struct'),
|
|
131
240
|
(impl_pattern, 'impl')]:
|
|
@@ -133,117 +242,204 @@ def extract_functions(content, file_type):
|
|
|
133
242
|
if match:
|
|
134
243
|
patterns.append({
|
|
135
244
|
'type': type_name,
|
|
136
|
-
'name': match.groups()[-1],
|
|
245
|
+
'name': match.groups()[-1][:100], # Limit name length
|
|
137
246
|
'line': i + 1,
|
|
138
|
-
'signature': line.strip()
|
|
247
|
+
'signature': line.strip()[:200] # Limit signature length
|
|
139
248
|
})
|
|
140
249
|
|
|
141
250
|
elif file_type == 'py':
|
|
142
|
-
# Python functions, classes
|
|
143
251
|
import re
|
|
144
|
-
|
|
145
|
-
|
|
252
|
+
lines = content.split('\\n')[:1000]
|
|
253
|
+
|
|
254
|
+
fn_pattern = r'^\\s*def\\s+(\\w+)'
|
|
255
|
+
class_pattern = r'^\\s*class\\s+(\\w+)'
|
|
146
256
|
|
|
147
|
-
for i, line in enumerate(
|
|
257
|
+
for i, line in enumerate(lines):
|
|
148
258
|
if re.match(fn_pattern, line):
|
|
149
259
|
patterns.append({
|
|
150
260
|
'type': 'function',
|
|
151
|
-
'name': re.match(fn_pattern, line).group(1),
|
|
261
|
+
'name': re.match(fn_pattern, line).group(1)[:100],
|
|
152
262
|
'line': i + 1,
|
|
153
|
-
'signature': line.strip()
|
|
263
|
+
'signature': line.strip()[:200]
|
|
154
264
|
})
|
|
155
265
|
elif re.match(class_pattern, line):
|
|
156
266
|
patterns.append({
|
|
157
267
|
'type': 'class',
|
|
158
|
-
'name': re.match(class_pattern, line).group(1),
|
|
268
|
+
'name': re.match(class_pattern, line).group(1)[:100],
|
|
159
269
|
'line': i + 1,
|
|
160
|
-
'signature': line.strip()
|
|
270
|
+
'signature': line.strip()[:200]
|
|
161
271
|
})
|
|
162
272
|
|
|
163
|
-
return patterns
|
|
273
|
+
return patterns[:50] # Limit number of patterns per file
|
|
274
|
+
|
|
275
|
+
# Initialize security
|
|
276
|
+
try:
|
|
277
|
+
validator = PathValidator('${PATH_TO_INDEX}')
|
|
278
|
+
monitor = ResourceMonitor()
|
|
164
279
|
|
|
165
|
-
# Initialize engine
|
|
166
|
-
engine = SearchEngine('${STORAGE_PATH}/storage')
|
|
280
|
+
# Initialize engine with security
|
|
281
|
+
engine = SearchEngine('${STORAGE_PATH}/storage')
|
|
167
282
|
|
|
168
|
-
|
|
169
|
-
file_types = '${FILE_TYPES_STR}'.split(',')
|
|
170
|
-
verbose = '${VERBOSE}' == 'true'
|
|
283
|
+
print('📂 Scanning files with security checks...')
|
|
171
284
|
|
|
172
|
-
#
|
|
173
|
-
|
|
174
|
-
|
|
285
|
+
# Parse file types from shell
|
|
286
|
+
file_types = '${FILE_TYPES_STR}'.split(',')
|
|
287
|
+
verbose = '${VERBOSE}' == 'true'
|
|
288
|
+
max_files = ${MAX_FILES}
|
|
175
289
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
pattern = f'**/*.{file_type}'
|
|
182
|
-
files = list(Path('${PATH_TO_INDEX}').rglob(pattern))
|
|
290
|
+
# Index files with security
|
|
291
|
+
indexed_count = 0
|
|
292
|
+
pattern_count = 0
|
|
293
|
+
skipped_count = 0
|
|
294
|
+
error_count = 0
|
|
183
295
|
|
|
184
|
-
for
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if any(skip in path_str for skip in ['node_modules', '.git', '/dist/', '/build/', '/target/']):
|
|
296
|
+
for file_type in file_types:
|
|
297
|
+
file_type = file_type.strip()
|
|
298
|
+
if not file_type:
|
|
188
299
|
continue
|
|
189
300
|
|
|
190
|
-
|
|
191
|
-
try:
|
|
192
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
|
193
|
-
content = f.read()
|
|
301
|
+
pattern = f'**/*.{file_type}'
|
|
194
302
|
|
|
195
|
-
|
|
303
|
+
# Use pathlib's rglob with depth limit
|
|
304
|
+
try:
|
|
305
|
+
files = list(Path('${PATH_TO_INDEX}').rglob(pattern))
|
|
306
|
+
except Exception as e:
|
|
307
|
+
print(f'⚠️ Error scanning for {file_type} files: {e}')
|
|
308
|
+
continue
|
|
309
|
+
|
|
310
|
+
# Limit total files
|
|
311
|
+
if indexed_count >= max_files:
|
|
312
|
+
print(f'⚠️ Reached maximum file limit ({max_files}), stopping')
|
|
313
|
+
break
|
|
314
|
+
|
|
315
|
+
for file_path in files:
|
|
316
|
+
# Check file limit
|
|
317
|
+
if indexed_count >= max_files:
|
|
318
|
+
break
|
|
319
|
+
|
|
320
|
+
if file_path.is_file():
|
|
321
|
+
try:
|
|
322
|
+
# Validate path
|
|
323
|
+
safe_path = validator.validate_path(file_path)
|
|
324
|
+
|
|
325
|
+
# Additional safety checks
|
|
326
|
+
is_safe, reason = is_safe_file(safe_path)
|
|
327
|
+
if not is_safe:
|
|
328
|
+
if verbose:
|
|
329
|
+
print(f' ⚠️ Skipped {file_path}: {reason}')
|
|
330
|
+
skipped_count += 1
|
|
331
|
+
continue
|
|
332
|
+
|
|
333
|
+
# Check file size before reading
|
|
334
|
+
monitor.check_file_size(safe_path)
|
|
335
|
+
|
|
336
|
+
# Safely read file
|
|
337
|
+
content = safe_file_read(safe_path)
|
|
338
|
+
|
|
339
|
+
# Skip very small files
|
|
340
|
+
if len(content) < 50:
|
|
341
|
+
continue
|
|
342
|
+
|
|
343
|
+
# Limit content size
|
|
344
|
+
if len(content) > 1000000: # 1MB limit
|
|
345
|
+
content = content[:1000000]
|
|
346
|
+
if verbose:
|
|
347
|
+
print(f' ⚠️ Truncated large file: {file_path}')
|
|
348
|
+
|
|
349
|
+
# Generate pattern ID
|
|
350
|
+
pattern_id = generate_pattern_id(str(safe_path), content)
|
|
351
|
+
|
|
352
|
+
# Extract functions/classes safely
|
|
353
|
+
patterns = extract_functions(content, file_type)
|
|
354
|
+
|
|
355
|
+
# Prepare metadata with security
|
|
356
|
+
metadata = {
|
|
357
|
+
'file_size': len(content),
|
|
358
|
+
'line_count': len(content.split('\\n')),
|
|
359
|
+
'patterns': patterns,
|
|
360
|
+
'last_modified': safe_path.stat().st_mtime,
|
|
361
|
+
'indexed_by': 'secure-index-code',
|
|
362
|
+
'security_verified': True
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
# Store pattern with security
|
|
366
|
+
success = engine.add_pattern(
|
|
367
|
+
pattern_id=pattern_id,
|
|
368
|
+
file_path=str(safe_path),
|
|
369
|
+
file_type=file_type,
|
|
370
|
+
content=content,
|
|
371
|
+
metadata=metadata
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
if success:
|
|
375
|
+
indexed_count += 1
|
|
376
|
+
pattern_count += len(patterns)
|
|
377
|
+
monitor.record_file_processed(len(content))
|
|
378
|
+
|
|
379
|
+
if verbose and indexed_count % 100 == 0:
|
|
380
|
+
stats = monitor.get_stats()
|
|
381
|
+
print(f' 📊 Processed {indexed_count} files, {stats[\"bytes_processed\"]:,} bytes')
|
|
382
|
+
else:
|
|
383
|
+
error_count += 1
|
|
384
|
+
|
|
385
|
+
except SecurityError as e:
|
|
386
|
+
if verbose:
|
|
387
|
+
print(f' 🔒 Security violation: {file_path} - {e}')
|
|
388
|
+
skipped_count += 1
|
|
389
|
+
continue
|
|
390
|
+
except Exception as e:
|
|
391
|
+
if verbose:
|
|
392
|
+
print(f' ⚠️ Skipped {file_path}: {e}')
|
|
393
|
+
error_count += 1
|
|
196
394
|
continue
|
|
197
395
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
print(f' Total patterns: {stats[\"total_patterns\"]}')
|
|
239
|
-
print(f' Average success rate: {stats[\"avg_success_rate\"]:.2f}')
|
|
240
|
-
print(f' Total usage: {stats[\"total_usage\"]}')
|
|
241
|
-
print(f' File types: {stats[\"unique_file_types\"]}')
|
|
396
|
+
print(f'\\n🎉 Indexing completed with security controls!')
|
|
397
|
+
print(f' ✅ Successfully indexed: {indexed_count} files')
|
|
398
|
+
print(f' 📋 Total patterns: {pattern_count}')
|
|
399
|
+
print(f' ⚠️ Skipped files: {skipped_count}')
|
|
400
|
+
print(f' ❌ Errors: {error_count}')
|
|
401
|
+
print(f' 📍 Storage: ${STORAGE_PATH}')
|
|
402
|
+
|
|
403
|
+
# Show resource usage
|
|
404
|
+
stats = monitor.get_stats()
|
|
405
|
+
print(f'\\n📊 Resource Usage:')
|
|
406
|
+
print(f' Files processed: {stats[\"files_processed\"]:,}')
|
|
407
|
+
print(f' Bytes processed: {stats[\"bytes_processed\"]:,}')
|
|
408
|
+
print(f' Processing time: {stats[\"elapsed_seconds\"]:.2f}s')
|
|
409
|
+
print(f' Throughput: {stats[\"bytes_per_second\"]:,.0f} bytes/s')
|
|
410
|
+
|
|
411
|
+
# Show stats
|
|
412
|
+
stats = engine.get_stats()
|
|
413
|
+
print(f'\\n📈 Database Stats:')
|
|
414
|
+
print(f' Total patterns: {stats[\"total_patterns\"]:,}')
|
|
415
|
+
print(f' Average success rate: {stats[\"avg_success_rate\"]:.2f}')
|
|
416
|
+
print(f' Total usage: {stats[\"total_usage\"]:,}')
|
|
417
|
+
print(f' Unique file types: {stats[\"unique_file_types\"]}')
|
|
418
|
+
print(f' Database size: {stats[\"database_size_bytes\"] / (1024*1024):.1f} MB')
|
|
419
|
+
print(f' Total embeddings: {stats[\"total_embeddings\"]:,}')
|
|
420
|
+
|
|
421
|
+
# Security summary
|
|
422
|
+
print(f'\\n🔒 Security Summary:')
|
|
423
|
+
print(f' ✅ Path traversal protection: Active')
|
|
424
|
+
print(f' ✅ File size limits: Enforced')
|
|
425
|
+
print(f' ✅ Input sanitization: Active')
|
|
426
|
+
print(f' ✅ Permission checks: Active')
|
|
427
|
+
|
|
428
|
+
except SecurityError as e:
|
|
429
|
+
print(f'\\n❌ Security error: {e}')
|
|
430
|
+
sys.exit(1)
|
|
431
|
+
except Exception as e:
|
|
432
|
+
print(f'\\n❌ Unexpected error: {e}')
|
|
433
|
+
import traceback
|
|
434
|
+
traceback.print_exc()
|
|
435
|
+
sys.exit(1)
|
|
242
436
|
"
|
|
243
437
|
|
|
244
438
|
echo ""
|
|
245
|
-
echo "✅ Indexing complete!"
|
|
439
|
+
echo "✅ Indexing complete with security validation!"
|
|
440
|
+
echo "🔒 Security features were applied during indexing"
|
|
246
441
|
echo "💡 Query patterns with: query-local --pattern 'your search term'"
|
|
442
|
+
echo "📊 View stats: query-local --stats"
|
|
247
443
|
|
|
248
444
|
# Make script executable
|
|
249
445
|
chmod +x "${BASH_SOURCE[0]}"
|