claude-flow-novice 2.18.13 → 2.18.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  2. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  3. package/.backups/unknown/1765417503_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  4. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  5. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  6. package/.backups/unknown/1765417531_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  7. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/metadata.json +8 -0
  8. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/original +3 -0
  9. package/.backups/unknown/1765417552_2999b9ec66f591dd76075617ec31fcea/revert.sh +7 -0
  10. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/metadata.json +8 -0
  11. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/original +1212 -0
  12. package/.backups/unknown/1765417613_1f34dbf0fe1ec3b6cb74ba7c4e12a2a4/revert.sh +7 -0
  13. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/metadata.json +8 -0
  14. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/original +1212 -0
  15. package/.backups/unknown/1765417613_332e9bb223a26270398922640c1c1653/revert.sh +7 -0
  16. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/metadata.json +8 -0
  17. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/original +1212 -0
  18. package/.backups/unknown/1765417613_45880a7afef063347b701e7e88e2df9c/revert.sh +7 -0
  19. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/metadata.json +8 -0
  20. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/original +1228 -0
  21. package/.backups/unknown/1765417614_1b6c3b658c2891dbe245aea4bad41661/revert.sh +7 -0
  22. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/metadata.json +8 -0
  23. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/original +1237 -0
  24. package/.backups/unknown/1765417614_1ed5bd129f0b5d1b297a04ec5267ef62/revert.sh +7 -0
  25. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/metadata.json +8 -0
  26. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/original +1240 -0
  27. package/.backups/unknown/1765417614_28e032bd1b62dbfcecbd56327a0b0e23/revert.sh +7 -0
  28. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/metadata.json +8 -0
  29. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/original +1216 -0
  30. package/.backups/unknown/1765417614_40a1ce1b0efa2e1ba1958c27b2cbc557/revert.sh +7 -0
  31. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/metadata.json +8 -0
  32. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/original +1238 -0
  33. package/.backups/unknown/1765417614_f65dbf58cff7a9aa1c5c3d0d1618074a/revert.sh +7 -0
  34. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/metadata.json +8 -0
  35. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/original +1167 -0
  36. package/.backups/unknown/1765417615_0f45c28b9b8d5204974421c06075ff74/revert.sh +7 -0
  37. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/metadata.json +8 -0
  38. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/original +1242 -0
  39. package/.backups/unknown/1765417615_41d36156891ddb6f63d1b4da59d1db4c/revert.sh +7 -0
  40. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/metadata.json +8 -0
  41. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/original +2 -0
  42. package/.backups/unknown/1765417709_77dda8631459cfc2ab94b8928f7d90b4/revert.sh +7 -0
  43. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/metadata.json +8 -0
  44. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/original +1169 -0
  45. package/.backups/unknown/1765417775_1405837bacf112ba832a139840fe94e7/revert.sh +7 -0
  46. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/metadata.json +8 -0
  47. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/original +1171 -0
  48. package/.backups/unknown/1765417775_8044b4a5cfdcb5cd71317831ad53f5a2/revert.sh +7 -0
  49. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/metadata.json +8 -0
  50. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/original +1170 -0
  51. package/.backups/unknown/1765417775_8eb94d60151e1db262377fbf8a187212/revert.sh +7 -0
  52. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/metadata.json +8 -0
  53. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/original +1173 -0
  54. package/.backups/unknown/1765417776_a0d4b709e15e0bfa002c4b128f5e4603/revert.sh +7 -0
  55. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/metadata.json +8 -0
  56. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/original +1170 -0
  57. package/.backups/unknown/1765417776_cb1bc24d98b63564eb73ef782b8c68b3/revert.sh +7 -0
  58. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/metadata.json +8 -0
  59. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/original +1172 -0
  60. package/.backups/unknown/1765417777_1c4cc8c33f476f0c87c8efd4e34efc22/revert.sh +7 -0
  61. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/metadata.json +8 -0
  62. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/original +1175 -0
  63. package/.backups/unknown/1765417777_325de83ffd34544909b8b9aa6e18dd05/revert.sh +7 -0
  64. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/metadata.json +8 -0
  65. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/original +1178 -0
  66. package/.backups/unknown/1765417950_402e7c1a8956b56ac7b88e89f024acb4/revert.sh +7 -0
  67. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/metadata.json +8 -0
  68. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/original +1174 -0
  69. package/.backups/unknown/1765417950_647e27e4da18ae42c339e04b4d334feb/revert.sh +7 -0
  70. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/metadata.json +8 -0
  71. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/original +1194 -0
  72. package/.backups/unknown/1765417951_1424d2dd67b8c8a4e7cf649b379d21f2/revert.sh +7 -0
  73. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/metadata.json +8 -0
  74. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/original +1186 -0
  75. package/.backups/unknown/1765417951_6df070ca287ea94a7f08efc69ec9ea51/revert.sh +7 -0
  76. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/metadata.json +8 -0
  77. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/original +1180 -0
  78. package/.backups/unknown/1765417951_848919a1365f6536e5ef8d85d0c80fa7/revert.sh +7 -0
  79. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/metadata.json +8 -0
  80. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/original +1198 -0
  81. package/.backups/unknown/1765417951_b0d1d4ecf85ad10cda0f3900d414b608/revert.sh +7 -0
  82. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/metadata.json +8 -0
  83. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/original +1202 -0
  84. package/.backups/unknown/1765417952_2b720e213b5197cbaad53f9f0857f23f/revert.sh +7 -0
  85. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/metadata.json +8 -0
  86. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/original +1202 -0
  87. package/.backups/unknown/1765417952_ef1d15e8b83a802a0c0f0fc03e56a89c/revert.sh +7 -0
  88. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/metadata.json +8 -0
  89. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/original +1209 -0
  90. package/.backups/unknown/1765418048_ac94238a69a6f86a6ba9d31f623c18a7/revert.sh +7 -0
  91. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/metadata.json +8 -0
  92. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/original +1207 -0
  93. package/.backups/unknown/1765418048_f3afed98da63fef9ff57fb5646976f63/revert.sh +7 -0
  94. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/metadata.json +8 -0
  95. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/original +1207 -0
  96. package/.backups/unknown/1765418049_9c392702a4e1cace37d17f6f2dfaf54e/revert.sh +7 -0
  97. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/metadata.json +8 -0
  98. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/original +1193 -0
  99. package/.backups/unknown/1765418049_9e0777555b51dea4d24d0503b584cfc5/revert.sh +7 -0
  100. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/metadata.json +8 -0
  101. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/original +1194 -0
  102. package/.backups/unknown/1765418050_22d534bed68f9f5d883bee54e7cbc4d3/revert.sh +7 -0
  103. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/metadata.json +8 -0
  104. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/original +1193 -0
  105. package/.backups/unknown/1765418051_d9243722dc90dabc851c5767a62ac7f2/revert.sh +7 -0
  106. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/metadata.json +8 -0
  107. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/original +1191 -0
  108. package/.backups/unknown/1765418177_21a2fa816d25d419b54ef2d429aab474/revert.sh +7 -0
  109. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/metadata.json +8 -0
  110. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/original +1190 -0
  111. package/.backups/unknown/1765418177_33b673dce1eb59d7eb4f752aec882794/revert.sh +7 -0
  112. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/metadata.json +8 -0
  113. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/original +1191 -0
  114. package/.backups/unknown/1765418177_72568812ea5a73cf6861a6b14da065fa/revert.sh +7 -0
  115. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/metadata.json +8 -0
  116. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/original +1189 -0
  117. package/.backups/unknown/1765418178_20c28b95f12194fe4b81cfb35f4f3757/revert.sh +7 -0
  118. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/metadata.json +8 -0
  119. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/original +1197 -0
  120. package/.backups/unknown/1765418178_cdf68719cc09173769027743e2718ad4/revert.sh +7 -0
  121. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/metadata.json +8 -0
  122. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/original +1190 -0
  123. package/.backups/unknown/1765418178_eb19e0f8542405480e51af09fad84b71/revert.sh +7 -0
  124. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/metadata.json +8 -0
  125. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/original +1197 -0
  126. package/.backups/unknown/1765418236_c016507725847318a3c369b047cbb802/revert.sh +7 -0
  127. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/metadata.json +8 -0
  128. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/original +1197 -0
  129. package/.backups/unknown/1765418237_932c3cc3a5c537b7933c2370b65f4b39/revert.sh +7 -0
  130. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.md +194 -2
  131. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.sh +264 -0
  132. package/.claude/agents/cfn-dev-team/utility/epic-creator-v2.sh.backup +698 -0
  133. package/.claude/hooks/README.md +148 -0
  134. package/.claude/hooks/SessionStart:cfn-load-openai-key.sh +35 -0
  135. package/.claude/hooks/cfn-invoke-pre-edit.sh +1 -1
  136. package/.claude/hooks/cfn-load-cerebras-env.sh +65 -0
  137. package/.claude/hooks/cfn-precompact-enhanced.sh +283 -0
  138. package/.claude/hooks/deprecated/README.md +27 -0
  139. package/.claude/settings.json +71 -6
  140. package/.claude/skills/cfn-cerebras-coordinator/QUICKSTART.md +348 -0
  141. package/.claude/skills/cfn-cerebras-coordinator/README.md +525 -0
  142. package/.claude/skills/cfn-cerebras-coordinator/TDD_COORDINATOR_OVERVIEW.md +284 -0
  143. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v2-test-1733854200.json +36 -0
  144. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-py-v3-test-1765383241.json +36 -0
  145. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v2-test-1765381361.json +36 -0
  146. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-rust-v3-test-1765383242.json +46 -0
  147. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v2-test-1733864400.json +66 -0
  148. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v3-test-1765383238.json +66 -0
  149. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v4-test-1765386506.json +66 -0
  150. package/.claude/skills/cfn-cerebras-coordinator/conversations/2025-12-10-ts-v5-test-1765393100.json +66 -0
  151. package/.claude/skills/cfn-cerebras-coordinator/example-usage.sh +206 -0
  152. package/.claude/skills/cfn-cerebras-coordinator/lib/tdd-conversation-coordinator.ts +569 -0
  153. package/.claude/skills/cfn-cerebras-coordinator/test-tdd-coordinator.sh +250 -0
  154. package/.claude/skills/cfn-epic-creator/SKILL.md +392 -0
  155. package/.claude/skills/cfn-epic-creator/estimate-costs.sh +524 -0
  156. package/.claude/skills/cfn-epic-creator/invoke.sh +445 -0
  157. package/.claude/skills/cfn-epic-creator/parse-personas.sh +533 -0
  158. package/.claude/skills/cfn-epic-creator/security-utils.sh +268 -0
  159. package/.claude/skills/cfn-epic-creator/security-verification-demo.sh +127 -0
  160. package/.claude/skills/cfn-epic-creator/test-invoke.sh +620 -0
  161. package/.claude/skills/cfn-epic-creator/test-security-fixes.sh +195 -0
  162. package/.claude/skills/cfn-epic-creator/test-security-simple.sh +165 -0
  163. package/.claude/skills/cfn-epic-creator/validate-epic.sh +474 -0
  164. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/metadata.json +8 -0
  165. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/original +209 -0
  166. package/.claude/skills/cfn-local-ruvector-accelerator/.backups/unknown/1765358428_2cf0ad7377232c919ff0a65630cb307d/revert.sh +7 -0
  167. package/.claude/skills/cfn-local-ruvector-accelerator/AGENT_INTEGRATION_PATTERNS.md +255 -0
  168. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml +8 -1
  169. package/.claude/skills/cfn-local-ruvector-accelerator/Cargo.toml.backup +47 -0
  170. package/.claude/skills/cfn-local-ruvector-accelerator/EXTRACTION_EXAMPLES.md +287 -0
  171. package/.claude/skills/cfn-local-ruvector-accelerator/README.md +2 -563
  172. package/.claude/skills/cfn-local-ruvector-accelerator/SCHEMA_V2_IMPLEMENTATION.md +151 -0
  173. package/.claude/skills/cfn-local-ruvector-accelerator/SECURITY_IMPLEMENTATION.md +185 -0
  174. package/.claude/skills/cfn-local-ruvector-accelerator/SKILL.md +8 -351
  175. package/.claude/skills/cfn-local-ruvector-accelerator/docs/EXECUTIVE_SUMMARY.txt +90 -0
  176. package/.claude/skills/cfn-local-ruvector-accelerator/docs/PHASE_4_QUERY_API.md +210 -0
  177. package/.claude/skills/cfn-local-ruvector-accelerator/docs/RUST_AST_EXTRACTOR_IMPLEMENTATION.md +222 -0
  178. package/.claude/skills/cfn-local-ruvector-accelerator/docs/TRANSACTION_MANAGEMENT.md +241 -0
  179. package/.claude/skills/cfn-local-ruvector-accelerator/docs/VALIDATION_FINDINGS.txt +250 -0
  180. package/.claude/skills/cfn-local-ruvector-accelerator/epic-ast-indexer.json +335 -0
  181. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh +292 -96
  182. package/.claude/skills/cfn-local-ruvector-accelerator/index-code.sh.backup +249 -0
  183. package/.claude/skills/cfn-local-ruvector-accelerator/index_all.sh +65 -0
  184. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/find.rs +214 -0
  185. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index.rs +259 -103
  186. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_ast.rs +767 -0
  187. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/index_modified.rs +37 -0
  188. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/init.rs +17 -12
  189. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/migration.rs +34 -1
  190. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/mod.rs +6 -0
  191. package/.claude/skills/cfn-local-ruvector-accelerator/src/cli/refs.rs +209 -0
  192. package/.claude/skills/cfn-local-ruvector-accelerator/src/embeddings.rs +82 -33
  193. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/mod.rs +251 -0
  194. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust.rs +425 -0
  195. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/rust_placeholder.rs +420 -0
  196. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/text_fallback.rs +490 -0
  197. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript.rs +520 -0
  198. package/.claude/skills/cfn-local-ruvector-accelerator/src/extractors/typescript_full.rs +531 -0
  199. package/.claude/skills/cfn-local-ruvector-accelerator/src/lib.rs +20 -0
  200. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs +33 -2
  201. package/.claude/skills/cfn-local-ruvector-accelerator/src/main.rs.backup +360 -0
  202. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration.rs +325 -318
  203. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_backup.rs +325 -0
  204. package/.claude/skills/cfn-local-ruvector-accelerator/src/migration_tx.rs +513 -0
  205. package/.claude/skills/cfn-local-ruvector-accelerator/src/paths.rs +29 -0
  206. package/.claude/skills/cfn-local-ruvector-accelerator/src/query_api.rs +609 -0
  207. package/.claude/skills/cfn-local-ruvector-accelerator/src/schema_v2.rs +603 -0
  208. package/.claude/skills/cfn-local-ruvector-accelerator/src/security_tests.rs +154 -0
  209. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2.rs +583 -0
  210. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_backup.rs +560 -0
  211. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_fixed.rs +0 -0
  212. package/.claude/skills/cfn-local-ruvector-accelerator/src/store_v2_tx.rs +397 -0
  213. package/.claude/skills/cfn-local-ruvector-accelerator/src/test_schema.rs +228 -0
  214. package/.claude/skills/cfn-local-ruvector-accelerator/src/transaction_tests.rs +410 -0
  215. package/.claude/skills/cfn-local-ruvector-accelerator/test_ast_indexing.rs +59 -0
  216. package/.claude/skills/cfn-local-ruvector-accelerator/test_query_api.sh +103 -0
  217. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema.sql +158 -0
  218. package/.claude/skills/cfn-local-ruvector-accelerator/test_schema_v2.sql +147 -0
  219. package/.claude/skills/cfn-mdap-context-injection/SKILL.md +31 -10
  220. package/.claude/skills/cfn-mdap-error-fixer/skill.md +15 -205
  221. package/.claude/skills/cfn-session-handoff/SKILL.md +1 -53
  222. package/.claude/skills/cfn-task-decomposition/SKILL.md +1 -0
  223. package/.claude/skills/cfn-task-intelligence/SKILL.md +39 -18
  224. package/.claude/skills/cfn-task-planning/SKILL.md +37 -12
  225. package/.claude/skills/cfn-validation-framework/SKILL.md +3 -60
  226. package/.claude/skills/cfn-vision-analysis/SKILL.md +3 -20
  227. package/.claude-flow/metrics/performance.json +3 -3
  228. package/.claude-flow/metrics/task-metrics.json +3 -3
  229. package/.ruvector/index_v2.db-shm +0 -0
  230. package/.ruvector/index_v2.db-wal +0 -0
  231. package/CLAUDE.md +9 -1
  232. package/README.md +56 -0
  233. package/docs/AGENT_PRODUCTION_FEEDBACK_PATTERNS.md +389 -0
  234. package/docs/CEREBRAS_TDD_COORDINATOR_TEST_RESULTS.md +213 -0
  235. package/docs/CEREBRAS_TDD_ROUND1_VS_ROUND2_COMPARISON.md +225 -0
  236. package/docs/CEREBRAS_TDD_ROUND3_FINAL_RESULTS.md +264 -0
  237. package/docs/EPIC_CREATOR_V2_ARCHITECTURE.md +629 -0
  238. package/docs/HOOKS_IMPLEMENTATION_PRIORITY.md +585 -0
  239. package/docs/SKILLS_HOOKS_INTEGRATION.md +1074 -0
  240. package/epic-with-personas-2025-12-09-17-15-13.json +253 -0
  241. package/package.json +2 -1
  242. package/test-epic-creator-security.sh +203 -0
  243. package/.claude/skills/cfn-local-ruvector-accelerator/__pycache__/search_engine_v2.cpython-312.pyc +0 -0
  244. package/.claude/skills/cfn-local-ruvector-accelerator/search_engine.py +0 -200
  245. package/jest.config.ts.cjs +0 -17
  246. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/SKILL.md +0 -0
  247. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/context-analyzer.sh +0 -0
  248. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-cerebras-code-generator/generate-code.sh +0 -0
  249. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/SKILL.md +0 -0
  250. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/execute.sh +0 -0
  251. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/INTEGRATION.md +0 -0
  252. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SAMPLE_OUTPUTS.md +0 -0
  253. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/SKILL.md +0 -0
  254. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/capture-container-logs.sh +0 -0
  255. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/enable-logging.sh +0 -0
  256. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/init-hybrid-logging.sh +0 -0
  257. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/analytics-summary.sh +0 -0
  258. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-agent-timeline.sh +0 -0
  259. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-consensus-history.sh +0 -0
  260. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-coordination-timeline.sh +0 -0
  261. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-failed-containers.sh +0 -0
  262. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/queries/query-gate-checks.sh +0 -0
  263. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/schema.sql +0 -0
  264. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/sqlite-helpers.sh +0 -0
  265. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/logging/test-hybrid-logging.sh +0 -0
  266. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/SKILL.md +0 -0
  267. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/mcp/skill-mcp-selector.js +0 -0
  268. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/SKILL.md +0 -0
  269. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/orchestration/orchestrate.sh +0 -0
  270. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/SKILL.md +0 -0
  271. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/spawning/spawn-agent.sh +0 -0
  272. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/SKILL.md +0 -0
  273. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/cleanup-wave.sh +0 -0
  274. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/lib/docker-helpers.sh +0 -0
  275. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/monitor-wave.sh +0 -0
  276. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-docker-runtime/lib/waves/spawn-wave.sh +0 -0
  277. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/SKILL.md +0 -0
  278. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-node-heap-sizer/task-mode-heap-limiter.sh +0 -0
  279. /package/.claude/{skills → cfn-extras/skills/deprecated}/deprecated/analyze-patterns.sh +0 -0
  280. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/README.md +0 -0
  281. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SECURITY.md +0 -0
  282. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/SKILL.md +0 -0
  283. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/package.json +0 -0
  284. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/solve.sh +0 -0
  285. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver-minimal.sh +0 -0
  286. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test-equation-solver.sh +0 -0
  287. /package/.claude/{skills → cfn-extras/skills/deprecated}/equation-solver/test.cjs +0 -0
  288. /package/.claude/hooks/{cfn-credential-scanner.sh → deprecated/cfn-credential-scanner.sh} +0 -0
  289. /package/.claude/hooks/{cfn-detect-hardcoded-credentials.sh → deprecated/cfn-detect-hardcoded-credentials.sh} +0 -0
  290. /package/.claude/hooks/{cfn-invoke-post-edit-ts.sh → deprecated/cfn-invoke-post-edit-ts.sh} +0 -0
  291. /package/.claude/hooks/{cfn-invoke-pre-edit-ts.sh → deprecated/cfn-invoke-pre-edit-ts.sh} +0 -0
  292. /package/.claude/hooks/{cfn-invoke-security-validation.sh → deprecated/cfn-invoke-security-validation.sh} +0 -0
  293. /package/.claude/hooks/{cfn-lint-sql-injection.sh → deprecated/cfn-lint-sql-injection.sh} +0 -0
  294. /package/.claude/hooks/{cfn-post-edit.sh → deprecated/cfn-post-edit.sh} +0 -0
  295. /package/.claude/hooks/{cfn-pre-edit-backup.sh → deprecated/cfn-pre-edit-backup.sh} +0 -0
  296. /package/.claude/skills/cfn-local-ruvector-accelerator/{embeddings_manager.py → embeddings_manager.py.backup} +0 -0
  297. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/index.bin +0 -0
  298. /package/{.ruvector → .claude/skills/cfn-local-ruvector-accelerator/index}/metadata.json +0 -0
  299. /package/.claude/skills/cfn-local-ruvector-accelerator/{search_engine_v2.py → search_engine_v2.py.backup} +0 -0
  300. /package/.claude/skills/cfn-local-ruvector-accelerator/{sqlite_store.py → sqlite_store.py.backup} +0 -0
