@harness-engineering/cli 1.13.0 → 1.14.0

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 (367) 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.yaml +1 -0
  14. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +39 -0
  15. package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +1 -0
  16. package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
  17. package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
  18. package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
  19. package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
  20. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +44 -0
  21. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
  22. package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
  23. package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
  24. package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
  25. package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
  26. package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
  27. package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
  28. package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
  29. package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
  30. package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
  31. package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
  32. package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
  33. package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
  34. package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
  35. package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
  36. package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
  37. package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
  38. package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
  39. package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
  40. package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
  41. package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
  42. package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
  43. package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
  44. package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
  45. package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
  46. package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
  47. package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
  48. package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
  49. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +44 -0
  50. package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
  51. package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
  52. package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
  53. package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
  54. package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
  55. package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
  56. package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
  57. package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
  58. package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
  59. package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
  60. package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
  61. package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
  62. package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
  63. package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
  64. package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
  65. package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
  66. package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
  67. package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
  68. package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
  69. package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
  70. package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
  71. package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
  72. package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
  73. package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
  74. package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
  75. package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
  76. package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
  77. package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
  78. package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
  79. package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
  80. package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
  81. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +39 -0
  82. package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
  83. package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
  84. package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
  85. package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
  86. package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
  87. package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
  88. package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
  89. package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +3 -3
  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.yaml +1 -0
  94. package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
  95. package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
  96. package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
  97. package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
  98. package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
  99. package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
  100. package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
  101. package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
  102. package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
  103. package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
  104. package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
  105. package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
  106. package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
  107. package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
  108. package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
  109. package/dist/agents/skills/claude-code/harness-verification/SKILL.md +35 -0
  110. package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
  111. package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
  112. package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
  113. package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
  114. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +11 -3
  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.yaml +1 -0
  130. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +39 -0
  131. package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
  132. package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
  133. package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
  134. package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
  135. package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
  136. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +44 -0
  137. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
  138. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
  139. package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
  140. package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
  141. package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
  142. package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
  143. package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
  144. package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
  145. package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
  146. package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
  147. package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
  148. package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
  149. package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
  150. package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
  151. package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
  152. package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
  153. package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
  154. package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
  155. package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
  156. package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
  157. package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
  158. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
  159. package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
  160. package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
  161. package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
  162. package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
  163. package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
  164. package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
  165. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +44 -0
  166. package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
  167. package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
  168. package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
  169. package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
  170. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
  171. package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
  172. package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
  173. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
  174. package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
  175. package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
  176. package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
  177. package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
  178. package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
  179. package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
  180. package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
  181. package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
  182. package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
  183. package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
  184. package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
  185. package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
  186. package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
  187. package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
  188. package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
  189. package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
  190. package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
  191. package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
  192. package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
  193. package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
  194. package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
  195. package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
  196. package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
  197. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +39 -0
  198. package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
  199. package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
  200. package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
  201. package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
  202. package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
  203. package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
  204. package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
  205. package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +3 -3
  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.yaml +1 -0
  210. package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
  211. package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
  212. package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
  213. package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
  214. package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
  215. package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
  216. package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
  217. package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
  218. package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
  219. package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
  220. package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
  221. package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
  222. package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
  223. package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
  224. package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
  225. package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
  226. package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +35 -0
  227. package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
  228. package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
  229. package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
  230. package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
  231. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +11 -3
  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-YTYQDA3P.js +8 -0
  235. package/dist/{architecture-ESOOE26S.js → architecture-JQZYM4US.js} +4 -4
  236. package/dist/bin/harness-mcp.js +16 -15
  237. package/dist/bin/harness.js +31 -30
  238. package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-L3RADYWO.js} +4 -3
  239. package/dist/{chunk-WPPDRIJL.js → chunk-3C2MLBPJ.js} +4 -4
  240. package/dist/chunk-6KTUUFRN.js +217 -0
  241. package/dist/{chunk-MI5XJQDY.js → chunk-7IP4JIFL.js} +24 -10
  242. package/dist/{chunk-C2ERUR3L.js → chunk-7MJAPE3Z.js} +165 -49
  243. package/dist/{chunk-KELT6K6M.js → chunk-ABQHQ6I5.js} +1861 -1418
  244. package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
  245. package/dist/{chunk-QPEH2QPG.js → chunk-DBSOCI3G.js} +53 -54
  246. package/dist/{chunk-MHBMTPW7.js → chunk-ERS5EVUZ.js} +9 -0
  247. package/dist/{chunk-JSTQ3AWB.js → chunk-FIAPHX37.js} +1 -1
  248. package/dist/{chunk-2YPZKGAG.js → chunk-FTMXDOR6.js} +1 -1
  249. package/dist/{chunk-72GHBOL2.js → chunk-GZKSBLQL.js} +1 -1
  250. package/dist/{chunk-K6XAPGML.js → chunk-H7Y5CKTM.js} +1 -1
  251. package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
  252. package/dist/{chunk-LD3DKUK5.js → chunk-NLVUVUGD.js} +1 -1
  253. package/dist/{chunk-3KOLLWWE.js → chunk-O5OJVPL6.js} +26 -211
  254. package/dist/{chunk-NKDM3FMH.js → chunk-OD3S2NHN.js} +1 -1
  255. package/dist/{chunk-5VY23YK3.js → chunk-OSXBPAMK.js} +2 -2
  256. package/dist/{chunk-MACVXDZK.js → chunk-OXLLOSSR.js} +45 -47
  257. package/dist/{chunk-GNGELAXY.js → chunk-RCWZBSK5.js} +2 -2
  258. package/dist/{chunk-PSNN4LWX.js → chunk-S2FXOWOR.js} +3 -3
  259. package/dist/{chunk-VUCPTQ6G.js → chunk-SD3SQOZ2.js} +1 -1
  260. package/dist/{chunk-7PZWR4LI.js → chunk-TPOTOBR7.js} +9 -9
  261. package/dist/{chunk-RZSUJBZZ.js → chunk-XKECDXJS.js} +452 -353
  262. package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
  263. package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
  264. package/dist/{chunk-2VU4MFM3.js → chunk-YPYGXRDR.js} +7 -7
  265. package/dist/{chunk-Q6AB7W5Z.js → chunk-YQ6KC6TE.js} +1 -1
  266. package/dist/{chunk-7KQSUZVG.js → chunk-YZD2MRNQ.js} +1528 -1010
  267. package/dist/ci-workflow-EQZFVX3P.js +8 -0
  268. package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
  269. package/dist/{dist-M6BQODWC.js → dist-B26DFXMP.js} +573 -480
  270. package/dist/{dist-L7LAAQAS.js → dist-DZ63LLUD.js} +1 -1
  271. package/dist/{dist-WF4C7A4A.js → dist-HWXF2C3R.js} +18 -2
  272. package/dist/{dist-D4RYGUZE.js → dist-USY2C5JL.js} +3 -1
  273. package/dist/{docs-BPYCN2DR.js → docs-7ECGYMAV.js} +5 -3
  274. package/dist/engine-EG4EH4IX.js +8 -0
  275. package/dist/{entropy-4VDVV5CR.js → entropy-5USWKLVS.js} +3 -3
  276. package/dist/{feedback-63QB5RCA.js → feedback-UTBXZZHF.js} +1 -1
  277. package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-3PM5EU7V.js} +5 -5
  278. package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
  279. package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-2M2HXDQI.js} +1 -1
  280. package/dist/index.d.ts +183 -17
  281. package/dist/index.js +32 -30
  282. package/dist/loader-ZPALXIVR.js +10 -0
  283. package/dist/mcp-362EZHF4.js +35 -0
  284. package/dist/{performance-26BH47O4.js → performance-OQAFMJUD.js} +3 -3
  285. package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-C4GCFVGP.js} +1 -1
  286. package/dist/runtime-7YLVK453.js +9 -0
  287. package/dist/{security-UQFUZXEN.js → security-PZOX7AQS.js} +1 -1
  288. package/dist/skill-executor-XZLYZYAK.js +8 -0
  289. package/dist/templates/axum/Cargo.toml.hbs +8 -0
  290. package/dist/templates/axum/src/main.rs +12 -0
  291. package/dist/templates/axum/template.json +16 -0
  292. package/dist/templates/django/manage.py.hbs +19 -0
  293. package/dist/templates/django/requirements.txt.hbs +1 -0
  294. package/dist/templates/django/src/settings.py.hbs +44 -0
  295. package/dist/templates/django/src/urls.py +6 -0
  296. package/dist/templates/django/src/wsgi.py.hbs +9 -0
  297. package/dist/templates/django/template.json +21 -0
  298. package/dist/templates/express/package.json.hbs +15 -0
  299. package/dist/templates/express/src/app.ts +12 -0
  300. package/dist/templates/express/src/lib/.gitkeep +0 -0
  301. package/dist/templates/express/template.json +16 -0
  302. package/dist/templates/fastapi/requirements.txt.hbs +2 -0
  303. package/dist/templates/fastapi/src/main.py +8 -0
  304. package/dist/templates/fastapi/template.json +20 -0
  305. package/dist/templates/gin/go.mod.hbs +5 -0
  306. package/dist/templates/gin/main.go +15 -0
  307. package/dist/templates/gin/template.json +19 -0
  308. package/dist/templates/go-base/.golangci.yml +16 -0
  309. package/dist/templates/go-base/AGENTS.md.hbs +35 -0
  310. package/dist/templates/go-base/go.mod.hbs +3 -0
  311. package/dist/templates/go-base/harness.config.json.hbs +17 -0
  312. package/dist/templates/go-base/main.go +7 -0
  313. package/dist/templates/go-base/template.json +14 -0
  314. package/dist/templates/java-base/AGENTS.md.hbs +35 -0
  315. package/dist/templates/java-base/checkstyle.xml +20 -0
  316. package/dist/templates/java-base/harness.config.json.hbs +16 -0
  317. package/dist/templates/java-base/pom.xml.hbs +39 -0
  318. package/dist/templates/java-base/src/main/java/App.java.hbs +5 -0
  319. package/dist/templates/java-base/template.json +13 -0
  320. package/dist/templates/nestjs/nest-cli.json +5 -0
  321. package/dist/templates/nestjs/package.json.hbs +18 -0
  322. package/dist/templates/nestjs/src/app.module.ts +8 -0
  323. package/dist/templates/nestjs/src/lib/.gitkeep +0 -0
  324. package/dist/templates/nestjs/src/main.ts +11 -0
  325. package/dist/templates/nestjs/template.json +16 -0
  326. package/dist/templates/nextjs/template.json +15 -1
  327. package/dist/templates/python-base/.python-version +1 -0
  328. package/dist/templates/python-base/AGENTS.md.hbs +32 -0
  329. package/dist/templates/python-base/harness.config.json.hbs +16 -0
  330. package/dist/templates/python-base/pyproject.toml.hbs +18 -0
  331. package/dist/templates/python-base/ruff.toml +5 -0
  332. package/dist/templates/python-base/src/__init__.py +0 -0
  333. package/dist/templates/python-base/template.json +13 -0
  334. package/dist/templates/react-vite/index.html +12 -0
  335. package/dist/templates/react-vite/package.json.hbs +18 -0
  336. package/dist/templates/react-vite/src/App.tsx +7 -0
  337. package/dist/templates/react-vite/src/lib/.gitkeep +0 -0
  338. package/dist/templates/react-vite/src/main.tsx +9 -0
  339. package/dist/templates/react-vite/template.json +19 -0
  340. package/dist/templates/react-vite/vite.config.ts +6 -0
  341. package/dist/templates/rust-base/AGENTS.md.hbs +35 -0
  342. package/dist/templates/rust-base/Cargo.toml.hbs +6 -0
  343. package/dist/templates/rust-base/clippy.toml +2 -0
  344. package/dist/templates/rust-base/harness.config.json.hbs +17 -0
  345. package/dist/templates/rust-base/src/main.rs +3 -0
  346. package/dist/templates/rust-base/template.json +14 -0
  347. package/dist/templates/spring-boot/pom.xml.hbs +50 -0
  348. package/dist/templates/spring-boot/src/main/java/Application.java.hbs +19 -0
  349. package/dist/templates/spring-boot/template.json +15 -0
  350. package/dist/templates/vue/index.html +12 -0
  351. package/dist/templates/vue/package.json.hbs +16 -0
  352. package/dist/templates/vue/src/App.vue +7 -0
  353. package/dist/templates/vue/src/lib/.gitkeep +0 -0
  354. package/dist/templates/vue/src/main.ts +4 -0
  355. package/dist/templates/vue/template.json +19 -0
  356. package/dist/templates/vue/vite.config.ts +6 -0
  357. package/dist/{validate-N7QJOKFZ.js → validate-FD3Z6VJD.js} +4 -4
  358. package/dist/validate-cross-check-WNJM6H2D.js +8 -0
  359. package/package.json +6 -6
  360. package/dist/agents-md-P2RHSUV7.js +0 -8
  361. package/dist/ci-workflow-4NYBUG6R.js +0 -8
  362. package/dist/engine-LXLIWQQ3.js +0 -8
  363. package/dist/loader-Z2IT7QX3.js +0 -10
  364. package/dist/mcp-KQHEL5IF.js +0 -34
  365. package/dist/runtime-PDWD7UIK.js +0 -9
  366. package/dist/skill-executor-RG45LUO5.js +0 -8
  367. package/dist/validate-cross-check-EDQ5QGTM.js +0 -8
