@harness-engineering/cli 1.13.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 (267) 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.yaml +1 -0
  15. package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
  16. package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
  17. package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
  18. package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
  19. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
  20. package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
  21. package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
  22. package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
  23. package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
  24. package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
  25. package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
  26. package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
  27. package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
  28. package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
  29. package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
  30. package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
  31. package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
  32. package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
  33. package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
  34. package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
  35. package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
  36. package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
  37. package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
  38. package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
  39. package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
  40. package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
  41. package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
  42. package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
  43. package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
  44. package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
  45. package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
  46. package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
  47. package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
  48. package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
  49. package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
  50. package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
  51. package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
  52. package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
  53. package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
  54. package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
  55. package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
  56. package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
  57. package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
  58. package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
  59. package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
  60. package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
  61. package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
  62. package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
  63. package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
  64. package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
  65. package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
  66. package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
  67. package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
  68. package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
  69. package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
  70. package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
  71. package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
  72. package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
  73. package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
  74. package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
  75. package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
  76. package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
  77. package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
  78. package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
  79. package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
  80. package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
  81. package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
  82. package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
  83. package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
  84. package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
  85. package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
  86. package/dist/agents/skills/claude-code/harness-resilience/SKILL.md +255 -0
  87. package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +76 -0
  88. package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
  89. package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
  90. package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
  91. package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
  92. package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
  93. package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
  94. package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
  95. package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
  96. package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
  97. package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
  98. package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
  99. package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
  100. package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
  101. package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
  102. package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
  103. package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
  104. package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
  105. package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
  106. package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
  107. package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
  108. package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
  109. package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
  110. package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
  111. package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
  112. package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
  113. package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
  114. package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
  115. package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
  116. package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
  117. package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +304 -0
  118. package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +74 -0
  119. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
  120. package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +279 -0
  121. package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +81 -0
  122. package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
  123. package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
  124. package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
  125. package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
  126. package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
  127. package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
  128. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
  129. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
  130. package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
  131. package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
  132. package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
  133. package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
  134. package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
  135. package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
  136. package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
  137. package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
  138. package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
  139. package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
  140. package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
  141. package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
  142. package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
  143. package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
  144. package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
  145. package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
  146. package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
  147. package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
  148. package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
  149. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
  150. package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
  151. package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
  152. package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
  153. package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
  154. package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
  155. package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
  156. package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
  157. package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
  158. package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
  159. package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
  160. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
  161. package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
  162. package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
  163. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
  164. package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
  165. package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
  166. package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
  167. package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
  168. package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
  169. package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
  170. package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
  171. package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
  172. package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
  173. package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
  174. package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
  175. package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
  176. package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
  177. package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
  178. package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
  179. package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
  180. package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
  181. package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
  182. package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
  183. package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
  184. package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
  185. package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
  186. package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
  187. package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
  188. package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
  189. package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
  190. package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
  191. package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
  192. package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
  193. package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
  194. package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
  195. package/dist/agents/skills/gemini-cli/harness-resilience/SKILL.md +255 -0
  196. package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +76 -0
  197. package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
  198. package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
  199. package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
  200. package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
  201. package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
  202. package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
  203. package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
  204. package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
  205. package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
  206. package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
  207. package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
  208. package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
  209. package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
  210. package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
  211. package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
  212. package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
  213. package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
  214. package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
  215. package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
  216. package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
  217. package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
  218. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
  219. package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
  220. package/dist/{agents-md-P2RHSUV7.js → agents-md-XU3BHE22.js} +1 -1
  221. package/dist/{architecture-ESOOE26S.js → architecture-2R5Z4ZAF.js} +2 -2
  222. package/dist/bin/harness-mcp.js +14 -13
  223. package/dist/bin/harness.js +22 -21
  224. package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-2OFZ7OWW.js} +3 -2
  225. package/dist/{chunk-LD3DKUK5.js → chunk-4ZMOCPYO.js} +1 -1
  226. package/dist/{chunk-5VY23YK3.js → chunk-65FRIL4D.js} +2 -2
  227. package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
  228. package/dist/{chunk-MACVXDZK.js → chunk-DZS7CJKL.js} +4 -4
  229. package/dist/{chunk-7PZWR4LI.js → chunk-IM32EEDM.js} +9 -9
  230. package/dist/{chunk-2YPZKGAG.js → chunk-IMFVFNJE.js} +1 -1
  231. package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
  232. package/dist/{chunk-MI5XJQDY.js → chunk-ND6PNADU.js} +23 -9
  233. package/dist/{chunk-7KQSUZVG.js → chunk-NERR4TAO.js} +729 -436
  234. package/dist/{chunk-PSNN4LWX.js → chunk-NOPU4RZ4.js} +2 -2
  235. package/dist/{chunk-KELT6K6M.js → chunk-PQ5YK4AY.js} +287 -258
  236. package/dist/{chunk-WPPDRIJL.js → chunk-QY4T6YAZ.js} +3 -3
  237. package/dist/{chunk-RZSUJBZZ.js → chunk-SSKDAOX5.js} +31 -28
  238. package/dist/{chunk-2VU4MFM3.js → chunk-TKJZKICB.js} +6 -6
  239. package/dist/{chunk-GNGELAXY.js → chunk-TS3XWPW5.js} +1 -1
  240. package/dist/chunk-UAX4I5ZE.js +217 -0
  241. package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
  242. package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
  243. package/dist/{chunk-3KOLLWWE.js → chunk-Z77YQRQT.js} +11 -207
  244. package/dist/{ci-workflow-4NYBUG6R.js → ci-workflow-EHV65NQB.js} +1 -1
  245. package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
  246. package/dist/{dist-WF4C7A4A.js → dist-2B363XUH.js} +1 -1
  247. package/dist/{dist-M6BQODWC.js → dist-HXHWB7SV.js} +2 -2
  248. package/dist/{docs-BPYCN2DR.js → docs-FZOPM4GK.js} +4 -2
  249. package/dist/{engine-LXLIWQQ3.js → engine-OL4T6NZS.js} +1 -1
  250. package/dist/{entropy-4VDVV5CR.js → entropy-LVHJMFGH.js} +2 -2
  251. package/dist/{feedback-63QB5RCA.js → feedback-IHLVLMRD.js} +1 -1
  252. package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-64S3CLEZ.js} +3 -3
  253. package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
  254. package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-GJZ4FN4Y.js} +1 -1
  255. package/dist/index.d.ts +35 -8
  256. package/dist/index.js +23 -21
  257. package/dist/{loader-Z2IT7QX3.js → loader-DPYFB6R6.js} +1 -1
  258. package/dist/{mcp-KQHEL5IF.js → mcp-JQUI7BVZ.js} +14 -13
  259. package/dist/{performance-26BH47O4.js → performance-ZTVSUANN.js} +2 -2
  260. package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-76JHKGSV.js} +1 -1
  261. package/dist/{runtime-PDWD7UIK.js → runtime-X7U6SC7K.js} +1 -1
  262. package/dist/{security-UQFUZXEN.js → security-FWQZF2IZ.js} +1 -1
  263. package/dist/skill-executor-XZLYZYAK.js +8 -0
  264. package/dist/{validate-N7QJOKFZ.js → validate-GCHZJIL7.js} +2 -2
  265. package/dist/{validate-cross-check-EDQ5QGTM.js → validate-cross-check-STFHYMAZ.js} +1 -1
  266. package/package.json +3 -3
  267. package/dist/skill-executor-RG45LUO5.js +0 -8
