claude-flow-novice 2.15.3 → 2.15.4

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 (461) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  36. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  37. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  38. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  39. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  40. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  41. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  42. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  43. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  45. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  46. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  47. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  48. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  49. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  50. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  51. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  52. package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
  53. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  54. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  57. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  58. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  59. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  60. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  61. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  62. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  63. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  64. package/README.md +116 -475
  65. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  66. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  67. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  68. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  69. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  70. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  71. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  72. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  73. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  74. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  75. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  76. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  77. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  78. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  79. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  80. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  81. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  82. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  83. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  84. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  85. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  86. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  87. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  88. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  89. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  90. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  91. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  92. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  93. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  94. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  95. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  96. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  97. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  98. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  99. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  100. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  101. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  102. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  103. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  104. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  105. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  106. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  107. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  108. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  110. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  111. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  112. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  114. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  115. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  116. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  117. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  118. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  119. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  120. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  121. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  137. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  138. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  139. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  140. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  141. package/claude-assets/commands/switch-api.md +31 -10
  142. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  143. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  144. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  145. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  146. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  147. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
  148. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
  149. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  150. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  151. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  152. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  153. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  154. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  155. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  156. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  157. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  158. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  159. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  160. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  161. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  162. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  163. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  164. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  165. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  166. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  167. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  168. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  169. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  170. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  171. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  172. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  173. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  174. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  175. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  176. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  177. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  178. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  179. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  180. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  181. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  182. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  183. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  184. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  185. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  186. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  187. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  188. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  189. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  190. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  191. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  192. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  193. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
  194. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  195. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  196. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  197. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  198. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  199. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  200. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  201. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  202. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  203. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  204. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  205. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  206. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  207. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  208. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  209. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  210. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  211. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  212. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  213. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  214. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  215. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  216. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  217. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  218. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  219. package/claude-assets/skills/integration/agent-handoff.sh +62 -64
  220. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  221. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  222. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  223. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  224. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  225. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  226. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  227. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  228. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  229. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  230. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  231. package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
  232. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  233. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
  234. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  235. package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
  236. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  237. package/dist/ace/ace-curator.js +10 -2
  238. package/dist/ace/ace-curator.js.map +1 -1
  239. package/dist/ace/ace-generator.js +4 -0
  240. package/dist/ace/ace-generator.js.map +1 -1
  241. package/dist/ace/ace-reflector.js +1 -1
  242. package/dist/ace/ace-reflector.js.map +1 -1
  243. package/dist/ace/context-injection.js +24 -2
  244. package/dist/ace/context-injection.js.map +1 -1
  245. package/dist/agents/agent-loader.js +146 -165
  246. package/dist/agents/agent-loader.js.map +1 -1
  247. package/dist/agents/task-agent-integration.js +1 -1
  248. package/dist/agents/task-agent-integration.js.map +1 -1
  249. package/dist/api/health-endpoints.js +390 -0
  250. package/dist/api/health-endpoints.js.map +1 -0
  251. package/dist/cli/agent-executor.js +4 -1
  252. package/dist/cli/agent-executor.js.map +1 -1
  253. package/dist/cli/agent-prompt-builder.js +89 -1
  254. package/dist/cli/agent-prompt-builder.js.map +1 -1
  255. package/dist/cli/agent-spawn.js +130 -37
  256. package/dist/cli/agent-spawn.js.map +1 -1
  257. package/dist/cli/skill-cache-validator.js +412 -0
  258. package/dist/cli/skill-cache-validator.js.map +1 -0
  259. package/dist/cli/skill-cli.js +991 -0
  260. package/dist/cli/skill-cli.js.map +1 -0
  261. package/dist/cli/skill-execution-logger.js +284 -0
  262. package/dist/cli/skill-execution-logger.js.map +1 -0
  263. package/dist/cli/skill-loader.js +457 -0
  264. package/dist/cli/skill-loader.js.map +1 -0
  265. package/dist/coordination/event-bus.js +2 -2
  266. package/dist/coordination/event-bus.js.map +1 -1
  267. package/dist/coordination/fleet-manager.js +1 -1
  268. package/dist/coordination/fleet-manager.js.map +1 -1
  269. package/dist/coordination/index.js +23 -9
  270. package/dist/coordination/index.js.map +1 -1
  271. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  272. package/dist/db/migration-manager.js +483 -0
  273. package/dist/db/migration-manager.js.map +1 -0
  274. package/dist/db/skills-query.js +535 -0
  275. package/dist/db/skills-query.js.map +1 -0
  276. package/dist/integration/DatabaseHandoff.js +1 -1
  277. package/dist/integration/DatabaseHandoff.js.map +1 -1
  278. package/dist/jobs/edge-case-analyzer.js +367 -0
  279. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  280. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  281. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  282. package/dist/lib/agent-output-parser.js.map +1 -1
  283. package/dist/lib/agent-output-validator.js.map +1 -1
  284. package/dist/lib/agent-workspace.js +281 -0
  285. package/dist/lib/agent-workspace.js.map +1 -0
  286. package/dist/lib/atomic-file-writer.js +377 -0
  287. package/dist/lib/atomic-file-writer.js.map +1 -0
  288. package/dist/lib/backup-manager.js +779 -0
  289. package/dist/lib/backup-manager.js.map +1 -0
  290. package/dist/lib/checkpoint-manager.js +837 -0
  291. package/dist/lib/checkpoint-manager.js.map +1 -0
  292. package/dist/lib/circuit-breaker.js +340 -0
  293. package/dist/lib/circuit-breaker.js.map +1 -0
  294. package/dist/lib/completion-signal-handler.js +243 -0
  295. package/dist/lib/completion-signal-handler.js.map +1 -0
  296. package/dist/lib/config-manager.js +312 -0
  297. package/dist/lib/config-manager.js.map +1 -0
  298. package/dist/lib/config-migrator.js +386 -0
  299. package/dist/lib/config-migrator.js.map +1 -0
  300. package/dist/lib/config-validator.js.map +1 -1
  301. package/dist/lib/correlation-cache.js +311 -0
  302. package/dist/lib/correlation-cache.js.map +1 -0
  303. package/dist/lib/correlation.js +263 -0
  304. package/dist/lib/correlation.js.map +1 -0
  305. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  306. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  307. package/dist/lib/database-service/correlation.js +329 -0
  308. package/dist/lib/database-service/correlation.js.map +1 -0
  309. package/dist/lib/database-service/errors.js +120 -0
  310. package/dist/lib/database-service/errors.js.map +1 -0
  311. package/dist/lib/database-service/index.js +168 -0
  312. package/dist/lib/database-service/index.js.map +1 -0
  313. package/dist/lib/database-service/postgres-adapter.js +526 -0
  314. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  315. package/dist/lib/database-service/redis-adapter.js +360 -0
  316. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  317. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  318. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  319. package/dist/lib/database-service/transaction-manager.js +773 -0
  320. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  321. package/dist/lib/database-service/types.js +23 -0
  322. package/dist/lib/database-service/types.js.map +1 -0
  323. package/dist/lib/deadlock-resolver.js +292 -0
  324. package/dist/lib/deadlock-resolver.js.map +1 -0
  325. package/dist/lib/distributed-lock.js +451 -0
  326. package/dist/lib/distributed-lock.js.map +1 -0
  327. package/dist/lib/edge-case-deduplicator.js +227 -0
  328. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  329. package/dist/lib/encryption-manager.js +322 -0
  330. package/dist/lib/encryption-manager.js.map +1 -0
  331. package/dist/lib/error-aggregator.js +234 -0
  332. package/dist/lib/error-aggregator.js.map +1 -0
  333. package/dist/lib/errors.js +287 -0
  334. package/dist/lib/errors.js.map +1 -0
  335. package/dist/lib/file-lock-manager.js +578 -0
  336. package/dist/lib/file-lock-manager.js.map +1 -0
  337. package/dist/lib/file-operations.js +367 -0
  338. package/dist/lib/file-operations.js.map +1 -0
  339. package/dist/lib/idempotent-write.js +237 -0
  340. package/dist/lib/idempotent-write.js.map +1 -0
  341. package/dist/lib/integration-schema-validator.js +522 -0
  342. package/dist/lib/integration-schema-validator.js.map +1 -0
  343. package/dist/lib/lock-health-monitor.js +298 -0
  344. package/dist/lib/lock-health-monitor.js.map +1 -0
  345. package/dist/lib/log-shipper.js +422 -0
  346. package/dist/lib/log-shipper.js.map +1 -0
  347. package/dist/lib/logging.js +146 -0
  348. package/dist/lib/logging.js.map +1 -0
  349. package/dist/lib/message-deduplicator.js +439 -0
  350. package/dist/lib/message-deduplicator.js.map +1 -0
  351. package/dist/lib/multi-system-query.js +604 -0
  352. package/dist/lib/multi-system-query.js.map +1 -0
  353. package/dist/lib/orphan-detector.js +332 -0
  354. package/dist/lib/orphan-detector.js.map +1 -0
  355. package/dist/lib/password-generator.js +166 -0
  356. package/dist/lib/password-generator.js.map +1 -0
  357. package/dist/lib/path-validator.js +429 -0
  358. package/dist/lib/path-validator.js.map +1 -0
  359. package/dist/lib/query-translator.js +905 -0
  360. package/dist/lib/query-translator.js.map +1 -0
  361. package/dist/lib/queue-recovery.js +469 -0
  362. package/dist/lib/queue-recovery.js.map +1 -0
  363. package/dist/lib/redis-queue-manager.js +512 -0
  364. package/dist/lib/redis-queue-manager.js.map +1 -0
  365. package/dist/lib/reflection-archiver.js +272 -0
  366. package/dist/lib/reflection-archiver.js.map +1 -0
  367. package/dist/lib/retry-manager.js +453 -0
  368. package/dist/lib/retry-manager.js.map +1 -0
  369. package/dist/lib/retry.js +262 -0
  370. package/dist/lib/retry.js.map +1 -0
  371. package/dist/lib/schema-transform.js +695 -0
  372. package/dist/lib/schema-transform.js.map +1 -0
  373. package/dist/lib/schema-validator.js +491 -0
  374. package/dist/lib/schema-validator.js.map +1 -0
  375. package/dist/lib/skill-cache.js +297 -0
  376. package/dist/lib/skill-cache.js.map +1 -0
  377. package/dist/lib/skill-content-manager.js +337 -0
  378. package/dist/lib/skill-content-manager.js.map +1 -0
  379. package/dist/lib/skill-frontmatter-parser.js +237 -0
  380. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  381. package/dist/lib/skill-git-integration.js +275 -0
  382. package/dist/lib/skill-git-integration.js.map +1 -0
  383. package/dist/lib/skill-markdown-validator.js +396 -0
  384. package/dist/lib/skill-markdown-validator.js.map +1 -0
  385. package/dist/lib/skill-output-parser.js +312 -0
  386. package/dist/lib/skill-output-parser.js.map +1 -0
  387. package/dist/lib/unified-query-api.js +467 -0
  388. package/dist/lib/unified-query-api.js.map +1 -0
  389. package/dist/middleware/auth-middleware.js +350 -0
  390. package/dist/middleware/auth-middleware.js.map +1 -0
  391. package/dist/middleware/schema-validation.js +347 -0
  392. package/dist/middleware/schema-validation.js.map +1 -0
  393. package/dist/providers/anthropic-provider.js +1 -1
  394. package/dist/providers/anthropic-provider.js.map +1 -1
  395. package/dist/providers/provider-factory.js +2 -2
  396. package/dist/providers/provider-factory.js.map +1 -1
  397. package/dist/services/edge-case-analyzer.js +321 -0
  398. package/dist/services/edge-case-analyzer.js.map +1 -0
  399. package/dist/services/edge-case-deduplicator.js +266 -0
  400. package/dist/services/edge-case-deduplicator.js.map +1 -0
  401. package/dist/services/edge-case-detector.js +337 -0
  402. package/dist/services/edge-case-detector.js.map +1 -0
  403. package/dist/services/edge-case-tracker.js +547 -0
  404. package/dist/services/edge-case-tracker.js.map +1 -0
  405. package/dist/services/health-check-system.js +586 -0
  406. package/dist/services/health-check-system.js.map +1 -0
  407. package/dist/services/metrics-logger.js +412 -0
  408. package/dist/services/metrics-logger.js.map +1 -0
  409. package/dist/services/patch-generator.js +378 -0
  410. package/dist/services/patch-generator.js.map +1 -0
  411. package/dist/services/patch-validator.js +337 -0
  412. package/dist/services/patch-validator.js.map +1 -0
  413. package/dist/services/performance-monitor.js +811 -0
  414. package/dist/services/performance-monitor.js.map +1 -0
  415. package/dist/services/promotion-pipeline.js +918 -0
  416. package/dist/services/promotion-pipeline.js.map +1 -0
  417. package/dist/services/promotion-validator.js +394 -0
  418. package/dist/services/promotion-validator.js.map +1 -0
  419. package/dist/services/reflection-logger.js +388 -0
  420. package/dist/services/reflection-logger.js.map +1 -0
  421. package/dist/services/skill-deployment.js +472 -0
  422. package/dist/services/skill-deployment.js.map +1 -0
  423. package/dist/services/skill-loader.js +427 -0
  424. package/dist/services/skill-loader.js.map +1 -0
  425. package/dist/services/skill-promotion.js +372 -0
  426. package/dist/services/skill-promotion.js.map +1 -0
  427. package/dist/services/skill-validator.js +454 -0
  428. package/dist/services/skill-validator.js.map +1 -0
  429. package/dist/services/skill-versioning.js +244 -0
  430. package/dist/services/skill-versioning.js.map +1 -0
  431. package/dist/services/workspace-supervisor.js +597 -0
  432. package/dist/services/workspace-supervisor.js.map +1 -0
  433. package/dist/types/edge-case.js +45 -0
  434. package/dist/types/edge-case.js.map +1 -0
  435. package/package.json +201 -177
  436. package/readme/README.md +19 -4
  437. package/scripts/backup-cleanup.sh +627 -0
  438. package/scripts/cleanup-workspaces.sh +412 -0
  439. package/scripts/cleanup-yaml-configs.sh +141 -0
  440. package/scripts/deploy-approved-skills.sh +263 -0
  441. package/scripts/health-check.sh +447 -0
  442. package/scripts/log-aggregator.sh +554 -0
  443. package/scripts/log-monitor.sh +629 -0
  444. package/scripts/manage-agent-workspaces.sh +434 -0
  445. package/scripts/migrate-schema.sh +533 -0
  446. package/scripts/promote-staged-skills.sh +423 -0
  447. package/scripts/verify-no-secrets.sh +88 -35
  448. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  449. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  450. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  451. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  452. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  453. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  454. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  455. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  456. package/README.md.backup_before_replace +0 -781
  457. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  458. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  459. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  460. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  461. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1,664 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # propagate-skill-update.sh - Propagate Skill Update from Phase 4 Edge Case Tracker
