claude-flow-novice 2.15.5 → 2.15.6

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 (440) hide show
  1. package/.claude/cfn-extras/.gs-api-quota.json +16 -0
  2. package/.claude/cfn-extras/.gs-progress-state.json +22 -0
  3. package/.claude/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
  4. package/.claude/cfn-extras/agents/google-sheets/README.md +114 -0
  5. package/.claude/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
  6. package/.claude/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
  7. package/.claude/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
  8. package/.claude/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
  9. package/.claude/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
  10. package/.claude/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
  11. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
  12. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
  13. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
  14. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
  15. package/.claude/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
  16. package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
  17. package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
  18. package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
  19. package/.claude/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
  20. package/.claude/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
  21. package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
  22. package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
  23. package/.claude/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
  24. package/.claude/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
  25. package/.claude/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
  26. package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
  27. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
  28. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
  29. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
  30. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
  31. package/.claude/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
  32. package/.claude/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
  33. package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
  34. package/.claude/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
  35. package/.claude/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
  36. package/.claude/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
  37. package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
  38. package/.claude/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
  39. package/.claude/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
  40. package/.claude/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
  41. package/.claude/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
  42. package/.claude/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
  43. package/.claude/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
  44. package/.claude/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
  45. package/.claude/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
  46. package/.claude/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
  47. package/.claude/commands/cfn-context.md +10 -0
  48. package/.claude/commands/cfn-loop-cli.md +36 -15
  49. package/.claude/commands/google-sheets/google-sheets-loop.md +289 -0
  50. package/.claude/skills/cfn-agent-selector/SKILL.md +143 -0
  51. package/.claude/skills/cfn-agent-selector/select-agents.sh +94 -0
  52. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
  53. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
  54. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
  55. package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
  56. package/.claude/skills/cfn-docker-redis-coordination/README.md +294 -0
  57. package/.claude/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
  58. package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
  59. package/.claude/skills/cfn-docker-redis-coordination/package.json +40 -0
  60. package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
  61. package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
  62. package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
  63. package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
  64. package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
  65. package/.claude/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
  66. package/.claude/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
  67. package/.claude/skills/cfn-loop-orchestration/README.md +149 -41
  68. package/.claude/skills/cfn-loop-orchestration/jest.config.js +67 -0
  69. package/.claude/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
  70. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +91 -8
  71. package/.claude/skills/cfn-loop-orchestration/package-lock.json +5470 -0
  72. package/.claude/skills/cfn-loop-orchestration/package.json +49 -0
  73. package/.claude/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
  74. package/.claude/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
  75. package/.claude/skills/cfn-loop-orchestration/src/index.ts +14 -0
  76. package/.claude/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
  77. package/.claude/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
  78. package/.claude/skills/cfn-loop-orchestration/src/types.ts +188 -0
  79. package/.claude/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
  80. package/.claude/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
  81. package/.claude/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
  82. package/.claude/skills/cfn-loop-orchestration/tsconfig.json +54 -0
  83. package/.claude/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
  84. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
  85. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
  86. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
  87. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
  88. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
  89. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
  90. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
  91. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
  92. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
  93. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
  94. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
  95. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
  96. package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
  97. package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
  98. package/.claude/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
  99. package/.claude/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
  100. package/.claude/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
  101. package/.claude/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
  102. package/.claude/skills/cfn-redis-coordination/dist/index.js +114 -0
  103. package/.claude/skills/cfn-redis-coordination/dist/index.js.map +1 -0
  104. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
  105. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
  106. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
  107. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
  108. package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
  109. package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
  110. package/.claude/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
  111. package/.claude/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
  112. package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
  113. package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
  114. package/.claude/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
  115. package/.claude/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
  116. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
  117. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
  118. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
  119. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
  120. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
  121. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
  122. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
  123. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
  124. package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
  125. package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
  126. package/.claude/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
  127. package/.claude/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
  128. package/.claude/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
  129. package/.claude/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
  130. package/.claude/skills/cfn-redis-coordination/dist/types.js +81 -0
  131. package/.claude/skills/cfn-redis-coordination/dist/types.js.map +1 -0
  132. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
  133. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
  134. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
  135. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
  136. package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
  137. package/.claude/skills/cfn-redis-coordination/jest.config.js +23 -0
  138. package/.claude/skills/cfn-redis-coordination/package-lock.json +5272 -0
  139. package/.claude/skills/cfn-redis-coordination/package.json +45 -0
  140. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
  141. package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
  142. package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
  143. package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
  144. package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
  145. package/.claude/skills/cfn-redis-coordination/src/index.ts +82 -0
  146. package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
  147. package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
  148. package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
  149. package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
  150. package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
  151. package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
  152. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
  153. package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
  154. package/.claude/skills/cfn-redis-coordination/src/types.ts +235 -0
  155. package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
  156. package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
  157. package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
  158. package/.claude/skills/cfn-redis-coordination/test-redis-check.js +84 -0
  159. package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
  160. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
  161. package/.claude/skills/cfn-redis-coordination/tsconfig.json +31 -0
  162. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +172 -2
  163. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
  164. package/claude-assets/agents/custom/cfn-redis-operations.md +530 -0
  165. package/claude-assets/agents/custom/cfn-system-expert.md +77 -0
  166. package/claude-assets/cfn-extras/.gs-api-quota.json +16 -0
  167. package/claude-assets/cfn-extras/.gs-progress-state.json +22 -0
  168. package/claude-assets/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
  169. package/claude-assets/cfn-extras/agents/google-sheets/README.md +114 -0
  170. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
  171. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
  172. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
  173. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
  174. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
  175. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
  176. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
  177. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
  178. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
  179. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
  180. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
  181. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
  182. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
  183. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
  184. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
  185. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
  186. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
  187. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
  188. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
  189. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
  190. package/claude-assets/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
  191. package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
  192. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
  193. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
  194. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
  195. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
  196. package/claude-assets/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
  197. package/claude-assets/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
  198. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
  199. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
  200. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
  201. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
  202. package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
  203. package/claude-assets/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
  204. package/claude-assets/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
  205. package/claude-assets/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
  206. package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
  207. package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
  208. package/claude-assets/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
  209. package/claude-assets/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
  210. package/claude-assets/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
  211. package/claude-assets/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
  212. package/claude-assets/commands/cfn-context.md +10 -0
  213. package/claude-assets/commands/cfn-loop-cli.md +36 -15
  214. package/claude-assets/commands/google-sheets/google-sheets-loop.md +289 -0
  215. package/claude-assets/hooks/cfn-pre-execution/SESSION_START_README.md +87 -0
  216. package/claude-assets/hooks/cfn-pre-execution/TEST_SESSION_START.md +128 -0
  217. package/claude-assets/hooks/cfn-pre-execution/session-start-context.sh +111 -0
  218. package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_EXAMPLE.md +209 -0
  219. package/claude-assets/skills/cfn-agent-selection-with-fallback/README.md +130 -0
  220. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +243 -0
  221. package/claude-assets/skills/cfn-agent-selection-with-fallback/agent-mappings.json +142 -0
  222. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +173 -0
  223. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +71 -0
  224. package/claude-assets/skills/cfn-agent-selection-with-fallback/test-agent-selection.sh +282 -0
  225. package/claude-assets/skills/cfn-agent-selector/SKILL.md +143 -0
  226. package/claude-assets/skills/cfn-agent-selector/select-agents.sh +94 -0
  227. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
  228. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
  229. package/claude-assets/skills/cfn-docker-coordination/.eslintrc.json +33 -0
  230. package/claude-assets/skills/cfn-docker-coordination/README.md +349 -0
  231. package/claude-assets/skills/cfn-docker-coordination/docker-helpers.sh +433 -0
  232. package/claude-assets/skills/cfn-docker-coordination/jest.config.js +25 -0
  233. package/claude-assets/skills/cfn-docker-coordination/package-lock.json +6827 -0
  234. package/claude-assets/skills/cfn-docker-coordination/package.json +38 -0
  235. package/claude-assets/skills/cfn-docker-coordination/src/agent-container.ts +471 -0
  236. package/claude-assets/skills/cfn-docker-coordination/src/docker-client.ts +483 -0
  237. package/claude-assets/skills/cfn-docker-coordination/src/health-checker.ts +418 -0
  238. package/claude-assets/skills/cfn-docker-coordination/src/index.ts +45 -0
  239. package/claude-assets/skills/cfn-docker-coordination/src/network-manager.ts +377 -0
  240. package/claude-assets/skills/cfn-docker-coordination/src/types.ts +412 -0
  241. package/claude-assets/skills/cfn-docker-coordination/src/volume-manager.ts +389 -0
  242. package/claude-assets/skills/cfn-docker-coordination/tests/agent-container.test.ts +379 -0
  243. package/claude-assets/skills/cfn-docker-coordination/tests/docker-client.test.ts +345 -0
  244. package/claude-assets/skills/cfn-docker-coordination/tests/health-checker.test.ts +535 -0
  245. package/claude-assets/skills/cfn-docker-coordination/tests/integration.test.ts +193 -0
  246. package/claude-assets/skills/cfn-docker-coordination/tests/network-manager.test.ts +352 -0
  247. package/claude-assets/skills/cfn-docker-coordination/tests/setup.ts +36 -0
  248. package/claude-assets/skills/cfn-docker-coordination/tsconfig.json +29 -0
  249. package/claude-assets/skills/cfn-docker-logging/INTEGRATION.md +268 -0
  250. package/claude-assets/skills/cfn-docker-logging/SAMPLE_OUTPUTS.md +237 -0
  251. package/claude-assets/skills/cfn-docker-logging/SKILL.md +442 -0
  252. package/claude-assets/skills/cfn-docker-logging/capture-container-logs.sh +120 -0
  253. package/claude-assets/skills/cfn-docker-logging/enable-logging.sh +430 -0
  254. package/claude-assets/skills/cfn-docker-logging/init-hybrid-logging.sh +210 -0
  255. package/claude-assets/skills/cfn-docker-logging/queries/analytics-summary.sh +87 -0
  256. package/claude-assets/skills/cfn-docker-logging/queries/query-agent-timeline.sh +51 -0
  257. package/claude-assets/skills/cfn-docker-logging/queries/query-consensus-history.sh +56 -0
  258. package/claude-assets/skills/cfn-docker-logging/queries/query-coordination-timeline.sh +39 -0
  259. package/claude-assets/skills/cfn-docker-logging/queries/query-failed-containers.sh +40 -0
  260. package/claude-assets/skills/cfn-docker-logging/queries/query-gate-checks.sh +39 -0
  261. package/claude-assets/skills/cfn-docker-logging/schema.sql +111 -0
  262. package/claude-assets/skills/cfn-docker-logging/sqlite-helpers.sh +240 -0
  263. package/claude-assets/skills/cfn-docker-logging/test-hybrid-logging.sh +331 -0
  264. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
  265. package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
  266. package/claude-assets/skills/cfn-docker-redis-coordination/README.md +294 -0
  267. package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
  268. package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
  269. package/claude-assets/skills/cfn-docker-redis-coordination/package.json +40 -0
  270. package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
  271. package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
  272. package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
  273. package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
  274. package/claude-assets/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
  275. package/claude-assets/skills/cfn-error-logging/.eslintrc.json +57 -0
  276. package/claude-assets/skills/cfn-error-logging/.prettierrc.json +10 -0
  277. package/claude-assets/skills/cfn-error-logging/MIGRATION_SUMMARY.md +485 -0
  278. package/claude-assets/skills/cfn-error-logging/package.json +47 -0
  279. package/claude-assets/skills/cfn-error-logging/src/error-logger.ts +1042 -0
  280. package/claude-assets/skills/cfn-error-logging/src/index.ts +12 -0
  281. package/claude-assets/skills/cfn-error-logging/src/types.ts +456 -0
  282. package/claude-assets/skills/cfn-error-logging/tests/error-logger.test.ts +1302 -0
  283. package/claude-assets/skills/cfn-error-logging/tsconfig.json +38 -0
  284. package/claude-assets/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
  285. package/claude-assets/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
  286. package/claude-assets/skills/cfn-loop-orchestration/README.md +149 -41
  287. package/claude-assets/skills/cfn-loop-orchestration/jest.config.js +67 -0
  288. package/claude-assets/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
  289. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +91 -8
  290. package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +5470 -0
  291. package/claude-assets/skills/cfn-loop-orchestration/package.json +49 -0
  292. package/claude-assets/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
  293. package/claude-assets/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
  294. package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +14 -0
  295. package/claude-assets/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
  296. package/claude-assets/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
  297. package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +188 -0
  298. package/claude-assets/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
  299. package/claude-assets/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
  300. package/claude-assets/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
  301. package/claude-assets/skills/cfn-loop-orchestration/tsconfig.json +54 -0
  302. package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
  303. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
  304. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
  305. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
  306. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
  307. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
  308. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
  309. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
  310. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
  311. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
  312. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
  313. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
  314. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
  315. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
  316. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
  317. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
  318. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
  319. package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
  320. package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
  321. package/claude-assets/skills/cfn-redis-coordination/dist/index.js +114 -0
  322. package/claude-assets/skills/cfn-redis-coordination/dist/index.js.map +1 -0
  323. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
  324. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
  325. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
  326. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
  327. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
  328. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
  329. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
  330. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
  331. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
  332. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
  333. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
  334. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
  335. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
  336. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
  337. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
  338. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
  339. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
  340. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
  341. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
  342. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
  343. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
  344. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
  345. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
  346. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
  347. package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
  348. package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
  349. package/claude-assets/skills/cfn-redis-coordination/dist/types.js +81 -0
  350. package/claude-assets/skills/cfn-redis-coordination/dist/types.js.map +1 -0
  351. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
  352. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
  353. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
  354. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
  355. package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
  356. package/claude-assets/skills/cfn-redis-coordination/jest.config.js +23 -0
  357. package/claude-assets/skills/cfn-redis-coordination/package-lock.json +5272 -0
  358. package/claude-assets/skills/cfn-redis-coordination/package.json +45 -0
  359. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
  360. package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
  361. package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
  362. package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
  363. package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
  364. package/claude-assets/skills/cfn-redis-coordination/src/index.ts +82 -0
  365. package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
  366. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
  367. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
  368. package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
  369. package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
  370. package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
  371. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
  372. package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
  373. package/claude-assets/skills/cfn-redis-coordination/src/types.ts +235 -0
  374. package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
  375. package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
  376. package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
  377. package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +84 -0
  378. package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
  379. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
  380. package/claude-assets/skills/cfn-redis-coordination/tsconfig.json +31 -0
  381. package/claude-assets/skills/cfn-skill-propagation/README.md +233 -0
  382. package/claude-assets/skills/cfn-skill-propagation/package-lock.json +5174 -0
  383. package/claude-assets/skills/cfn-skill-propagation/package.json +52 -0
  384. package/claude-assets/skills/cfn-skill-propagation/propagate-skill-update.sh +32 -0
  385. package/claude-assets/skills/cfn-skill-propagation/src/cli.ts +75 -0
  386. package/claude-assets/skills/cfn-skill-propagation/src/database-adapter.ts +239 -0
  387. package/claude-assets/skills/cfn-skill-propagation/src/file-system-adapter.ts +113 -0
  388. package/claude-assets/skills/cfn-skill-propagation/src/index.ts +72 -0
  389. package/claude-assets/skills/cfn-skill-propagation/src/logger.ts +43 -0
  390. package/claude-assets/skills/cfn-skill-propagation/src/metadata-parser.ts +154 -0
  391. package/claude-assets/skills/cfn-skill-propagation/src/skill-propagator.ts +274 -0
  392. package/claude-assets/skills/cfn-skill-propagation/src/skill-validator.ts +179 -0
  393. package/claude-assets/skills/cfn-skill-propagation/src/types.ts +143 -0
  394. package/claude-assets/skills/cfn-skill-propagation/src/version-manager.ts +118 -0
  395. package/claude-assets/skills/cfn-skill-propagation/tests/file-system-adapter.test.ts +91 -0
  396. package/claude-assets/skills/cfn-skill-propagation/tests/metadata-parser.test.ts +176 -0
  397. package/claude-assets/skills/cfn-skill-propagation/tests/skill-propagator.test.ts +209 -0
  398. package/claude-assets/skills/cfn-skill-propagation/tests/skill-validator.test.ts +203 -0
  399. package/claude-assets/skills/cfn-skill-propagation/tests/version-manager.test.ts +115 -0
  400. package/claude-assets/skills/cfn-skill-propagation/tsconfig.json +34 -0
  401. package/claude-assets/skills/task-classifier/SKILL.md +81 -0
  402. package/claude-assets/skills/task-classifier/classify-task.sh +62 -0
  403. package/claude-assets/skills/workflow-codification/package-lock.json +5170 -0
  404. package/claude-assets/skills/workflow-codification/package.json +30 -0
  405. package/claude-assets/skills/workflow-codification/src/index.ts +24 -0
  406. package/claude-assets/skills/workflow-codification/src/pattern-analyzer.ts +537 -0
  407. package/claude-assets/skills/workflow-codification/src/types.ts +180 -0
  408. package/claude-assets/skills/workflow-codification/tests/pattern-analyzer.test.ts +960 -0
  409. package/claude-assets/skills/workflow-codification/tsconfig.json +34 -0
  410. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  411. package/dist/agent-spawner/agent-spawner.js +448 -0
  412. package/dist/agent-spawner/agent-spawner.js.map +1 -0
  413. package/dist/agent-spawner/index.js +10 -0
  414. package/dist/agent-spawner/index.js.map +1 -0
  415. package/dist/agent-spawner/types.js +14 -0
  416. package/dist/agent-spawner/types.js.map +1 -0
  417. package/dist/agents/agent-loader.js +146 -165
  418. package/dist/agents/agent-loader.js.map +1 -1
  419. package/dist/cli/agent-executor.js +47 -1
  420. package/dist/cli/agent-executor.js.map +1 -1
  421. package/dist/cli/agent-spawn.js +4 -1
  422. package/dist/cli/agent-spawn.js.map +1 -1
  423. package/dist/cli/tool-executor.js +3 -1
  424. package/dist/cli/tool-executor.js.map +1 -1
  425. package/dist/gate-checker/gate-checker.js +292 -0
  426. package/dist/gate-checker/gate-checker.js.map +1 -0
  427. package/dist/gate-checker/types.js +94 -0
  428. package/dist/gate-checker/types.js.map +1 -0
  429. package/dist/lib/database-service/connection-pool-manager.js +2 -1
  430. package/dist/lib/database-service/connection-pool-manager.js.map +1 -1
  431. package/dist/orchestrator/index.js +10 -0
  432. package/dist/orchestrator/index.js.map +1 -0
  433. package/dist/orchestrator/orchestrate.js +496 -0
  434. package/dist/orchestrator/orchestrate.js.map +1 -0
  435. package/dist/orchestrator/types.js +58 -0
  436. package/dist/orchestrator/types.js.map +1 -0
  437. package/package.json +1 -1
  438. package/scripts/switch-api.sh +142 -4
  439. package/scripts/verify-no-secrets.sh +6 -13
  440. package/tests/README.md +175 -58