@@ -3,27 +3,23 @@ import {
3
3
  Ok
4
4
  } from "./chunk-MHBMTPW7.js";
5
5
 
6
- // ../core/dist/chunk-ZHGBWFYD.mjs
6
+ // ../core/dist/chunk-D6VFA6AS.mjs
7
7
  import { z } from "zod";
8
- import { relative as relative2 } from "path";
9
8
  import { createHash } from "crypto";
10
9
  import { minimatch } from "minimatch";
11
10
  import { access, constants, readFile } from "fs";
12
11
  import { promisify } from "util";
12
+ import { relative } from "path";
13
13
  import { glob } from "glob";
14
- import { dirname, resolve, relative } from "path";
15
- import { relative as relative3 } from "path";
14
+ import { dirname, resolve } from "path";
16
15
  import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from "fs";
17
16
  import { randomBytes } from "crypto";
18
17
  import { join, dirname as dirname2 } from "path";
19
- import { relative as relative4 } from "path";
20
18
  import { readFile as readFile2 } from "fs/promises";
21
- import { relative as relative5 } from "path";
22
- import { relative as relative6 } from "path";
23
19
  import { readFile as readFile3, readdir } from "fs/promises";
24
- import { join as join2, relative as relative7 } from "path";
20
+ import { join as join2 } from "path";
25
21
  import { readFile as readFile4, readdir as readdir2 } from "fs/promises";
