@harness-engineering/cli 1.12.0 → 1.13.1

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 (281) hide show
  1. package/dist/agents/skills/claude-code/add-harness-component/skill.yaml +1 -0
  2. package/dist/agents/skills/claude-code/align-documentation/skill.yaml +1 -0
  3. package/dist/agents/skills/claude-code/check-mechanical-constraints/skill.yaml +1 -0
  4. package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +1 -0
  5. package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +1 -0
  6. package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +1 -0
  7. package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +1 -0
  8. package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +304 -0
  9. package/dist/agents/skills/claude-code/harness-api-design/skill.yaml +74 -0
  10. package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -0
  11. package/dist/agents/skills/claude-code/harness-auth/SKILL.md +279 -0
  12. package/dist/agents/skills/claude-code/harness-auth/skill.yaml +81 -0
  13. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +57 -9
  14. package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +1 -0
  15. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +1 -1
  16. package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +1 -0
  17. package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
  18. package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
  19. package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
  20. package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
  21. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +19 -2
  22. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
  23. package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
  24. package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
  25. package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
  26. package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
  27. package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
  28. package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
  29. package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
  30. package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
  31. package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
  32. package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
  33. package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
  34. package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
  35. package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
  36. package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
  37. package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
  38. package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
  39. package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
  40. package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
  41. package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
  42. package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
  43. package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
  44. package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
  45. package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
  46. package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
  47. package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
  48. package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
  49. package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
  50. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +39 -12
  51. package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
  52. package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
  53. package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
  54. package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
  55. package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
  56. package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
  57. package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
  58. package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
  59. package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
  60. package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
  61. package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
  62. package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
  63. package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
  64. package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
  65. package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
  66. package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
  67. package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
  68. package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
  69. package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
  70. package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
  71. package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
  72. package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
  73. package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
  74. package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
  75. package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
  76. package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
  77. package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
  78. package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
  79. package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
  80. package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
  81. package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
  82. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +28 -11
  83. package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
  84. package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
  85. package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
  86. package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
  87. package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
  88. package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
  89. package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
  90. package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
  91. package/dist/agents/skills/claude-code/harness-resilience/SKILL.md +255 -0
  92. package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +76 -0
  93. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +34 -0
  94. package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
  95. package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
  96. package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
  97. package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
  98. package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
  99. package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
  100. package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
  101. package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
  102. package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
  103. package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
  104. package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
  105. package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
  106. package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
  107. package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
  108. package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
  109. package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
  110. package/dist/agents/skills/claude-code/harness-verification/SKILL.md +42 -0
  111. package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
  112. package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
  113. package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
  114. package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
  115. package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
  116. package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
  117. package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
  118. package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
  119. package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
  120. package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
  121. package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
  122. package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
  123. package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
  124. package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +304 -0
  125. package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +74 -0
  126. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
  127. package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +279 -0
  128. package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +81 -0
  129. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +57 -9
  130. package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
  131. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +1 -1
  132. package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
  133. package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
  134. package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
  135. package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
  136. package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
  137. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +19 -2
  138. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
  139. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
  140. package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
  141. package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
  142. package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
  143. package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
  144. package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
  145. package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
  146. package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
  147. package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
  148. package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
  149. package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
  150. package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
  151. package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
  152. package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
  153. package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
  154. package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
  155. package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
  156. package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
  157. package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
  158. package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
  159. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
  160. package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
  161. package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
  162. package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
  163. package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
  164. package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
  165. package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
  166. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +39 -12
  167. package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
  168. package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
  169. package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
  170. package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
  171. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
  172. package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
  173. package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
  174. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
  175. package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
  176. package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
  177. package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
  178. package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
  179. package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
  180. package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
  181. package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
  182. package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
  183. package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
  184. package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
  185. package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
  186. package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
  187. package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
  188. package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
  189. package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
  190. package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
  191. package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
  192. package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
  193. package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
  194. package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
  195. package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
  196. package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
  197. package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
  198. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +28 -11
  199. package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
  200. package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
  201. package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
  202. package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
  203. package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
  204. package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
  205. package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
  206. package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
  207. package/dist/agents/skills/gemini-cli/harness-resilience/SKILL.md +255 -0
  208. package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +76 -0
  209. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +34 -0
  210. package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
  211. package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
  212. package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
  213. package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
  214. package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
  215. package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
  216. package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
  217. package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
  218. package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
  219. package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
  220. package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
  221. package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
  222. package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
  223. package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
  224. package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
  225. package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
  226. package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
  227. package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +42 -0
  228. package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
  229. package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
  230. package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
  231. package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
  232. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
  233. package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
  234. package/dist/{agents-md-KIS2RSMG.js → agents-md-XU3BHE22.js} +1 -1
  235. package/dist/{architecture-AJAUDRQQ.js → architecture-2R5Z4ZAF.js} +2 -2
  236. package/dist/bin/harness-mcp.js +14 -13
  237. package/dist/bin/harness.js +22 -21
  238. package/dist/{check-phase-gate-K7QCSYRJ.js → check-phase-gate-2OFZ7OWW.js} +3 -2
  239. package/dist/{chunk-TJVVU3HB.js → chunk-4ZMOCPYO.js} +1 -1
  240. package/dist/{chunk-EAURF4LH.js → chunk-65FRIL4D.js} +2 -2
  241. package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
  242. package/dist/{chunk-JLXOEO5C.js → chunk-DZS7CJKL.js} +4 -4
  243. package/dist/{chunk-FLOEMHDF.js → chunk-IM32EEDM.js} +9 -9
  244. package/dist/{chunk-2YPZKGAG.js → chunk-IMFVFNJE.js} +1 -1
  245. package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
  246. package/dist/{chunk-CTTFXXKJ.js → chunk-ND6PNADU.js} +23 -9
  247. package/dist/{chunk-747VBPA4.js → chunk-NERR4TAO.js} +783 -444
  248. package/dist/{chunk-YXOG2277.js → chunk-NOPU4RZ4.js} +2 -2
  249. package/dist/{chunk-AE2OWWDH.js → chunk-PQ5YK4AY.js} +870 -504
  250. package/dist/{chunk-OIGVQF5V.js → chunk-QY4T6YAZ.js} +3 -3
  251. package/dist/{chunk-B5SBNH4S.js → chunk-SSKDAOX5.js} +93 -30
  252. package/dist/{chunk-2SWJ4VO7.js → chunk-TKJZKICB.js} +6 -6
  253. package/dist/{chunk-GNGELAXY.js → chunk-TS3XWPW5.js} +1 -1
  254. package/dist/chunk-UAX4I5ZE.js +217 -0
  255. package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
  256. package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
  257. package/dist/{chunk-ZU2UBYBY.js → chunk-Z77YQRQT.js} +11 -207
  258. package/dist/{ci-workflow-NBL4OT4A.js → ci-workflow-EHV65NQB.js} +1 -1
  259. package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
  260. package/dist/{dist-IJ4J4C5G.js → dist-2B363XUH.js} +25 -1
  261. package/dist/{dist-M6BQODWC.js → dist-HXHWB7SV.js} +2 -2
  262. package/dist/{docs-CPTMH3VY.js → docs-FZOPM4GK.js} +4 -2
  263. package/dist/{engine-BUWPAAGD.js → engine-OL4T6NZS.js} +1 -1
  264. package/dist/{entropy-Z4FYVQ7L.js → entropy-LVHJMFGH.js} +2 -2
  265. package/dist/{feedback-TT6WF5YX.js → feedback-IHLVLMRD.js} +1 -1
  266. package/dist/{generate-agent-definitions-J5HANRNR.js → generate-agent-definitions-64S3CLEZ.js} +3 -3
  267. package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
  268. package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-GJZ4FN4Y.js} +1 -1
  269. package/dist/index.d.ts +60 -33
  270. package/dist/index.js +23 -21
  271. package/dist/{loader-PCU5YWRH.js → loader-DPYFB6R6.js} +1 -1
  272. package/dist/{mcp-YM6QLHLZ.js → mcp-JQUI7BVZ.js} +14 -13
  273. package/dist/{performance-YJVXOKIB.js → performance-ZTVSUANN.js} +2 -2
  274. package/dist/{review-pipeline-KGMIMLIE.js → review-pipeline-76JHKGSV.js} +1 -1
  275. package/dist/{runtime-F6R27LD6.js → runtime-X7U6SC7K.js} +1 -1
  276. package/dist/{security-MX5VVXBC.js → security-FWQZF2IZ.js} +1 -1
  277. package/dist/skill-executor-XZLYZYAK.js +8 -0
  278. package/dist/{validate-EFNMSFKD.js → validate-GCHZJIL7.js} +2 -2
  279. package/dist/{validate-cross-check-LJX65SBS.js → validate-cross-check-STFHYMAZ.js} +1 -1
  280. package/package.json +4 -4
  281. package/dist/skill-executor-RG45LUO5.js +0 -8