@@ -0,0 +1,524 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+
4
+ # CFN Epic Creator - Estimate Costs
5
+ # Aggregates cost estimates from all personas in epic JSON
6
+
7
+ # Colors for output
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ YELLOW='\033[1;33m'
11
+ BLUE='\033[0;34m'
12
+ CYAN='\033[0;36m'
13
+ NC='\033[0m' # No Color
14
+
15
+ # Logging functions
16
+ log_info() {
17
+ echo -e "${BLUE}[INFO]${NC} $*"
18
+ }
19
+
20
+ log_success() {
21
+ echo -e "${GREEN}[SUCCESS]${NC} $*"
22
+ }
23
+
24
+ log_warning() {
25
+ echo -e "${YELLOW}[WARNING]${NC} $*"
26
+ }
27
+
28
+ log_error() {
29
+ echo -e "${RED}[ERROR]${NC} $*" >&2
30
+ }
31
+
32
+ # Show help message
33
+ show_help() {
34
+ cat << 'HELP_EOF'
35
+ CFN Epic Creator - Estimate Costs
36
+
37
+ USAGE:
38
+ ./estimate-costs.sh <json-file> [OPTIONS]
39
+
40
+ REQUIRED ARGUMENTS:
41
+ <json-file> Path to the epic JSON file
42
+
43
+ OPTIONS:
44
+ -p, --persona <name> Show costs for specific persona only
45
+ Valid: product-owner, architect, security-specialist,
46
+ performance-specialist, accessibility-advocate,
47
+ devops-engineer
48
+
49
+ -t, --type <type> Filter by recommendation type
50
+ Valid: blocking, suggested
51
+
52
+ -r, --priority <prio> Filter by recommendation priority
53
+ Valid: critical, high, medium, low
54
+
55
+ -f, --format <fmt> Output format
56
+ Valid: summary (default), detailed, csv, json
57
+
58
+ -c, --currency <curr> Currency symbol for display (default: $)
59
+
60
+ -s, --sort-by <field> Sort personas by field
61
+ Valid: total, blocking, suggested, name
62
+
63
+ -o, --output <file> Write output to file instead of stdout
64
+
65
+ --no-colors Disable colored output
66
+
67
+ -h, --help Show this help message
68
+
69
+ EXAMPLES:
70
+ # Show cost summary
71
+ ./estimate-costs.sh epic.json
72
+
73
+ # Detailed breakdown by persona
74
+ ./estimate-costs.sh epic.json --format=detailed
75
+
76
+ # CSV export
77
+ ./estimate-costs.sh epic.json --format=csv --output=costs.csv
78
+
79
+ # Costs for blocking recommendations only
80
+ ./estimate-costs.sh epic.json --type=blocking
81
+
82
+ # Sort by highest cost
83
+ ./estimate-costs.sh epic.json --sort-by=total
84
+
85
+ HELP_EOF
86
+ }
87
+
88
+ # Parse currency value to number
89
+ parse_currency() {
90
+ local value="$1"
91
+ # Remove currency symbols, commas, and whitespace
92
+ echo "$value" | sed 's/[$£€¥,]//g' | tr -d ' ' | grep -o '[0-9]*\.?[0-9]*' | head -1
93
+ }
94
+
95
+ # Format number as currency
96
+ format_currency() {
97
+ local number="$1"
98
+ local currency="$2"
99
+
100
+ # Check if it's a valid number
101
+ if ! echo "$number" | grep -qE '^[0-9]*\.?[0-9]+$'; then
102
+ echo "${currency}0"
103
+ return
104
+ fi
105
+
106
+ # Format with commas
107
+ printf "${currency}%'d" "$(echo "$number" | cut -d. -f1)" 2>/dev/null || echo "${currency}${number}"
108
+ }
109
+
110
+ # Calculate cost estimates
111
+ calculate_costs() {
112
+ local json_file="$1"
113
+ local persona_filter="$2"
114
+ local type_filter="$3"
115
+ local priority_filter="$4"
116
+ local format="$5"
117
+ local currency="$6"
118
+ local sort_by="$7"
119
+ local use_colors="$8"
120
+
121
+ # Build base query
122
+ local personas_query='.epic.personas'
123
+ if [[ -n "$persona_filter" ]]; then
124
+ personas_query="${personas_query}[] | select(.name == \"${persona_filter}\")"
125
+ else
126
+ personas_query="${personas_query}[]"
127
+ fi
128
+
129
+ # Extract cost data
130
+ local cost_data
131
+ cost_data=$(jq -r "
132
+ ${personas_query} |
133
+ {
134
+ name: .name,
135
+ total_estimated: (
136
+ .recommendations |
137
+ map(
138
+ select(
139
+ ${type_filter:+(.type == \"${type_filter}\")} |
140
+ ${priority_filter:+(.priority == \"${priority_filter}\")}
141
+ )
142
+ ) |
143
+ map(
144
+ .estimatedCost // \"0\" |
145
+ if test(\"^[0-9]+$\") then
146
+ tonumber
147
+ else
148
+ (capture(\"(?<currency>[$£€¥]?)(?<amount>[0-9,]+\\.?[0-9]*)\") | .amount | gsub(\",\"; \"\") | tonumber) // 0
149
+ end
150
+ ) |
151
+ add
152
+ ),
153
+ recommendations: (
154
+ .recommendations |
155
+ map(
156
+ select(
157
+ ${type_filter:+(.type == \"${type_filter}\")} |
158
+ ${priority_filter:+(.priority == \"${priority_filter}\")}
159
+ )
160
+ )
161
+ ),
162
+ categories: .costAnalysis // {}
163
+ } |
164
+ {
165
+ persona: .name,
166
+ total: .total_estimated,
167
+ blocking: ([.recommendations[] | select(.type == \"blocking\")] | map(.estimatedCost // \"0\" | if test(\"^[0-9]+$\") then tonumber else (capture(\"(?<currency>[$£€¥]?)(?<amount>[0-9,]+\\.?[0-9]*)\") | .amount | gsub(\",\"; \"\") | tonumber) // 0 end) | add),
168
+ suggested: ([.recommendations[] | select(.type == \"suggested\")] | map(.estimatedCost // \"0\" | if test(\"^[0-9]+$\") then tonumber else (capture(\"(?<currency>[$£€¥]?)(?<amount>[0-9,]+\\.?[0-9]*)\") | .amount | gsub(\",\"; \"\") | tonumber) // 0 end) | add),
169
+ count: (.recommendations | length),
170
+ categories: .categories
171
+ }
172
+ " "$json_file")
173
+
174
+ # Apply sorting
175
+ if [[ -n "$sort_by" ]]; then
176
+ case "$sort_by" in
177
+ "total")
178
+ cost_data=$(echo "$cost_data" | jq -s 'sort_by(.total) | reverse | .[]')
179
+ ;;
180
+ "blocking")
181
+ cost_data=$(echo "$cost_data" | jq -s 'sort_by(.blocking) | reverse | .[]')
182
+ ;;
183
+ "suggested")
184
+ cost_data=$(echo "$cost_data" | jq -s 'sort_by(.suggested) | reverse | .[]')
185
+ ;;
186
+ "name")
187
+ cost_data=$(echo "$cost_data" | jq -s 'sort_by(.persona) | .[]')
188
+ ;;
189
+ esac
190
+ fi
191
+
192
+ # Output based on format
193
+ case "$format" in
194
+ "detailed")
195
+ output_detailed "$cost_data" "$currency" "$use_colors"
196
+ ;;
197
+ "csv")
198
+ output_csv "$cost_data" "$currency"
199
+ ;;
200
+ "json")
201
+ echo "$cost_data"
202
+ ;;
203
+ *)
204
+ output_summary "$cost_data" "$currency" "$use_colors"
205
+ ;;
206
+ esac
207
+ }
208
+
209
+ # Output summary format
210
+ output_summary() {
211
+ local cost_data="$1"
212
+ local currency="$2"
213
+ local use_colors="$3"
214
+
215
+ local grand_total=0
216
+ local grand_blocking=0
217
+ local grand_suggested=0
218
+ local grand_count=0
219
+
220
+ # Header
221
+ if [[ "$use_colors" == true ]]; then
222
+ echo -e "${CYAN}=== Epic Cost Estimate Summary ===${NC}"
223
+ else
224
+ echo "=== Epic Cost Estimate Summary ==="
225
+ fi
226
+ echo ""
227
+
228
+ # Table header
229
+ printf "%-25s %12s %12s %12s %8s\n" "Persona" "Total" "Blocking" "Suggested" "Count"
230
+ printf "%-25s %12s %12s %12s %8s\n" "------------------------" "------------" "------------" "------------" "--------"
231
+
232
+ # Process each persona
233
+ while IFS= read -r persona; do
234
+ local name
235
+ name=$(jq -r '.persona' <<< "$persona")
236
+ local total
237
+ total=$(jq -r '.total' <<< "$persona")
238
+ local blocking
239
+ blocking=$(jq -r '.blocking' <<< "$persona")
240
+ local suggested
241
+ suggested=$(jq -r '.suggested' <<< "$persona")
242
+ local count
243
+ count=$(jq -r '.count' <<< "$persona")
244
+
245
+ # Format display name
246
+ local display_name
247
+ display_name=$(echo "$name" | sed 's/-/ /g' | sed 's/\b\w/\u&/g')
248
+
249
+ # Format costs
250
+ local total_fmt
251
+ total_fmt=$(format_currency "$total" "$currency")
252
+ local blocking_fmt
253
+ blocking_fmt=$(format_currency "$blocking" "$currency")
254
+ local suggested_fmt
255
+ suggested_fmt=$(format_currency "$suggested" "$currency")
256
+
257
+ # Color coding for high costs
258
+ if [[ "$use_colors" == true ]]; then
259
+ if (( $(echo "$total > 100000" | bc -l) )); then
260
+ display_name="${RED}${display_name}${NC}"
261
+ elif (( $(echo "$total > 50000" | bc -l) )); then
262
+ display_name="${YELLOW}${display_name}${NC}"
263
+ fi
264
+ fi
265
+
266
+ # Output row
267
+ printf "%-25s %12s %12s %12s %8s\n" "$display_name" "$total_fmt" "$blocking_fmt" "$suggested_fmt" "$count"
268
+
269
+ # Update totals
270
+ grand_total=$(echo "$grand_total + $total" | bc)
271
+ grand_blocking=$(echo "$grand_blocking + $blocking" | bc)
272
+ grand_suggested=$(echo "$grand_suggested + $suggested" | bc)
273
+ grand_count=$((grand_count + count))
274
+ done <<< "$cost_data"
275
+
276
+ # Separator
277
+ printf "%-25s %12s %12s %12s %8s\n" "------------------------" "------------" "------------" "------------" "--------"
278
+
279
+ # Grand total
280
+ if [[ "$use_colors" == true ]]; then
281
+ local total_fmt
282
+ total_fmt=$(format_currency "$grand_total" "$currency")
283
+ printf "${GREEN}%-25s %12s${NC} ${GREEN}%12s${NC} ${GREEN}%12s${NC} %8s\n" "GRAND TOTAL" "$total_fmt" "$(format_currency "$grand_blocking" "$currency")" "$(format_currency "$grand_suggested" "$currency")" "$grand_count"
284
+ else
285
+ printf "%-25s %12s %12s %12s %8s\n" "GRAND TOTAL" "$(format_currency "$grand_total" "$currency")" "$(format_currency "$grand_blocking" "$currency")" "$(format_currency "$grand_suggested" "$currency")" "$grand_count"
286
+ fi
287
+
288
+ echo ""
289
+
290
+ # Additional analysis
291
+ if [[ "$use_colors" == true ]]; then
292
+ echo -e "${CYAN}Cost Analysis:${NC}"
293
+ else
294
+ echo "Cost Analysis:"
295
+ fi
296
+
297
+ # Calculate percentages
298
+ local blocking_percent
299
+ blocking_percent=$(echo "scale=1; ($grand_blocking * 100) / $grand_total" | bc)
300
+ local suggested_percent
301
+ suggested_percent=$(echo "scale=1; ($grand_suggested * 100) / $grand_total" | bc)
302
+
303
+ echo " Blocking recommendations: $(format_currency "$grand_blocking" "$currency") (${blocking_percent}%)"
304
+ echo " Suggested recommendations: $(format_currency "$grand_suggested" "$currency") (${suggested_percent}%)"
305
+ echo " Average cost per recommendation: $(format_currency "$(echo "scale=2; $grand_total / $grand_count" | bc)" "$currency")"
306
+ }
307
+
308
+ # Output detailed format
309
+ output_detailed() {
310
+ local cost_data="$1"
311
+ local currency="$2"
312
+ local use_colors="$3"
313
+
314
+ while IFS= read -r persona; do
315
+ local name
316
+ name=$(jq -r '.persona' <<< "$persona")
317
+ local display_name
318
+ display_name=$(echo "$name" | sed 's/-/ /g' | sed 's/\b\w/\u&/g')
319
+ local total
320
+ total=$(jq -r '.total' <<< "$persona")
321
+ local blocking
322
+ blocking=$(jq -r '.blocking' <<< "$persona")
323
+ local suggested
324
+ suggested=$(jq -r '.suggested' <<< "$persona")
325
+ local categories
326
+ categories=$(jq -c '.categories' <<< "$persona")
327
+
328
+ if [[ "$use_colors" == true ]]; then
329
+ echo -e "${CYAN}=== ${display_name} ===${NC}"
330
+ else
331
+ echo "=== ${display_name} ==="
332
+ fi
333
+
334
+ echo "Total Cost: $(format_currency "$total" "$currency")"
335
+ echo " - Blocking: $(format_currency "$blocking" "$currency")"
336
+ echo " - Suggested: $(format_currency "$suggested" "$currency")"
337
+
338
+ # Show categories if available
339
+ if [[ "$categories" != "{}" && "$categories" != "null" ]]; then
340
+ echo ""
341
+ echo "Cost by Category:"
342
+ echo "$categories" | jq -r 'to_entries[] | " \(.key): \(.value)"' | sed "s/^/ /"
343
+ fi
344
+
345
+ echo ""
346
+ echo "---"
347
+ echo ""
348
+ done <<< "$cost_data"
349
+ }
350
+
351
+ # Output CSV format
352
+ output_csv() {
353
+ local cost_data="$1"
354
+ local currency="$2"
355
+
356
+ # CSV header
357
+ echo "Persona,Total,Blocking,Suggested,Count"
358
+
359
+ # CSV rows
360
+ while IFS= read -r persona; do
361
+ local name
362
+ name=$(jq -r '.persona' <<< "$persona")
363
+ local total
364
+ total=$(jq -r '.total' <<< "$persona")
365
+ local blocking
366
+ blocking=$(jq -r '.blocking' <<< "$persona")
367
+ local suggested
368
+ suggested=$(jq -r '.suggested' <<< "$persona")
369
+ local count
370
+ count=$(jq -r '.count' <<< "$persona")
371
+
372
+ echo "\"$name\",$total,$blocking,$suggested,$count"
373
+ done <<< "$cost_data"
374
+ }
375
+
376
+ # Validate persona name
377
+ validate_persona() {
378
+ local persona="$1"
379
+ local valid_personas=("product-owner" "architect" "security-specialist" "performance-specialist" "accessibility-advocate" "devops-engineer")
380
+
381
+ for valid in "${valid_personas[@]}"; do
382
+ if [[ "$persona" == "$valid" ]]; then
383
+ return 0
384
+ fi
385
+ done
386
+
387
+ return 1
388
+ }
389
+
390
+ # Main execution
391
+ main() {
392
+ # Parse command line arguments
393
+ local json_file=""
394
+ local persona_filter=""
395
+ local type_filter=""
396
+ local priority_filter=""
397
+ local format="summary"
398
+ local currency="$"
399
+ local sort_by=""
400
+ local output_file=""
401
+ local use_colors=true
402
+ local show_help=false
403
+
404
+ while [[ $# -gt 0 ]]; do
405
+ case $1 in
406
+ -h|--help)
407
+ show_help=true
408
+ shift
409
+ ;;
410
+ -p|--persona)
411
+ persona_filter="$2"
412
+ validate_persona "$persona_filter" || { log_error "Invalid persona: $persona_filter"; exit 1; }
413
+ shift 2
414
+ ;;
415
+ -t|--type)
416
+ type_filter="$2"
417
+ if [[ "$type_filter" != "blocking" && "$type_filter" != "suggested" ]]; then
418
+ log_error "Invalid type: $type_filter"
419
+ exit 1
420
+ fi
421
+ shift 2
422
+ ;;
423
+ -r|--priority)
424
+ priority_filter="$2"
425
+ case "$priority_filter" in
426
+ "critical"|"high"|"medium"|"low") ;;
427
+ *) log_error "Invalid priority: $priority_filter"; exit 1 ;;
428
+ esac
429
+ shift 2
430
+ ;;
431
+ -f|--format)
432
+ format="$2"
433
+ case "$format" in
434
+ "summary"|"detailed"|"csv"|"json") ;;
435
+ *) log_error "Invalid format: $format"; exit 1 ;;
436
+ esac
437
+ shift 2
438
+ ;;
439
+ -c|--currency)
440
+ currency="$2"
441
+ shift 2
442
+ ;;
443
+ -s|--sort-by)
444
+ sort_by="$2"
445
+ case "$sort_by" in
446
+ "total"|"blocking"|"suggested"|"name") ;;
447
+ *) log_error "Invalid sort field: $sort_by"; exit 1 ;;
448
+ esac
449
+ shift 2
450
+ ;;
451
+ -o|--output)
452
+ output_file="$2"
453
+ shift 2
454
+ ;;
455
+ --no-colors)
456
+ use_colors=false
457
+ shift
458
+ ;;
459
+ -*)
460
+ log_error "Unknown option: $1"
461
+ log_error "Use -h or --help for usage information"
462
+ exit 1
463
+ ;;
464
+ *)
465
+ if [[ -z "$json_file" ]]; then
466
+ json_file="$1"
467
+ else
468
+ log_error "Too many arguments"
469
+ log_error "Use -h or --help for usage information"
470
+ exit 1
471
+ fi
472
+ shift
473
+ ;;
474
+ esac
475
+ done
476
+
477
+ # Show help if requested
478
+ if [[ "$show_help" == true ]]; then
479
+ show_help
480
+ exit 0
481
+ fi
482
+
483
+ # Validate required arguments
484
+ if [[ -z "$json_file" ]]; then
485
+ log_error "Missing required JSON file path"
486
+ log_error "Use -h or --help for usage information"
487
+ exit 1
488
+ fi
489
+
490
+ # Check if file exists
491
+ if [[ ! -f "$json_file" ]]; then
492
+ log_error "File not found: $json_file"
493
+ exit 1
494
+ fi
495
+
496
+ # Check if valid JSON
497
+ if ! jq empty "$json_file" 2>/dev/null; then
498
+ log_error "Invalid JSON format in: $json_file"
499
+ exit 1
500
+ fi
501
+
502
+ # Check if bc is available for floating point arithmetic
503
+ if ! command -v bc >/dev/null 2>&1; then
504
+ log_error "Required command 'bc' not found. Please install bc for floating point calculations."
505
+ exit 1
506
+ fi
507
+
508
+ # Calculate and output costs
509
+ local output
510
+ output=$(calculate_costs "$json_file" "$persona_filter" "$type_filter" "$priority_filter" "$format" "$currency" "$sort_by" "$use_colors")
511
+
512
+ # Output to file or stdout
513
+ if [[ -n "$output_file" ]]; then
514
+ echo "$output" > "$output_file"
515
+ log_success "Cost estimates written to: $output_file"
516
+ else
517
+ echo "$output"
518
+ fi
519
+
520
+ exit 0
521
+ }
522
+
523
+ # Execute main function
524
+ main "$@"