@@ -1,66 +1,70 @@
1
1
  import {
2
2
  generateCIWorkflow
3
- } from "./chunk-VUCPTQ6G.js";
3
+ } from "./chunk-SD3SQOZ2.js";
4
4
  import {
5
5
  OutputFormatter,
6
6
  OutputMode,
7
7
  createCheckPhaseGateCommand,
8
- findConfigFile,
9
- findFiles,
10
- resolveConfig
11
- } from "./chunk-3KOLLWWE.js";
8
+ findFiles
9
+ } from "./chunk-6KTUUFRN.js";
12
10
  import {
13
11
  createGenerateAgentDefinitionsCommand,
14
12
  generateAgentDefinitions
15
- } from "./chunk-GNGELAXY.js";
13
+ } from "./chunk-RCWZBSK5.js";
16
14
  import {
17
15
  listPersonas,
18
16
  loadPersona
19
- } from "./chunk-Q6AB7W5Z.js";
17
+ } from "./chunk-YQ6KC6TE.js";
20
18
  import {
21
19
  runPersona
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";
35
33
  import {
36
34
  generate,
37
35
  validate
38
- } from "./chunk-QPEH2QPG.js";
36
+ } from "./chunk-DBSOCI3G.js";
39
37
  import {
40
38
  generateRuntime
41
- } from "./chunk-JSTQ3AWB.js";
39
+ } from "./chunk-FIAPHX37.js";
42
40
  import {
43
41
  toKebabCase
44
42
  } from "./chunk-KET4QQZB.js";
45
43
  import {
46
44
  generateAgentsMd
47
- } from "./chunk-NKDM3FMH.js";
45
+ } from "./chunk-OD3S2NHN.js";
48
46
  import {
47
+ appendFrameworkAgents,
49
48
  createGenerateSlashCommandsCommand,
50
49
  generateSlashCommands,
51
50
  handleGetImpact,
52
- handleOrphanDeletion
53
- } from "./chunk-7KQSUZVG.js";
51
+ handleOrphanDeletion,
52
+ persistToolingConfig
53
+ } from "./chunk-YZD2MRNQ.js";
54
54
  import {
55
55
  VALID_PLATFORMS
56
56
  } from "./chunk-ZOAWBDWU.js";
57
+ import {
58
+ findConfigFile,
59
+ resolveConfig
60
+ } from "./chunk-O5OJVPL6.js";
57
61
  import {
58
62
  resolveGlobalSkillsDir,
59
63
  resolvePersonasDir,
60
64
  resolveProjectSkillsDir,
61
65
  resolveSkillsDir,
62
66
  resolveTemplatesDir
63
- } from "./chunk-HD4IBGLA.js";
67
+ } from "./chunk-N5G5QMS3.js";
64
68
  import {
65
69
  CLIError,
66
70
  ExitCode,
@@ -68,13 +72,13 @@ import {
68
72
  } from "./chunk-3WGJMBKH.js";
69
73
  import {
70
74
  SkillMetadataSchema
71
- } from "./chunk-VRFZWGMS.js";
75
+ } from "./chunk-XYLGHKG6.js";
72
76
  import {
73
77
  CLI_VERSION
74
78
  } from "./chunk-BM3PWGXQ.js";
75
79
  import {
76
80
  TemplateEngine
77
- } from "./chunk-C2ERUR3L.js";
81
+ } from "./chunk-7MJAPE3Z.js";
78
82
  import {
79
83
  ArchBaselineManager,
80
84
  ArchConfigSchema,
@@ -123,11 +127,11 @@ import {
123
127
  validateKnowledgeMap,
124
128
  writeConfig,
125
129
  writeLockfile
126
- } from "./chunk-KELT6K6M.js";
130
+ } from "./chunk-ABQHQ6I5.js";
127
131
  import {
128
132
  Err,
129
133
  Ok
130
- } from "./chunk-MHBMTPW7.js";
134
+ } from "./chunk-ERS5EVUZ.js";
131
135
 
132
136
  // src/index.ts
133
137
  import { Command as Command55 } from "commander";
@@ -209,7 +213,7 @@ function createValidateCommand() {
209
213
  process.exit(result.error.exitCode);
210
214
  }