@@ -38,7 +38,7 @@ async function handleCheckDependencies(input) {
38
38
  const configResult = resolveProjectConfig(projectPath);
39
39
  if (!configResult.ok) return resultToMcpResponse(configResult);
40
40
  try {
41
- const { validateDependencies, TypeScriptParser } = await import("./dist-IJ4J4C5G.js");
41
+ const { validateDependencies, TypeScriptParser } = await import("./dist-2B363XUH.js");
42
42
  const config = configResult.value;
43
43
  const rawLayers = Array.isArray(config.layers) ? config.layers : [];
44
44
  const layers = rawLayers.map((l) => ({
@@ -47,11 +47,11 @@ async function handleCheckDependencies(input) {
47
47
  allowedDependencies: l.allowedDependencies
48
48
  }));
49
49
  const parser = new TypeScriptParser();
50
- const { loadGraphStore } = await import("./graph-loader-KO4GJ5N2.js");
50
+ const { loadGraphStore } = await import("./graph-loader-GJZ4FN4Y.js");
51
51
  const store = await loadGraphStore(projectPath);
52
52
  let graphDependencyData;
53
53
  if (store) {
54
- const { GraphConstraintAdapter } = await import("./dist-M6BQODWC.js");
54
+ const { GraphConstraintAdapter } = await import("./dist-HXHWB7SV.js");
55
55
  const adapter = new GraphConstraintAdapter(store);
56
56
  const graphData = adapter.computeDependencyGraph();
57
57
  graphDependencyData = {
@@ -5,14 +5,12 @@ import {
5
5
  OutputFormatter,
6
6
  OutputMode,
7
7
  createCheckPhaseGateCommand,
8
- findConfigFile,
9
- findFiles,
10
- resolveConfig
11
- } from "./chunk-ZU2UBYBY.js";
8
+ findFiles
9
+ } from "./chunk-UAX4I5ZE.js";
12
10
  import {
13
11
  createGenerateAgentDefinitionsCommand,
14
12
  generateAgentDefinitions
15
- } from "./chunk-GNGELAXY.js";
13
+ } from "./chunk-TS3XWPW5.js";
16
14
  import {
17
15
  listPersonas,
18
16
  loadPersona
@@ -22,13 +20,13 @@ import {
22
20
  } from "./chunk-TRAPF4IX.js";
23
21
  import {
24
22
  executeSkill
25
- } from "./chunk-L2KLU56K.js";
23
+ } from "./chunk-AOZRDOIP.js";
26
24
  import {
27
25
  ALLOWED_PERSONA_COMMANDS
28
26
  } from "./chunk-TEFCFC4H.js";
29
27
  import {
30
28
  createCreateSkillCommand
31
- } from "./chunk-6N4R6FVX.js";
29
+ } from "./chunk-YBJ262QL.js";
32
30
  import {
33
31
  logger
34
32
  } from "./chunk-EBJQ6N4M.js";
@@ -50,17 +48,21 @@ import {
50
48
  generateSlashCommands,
51
49
  handleGetImpact,
52
50
  handleOrphanDeletion
53
- } from "./chunk-747VBPA4.js";
51
+ } from "./chunk-NERR4TAO.js";
54
52
  import {
55
53
  VALID_PLATFORMS
56
54
  } from "./chunk-ZOAWBDWU.js";
55
+ import {
56
+ findConfigFile,
57
+ resolveConfig
58
+ } from "./chunk-Z77YQRQT.js";
57
59
  import {
58
60
  resolveGlobalSkillsDir,
59
61
  resolvePersonasDir,
60
62
  resolveProjectSkillsDir,
61
63
  resolveSkillsDir,
62
64
  resolveTemplatesDir
63
- } from "./chunk-HD4IBGLA.js";
65
+ } from "./chunk-N5G5QMS3.js";
64
66
  import {
65
67
  CLIError,
66
68
  ExitCode,
@@ -68,7 +70,7 @@ import {
68
70
  } from "./chunk-3WGJMBKH.js";
69
71
  import {
70
72
  SkillMetadataSchema
71
- } from "./chunk-VRFZWGMS.js";
73
+ } from "./chunk-XYLGHKG6.js";
72
74
  import {
73
75
  CLI_VERSION
74
76
  } from "./chunk-BM3PWGXQ.js";
