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,620 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# CFN Epic Creator - Test Invoke Script
|
|
5
|
+
# Comprehensive test suite for epic-creator skill
|
|
6
|
+
|
|
7
|
+
# Configuration
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
INVOKE_SCRIPT="${SCRIPT_DIR}/invoke.sh"
|
|
10
|
+
VALIDATE_SCRIPT="${SCRIPT_DIR}/validate-epic.sh"
|
|
11
|
+
PARSE_SCRIPT="${SCRIPT_DIR}/parse-personas.sh"
|
|
12
|
+
ESTIMATE_SCRIPT="${SCRIPT_DIR}/estimate-costs.sh"
|
|
13
|
+
|
|
14
|
+
# Test data
|
|
15
|
+
TEST_EPIC_DESCRIPTION="Build a real-time analytics dashboard with user authentication, data visualization, and automated reporting capabilities"
|
|
16
|
+
TEST_OUTPUT_DIR="/tmp/epic-creator-tests"
|
|
17
|
+
TEST_EPIC_FILE="${TEST_OUTPUT_DIR}/test-epic.json"
|
|
18
|
+
|
|
19
|
+
# Colors for output
|
|
20
|
+
RED='\033[0;31m'
|
|
21
|
+
GREEN='\033[0;32m'
|
|
22
|
+
YELLOW='\033[1;33m'
|
|
23
|
+
BLUE='\033[0;34m'
|
|
24
|
+
CYAN='\033[0;36m'
|
|
25
|
+
NC='\033[0m' # No Color
|
|
26
|
+
|
|
27
|
+
# Test counters
|
|
28
|
+
TESTS_TOTAL=0
|
|
29
|
+
TESTS_PASSED=0
|
|
30
|
+
TESTS_FAILED=0
|
|
31
|
+
|
|
32
|
+
# Logging functions
|
|
33
|
+
log_info() {
|
|
34
|
+
echo -e "${BLUE}[INFO]${NC} $*"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
log_success() {
|
|
38
|
+
echo -e "${GREEN}[PASS]${NC} $*"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
log_warning() {
|
|
42
|
+
echo -e "${YELLOW}[WARN]${NC} $*"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
log_error() {
|
|
46
|
+
echo -e "${RED}[FAIL]${NC} $*" >&2
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
log_test() {
|
|
50
|
+
echo -e "${CYAN}[TEST]${NC} $*"
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Test utilities
|
|
54
|
+
test_start() {
|
|
55
|
+
local test_name="$1"
|
|
56
|
+
TESTS_TOTAL=$((TESTS_TOTAL + 1))
|
|
57
|
+
echo ""
|
|
58
|
+
log_test "Running: $test_name"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
test_pass() {
|
|
62
|
+
local message="$1"
|
|
63
|
+
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
64
|
+
log_success "$message"
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
test_fail() {
|
|
68
|
+
local message="$1"
|
|
69
|
+
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
70
|
+
log_error "$message"
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Cleanup function
|
|
74
|
+
cleanup() {
|
|
75
|
+
if [[ -d "$TEST_OUTPUT_DIR" ]]; then
|
|
76
|
+
rm -rf "$TEST_OUTPUT_DIR"
|
|
77
|
+
fi
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# Setup test environment
|
|
81
|
+
setup() {
|
|
82
|
+
log_info "Setting up test environment..."
|
|
83
|
+
cleanup
|
|
84
|
+
mkdir -p "$TEST_OUTPUT_DIR"
|
|
85
|
+
|
|
86
|
+
# Check if jq is available
|
|
87
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
88
|
+
log_error "Required command 'jq' not found. Please install jq to run tests."
|
|
89
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Check if scripts are executable
|
|
93
|
+
for script in "$INVOKE_SCRIPT" "$VALIDATE_SCRIPT" "$PARSE_SCRIPT" "$ESTIMATE_SCRIPT"; do
|
|
94
|
+
if [[ -f "$script" ]]; then
|
|
95
|
+
chmod +x "$script"
|
|
96
|
+
else
|
|
97
|
+
log_error "Script not found: $script"
|
|
98
|
+
exit 1
|
|
99
|
+
fi
|
|
100
|
+
done
|
|
101
|
+
|
|
102
|
+
log_success "Test environment ready"
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# Test help functionality
|
|
106
|
+
test_help() {
|
|
107
|
+
test_start "Help functionality"
|
|
108
|
+
|
|
109
|
+
# Test invoke.sh help
|
|
110
|
+
if "$INVOKE_SCRIPT" --help | grep -q "CFN Epic Creator"; then
|
|
111
|
+
test_pass "invoke.sh help displayed correctly"
|
|
112
|
+
else
|
|
113
|
+
test_fail "invoke.sh help not displayed"
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# Test validate-epic.sh help
|
|
117
|
+
if "$VALIDATE_SCRIPT" --help | grep -q "Validate Epic JSON"; then
|
|
118
|
+
test_pass "validate-epic.sh help displayed correctly"
|
|
119
|
+
else
|
|
120
|
+
test_fail "validate-epic.sh help not displayed"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Test parse-personas.sh help
|
|
124
|
+
if "$PARSE_SCRIPT" --help | grep -q "Parse Personas"; then
|
|
125
|
+
test_pass "parse-personas.sh help displayed correctly"
|
|
126
|
+
else
|
|
127
|
+
test_fail "parse-personas.sh help not displayed"
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
# Test estimate-costs.sh help
|
|
131
|
+
if "$ESTIMATE_SCRIPT" --help | grep -q "Estimate Costs"; then
|
|
132
|
+
test_pass "estimate-costs.sh help displayed correctly"
|
|
133
|
+
else
|
|
134
|
+
test_fail "estimate-costs.sh help not displayed"
|
|
135
|
+
fi
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
# Test argument validation
|
|
139
|
+
test_argument_validation() {
|
|
140
|
+
test_start "Argument validation"
|
|
141
|
+
|
|
142
|
+
# Test missing epic description
|
|
143
|
+
if "$INVOKE_SCRIPT" 2>&1 | grep -q "Missing required epic description"; then
|
|
144
|
+
test_pass "Missing epic description error displayed"
|
|
145
|
+
else
|
|
146
|
+
test_fail "Missing epic description not detected"
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# Test invalid mode
|
|
150
|
+
if "$INVOKE_SCRIPT" "test" --mode=invalid 2>&1 | grep -q "Invalid mode"; then
|
|
151
|
+
test_pass "Invalid mode error displayed"
|
|
152
|
+
else
|
|
153
|
+
test_fail "Invalid mode not detected"
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# Test unknown option
|
|
157
|
+
if "$INVOKE_SCRIPT" "test" --unknown-option 2>&1 | grep -q "Unknown option"; then
|
|
158
|
+
test_pass "Unknown option error displayed"
|
|
159
|
+
else
|
|
160
|
+
test_fail "Unknown option not detected"
|
|
161
|
+
fi
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# Test epic generation
|
|
165
|
+
test_epic_generation() {
|
|
166
|
+
test_start "Epic generation"
|
|
167
|
+
|
|
168
|
+
# Generate epic with all modes
|
|
169
|
+
local modes=("mvp" "standard" "enterprise")
|
|
170
|
+
|
|
171
|
+
for mode in "${modes[@]}"; do
|
|
172
|
+
local output_file="${TEST_OUTPUT_DIR}/epic-${mode}.json"
|
|
173
|
+
|
|
174
|
+
if "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
175
|
+
--mode="$mode" \
|
|
176
|
+
--output="$output_file" \
|
|
177
|
+
--verbose > "${TEST_OUTPUT_DIR}/invoke-${mode}.log" 2>&1; then
|
|
178
|
+
|
|
179
|
+
if [[ -f "$output_file" ]]; then
|
|
180
|
+
test_pass "Epic generated successfully in $mode mode"
|
|
181
|
+
|
|
182
|
+
# Validate generated JSON
|
|
183
|
+
if "$VALIDATE_SCRIPT" "$output_file" >/dev/null 2>&1; then
|
|
184
|
+
test_pass "Generated epic JSON is valid for $mode mode"
|
|
185
|
+
else
|
|
186
|
+
test_fail "Generated epic JSON is invalid for $mode mode"
|
|
187
|
+
fi
|
|
188
|
+
else
|
|
189
|
+
test_fail "Epic file not created for $mode mode"
|
|
190
|
+
fi
|
|
191
|
+
else
|
|
192
|
+
test_fail "Epic generation failed for $mode mode"
|
|
193
|
+
fi
|
|
194
|
+
done
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
# Test validate functionality
|
|
198
|
+
test_validation() {
|
|
199
|
+
test_start "Validation functionality"
|
|
200
|
+
|
|
201
|
+
# Generate a test epic first
|
|
202
|
+
if ! "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
203
|
+
--output="$TEST_EPIC_FILE" >/dev/null 2>&1; then
|
|
204
|
+
test_fail "Failed to generate test epic for validation"
|
|
205
|
+
return
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
# Test normal validation
|
|
209
|
+
if "$VALIDATE_SCRIPT" "$TEST_EPIC_FILE" >/dev/null 2>&1; then
|
|
210
|
+
test_pass "Normal validation passed"
|
|
211
|
+
else
|
|
212
|
+
test_fail "Normal validation failed"
|
|
213
|
+
fi
|
|
214
|
+
|
|
215
|
+
# Test verbose validation
|
|
216
|
+
if "$VALIDATE_SCRIPT" "$TEST_EPIC_FILE" --verbose > "${TEST_OUTPUT_DIR}/validation.log" 2>&1; then
|
|
217
|
+
test_pass "Verbose validation passed"
|
|
218
|
+
else
|
|
219
|
+
test_fail "Verbose validation failed"
|
|
220
|
+
fi
|
|
221
|
+
|
|
222
|
+
# Test strict validation (should pass if generated correctly)
|
|
223
|
+
if "$VALIDATE_SCRIPT" "$TEST_EPIC_FILE" --strict >/dev/null 2>&1; then
|
|
224
|
+
test_pass "Strict validation passed"
|
|
225
|
+
else
|
|
226
|
+
test_warning "Strict validation failed (may have warnings)"
|
|
227
|
+
fi
|
|
228
|
+
|
|
229
|
+
# Test invalid file
|
|
230
|
+
echo '{"invalid": "json"}' > "${TEST_OUTPUT_DIR}/invalid.json"
|
|
231
|
+
if ! "$VALIDATE_SCRIPT" "${TEST_OUTPUT_DIR}/invalid.json" >/dev/null 2>&1; then
|
|
232
|
+
test_pass "Invalid JSON rejected"
|
|
233
|
+
else
|
|
234
|
+
test_fail "Invalid JSON accepted"
|
|
235
|
+
fi
|
|
236
|
+
|
|
237
|
+
# Test missing file
|
|
238
|
+
if ! "$VALIDATE_SCRIPT" "${TEST_OUTPUT_DIR}/nonexistent.json" >/dev/null 2>&1; then
|
|
239
|
+
test_pass "Missing file rejected"
|
|
240
|
+
else
|
|
241
|
+
test_fail "Missing file accepted"
|
|
242
|
+
fi
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
# Test persona parsing
|
|
246
|
+
test_persona_parsing() {
|
|
247
|
+
test_start "Persona parsing functionality"
|
|
248
|
+
|
|
249
|
+
# Generate a test epic first
|
|
250
|
+
if ! "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
251
|
+
--output="$TEST_EPIC_FILE" >/dev/null 2>&1; then
|
|
252
|
+
test_fail "Failed to generate test epic for persona parsing"
|
|
253
|
+
return
|
|
254
|
+
fi
|
|
255
|
+
|
|
256
|
+
# Test parsing all personas
|
|
257
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" > "${TEST_OUTPUT_DIR}/parse-all.log" 2>&1; then
|
|
258
|
+
test_pass "Parsed all personas successfully"
|
|
259
|
+
else
|
|
260
|
+
test_fail "Failed to parse all personas"
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
# Test parsing specific persona
|
|
264
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --persona=architect > "${TEST_OUTPUT_DIR}/parse-architect.log" 2>&1; then
|
|
265
|
+
test_pass "Parsed architect persona successfully"
|
|
266
|
+
else
|
|
267
|
+
test_fail "Failed to parse architect persona"
|
|
268
|
+
fi
|
|
269
|
+
|
|
270
|
+
# Test filtering by type
|
|
271
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --type=blocking > "${TEST_OUTPUT_DIR}/parse-blocking.log" 2>&1; then
|
|
272
|
+
test_pass "Filtered by blocking type successfully"
|
|
273
|
+
else
|
|
274
|
+
test_fail "Failed to filter by blocking type"
|
|
275
|
+
fi
|
|
276
|
+
|
|
277
|
+
# Test filtering by priority
|
|
278
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --priority=critical > "${TEST_OUTPUT_DIR}/parse-critical.log" 2>&1; then
|
|
279
|
+
test_pass "Filtered by critical priority successfully"
|
|
280
|
+
else
|
|
281
|
+
test_fail "Failed to filter by critical priority"
|
|
282
|
+
fi
|
|
283
|
+
|
|
284
|
+
# Test JSON format
|
|
285
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --format=json | jq . >/dev/null 2>&1; then
|
|
286
|
+
test_pass "JSON format output is valid"
|
|
287
|
+
else
|
|
288
|
+
test_fail "JSON format output is invalid"
|
|
289
|
+
fi
|
|
290
|
+
|
|
291
|
+
# Test markdown format
|
|
292
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --format=markdown > "${TEST_OUTPUT_DIR}/parse-markdown.md" 2>&1; then
|
|
293
|
+
test_pass "Markdown format generated successfully"
|
|
294
|
+
else
|
|
295
|
+
test_fail "Failed to generate markdown format"
|
|
296
|
+
fi
|
|
297
|
+
|
|
298
|
+
# Test count only
|
|
299
|
+
if "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --count > "${TEST_OUTPUT_DIR}/parse-count.log" 2>&1; then
|
|
300
|
+
test_pass "Count only mode works"
|
|
301
|
+
else
|
|
302
|
+
test_fail "Count only mode failed"
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
# Test invalid persona
|
|
306
|
+
if ! "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --persona=invalid >/dev/null 2>&1; then
|
|
307
|
+
test_pass "Invalid persona rejected"
|
|
308
|
+
else
|
|
309
|
+
test_fail "Invalid persona accepted"
|
|
310
|
+
fi
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
# Test cost estimation
|
|
314
|
+
test_cost_estimation() {
|
|
315
|
+
test_start "Cost estimation functionality"
|
|
316
|
+
|
|
317
|
+
# Generate a test epic first
|
|
318
|
+
if ! "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
319
|
+
--output="$TEST_EPIC_FILE" >/dev/null 2>&1; then
|
|
320
|
+
test_fail "Failed to generate test epic for cost estimation"
|
|
321
|
+
return
|
|
322
|
+
fi
|
|
323
|
+
|
|
324
|
+
# Test summary format
|
|
325
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" > "${TEST_OUTPUT_DIR}/cost-summary.log" 2>&1; then
|
|
326
|
+
test_pass "Cost summary generated successfully"
|
|
327
|
+
else
|
|
328
|
+
test_fail "Failed to generate cost summary"
|
|
329
|
+
fi
|
|
330
|
+
|
|
331
|
+
# Test detailed format
|
|
332
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --format=detailed > "${TEST_OUTPUT_DIR}/cost-detailed.log" 2>&1; then
|
|
333
|
+
test_pass "Cost details generated successfully"
|
|
334
|
+
else
|
|
335
|
+
test_fail "Failed to generate cost details"
|
|
336
|
+
fi
|
|
337
|
+
|
|
338
|
+
# Test CSV format
|
|
339
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --format=csv > "${TEST_OUTPUT_DIR}/costs.csv" 2>&1; then
|
|
340
|
+
test_pass "Cost CSV generated successfully"
|
|
341
|
+
else
|
|
342
|
+
test_fail "Failed to generate cost CSV"
|
|
343
|
+
fi
|
|
344
|
+
|
|
345
|
+
# Test JSON format
|
|
346
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --format=json | jq . >/dev/null 2>&1; then
|
|
347
|
+
test_pass "Cost JSON format is valid"
|
|
348
|
+
else
|
|
349
|
+
test_fail "Cost JSON format is invalid"
|
|
350
|
+
fi
|
|
351
|
+
|
|
352
|
+
# Test filtering by type
|
|
353
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --type=blocking > "${TEST_OUTPUT_DIR}/cost-blocking.log" 2>&1; then
|
|
354
|
+
test_pass "Cost filtering by blocking type works"
|
|
355
|
+
else
|
|
356
|
+
test_fail "Failed to filter costs by blocking type"
|
|
357
|
+
fi
|
|
358
|
+
|
|
359
|
+
# Test filtering by persona
|
|
360
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --persona=security-specialist > "${TEST_OUTPUT_DIR}/cost-security.log" 2>&1; then
|
|
361
|
+
test_pass "Cost filtering by persona works"
|
|
362
|
+
else
|
|
363
|
+
test_fail "Failed to filter costs by persona"
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
# Test sorting
|
|
367
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --sort-by=total > "${TEST_OUTPUT_DIR}/cost-sorted.log" 2>&1; then
|
|
368
|
+
test_pass "Cost sorting works"
|
|
369
|
+
else
|
|
370
|
+
test_fail "Failed to sort costs"
|
|
371
|
+
fi
|
|
372
|
+
|
|
373
|
+
# Test custom currency
|
|
374
|
+
if "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --currency=£ > "${TEST_OUTPUT_DIR}/cost-currency.log" 2>&1; then
|
|
375
|
+
test_pass "Custom currency works"
|
|
376
|
+
else
|
|
377
|
+
test_fail "Failed to use custom currency"
|
|
378
|
+
fi
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
# Test error handling
|
|
382
|
+
test_error_handling() {
|
|
383
|
+
test_start "Error handling"
|
|
384
|
+
|
|
385
|
+
# Test invalid JSON file
|
|
386
|
+
echo "invalid json" > "${TEST_OUTPUT_DIR}/bad.json"
|
|
387
|
+
if ! "$VALIDATE_SCRIPT" "${TEST_OUTPUT_DIR}/bad.json" >/dev/null 2>&1; then
|
|
388
|
+
test_pass "Invalid JSON handled correctly by validation"
|
|
389
|
+
else
|
|
390
|
+
test_fail "Invalid JSON not detected by validation"
|
|
391
|
+
fi
|
|
392
|
+
|
|
393
|
+
if ! "$PARSE_SCRIPT" "${TEST_OUTPUT_DIR}/bad.json" >/dev/null 2>&1; then
|
|
394
|
+
test_pass "Invalid JSON handled correctly by parser"
|
|
395
|
+
else
|
|
396
|
+
test_fail "Invalid JSON not detected by parser"
|
|
397
|
+
fi
|
|
398
|
+
|
|
399
|
+
if ! "$ESTIMATE_SCRIPT" "${TEST_OUTPUT_DIR}/bad.json" >/dev/null 2>&1; then
|
|
400
|
+
test_pass "Invalid JSON handled correctly by estimator"
|
|
401
|
+
else
|
|
402
|
+
test_fail "Invalid JSON not detected by estimator"
|
|
403
|
+
fi
|
|
404
|
+
|
|
405
|
+
# Test missing file
|
|
406
|
+
if ! "$VALIDATE_SCRIPT" "${TEST_OUTPUT_DIR}/missing.json" >/dev/null 2>&1; then
|
|
407
|
+
test_pass "Missing file handled correctly by validation"
|
|
408
|
+
else
|
|
409
|
+
test_fail "Missing file not detected by validation"
|
|
410
|
+
fi
|
|
411
|
+
|
|
412
|
+
# Test invalid parameters
|
|
413
|
+
if ! "$PARSE_SCRIPT" "$TEST_EPIC_FILE" --persona=invalid >/dev/null 2>&1; then
|
|
414
|
+
test_pass "Invalid persona parameter handled correctly"
|
|
415
|
+
else
|
|
416
|
+
test_fail "Invalid persona parameter not detected"
|
|
417
|
+
fi
|
|
418
|
+
|
|
419
|
+
if ! "$ESTIMATE_SCRIPT" "$TEST_EPIC_FILE" --format=invalid >/dev/null 2>&1; then
|
|
420
|
+
test_pass "Invalid format parameter handled correctly"
|
|
421
|
+
else
|
|
422
|
+
test_fail "Invalid format parameter not detected"
|
|
423
|
+
fi
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
# Test integration scenarios
|
|
427
|
+
test_integration() {
|
|
428
|
+
test_start "Integration scenarios"
|
|
429
|
+
|
|
430
|
+
# Test complete workflow
|
|
431
|
+
local workflow_file="${TEST_OUTPUT_DIR}/workflow-epic.json"
|
|
432
|
+
|
|
433
|
+
# 1. Generate epic
|
|
434
|
+
if "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
435
|
+
--mode=standard \
|
|
436
|
+
--output="$workflow_file" >/dev/null 2>&1; then
|
|
437
|
+
|
|
438
|
+
# 2. Validate epic
|
|
439
|
+
if "$VALIDATE_SCRIPT" "$workflow_file" >/dev/null 2>&1; then
|
|
440
|
+
|
|
441
|
+
# 3. Parse personas
|
|
442
|
+
if "$PARSE_SCRIPT" "$workflow_file" --count >/dev/null 2>&1; then
|
|
443
|
+
|
|
444
|
+
# 4. Estimate costs
|
|
445
|
+
if "$ESTIMATE_SCRIPT" "$workflow_file" --format=json >/dev/null 2>&1; then
|
|
446
|
+
test_pass "Complete workflow integration successful"
|
|
447
|
+
else
|
|
448
|
+
test_fail "Cost estimation failed in workflow"
|
|
449
|
+
fi
|
|
450
|
+
else
|
|
451
|
+
test_fail "Persona parsing failed in workflow"
|
|
452
|
+
fi
|
|
453
|
+
else
|
|
454
|
+
test_fail "Validation failed in workflow"
|
|
455
|
+
fi
|
|
456
|
+
else
|
|
457
|
+
test_fail "Epic generation failed in workflow"
|
|
458
|
+
fi
|
|
459
|
+
|
|
460
|
+
# Test validate-only mode
|
|
461
|
+
if "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
462
|
+
--validate-only >/dev/null 2>&1; then
|
|
463
|
+
test_pass "Validate-only mode works"
|
|
464
|
+
else
|
|
465
|
+
test_fail "Validate-only mode failed"
|
|
466
|
+
fi
|
|
467
|
+
|
|
468
|
+
# Test with DevOps enforcement
|
|
469
|
+
local devops_file="${TEST_OUTPUT_DIR}/devops-epic.json"
|
|
470
|
+
if "$INVOKE_SCRIPT" "$TEST_EPIC_DESCRIPTION" \
|
|
471
|
+
--enforce-devops \
|
|
472
|
+
--output="$devops_file" >/dev/null 2>&1; then
|
|
473
|
+
|
|
474
|
+
# Check if DevOps recommendations are blocking
|
|
475
|
+
local devops_blocking
|
|
476
|
+
devops_blocking=$(jq -r '
|
|
477
|
+
.epic.personas[] |
|
|
478
|
+
select(.name == "devops-engineer") |
|
|
479
|
+
.recommendations[] |
|
|
480
|
+
select(.type == "blocking") |
|
|
481
|
+
length
|
|
482
|
+
' "$devops_file")
|
|
483
|
+
|
|
484
|
+
if [[ "$devops_blocking" -gt 0 ]]; then
|
|
485
|
+
test_pass "DevOps enforcement creates blocking recommendations"
|
|
486
|
+
else
|
|
487
|
+
test_warning "DevOps enforcement did not create blocking recommendations"
|
|
488
|
+
fi
|
|
489
|
+
else
|
|
490
|
+
test_fail "DevOps enforcement mode failed"
|
|
491
|
+
fi
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
# Show test summary
|
|
495
|
+
show_summary() {
|
|
496
|
+
echo ""
|
|
497
|
+
echo "========================================"
|
|
498
|
+
log_info "Test Summary"
|
|
499
|
+
echo "========================================"
|
|
500
|
+
echo -e "Total Tests: ${CYAN}${TESTS_TOTAL}${NC}"
|
|
501
|
+
echo -e "Passed: ${GREEN}${TESTS_PASSED}${NC}"
|
|
502
|
+
echo -e "Failed: ${RED}${TESTS_FAILED}${NC}"
|
|
503
|
+
|
|
504
|
+
local success_rate=0
|
|
505
|
+
if [[ $TESTS_TOTAL -gt 0 ]]; then
|
|
506
|
+
success_rate=$(( (TESTS_PASSED * 100) / TESTS_TOTAL ))
|
|
507
|
+
fi
|
|
508
|
+
|
|
509
|
+
echo -e "Success Rate: ${YELLOW}${success_rate}%${NC}"
|
|
510
|
+
|
|
511
|
+
if [[ $TESTS_FAILED -eq 0 ]]; then
|
|
512
|
+
echo ""
|
|
513
|
+
log_success "All tests passed! ✓"
|
|
514
|
+
return 0
|
|
515
|
+
else
|
|
516
|
+
echo ""
|
|
517
|
+
log_error "Some tests failed. Check the logs in $TEST_OUTPUT_DIR"
|
|
518
|
+
return 1
|
|
519
|
+
fi
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
# Main execution
|
|
523
|
+
main() {
|
|
524
|
+
local run_all=true
|
|
525
|
+
local test_filter=""
|
|
526
|
+
|
|
527
|
+
# Parse arguments
|
|
528
|
+
while [[ $# -gt 0 ]]; do
|
|
529
|
+
case $1 in
|
|
530
|
+
--test)
|
|
531
|
+
test_filter="$2"
|
|
532
|
+
run_all=false
|
|
533
|
+
shift 2
|
|
534
|
+
;;
|
|
535
|
+
--keep-logs)
|
|
536
|
+
# Don't cleanup on exit
|
|
537
|
+
trap - EXIT
|
|
538
|
+
shift
|
|
539
|
+
;;
|
|
540
|
+
-h|--help)
|
|
541
|
+
cat << 'HELP_EOF'
|
|
542
|
+
CFN Epic Creator - Test Suite
|
|
543
|
+
|
|
544
|
+
USAGE:
|
|
545
|
+
./test-invoke.sh [OPTIONS]
|
|
546
|
+
|
|
547
|
+
OPTIONS:
|
|
548
|
+
--test <name> Run specific test only
|
|
549
|
+
--keep-logs Keep test logs and temporary files
|
|
550
|
+
-h, --help Show this help message
|
|
551
|
+
|
|
552
|
+
AVAILABLE TESTS:
|
|
553
|
+
help Test help functionality
|
|
554
|
+
validation Test argument validation
|
|
555
|
+
generation Test epic generation
|
|
556
|
+
validate Test validation functionality
|
|
557
|
+
parse Test persona parsing
|
|
558
|
+
cost Test cost estimation
|
|
559
|
+
error Test error handling
|
|
560
|
+
integration Test integration scenarios
|
|
561
|
+
|
|
562
|
+
EXAMPLES:
|
|
563
|
+
# Run all tests
|
|
564
|
+
./test-invoke.sh
|
|
565
|
+
|
|
566
|
+
# Run specific test
|
|
567
|
+
./test-invoke.sh --test generation
|
|
568
|
+
|
|
569
|
+
# Keep logs for debugging
|
|
570
|
+
./test-invoke.sh --keep-logs
|
|
571
|
+
|
|
572
|
+
HELP_EOF
|
|
573
|
+
exit 0
|
|
574
|
+
;;
|
|
575
|
+
*)
|
|
576
|
+
log_error "Unknown option: $1"
|
|
577
|
+
exit 1
|
|
578
|
+
;;
|
|
579
|
+
esac
|
|
580
|
+
done
|
|
581
|
+
|
|
582
|
+
# Set cleanup trap
|
|
583
|
+
trap cleanup EXIT
|
|
584
|
+
|
|
585
|
+
# Setup test environment
|
|
586
|
+
setup
|
|
587
|
+
|
|
588
|
+
# Run tests
|
|
589
|
+
if [[ "$run_all" == true ]]; then
|
|
590
|
+
test_help
|
|
591
|
+
test_argument_validation
|
|
592
|
+
test_epic_generation
|
|
593
|
+
test_validation
|
|
594
|
+
test_persona_parsing
|
|
595
|
+
test_cost_estimation
|
|
596
|
+
test_error_handling
|
|
597
|
+
test_integration
|
|
598
|
+
else
|
|
599
|
+
case "$test_filter" in
|
|
600
|
+
"help") test_help ;;
|
|
601
|
+
"validation") test_argument_validation ;;
|
|
602
|
+
"generation") test_epic_generation ;;
|
|
603
|
+
"validate") test_validation ;;
|
|
604
|
+
"parse") test_persona_parsing ;;
|
|
605
|
+
"cost") test_cost_estimation ;;
|
|
606
|
+
"error") test_error_handling ;;
|
|
607
|
+
"integration") test_integration ;;
|
|
608
|
+
*)
|
|
609
|
+
log_error "Unknown test: $test_filter"
|
|
610
|
+
exit 1
|
|
611
|
+
;;
|
|
612
|
+
esac
|
|
613
|
+
fi
|
|
614
|
+
|
|
615
|
+
# Show summary
|
|
616
|
+
show_summary
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
# Execute main function
|
|
620
|
+
main "$@"
|