211
215
  if (opts.crossCheck) {
212
- const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-EDQ5QGTM.js");
216
+ const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-WNJM6H2D.js");
213
217
  const cwd = process.cwd();
214
218
  const specsDir = path.join(cwd, "docs", "specs");
215
219
  const plansDir = path.join(cwd, "docs", "plans");
@@ -562,12 +566,11 @@ function createCheckSecurityCommand() {
562
566
  // src/commands/perf.ts
563
567
  import { Command as Command5 } from "commander";
564
568
  import * as path5 from "path";
565
- function createPerfCommand() {
566
- const perf = new Command5("perf").description("Performance benchmark and baseline management");
569
+ function registerBenchCommand(perf) {
567
570
  perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob, _opts, cmd) => {
568
571
  const globalOpts = cmd.optsWithGlobals();
569
572
  const cwd = process.cwd();
570
- const { BenchmarkRunner } = await import("./dist-WF4C7A4A.js");
573
+ const { BenchmarkRunner } = await import("./dist-HWXF2C3R.js");
571
574
  const runner = new BenchmarkRunner();
572
575
  const benchFiles = runner.discover(cwd, glob);
573
576
  if (benchFiles.length === 0) {
@@ -578,48 +581,47 @@ function createPerfCommand() {
578
581
  }
579
582
  return;
580
583
  }
581
- if (globalOpts.json) {
582
- logger.info(`Found ${benchFiles.length} benchmark file(s). Running...`);
583
- } else {
584
- logger.info(`Found ${benchFiles.length} benchmark file(s):`);
585
- for (const f of benchFiles) {
586
- logger.info(` ${f}`);
587
- }
588
- logger.info("Running benchmarks...");
589
- }
584
+ logBenchDiscovery(globalOpts.json, benchFiles);
590
585
  const result = await runner.run(glob ? { cwd, glob } : { cwd });
591
- if (globalOpts.json) {
592
- console.log(JSON.stringify({ results: result.results, success: result.success }));
593
- } else {
594
- if (result.success && result.results.length > 0) {
595
- logger.info(`
586
+ outputBenchResults(globalOpts.json, result);
587
+ });
588
+ }
589
+ function logBenchDiscovery(json, benchFiles) {
590
+ if (json) {
591
+ logger.info(`Found ${benchFiles.length} benchmark file(s). Running...`);
592
+ } else {
593
+ logger.info(`Found ${benchFiles.length} benchmark file(s):`);
594
+ for (const f of benchFiles) logger.info(` ${f}`);
595
+ logger.info("Running benchmarks...");
596
+ }
597
+ }
598
+ function outputBenchResults(json, result) {
599
+ if (json) {
600
+ console.log(JSON.stringify({ results: result.results, success: result.success }));
601
+ return;
602
+ }
603
+ if (result.success && result.results.length > 0) {
604
+ logger.info(`
596
605
  Results (${result.results.length} benchmarks):`);
597
- for (const r of result.results) {
598
- logger.info(
599
- ` ${r.file}::${r.name}: ${r.opsPerSec} ops/s (mean: ${r.meanMs.toFixed(2)}ms)`
600
- );
601
- }
602
- logger.info("\nTo save as baselines: harness perf baselines update");
603
- } else {
604
- logger.info("Benchmark run completed. Check output above for details.");
605
- if (result.rawOutput) {
606
- console.log(result.rawOutput);
607
- }
608
- }
606
+ for (const r of result.results) {
607
+ logger.info(` ${r.file}::${r.name}: ${r.opsPerSec} ops/s (mean: ${r.meanMs.toFixed(2)}ms)`);
609
608
  }
610
- });
609
+ logger.info("\nTo save as baselines: harness perf baselines update");
610
+ } else {
611
+ logger.info("Benchmark run completed. Check output above for details.");
612
+ if (result.rawOutput) console.log(result.rawOutput);
613
+ }
614
+ }
615
+ function registerBaselinesCommands(perf) {
611
616
  const baselines = perf.command("baselines").description("Manage performance baselines");
612
617
  baselines.command("show").description("Display current baselines").action(async (_opts, cmd) => {
613
618
  const globalOpts = cmd.optsWithGlobals();
614
- const cwd = process.cwd();
615
- const manager = new BaselineManager(cwd);
619
+ const manager = new BaselineManager(process.cwd());
616
620
  const data = manager.load();
617
621
  if (!data) {
618
- if (globalOpts.json) {
619
- console.log(JSON.stringify({ baselines: null, message: "No baselines file found" }));
620
- } else {
621
- logger.info("No baselines file found at .harness/perf/baselines.json");
622
- }
622
+ console.log(
623
+ globalOpts.json ? JSON.stringify({ baselines: null, message: "No baselines file found" }) : "No baselines file found at .harness/perf/baselines.json"
624
+ );
623
625
  return;
624
626
  }
625
627
  if (globalOpts.json) {
@@ -636,7 +638,7 @@ Results (${result.results.length} benchmarks):`);
636
638
  baselines.command("update").description("Update baselines from latest benchmark run").action(async (_opts, cmd) => {
637
639
  const globalOpts = cmd.optsWithGlobals();
638
640
  const cwd = process.cwd();
639
- const { BenchmarkRunner } = await import("./dist-WF4C7A4A.js");
641
+ const { BenchmarkRunner } = await import("./dist-HWXF2C3R.js");
640
642
  const runner = new BenchmarkRunner();
641
643
  const manager = new BaselineManager(cwd);
642
644
  logger.info("Running benchmarks to update baselines...");
@@ -647,12 +649,7 @@ Results (${result.results.length} benchmarks):`);
647
649
  );
648
650
  return;
649
651
  }
650
- let commitHash = "unknown";
651
- try {
652
- const { execSync: execSync5 } = await import("child_process");
653
- commitHash = execSync5("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).trim();
654
- } catch {
655
- }
652
+ const commitHash = await getCommitHash(cwd);
656
653
  manager.save(benchResult.results, commitHash);
657
654
  if (globalOpts.json) {
658
655
  console.log(JSON.stringify({ updated: benchResult.results.length, commitHash }));
@@ -661,10 +658,20 @@ Results (${result.results.length} benchmarks):`);
661
658
  logger.info("Baselines saved to .harness/perf/baselines.json");
662
659
  }
663
660
  });
661
+ }
662
+ async function getCommitHash(cwd) {
663
+ try {
664
+ const { execSync: execSync5 } = await import("child_process");
665
+ return execSync5("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).trim();
666
+ } catch {
667
+ return "unknown";
668
+ }
669
+ }
670
+ function registerReportCommand(perf) {
664
671
  perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
665
672
  const globalOpts = cmd.optsWithGlobals();
666
673
  const cwd = process.cwd();
667
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-WF4C7A4A.js");
674
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-HWXF2C3R.js");
668
675
  const analyzer = new EntropyAnalyzer2({
669
676
  rootDir: path5.resolve(cwd),
670
677
  analyze: { complexity: true, coupling: true }
@@ -701,10 +708,11 @@ Results (${result.results.length} benchmarks):`);
701
708
  }
702
709
  }
703
710
  });
711
+ }
712
+ function registerCriticalPathsCommand(perf) {
704
713
  perf.command("critical-paths").description("Show resolved critical path set (annotations + graph inference)").action(async (_opts, cmd) => {
705
714
  const globalOpts = cmd.optsWithGlobals();
706
- const cwd = process.cwd();
707
- const resolver = new CriticalPathResolver(cwd);
715
+ const resolver = new CriticalPathResolver(process.cwd());
708
716
  const result = await resolver.resolve();
709
717
  if (globalOpts.json) {
710
718
  console.log(JSON.stringify(result, null, 2));
@@ -719,12 +727,29 @@ Results (${result.results.length} benchmarks):`);
719
727
  }
720
728
  }
721
729
  });
730
+ }
731
+ function createPerfCommand() {
732
+ const perf = new Command5("perf").description("Performance benchmark and baseline management");
733
+ registerBenchCommand(perf);
734
+ registerBaselinesCommands(perf);
735
+ registerReportCommand(perf);
736
+ registerCriticalPathsCommand(perf);
722
737
  return perf;
723
738
  }
724
739
 
725
740
  // src/commands/check-docs.ts
726
741
  import { Command as Command6 } from "commander";
727
742
  import * as path6 from "path";
743
+
744
+ // src/utils/output.ts
745
+ function resolveOutputMode(globalOpts) {
746
+ if (globalOpts.json) return OutputMode.JSON;
747
+ if (globalOpts.quiet) return OutputMode.QUIET;
748
+ if (globalOpts.verbose) return OutputMode.VERBOSE;
749
+ return OutputMode.TEXT;
750
+ }
751
+
752
+ // src/commands/check-docs.ts
728
753
  async function runCheckDocs(options) {
729
754
  const cwd = options.cwd ?? process.cwd();
730
755
  const minCoverage = options.minCoverage ?? 80;
@@ -775,7 +800,7 @@ async function runCheckDocs(options) {
775
800
  function createCheckDocsCommand() {
776
801
  const command = new Command6("check-docs").description("Check documentation coverage").option("--min-coverage <percent>", "Minimum coverage percentage", "80").action(async (opts, cmd) => {
777
802
  const globalOpts = cmd.optsWithGlobals();
778
- const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
803
+ const mode = resolveOutputMode(globalOpts);
779
804
  const formatter = new OutputFormatter(mode);
780
805
  const result = await runCheckDocs({
781
806
  configPath: globalOpts.config,
@@ -945,7 +970,6 @@ function createSetupMcpCommand() {
945
970
  async function runInit(options) {
946
971
  const cwd = options.cwd ?? process.cwd();
947
972
  const name = options.name ?? path8.basename(cwd);
948
- const level = options.level ?? "basic";
949
973
  const force = options.force ?? false;
950
974
  const configPath = path8.join(cwd, "harness.config.json");
951
975
  if (!force && fs2.existsSync(configPath)) {
@@ -953,33 +977,82 @@ async function runInit(options) {
953
977
  new CLIError("Project already initialized. Use --force to overwrite.", ExitCode.ERROR)
954
978
  );
955
979
  }
956
- const templatesDir = resolveTemplatesDir();
957
- const engine = new TemplateEngine(templatesDir);
958
- const resolveResult = engine.resolveTemplate(level, options.framework);
959
- if (!resolveResult.ok) {
960
- return Err(new CLIError(resolveResult.error.message, ExitCode.ERROR));
980
+ const engine = new TemplateEngine(resolveTemplatesDir());
981
+ const templates = engine.listTemplates();
982
+ const templateList = templates.ok ? templates.value : [];
983
+ const validationError = validateFrameworkLanguage(options, templateList);
984
+ if (validationError) return Err(validationError);
985
+ const detected = tryAutoDetect(engine, cwd, options);
986
+ if (detected) return Ok(detected);
987
+ const language = resolveLanguage(options, templateList);
988
+ return scaffoldProject(engine, { cwd, name, force, language, options });
989
+ }
990
+ function validateFrameworkLanguage(options, templateList) {
991
+ if (!options.framework || !options.language) return null;
992
+ const fwTemplate = templateList.find((t) => t.framework === options.framework);
993
+ if (fwTemplate?.language && fwTemplate.language !== options.language) {
994
+ return new CLIError(
995
+ `Framework "${options.framework}" is a ${fwTemplate.language} framework, but --language ${options.language} was specified. Remove --language or use --language ${fwTemplate.language}.`,
996
+ ExitCode.ERROR
997
+ );
961
998
  }
999
+ return null;
1000
+ }
1001
+ function tryAutoDetect(engine, cwd, options) {
1002
+ if (options.framework || options.language) return null;
1003
+ const detectResult = engine.detectFramework(cwd);
1004
+ if (detectResult.ok && detectResult.value.length > 0) {
1005
+ return { filesCreated: [], skippedConfigs: [], detectedFrameworks: detectResult.value };
1006
+ }
1007
+ return null;
1008
+ }
1009
+ function resolveLanguage(options, templateList) {
1010
+ if (options.language) return options.language;
1011
+ if (options.framework) {
1012
+ const fwTemplate = templateList.find((t) => t.framework === options.framework);
1013
+ if (fwTemplate?.language) return fwTemplate.language;
1014
+ }
1015
+ return void 0;
1016
+ }
1017
+ function scaffoldProject(engine, ctx) {
1018
+ const { cwd, name, force, language, options } = ctx;
1019
+ const isNonJs = language && language !== "typescript";
1020
+ const level = isNonJs ? void 0 : options.level ?? "basic";
1021
+ const resolveResult = engine.resolveTemplate(level, options.framework, language);
1022
+ if (!resolveResult.ok) return Err(new CLIError(resolveResult.error.message, ExitCode.ERROR));
962
1023
  const renderResult = engine.render(resolveResult.value, {
963
1024
  projectName: name,
964
- level,
965
- ...options.framework !== void 0 && { framework: options.framework }
1025
+ level: level ?? "",
1026
+ ...options.framework !== void 0 && { framework: options.framework },
1027
+ ...language !== void 0 && { language }
966
1028
  });
967
- if (!renderResult.ok) {
968
- return Err(new CLIError(renderResult.error.message, ExitCode.ERROR));
969
- }
970
- const writeResult = engine.write(renderResult.value, cwd, { overwrite: force });
971
- if (!writeResult.ok) {
972
- return Err(new CLIError(writeResult.error.message, ExitCode.ERROR));
1029
+ if (!renderResult.ok) return Err(new CLIError(renderResult.error.message, ExitCode.ERROR));
1030
+ const writeResult = engine.write(renderResult.value, cwd, {
1031
+ overwrite: force,
1032
+ ...language !== void 0 && { language }
1033
+ });
1034
+ if (!writeResult.ok) return Err(new CLIError(writeResult.error.message, ExitCode.ERROR));
1035
+ if (writeResult.value.skippedConfigs.length > 0) {
1036
+ logger.warn("Skipped existing package config files:");
1037
+ for (const file of writeResult.value.skippedConfigs) {
1038
+ logger.info(` - ${file} (add harness dependencies manually)`);
1039
+ }
973
1040
  }
974
- return Ok({ filesCreated: writeResult.value });
1041
+ persistToolingConfig(cwd, resolveResult.value, options.framework);
1042
+ appendFrameworkAgents(cwd, options.framework, language);
1043
+ return Ok({
1044
+ filesCreated: writeResult.value.written,
1045
+ skippedConfigs: writeResult.value.skippedConfigs
1046
+ });
975
1047
  }
976
1048
  function createInitCommand() {
977
- const command = new Command8("init").description("Initialize a new harness-engineering project").option("-n, --name <name>", "Project name").option("-l, --level <level>", "Adoption level (basic, intermediate, advanced)", "basic").option("--framework <framework>", "Framework overlay (nextjs)").option("-f, --force", "Overwrite existing files").option("-y, --yes", "Use defaults without prompting").action(async (opts, cmd) => {
1049
+ const command = new Command8("init").description("Initialize a new harness-engineering project").option("-n, --name <name>", "Project name").option("-l, --level <level>", "Adoption level (basic, intermediate, advanced)", "basic").option("--framework <framework>", "Framework overlay (nextjs)").option("--language <language>", "Target language (typescript, python, go, rust, java)").option("-f, --force", "Overwrite existing files").option("-y, --yes", "Use defaults without prompting").action(async (opts, cmd) => {
978
1050
  const globalOpts = cmd.optsWithGlobals();
979
1051
  const result = await runInit({
980
1052
  name: opts.name,
981
1053
  level: opts.level,
982
1054
  framework: opts.framework,
1055
+ language: opts.language,
983
1056
  force: opts.force
984
1057
  });
985
1058
  if (!result.ok) {
@@ -1075,10 +1148,39 @@ async function runCleanup(options) {
1075
1148
  result.totalIssues = result.driftIssues.length + result.deadCode.length + result.patternViolations.length;
1076
1149
  return Ok(result);
1077
1150
  }
1151
+ function printCleanupResult(value, formatter) {
1152
+ console.log(
1153
+ formatter.formatSummary("Entropy issues", value.totalIssues.toString(), value.totalIssues === 0)
1154
+ );
1155
+ if (value.driftIssues.length > 0) {
1156
+ console.log("\nDocumentation drift:");
1157
+ for (const issue of value.driftIssues) {
1158
+ console.log(` - ${issue.file}: ${issue.issue}`);
1159
+ }
1160
+ }
1161
+ if (value.deadCode.length > 0) {
1162
+ console.log("\nDead code:");
1163
+ for (const item of value.deadCode.slice(0, 10)) {
1164
+ console.log(` - ${item.file}${item.symbol ? `: ${item.symbol}` : ""}`);
1165
+ }
1166
+ if (value.deadCode.length > 10) {
1167
+ console.log(` ... and ${value.deadCode.length - 10} more`);
1168
+ }
1169
+ }
1170
+ if (value.patternViolations.length > 0) {
1171
+ console.log("\nPattern violations:");
1172
+ for (const violation of value.patternViolations.slice(0, 10)) {
1173
+ console.log(` - ${violation.file} [${violation.pattern}]: ${violation.message}`);
1174
+ }
1175
+ if (value.patternViolations.length > 10) {
1176
+ console.log(` ... and ${value.patternViolations.length - 10} more`);
1177
+ }
1178
+ }
1179
+ }
1078
1180
  function createCleanupCommand() {
1079
1181
  const command = new Command9("cleanup").description("Detect entropy issues (doc drift, dead code, patterns)").option("-t, --type <type>", "Issue type: drift, dead-code, patterns, all", "all").action(async (opts, cmd) => {
1080
1182
  const globalOpts = cmd.optsWithGlobals();
1081
- const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
1183
+ const mode = resolveOutputMode(globalOpts);
1082
1184
  const formatter = new OutputFormatter(mode);
1083
1185
  const result = await runCleanup({
1084
1186
  configPath: globalOpts.config,
@@ -1098,37 +1200,7 @@ function createCleanupCommand() {
1098
1200
  if (mode === OutputMode.JSON) {
1099
1201
  console.log(JSON.stringify(result.value, null, 2));
1100
1202
  } else if (mode !== OutputMode.QUIET || result.value.totalIssues > 0) {
1101
- console.log(
1102
- formatter.formatSummary(
1103
- "Entropy issues",
1104
- result.value.totalIssues.toString(),
1105
- result.value.totalIssues === 0
1106
- )
1107
- );
1108
- if (result.value.driftIssues.length > 0) {
1109
- console.log("\nDocumentation drift:");
1110
- for (const issue of result.value.driftIssues) {
1111
- console.log(` - ${issue.file}: ${issue.issue}`);
1112
- }
1113
- }
1114
- if (result.value.deadCode.length > 0) {
1115
- console.log("\nDead code:");
1116
- for (const item of result.value.deadCode.slice(0, 10)) {
1117
- console.log(` - ${item.file}${item.symbol ? `: ${item.symbol}` : ""}`);
1118
- }
1119
- if (result.value.deadCode.length > 10) {
1120
- console.log(` ... and ${result.value.deadCode.length - 10} more`);
1121
- }
1122
- }
1123
- if (result.value.patternViolations.length > 0) {
1124
- console.log("\nPattern violations:");
1125
- for (const violation of result.value.patternViolations.slice(0, 10)) {
1126
- console.log(` - ${violation.file} [${violation.pattern}]: ${violation.message}`);
1127
- }
1128
- if (result.value.patternViolations.length > 10) {
1129
- console.log(` ... and ${result.value.patternViolations.length - 10} more`);
1130
- }
1131
- }
1203
+ printCleanupResult(result.value, formatter);
1132
1204
  }
1133
1205
  process.exit(result.value.totalIssues === 0 ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
1134
1206
  });
@@ -1236,10 +1308,42 @@ async function runFixDrift(options) {
1236
1308
  };
1237
1309
  return Ok(result);
1238
1310
  }
1311
+ function printFixDriftResult(value, mode, formatter) {
1312
+ const statusMessage = value.dryRun ? "(dry-run)" : "";
1313
+ console.log(
1314
+ formatter.formatSummary(
1315
+ `Fix drift ${statusMessage}`,
1316
+ `${value.fixes.length} fixes, ${value.suggestions.length} suggestions`,
1317
+ value.fixes.length === 0 && value.suggestions.length === 0
1318
+ )
1319
+ );
1320
+ if (value.fixes.length > 0) {
1321
+ console.log("\nFixes:");
1322
+ for (const fix of value.fixes.slice(0, 10)) {
1323
+ const status = fix.applied ? "[applied]" : "[pending]";
1324
+ console.log(` ${status} ${fix.action}: ${fix.file}`);
1325
+ }
1326
+ if (value.fixes.length > 10) {
1327
+ console.log(` ... and ${value.fixes.length - 10} more`);
1328
+ }
1329
+ }
1330
+ if (value.suggestions.length > 0 && (mode === OutputMode.VERBOSE || value.fixes.length === 0)) {
1331
+ console.log("\nSuggestions:");
1332
+ for (const suggestion of value.suggestions.slice(0, 10)) {
1333
+ console.log(` - ${suggestion.file}: ${suggestion.suggestion}`);
1334
+ }
1335
+ if (value.suggestions.length > 10) {
1336
+ console.log(` ... and ${value.suggestions.length - 10} more`);
1337
+ }
1338
+ }
1339
+ if (value.dryRun && value.fixes.length > 0) {
1340
+ console.log("\nRun with --no-dry-run to apply fixes.");
1341
+ }
1342
+ }
1239
1343
  function createFixDriftCommand() {
1240
1344
  const command = new Command10("fix-drift").description("Auto-fix entropy issues (doc drift, dead code)").option("--no-dry-run", "Actually apply fixes (default is dry-run mode)").action(async (opts, cmd) => {
1241
1345
  const globalOpts = cmd.optsWithGlobals();
1242
- const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
1346
+ const mode = resolveOutputMode(globalOpts);
1243
1347
  const formatter = new OutputFormatter(mode);
1244
1348
  const result = await runFixDrift({
1245
1349
  configPath: globalOpts.config,
@@ -1259,37 +1363,7 @@ function createFixDriftCommand() {
1259
1363
  if (mode === OutputMode.JSON) {
1260
1364
  console.log(JSON.stringify(result.value, null, 2));
1261
1365
  } else if (mode !== OutputMode.QUIET || result.value.fixes.length > 0 || result.value.suggestions.length > 0) {
1262
- const { value } = result;
1263
- const statusMessage = value.dryRun ? "(dry-run)" : "";
1264
- console.log(
1265
- formatter.formatSummary(
1266
- `Fix drift ${statusMessage}`,
1267
- `${value.fixes.length} fixes, ${value.suggestions.length} suggestions`,
1268
- value.fixes.length === 0 && value.suggestions.length === 0
1269
- )
1270
- );
1271
- if (value.fixes.length > 0) {
1272
- console.log("\nFixes:");
1273
- for (const fix of value.fixes.slice(0, 10)) {
1274
- const status = fix.applied ? "[applied]" : "[pending]";
1275
- console.log(` ${status} ${fix.action}: ${fix.file}`);
1276
- }
1277
- if (value.fixes.length > 10) {
1278
- console.log(` ... and ${value.fixes.length - 10} more`);
1279
- }
1280
- }
1281
- if (value.suggestions.length > 0 && (mode === OutputMode.VERBOSE || value.fixes.length === 0)) {
1282
- console.log("\nSuggestions:");
1283
- for (const suggestion of value.suggestions.slice(0, 10)) {
1284
- console.log(` - ${suggestion.file}: ${suggestion.suggestion}`);
1285
- }
1286
- if (value.suggestions.length > 10) {
1287
- console.log(` ... and ${value.suggestions.length - 10} more`);
1288
- }
1289
- }
1290
- if (value.dryRun && value.fixes.length > 0) {
1291
- console.log("\nRun with --no-dry-run to apply fixes.");
1292
- }
1366
+ printFixDriftResult(result.value, mode, formatter);
1293
1367
  }
1294
1368
  process.exit(ExitCode.SUCCESS);
1295
1369
  });
@@ -1354,49 +1428,54 @@ var VALID_TRIGGERS = /* @__PURE__ */ new Set([
1354
1428
  "on_plan_approved",
1355
1429
  "auto"
1356
1430
  ]);
1431
+ function resolveTrigger(triggerOpt) {
1432
+ if (triggerOpt === "auto") return "auto";
1433
+ return VALID_TRIGGERS.has(triggerOpt) ? triggerOpt : "manual";
1434
+ }
1435
+ function createCommandExecutor() {
1436
+ return async (command) => {
1437
+ if (!ALLOWED_PERSONA_COMMANDS.has(command)) {
1438
+ return Err(new Error(`Unknown harness command: ${command}`));
1439
+ }
1440
+ try {
1441
+ childProcess.execFileSync("npx", ["harness", command], { stdio: "inherit" });
1442
+ return Ok(null);
1443
+ } catch (error) {
1444
+ return Err(new Error(error instanceof Error ? error.message : String(error)));
1445
+ }
1446
+ };
1447
+ }
1448
+ async function runPersonaMode(opts, quiet) {
1449
+ const personasDir = resolvePersonasDir();
1450
+ const filePath = path11.join(personasDir, `${opts.persona}.yaml`);
1451
+ const personaResult = loadPersona(filePath);
1452
+ if (!personaResult.ok) {
1453
+ logger.error(personaResult.error.message);
1454
+ process.exit(ExitCode.ERROR);
1455
+ }
1456
+ const report = await runPersona(personaResult.value, {
1457
+ trigger: resolveTrigger(opts.trigger),
1458
+ commandExecutor: createCommandExecutor(),
1459
+ skillExecutor: executeSkill,
1460
+ projectPath: process.cwd()
1461
+ });
1462
+ if (!quiet) {
1463
+ logger.info(`Persona '${report.persona}' status: ${report.status}`);
1464
+ for (const s of report.steps) {
1465
+ const icon = s.status === "pass" ? "v" : s.status === "fail" ? "x" : "-";
1466
+ const typeTag = s.type === "skill" ? " [skill]" : "";
1467
+ console.log(` [${icon}] ${s.name}${typeTag} (${s.durationMs}ms)`);
1468
+ if (s.artifactPath) console.log(` artifact: ${s.artifactPath}`);
1469
+ }
1470
+ }
1471
+ process.exit(report.status === "fail" ? ExitCode.ERROR : ExitCode.SUCCESS);
1472
+ }
1357
1473
  function createRunCommand() {
1358
1474
  return new Command11("run").description("Run an agent task").argument("[task]", "Task to run (review, doc-review, test-review)").option("--timeout <ms>", "Timeout in milliseconds", "300000").option("--persona <name>", "Run a persona by name").option("--trigger <context>", "Trigger context (auto, on_pr, on_commit, manual)", "auto").action(async (task, opts, cmd) => {
1359
1475
  const globalOpts = cmd.optsWithGlobals();
1360
1476
  if (opts.persona) {
1361
- const personasDir = resolvePersonasDir();
1362
- const filePath = path11.join(personasDir, `${opts.persona}.yaml`);
1363
- const personaResult = loadPersona(filePath);
1364
- if (!personaResult.ok) {
1365
- logger.error(personaResult.error.message);
1366
- process.exit(ExitCode.ERROR);
1367
- }
1368
- const persona = personaResult.value;
1369
- const projectPath = process.cwd();
1370
- const trigger = opts.trigger === "auto" ? "auto" : VALID_TRIGGERS.has(opts.trigger) ? opts.trigger : "manual";
1371
- const commandExecutor = async (command) => {
1372
- if (!ALLOWED_PERSONA_COMMANDS.has(command)) {
1373
- return Err(new Error(`Unknown harness command: ${command}`));
1374
- }
1375
- try {
1376
- childProcess.execFileSync("npx", ["harness", command], { stdio: "inherit" });
1377
- return Ok(null);
1378
- } catch (error) {
1379
- return Err(new Error(error instanceof Error ? error.message : String(error)));
1380
- }
1381
- };
1382
- const report = await runPersona(persona, {
1383
- trigger,
1384
- commandExecutor,
1385
- skillExecutor: executeSkill,
1386
- projectPath
1387
- });
1388
- if (!globalOpts.quiet) {
1389
- logger.info(`Persona '${report.persona}' status: ${report.status}`);
1390
- for (const s of report.steps) {
1391
- const icon = s.status === "pass" ? "v" : s.status === "fail" ? "x" : "-";
1392
- const typeTag = s.type === "skill" ? " [skill]" : "";
1393
- console.log(` [${icon}] ${s.name}${typeTag} (${s.durationMs}ms)`);
1394
- if (s.artifactPath) {
1395
- console.log(` artifact: ${s.artifactPath}`);
1396
- }
1397
- }
1398
- }
1399
- process.exit(report.status === "fail" ? ExitCode.ERROR : ExitCode.SUCCESS);
1477
+ await runPersonaMode(opts, globalOpts.quiet);
1478
+ return;
1400
1479
  }
1401
1480
  if (!task) {
1402
1481
  logger.error("Either a task argument or --persona flag is required.");
@@ -1607,7 +1686,8 @@ async function runAdd(componentType, name, options) {
1607
1686
  break;
1608
1687
  }
1609
1688
  case "doc": {
1610
- const docsDir = path12.join(cwd, "docs");
1689
+ const configDocsDir = configResult.ok ? configResult.value.docsDir : "./docs";
1690
+ const docsDir = path12.resolve(cwd, configDocsDir);
1611
1691
  if (!fs3.existsSync(docsDir)) {
1612
1692
  fs3.mkdirSync(docsDir, { recursive: true });
1613
1693
  }
@@ -1616,11 +1696,11 @@ async function runAdd(componentType, name, options) {
1616
1696
  return Err(new CLIError(`Doc ${name} already exists`, ExitCode.ERROR));
1617
1697
  }
1618
1698
  fs3.writeFileSync(docPath, DOC_TEMPLATE(name));
1619
- created.push(`docs/${name}.md`);
1699
+ created.push(`${configDocsDir.replace(/^\.[\\/]/, "")}/${name}.md`);
1620
1700
  break;
1621
1701
  }
1622
1702
  case "skill": {
1623
- const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-WPXHSLX2.js");
1703
+ const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-XSWHMSM5.js");
1624
1704
  generateSkillFiles2({
1625
1705
  name,
1626
1706
  description: `${name} skill`,
@@ -1984,6 +2064,33 @@ function scanDirectory(dirPath, source) {
1984
2064
  }
1985
2065
  return skills;
1986
2066
  }
2067
+ function collectCommunitySkills(seen, allSkills) {
2068
+ const globalDir = resolveGlobalSkillsDir();
2069
+ const skillsDir = path15.dirname(globalDir);
2070
+ const communityBase = path15.join(skillsDir, "community");
2071
+ const communityPlatformDir = path15.join(communityBase, "claude-code");
2072
+ const lockfilePath = path15.join(communityBase, "skills-lock.json");
2073
+ const lockfile = readLockfile2(lockfilePath);
2074
+ const communitySkills = scanDirectory(communityPlatformDir, "community");
2075
+ for (const skill of communitySkills) {
2076
+ const lockEntry = lockfile.skills[`@harness-skills/${skill.name}`];
2077
+ if (lockEntry) skill.version = lockEntry.version;
2078
+ }
2079
+ for (const [pkgName, entry] of Object.entries(lockfile.skills)) {
2080
+ const shortName = pkgName.replace("@harness-skills/", "");
2081
+ if (!seen.has(shortName)) {
2082
+ seen.add(shortName);
2083
+ allSkills.push({
2084
+ name: shortName,
2085
+ description: "",
2086
+ type: "",
2087
+ source: "community",
2088
+ version: entry.version
2089
+ });
2090
+ }
2091
+ }
2092
+ return communitySkills;
2093
+ }
1987
2094
  function collectSkills(opts) {
1988
2095
  const seen = /* @__PURE__ */ new Set();
1989
2096
  const allSkills = [];
@@ -2002,34 +2109,7 @@ function collectSkills(opts) {
2002
2109
  }
2003
2110
  }
2004
2111
  if (opts.filter === "all" || opts.filter === "installed") {
2005
- const globalDir = resolveGlobalSkillsDir();
2006
- const skillsDir = path15.dirname(globalDir);
2007
- const communityBase = path15.join(skillsDir, "community");
2008
- const communityPlatformDir = path15.join(communityBase, "claude-code");
2009
- const lockfilePath = path15.join(communityBase, "skills-lock.json");
2010
- const lockfile = readLockfile2(lockfilePath);
2011
- const communitySkills = scanDirectory(communityPlatformDir, "community");
2012
- for (const skill of communitySkills) {
2013
- const pkgName = `@harness-skills/${skill.name}`;
2014
- const lockEntry = lockfile.skills[pkgName];
2015
- if (lockEntry) {
2016
- skill.version = lockEntry.version;
2017
- }
2018
- }
2019
- addUnique(communitySkills);
2020
- for (const [pkgName, entry] of Object.entries(lockfile.skills)) {
2021
- const shortName = pkgName.replace("@harness-skills/", "");
2022
- if (!seen.has(shortName)) {
2023
- seen.add(shortName);
2024
- allSkills.push({
2025
- name: shortName,
2026
- description: "",
2027
- type: "",
2028
- source: "community",
2029
- version: entry.version
2030
- });
2031
- }
2032
- }
2112
+ addUnique(collectCommunitySkills(seen, allSkills));
2033
2113
  }
2034
2114
  if (opts.filter === "all") {
2035
2115
  const globalDir = resolveGlobalSkillsDir();
@@ -2163,6 +2243,69 @@ ${options.priorState}`);
2163
2243
  }
2164
2244
 
2165
2245
  // src/commands/skill/run.ts
2246
+ function loadSkillMetadata(skillDir) {
2247
+ const yamlPath = path16.join(skillDir, "skill.yaml");
2248
+ if (!fs7.existsSync(yamlPath)) return null;
2249
+ try {
2250
+ const result = SkillMetadataSchema.safeParse(parse2(fs7.readFileSync(yamlPath, "utf-8")));
2251
+ return result.success ? result.data : null;
2252
+ } catch {
2253
+ return null;
2254
+ }
2255
+ }
2256
+ function resolveComplexity(metadata, requested, projectPath) {
2257
+ if (!metadata?.phases || metadata.phases.length === 0) return void 0;
2258
+ if (requested === "auto") return detectComplexity(projectPath);
2259
+ return requested;
2260
+ }
2261
+ function loadPrinciples(projectPath) {
2262
+ const principlesPath = path16.join(projectPath, "docs", "principles.md");
2263
+ return fs7.existsSync(principlesPath) ? fs7.readFileSync(principlesPath, "utf-8") : void 0;
2264
+ }
2265
+ function readMostRecentFileInDir(dirPath) {
2266
+ const files = fs7.readdirSync(dirPath).map((f) => ({ name: f, mtime: fs7.statSync(path16.join(dirPath, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
2267
+ if (files.length > 0) return fs7.readFileSync(path16.join(dirPath, files[0].name), "utf-8");
2268
+ return void 0;
2269
+ }
2270
+ function loadPriorState(metadata, projectPath) {
2271
+ if (!metadata?.state.persistent || metadata.state.files.length === 0) return void 0;
2272
+ for (const stateFilePath of metadata.state.files) {
2273
+ const fullPath = path16.join(projectPath, stateFilePath);
2274
+ if (!fs7.existsSync(fullPath)) continue;
2275
+ const stat = fs7.statSync(fullPath);
2276
+ if (stat.isDirectory()) return readMostRecentFileInDir(fullPath);
2277
+ return fs7.readFileSync(fullPath, "utf-8");
2278
+ }
2279
+ return void 0;
2280
+ }
2281
+ function validatePhaseName(metadata, phase) {
2282
+ if (!metadata?.phases) return true;
2283
+ return metadata.phases.map((p) => p.name).includes(phase);
2284
+ }
2285
+ function resolvePhaseState(metadata, projectPath, phase) {
2286
+ if (!validatePhaseName(metadata, phase)) {
2287
+ const validPhases = metadata.phases.map((p) => p.name);
2288
+ logger.error(`Unknown phase: ${phase}. Valid phases: ${validPhases.join(", ")}`);
2289
+ return null;
2290
+ }
2291
+ const priorState = loadPriorState(metadata, projectPath);
2292
+ const stateWarning = !priorState && metadata?.state.persistent ? "No prior phase data found. Earlier phases have not been completed. Proceed with caution." : void 0;
2293
+ return { priorState, stateWarning };
2294
+ }
2295
+ function appendProjectState(content, metadata, projectPath, hasPathOpt) {
2296
+ if (!metadata?.state.persistent || !hasPathOpt) return content;
2297
+ const stateFile = path16.join(projectPath, ".harness", "state.json");
2298
+ if (!fs7.existsSync(stateFile)) return content;
2299
+ const stateContent = fs7.readFileSync(stateFile, "utf-8");
2300
+ return content + `
2301
+
2302
+ ---
2303
+ ## Project State
2304
+ \`\`\`json
2305
+ ${stateContent}
2306
+ \`\`\`
2307
+ `;
2308
+ }
2166
2309
  function createRunCommand2() {
2167
2310
  return new Command22("run").description("Run a skill (outputs SKILL.md content with context preamble)").argument("<name>", "Skill name (e.g., harness-tdd)").option("--path <path>", "Project root path for context injection").option("--complexity <level>", "Complexity: auto, light, full", "auto").option("--phase <name>", "Start at a specific phase (for re-entry)").option("--party", "Enable multi-perspective evaluation").action(async (name, opts, _cmd) => {
2168
2311
  const skillsDir = resolveSkillsDir();
@@ -2172,64 +2315,24 @@ function createRunCommand2() {
2172
2315
  process.exit(ExitCode.ERROR);
2173
2316
  return;
2174
2317
  }
2175
- const yamlPath = path16.join(skillDir, "skill.yaml");
2176
- let metadata = null;
2177
- if (fs7.existsSync(yamlPath)) {
2178
- try {
2179
- const raw = fs7.readFileSync(yamlPath, "utf-8");
2180
- const parsed = parse2(raw);
2181
- const result = SkillMetadataSchema.safeParse(parsed);
2182
- if (result.success) metadata = result.data;
2183
- } catch {
2184
- }
2185
- }
2186
- let complexity;
2187
- if (metadata?.phases && metadata.phases.length > 0) {
2188
- const requested = opts.complexity ?? "auto";
2189
- if (requested === "auto") {
2190
- const projectPath2 = opts.path ? path16.resolve(opts.path) : process.cwd();
2191
- complexity = detectComplexity(projectPath2);
2192
- } else {
2193
- complexity = requested;
2194
- }
2195
- }
2196
- let principles;
2318
+ const metadata = loadSkillMetadata(skillDir);
2197
2319
  const projectPath = opts.path ? path16.resolve(opts.path) : process.cwd();
2198
- const principlesPath = path16.join(projectPath, "docs", "principles.md");
2199
- if (fs7.existsSync(principlesPath)) {
2200
- principles = fs7.readFileSync(principlesPath, "utf-8");
2201
- }
2320
+ const complexity = resolveComplexity(
2321
+ metadata,
2322
+ opts.complexity ?? "auto",
2323
+ projectPath
2324
+ );
2325
+ const principles = loadPrinciples(projectPath);
2202
2326
  let priorState;
2203
2327
  let stateWarning;
2204
2328
  if (opts.phase) {
2205
- if (metadata?.phases) {
2206
- const validPhases = metadata.phases.map((p) => p.name);
2207
- if (!validPhases.includes(opts.phase)) {
2208
- logger.error(`Unknown phase: ${opts.phase}. Valid phases: ${validPhases.join(", ")}`);
2209
- process.exit(ExitCode.ERROR);
2210
- return;
2211
- }
2212
- }
2213
- if (metadata?.state.persistent && metadata.state.files.length > 0) {
2214
- for (const stateFilePath of metadata.state.files) {
2215
- const fullPath = path16.join(projectPath, stateFilePath);
2216
- if (fs7.existsSync(fullPath)) {
2217
- const stat = fs7.statSync(fullPath);
2218
- if (stat.isDirectory()) {
2219
- const files = fs7.readdirSync(fullPath).map((f) => ({ name: f, mtime: fs7.statSync(path16.join(fullPath, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
2220
- if (files.length > 0) {
2221
- priorState = fs7.readFileSync(path16.join(fullPath, files[0].name), "utf-8");
2222
- }
2223
- } else {
2224
- priorState = fs7.readFileSync(fullPath, "utf-8");
2225
- }
2226
- break;
2227
- }
2228
- }
2229
- if (!priorState) {
2230
- stateWarning = "No prior phase data found. Earlier phases have not been completed. Proceed with caution.";
2231
- }
2329
+ const phaseResult = resolvePhaseState(metadata, projectPath, opts.phase);
2330
+ if (!phaseResult) {
2331
+ process.exit(ExitCode.ERROR);
2332
+ return;
2232
2333
  }
2334
+ priorState = phaseResult.priorState;
2335
+ stateWarning = phaseResult.stateWarning;
2233
2336
  }
2234
2337
  const preamble = buildPreamble({
2235
2338
  ...complexity !== void 0 && { complexity },
@@ -2246,21 +2349,12 @@ function createRunCommand2() {
2246
2349
  process.exit(ExitCode.ERROR);
2247
2350
  return;
2248
2351
  }
2249
- let content = fs7.readFileSync(skillMdPath, "utf-8");
2250
- if (metadata?.state.persistent && opts.path) {
2251
- const stateFile = path16.join(projectPath, ".harness", "state.json");
2252
- if (fs7.existsSync(stateFile)) {
2253
- const stateContent = fs7.readFileSync(stateFile, "utf-8");
2254
- content += `
2255
-
2256
- ---
2257
- ## Project State
2258
- \`\`\`json
2259
- ${stateContent}
2260
- \`\`\`
2261
- `;
2262
- }
2263
- }
2352
+ const content = appendProjectState(
2353
+ fs7.readFileSync(skillMdPath, "utf-8"),
2354
+ metadata,
2355
+ projectPath,
2356
+ !!opts.path
2357
+ );
2264
2358
  process.stdout.write(preamble + content);
2265
2359
  process.exit(ExitCode.SUCCESS);
2266
2360
  });
@@ -2278,6 +2372,48 @@ var REQUIRED_SECTIONS = [
2278
2372
  "## Success Criteria",
2279
2373
  "## Examples"
2280
2374
  ];
2375
+ function validateSkillMd(name, skillMdPath, skillType, errors) {
2376
+ if (!fs8.existsSync(skillMdPath)) {
2377
+ errors.push(`${name}: missing SKILL.md`);
2378
+ return;
2379
+ }
2380
+ const mdContent = fs8.readFileSync(skillMdPath, "utf-8");
2381
+ for (const section of REQUIRED_SECTIONS) {
2382
+ if (!mdContent.includes(section)) {
2383
+ errors.push(`${name}/SKILL.md: missing section "${section}"`);
2384
+ }
2385
+ }
2386
+ if (!mdContent.trim().startsWith("# ")) {
2387
+ errors.push(`${name}/SKILL.md: must start with an h1 heading`);
2388
+ }
2389
+ if (skillType === "rigid") {
2390
+ if (!mdContent.includes("## Gates"))
2391
+ errors.push(`${name}/SKILL.md: rigid skill missing "## Gates" section`);
2392
+ if (!mdContent.includes("## Escalation"))
2393
+ errors.push(`${name}/SKILL.md: rigid skill missing "## Escalation" section`);
2394
+ }
2395
+ }
2396
+ function validateSkillEntry(name, skillsDir, errors) {
2397
+ const skillDir = path17.join(skillsDir, name);
2398
+ const yamlPath = path17.join(skillDir, "skill.yaml");
2399
+ if (!fs8.existsSync(yamlPath)) {
2400
+ errors.push(`${name}: missing skill.yaml`);
2401
+ return false;
2402
+ }
2403
+ try {
2404
+ const raw = fs8.readFileSync(yamlPath, "utf-8");
2405
+ const result = SkillMetadataSchema.safeParse(parse3(raw));
2406
+ if (!result.success) {
2407
+ errors.push(`${name}/skill.yaml: ${result.error.message}`);
2408
+ return false;
2409
+ }
2410
+ validateSkillMd(name, path17.join(skillDir, "SKILL.md"), result.data.type, errors);
2411
+ return true;
2412
+ } catch (e) {
2413
+ errors.push(`${name}: parse error \u2014 ${e instanceof Error ? e.message : String(e)}`);
2414
+ return false;
2415
+ }
2416
+ }
2281
2417
  function createValidateCommand3() {
2282
2418
  return new Command23("validate").description("Validate all skill.yaml files and SKILL.md structure").action(async (_opts, cmd) => {
2283
2419
  const globalOpts = cmd.optsWithGlobals();
@@ -2291,46 +2427,7 @@ function createValidateCommand3() {
2291
2427
  const errors = [];
2292
2428
  let validated = 0;
2293
2429
  for (const name of entries) {
2294
- const skillDir = path17.join(skillsDir, name);
2295
- const yamlPath = path17.join(skillDir, "skill.yaml");
2296
- const skillMdPath = path17.join(skillDir, "SKILL.md");
2297
- if (!fs8.existsSync(yamlPath)) {
2298
- errors.push(`${name}: missing skill.yaml`);
2299
- continue;
2300
- }
2301
- try {
2302
- const raw = fs8.readFileSync(yamlPath, "utf-8");
2303
- const parsed = parse3(raw);
2304
- const result = SkillMetadataSchema.safeParse(parsed);
2305
- if (!result.success) {
2306
- errors.push(`${name}/skill.yaml: ${result.error.message}`);
2307
- continue;
2308
- }
2309
- if (fs8.existsSync(skillMdPath)) {
2310
- const mdContent = fs8.readFileSync(skillMdPath, "utf-8");
2311
- for (const section of REQUIRED_SECTIONS) {
2312
- if (!mdContent.includes(section)) {
2313
- errors.push(`${name}/SKILL.md: missing section "${section}"`);
2314
- }
2315
- }
2316
- if (!mdContent.trim().startsWith("# ")) {
2317
- errors.push(`${name}/SKILL.md: must start with an h1 heading`);
2318
- }
2319
- if (result.data.type === "rigid") {
2320
- if (!mdContent.includes("## Gates")) {
2321
- errors.push(`${name}/SKILL.md: rigid skill missing "## Gates" section`);
2322
- }
2323
- if (!mdContent.includes("## Escalation")) {
2324
- errors.push(`${name}/SKILL.md: rigid skill missing "## Escalation" section`);
2325
- }
2326
- }
2327
- } else {
2328
- errors.push(`${name}: missing SKILL.md`);
2329
- }
2330
- validated++;
2331
- } catch (e) {
2332
- errors.push(`${name}: parse error \u2014 ${e instanceof Error ? e.message : String(e)}`);
2333
- }
2430
+ if (validateSkillEntry(name, skillsDir, errors)) validated++;
2334
2431
  }
2335
2432
  if (globalOpts.json) {
2336
2433
  logger.raw({ validated, errors });
@@ -3028,8 +3125,8 @@ function createResetCommand() {
3028
3125
  }
3029
3126
  if (!opts.yes) {
3030
3127
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
3031
- const answer = await new Promise((resolve28) => {
3032
- rl.question("Reset project state? This cannot be undone. [y/N] ", resolve28);
3128
+ const answer = await new Promise((resolve29) => {
3129
+ rl.question("Reset project state? This cannot be undone. [y/N] ", resolve29);
3033
3130
  });
3034
3131
  rl.close();
3035
3132
  if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
@@ -3189,7 +3286,7 @@ function parseFailOn(failOn) {
3189
3286
  function createCheckCommand() {
3190
3287
  return new Command34("check").description("Run all harness checks for CI (validate, deps, docs, entropy, phase-gate, arch)").option("--skip <checks>", "Comma-separated checks to skip (e.g., entropy,docs)").option("--fail-on <severity>", "Fail on severity level: error (default) or warning", "error").action(async (opts, cmd) => {
3191
3288
  const globalOpts = cmd.optsWithGlobals();
3192
- const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
3289
+ const mode = resolveOutputMode(globalOpts);
3193
3290
  const skip = parseSkip(opts.skip);
3194
3291
  const failOn = parseFailOn(opts.failOn);
3195
3292
  const result = await runCICheck({
@@ -3436,13 +3533,28 @@ function prompt(question) {
3436
3533
  input: process.stdin,
3437
3534
  output: process.stdout
3438
3535
  });
3439
- return new Promise((resolve28) => {
3536
+ return new Promise((resolve29) => {
3440
3537
  rl.question(question, (answer) => {
3441
3538
  rl.close();
3442
- resolve28(answer.trim().toLowerCase());
3539
+ resolve29(answer.trim().toLowerCase());
3443
3540
  });
3444
3541
  });
3445
3542
  }
3543
+ async function offerRegeneration() {
3544
+ console.log("");
3545
+ const regenAnswer = await prompt("Regenerate slash commands and agent definitions? (Y/n) ");
3546
+ if (regenAnswer === "n" || regenAnswer === "no") return;
3547
+ const scopeAnswer = await prompt("Generate for (G)lobal or (l)ocal project? (G/l) ");
3548
+ const isGlobal = scopeAnswer !== "l" && scopeAnswer !== "local";
3549
+ try {
3550
+ execFileSync4("harness", ["generate", ...isGlobal ? ["--global"] : []], {
3551
+ stdio: "inherit"
3552
+ });
3553
+ } catch {
3554
+ logger.warn("Generation failed. Run manually:");
3555
+ console.log(` ${chalk3.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
3556
+ }
3557
+ }
3446
3558
  function createUpdateCommand() {
3447
3559
  return new Command37("update").description("Update all @harness-engineering packages to the latest version").option("--version <semver>", "Pin @harness-engineering/cli to a specific version").action(async (opts, cmd) => {
3448
3560
  const globalOpts = cmd.optsWithGlobals();
@@ -3496,20 +3608,7 @@ function createUpdateCommand() {
3496
3608
  console.log(` ${chalk3.cyan(installCmd)}`);
3497
3609
  process.exit(ExitCode.ERROR);
3498
3610
  }
3499
- console.log("");
3500
- const regenAnswer = await prompt("Regenerate slash commands and agent definitions? (Y/n) ");
3501
- if (regenAnswer !== "n" && regenAnswer !== "no") {
3502
- const scopeAnswer = await prompt("Generate for (G)lobal or (l)ocal project? (G/l) ");
3503
- const isGlobal = scopeAnswer !== "l" && scopeAnswer !== "local";
3504
- try {
3505
- execFileSync4("harness", ["generate", ...isGlobal ? ["--global"] : []], {
3506
- stdio: "inherit"
3507
- });
3508
- } catch {
3509
- logger.warn("Generation failed. Run manually:");
3510
- console.log(` ${chalk3.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
3511
- }
3512
- }
3611
+ await offerRegeneration();
3513
3612
  process.exit(ExitCode.SUCCESS);
3514
3613
  });
3515
3614
  }
@@ -3579,7 +3678,7 @@ function createGenerateCommand3() {
3579
3678
  import { Command as Command39 } from "commander";
3580
3679
  import * as path29 from "path";
3581
3680
  async function runScan(projectPath) {
3582
- const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-M6BQODWC.js");
3681
+ const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-B26DFXMP.js");
3583
3682
  const store = new GraphStore();
3584
3683
  const start = Date.now();
3585
3684
  await new CodeIngestor(store).ingest(projectPath);
@@ -3660,7 +3759,7 @@ async function runIngest(projectPath, source, opts) {
3660
3759
  SyncManager,
3661
3760
  JiraConnector,
3662
3761
  SlackConnector
3663
- } = await import("./dist-M6BQODWC.js");
3762
+ } = await import("./dist-B26DFXMP.js");
3664
3763
  const graphDir = path30.join(projectPath, ".harness", "graph");
3665
3764
  const store = new GraphStore();
3666
3765
  await store.load(graphDir);
@@ -3753,7 +3852,7 @@ function createIngestCommand() {
3753
3852
  import { Command as Command41 } from "commander";
3754
3853
  import * as path31 from "path";
3755
3854
  async function runQuery(projectPath, rootNodeId, opts) {
3756
- const { GraphStore, ContextQL } = await import("./dist-M6BQODWC.js");
3855
+ const { GraphStore, ContextQL } = await import("./dist-B26DFXMP.js");
3757
3856
  const store = new GraphStore();
3758
3857
  const graphDir = path31.join(projectPath, ".harness", "graph");
3759
3858
  const loaded = await store.load(graphDir);
@@ -3802,7 +3901,7 @@ import { Command as Command42 } from "commander";
3802
3901
  // src/commands/graph/status.ts
3803
3902
  import * as path32 from "path";
3804
3903
  async function runGraphStatus(projectPath) {
3805
- const { GraphStore } = await import("./dist-M6BQODWC.js");
3904
+ const { GraphStore } = await import("./dist-B26DFXMP.js");
3806
3905
  const graphDir = path32.join(projectPath, ".harness", "graph");
3807
3906
  const store = new GraphStore();
3808
3907
  const loaded = await store.load(graphDir);
@@ -3842,7 +3941,7 @@ async function runGraphStatus(projectPath) {
3842
3941
  // src/commands/graph/export.ts
3843
3942
  import * as path33 from "path";
3844
3943
  async function runGraphExport(projectPath, format) {
3845
- const { GraphStore } = await import("./dist-M6BQODWC.js");
3944
+ const { GraphStore } = await import("./dist-B26DFXMP.js");
3846
3945
  const graphDir = path33.join(projectPath, ".harness", "graph");
3847
3946
  const store = new GraphStore();
3848
3947
  const loaded = await store.load(graphDir);
@@ -3921,7 +4020,7 @@ function createGraphCommand() {
3921
4020
  import { Command as Command43 } from "commander";
3922
4021
  function createMcpCommand() {
3923
4022
  return new Command43("mcp").description("Start the MCP (Model Context Protocol) server on stdio").action(async () => {
3924
- const { startServer: startServer2 } = await import("./mcp-KQHEL5IF.js");
4023
+ const { startServer: startServer2 } = await import("./mcp-362EZHF4.js");
3925
4024
  await startServer2();
3926
4025
  });
3927
4026
  }
@@ -4138,7 +4237,7 @@ function createImpactPreviewCommand() {
4138
4237
  // src/commands/check-arch.ts
4139
4238
  import { Command as Command45 } from "commander";
4140
4239
  import { execSync as execSync4 } from "child_process";
4141
- function getCommitHash(cwd) {
4240
+ function getCommitHash2(cwd) {
4142
4241
  try {
4143
4242
  return execSync4("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).toString().trim();
4144
4243
  } catch {
@@ -4186,7 +4285,7 @@ async function runCheckArch(options) {
4186
4285
  }
4187
4286
  const manager = new ArchBaselineManager(cwd, archConfig.baselinePath);
4188
4287
  if (options.updateBaseline) {
4189
- const commitHash = getCommitHash(cwd);
4288
+ const commitHash = getCommitHash2(cwd);
4190
4289
  const baseline2 = manager.capture(results, commitHash);
4191
4290
  manager.save(baseline2);
4192
4291
  return Ok({