@@ -108,6 +110,7 @@ import {
108
110
  parseDiff,
109
111
  parseManifest,
110
112
  parseSecurityConfig,
113
+ pruneLearnings,
111
114
  readLockfile,
112
115
  removeContributions,
113
116
  removeProvenance,
@@ -122,14 +125,14 @@ import {
122
125
  validateKnowledgeMap,
123
126
  writeConfig,
124
127
  writeLockfile
125
- } from "./chunk-AE2OWWDH.js";
128
+ } from "./chunk-PQ5YK4AY.js";
126
129
  import {
127
130
  Err,
128
131
  Ok
129
132
  } from "./chunk-MHBMTPW7.js";
130
133
 
131
134
  // src/index.ts
132
- import { Command as Command53 } from "commander";
135
+ import { Command as Command55 } from "commander";
133
136
 
134
137
  // src/commands/validate.ts
135
138
  import { Command } from "commander";
@@ -208,7 +211,7 @@ function createValidateCommand() {
208
211
  process.exit(result.error.exitCode);
209
212
  }
210
213
  if (opts.crossCheck) {
211
- const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-LJX65SBS.js");
214
+ const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-STFHYMAZ.js");
212
215
  const cwd = process.cwd();
213
216
  const specsDir = path.join(cwd, "docs", "specs");
214
217
  const plansDir = path.join(cwd, "docs", "plans");
@@ -566,7 +569,7 @@ function createPerfCommand() {
566
569
  perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob, _opts, cmd) => {
567
570
  const globalOpts = cmd.optsWithGlobals();
568
571
  const cwd = process.cwd();
569
- const { BenchmarkRunner } = await import("./dist-IJ4J4C5G.js");
572
+ const { BenchmarkRunner } = await import("./dist-2B363XUH.js");
570
573
  const runner = new BenchmarkRunner();
571
574
  const benchFiles = runner.discover(cwd, glob);
572
575
  if (benchFiles.length === 0) {
@@ -635,7 +638,7 @@ Results (${result.results.length} benchmarks):`);
635
638
  baselines.command("update").description("Update baselines from latest benchmark run").action(async (_opts, cmd) => {
636
639
  const globalOpts = cmd.optsWithGlobals();
637
640
  const cwd = process.cwd();
638
- const { BenchmarkRunner } = await import("./dist-IJ4J4C5G.js");
641
+ const { BenchmarkRunner } = await import("./dist-2B363XUH.js");
639
642
  const runner = new BenchmarkRunner();
640
643
  const manager = new BaselineManager(cwd);
641
644
  logger.info("Running benchmarks to update baselines...");
@@ -663,7 +666,7 @@ Results (${result.results.length} benchmarks):`);
663
666
  perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
664
667
  const globalOpts = cmd.optsWithGlobals();
665
668
  const cwd = process.cwd();
666
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-IJ4J4C5G.js");
669
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-2B363XUH.js");
667
670
  const analyzer = new EntropyAnalyzer2({
668
671
  rootDir: path5.resolve(cwd),
669
672
  analyze: { complexity: true, coupling: true }
@@ -1606,7 +1609,8 @@ async function runAdd(componentType, name, options) {
1606
1609
  break;
1607
1610
  }
1608
1611
  case "doc": {
1609
- const docsDir = path12.join(cwd, "docs");
1612
+ const configDocsDir = configResult.ok ? configResult.value.docsDir : "./docs";
1613
+ const docsDir = path12.resolve(cwd, configDocsDir);
1610
1614
  if (!fs3.existsSync(docsDir)) {
1611
1615
  fs3.mkdirSync(docsDir, { recursive: true });
1612
1616
  }
@@ -1615,11 +1619,11 @@ async function runAdd(componentType, name, options) {
1615
1619
  return Err(new CLIError(`Doc ${name} already exists`, ExitCode.ERROR));
1616
1620
  }
1617
1621
  fs3.writeFileSync(docPath, DOC_TEMPLATE(name));
1618
- created.push(`docs/${name}.md`);
1622
+ created.push(`${configDocsDir.replace(/^\.[\\/]/, "")}/${name}.md`);
1619
1623
  break;
1620
1624
  }
1621
1625
  case "skill": {
1622
- const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-WPXHSLX2.js");
1626
+ const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-XSWHMSM5.js");
1623
1627
  generateSkillFiles2({
1624
1628
  name,
1625
1629
  description: `${name} skill`,
@@ -3027,8 +3031,8 @@ function createResetCommand() {
3027
3031
  }
3028
3032
  if (!opts.yes) {
3029
3033
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
3030
- const answer = await new Promise((resolve27) => {
3031
- rl.question("Reset project state? This cannot be undone. [y/N] ", resolve27);
3034
+ const answer = await new Promise((resolve29) => {
3035
+ rl.question("Reset project state? This cannot be undone. [y/N] ", resolve29);
3032
3036
  });
3033
3037
  rl.close();
3034
3038
  if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
@@ -3435,10 +3439,10 @@ function prompt(question) {
3435
3439
  input: process.stdin,
3436
3440
  output: process.stdout
3437
3441
  });
3438
- return new Promise((resolve27) => {
3442
+ return new Promise((resolve29) => {
3439
3443
  rl.question(question, (answer) => {
3440
3444
  rl.close();
3441
- resolve27(answer.trim().toLowerCase());
3445
+ resolve29(answer.trim().toLowerCase());
3442
3446
  });
3443
3447
  });
3444
3448
  }
@@ -3578,7 +3582,7 @@ function createGenerateCommand3() {
3578
3582
  import { Command as Command39 } from "commander";
3579
3583
  import * as path29 from "path";
3580
3584
  async function runScan(projectPath) {
3581
- const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-M6BQODWC.js");
3585
+ const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-HXHWB7SV.js");
3582
3586
  const store = new GraphStore();
3583
3587
  const start = Date.now();
3584
3588
  await new CodeIngestor(store).ingest(projectPath);
@@ -3659,7 +3663,7 @@ async function runIngest(projectPath, source, opts) {
3659
3663
  SyncManager,
3660
3664
  JiraConnector,
3661
3665
  SlackConnector
3662
- } = await import("./dist-M6BQODWC.js");
3666
+ } = await import("./dist-HXHWB7SV.js");
3663
3667
  const graphDir = path30.join(projectPath, ".harness", "graph");
3664
3668
  const store = new GraphStore();
3665
3669
  await store.load(graphDir);
@@ -3752,7 +3756,7 @@ function createIngestCommand() {
3752
3756
  import { Command as Command41 } from "commander";
3753
3757
  import * as path31 from "path";
3754
3758
  async function runQuery(projectPath, rootNodeId, opts) {
3755
- const { GraphStore, ContextQL } = await import("./dist-M6BQODWC.js");
3759
+ const { GraphStore, ContextQL } = await import("./dist-HXHWB7SV.js");
3756
3760
  const store = new GraphStore();
3757
3761
  const graphDir = path31.join(projectPath, ".harness", "graph");
3758
3762
  const loaded = await store.load(graphDir);
@@ -3801,7 +3805,7 @@ import { Command as Command42 } from "commander";
3801
3805
  // src/commands/graph/status.ts
3802
3806
  import * as path32 from "path";
3803
3807
  async function runGraphStatus(projectPath) {
3804
- const { GraphStore } = await import("./dist-M6BQODWC.js");
3808
+ const { GraphStore } = await import("./dist-HXHWB7SV.js");
3805
3809
  const graphDir = path32.join(projectPath, ".harness", "graph");
3806
3810
  const store = new GraphStore();
3807
3811
  const loaded = await store.load(graphDir);
@@ -3841,7 +3845,7 @@ async function runGraphStatus(projectPath) {
3841
3845
  // src/commands/graph/export.ts
3842
3846
  import * as path33 from "path";
3843
3847
  async function runGraphExport(projectPath, format) {
3844
- const { GraphStore } = await import("./dist-M6BQODWC.js");
3848
+ const { GraphStore } = await import("./dist-HXHWB7SV.js");
3845
3849
  const graphDir = path33.join(projectPath, ".harness", "graph");
3846
3850
  const store = new GraphStore();
3847
3851
  const loaded = await store.load(graphDir);
@@ -3920,7 +3924,7 @@ function createGraphCommand() {
3920
3924
  import { Command as Command43 } from "commander";
3921
3925
  function createMcpCommand() {
3922
3926
  return new Command43("mcp").description("Start the MCP (Model Context Protocol) server on stdio").action(async () => {
3923
- const { startServer: startServer2 } = await import("./mcp-YM6QLHLZ.js");
3927
+ const { startServer: startServer2 } = await import("./mcp-JQUI7BVZ.js");
3924
3928
  await startServer2();
3925
3929
  });
3926
3930
  }
@@ -5108,9 +5112,67 @@ function createOrchestratorCommand() {
5108
5112
  return orchestrator;
5109
5113
  }
5110
5114
 
5115
+ // src/commands/learnings/index.ts
5116
+ import { Command as Command54 } from "commander";
5117
+
5118
+ // src/commands/learnings/prune.ts
5119
+ import { Command as Command53 } from "commander";
5120
+ import * as path44 from "path";
5121
+ async function handlePrune(opts) {
5122
+ const projectPath = path44.resolve(opts.path);
5123
+ const result = await pruneLearnings(projectPath, opts.stream);
5124
+ if (!result.ok) {
5125
+ logger.error(result.error.message);
5126
+ process.exit(ExitCode.ERROR);
5127
+ return;
5128
+ }
5129
+ const { kept, archived, patterns } = result.value;
5130
+ if (archived === 0 && patterns.length === 0) {
5131
+ logger.info(`Nothing to prune. ${kept} learnings in file, all within retention window.`);
5132
+ process.exit(ExitCode.SUCCESS);
5133
+ return;
5134
+ }
5135
+ if (patterns.length > 0) {
5136
+ printPatternProposals(patterns);
5137
+ }
5138
+ if (archived > 0) {
5139
+ logger.success(`Pruned ${archived} entries. ${kept} most recent entries retained.`);
5140
+ logger.info("Archived entries written to .harness/learnings-archive/");
5141
+ } else {
5142
+ logger.info(`No entries archived. ${kept} entries retained.`);
5143
+ }
5144
+ process.exit(ExitCode.SUCCESS);
5145
+ }
5146
+ function printPatternProposals(patterns) {
5147
+ console.log("\n--- Improvement Proposals ---\n");
5148
+ for (const pattern of patterns) {
5149
+ console.log(` [${pattern.tag}] ${pattern.count} learnings with this theme.`);
5150
+ console.log(` Proposal: These learnings suggest a recurring pattern in "${pattern.tag}".`);
5151
+ console.log(
5152
+ ` To add to roadmap: harness mcp manage_roadmap --action add --feature "<improvement>" --status planned
5153
+ `
5154
+ );
5155
+ }
5156
+ console.log(
5157
+ "Review the proposals above. If any warrant a process improvement, add them to the roadmap manually or via manage_roadmap.\n"
5158
+ );
5159
+ }
5160
+ function createPruneCommand() {
5161
+ return new Command53("prune").description(
5162
+ "Analyze global learnings for patterns, present improvement proposals, and archive old entries"
5163
+ ).option("--path <path>", "Project root path", ".").option("--stream <name>", "Target a specific stream").action(handlePrune);
5164
+ }
5165
+
5166
+ // src/commands/learnings/index.ts
5167
+ function createLearningsCommand() {
5168
+ const command = new Command54("learnings").description("Learnings management commands");
5169
+ command.addCommand(createPruneCommand());
5170
+ return command;
5171
+ }
5172
+
5111
5173
  // src/index.ts
5112
5174
  function createProgram() {
5113
- const program = new Command53();
5175
+ const program = new Command55();
5114
5176
  program.name("harness").description("CLI for Harness Engineering toolkit").version(CLI_VERSION).option("-c, --config <path>", "Path to config file").option("--json", "Output as JSON").option("--verbose", "Verbose output").option("--quiet", "Minimal output");
5115
5177
  program.addCommand(createValidateCommand());
5116
5178
  program.addCommand(createCheckDepsCommand());
@@ -5127,6 +5189,7 @@ function createProgram() {
5127
5189
  program.addCommand(createPersonaCommand());
5128
5190
  program.addCommand(createSkillCommand());
5129
5191
  program.addCommand(createStateCommand());
5192
+ program.addCommand(createLearningsCommand());
5130
5193
  program.addCommand(createCheckPhaseGateCommand());
5131
5194
  program.addCommand(createCreateSkillCommand());
5132
5195
  program.addCommand(createSetupMcpCommand());
@@ -27,7 +27,7 @@ var checkPerformanceDefinition = {
27
27
  };
28
28
  async function handleCheckPerformance(input) {
29
29
  try {
30
- const { EntropyAnalyzer } = await import("./dist-IJ4J4C5G.js");
30
+ const { EntropyAnalyzer } = await import("./dist-2B363XUH.js");
31
31
  const typeFilter = input.type ?? "all";
32
32
  const projectPath = sanitizePath(input.path);
33
33
  const analyzer = new EntropyAnalyzer({
@@ -40,10 +40,10 @@ async function handleCheckPerformance(input) {
40
40
  });
41
41
  let graphOptions;
42
42
  try {
43
- const { loadGraphStore } = await import("./graph-loader-KO4GJ5N2.js");
43
+ const { loadGraphStore } = await import("./graph-loader-GJZ4FN4Y.js");
44
44
  const store = await loadGraphStore(projectPath);
45
45
  if (store) {
46
- const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-M6BQODWC.js");
46
+ const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-HXHWB7SV.js");
47
47
  const complexityAdapter = new GraphComplexityAdapter(store);
48
48
  const couplingAdapter = new GraphCouplingAdapter(store);
49
49
  graphOptions = {
@@ -80,7 +80,7 @@ var getPerfBaselinesDefinition = {
80
80
  };
81
81
  async function handleGetPerfBaselines(input) {
82
82
  try {
83
- const { BaselineManager } = await import("./dist-IJ4J4C5G.js");
83
+ const { BaselineManager } = await import("./dist-2B363XUH.js");
84
84
  const manager = new BaselineManager(sanitizePath(input.path));
85
85
  const baselines = manager.load();
86
86
  return resultToMcpResponse(
@@ -128,7 +128,7 @@ var updatePerfBaselinesDefinition = {
128
128
  };
129
129
  async function handleUpdatePerfBaselines(input) {
130
130
  try {
131
- const { BaselineManager } = await import("./dist-IJ4J4C5G.js");
131
+ const { BaselineManager } = await import("./dist-2B363XUH.js");
132
132
  const manager = new BaselineManager(sanitizePath(input.path));
133
133
  manager.save(input.results, input.commitHash);
134
134
  const updated = manager.load();
@@ -158,7 +158,7 @@ var getCriticalPathsDefinition = {
158
158
  };
159
159
  async function handleGetCriticalPaths(input) {
160
160
  try {
161
- const { CriticalPathResolver } = await import("./dist-IJ4J4C5G.js");
161
+ const { CriticalPathResolver } = await import("./dist-2B363XUH.js");
162
162
  const resolver = new CriticalPathResolver(sanitizePath(input.path));
163
163
  const result = await resolver.resolve();
164
164
  return resultToMcpResponse(Ok(result));
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  resolvePersonasDir,
16
16
  resolveSkillsDir
17
- } from "./chunk-HD4IBGLA.js";
17
+ } from "./chunk-N5G5QMS3.js";
18
18
  import {
19
19
  CLIError,
20
20
  ExitCode,
@@ -0,0 +1,217 @@
1
+ import {
2
+ logger
3
+ } from "./chunk-EBJQ6N4M.js";
4
+ import {
5
+ resolveConfig
6
+ } from "./chunk-Z77YQRQT.js";
7
+ import {
8
+ ExitCode
9
+ } from "./chunk-3WGJMBKH.js";
10
+ import {
11
+ Ok
12
+ } from "./chunk-MHBMTPW7.js";
13
+
14
+ // src/commands/check-phase-gate.ts
15
+ import { Command } from "commander";
16
+ import * as path from "path";
17
+ import * as fs from "fs";
18
+
19
+ // src/utils/files.ts
20
+ import { glob } from "glob";
21
+ async function findFiles(pattern, cwd = process.cwd()) {
22
+ return glob(pattern, { cwd, absolute: true });
23
+ }
24
+
25
+ // src/output/formatter.ts
26
+ import chalk from "chalk";
27
+ var OutputMode = {
28
+ /** Output as formatted JSON */
29
+ JSON: "json",
30
+ /** Output as human-readable text */
31
+ TEXT: "text",
32
+ /** Minimal output, only errors and successes */
33
+ QUIET: "quiet",
34
+ /** Full output with detailed context and suggestions */
35
+ VERBOSE: "verbose"
36
+ };
37
+ var OutputFormatter = class {
38
+ /**
39
+ * Creates a new OutputFormatter.
40
+ *
41
+ * @param mode - The output mode to use. Defaults to TEXT.
42
+ */
43
+ constructor(mode = OutputMode.TEXT) {
44
+ this.mode = mode;
45
+ }
46
+ /**
47
+ * Formats raw data for output.
48
+ *
49
+ * @param data - The data to format.
50
+ * @returns A string representation of the data based on the current mode.
51
+ */
52
+ format(data) {
53
+ if (this.mode === OutputMode.JSON) {
54
+ return JSON.stringify(data, null, 2);
55
+ }
56
+ return String(data);
57
+ }
58
+ /**
59
+ * Formats a validation result into a user-friendly string.
60
+ *
61
+ * @param result - The validation result to format.
62
+ * @returns A formatted string containing the validation status and any issues.
63
+ */
64
+ formatValidation(result) {
65
+ if (this.mode === OutputMode.JSON) {
66
+ return JSON.stringify(result, null, 2);
67
+ }
68
+ if (this.mode === OutputMode.QUIET) {
69
+ if (result.valid) return "";
70
+ return result.issues.map((i) => `${i.file ?? ""}: ${i.message}`).join("\n");
71
+ }
72
+ const lines = [];
73
+ if (result.valid) {
74
+ lines.push(chalk.green("v validation passed"));
75
+ } else {
76
+ lines.push(chalk.red(`x Validation failed (${result.issues.length} issues)`));
77
+ lines.push("");
78
+ for (const issue of result.issues) {
79
+ const location = issue.file ? issue.line ? `${issue.file}:${issue.line}` : issue.file : "unknown";
80
+ lines.push(` ${chalk.yellow("*")} ${chalk.dim(location)}`);
81
+ lines.push(` ${issue.message}`);
82
+ if (issue.suggestion && this.mode === OutputMode.VERBOSE) {
83
+ lines.push(` ${chalk.dim("->")} ${issue.suggestion}`);
84
+ }
85
+ }
86
+ }
87
+ return lines.join("\n");
88
+ }
89
+ /**
90
+ * Formats a summary line with a success/failure icon and label.
91
+ *
92
+ * @param label - The name of the field to summarize.
93
+ * @param value - The value to display.
94
+ * @param success - Whether the summary represents a success or failure state.
95
+ * @returns A formatted summary string, or an empty string in JSON or QUIET modes.
96
+ */
97
+ formatSummary(label, value, success) {
98
+ if (this.mode === OutputMode.JSON || this.mode === OutputMode.QUIET) {
99
+ return "";
100
+ }
101
+ const icon = success ? chalk.green("v") : chalk.red("x");
102
+ return `${icon} ${label}: ${value}`;
103
+ }
104
+ };
105
+
106
+ // src/commands/check-phase-gate.ts
107
+ function resolveSpecPath(implFile, implPattern, specPattern, cwd) {
108
+ const relImpl = path.relative(cwd, implFile).replace(/\\/g, "/");
109
+ const implBase = (implPattern.split("*")[0] ?? "").replace(/\/+$/, "");
110
+ const afterBase = relImpl.startsWith(implBase + "/") ? relImpl.slice(implBase.length + 1) : relImpl;
111
+ const segments = afterBase.split("/");
112
+ const firstSegment = segments[0] ?? "";
113
+ const feature = segments.length > 1 ? firstSegment : path.basename(firstSegment, path.extname(firstSegment));
114
+ const specRelative = specPattern.replace("{feature}", feature);
115
+ return path.resolve(cwd, specRelative);
116
+ }
117
+ async function runCheckPhaseGate(options) {
118
+ const configResult = resolveConfig(options.configPath);
119
+ if (!configResult.ok) {
120
+ return configResult;
121
+ }
122
+ const config = configResult.value;
123
+ const cwd = options.cwd ?? (options.configPath ? path.dirname(path.resolve(options.configPath)) : process.cwd());
124
+ if (!config.phaseGates?.enabled) {
125
+ return Ok({
126
+ pass: true,
127
+ skipped: true,
128
+ missingSpecs: [],
129
+ checkedFiles: 0
130
+ });
131
+ }
132
+ const phaseGates = config.phaseGates;
133
+ const missingSpecs = [];
134
+ let checkedFiles = 0;
135
+ for (const mapping of phaseGates.mappings) {
136
+ const implFiles = await findFiles(mapping.implPattern, cwd);
137
+ for (const implFile of implFiles) {
138
+ checkedFiles++;
139
+ const expectedSpec = resolveSpecPath(implFile, mapping.implPattern, mapping.specPattern, cwd);
140
+ if (!fs.existsSync(expectedSpec)) {
141
+ missingSpecs.push({
142
+ implFile: path.relative(cwd, implFile).replace(/\\/g, "/"),
143
+ expectedSpec: path.relative(cwd, expectedSpec).replace(/\\/g, "/")
144
+ });
145
+ }
146
+ }
147
+ }
148
+ const pass = missingSpecs.length === 0;
149
+ return Ok({
150
+ pass,
151
+ skipped: false,
152
+ severity: phaseGates.severity,
153
+ missingSpecs,
154
+ checkedFiles
155
+ });
156
+ }
157
+ function createCheckPhaseGateCommand() {
158
+ const command = new Command("check-phase-gate").description("Verify that implementation files have matching spec documents").action(async (_opts, cmd) => {
159
+ const globalOpts = cmd.optsWithGlobals();
160
+ const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
161
+ const formatter = new OutputFormatter(mode);
162
+ const result = await runCheckPhaseGate({
163
+ configPath: globalOpts.config,
164
+ json: globalOpts.json,
165
+ verbose: globalOpts.verbose,
166
+ quiet: globalOpts.quiet
167
+ });
168
+ if (!result.ok) {
169
+ if (mode === OutputMode.JSON) {
170
+ console.log(JSON.stringify({ error: result.error.message }));
171
+ } else {
172
+ logger.error(result.error.message);
173
+ }
174
+ process.exit(result.error.exitCode);
175
+ }
176
+ const value = result.value;
177
+ if (value.skipped) {
178
+ if (mode === OutputMode.JSON) {
179
+ console.log(formatter.format(value));
180
+ } else if (mode !== OutputMode.QUIET) {
181
+ logger.dim("Phase gates not enabled, skipping.");
182
+ }
183
+ process.exit(ExitCode.SUCCESS);
184
+ }
185
+ const output = formatter.formatValidation({
186
+ valid: value.pass,
187
+ issues: value.missingSpecs.map((m) => ({
188
+ file: m.implFile,
189
+ message: `Missing spec: ${m.expectedSpec}`
190
+ }))
191
+ });
192
+ if (output) {
193
+ console.log(output);
194
+ }
195
+ const summary = formatter.formatSummary(
196
+ "Phase gate check",
197
+ `${value.checkedFiles} files checked, ${value.missingSpecs.length} missing specs`,
198
+ value.pass
199
+ );
200
+ if (summary) {
201
+ console.log(summary);
202
+ }
203
+ if (!value.pass && value.severity === "error") {
204
+ process.exit(ExitCode.VALIDATION_FAILED);
205
+ }
206
+ process.exit(ExitCode.SUCCESS);
207
+ });
208
+ return command;
209
+ }
210
+
211
+ export {
212
+ OutputMode,
213
+ OutputFormatter,
214
+ findFiles,
215
+ runCheckPhaseGate,
216
+ createCheckPhaseGateCommand
217
+ };
@@ -59,7 +59,11 @@ var SkillMetadataSchema = z.object({
59
59
  phases: z.array(SkillPhaseSchema).optional(),
60
60
  state: SkillStateSchema.default({}),
61
61
  depends_on: z.array(z.string()).default([]),
62
- repository: z.string().url().optional()
62
+ repository: z.string().url().optional(),
63
+ tier: z.number().int().min(1).max(3).optional(),
64
+ internal: z.boolean().default(false),
65
+ keywords: z.array(z.string()).default([]),
66
+ stack_signals: z.array(z.string()).default([])
63
67
  });
64
68
 
65
69
  export {
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3WGJMBKH.js";
8
8
  import {
9
9
  ALLOWED_COGNITIVE_MODES
10
- } from "./chunk-VRFZWGMS.js";
10
+ } from "./chunk-XYLGHKG6.js";
11
11
 
12
12
  // src/commands/create-skill.ts
13
13
  import { Command } from "commander";