26
- import { join as join3, relative as relative8, dirname as dirname3, resolve as resolve2 } from "path";
22
+ import { join as join3, dirname as dirname3, resolve as resolve2 } from "path";
27
23
  var ArchMetricCategorySchema = z.enum([
28
24
  "circular-deps",
29
25
  "layer-violations",
@@ -106,8 +102,7 @@ var ConstraintRuleSchema = z.object({
106
102
  // forward-compat for governs edges
107
103
  });
108
104
  function violationId(relativePath, category, normalizedDetail) {
109
- const path20 = relativePath.replace(/\\/g, "/");
110
- const input = `${path20}:${category}:${normalizedDetail}`;
105
+ const input = `${relativePath}:${category}:${normalizedDetail}`;
111
106
  return createHash("sha256").update(input).digest("hex");
112
107
  }
113
108
  function constraintRuleId(category, scope, description) {
@@ -158,6 +153,9 @@ async function readFileContent(path20) {
158
153
  async function findFiles(pattern, cwd = process.cwd()) {
159
154
  return glob(pattern, { cwd, absolute: true });
160
155
  }
156
+ function relativePosix(from, to) {
157
+ return relative(from, to).replaceAll("\\", "/");
158
+ }
161
159
  function resolveImportPath(importSource, fromFile, _rootDir) {
162
160
  if (!importSource.startsWith(".") && !importSource.startsWith("/")) {
163
161
  return null;
@@ -209,8 +207,8 @@ async function buildDependencyGraph(files, parser, graphDependencyData) {
209
207
  function checkLayerViolations(graph, layers, rootDir) {
210
208
  const violations = [];
211
209
  for (const edge of graph.edges) {
212
- const fromRelative = relative(rootDir, edge.from);
213
- const toRelative = relative(rootDir, edge.to);
210
+ const fromRelative = relativePosix(rootDir, edge.from);
211
+ const toRelative = relativePosix(rootDir, edge.to);
214
212
  const fromLayer = resolveFileToLayer(fromRelative, layers);
215
213
  const toLayer = resolveFileToLayer(toRelative, layers);
216
214
  if (!fromLayer || !toLayer) continue;
@@ -436,8 +434,8 @@ var CircularDepsCollector = class {
436
434
  }
437
435
  const { cycles, largestCycle } = result.value;
438
436
  const violations = cycles.map((cycle) => {
439
- const cyclePath = cycle.cycle.map((f) => relative2(rootDir, f)).join(" -> ");
440
- const firstFile = relative2(rootDir, cycle.cycle[0]);
437
+ const cyclePath = cycle.cycle.map((f) => relativePosix(rootDir, f)).join(" -> ");
438
+ const firstFile = relativePosix(rootDir, cycle.cycle[0]);
441
439
  return {
442
440
  id: violationId(firstFile, this.category, cyclePath),
443
441
  file: firstFile,
@@ -499,8 +497,8 @@ var LayerViolationCollector = class {
499
497
  (v) => v.reason === "WRONG_LAYER"
500
498
  );
501
499
  const violations = layerViolations.map((v) => {
502
- const relFile = relative3(rootDir, v.file);
503
- const relImport = relative3(rootDir, v.imports);
500
+ const relFile = relativePosix(rootDir, v.file);
501
+ const relImport = relativePosix(rootDir, v.imports);
504
502
  const detail = `${v.fromLayer} -> ${v.toLayer}: ${relFile} imports ${relImport}`;
505
503
  return {
506
504
  id: violationId(relFile, this.category, detail),
@@ -980,7 +978,7 @@ var ComplexityCollector = class {
980
978
  (v) => v.severity === "error" || v.severity === "warning"
981
979
  );
982
980
  const violations = filtered.map((v) => {
983
- const relFile = relative4(rootDir, v.file);
981
+ const relFile = relativePosix(rootDir, v.file);
984
982
  const idDetail = `${v.metric}:${v.function}`;
985
983
  return {
986
984
  id: violationId(relFile, this.category, idDetail),
@@ -1202,7 +1200,7 @@ var CouplingCollector = class {
1202
1200
  (v) => v.severity === "error" || v.severity === "warning"
1203
1201
  );
1204
1202
  const violations = filtered.map((v) => {
1205
- const relFile = relative5(rootDir, v.file);
1203
+ const relFile = relativePosix(rootDir, v.file);
1206
1204
  const idDetail = `${v.metric}`;
1207
1205
  return {
1208
1206
  id: violationId(relFile, this.category, idDetail),
@@ -1266,8 +1264,8 @@ var ForbiddenImportCollector = class {
1266
1264
  (v) => v.reason === "FORBIDDEN_IMPORT"
1267
1265
  );
1268
1266
  const violations = forbidden.map((v) => {
1269
- const relFile = relative6(rootDir, v.file);
1270
- const relImport = relative6(rootDir, v.imports);
1267
+ const relFile = relativePosix(rootDir, v.file);
1268
+ const relImport = relativePosix(rootDir, v.imports);
1271
1269
  const detail = `forbidden import: ${relFile} -> ${relImport}`;
1272
1270
  return {
1273
1271
  id: violationId(relFile, this.category, detail),
@@ -1319,10 +1317,10 @@ async function discoverModules(rootDir) {
1319
1317
  }
1320
1318
  }
1321
1319
  modules.push({
1322
- modulePath: relative7(rootDir, dir),
1320
+ modulePath: relativePosix(rootDir, dir),
1323
1321
  fileCount: tsFiles.length,
1324
1322
  totalLoc,
1325
- files: tsFiles.map((f) => relative7(rootDir, f))
1323
+ files: tsFiles.map((f) => relativePosix(rootDir, f))
1326
1324
  });
1327
1325
  }
1328
1326
  for (const sub of subdirs) {
@@ -1494,7 +1492,7 @@ var DepDepthCollector = class {
1494
1492
  }
1495
1493
  const moduleMap = /* @__PURE__ */ new Map();
1496
1494
  for (const file of allFiles) {
1497
- const relDir = relative8(rootDir, dirname3(file));
1495
+ const relDir = relativePosix(rootDir, dirname3(file));
1498
1496
  if (!moduleMap.has(relDir)) moduleMap.set(relDir, []);
1499
1497
  moduleMap.get(relDir).push(file);
1500
1498
  }
@@ -1743,19 +1741,18 @@ var archMatchers = {
1743
1741
  // ../core/dist/index.mjs
1744
1742
  import { join as join4, dirname as dirname4 } from "path";
1745
1743
  import { minimatch as minimatch2 } from "minimatch";
1746
- import { basename, relative as relative9 } from "path";
1747
- import { join as join22, basename as basename2, relative as relative22 } from "path";
1748
- import { relative as relative32, basename as basename3, dirname as dirname22 } from "path";
1744
+ import { basename } from "path";
1745
+ import { join as join22, basename as basename2 } from "path";
1746
+ import { basename as basename3, dirname as dirname22 } from "path";
1749
1747
  import { z as z2 } from "zod";
1750
1748
  import * as fs from "fs/promises";
1751
1749
  import * as fs2 from "fs/promises";
1752
1750
  import { parse } from "@typescript-eslint/typescript-estree";
1753
- import { join as join32, resolve as resolve3, relative as relative42 } from "path";
1751
+ import { join as join32, resolve as resolve3 } from "path";
1754
1752
  import { minimatch as minimatch22 } from "minimatch";
1755
1753
  import { dirname as dirname32, resolve as resolve22 } from "path";
1756
1754
  import { dirname as dirname42, resolve as resolve32 } from "path";
1757
1755
  import { minimatch as minimatch3 } from "minimatch";
1758
- import { relative as relative52 } from "path";
1759
1756
  import { readdirSync, statSync } from "fs";
1760
1757
  import { join as join42 } from "path";
1761
1758
  import * as fs3 from "fs";
@@ -2157,7 +2154,7 @@ async function checkDocCoverage(domain, options = {}) {
2157
2154
  try {
2158
2155
  const sourceFiles = await findFiles("**/*.{ts,js,tsx,jsx}", sourceDir);
2159
2156
  const filteredSourceFiles = sourceFiles.filter((file) => {
2160
- const relativePath = relative9(sourceDir, file);
2157
+ const relativePath = relativePosix(sourceDir, file);
2161
2158
  return !excludePatterns.some((pattern) => {
2162
2159
  return minimatch2(relativePath, pattern, { dot: true }) || minimatch2(file, pattern, { dot: true });
2163
2160
  });
@@ -2180,7 +2177,7 @@ async function checkDocCoverage(domain, options = {}) {
2180
2177
  const undocumented = [];
2181
2178
  const gaps = [];
2182
2179
  for (const sourceFile of filteredSourceFiles) {
2183
- const relativePath = relative9(sourceDir, sourceFile);
2180
+ const relativePath = relativePosix(sourceDir, sourceFile);
2184
2181
  const fileName = basename(sourceFile);
2185
2182
  const isDocumented = documentedPaths.has(relativePath) || documentedPaths.has(fileName) || documentedPaths.has(`src/${relativePath}`);
2186
2183
  if (isDocumented) {
@@ -2237,7 +2234,7 @@ async function validateKnowledgeMap(rootDir = process.cwd()) {
2237
2234
  totalLinks: agentsTotalLinks
2238
2235
  } = agentsResult.value;
2239
2236
  const existingFiles = await findFiles("**/*", rootDir);
2240
- const relativeExistingFiles = existingFiles.map((f) => relative22(rootDir, f));
2237
+ const relativeExistingFiles = existingFiles.map((f) => relativePosix(rootDir, f));
2241
2238
  const brokenLinks = agentsBrokenLinks.map((link) => {
2242
2239
  const section = sections.find(
2243
2240
  (s) => s.links.some((l) => l.path === link.path && l.line === link.line)
@@ -2275,7 +2272,7 @@ var DEFAULT_SECTIONS = [
2275
2272
  function groupByDirectory(files, rootDir) {
2276
2273
  const groups = /* @__PURE__ */ new Map();
2277
2274
  for (const file of files) {
2278
- const relativePath = relative32(rootDir, file);
2275
+ const relativePath = relativePosix(rootDir, file);
2279
2276
  const dir = dirname22(relativePath);
2280
2277
  if (!groups.has(dir)) {
2281
2278
  groups.set(dir, []);
@@ -2331,7 +2328,7 @@ async function generateAgentsMap(config, graphSections) {
2331
2328
  allFiles.push(...files);
2332
2329
  }
2333
2330
  const filteredFiles = allFiles.filter((file) => {
2334
- const relativePath = relative32(rootDir, file);
2331
+ const relativePath = relativePosix(rootDir, file);
2335
2332
  return !matchesExcludePattern(relativePath, excludePaths);
2336
2333
  });
2337
2334
  lines.push("## Repository Structure");
@@ -2359,11 +2356,11 @@ async function generateAgentsMap(config, graphSections) {
2359
2356
  }
2360
2357
  const sectionFiles = await findFiles(section.pattern, rootDir);
2361
2358
  const filteredSectionFiles = sectionFiles.filter((file) => {
2362
- const relativePath = relative32(rootDir, file);
2359
+ const relativePath = relativePosix(rootDir, file);
2363
2360
  return !matchesExcludePattern(relativePath, excludePaths);
2364
2361
  });
2365
2362
  for (const file of filteredSectionFiles.slice(0, 20)) {
2366
- lines.push(formatFileLink(relative32(rootDir, file)));
2363
+ lines.push(formatFileLink(relativePosix(rootDir, file)));
2367
2364
  }
2368
2365
  if (filteredSectionFiles.length > 20) {
2369
2366
  lines.push(`- _... and ${filteredSectionFiles.length - 20} more files_`);
@@ -3548,7 +3545,7 @@ async function buildSnapshot(config) {
3548
3545
  sourceFilePaths.push(...files2);
3549
3546
  }
3550
3547
  sourceFilePaths = sourceFilePaths.filter((f) => {
3551
- const rel = relative42(rootDir, f);
3548
+ const rel = relativePosix(rootDir, f);
3552
3549
  return !excludePatterns.some((p) => minimatch22(rel, p));
3553
3550
  });
3554
3551
  const files = [];
@@ -4072,7 +4069,7 @@ async function detectDeadCode(snapshot, graphDeadCodeData) {
4072
4069
  return Ok(report);
4073
4070
  }
4074
4071
  function fileMatchesPattern(filePath, pattern, rootDir) {
4075
- const relativePath = relative52(rootDir, filePath);
4072
+ const relativePath = relativePosix(rootDir, filePath);
4076
4073
  return minimatch3(relativePath, pattern);
4077
4074
  }
4078
4075
  function checkConfigPattern(pattern, file, rootDir) {
@@ -7943,238 +7940,270 @@ var ALL_CHECKS = [
7943
7940
  "phase-gate",
7944
7941
  "arch"
7945
7942
  ];
7946
- async function runSingleCheck(name, projectRoot, config) {
7947
- const start = Date.now();
7943
+ async function runValidateCheck(projectRoot, config) {
7948
7944
  const issues = [];
7949
- try {
7950
- switch (name) {
7951
- case "validate": {
7952
- const agentsPath = path12.join(projectRoot, config.agentsMapPath ?? "AGENTS.md");
7953
- const result = await validateAgentsMap(agentsPath);
7954
- if (!result.ok) {
7955
- issues.push({ severity: "error", message: result.error.message });
7956
- } else if (!result.value.valid) {
7957
- if (result.value.errors) {
7958
- for (const err of result.value.errors) {
7959
- issues.push({ severity: "error", message: err.message });
7960
- }
7961
- }
7962
- for (const section of result.value.missingSections) {
7963
- issues.push({ severity: "warning", message: `Missing section: ${section}` });
7964
- }
7965
- for (const link of result.value.brokenLinks) {
7966
- issues.push({
7967
- severity: "warning",
7968
- message: `Broken link: ${link.text} \u2192 ${link.path}`,
7969
- file: link.path
7970
- });
7971
- }
7972
- }
7973
- break;
7945
+ const agentsPath = path12.join(projectRoot, config.agentsMapPath ?? "AGENTS.md");
7946
+ const result = await validateAgentsMap(agentsPath);
7947
+ if (!result.ok) {
7948
+ issues.push({ severity: "error", message: result.error.message });
7949
+ } else if (!result.value.valid) {
7950
+ if (result.value.errors) {
7951
+ for (const err of result.value.errors) {
7952
+ issues.push({ severity: "error", message: err.message });
7974
7953
  }
7975
- case "deps": {
7976
- const rawLayers = config.layers;
7977
- if (rawLayers && rawLayers.length > 0) {
7978
- const parser = new TypeScriptParser();
7979
- const layers = rawLayers.map(
7980
- (l) => defineLayer(
7981
- l.name,
7982
- Array.isArray(l.patterns) ? l.patterns : [l.pattern],
7983
- l.allowedDependencies
7984
- )
7985
- );
7986
- const result = await validateDependencies({
7987
- layers,
7988
- rootDir: projectRoot,
7989
- parser
7990
- });
7991
- if (!result.ok) {
7992
- issues.push({ severity: "error", message: result.error.message });
7993
- } else if (result.value.violations.length > 0) {
7994
- for (const v of result.value.violations) {
7995
- issues.push({
7996
- severity: "error",
7997
- message: `${v.reason}: ${v.file} imports ${v.imports} (${v.fromLayer} \u2192 ${v.toLayer})`,
7998
- file: v.file,
7999
- line: v.line
8000
- });
8001
- }
8002
- }
8003
- }
8004
- break;
7954
+ }
7955
+ for (const section of result.value.missingSections) {
7956
+ issues.push({ severity: "warning", message: `Missing section: ${section}` });
7957
+ }
7958
+ for (const link of result.value.brokenLinks) {
7959
+ issues.push({
7960
+ severity: "warning",
7961
+ message: `Broken link: ${link.text} \u2192 ${link.path}`,
7962
+ file: link.path
7963
+ });
7964
+ }
7965
+ }
7966
+ return issues;
7967
+ }
7968
+ async function runDepsCheck(projectRoot, config) {
7969
+ const issues = [];
7970
+ const rawLayers = config.layers;
7971
+ if (rawLayers && rawLayers.length > 0) {
7972
+ const parser = new TypeScriptParser();
7973
+ const layers = rawLayers.map(
7974
+ (l) => defineLayer(
7975
+ l.name,
7976
+ Array.isArray(l.patterns) ? l.patterns : [l.pattern],
7977
+ l.allowedDependencies
7978
+ )
7979
+ );
7980
+ const result = await validateDependencies({
7981
+ layers,
7982
+ rootDir: projectRoot,
7983
+ parser
7984
+ });
7985
+ if (!result.ok) {
7986
+ issues.push({ severity: "error", message: result.error.message });
7987
+ } else if (result.value.violations.length > 0) {
7988
+ for (const v of result.value.violations) {
7989
+ issues.push({
7990
+ severity: "error",
7991
+ message: `${v.reason}: ${v.file} imports ${v.imports} (${v.fromLayer} \u2192 ${v.toLayer})`,
7992
+ file: v.file,
7993
+ line: v.line
7994
+ });
8005
7995
  }
8006
- case "docs": {
8007
- const docsDir = path12.join(projectRoot, config.docsDir ?? "docs");
8008
- const entropyConfig = config.entropy || {};
8009
- const result = await checkDocCoverage("project", {
8010
- docsDir,
8011
- sourceDir: projectRoot,
8012
- excludePatterns: entropyConfig.excludePatterns || [
8013
- "**/node_modules/**",
8014
- "**/dist/**",
8015
- "**/*.test.ts",
8016
- "**/fixtures/**"
8017
- ]
7996
+ }
7997
+ }
7998
+ return issues;
7999
+ }
8000
+ async function runDocsCheck(projectRoot, config) {
8001
+ const issues = [];
8002
+ const docsDir = path12.join(projectRoot, config.docsDir ?? "docs");
8003
+ const entropyConfig = config.entropy || {};
8004
+ const result = await checkDocCoverage("project", {
8005
+ docsDir,
8006
+ sourceDir: projectRoot,
8007
+ excludePatterns: entropyConfig.excludePatterns || [
8008
+ "**/node_modules/**",
8009
+ "**/dist/**",
8010
+ "**/*.test.ts",
8011
+ "**/fixtures/**"
8012
+ ]
8013
+ });
8014
+ if (!result.ok) {
8015
+ issues.push({ severity: "warning", message: result.error.message });
8016
+ } else if (result.value.gaps.length > 0) {
8017
+ for (const gap of result.value.gaps) {
8018
+ issues.push({
8019
+ severity: "warning",
8020
+ message: `Undocumented: ${gap.file} (suggested: ${gap.suggestedSection})`,
8021
+ file: gap.file
8022
+ });
8023
+ }
8024
+ }
8025
+ return issues;
8026
+ }
8027
+ async function runEntropyCheck(projectRoot, _config) {
8028
+ const issues = [];
8029
+ const analyzer = new EntropyAnalyzer({
8030
+ rootDir: projectRoot,
8031
+ analyze: { drift: true, deadCode: true, patterns: false }
8032
+ });
8033
+ const result = await analyzer.analyze();
8034
+ if (!result.ok) {
8035
+ issues.push({ severity: "warning", message: result.error.message });
8036
+ } else {
8037
+ const report = result.value;
8038
+ if (report.drift) {
8039
+ for (const drift of report.drift.drifts) {
8040
+ issues.push({
8041
+ severity: "warning",
8042
+ message: `Doc drift (${drift.type}): ${drift.details}`,
8043
+ file: drift.docFile,
8044
+ line: drift.line
8018
8045
  });
8019
- if (!result.ok) {
8020
- issues.push({ severity: "warning", message: result.error.message });
8021
- } else if (result.value.gaps.length > 0) {
8022
- for (const gap of result.value.gaps) {
8023
- issues.push({
8024
- severity: "warning",
8025
- message: `Undocumented: ${gap.file} (suggested: ${gap.suggestedSection})`,
8026
- file: gap.file
8027
- });
8028
- }
8029
- }
8030
- break;
8031
8046
  }
8032
- case "entropy": {
8033
- const analyzer = new EntropyAnalyzer({
8034
- rootDir: projectRoot,
8035
- analyze: { drift: true, deadCode: true, patterns: false }
8047
+ }
8048
+ if (report.deadCode) {
8049
+ for (const dead of report.deadCode.deadExports) {
8050
+ issues.push({
8051
+ severity: "warning",
8052
+ message: `Dead export: ${dead.name}`,
8053
+ file: dead.file,
8054
+ line: dead.line
8036
8055
  });
8037
- const result = await analyzer.analyze();
8038
- if (!result.ok) {
8039
- issues.push({ severity: "warning", message: result.error.message });
8040
- } else {
8041
- const report = result.value;
8042
- if (report.drift) {
8043
- for (const drift of report.drift.drifts) {
8044
- issues.push({
8045
- severity: "warning",
8046
- message: `Doc drift (${drift.type}): ${drift.details}`,
8047
- file: drift.docFile,
8048
- line: drift.line
8049
- });
8050
- }
8051
- }
8052
- if (report.deadCode) {
8053
- for (const dead of report.deadCode.deadExports) {
8054
- issues.push({
8055
- severity: "warning",
8056
- message: `Dead export: ${dead.name}`,
8057
- file: dead.file,
8058
- line: dead.line
8059
- });
8060
- }
8061
- }
8062
- }
8063
- break;
8064
8056
  }
8065
- case "security": {
8066
- const securityConfig = parseSecurityConfig(config.security);
8067
- if (!securityConfig.enabled) break;
8068
- const scanner = new SecurityScanner(securityConfig);
8069
- scanner.configureForProject(projectRoot);
8070
- const { glob: globFn } = await import("glob");
8071
- const sourceFiles = await globFn("**/*.{ts,tsx,js,jsx,go,py}", {
8072
- cwd: projectRoot,
8073
- ignore: securityConfig.exclude ?? [
8074
- "**/node_modules/**",
8075
- "**/dist/**",
8076
- "**/*.test.ts",
8077
- "**/fixtures/**"
8078
- ],
8079
- absolute: true
8057
+ }
8058
+ }
8059
+ return issues;
8060
+ }
8061
+ async function runSecurityCheck(projectRoot, config) {
8062
+ const issues = [];
8063
+ const securityConfig = parseSecurityConfig(config.security);
8064
+ if (!securityConfig.enabled) return issues;
8065
+ const scanner = new SecurityScanner(securityConfig);
8066
+ scanner.configureForProject(projectRoot);
8067
+ const { glob: globFn } = await import("glob");
8068
+ const sourceFiles = await globFn("**/*.{ts,tsx,js,jsx,go,py}", {
8069
+ cwd: projectRoot,
8070
+ ignore: securityConfig.exclude ?? [
8071
+ "**/node_modules/**",
8072
+ "**/dist/**",
8073
+ "**/*.test.ts",
8074
+ "**/fixtures/**"
8075
+ ],
8076
+ absolute: true
8077
+ });
8078
+ const scanResult = await scanner.scanFiles(sourceFiles);
8079
+ for (const finding of scanResult.findings) {
8080
+ issues.push({
8081
+ severity: finding.severity === "info" ? "warning" : finding.severity,
8082
+ message: `[${finding.ruleId}] ${finding.message}: ${finding.match}`,
8083
+ file: finding.file,
8084
+ line: finding.line
8085
+ });
8086
+ }
8087
+ return issues;
8088
+ }
8089
+ async function runPerfCheck(projectRoot, config) {
8090
+ const issues = [];
8091
+ const perfConfig = config.performance || {};
8092
+ const perfAnalyzer = new EntropyAnalyzer({
8093
+ rootDir: projectRoot,
8094
+ analyze: {
8095
+ complexity: perfConfig.complexity || true,
8096
+ coupling: perfConfig.coupling || true,
8097
+ sizeBudget: perfConfig.sizeBudget || false
8098
+ }
8099
+ });
8100
+ const perfResult = await perfAnalyzer.analyze();
8101
+ if (!perfResult.ok) {
8102
+ issues.push({ severity: "warning", message: perfResult.error.message });
8103
+ } else {
8104
+ const perfReport = perfResult.value;
8105
+ if (perfReport.complexity) {
8106
+ for (const v of perfReport.complexity.violations) {
8107
+ issues.push({
8108
+ severity: v.severity === "info" ? "warning" : v.severity,
8109
+ message: `[Tier ${v.tier}] ${v.metric}: ${v.function} in ${v.file} (${v.value} > ${v.threshold})`,
8110
+ file: v.file,
8111
+ line: v.line
8080
8112
  });
8081
- const scanResult = await scanner.scanFiles(sourceFiles);
8082
- for (const finding of scanResult.findings) {
8083
- issues.push({
8084
- severity: finding.severity === "info" ? "warning" : finding.severity,
8085
- message: `[${finding.ruleId}] ${finding.message}: ${finding.match}`,
8086
- file: finding.file,
8087
- line: finding.line
8088
- });
8089
- }
8090
- break;
8091
8113
  }
8092
- case "perf": {
8093
- const perfConfig = config.performance || {};
8094
- const perfAnalyzer = new EntropyAnalyzer({
8095
- rootDir: projectRoot,
8096
- analyze: {
8097
- complexity: perfConfig.complexity || true,
8098
- coupling: perfConfig.coupling || true,
8099
- sizeBudget: perfConfig.sizeBudget || false
8100
- }
8114
+ }
8115
+ if (perfReport.coupling) {
8116
+ for (const v of perfReport.coupling.violations) {
8117
+ issues.push({
8118
+ severity: v.severity === "info" ? "warning" : v.severity,
8119
+ message: `[Tier ${v.tier}] ${v.metric}: ${v.file} (${v.value} > ${v.threshold})`,
8120
+ file: v.file
8101
8121
  });
8102
- const perfResult = await perfAnalyzer.analyze();
8103
- if (!perfResult.ok) {
8104
- issues.push({ severity: "warning", message: perfResult.error.message });
8105
- } else {
8106
- const perfReport = perfResult.value;
8107
- if (perfReport.complexity) {
8108
- for (const v of perfReport.complexity.violations) {
8109
- issues.push({
8110
- severity: v.severity === "info" ? "warning" : v.severity,
8111
- message: `[Tier ${v.tier}] ${v.metric}: ${v.function} in ${v.file} (${v.value} > ${v.threshold})`,
8112
- file: v.file,
8113
- line: v.line
8114
- });
8115
- }
8116
- }
8117
- if (perfReport.coupling) {
8118
- for (const v of perfReport.coupling.violations) {
8119
- issues.push({
8120
- severity: v.severity === "info" ? "warning" : v.severity,
8121
- message: `[Tier ${v.tier}] ${v.metric}: ${v.file} (${v.value} > ${v.threshold})`,
8122
- file: v.file
8123
- });
8124
- }
8125
- }
8126
- }
8127
- break;
8128
8122
  }
8129
- case "phase-gate": {
8130
- const phaseGates = config.phaseGates;
8131
- if (!phaseGates?.enabled) {
8132
- break;
8133
- }
8123
+ }
8124
+ }
8125
+ return issues;
8126
+ }
8127
+ async function runPhaseGateCheck(_projectRoot, config) {
8128
+ const issues = [];
8129
+ const phaseGates = config.phaseGates;
8130
+ if (!phaseGates?.enabled) {
8131
+ return issues;
8132
+ }
8133
+ issues.push({
8134
+ severity: "warning",
8135
+ message: "Phase gate is enabled but requires CLI context. Run `harness check-phase-gate` separately for full validation."
8136
+ });
8137
+ return issues;
8138
+ }
8139
+ async function runArchCheck(projectRoot, config) {
8140
+ const issues = [];
8141
+ const rawArchConfig = config.architecture;
8142
+ const archConfig = ArchConfigSchema.parse(rawArchConfig ?? {});
8143
+ if (!archConfig.enabled) return issues;
8144
+ const results = await runAll(archConfig, projectRoot);
8145
+ const baselineManager = new ArchBaselineManager(projectRoot, archConfig.baselinePath);
8146
+ const baseline = baselineManager.load();
8147
+ if (baseline) {
8148
+ const diffResult = diff(results, baseline);
8149
+ if (!diffResult.passed) {
8150
+ for (const v of diffResult.newViolations) {
8134
8151
  issues.push({
8135
- severity: "warning",
8136
- message: "Phase gate is enabled but requires CLI context. Run `harness check-phase-gate` separately for full validation."
8152
+ severity: v.severity,
8153
+ message: `[${v.category || "arch"}] NEW: ${v.detail}`,
8154
+ file: v.file
8137
8155
  });
8138
- break;
8139
8156
  }
8140
- case "arch": {
8141
- const rawArchConfig = config.architecture;
8142
- const archConfig = ArchConfigSchema.parse(rawArchConfig ?? {});
8143
- if (!archConfig.enabled) break;
8144
- const results = await runAll(archConfig, projectRoot);
8145
- const baselineManager = new ArchBaselineManager(projectRoot, archConfig.baselinePath);
8146
- const baseline = baselineManager.load();
8147
- if (baseline) {
8148
- const diffResult = diff(results, baseline);
8149
- if (!diffResult.passed) {
8150
- for (const v of diffResult.newViolations) {
8151
- issues.push({
8152
- severity: v.severity,
8153
- message: `[${v.category || "arch"}] NEW: ${v.detail}`,
8154
- file: v.file
8155
- });
8156
- }
8157
- for (const r of diffResult.regressions) {
8158
- issues.push({
8159
- severity: "error",
8160
- message: `[${r.category}] REGRESSION: ${r.currentValue} > ${r.baselineValue} (delta: ${r.delta})`
8161
- });
8162
- }
8163
- }
8164
- } else {
8165
- for (const result of results) {
8166
- for (const v of result.violations) {
8167
- issues.push({
8168
- severity: v.severity,
8169
- message: `[${result.category}] ${v.detail}`,
8170
- file: v.file
8171
- });
8172
- }
8173
- }
8174
- }
8175
- break;
8157
+ for (const r of diffResult.regressions) {
8158
+ issues.push({
8159
+ severity: "error",
8160
+ message: `[${r.category}] REGRESSION: ${r.currentValue} > ${r.baselineValue} (delta: ${r.delta})`
8161
+ });
8162
+ }
8163
+ }
8164
+ } else {
8165
+ for (const result of results) {
8166
+ for (const v of result.violations) {
8167
+ issues.push({
8168
+ severity: v.severity,
8169
+ message: `[${result.category}] ${v.detail}`,
8170
+ file: v.file
8171
+ });
8176
8172
  }
8177
8173
  }
8174
+ }
8175
+ return issues;
8176
+ }
8177
+ async function runSingleCheck(name, projectRoot, config) {
8178
+ const start = Date.now();
8179
+ const issues = [];
8180
+ try {
8181
+ switch (name) {
8182
+ case "validate":
8183
+ issues.push(...await runValidateCheck(projectRoot, config));
8184
+ break;
8185
+ case "deps":
8186
+ issues.push(...await runDepsCheck(projectRoot, config));
8187
+ break;
8188
+ case "docs":
8189
+ issues.push(...await runDocsCheck(projectRoot, config));
8190
+ break;
8191
+ case "entropy":
8192
+ issues.push(...await runEntropyCheck(projectRoot, config));
8193
+ break;
8194
+ case "security":
8195
+ issues.push(...await runSecurityCheck(projectRoot, config));
8196
+ break;
8197
+ case "perf":
8198
+ issues.push(...await runPerfCheck(projectRoot, config));
8199
+ break;
8200
+ case "phase-gate":
8201
+ issues.push(...await runPhaseGateCheck(projectRoot, config));
8202
+ break;
8203
+ case "arch":
8204
+ issues.push(...await runArchCheck(projectRoot, config));
8205
+ break;
8206
+ }
8178
8207
  } catch (error) {
8179
8208
  issues.push({
8180
8209
  severity: "error",
@@ -8539,7 +8568,7 @@ async function readContextFile(projectRoot, filePath, reason) {
8539
8568
  if (!result.ok) return null;
8540
8569
  const content = result.value;
8541
8570
  const lines = content.split("\n").length;
8542
- const relPath = path14.isAbsolute(filePath) ? path14.relative(projectRoot, filePath) : filePath;
8571
+ const relPath = path14.isAbsolute(filePath) ? relativePosix(projectRoot, filePath) : filePath;
8543
8572
  return { path: relPath, content, reason, lines };
8544
8573
  }
8545
8574
  function extractImportSources2(content) {
@@ -8557,7 +8586,7 @@ async function resolveImportPath2(projectRoot, fromFile, importSource) {
8557
8586
  const fromDir = path14.dirname(path14.join(projectRoot, fromFile));
8558
8587
  const basePath = path14.resolve(fromDir, importSource);
8559
8588
  if (!isWithinProject(basePath, projectRoot)) return null;
8560
- const relBase = path14.relative(projectRoot, basePath);
8589
+ const relBase = relativePosix(projectRoot, basePath);
8561
8590
  const candidates = [
8562
8591
  relBase + ".ts",
8563
8592
  relBase + ".tsx",
@@ -8576,7 +8605,7 @@ async function findTestFiles(projectRoot, sourceFile) {
8576
8605
  const baseName = path14.basename(sourceFile, path14.extname(sourceFile));
8577
8606
  const pattern = `**/${baseName}.{test,spec}.{ts,tsx,mts}`;
8578
8607
  const results = await findFiles(pattern, projectRoot);
8579
- return results.map((f) => path14.relative(projectRoot, f));
8608
+ return results.map((f) => relativePosix(projectRoot, f));
8580
8609
  }
8581
8610
  async function gatherImportContext(projectRoot, changedFiles, budget) {
8582
8611
  const contextFiles = [];
@@ -10369,7 +10398,7 @@ function getUpdateNotification(currentVersion) {
10369
10398
  return `Update available: v${currentVersion} -> v${state.latestVersion}
10370
10399
  Run "harness update" to upgrade.`;
10371
10400
  }
10372
- var VERSION = "0.11.0";
10401
+ var VERSION = "0.13.0";
10373
10402
 
10374
10403
  export {
10375
10404
  ArchMetricCategorySchema,