@@ -0,0 +1,154 @@
1
+ /**
2
+ * YAML Frontmatter parser for Skill metadata
3
+ */
4
+
5
+ import type { SkillMetadata, ValidationResult, MetadataParser } from './types';
6
+
7
+ export class SkillMetadataParser implements MetadataParser {
8
+ /**
9
+ * Parse YAML frontmatter from skill file content
10
+ */
11
+ parse(content: string): SkillMetadata {
12
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
13
+
14
+ if (!frontmatterMatch) {
15
+ throw new Error('No frontmatter found in skill file (expected YAML between --- markers)');
16
+ }
17
+
18
+ const frontmatterContent = frontmatterMatch[1];
19
+ return this.parseYAML(frontmatterContent);
20
+ }
21
+
22
+ /**
23
+ * Parse YAML content into JavaScript object
24
+ * Simple YAML parser for our specific use case
25
+ */
26
+ private parseYAML(yamlContent: string | undefined): SkillMetadata {
27
+ if (!yamlContent) {
28
+ return {} as SkillMetadata;
29
+ }
30
+
31
+ const metadata: Record<string, any> = {};
32
+
33
+ const lines = yamlContent.split('\n');
34
+
35
+ for (const line of lines) {
36
+ const trimmed = line.trim();
37
+ if (!trimmed || trimmed.startsWith('#')) {
38
+ continue;
39
+ }
40
+
41
+ const colonIndex = trimmed.indexOf(':');
42
+ if (colonIndex === -1) {
43
+ continue;
44
+ }
45
+
46
+ const key = trimmed.substring(0, colonIndex).trim();
47
+ const valueStr = trimmed.substring(colonIndex + 1).trim();
48
+
49
+ const value = this.parseYAMLValue(valueStr);
50
+ metadata[key] = value;
51
+ }
52
+
53
+ return metadata as SkillMetadata;
54
+ }
55
+
56
+ /**
57
+ * Parse individual YAML values with type inference
58
+ */
59
+ private parseYAMLValue(valueStr: string): any {
60
+ if (!valueStr) {
61
+ return null;
62
+ }
63
+
64
+ // Handle quoted strings
65
+ if ((valueStr.startsWith('"') && valueStr.endsWith('"')) ||
66
+ (valueStr.startsWith("'") && valueStr.endsWith("'"))) {
67
+ return valueStr.slice(1, -1);
68
+ }
69
+
70
+ // Handle arrays [tag1, tag2]
71
+ if (valueStr.startsWith('[') && valueStr.endsWith(']')) {
72
+ const arrayContent = valueStr.slice(1, -1);
73
+ return arrayContent
74
+ .split(',')
75
+ .map(item => item.trim())
76
+ .filter(item => item.length > 0);
77
+ }
78
+
79
+ // Handle booleans
80
+ if (valueStr.toLowerCase() === 'true') {
81
+ return true;
82
+ }
83
+ if (valueStr.toLowerCase() === 'false') {
84
+ return false;
85
+ }
86
+
87
+ // Handle numbers
88
+ if (/^\d+$/.test(valueStr)) {
89
+ return parseInt(valueStr, 10);
90
+ }
91
+ if (/^\d+\.\d+$/.test(valueStr)) {
92
+ return parseFloat(valueStr);
93
+ }
94
+
95
+ // Return as string
96
+ return valueStr;
97
+ }
98
+
99
+ /**
100
+ * Validate required metadata fields
101
+ */
102
+ validate(metadata: SkillMetadata): ValidationResult {
103
+ const errors: string[] = [];
104
+
105
+ if (!metadata.name) {
106
+ errors.push('Missing required field: name');
107
+ }
108
+
109
+ if (!metadata.version) {
110
+ errors.push('Missing required field: version');
111
+ }
112
+
113
+ if (!metadata.description) {
114
+ errors.push('Missing required field: description');
115
+ }
116
+
117
+ // Validate version format if present
118
+ if (metadata.version && !/^\d+\.\d+\.\d+$/.test(String(metadata.version))) {
119
+ errors.push(
120
+ `Invalid version format: ${metadata.version}. Expected MAJOR.MINOR.PATCH (e.g., 1.0.0)`
121
+ );
122
+ }
123
+
124
+ return {
125
+ valid: errors.length === 0,
126
+ errors,
127
+ };
128
+ }
129
+
130
+ /**
131
+ * Extract specific field value or return null
132
+ */
133
+ extractField(content: string, fieldName: string): string | null {
134
+ const match = content.match(new RegExp(`^${fieldName}:\\s*(.*)$`, 'm'));
135
+ return match && match[1] ? match[1].trim() : null;
136
+ }
137
+
138
+ /**
139
+ * Extract field with array handling
140
+ */
141
+ extractArrayField(content: string, fieldName: string): string[] {
142
+ const match = content.match(new RegExp(`^${fieldName}:\\s*(\\[.+?\\])$`, 'm'));
143
+ if (!match || !match[1]) {
144
+ return [];
145
+ }
146
+
147
+ const arrayStr = match[1];
148
+ const arrayContent = arrayStr.slice(1, -1);
149
+ return arrayContent
150
+ .split(',')
151
+ .map(item => item.trim())
152
+ .filter(item => item.length > 0);
153
+ }
154
+ }
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Main Skill Propagator - orchestrates the skill update propagation process
3
+ */
4
+
5
+ import type {
6
+ SkillPropagator as ISkillPropagator,
7
+ SkillPropagationOptions,
8
+ PropagationResult,
9
+ FileSystemAdapter,
10
+ DatabaseAdapter,
11
+ Logger,
12
+ } from './types';
13
+ import { SkillValidator } from './skill-validator';
14
+ import { SkillMetadataParser } from './metadata-parser';
15
+ import { VersionManager } from './version-manager';
16
+
17
+ export class SkillPropagator implements ISkillPropagator {
18
+ private validator: SkillValidator;
19
+ private metadataParser: SkillMetadataParser;
20
+
21
+ constructor(
22
+ private fs: FileSystemAdapter,
23
+ private db: DatabaseAdapter,
24
+ private logger: Logger
25
+ ) {
26
+ this.validator = new SkillValidator(fs, db);
27
+ this.metadataParser = new SkillMetadataParser();
28
+ }
29
+
30
+ /**
31
+ * Main propagation workflow
32
+ */
33
+ async propagate(options: SkillPropagationOptions): Promise<PropagationResult> {
34
+ const startTime = new Date().toISOString();
35
+
36
+ this.logger.info('========================================');
37
+ this.logger.info('Propagate Skill Update');
38
+ this.logger.info('========================================');
39
+ this.logger.info(`Skill: ${options.skillName}`);
40
+ this.logger.info(`New Version: ${options.newVersion}`);
41
+ this.logger.info(`Update Path: ${options.updatePath}`);
42
+ this.logger.info(`Change Type: ${options.changeType || 'patch'}`);
43
+ this.logger.info('========================================');
44
+
45
+ // Step 1: Validate inputs
46
+ this.logger.info('Step 1: Validating inputs');
47
+ const validationResult = await this.validator.validateParameters(options);
48
+ if (!validationResult.valid) {
49
+ throw new Error(`Validation failed:\n${validationResult.errors.join('\n')}`);
50
+ }
51
+ this.logger.success('Input validation passed');
52
+
53
+ // Step 2: Look up existing skill
54
+ this.logger.info('Step 2: Looking up existing skill');
55
+ const skillInfo = await this.getSkillInfo(options.skillName);
56
+ if (!skillInfo) {
57
+ throw new Error(`Skill not found in database: ${options.skillName}`);
58
+ }
59
+ this.logger.info(`Found skill: ID=${skillInfo.id}, Current Version=${skillInfo.version}`);
60
+
61
+ // Step 3: Validate version increment
62
+ this.logger.info('Step 3: Validating version increment');
63
+ const changeType = options.changeType || 'patch';
64
+ const versionValidation = await this.validator.validateVersionIncrement(
65
+ skillInfo.version,
66
+ options.newVersion,
67
+ changeType
68
+ );
69
+ if (!versionValidation.valid) {
70
+ throw new Error(`Version validation failed:\n${versionValidation.errors.join('\n')}`);
71
+ }
72
+ this.logger.success(`Version increment validated: ${skillInfo.version} → ${options.newVersion} (${changeType})`);
73
+
74
+ // Step 4: Calculate new content hash
75
+ this.logger.info('Step 4: Calculating new content hash');
76
+ const newHash = await this.fs.calculateHash(options.updatePath);
77
+ this.logger.debug(`New Hash: ${newHash}`);
78
+
79
+ const hashValidation = this.validator.validateContentHashChanged(skillInfo.content_hash, newHash);
80
+ if (!hashValidation.valid) {
81
+ throw new Error(`Content validation failed:\n${hashValidation.errors.join('\n')}`);
82
+ }
83
+ this.logger.success('Content hash calculated and differs from current');
84
+
85
+ // Step 5: Parse frontmatter metadata
86
+ this.logger.info('Step 5: Parsing frontmatter metadata from updated skill');
87
+ const updateFileContent = await this.fs.readFile(options.updatePath);
88
+ const metadata = this.metadataParser.parse(updateFileContent);
89
+
90
+ const metadataValidation = this.metadataParser.validate(metadata);
91
+ if (!metadataValidation.valid) {
92
+ this.logger.warning(`Metadata validation warnings:\n${metadataValidation.errors.join('\n')}`);
93
+ }
94
+
95
+ // Use new metadata or fall back to existing
96
+ const newTags = metadata.tags ? JSON.stringify(metadata.tags) : skillInfo.tags;
97
+ const newCategory = metadata.category || skillInfo.category;
98
+ const newOwner = metadata.owner || skillInfo.owner;
99
+ const newApprovalLevel = metadata.approval_level || skillInfo.approval_level;
100
+
101
+ // Step 6: Update skill record
102
+ this.logger.info('Step 6: Updating skill record in database');
103
+ await this.updateSkillRecord(skillInfo.id, {
104
+ version: options.newVersion,
105
+ content_hash: newHash,
106
+ content_path: options.updatePath,
107
+ tags: newTags,
108
+ category: newCategory,
109
+ owner: newOwner,
110
+ approval_level: newApprovalLevel,
111
+ });
112
+ this.logger.success('Skill record updated with refreshed metadata');
113
+
114
+ // Step 7: Record approval history
115
+ this.logger.info('Step 7: Recording approval history');
116
+ await this.recordApprovalHistory(skillInfo.id, options.newVersion, changeType);
117
+ this.logger.success('Approval history recorded');
118
+
119
+ // Step 8: Notify affected agents (optional)
120
+ let affectedAgents: string[] = [];
121
+ if (options.notifyAgents || options.enableAgentNotifications) {
122
+ this.logger.info('Step 8: Notifying affected agents');
123
+ affectedAgents = await this.notifyAffectedAgents(skillInfo.id, options.skillName);
124
+ } else {
125
+ this.logger.info('Step 8: Agent notification disabled (skipping)');
126
+ }
127
+
128
+ // Success summary
129
+ this.logger.info('==========================================');
130
+ this.logger.success('Skill Update Propagated Successfully');
131
+ this.logger.info('==========================================');
132
+ this.logger.info(`Skill Name: ${options.skillName}`);
133
+ this.logger.info(`Version: ${skillInfo.version} → ${options.newVersion}`);
134
+ this.logger.info(`Change Type: ${changeType}`);
135
+ this.logger.info(`Content Hash: ${newHash.substring(0, 16)}...`);
136
+ this.logger.info(`Update Path: ${options.updatePath}`);
137
+ this.logger.info('Metadata Refreshed: Yes');
138
+ this.logger.info(` Tags: ${newTags}`);
139
+ this.logger.info(` Category: ${newCategory}`);
140
+ this.logger.info(` Owner: ${newOwner}`);
141
+ this.logger.info(` Approval Level: ${newApprovalLevel}`);
142
+ this.logger.info('==========================================');
143
+
144
+ return {
145
+ success: true,
146
+ skillName: options.skillName,
147
+ newVersion: options.newVersion,
148
+ oldVersion: skillInfo.version,
149
+ changeType: VersionManager.compareVersions(skillInfo.version, options.newVersion),
150
+ contentHash: newHash,
151
+ metadata: {
152
+ tags: newTags,
153
+ category: newCategory,
154
+ owner: newOwner,
155
+ approval_level: newApprovalLevel,
156
+ },
157
+ affectedAgents,
158
+ timestamp: startTime,
159
+ };
160
+ }
161
+
162
+ /**
163
+ * Retrieve skill info from database
164
+ */
165
+ private async getSkillInfo(skillName: string) {
166
+ const result = await this.db.selectOne(
167
+ 'SELECT id, version, content_hash, content_path, tags, category, owner, approval_level FROM skills WHERE name = ?1',
168
+ [skillName]
169
+ );
170
+
171
+ if (!result) {
172
+ return null;
173
+ }
174
+
175
+ // Handle different result formats
176
+ if (Array.isArray(result)) {
177
+ return {
178
+ id: result[0],
179
+ version: result[1],
180
+ content_hash: result[2],
181
+ content_path: result[3],
182
+ tags: result[4],
183
+ category: result[5],
184
+ owner: result[6],
185
+ approval_level: result[7],
186
+ };
187
+ }
188
+
189
+ return result;
190
+ }
191
+
192
+ /**
193
+ * Update skill record in database
194
+ */
195
+ private async updateSkillRecord(
196
+ skillId: number,
197
+ updates: Record<string, any>
198
+ ): Promise<void> {
199
+ const setClauses = Object.keys(updates)
200
+ .map((key) => `${key} = ?`)
201
+ .join(', ');
202
+
203
+ const values = Object.values(updates);
204
+ values.push(skillId);
205
+
206
+ const sql = `UPDATE skills SET ${setClauses}, updated_at = datetime('now') WHERE id = ?`;
207
+
208
+ await this.db.execute(sql, values);
209
+ }
210
+
211
+ /**
212
+ * Record approval history entry
213
+ */
214
+ private async recordApprovalHistory(
215
+ skillId: number,
216
+ newVersion: string,
217
+ changeType: string
218
+ ): Promise<void> {
219
+ const metadata = JSON.stringify({
220
+ change_type: changeType,
221
+ source: 'propagate-skill-update',
222
+ propagated_at: new Date().toISOString(),
223
+ });
224
+
225
+ const sql = `
226
+ INSERT INTO approval_history (
227
+ skill_id,
228
+ version,
229
+ approval_level,
230
+ approver,
231
+ decision,
232
+ reasoning,
233
+ approval_criteria_check,
234
+ timestamp
235
+ ) VALUES (
236
+ ?, ?, ?, ?, ?, ?, ?, datetime('now')
237
+ )
238
+ `;
239
+
240
+ const reasoning = 'Skill update propagated through automated workflow';
241
+
242
+ await this.db.execute(sql, [
243
+ skillId,
244
+ newVersion,
245
+ 'auto',
246
+ 'propagate-skill-update',
247
+ 'approved',
248
+ reasoning,
249
+ metadata,
250
+ ]);
251
+ }
252
+
253
+ /**
254
+ * Get and notify affected agents
255
+ */
256
+ private async notifyAffectedAgents(skillId: number, skillName: string): Promise<string[]> {
257
+ const agents = await this.db.getAffectedAgents(skillId);
258
+
259
+ if (agents.length === 0) {
260
+ this.logger.info('No agents using this skill');
261
+ return [];
262
+ }
263
+
264
+ this.logger.info(`Agents using this skill (${agents.length}):`);
265
+ for (const agent of agents) {
266
+ this.logger.info(` - ${agent}`);
267
+ }
268
+
269
+ this.logger.success(`Notification: Skill '${skillName}' has been updated`);
270
+ this.logger.info('Affected agents should reload skill content on next invocation');
271
+
272
+ return agents;
273
+ }
274
+ }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Skill Validator - validates skill structure, metadata, and parameters
3
+ */
4
+
5
+ import type {
6
+ SkillValidator as ISkillValidator,
7
+ ValidationResult,
8
+ SkillPropagationOptions,
9
+ FileSystemAdapter,
10
+ DatabaseAdapter,
11
+ } from './types';
12
+ import { VersionManager } from './version-manager';
13
+
14
+ export class SkillValidator implements ISkillValidator {
15
+ constructor(
16
+ private fs: FileSystemAdapter,
17
+ private db: DatabaseAdapter
18
+ ) {}
19
+
20
+ /**
21
+ * Validate all input parameters
22
+ */
23
+ async validateParameters(options: SkillPropagationOptions): Promise<ValidationResult> {
24
+ const errors: string[] = [];
25
+
26
+ // Validate required fields
27
+ if (!options.skillName || options.skillName.trim().length === 0) {
28
+ errors.push('Missing required parameter: skillName');
29
+ }
30
+
31
+ if (!options.newVersion || options.newVersion.trim().length === 0) {
32
+ errors.push('Missing required parameter: newVersion');
33
+ }
34
+
35
+ if (!options.updatePath || options.updatePath.trim().length === 0) {
36
+ errors.push('Missing required parameter: updatePath');
37
+ }
38
+
39
+ // Validate skill name format (alphanumeric, hyphens, underscores)
40
+ if (options.skillName && !/^[a-zA-Z0-9_-]+$/.test(options.skillName)) {
41
+ errors.push(`Invalid skill name: ${options.skillName}. Use only alphanumeric, hyphens, and underscores.`);
42
+ }
43
+
44
+ // Validate version format
45
+ if (options.newVersion && !VersionManager.isValidVersion(options.newVersion)) {
46
+ errors.push(
47
+ `Invalid version format: ${options.newVersion}. Expected format: MAJOR.MINOR.PATCH (e.g., 1.0.0)`
48
+ );
49
+ }
50
+
51
+ // Validate change type
52
+ if (options.changeType && !['patch', 'minor', 'major'].includes(options.changeType)) {
53
+ errors.push(`Invalid changeType: ${options.changeType}. Must be one of: patch, minor, major`);
54
+ }
55
+
56
+ // Validate file exists and is readable
57
+ if (options.updatePath) {
58
+ const exists = await this.fs.fileExists(options.updatePath);
59
+ if (!exists) {
60
+ errors.push(`Update file not found: ${options.updatePath}`);
61
+ }
62
+
63
+ const readable = await this.fs.isReadable(options.updatePath);
64
+ if (!readable) {
65
+ errors.push(`Update file is not readable: ${options.updatePath}`);
66
+ }
67
+ }
68
+
69
+ // Validate database exists
70
+ const dbExists = await this.fs.fileExists(options.databasePath || './.claude/skills-database/skills.db');
71
+ if (!dbExists) {
72
+ errors.push(`Skills database not found: ${options.databasePath}`);
73
+ }
74
+
75
+ return {
76
+ valid: errors.length === 0,
77
+ errors,
78
+ };
79
+ }
80
+
81
+ /**
82
+ * Check if skill exists in database
83
+ */
84
+ async validateSkillExists(skillName: string): Promise<boolean> {
85
+ try {
86
+ const result = await this.db.selectOne(
87
+ 'SELECT COUNT(*) as count FROM skills WHERE name = ?1',
88
+ [skillName]
89
+ );
90
+
91
+ return result && (result.count > 0 || result.value > 0);
92
+ } catch {
93
+ return false;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Validate version increment matches expected change type
99
+ */
100
+ async validateVersionIncrement(
101
+ currentVersion: string,
102
+ newVersion: string,
103
+ expectedChangeType: 'patch' | 'minor' | 'major'
104
+ ): Promise<ValidationResult> {
105
+ const errors: string[] = [];
106
+
107
+ const result = VersionManager.validateVersionIncrement(
108
+ currentVersion,
109
+ newVersion,
110
+ expectedChangeType
111
+ );
112
+
113
+ if (!result.isValid) {
114
+ const changeType = result.changeType;
115
+
116
+ switch (changeType) {
117
+ case 'same':
118
+ errors.push(`Version unchanged: ${currentVersion} → ${newVersion}`);
119
+ break;
120
+
121
+ case 'downgrade':
122
+ errors.push(`Version downgrade not allowed: ${currentVersion} → ${newVersion}`);
123
+ break;
124
+
125
+ case 'major':
126
+ case 'minor':
127
+ case 'patch':
128
+ if (changeType !== expectedChangeType) {
129
+ errors.push(
130
+ `Version change type mismatch: detected ${changeType}, but expected ${expectedChangeType} ` +
131
+ `(version: ${currentVersion} → ${newVersion})`
132
+ );
133
+ }
134
+ break;
135
+
136
+ default:
137
+ errors.push(`Invalid version comparison result: ${changeType}`);
138
+ }
139
+ }
140
+
141
+ return {
142
+ valid: errors.length === 0,
143
+ errors,
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Validate skill structure (must have SKILL.md)
149
+ */
150
+ async validateSkillStructure(skillPath: string): Promise<ValidationResult> {
151
+ const errors: string[] = [];
152
+
153
+ const skillMdExists = await this.fs.fileExists(`${skillPath}/SKILL.md`);
154
+ if (!skillMdExists) {
155
+ errors.push(`SKILL.md not found in ${skillPath}`);
156
+ }
157
+
158
+ return {
159
+ valid: errors.length === 0,
160
+ errors,
161
+ };
162
+ }
163
+
164
+ /**
165
+ * Validate content hash changed
166
+ */
167
+ validateContentHashChanged(oldHash: string, newHash: string): ValidationResult {
168
+ const errors: string[] = [];
169
+
170
+ if (oldHash === newHash) {
171
+ errors.push('Content hash unchanged - no actual content changes detected');
172
+ }
173
+
174
+ return {
175
+ valid: errors.length === 0,
176
+ errors,
177
+ };
178
+ }
179
+ }