4
+ #
5
+ # Purpose:
6
+ # When Phase 4 Edge Case Tracker detects and approves a skill improvement,
7
+ # this script propagates the changes back to the Skills Database with proper
8
+ # version management and approval tracking.
9
+ #
10
+ # Usage:
11
+ # propagate-skill-update.sh SKILL_NAME NEW_VERSION UPDATE_PATH [CHANGE_TYPE] [NOTIFY_AGENTS]
12
+ #
13
+ # Parameters:
14
+ # SKILL_NAME - Skill name (e.g., "jwt-authentication")
15
+ # NEW_VERSION - New version (e.g., "1.0.1", "1.1.0", "2.0.0")
16
+ # UPDATE_PATH - Path to updated skill markdown file
17
+ # CHANGE_TYPE - Version change type: patch|minor|major (default: patch)
18
+ # NOTIFY_AGENTS - Whether to notify agents: true|false (default: false)
19
+ #
20
+ # Phase 4 Integration:
21
+ # After Phase 4 edge case tracker detects and approves a skill improvement:
22
+ #
23
+ # ./.claude/skills/workflow-codification/propagate-skill-update.sh \
24
+ # "$SKILL_NAME" \
25
+ # "$NEW_VERSION" \
26
+ # "$UPDATE_PATH" \
27
+ # "$CHANGE_TYPE" \
28
+ # "$NOTIFY_AGENTS"
29
+ #
30
+ # Examples:
31
+ #
32
+ # Bug fix (patch):
33
+ # ./.claude/skills/workflow-codification/propagate-skill-update.sh \
34
+ # "jwt-authentication" \
35
+ # "1.0.1" \
36
+ # ".claude/skills/auth/jwt-auth-v1.0.1.md" \
37
+ # "patch" \
38
+ # "true"
39
+ #
40
+ # New feature (minor):
41
+ # ./.claude/skills/workflow-codification/propagate-skill-update.sh \
42
+ # "jwt-authentication" \
43
+ # "1.1.0" \
44
+ # ".claude/skills/auth/jwt-auth-v1.1.0.md" \
45
+ # "minor" \
46
+ # "false"
47
+ #
48
+ # Breaking change (major):
49
+ # ./.claude/skills/workflow-codification/propagate-skill-update.sh \
50
+ # "jwt-authentication" \
51
+ # "2.0.0" \
52
+ # ".claude/skills/auth/jwt-auth-v2.0.0.md" \
53
+ # "major" \
54
+ # "true"
55
+ #
56
+ # Exit Codes:
57
+ # 0 - Success
58
+ # 1 - Invalid parameters
59
+ # 2 - File not found
60
+ # 3 - Database error
61
+ # 4 - Skill not found in database
62
+ # 5 - Invalid version increment
63
+ # 6 - Content hash unchanged (no update needed)
64
+ #
65
+ # Environment Variables:
66
+ # CFN_SKILLS_DB_PATH - Path to Skills DB (default: ./.claude/skills-database/skills.db)
67
+ # PHASE4_POSTGRES_HOST - PostgreSQL host for Phase 4 (optional)
68
+ # PHASE4_POSTGRES_DB - PostgreSQL database name (default: workflow_codification)
69
+ # PHASE4_POSTGRES_USER - PostgreSQL username (optional)
70
+ # PHASE4_POSTGRES_PASS - PostgreSQL password (optional)
71
+ # ENABLE_AGENT_NOTIFICATIONS - Enable agent notifications (default: false)
72
+
73
+ set -euo pipefail
74
+
75
+ # Configuration
76
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
77
+ PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
78
+
79
+ # Source security utilities (SQL escaping, secure credentials)
80
+ source "${SCRIPT_DIR}/lib/security-utils.sh"
81
+
82
+ # Skills Database (SQLite - required)
83
+ CFN_SKILLS_DB_PATH="${CFN_SKILLS_DB_PATH:-./.claude/skills-database/skills.db}"
84
+
85
+ # Phase 4 PostgreSQL (optional)
86
+ PHASE4_POSTGRES_HOST="${PHASE4_POSTGRES_HOST:-}"
87
+ PHASE4_POSTGRES_DB="${PHASE4_POSTGRES_DB:-workflow_codification}"
88
+ PHASE4_POSTGRES_USER="${PHASE4_POSTGRES_USER:-}"
89
+ PHASE4_POSTGRES_PASS="${PHASE4_POSTGRES_PASS:-}"
90
+
91
+ # Agent notifications
92
+ ENABLE_AGENT_NOTIFICATIONS="${ENABLE_AGENT_NOTIFICATIONS:-false}"
93
+
94
+ # Color codes
95
+ RED='\033[0;31m'
96
+ GREEN='\033[0;32m'
97
+ YELLOW='\033[1;33m'
98
+ BLUE='\033[0;34m'
99
+ CYAN='\033[0;36m'
100
+ NC='\033[0m'
101
+
102
+ #######################################
103
+ # Utility functions
104
+ #######################################
105
+ log_info() {
106
+ echo -e "${BLUE}[INFO]${NC} $*" >&2
107
+ }
108
+
109
+ log_success() {
110
+ echo -e "${GREEN}[SUCCESS]${NC} $*" >&2
111
+ }
112
+
113
+ log_error() {
114
+ echo -e "${RED}[ERROR]${NC} $*" >&2
115
+ }
116
+
117
+ log_warning() {
118
+ echo -e "${YELLOW}[WARNING]${NC} $*" >&2
119
+ }
120
+
121
+ log_debug() {
122
+ if [[ "${DEBUG:-0}" == "1" ]]; then
123
+ echo -e "${CYAN}[DEBUG]${NC} $*" >&2
124
+ fi
125
+ }
126
+
127
+ error_exit() {
128
+ local exit_code="$1"
129
+ shift
130
+ log_error "$@"
131
+ exit "$exit_code"
132
+ }
133
+
134
+ #######################################
135
+ # Validation functions
136
+ #######################################
137
+ validate_parameters() {
138
+ local skill_name="$1"
139
+ local new_version="$2"
140
+ local update_path="$3"
141
+
142
+ # Validate required parameters
143
+ if [[ -z "$skill_name" ]] || [[ -z "$new_version" ]] || [[ -z "$update_path" ]]; then
144
+ echo "[ERROR] Missing required parameters" >&2
145
+ echo "Usage: propagate-skill-update.sh SKILL_NAME NEW_VERSION UPDATE_PATH [CHANGE_TYPE] [NOTIFY_AGENTS]" >&2
146
+ echo "" >&2
147
+ echo "Example:" >&2
148
+ echo " propagate-skill-update.sh jwt-authentication 1.0.1 ./skill-v1.0.1.md patch true" >&2
149
+ exit 1
150
+ fi
151
+
152
+ # SECURITY FIX: Validate skill name (prevent injection)
153
+ validate_skill_name "$skill_name" || exit 1
154
+
155
+ # Validate version format (semantic versioning)
156
+ if ! [[ "$new_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
157
+ echo "[ERROR] Invalid version format: $new_version" >&2
158
+ echo "Expected format: MAJOR.MINOR.PATCH (e.g., 1.0.1)" >&2
159
+ exit 1
160
+ fi
161
+
162
+ # Validate update file exists
163
+ if [[ ! -f "$update_path" ]]; then
164
+ echo "[ERROR] Update file not found: $update_path" >&2
165
+ exit 2
166
+ fi
167
+
168
+ # Validate update file is readable
169
+ if [[ ! -r "$update_path" ]]; then
170
+ echo "[ERROR] Update file is not readable: $update_path" >&2
171
+ echo "Check file permissions." >&2
172
+ exit 2
173
+ fi
174
+
175
+ # SECURITY FIX: Validate file path (prevent traversal)
176
+ validate_file_path "$update_path" "$PROJECT_ROOT" || exit 1
177
+
178
+ # Validate database exists
179
+ if [[ ! -f "$CFN_SKILLS_DB_PATH" ]]; then
180
+ echo "[ERROR] Skills database not found: $CFN_SKILLS_DB_PATH" >&2
181
+ exit 3
182
+ fi
183
+
184
+ # SECURITY FIX: Escape SQL string before query
185
+ local safe_skill_name
186
+ safe_skill_name=$(escape_sql_string "$skill_name")
187
+
188
+ # Validate skill exists in database (before attempting update)
189
+ local skill_count
190
+ skill_count=$(sqlite3 "$CFN_SKILLS_DB_PATH" "SELECT COUNT(*) FROM skills WHERE name='${safe_skill_name}'" 2>/dev/null || echo "0")
191
+
192
+ if [[ "$skill_count" -eq 0 ]]; then
193
+ echo "[ERROR] Skill not found in database: $skill_name" >&2
194
+ echo "Available skills:" >&2
195
+ sqlite3 "$CFN_SKILLS_DB_PATH" "SELECT name FROM skills ORDER BY name" 2>/dev/null || echo " (could not retrieve skills list)" >&2
196
+ exit 4
197
+ fi
198
+ }
199
+
200
+ validate_change_type() {
201
+ local change_type="$1"
202
+
203
+ # Validate CHANGE_TYPE if provided
204
+ if [[ -n "$change_type" ]] && ! [[ "$change_type" =~ ^(patch|minor|major)$ ]]; then
205
+ echo "[ERROR] Invalid CHANGE_TYPE: $change_type" >&2
206
+ echo "Valid values: patch, minor, major" >&2
207
+ exit 1
208
+ fi
209
+ }
210
+
211
+ #######################################
212
+ # Frontmatter parsing functions
213
+ #######################################
214
+ parse_frontmatter() {
215
+ local file_path="$1"
216
+ local key="$2"
217
+
218
+ # Extract frontmatter between --- markers
219
+ local frontmatter=$(sed -n '/^---$/,/^---$/p' "$file_path" | sed '1d;$d')
220
+
221
+ # Parse specific key
222
+ local value=$(echo "$frontmatter" | grep "^${key}:" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
223
+
224
+ # Handle array format [tag1, tag2] → convert to JSON array
225
+ if [[ "$value" =~ ^\[.*\]$ ]]; then
226
+ # Convert [tag1, tag2] to ["tag1", "tag2"]
227
+ value=$(echo "$value" | sed 's/\[//;s/\]//' | awk -F', *' '{printf "["; for(i=1;i<=NF;i++) {if(i>1) printf ","; printf "\"" $i "\""} printf "]"}')
228
+ fi
229
+
230
+ echo "$value"
231
+ }
232
+
233
+ #######################################
234
+ # Version management functions
235
+ #######################################
236
+ parse_version() {
237
+ local version="$1"
238
+ local -n major_ref="$2"
239
+ local -n minor_ref="$3"
240
+ local -n patch_ref="$4"
241
+
242
+ IFS='.' read -r major_ref minor_ref patch_ref <<< "$version"
243
+ }
244
+
245
+ compare_versions() {
246
+ local current_version="$1"
247
+ local new_version="$2"
248
+
249
+ local current_major current_minor current_patch
250
+ local new_major new_minor new_patch
251
+
252
+ parse_version "$current_version" current_major current_minor current_patch
253
+ parse_version "$new_version" new_major new_minor new_patch
254
+
255
+ # Compare major
256
+ if [[ $new_major -gt $current_major ]]; then
257
+ echo "major"
258
+ return 0
259
+ elif [[ $new_major -lt $current_major ]]; then
260
+ echo "downgrade"
261
+ return 0
262
+ fi
263
+
264
+ # Compare minor
265
+ if [[ $new_minor -gt $current_minor ]]; then
266
+ echo "minor"
267
+ return 0
268
+ elif [[ $new_minor -lt $current_minor ]]; then
269
+ echo "downgrade"
270
+ return 0
271
+ fi
272
+
273
+ # Compare patch
274
+ if [[ $new_patch -gt $current_patch ]]; then
275
+ echo "patch"
276
+ return 0
277
+ elif [[ $new_patch -lt $current_patch ]]; then
278
+ echo "downgrade"
279
+ return 0
280
+ fi
281
+
282
+ echo "same"
283
+ }
284
+
285
+ validate_version_increment() {
286
+ local current_version="$1"
287
+ local new_version="$2"
288
+ local expected_change_type="$3"
289
+
290
+ local actual_change_type
291
+ actual_change_type=$(compare_versions "$current_version" "$new_version")
292
+
293
+ log_debug "Version comparison: $current_version → $new_version (detected: $actual_change_type, expected: $expected_change_type)"
294
+
295
+ case "$actual_change_type" in
296
+ same)
297
+ error_exit 4 "Version unchanged: $current_version → $new_version"
298
+ ;;
299
+ downgrade)
300
+ error_exit 4 "Version downgrade not allowed: $current_version → $new_version"
301
+ ;;
302
+ patch|minor|major)
303
+ if [[ "$actual_change_type" != "$expected_change_type" ]]; then
304
+ error_exit 4 "Version change type mismatch: detected $actual_change_type, but change_type=$expected_change_type (version: $current_version → $new_version)"
305
+ fi
306
+ ;;
307
+ *)
308
+ error_exit 4 "Invalid version comparison result: $actual_change_type"
309
+ ;;
310
+ esac
311
+
312
+ log_debug "Version increment validated: $current_version → $new_version ($expected_change_type)"
313
+ }
314
+
315
+ #######################################
316
+ # Database functions
317
+ #######################################
318
+ get_skill_info() {
319
+ local skill_name="$1"
320
+
321
+ local result
322
+ result=$(sqlite3 "$CFN_SKILLS_DB_PATH" <<EOF
323
+ SELECT id, version, content_hash, content_path
324
+ FROM skills
325
+ WHERE name = '$skill_name';
326
+ EOF
327
+ )
328
+
329
+ if [[ -z "$result" ]]; then
330
+ error_exit 4 "Skill not found in database: $skill_name"
331
+ fi
332
+
333
+ echo "$result"
334
+ }
335
+
336
+ calculate_content_hash() {
337
+ local file_path="$1"
338
+
339
+ if [[ ! -f "$file_path" ]]; then
340
+ error_exit 2 "Cannot calculate hash - file not found: $file_path"
341
+ fi
342
+
343
+ sha256sum "$file_path" | awk '{print $1}'
344
+ }
345
+
346
+ update_skill_record() {
347
+ local skill_id="$1"
348
+ local new_version="$2"
349
+ local new_hash="$3"
350
+ local update_path="$4"
351
+ local new_tags="$5"
352
+ local new_category="$6"
353
+ local new_owner="$7"
354
+ local new_approval_level="$8"
355
+
356
+ log_info "Updating skill record (ID: $skill_id)"
357
+
358
+ # SECURITY FIX: Escape all SQL strings to prevent injection
359
+ local safe_new_version
360
+ safe_new_version=$(escape_sql_string "$new_version")
361
+ local safe_new_hash
362
+ safe_new_hash=$(escape_sql_string "$new_hash")
363
+ local safe_update_path
364
+ safe_update_path=$(escape_sql_string "$update_path")
365
+ local safe_new_tags
366
+ safe_new_tags=$(escape_sql_string "$new_tags")
367
+ local safe_new_category
368
+ safe_new_category=$(escape_sql_string "$new_category")
369
+ local safe_new_owner
370
+ safe_new_owner=$(escape_sql_string "$new_owner")
371
+ local safe_new_approval_level
372
+ safe_new_approval_level=$(escape_sql_string "$new_approval_level")
373
+
374
+ sqlite3 "$CFN_SKILLS_DB_PATH" <<EOF
375
+ UPDATE skills
376
+ SET version = '${safe_new_version}',
377
+ content_hash = '${safe_new_hash}',
378
+ content_path = '${safe_update_path}',
379
+ tags = '${safe_new_tags}',
380
+ category = '${safe_new_category}',
381
+ owner = '${safe_new_owner}',
382
+ approval_level = '${safe_new_approval_level}',
383
+ updated_at = datetime('now')
384
+ WHERE id = ${skill_id};
385
+ EOF
386
+
387
+ if [[ $? -ne 0 ]]; then
388
+ error_exit 6 "Failed to update skill record"
389
+ fi
390
+
391
+ log_debug "Skill record updated successfully"
392
+ log_info "Metadata refreshed from frontmatter:"
393
+ log_info " Tags: $new_tags"
394
+ log_info " Category: $new_category"
395
+ log_info " Owner: $new_owner"
396
+ log_info " Approval Level: $new_approval_level"
397
+ }
398
+
399
+ record_approval_history() {
400
+ local skill_id="$1"
401
+ local new_version="$2"
402
+ local change_type="$3"
403
+
404
+ log_info "Recording approval history"
405
+
406
+ local metadata
407
+ metadata=$(cat <<EOF
408
+ {
409
+ "change_type": "$change_type",
410
+ "source": "phase4-edge-case-tracker",
411
+ "propagated_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
412
+ }
413
+ EOF
414
+ )
415
+
416
+ # SECURITY FIX: Escape SQL strings
417
+ local safe_new_version
418
+ safe_new_version=$(escape_sql_string "$new_version")
419
+ local safe_metadata
420
+ safe_metadata=$(escape_sql_string "$metadata")
421
+
422
+ sqlite3 "$CFN_SKILLS_DB_PATH" <<EOF
423
+ INSERT INTO approval_history (
424
+ skill_id,
425
+ version,
426
+ approval_level,
427
+ approver,
428
+ decision,
429
+ reasoning,
430
+ approval_criteria_check,
431
+ timestamp
432
+ ) VALUES (
433
+ ${skill_id},
434
+ '${safe_new_version}',
435
+ 'auto',
436
+ 'phase4-edge-case-tracker',
437
+ 'approved',
438
+ 'Edge case update propagated from Phase 4 after expert review and validation',
439
+ '${safe_metadata}',
440
+ datetime('now')
441
+ );
442
+ EOF
443
+
444
+ if [[ $? -ne 0 ]]; then
445
+ error_exit 6 "Failed to record approval history"
446
+ fi
447
+
448
+ log_debug "Approval history recorded"
449
+ }
450
+
451
+ get_affected_agents() {
452
+ local skill_id="$1"
453
+
454
+ # SECURITY FIX: Skill ID should be numeric (validated earlier)
455
+ # But add explicit check for safety
456
+ if ! [[ "$skill_id" =~ ^[0-9]+$ ]]; then
457
+ log_error "Invalid skill ID (must be numeric): $skill_id"
458
+ return 1
459
+ fi
460
+
461
+ sqlite3 "$CFN_SKILLS_DB_PATH" <<EOF
462
+ SELECT DISTINCT agent_type
463
+ FROM agent_skill_mappings
464
+ WHERE skill_id = ${skill_id}
465
+ ORDER BY agent_type;
466
+ EOF
467
+ }
468
+
469
+ #######################################
470
+ # PostgreSQL integration (optional)
471
+ #######################################
472
+ update_phase4_edge_case_status() {
473
+ local skill_name="$1"
474
+ local new_version="$2"
475
+
476
+ if [[ -z "$PHASE4_POSTGRES_HOST" ]]; then
477
+ log_debug "PostgreSQL not configured - skipping Phase 4 status update"
478
+ return 0
479
+ fi
480
+
481
+ log_info "Updating Phase 4 edge case status (if applicable)"
482
+
483
+ # This would update the edge_cases table in PostgreSQL
484
+ # Implementation depends on Phase 4 schema
485
+ # For now, just log that we would do this
486
+
487
+ log_debug "Phase 4 status update would occur here for skill: $skill_name, version: $new_version"
488
+ }
489
+
490
+ #######################################
491
+ # Agent notification
492
+ #######################################
493
+ notify_affected_agents() {
494
+ local skill_id="$1"
495
+ local skill_name="$2"
496
+ local old_version="$3"
497
+ local new_version="$4"
498
+ local change_type="$5"
499
+
500
+ local agents
501
+ agents=$(get_affected_agents "$skill_id")
502
+
503
+ if [[ -z "$agents" ]]; then
504
+ log_info "No agents using this skill"
505
+ return 0
506
+ fi
507
+
508
+ local agent_count
509
+ agent_count=$(echo "$agents" | wc -l)
510
+
511
+ log_info "Agents using this skill ($agent_count):"
512
+ echo "$agents" | while read -r agent_type; do
513
+ echo " - $agent_type"
514
+ done
515
+
516
+ # Optional: Create notification records
517
+ # This would require a notifications table in the database
518
+ # For now, we just list the agents
519
+
520
+ echo ""
521
+ log_success "Notification: Skill '$skill_name' updated from $old_version to $new_version ($change_type)"
522
+ log_info "Affected agents should reload skill content on next invocation"
523
+ }
524
+
525
+ #######################################
526
+ # Main execution
527
+ #######################################
528
+ main() {
529
+ local skill_name="$1"
530
+ local new_version="$2"
531
+ local update_path="$3"
532
+ local change_type="${4:-patch}"
533
+ local notify_agents="${5:-false}"
534
+
535
+ log_info "=========================================="
536
+ log_info "Propagate Skill Update"
537
+ log_info "=========================================="
538
+ log_info "Skill: $skill_name"
539
+ log_info "New Version: $new_version"
540
+ log_info "Update Path: $update_path"
541
+ log_info "Change Type: $change_type"
542
+ log_info "Notify Agents: $notify_agents"
543
+ log_info "=========================================="
544
+ echo ""
545
+
546
+ # Step 1: Validate inputs
547
+ log_info "Step 1: Validating inputs"
548
+ validate_parameters "$skill_name" "$new_version" "$update_path"
549
+ validate_change_type "$change_type"
550
+ log_success "Input validation passed"
551
+ echo ""
552
+
553
+ # Step 2: Lookup existing skill
554
+ log_info "Step 2: Looking up existing skill"
555
+ local skill_info
556
+ skill_info=$(get_skill_info "$skill_name")
557
+
558
+ local skill_id current_version current_hash current_path
559
+ IFS='|' read -r skill_id current_version current_hash current_path <<< "$skill_info"
560
+
561
+ log_info "Found skill: ID=$skill_id, Current Version=$current_version"
562
+ log_debug "Current Hash: $current_hash"
563
+ log_debug "Current Path: $current_path"
564
+ echo ""
565
+
566
+ # Step 3: Validate version increment
567
+ log_info "Step 3: Validating version increment"
568
+ validate_version_increment "$current_version" "$new_version" "$change_type"
569
+ log_success "Version increment validated: $current_version → $new_version ($change_type)"
570
+ echo ""
571
+
572
+ # Step 4: Calculate new content hash
573
+ log_info "Step 4: Calculating new content hash"
574
+ local new_hash
575
+ new_hash=$(calculate_content_hash "$update_path")
576
+ log_debug "New Hash: $new_hash"
577
+
578
+ # Check if content actually changed
579
+ if [[ "$new_hash" == "$current_hash" ]]; then
580
+ log_warning "Content hash unchanged - no actual content changes detected"
581
+ log_warning "Old Hash: $current_hash"
582
+ log_warning "New Hash: $new_hash"
583
+ error_exit 5 "Content hash unchanged - update not needed (version would increment without content changes)"
584
+ fi
585
+
586
+ log_success "Content hash calculated and differs from current"
587
+ echo ""
588
+
589
+ # Step 5: Parse frontmatter metadata and update skill record
590
+ log_info "Step 5: Parsing frontmatter metadata from updated skill"
591
+ local new_tags new_category new_owner new_approval_level
592
+
593
+ new_tags=$(parse_frontmatter "$update_path" "tags")
594
+ new_category=$(parse_frontmatter "$update_path" "category")
595
+ new_owner=$(parse_frontmatter "$update_path" "owner")
596
+ new_approval_level=$(parse_frontmatter "$update_path" "approval_level")
597
+
598
+ # Use existing values if not found in frontmatter
599
+ if [[ -z "$new_tags" ]]; then
600
+ new_tags=$(sqlite3 "$CFN_SKILLS_DB_PATH" "SELECT tags FROM skills WHERE id=$skill_id")
601
+ log_debug "Tags not found in frontmatter, using existing: $new_tags"
602
+ fi
603
+
604
+ if [[ -z "$new_category" ]]; then
605
+ new_category=$(sqlite3 "$CFN_SKILLS_DB_PATH" "SELECT category FROM skills WHERE id=$skill_id")
606
+ log_debug "Category not found in frontmatter, using existing: $new_category"
607
+ fi
608
+
609
+ if [[ -z "$new_owner" ]]; then
610
+ new_owner=$(sqlite3 "$CFN_SKILLS_DB_PATH" "SELECT owner FROM skills WHERE id=$skill_id")
611
+ log_debug "Owner not found in frontmatter, using existing: $new_owner"
612
+ fi
613
+
614
+ if [[ -z "$new_approval_level" ]]; then
615
+ new_approval_level=$(sqlite3 "$CFN_SKILLS_DB_PATH" "SELECT approval_level FROM skills WHERE id=$skill_id")
616
+ log_debug "Approval level not found in frontmatter, using existing: $new_approval_level"
617
+ fi
618
+
619
+ log_info "Updating skill record in database"
620
+ update_skill_record "$skill_id" "$new_version" "$new_hash" "$update_path" "$new_tags" "$new_category" "$new_owner" "$new_approval_level"
621
+ log_success "Skill record updated with refreshed metadata"
622
+ echo ""
623
+
624
+ # Step 6: Record approval history
625
+ log_info "Step 6: Recording approval history"
626
+ record_approval_history "$skill_id" "$new_version" "$change_type"
627
+ log_success "Approval history recorded"
628
+ echo ""
629
+
630
+ # Step 7: Update Phase 4 edge case status (optional)
631
+ log_info "Step 7: Updating Phase 4 edge case status (if applicable)"
632
+ update_phase4_edge_case_status "$skill_name" "$new_version"
633
+ echo ""
634
+
635
+ # Step 8: Notify agents (optional)
636
+ if [[ "$notify_agents" == "true" ]] || [[ "$ENABLE_AGENT_NOTIFICATIONS" == "true" ]]; then
637
+ log_info "Step 8: Notifying affected agents"
638
+ notify_affected_agents "$skill_id" "$skill_name" "$current_version" "$new_version" "$change_type"
639
+ else
640
+ log_info "Step 8: Agent notification disabled (skipping)"
641
+ fi
642
+ echo ""
643
+
644
+ # Success summary
645
+ log_info "=========================================="
646
+ log_success "Skill Update Propagated Successfully"
647
+ log_info "=========================================="
648
+ log_info "Skill Name: $skill_name"
649
+ log_info "Version: $current_version → $new_version"
650
+ log_info "Change Type: $change_type"
651
+ log_info "Content Hash: ${new_hash:0:16}..."
652
+ log_info "Update Path: $update_path"
653
+ log_info "Metadata Refreshed: Yes"
654
+ log_info " Tags: $new_tags"
655
+ log_info " Category: $new_category"
656
+ log_info " Owner: $new_owner"
657
+ log_info " Approval Level: $new_approval_level"
658
+ log_info "=========================================="
659
+
660
+ exit 0
661
+ }
662
+
663
+ # Execute main function
664
+ main "$@"
@@ -1,6 +1,21 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
+ # Input validation (SQL injection prevention)
5
+ validate_identifier() {
6
+ local input="$1"
7
+ local max_length="${2:-255}"
8
+ if ! [[ "$input" =~ ^[a-zA-Z0-9_-]+$ ]]; then
9
+ echo "ERROR: Invalid identifier (alphanumeric + underscore/hyphen only): $input" >&2
10
+ return 1
11
+ fi
12
+ if [ ${#input} -gt $max_length ]; then
13
+ echo "ERROR: Identifier exceeds max length ($max_length chars)" >&2
14
+ return 1
15
+ fi
16
+ return 0
17
+ }
18
+
4
19
  # test-integration.sh - Integration tests for workflow-codification skill
5
20
  # Tests edge case tracking and cost tracking functionality
6
21