@harness-engineering/cli 1.15.0 → 1.17.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 (508) hide show
  1. package/dist/agents/commands/codex/AGENTS.md +39 -0
  2. package/dist/agents/commands/codex/harness/add-harness-component/SKILL.md +195 -0
  3. package/dist/agents/commands/codex/harness/add-harness-component/agents/openai.yaml +3 -0
  4. package/dist/agents/commands/codex/harness/cleanup-dead-code/SKILL.md +248 -0
  5. package/dist/agents/commands/codex/harness/cleanup-dead-code/agents/openai.yaml +3 -0
  6. package/dist/agents/commands/codex/harness/detect-doc-drift/SKILL.md +182 -0
  7. package/dist/agents/commands/codex/harness/detect-doc-drift/agents/openai.yaml +3 -0
  8. package/dist/agents/commands/codex/harness/enforce-architecture/SKILL.md +299 -0
  9. package/dist/agents/commands/codex/harness/enforce-architecture/agents/openai.yaml +3 -0
  10. package/dist/agents/commands/codex/harness/harness-architecture-advisor/SKILL.md +452 -0
  11. package/dist/agents/commands/codex/harness/harness-architecture-advisor/agents/openai.yaml +3 -0
  12. package/dist/agents/commands/codex/harness/harness-autopilot/SKILL.md +919 -0
  13. package/dist/agents/commands/codex/harness/harness-autopilot/agents/openai.yaml +3 -0
  14. package/dist/agents/commands/codex/harness/harness-brainstorming/SKILL.md +409 -0
  15. package/dist/agents/commands/codex/harness/harness-brainstorming/agents/openai.yaml +3 -0
  16. package/dist/agents/commands/codex/harness/harness-code-review/SKILL.md +860 -0
  17. package/dist/agents/commands/codex/harness/harness-code-review/agents/openai.yaml +3 -0
  18. package/dist/agents/commands/codex/harness/harness-codebase-cleanup/SKILL.md +227 -0
  19. package/dist/agents/commands/codex/harness/harness-codebase-cleanup/agents/openai.yaml +3 -0
  20. package/dist/agents/commands/codex/harness/harness-debugging/SKILL.md +369 -0
  21. package/dist/agents/commands/codex/harness/harness-debugging/agents/openai.yaml +3 -0
  22. package/dist/agents/commands/codex/harness/harness-dependency-health/SKILL.md +182 -0
  23. package/dist/agents/commands/codex/harness/harness-dependency-health/agents/openai.yaml +3 -0
  24. package/dist/agents/commands/codex/harness/harness-docs-pipeline/SKILL.md +463 -0
  25. package/dist/agents/commands/codex/harness/harness-docs-pipeline/agents/openai.yaml +3 -0
  26. package/dist/agents/commands/codex/harness/harness-execution/SKILL.md +513 -0
  27. package/dist/agents/commands/codex/harness/harness-execution/agents/openai.yaml +3 -0
  28. package/dist/agents/commands/codex/harness/harness-hotspot-detector/SKILL.md +164 -0
  29. package/dist/agents/commands/codex/harness/harness-hotspot-detector/agents/openai.yaml +3 -0
  30. package/dist/agents/commands/codex/harness/harness-impact-analysis/SKILL.md +187 -0
  31. package/dist/agents/commands/codex/harness/harness-impact-analysis/agents/openai.yaml +3 -0
  32. package/dist/agents/commands/codex/harness/harness-integrity/SKILL.md +170 -0
  33. package/dist/agents/commands/codex/harness/harness-integrity/agents/openai.yaml +3 -0
  34. package/dist/agents/commands/codex/harness/harness-onboarding/SKILL.md +291 -0
  35. package/dist/agents/commands/codex/harness/harness-onboarding/agents/openai.yaml +3 -0
  36. package/dist/agents/commands/codex/harness/harness-perf/SKILL.md +263 -0
  37. package/dist/agents/commands/codex/harness/harness-perf/agents/openai.yaml +3 -0
  38. package/dist/agents/commands/codex/harness/harness-planning/SKILL.md +582 -0
  39. package/dist/agents/commands/codex/harness/harness-planning/agents/openai.yaml +3 -0
  40. package/dist/agents/commands/codex/harness/harness-refactoring/SKILL.md +172 -0
  41. package/dist/agents/commands/codex/harness/harness-refactoring/agents/openai.yaml +3 -0
  42. package/dist/agents/commands/codex/harness/harness-release-readiness/SKILL.md +692 -0
  43. package/dist/agents/commands/codex/harness/harness-release-readiness/agents/openai.yaml +3 -0
  44. package/dist/agents/commands/codex/harness/harness-roadmap/SKILL.md +598 -0
  45. package/dist/agents/commands/codex/harness/harness-roadmap/agents/openai.yaml +3 -0
  46. package/dist/agents/commands/codex/harness/harness-security-scan/SKILL.md +157 -0
  47. package/dist/agents/commands/codex/harness/harness-security-scan/agents/openai.yaml +3 -0
  48. package/dist/agents/commands/codex/harness/harness-skill-authoring/SKILL.md +295 -0
  49. package/dist/agents/commands/codex/harness/harness-skill-authoring/agents/openai.yaml +3 -0
  50. package/dist/agents/commands/codex/harness/harness-soundness-review/SKILL.md +1270 -0
  51. package/dist/agents/commands/codex/harness/harness-soundness-review/agents/openai.yaml +3 -0
  52. package/dist/agents/commands/codex/harness/harness-supply-chain-audit/SKILL.md +247 -0
  53. package/dist/agents/commands/codex/harness/harness-supply-chain-audit/agents/openai.yaml +3 -0
  54. package/dist/agents/commands/codex/harness/harness-tdd/SKILL.md +180 -0
  55. package/dist/agents/commands/codex/harness/harness-tdd/agents/openai.yaml +3 -0
  56. package/dist/agents/commands/codex/harness/harness-test-advisor/SKILL.md +163 -0
  57. package/dist/agents/commands/codex/harness/harness-test-advisor/agents/openai.yaml +3 -0
  58. package/dist/agents/commands/codex/harness/harness-verification/SKILL.md +424 -0
  59. package/dist/agents/commands/codex/harness/harness-verification/agents/openai.yaml +3 -0
  60. package/dist/agents/commands/codex/harness/harness-verify/SKILL.md +162 -0
  61. package/dist/agents/commands/codex/harness/harness-verify/agents/openai.yaml +3 -0
  62. package/dist/agents/commands/codex/harness/initialize-harness-project/SKILL.md +235 -0
  63. package/dist/agents/commands/codex/harness/initialize-harness-project/agents/openai.yaml +3 -0
  64. package/dist/agents/commands/cursor/harness/add-harness-component.mdc +200 -0
  65. package/dist/agents/commands/cursor/harness/cleanup-dead-code.mdc +253 -0
  66. package/dist/agents/commands/cursor/harness/detect-doc-drift.mdc +187 -0
  67. package/dist/agents/commands/cursor/harness/enforce-architecture.mdc +304 -0
  68. package/dist/agents/commands/cursor/harness/harness-architecture-advisor.mdc +457 -0
  69. package/dist/agents/commands/cursor/harness/harness-autopilot.mdc +924 -0
  70. package/dist/agents/commands/cursor/harness/harness-brainstorming.mdc +414 -0
  71. package/dist/agents/commands/cursor/harness/harness-code-review.mdc +865 -0
  72. package/dist/agents/commands/cursor/harness/harness-codebase-cleanup.mdc +232 -0
  73. package/dist/agents/commands/cursor/harness/harness-debugging.mdc +374 -0
  74. package/dist/agents/commands/cursor/harness/harness-dependency-health.mdc +187 -0
  75. package/dist/agents/commands/cursor/harness/harness-docs-pipeline.mdc +468 -0
  76. package/dist/agents/commands/cursor/harness/harness-execution.mdc +518 -0
  77. package/dist/agents/commands/cursor/harness/harness-hotspot-detector.mdc +169 -0
  78. package/dist/agents/commands/cursor/harness/harness-impact-analysis.mdc +192 -0
  79. package/dist/agents/commands/cursor/harness/harness-integrity.mdc +175 -0
  80. package/dist/agents/commands/cursor/harness/harness-onboarding.mdc +296 -0
  81. package/dist/agents/commands/cursor/harness/harness-perf.mdc +268 -0
  82. package/dist/agents/commands/cursor/harness/harness-planning.mdc +587 -0
  83. package/dist/agents/commands/cursor/harness/harness-refactoring.mdc +177 -0
  84. package/dist/agents/commands/cursor/harness/harness-release-readiness.mdc +697 -0
  85. package/dist/agents/commands/cursor/harness/harness-roadmap.mdc +603 -0
  86. package/dist/agents/commands/cursor/harness/harness-security-scan.mdc +162 -0
  87. package/dist/agents/commands/cursor/harness/harness-skill-authoring.mdc +300 -0
  88. package/dist/agents/commands/cursor/harness/harness-soundness-review.mdc +1275 -0
  89. package/dist/agents/commands/cursor/harness/harness-supply-chain-audit.mdc +252 -0
  90. package/dist/agents/commands/cursor/harness/harness-tdd.mdc +185 -0
  91. package/dist/agents/commands/cursor/harness/harness-test-advisor.mdc +168 -0
  92. package/dist/agents/commands/cursor/harness/harness-verification.mdc +429 -0
  93. package/dist/agents/commands/cursor/harness/harness-verify.mdc +167 -0
  94. package/dist/agents/commands/cursor/harness/initialize-harness-project.mdc +240 -0
  95. package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +52 -0
  96. package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +52 -0
  97. package/dist/agents/skills/claude-code/harness-architecture-advisor/SKILL.md +52 -0
  98. package/dist/agents/skills/claude-code/harness-auth/SKILL.md +52 -0
  99. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +123 -14
  100. package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +6 -0
  101. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +97 -3
  102. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +6 -0
  103. package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +2 -4
  104. package/dist/agents/skills/claude-code/harness-database/SKILL.md +52 -0
  105. package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +52 -0
  106. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +99 -3
  107. package/dist/agents/skills/claude-code/harness-planning/skill.yaml +6 -0
  108. package/dist/agents/skills/claude-code/harness-pre-commit-review/SKILL.md +1 -1
  109. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +204 -0
  110. package/dist/agents/skills/claude-code/harness-roadmap-pilot/skill.yaml +52 -0
  111. package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +27 -7
  112. package/dist/agents/skills/claude-code/harness-security-scan/SKILL.md +52 -0
  113. package/dist/agents/skills/claude-code/harness-supply-chain-audit/SKILL.md +281 -0
  114. package/dist/agents/skills/claude-code/harness-supply-chain-audit/skill.yaml +51 -0
  115. package/dist/agents/skills/codex/add-harness-component/SKILL.md +192 -0
  116. package/dist/agents/skills/codex/add-harness-component/skill.yaml +33 -0
  117. package/dist/agents/skills/codex/align-documentation/SKILL.md +213 -0
  118. package/dist/agents/skills/codex/align-documentation/skill.yaml +32 -0
  119. package/dist/agents/skills/codex/check-mechanical-constraints/SKILL.md +191 -0
  120. package/dist/agents/skills/codex/check-mechanical-constraints/skill.yaml +33 -0
  121. package/dist/agents/skills/codex/cleanup-dead-code/SKILL.md +245 -0
  122. package/dist/agents/skills/codex/cleanup-dead-code/skill.yaml +34 -0
  123. package/dist/agents/skills/codex/detect-doc-drift/SKILL.md +179 -0
  124. package/dist/agents/skills/codex/detect-doc-drift/skill.yaml +31 -0
  125. package/dist/agents/skills/codex/enforce-architecture/SKILL.md +296 -0
  126. package/dist/agents/skills/codex/enforce-architecture/skill.yaml +35 -0
  127. package/dist/agents/skills/codex/harness-accessibility/SKILL.md +281 -0
  128. package/dist/agents/skills/codex/harness-accessibility/skill.yaml +52 -0
  129. package/dist/agents/skills/codex/harness-api-design/SKILL.md +356 -0
  130. package/dist/agents/skills/codex/harness-api-design/skill.yaml +74 -0
  131. package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +449 -0
  132. package/dist/agents/skills/codex/harness-architecture-advisor/skill.yaml +49 -0
  133. package/dist/agents/skills/codex/harness-auth/SKILL.md +331 -0
  134. package/dist/agents/skills/codex/harness-auth/skill.yaml +81 -0
  135. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +916 -0
  136. package/dist/agents/skills/codex/harness-autopilot/skill.yaml +67 -0
  137. package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +406 -0
  138. package/dist/agents/skills/codex/harness-brainstorming/skill.yaml +50 -0
  139. package/dist/agents/skills/codex/harness-caching/SKILL.md +309 -0
  140. package/dist/agents/skills/codex/harness-caching/skill.yaml +73 -0
  141. package/dist/agents/skills/codex/harness-chaos/SKILL.md +295 -0
  142. package/dist/agents/skills/codex/harness-chaos/skill.yaml +72 -0
  143. package/dist/agents/skills/codex/harness-code-review/SKILL.md +857 -0
  144. package/dist/agents/skills/codex/harness-code-review/skill.yaml +52 -0
  145. package/dist/agents/skills/codex/harness-codebase-cleanup/SKILL.md +224 -0
  146. package/dist/agents/skills/codex/harness-codebase-cleanup/skill.yaml +65 -0
  147. package/dist/agents/skills/codex/harness-compliance/SKILL.md +303 -0
  148. package/dist/agents/skills/codex/harness-compliance/skill.yaml +78 -0
  149. package/dist/agents/skills/codex/harness-containerization/SKILL.md +284 -0
  150. package/dist/agents/skills/codex/harness-containerization/skill.yaml +80 -0
  151. package/dist/agents/skills/codex/harness-data-pipeline/SKILL.md +274 -0
  152. package/dist/agents/skills/codex/harness-data-pipeline/skill.yaml +81 -0
  153. package/dist/agents/skills/codex/harness-data-validation/SKILL.md +343 -0
  154. package/dist/agents/skills/codex/harness-data-validation/skill.yaml +75 -0
  155. package/dist/agents/skills/codex/harness-database/SKILL.md +310 -0
  156. package/dist/agents/skills/codex/harness-database/skill.yaml +80 -0
  157. package/dist/agents/skills/codex/harness-debugging/SKILL.md +366 -0
  158. package/dist/agents/skills/codex/harness-debugging/skill.yaml +48 -0
  159. package/dist/agents/skills/codex/harness-dependency-health/SKILL.md +179 -0
  160. package/dist/agents/skills/codex/harness-dependency-health/skill.yaml +42 -0
  161. package/dist/agents/skills/codex/harness-deployment/SKILL.md +307 -0
  162. package/dist/agents/skills/codex/harness-deployment/skill.yaml +77 -0
  163. package/dist/agents/skills/codex/harness-design/SKILL.md +265 -0
  164. package/dist/agents/skills/codex/harness-design/skill.yaml +54 -0
  165. package/dist/agents/skills/codex/harness-design-mobile/SKILL.md +336 -0
  166. package/dist/agents/skills/codex/harness-design-mobile/skill.yaml +50 -0
  167. package/dist/agents/skills/codex/harness-design-system/SKILL.md +282 -0
  168. package/dist/agents/skills/codex/harness-design-system/skill.yaml +51 -0
  169. package/dist/agents/skills/codex/harness-design-web/SKILL.md +360 -0
  170. package/dist/agents/skills/codex/harness-design-web/skill.yaml +53 -0
  171. package/dist/agents/skills/codex/harness-diagnostics/SKILL.md +318 -0
  172. package/dist/agents/skills/codex/harness-diagnostics/skill.yaml +51 -0
  173. package/dist/agents/skills/codex/harness-docs-pipeline/SKILL.md +460 -0
  174. package/dist/agents/skills/codex/harness-docs-pipeline/skill.yaml +70 -0
  175. package/dist/agents/skills/codex/harness-dx/SKILL.md +276 -0
  176. package/dist/agents/skills/codex/harness-dx/skill.yaml +76 -0
  177. package/dist/agents/skills/codex/harness-e2e/SKILL.md +245 -0
  178. package/dist/agents/skills/codex/harness-e2e/skill.yaml +78 -0
  179. package/dist/agents/skills/codex/harness-event-driven/SKILL.md +280 -0
  180. package/dist/agents/skills/codex/harness-event-driven/skill.yaml +77 -0
  181. package/dist/agents/skills/codex/harness-execution/SKILL.md +510 -0
  182. package/dist/agents/skills/codex/harness-execution/skill.yaml +52 -0
  183. package/dist/agents/skills/codex/harness-feature-flags/SKILL.md +287 -0
  184. package/dist/agents/skills/codex/harness-feature-flags/skill.yaml +74 -0
  185. package/dist/agents/skills/codex/harness-git-workflow/SKILL.md +268 -0
  186. package/dist/agents/skills/codex/harness-git-workflow/skill.yaml +32 -0
  187. package/dist/agents/skills/codex/harness-hotspot-detector/SKILL.md +161 -0
  188. package/dist/agents/skills/codex/harness-hotspot-detector/skill.yaml +45 -0
  189. package/dist/agents/skills/codex/harness-i18n/SKILL.md +484 -0
  190. package/dist/agents/skills/codex/harness-i18n/skill.yaml +55 -0
  191. package/dist/agents/skills/codex/harness-i18n-process/SKILL.md +388 -0
  192. package/dist/agents/skills/codex/harness-i18n-process/skill.yaml +44 -0
  193. package/dist/agents/skills/codex/harness-i18n-workflow/SKILL.md +512 -0
  194. package/dist/agents/skills/codex/harness-i18n-workflow/skill.yaml +54 -0
  195. package/dist/agents/skills/codex/harness-impact-analysis/SKILL.md +184 -0
  196. package/dist/agents/skills/codex/harness-impact-analysis/skill.yaml +45 -0
  197. package/dist/agents/skills/codex/harness-incident-response/SKILL.md +223 -0
  198. package/dist/agents/skills/codex/harness-incident-response/skill.yaml +78 -0
  199. package/dist/agents/skills/codex/harness-infrastructure-as-code/SKILL.md +279 -0
  200. package/dist/agents/skills/codex/harness-infrastructure-as-code/skill.yaml +80 -0
  201. package/dist/agents/skills/codex/harness-integration-test/SKILL.md +271 -0
  202. package/dist/agents/skills/codex/harness-integration-test/skill.yaml +73 -0
  203. package/dist/agents/skills/codex/harness-integrity/SKILL.md +167 -0
  204. package/dist/agents/skills/codex/harness-integrity/skill.yaml +48 -0
  205. package/dist/agents/skills/codex/harness-knowledge-mapper/SKILL.md +195 -0
  206. package/dist/agents/skills/codex/harness-knowledge-mapper/skill.yaml +50 -0
  207. package/dist/agents/skills/codex/harness-load-testing/SKILL.md +274 -0
  208. package/dist/agents/skills/codex/harness-load-testing/skill.yaml +79 -0
  209. package/dist/agents/skills/codex/harness-ml-ops/SKILL.md +341 -0
  210. package/dist/agents/skills/codex/harness-ml-ops/skill.yaml +79 -0
  211. package/dist/agents/skills/codex/harness-mobile-patterns/SKILL.md +326 -0
  212. package/dist/agents/skills/codex/harness-mobile-patterns/skill.yaml +82 -0
  213. package/dist/agents/skills/codex/harness-mutation-test/SKILL.md +251 -0
  214. package/dist/agents/skills/codex/harness-mutation-test/skill.yaml +70 -0
  215. package/dist/agents/skills/codex/harness-observability/SKILL.md +283 -0
  216. package/dist/agents/skills/codex/harness-observability/skill.yaml +78 -0
  217. package/dist/agents/skills/codex/harness-onboarding/SKILL.md +288 -0
  218. package/dist/agents/skills/codex/harness-onboarding/skill.yaml +31 -0
  219. package/dist/agents/skills/codex/harness-parallel-agents/SKILL.md +256 -0
  220. package/dist/agents/skills/codex/harness-parallel-agents/skill.yaml +34 -0
  221. package/dist/agents/skills/codex/harness-perf/SKILL.md +260 -0
  222. package/dist/agents/skills/codex/harness-perf/skill.yaml +51 -0
  223. package/dist/agents/skills/codex/harness-perf-tdd/SKILL.md +249 -0
  224. package/dist/agents/skills/codex/harness-perf-tdd/skill.yaml +48 -0
  225. package/dist/agents/skills/codex/harness-planning/SKILL.md +579 -0
  226. package/dist/agents/skills/codex/harness-planning/skill.yaml +56 -0
  227. package/dist/agents/skills/codex/harness-pre-commit-review/SKILL.md +324 -0
  228. package/dist/agents/skills/codex/harness-pre-commit-review/skill.yaml +34 -0
  229. package/dist/agents/skills/codex/harness-product-spec/SKILL.md +285 -0
  230. package/dist/agents/skills/codex/harness-product-spec/skill.yaml +72 -0
  231. package/dist/agents/skills/codex/harness-property-test/SKILL.md +281 -0
  232. package/dist/agents/skills/codex/harness-property-test/skill.yaml +71 -0
  233. package/dist/agents/skills/codex/harness-refactoring/SKILL.md +169 -0
  234. package/dist/agents/skills/codex/harness-refactoring/skill.yaml +34 -0
  235. package/dist/agents/skills/codex/harness-release-readiness/SKILL.md +689 -0
  236. package/dist/agents/skills/codex/harness-release-readiness/skill.yaml +58 -0
  237. package/dist/agents/skills/codex/harness-resilience/SKILL.md +255 -0
  238. package/dist/agents/skills/codex/harness-resilience/skill.yaml +76 -0
  239. package/dist/agents/skills/codex/harness-roadmap/SKILL.md +595 -0
  240. package/dist/agents/skills/codex/harness-roadmap/skill.yaml +44 -0
  241. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +204 -0
  242. package/dist/agents/skills/codex/harness-roadmap-pilot/skill.yaml +52 -0
  243. package/dist/agents/skills/codex/harness-secrets/SKILL.md +293 -0
  244. package/dist/agents/skills/codex/harness-secrets/skill.yaml +76 -0
  245. package/dist/agents/skills/codex/harness-security-review/SKILL.md +260 -0
  246. package/dist/agents/skills/codex/harness-security-review/skill.yaml +53 -0
  247. package/dist/agents/skills/codex/harness-security-scan/SKILL.md +154 -0
  248. package/dist/agents/skills/codex/harness-security-scan/skill.yaml +42 -0
  249. package/dist/agents/skills/codex/harness-skill-authoring/SKILL.md +292 -0
  250. package/dist/agents/skills/codex/harness-skill-authoring/skill.yaml +33 -0
  251. package/dist/agents/skills/codex/harness-soundness-review/SKILL.md +1267 -0
  252. package/dist/agents/skills/codex/harness-soundness-review/skill.yaml +49 -0
  253. package/dist/agents/skills/codex/harness-sql-review/SKILL.md +315 -0
  254. package/dist/agents/skills/codex/harness-sql-review/skill.yaml +74 -0
  255. package/dist/agents/skills/codex/harness-state-management/SKILL.md +309 -0
  256. package/dist/agents/skills/codex/harness-state-management/skill.yaml +33 -0
  257. package/dist/agents/skills/codex/harness-supply-chain-audit/SKILL.md +281 -0
  258. package/dist/agents/skills/codex/harness-supply-chain-audit/skill.yaml +51 -0
  259. package/dist/agents/skills/codex/harness-tdd/SKILL.md +177 -0
  260. package/dist/agents/skills/codex/harness-tdd/skill.yaml +49 -0
  261. package/dist/agents/skills/codex/harness-test-advisor/SKILL.md +160 -0
  262. package/dist/agents/skills/codex/harness-test-advisor/skill.yaml +45 -0
  263. package/dist/agents/skills/codex/harness-test-data/SKILL.md +268 -0
  264. package/dist/agents/skills/codex/harness-test-data/skill.yaml +74 -0
  265. package/dist/agents/skills/codex/harness-ux-copy/SKILL.md +271 -0
  266. package/dist/agents/skills/codex/harness-ux-copy/skill.yaml +77 -0
  267. package/dist/agents/skills/codex/harness-verification/SKILL.md +421 -0
  268. package/dist/agents/skills/codex/harness-verification/skill.yaml +43 -0
  269. package/dist/agents/skills/codex/harness-verify/SKILL.md +159 -0
  270. package/dist/agents/skills/codex/harness-verify/skill.yaml +41 -0
  271. package/dist/agents/skills/codex/harness-visual-regression/SKILL.md +257 -0
  272. package/dist/agents/skills/codex/harness-visual-regression/skill.yaml +74 -0
  273. package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +232 -0
  274. package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +32 -0
  275. package/dist/agents/skills/codex/validate-context-engineering/SKILL.md +150 -0
  276. package/dist/agents/skills/codex/validate-context-engineering/skill.yaml +32 -0
  277. package/dist/agents/skills/cursor/add-harness-component/SKILL.md +192 -0
  278. package/dist/agents/skills/cursor/add-harness-component/skill.yaml +33 -0
  279. package/dist/agents/skills/cursor/align-documentation/SKILL.md +213 -0
  280. package/dist/agents/skills/cursor/align-documentation/skill.yaml +32 -0
  281. package/dist/agents/skills/cursor/check-mechanical-constraints/SKILL.md +191 -0
  282. package/dist/agents/skills/cursor/check-mechanical-constraints/skill.yaml +33 -0
  283. package/dist/agents/skills/cursor/cleanup-dead-code/SKILL.md +245 -0
  284. package/dist/agents/skills/cursor/cleanup-dead-code/skill.yaml +34 -0
  285. package/dist/agents/skills/cursor/detect-doc-drift/SKILL.md +179 -0
  286. package/dist/agents/skills/cursor/detect-doc-drift/skill.yaml +31 -0
  287. package/dist/agents/skills/cursor/enforce-architecture/SKILL.md +296 -0
  288. package/dist/agents/skills/cursor/enforce-architecture/skill.yaml +35 -0
  289. package/dist/agents/skills/cursor/harness-accessibility/SKILL.md +281 -0
  290. package/dist/agents/skills/cursor/harness-accessibility/skill.yaml +52 -0
  291. package/dist/agents/skills/cursor/harness-api-design/SKILL.md +356 -0
  292. package/dist/agents/skills/cursor/harness-api-design/skill.yaml +74 -0
  293. package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +449 -0
  294. package/dist/agents/skills/cursor/harness-architecture-advisor/skill.yaml +49 -0
  295. package/dist/agents/skills/cursor/harness-auth/SKILL.md +331 -0
  296. package/dist/agents/skills/cursor/harness-auth/skill.yaml +81 -0
  297. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +916 -0
  298. package/dist/agents/skills/cursor/harness-autopilot/skill.yaml +67 -0
  299. package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +406 -0
  300. package/dist/agents/skills/cursor/harness-brainstorming/skill.yaml +50 -0
  301. package/dist/agents/skills/cursor/harness-caching/SKILL.md +309 -0
  302. package/dist/agents/skills/cursor/harness-caching/skill.yaml +73 -0
  303. package/dist/agents/skills/cursor/harness-chaos/SKILL.md +295 -0
  304. package/dist/agents/skills/cursor/harness-chaos/skill.yaml +72 -0
  305. package/dist/agents/skills/cursor/harness-code-review/SKILL.md +857 -0
  306. package/dist/agents/skills/cursor/harness-code-review/skill.yaml +52 -0
  307. package/dist/agents/skills/cursor/harness-codebase-cleanup/SKILL.md +224 -0
  308. package/dist/agents/skills/cursor/harness-codebase-cleanup/skill.yaml +65 -0
  309. package/dist/agents/skills/cursor/harness-compliance/SKILL.md +303 -0
  310. package/dist/agents/skills/cursor/harness-compliance/skill.yaml +78 -0
  311. package/dist/agents/skills/cursor/harness-containerization/SKILL.md +284 -0
  312. package/dist/agents/skills/cursor/harness-containerization/skill.yaml +80 -0
  313. package/dist/agents/skills/cursor/harness-data-pipeline/SKILL.md +274 -0
  314. package/dist/agents/skills/cursor/harness-data-pipeline/skill.yaml +81 -0
  315. package/dist/agents/skills/cursor/harness-data-validation/SKILL.md +343 -0
  316. package/dist/agents/skills/cursor/harness-data-validation/skill.yaml +75 -0
  317. package/dist/agents/skills/cursor/harness-database/SKILL.md +310 -0
  318. package/dist/agents/skills/cursor/harness-database/skill.yaml +80 -0
  319. package/dist/agents/skills/cursor/harness-debugging/SKILL.md +366 -0
  320. package/dist/agents/skills/cursor/harness-debugging/skill.yaml +48 -0
  321. package/dist/agents/skills/cursor/harness-dependency-health/SKILL.md +179 -0
  322. package/dist/agents/skills/cursor/harness-dependency-health/skill.yaml +42 -0
  323. package/dist/agents/skills/cursor/harness-deployment/SKILL.md +307 -0
  324. package/dist/agents/skills/cursor/harness-deployment/skill.yaml +77 -0
  325. package/dist/agents/skills/cursor/harness-design/SKILL.md +265 -0
  326. package/dist/agents/skills/cursor/harness-design/skill.yaml +54 -0
  327. package/dist/agents/skills/cursor/harness-design-mobile/SKILL.md +336 -0
  328. package/dist/agents/skills/cursor/harness-design-mobile/skill.yaml +50 -0
  329. package/dist/agents/skills/cursor/harness-design-system/SKILL.md +282 -0
  330. package/dist/agents/skills/cursor/harness-design-system/skill.yaml +51 -0
  331. package/dist/agents/skills/cursor/harness-design-web/SKILL.md +360 -0
  332. package/dist/agents/skills/cursor/harness-design-web/skill.yaml +53 -0
  333. package/dist/agents/skills/cursor/harness-diagnostics/SKILL.md +318 -0
  334. package/dist/agents/skills/cursor/harness-diagnostics/skill.yaml +51 -0
  335. package/dist/agents/skills/cursor/harness-docs-pipeline/SKILL.md +460 -0
  336. package/dist/agents/skills/cursor/harness-docs-pipeline/skill.yaml +70 -0
  337. package/dist/agents/skills/cursor/harness-dx/SKILL.md +276 -0
  338. package/dist/agents/skills/cursor/harness-dx/skill.yaml +76 -0
  339. package/dist/agents/skills/cursor/harness-e2e/SKILL.md +245 -0
  340. package/dist/agents/skills/cursor/harness-e2e/skill.yaml +78 -0
  341. package/dist/agents/skills/cursor/harness-event-driven/SKILL.md +280 -0
  342. package/dist/agents/skills/cursor/harness-event-driven/skill.yaml +77 -0
  343. package/dist/agents/skills/cursor/harness-execution/SKILL.md +510 -0
  344. package/dist/agents/skills/cursor/harness-execution/skill.yaml +52 -0
  345. package/dist/agents/skills/cursor/harness-feature-flags/SKILL.md +287 -0
  346. package/dist/agents/skills/cursor/harness-feature-flags/skill.yaml +74 -0
  347. package/dist/agents/skills/cursor/harness-git-workflow/SKILL.md +268 -0
  348. package/dist/agents/skills/cursor/harness-git-workflow/skill.yaml +32 -0
  349. package/dist/agents/skills/cursor/harness-hotspot-detector/SKILL.md +161 -0
  350. package/dist/agents/skills/cursor/harness-hotspot-detector/skill.yaml +45 -0
  351. package/dist/agents/skills/cursor/harness-i18n/SKILL.md +484 -0
  352. package/dist/agents/skills/cursor/harness-i18n/skill.yaml +55 -0
  353. package/dist/agents/skills/cursor/harness-i18n-process/SKILL.md +388 -0
  354. package/dist/agents/skills/cursor/harness-i18n-process/skill.yaml +44 -0
  355. package/dist/agents/skills/cursor/harness-i18n-workflow/SKILL.md +512 -0
  356. package/dist/agents/skills/cursor/harness-i18n-workflow/skill.yaml +54 -0
  357. package/dist/agents/skills/cursor/harness-impact-analysis/SKILL.md +184 -0
  358. package/dist/agents/skills/cursor/harness-impact-analysis/skill.yaml +45 -0
  359. package/dist/agents/skills/cursor/harness-incident-response/SKILL.md +223 -0
  360. package/dist/agents/skills/cursor/harness-incident-response/skill.yaml +78 -0
  361. package/dist/agents/skills/cursor/harness-infrastructure-as-code/SKILL.md +279 -0
  362. package/dist/agents/skills/cursor/harness-infrastructure-as-code/skill.yaml +80 -0
  363. package/dist/agents/skills/cursor/harness-integration-test/SKILL.md +271 -0
  364. package/dist/agents/skills/cursor/harness-integration-test/skill.yaml +73 -0
  365. package/dist/agents/skills/cursor/harness-integrity/SKILL.md +167 -0
  366. package/dist/agents/skills/cursor/harness-integrity/skill.yaml +48 -0
  367. package/dist/agents/skills/cursor/harness-knowledge-mapper/SKILL.md +195 -0
  368. package/dist/agents/skills/cursor/harness-knowledge-mapper/skill.yaml +50 -0
  369. package/dist/agents/skills/cursor/harness-load-testing/SKILL.md +274 -0
  370. package/dist/agents/skills/cursor/harness-load-testing/skill.yaml +79 -0
  371. package/dist/agents/skills/cursor/harness-ml-ops/SKILL.md +341 -0
  372. package/dist/agents/skills/cursor/harness-ml-ops/skill.yaml +79 -0
  373. package/dist/agents/skills/cursor/harness-mobile-patterns/SKILL.md +326 -0
  374. package/dist/agents/skills/cursor/harness-mobile-patterns/skill.yaml +82 -0
  375. package/dist/agents/skills/cursor/harness-mutation-test/SKILL.md +251 -0
  376. package/dist/agents/skills/cursor/harness-mutation-test/skill.yaml +70 -0
  377. package/dist/agents/skills/cursor/harness-observability/SKILL.md +283 -0
  378. package/dist/agents/skills/cursor/harness-observability/skill.yaml +78 -0
  379. package/dist/agents/skills/cursor/harness-onboarding/SKILL.md +288 -0
  380. package/dist/agents/skills/cursor/harness-onboarding/skill.yaml +31 -0
  381. package/dist/agents/skills/cursor/harness-parallel-agents/SKILL.md +256 -0
  382. package/dist/agents/skills/cursor/harness-parallel-agents/skill.yaml +34 -0
  383. package/dist/agents/skills/cursor/harness-perf/SKILL.md +260 -0
  384. package/dist/agents/skills/cursor/harness-perf/skill.yaml +51 -0
  385. package/dist/agents/skills/cursor/harness-perf-tdd/SKILL.md +249 -0
  386. package/dist/agents/skills/cursor/harness-perf-tdd/skill.yaml +48 -0
  387. package/dist/agents/skills/cursor/harness-planning/SKILL.md +579 -0
  388. package/dist/agents/skills/cursor/harness-planning/skill.yaml +56 -0
  389. package/dist/agents/skills/cursor/harness-pre-commit-review/SKILL.md +324 -0
  390. package/dist/agents/skills/cursor/harness-pre-commit-review/skill.yaml +34 -0
  391. package/dist/agents/skills/cursor/harness-product-spec/SKILL.md +285 -0
  392. package/dist/agents/skills/cursor/harness-product-spec/skill.yaml +72 -0
  393. package/dist/agents/skills/cursor/harness-property-test/SKILL.md +281 -0
  394. package/dist/agents/skills/cursor/harness-property-test/skill.yaml +71 -0
  395. package/dist/agents/skills/cursor/harness-refactoring/SKILL.md +169 -0
  396. package/dist/agents/skills/cursor/harness-refactoring/skill.yaml +34 -0
  397. package/dist/agents/skills/cursor/harness-release-readiness/SKILL.md +689 -0
  398. package/dist/agents/skills/cursor/harness-release-readiness/skill.yaml +58 -0
  399. package/dist/agents/skills/cursor/harness-resilience/SKILL.md +255 -0
  400. package/dist/agents/skills/cursor/harness-resilience/skill.yaml +76 -0
  401. package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +595 -0
  402. package/dist/agents/skills/cursor/harness-roadmap/skill.yaml +44 -0
  403. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +204 -0
  404. package/dist/agents/skills/cursor/harness-roadmap-pilot/skill.yaml +52 -0
  405. package/dist/agents/skills/cursor/harness-secrets/SKILL.md +293 -0
  406. package/dist/agents/skills/cursor/harness-secrets/skill.yaml +76 -0
  407. package/dist/agents/skills/cursor/harness-security-review/SKILL.md +260 -0
  408. package/dist/agents/skills/cursor/harness-security-review/skill.yaml +53 -0
  409. package/dist/agents/skills/cursor/harness-security-scan/SKILL.md +154 -0
  410. package/dist/agents/skills/cursor/harness-security-scan/skill.yaml +42 -0
  411. package/dist/agents/skills/cursor/harness-skill-authoring/SKILL.md +292 -0
  412. package/dist/agents/skills/cursor/harness-skill-authoring/skill.yaml +33 -0
  413. package/dist/agents/skills/cursor/harness-soundness-review/SKILL.md +1267 -0
  414. package/dist/agents/skills/cursor/harness-soundness-review/skill.yaml +49 -0
  415. package/dist/agents/skills/cursor/harness-sql-review/SKILL.md +315 -0
  416. package/dist/agents/skills/cursor/harness-sql-review/skill.yaml +74 -0
  417. package/dist/agents/skills/cursor/harness-state-management/SKILL.md +309 -0
  418. package/dist/agents/skills/cursor/harness-state-management/skill.yaml +33 -0
  419. package/dist/agents/skills/cursor/harness-supply-chain-audit/SKILL.md +281 -0
  420. package/dist/agents/skills/cursor/harness-supply-chain-audit/skill.yaml +51 -0
  421. package/dist/agents/skills/cursor/harness-tdd/SKILL.md +177 -0
  422. package/dist/agents/skills/cursor/harness-tdd/skill.yaml +49 -0
  423. package/dist/agents/skills/cursor/harness-test-advisor/SKILL.md +160 -0
  424. package/dist/agents/skills/cursor/harness-test-advisor/skill.yaml +45 -0
  425. package/dist/agents/skills/cursor/harness-test-data/SKILL.md +268 -0
  426. package/dist/agents/skills/cursor/harness-test-data/skill.yaml +74 -0
  427. package/dist/agents/skills/cursor/harness-ux-copy/SKILL.md +271 -0
  428. package/dist/agents/skills/cursor/harness-ux-copy/skill.yaml +77 -0
  429. package/dist/agents/skills/cursor/harness-verification/SKILL.md +421 -0
  430. package/dist/agents/skills/cursor/harness-verification/skill.yaml +43 -0
  431. package/dist/agents/skills/cursor/harness-verify/SKILL.md +159 -0
  432. package/dist/agents/skills/cursor/harness-verify/skill.yaml +41 -0
  433. package/dist/agents/skills/cursor/harness-visual-regression/SKILL.md +257 -0
  434. package/dist/agents/skills/cursor/harness-visual-regression/skill.yaml +74 -0
  435. package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +232 -0
  436. package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +32 -0
  437. package/dist/agents/skills/cursor/validate-context-engineering/SKILL.md +150 -0
  438. package/dist/agents/skills/cursor/validate-context-engineering/skill.yaml +32 -0
  439. package/dist/agents/skills/gemini-cli/enforce-architecture/SKILL.md +52 -0
  440. package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +52 -0
  441. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +52 -0
  442. package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +52 -0
  443. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +123 -14
  444. package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +6 -0
  445. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +97 -3
  446. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +6 -0
  447. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +2 -4
  448. package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +52 -0
  449. package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +52 -0
  450. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +99 -3
  451. package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +6 -0
  452. package/dist/agents/skills/gemini-cli/harness-pre-commit-review/SKILL.md +1 -1
  453. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +204 -0
  454. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/skill.yaml +52 -0
  455. package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +27 -7
  456. package/dist/agents/skills/gemini-cli/harness-security-scan/SKILL.md +52 -0
  457. package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/SKILL.md +281 -0
  458. package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/skill.yaml +51 -0
  459. package/dist/agents/skills/package.json +5 -5
  460. package/dist/agents/skills/templates/discipline-template.md +49 -0
  461. package/dist/agents/skills/tests/schema.ts +1 -1
  462. package/dist/{agents-md-ZGNIDWAF.js → agents-md-DUYNKHJZ.js} +1 -1
  463. package/dist/{architecture-ZLIH5533.js → architecture-UBO5KKUV.js} +2 -2
  464. package/dist/bin/harness-mcp.js +14 -14
  465. package/dist/bin/harness.js +20 -20
  466. package/dist/{check-phase-gate-ZOXVBDCN.js → check-phase-gate-OSHN2AEL.js} +3 -3
  467. package/dist/{chunk-NNHDDXYT.js → chunk-2DMIQ35P.js} +486 -132
  468. package/dist/{chunk-OFXQSFOW.js → chunk-5FM64G6D.js} +2 -2
  469. package/dist/{chunk-RCWZBSK5.js → chunk-6KWBH4EO.js} +1 -1
  470. package/dist/{chunk-LGYBN7Y6.js → chunk-ABQUCXRE.js} +2 -1
  471. package/dist/{chunk-VEPAJXBW.js → chunk-APNPXLB2.js} +4 -4
  472. package/dist/{chunk-ZOAWBDWU.js → chunk-CJDVBBPB.js} +5 -1
  473. package/dist/{chunk-FTMXDOR6.js → chunk-CZZXE6BL.js} +1 -1
  474. package/dist/{chunk-N25INEIX.js → chunk-GWXP3JVA.js} +3 -3
  475. package/dist/{chunk-XYLGHKG6.js → chunk-HKUX2X7O.js} +11 -2
  476. package/dist/{chunk-YBJ262QL.js → chunk-LRG3B43J.js} +1 -1
  477. package/dist/{chunk-AOZRDOIP.js → chunk-M6TIO6NF.js} +1 -1
  478. package/dist/{chunk-J4RAX7YB.js → chunk-OA3MOZGG.js} +1683 -507
  479. package/dist/{chunk-YLXFKVJE.js → chunk-OHZVGIPE.js} +9 -9
  480. package/dist/{chunk-2BKLWLY6.js → chunk-QSRRBNLY.js} +8 -8
  481. package/dist/{chunk-3ZZKVN62.js → chunk-TG7IUJ3J.js} +1 -1
  482. package/dist/{chunk-EDXIVMAP.js → chunk-TZIHFNEG.js} +20 -6
  483. package/dist/{chunk-ND2ENWDM.js → chunk-UX3JHYEA.js} +1 -1
  484. package/dist/{chunk-Z2OOPXJO.js → chunk-VF23UTNB.js} +1771 -164
  485. package/dist/{chunk-7MJAPE3Z.js → chunk-YLN34N65.js} +1 -0
  486. package/dist/{chunk-B2HKP423.js → chunk-ZA2I7S3E.js} +28 -1
  487. package/dist/{ci-workflow-765LSHRD.js → ci-workflow-FJZMNZPT.js} +1 -1
  488. package/dist/{create-skill-XSWHMSM5.js → create-skill-NDXQSTIK.js} +2 -2
  489. package/dist/{dist-ALQDD67R.js → dist-MF5BK5AD.js} +77 -1
  490. package/dist/{dist-B26DFXMP.js → dist-U7EAO6T2.js} +110 -60
  491. package/dist/{docs-NRMQCOJ6.js → docs-WZHW4N4P.js} +3 -3
  492. package/dist/{engine-3RB7MXPP.js → engine-VS6ZJ2VZ.js} +2 -2
  493. package/dist/{entropy-6AGX2ZUN.js → entropy-FCIGJIIT.js} +2 -2
  494. package/dist/{feedback-MY4QZIFD.js → feedback-O3FYTZIE.js} +1 -1
  495. package/dist/{generate-agent-definitions-ZAE726AU.js → generate-agent-definitions-EYG263XD.js} +3 -3
  496. package/dist/{graph-loader-2M2HXDQI.js → graph-loader-KMHDQYDT.js} +1 -1
  497. package/dist/index.d.ts +95 -15
  498. package/dist/index.js +20 -20
  499. package/dist/{loader-UUTVMQCC.js → loader-B4XWX4K6.js} +1 -1
  500. package/dist/{mcp-VU5FMO52.js → mcp-DVVUODN7.js} +14 -14
  501. package/dist/{performance-2D7G6NMJ.js → performance-NMJDV6HF.js} +4 -2
  502. package/dist/{review-pipeline-RAQ55ISU.js → review-pipeline-MSEJWTKM.js} +1 -1
  503. package/dist/{runtime-BCK5RRZQ.js → runtime-YHVLJNPG.js} +1 -1
  504. package/dist/{security-2RPQEN62.js → security-HTDKKGMX.js} +1 -1
  505. package/dist/{skill-executor-XZLYZYAK.js → skill-executor-XEVDGXUM.js} +2 -2
  506. package/dist/{validate-KBYQAEWE.js → validate-SPSTH2YW.js} +2 -2
  507. package/dist/{validate-cross-check-OABMREW4.js → validate-cross-check-YTDWIMFI.js} +1 -1
  508. package/package.json +20 -20
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  detectEntropyDefinition,
3
3
  handleDetectEntropy
4
- } from "./chunk-VEPAJXBW.js";
4
+ } from "./chunk-APNPXLB2.js";
5
5
  import {
6
6
  checkPerformanceDefinition,
7
7
  getCriticalPathsDefinition,
@@ -11,7 +11,7 @@ import {
11
11
  handleGetPerfBaselines,
12
12
  handleUpdatePerfBaselines,
13
13
  updatePerfBaselinesDefinition
14
- } from "./chunk-EDXIVMAP.js";
14
+ } from "./chunk-TZIHFNEG.js";
15
15
  import {
16
16
  analyzeDiffDefinition,
17
17
  createSelfReviewDefinition,
@@ -19,43 +19,46 @@ import {
19
19
  handleCreateSelfReview,
20
20
  handleRequestPeerReview,
21
21
  requestPeerReviewDefinition
22
- } from "./chunk-YLXFKVJE.js";
22
+ } from "./chunk-OHZVGIPE.js";
23
23
  import {
24
24
  handleRunSecurityScan,
25
25
  runSecurityScanDefinition
26
- } from "./chunk-3ZZKVN62.js";
26
+ } from "./chunk-TG7IUJ3J.js";
27
27
  import {
28
28
  handleRunCodeReview,
29
29
  runCodeReviewDefinition
30
- } from "./chunk-ND2ENWDM.js";
30
+ } from "./chunk-UX3JHYEA.js";
31
31
  import {
32
32
  GENERATED_HEADER_CLAUDE,
33
+ GENERATED_HEADER_CODEX,
34
+ GENERATED_HEADER_CURSOR,
33
35
  GENERATED_HEADER_GEMINI,
34
36
  VALID_PLATFORMS,
35
37
  applySyncPlan,
36
38
  computeSyncPlan
37
- } from "./chunk-ZOAWBDWU.js";
39
+ } from "./chunk-CJDVBBPB.js";
38
40
  import {
39
41
  handleValidateProject,
40
42
  validateToolDefinition
41
- } from "./chunk-OFXQSFOW.js";
43
+ } from "./chunk-5FM64G6D.js";
42
44
  import {
43
45
  loadGraphStore
44
- } from "./chunk-FTMXDOR6.js";
46
+ } from "./chunk-CZZXE6BL.js";
45
47
  import {
46
48
  checkDependenciesDefinition,
47
49
  handleCheckDependencies
48
- } from "./chunk-N25INEIX.js";
50
+ } from "./chunk-GWXP3JVA.js";
49
51
  import {
50
52
  resolveProjectConfig
51
53
  } from "./chunk-H7Y5CKTM.js";
52
54
  import {
53
55
  checkDocsDefinition,
54
56
  handleCheckDocs
55
- } from "./chunk-2BKLWLY6.js";
57
+ } from "./chunk-QSRRBNLY.js";
56
58
  import {
59
+ TrackerConfigSchema,
57
60
  resolveConfig
58
- } from "./chunk-B2HKP423.js";
61
+ } from "./chunk-ZA2I7S3E.js";
59
62
  import {
60
63
  resultToMcpResponse
61
64
  } from "./chunk-IDZNPTYD.js";
@@ -78,7 +81,13 @@ import {
78
81
  } from "./chunk-3WGJMBKH.js";
79
82
  import {
80
83
  SkillMetadataSchema
81
- } from "./chunk-XYLGHKG6.js";
84
+ } from "./chunk-HKUX2X7O.js";
85
+ import {
86
+ DESTRUCTIVE_BASH,
87
+ checkTaint,
88
+ scanForInjection,
89
+ writeTaint
90
+ } from "./chunk-VF23UTNB.js";
82
91
  import {
83
92
  Err,
84
93
  Ok
@@ -94,6 +103,123 @@ import {
94
103
  ReadResourceRequestSchema
95
104
  } from "@modelcontextprotocol/sdk/types.js";
96
105
 
106
+ // src/mcp/middleware/injection-guard.ts
107
+ import { realpathSync } from "fs";
108
+ import { resolve } from "path";
109
+ function isDestructiveBash(command) {
110
+ return DESTRUCTIVE_BASH.some((p) => p.test(command));
111
+ }
112
+ function isOutsideWorkspace(filePath, workspaceRoot) {
113
+ if (!filePath || !workspaceRoot) return false;
114
+ const resolved = resolve(workspaceRoot, filePath);
115
+ let realResolved = resolved;
116
+ try {
117
+ realResolved = realpathSync(resolved);
118
+ } catch {
119
+ }
120
+ return !realResolved.startsWith(workspaceRoot);
121
+ }
122
+ var INPUT_EXTRACTORS = {
123
+ Bash: (input) => input?.command ?? "",
124
+ Write: (input) => input?.content ?? "",
125
+ Edit: (input) => `${input?.old_string ?? ""}
126
+ ${input?.new_string ?? ""}`,
127
+ Read: (input) => input?.file_path ?? ""
128
+ };
129
+ function extractInputText(toolName, toolInput) {
130
+ const extractor = INPUT_EXTRACTORS[toolName];
131
+ if (extractor) return extractor(toolInput);
132
+ const parts = Object.values(toolInput || {}).filter((v) => typeof v === "string");
133
+ return parts.length > 0 ? parts.join("\n") : null;
134
+ }
135
+ function extractResultText(result) {
136
+ return result.content.filter((c) => c.type === "text").map((c) => c.text).join("\n");
137
+ }
138
+ function isDestructiveOperation(toolName, toolInput, workspaceRoot) {
139
+ const normalized = toolName.toLowerCase().replace(/_/g, "");
140
+ if (normalized === "bash") {
141
+ const command = toolInput?.command ?? "";
142
+ return isDestructiveBash(command);
143
+ }
144
+ if (normalized === "write" || normalized === "edit") {
145
+ const filePath = toolInput?.file_path ?? "";
146
+ return isOutsideWorkspace(filePath, workspaceRoot);
147
+ }
148
+ return false;
149
+ }
150
+ function wrapWithInjectionGuard(toolName, handler, options = {}) {
151
+ const projectRoot = options.projectRoot ?? process.cwd();
152
+ const sessionId = options.sessionId ?? "default";
153
+ return async (input) => {
154
+ try {
155
+ const taintCheck = checkTaint(projectRoot, sessionId);
156
+ if (taintCheck.tainted && isDestructiveOperation(toolName, input, projectRoot)) {
157
+ return {
158
+ content: [
159
+ {
160
+ type: "text",
161
+ text: `BLOCKED by Sentinel: "${toolName}" blocked during tainted session. Destructive operations are restricted. Run "harness taint clear" to lift.`
162
+ }
163
+ ],
164
+ isError: true
165
+ };
166
+ }
167
+ const textToScan = extractInputText(toolName, input);
168
+ if (textToScan) {
169
+ const findings = scanForInjection(textToScan);
170
+ const actionable = findings.filter(
171
+ (f) => f.severity === "high" || f.severity === "medium"
172
+ );
173
+ if (actionable.length > 0) {
174
+ writeTaint(
175
+ projectRoot,
176
+ sessionId,
177
+ `Injection pattern detected in MCP:${toolName} input`,
178
+ actionable,
179
+ `MCP:${toolName}`
180
+ );
181
+ }
182
+ }
183
+ const result = await handler(input);
184
+ const outputText = extractResultText(result);
185
+ if (outputText) {
186
+ const outputFindings = scanForInjection(outputText);
187
+ const actionableOutput = outputFindings.filter(
188
+ (f) => f.severity === "high" || f.severity === "medium"
189
+ );
190
+ if (actionableOutput.length > 0) {
191
+ writeTaint(
192
+ projectRoot,
193
+ sessionId,
194
+ `Injection pattern detected in MCP:${toolName} result`,
195
+ actionableOutput,
196
+ `MCP:${toolName}:output`
197
+ );
198
+ const warningLines = actionableOutput.map(
199
+ (f) => `Sentinel [${f.severity}] ${f.ruleId}: detected in ${toolName} output`
200
+ );
201
+ result.content.push({
202
+ type: "text",
203
+ text: `
204
+ ---
205
+ Sentinel Warning: ${warningLines.join("; ")}`
206
+ });
207
+ }
208
+ }
209
+ return result;
210
+ } catch {
211
+ return handler(input);
212
+ }
213
+ };
214
+ }
215
+ function applyInjectionGuard(handlers, options = {}) {
216
+ const wrapped = {};
217
+ for (const [name, handler] of Object.entries(handlers)) {
218
+ wrapped[name] = wrapWithInjectionGuard(name, handler, options);
219
+ }
220
+ return wrapped;
221
+ }
222
+
97
223
  // src/mcp/tools/linter.ts
98
224
  var generateLinterDefinition = {
99
225
  name: "generate_linter",
@@ -428,7 +554,7 @@ ${skippedMsg}`
428
554
  async function handleInitProject(input) {
429
555
  const i = input;
430
556
  try {
431
- const { TemplateEngine } = await import("./engine-3RB7MXPP.js");
557
+ const { TemplateEngine } = await import("./engine-VS6ZJ2VZ.js");
432
558
  const engine = new TemplateEngine(resolveTemplatesDir());
433
559
  const safePath = sanitizePath(i.path);
434
560
  const detected = tryDetectFramework(engine, safePath, i);
@@ -449,7 +575,7 @@ var listPersonasDefinition = {
449
575
  inputSchema: { type: "object", properties: {} }
450
576
  };
451
577
  async function handleListPersonas() {
452
- const { listPersonas } = await import("./loader-UUTVMQCC.js");
578
+ const { listPersonas } = await import("./loader-B4XWX4K6.js");
453
579
  const result = listPersonas(resolvePersonasDir());
454
580
  return resultToMcpResponse(result);
455
581
  }
@@ -473,10 +599,10 @@ async function handleGeneratePersonaArtifacts(input) {
473
599
  if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.name)) {
474
600
  return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.name}`)));
475
601
  }
476
- const { loadPersona } = await import("./loader-UUTVMQCC.js");
477
- const { generateRuntime } = await import("./runtime-BCK5RRZQ.js");
478
- const { generateAgentsMd } = await import("./agents-md-ZGNIDWAF.js");
479
- const { generateCIWorkflow } = await import("./ci-workflow-765LSHRD.js");
602
+ const { loadPersona } = await import("./loader-B4XWX4K6.js");
603
+ const { generateRuntime } = await import("./runtime-YHVLJNPG.js");
604
+ const { generateAgentsMd } = await import("./agents-md-DUYNKHJZ.js");
605
+ const { generateCIWorkflow } = await import("./ci-workflow-FJZMNZPT.js");
480
606
  const personasDir = resolvePersonasDir();
481
607
  const filePath = path3.join(personasDir, `${input.name}.yaml`);
482
608
  if (!filePath.startsWith(personasDir)) {
@@ -531,9 +657,9 @@ async function handleRunPersona(input) {
531
657
  if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.persona)) {
532
658
  return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.persona}`)));
533
659
  }
534
- const { loadPersona } = await import("./loader-UUTVMQCC.js");
660
+ const { loadPersona } = await import("./loader-B4XWX4K6.js");
535
661
  const { runPersona } = await import("./runner-VMYLHWOC.js");
536
- const { executeSkill } = await import("./skill-executor-XZLYZYAK.js");
662
+ const { executeSkill } = await import("./skill-executor-XEVDGXUM.js");
537
663
  const personasDir = resolvePersonasDir();
538
664
  const filePath = path3.join(personasDir, `${input.persona}.yaml`);
539
665
  if (!filePath.startsWith(personasDir)) {
@@ -944,8 +1070,8 @@ var runSkillDefinition = {
944
1070
  path: { type: "string", description: "Path to project root for state context injection" },
945
1071
  complexity: {
946
1072
  type: "string",
947
- enum: ["auto", "light", "full"],
948
- description: "Complexity level for scale-adaptive rigor"
1073
+ enum: ["fast", "standard", "thorough"],
1074
+ description: "Rigor level: fast (minimal), standard (default), thorough (full)"
949
1075
  },
950
1076
  phase: { type: "string", description: "Start at a specific phase (re-entry)" },
951
1077
  party: { type: "boolean", description: "Enable multi-perspective evaluation" }
@@ -1031,7 +1157,7 @@ var createSkillDefinition = {
1031
1157
  };
1032
1158
  async function handleCreateSkill(input) {
1033
1159
  try {
1034
- const { generateSkillFiles } = await import("./create-skill-XSWHMSM5.js");
1160
+ const { generateSkillFiles } = await import("./create-skill-NDXQSTIK.js");
1035
1161
  const result = generateSkillFiles({
1036
1162
  name: input.name,
1037
1163
  description: input.description,
@@ -1149,18 +1275,62 @@ async function autoSyncRoadmap(projectPath) {
1149
1275
  try {
1150
1276
  const roadmapFile = path11.join(projectPath, "docs", "roadmap.md");
1151
1277
  if (!fs10.existsSync(roadmapFile)) return;
1152
- const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-ALQDD67R.js");
1278
+ const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-MF5BK5AD.js");
1153
1279
  const raw = fs10.readFileSync(roadmapFile, "utf-8");
1154
1280
  const parseResult = parseRoadmap(raw);
1155
1281
  if (!parseResult.ok) return;
1156
1282
  const roadmap = parseResult.value;
1157
1283
  const syncResult = syncRoadmap({ projectPath, roadmap });
1158
- if (!syncResult.ok || syncResult.value.length === 0) return;
1284
+ if (!syncResult.ok || syncResult.value.length === 0) {
1285
+ await triggerExternalSync(projectPath, roadmapFile);
1286
+ return;
1287
+ }
1159
1288
  applySyncChanges(roadmap, syncResult.value);
1160
1289
  fs10.writeFileSync(roadmapFile, serializeRoadmap(roadmap), "utf-8");
1290
+ await triggerExternalSync(projectPath, roadmapFile);
1161
1291
  } catch {
1162
1292
  }
1163
1293
  }
1294
+ async function triggerExternalSync(projectPath, roadmapFile) {
1295
+ try {
1296
+ const trackerConfig = loadTrackerConfig(projectPath);
1297
+ if (!trackerConfig) return;
1298
+ const token = process.env.GITHUB_TOKEN;
1299
+ if (!token) return;
1300
+ const { fullSync, GitHubIssuesSyncAdapter } = await import("./dist-MF5BK5AD.js");
1301
+ const adapter = new GitHubIssuesSyncAdapter({
1302
+ token,
1303
+ config: trackerConfig
1304
+ });
1305
+ const result = await fullSync(roadmapFile, adapter, trackerConfig);
1306
+ if (result.errors.length > 0) {
1307
+ for (const err of result.errors) {
1308
+ console.error(
1309
+ `[roadmap-sync] External sync error for ${err.featureOrId}: ${err.error.message}`
1310
+ );
1311
+ }
1312
+ }
1313
+ } catch (error) {
1314
+ console.error(
1315
+ `[roadmap-sync] External sync failed: ${error instanceof Error ? error.message : String(error)}`
1316
+ );
1317
+ }
1318
+ }
1319
+ function loadTrackerConfig(projectPath) {
1320
+ try {
1321
+ const configPath = path11.join(projectPath, "harness.config.json");
1322
+ if (!fs10.existsSync(configPath)) return null;
1323
+ const raw = fs10.readFileSync(configPath, "utf-8");
1324
+ const config = JSON.parse(raw);
1325
+ const trackerRaw = config.roadmap?.tracker;
1326
+ if (!trackerRaw) return null;
1327
+ const parsed = TrackerConfigSchema.safeParse(trackerRaw);
1328
+ if (!parsed.success) return null;
1329
+ return parsed.data;
1330
+ } catch {
1331
+ return null;
1332
+ }
1333
+ }
1164
1334
 
1165
1335
  // src/mcp/utils.ts
1166
1336
  function mcpError(text) {
@@ -1190,7 +1360,11 @@ var manageStateDefinition = {
1190
1360
  "update_entry_status",
1191
1361
  "read_section",
1192
1362
  "read_sections",
1193
- "archive_session"
1363
+ "archive_session",
1364
+ "task-start",
1365
+ "task-complete",
1366
+ "phase-start",
1367
+ "phase-complete"
1194
1368
  ],
1195
1369
  description: "Action to perform"
1196
1370
  },
@@ -1235,12 +1409,12 @@ var manageStateDefinition = {
1235
1409
  }
1236
1410
  };
1237
1411
  async function handleShow(projectPath, input) {
1238
- const { loadState } = await import("./dist-ALQDD67R.js");
1412
+ const { loadState } = await import("./dist-MF5BK5AD.js");
1239
1413
  return resultToMcpResponse(await loadState(projectPath, input.stream, input.session));
1240
1414
  }
1241
1415
  async function handleLearn(projectPath, input) {
1242
1416
  if (!input.learning) return mcpError("Error: learning is required for learn action");
1243
- const { appendLearning } = await import("./dist-ALQDD67R.js");
1417
+ const { appendLearning } = await import("./dist-MF5BK5AD.js");
1244
1418
  const result = await appendLearning(
1245
1419
  projectPath,
1246
1420
  input.learning,
@@ -1255,7 +1429,7 @@ async function handleLearn(projectPath, input) {
1255
1429
  async function handleFailure(projectPath, input) {
1256
1430
  if (!input.description) return mcpError("Error: description is required for failure action");
1257
1431
  if (!input.failureType) return mcpError("Error: failureType is required for failure action");
1258
- const { appendFailure } = await import("./dist-ALQDD67R.js");
1432
+ const { appendFailure } = await import("./dist-MF5BK5AD.js");
1259
1433
  const result = await appendFailure(
1260
1434
  projectPath,
1261
1435
  input.description,
@@ -1268,24 +1442,24 @@ async function handleFailure(projectPath, input) {
1268
1442
  return resultToMcpResponse(Ok({ recorded: true }));
1269
1443
  }
1270
1444
  async function handleArchive(projectPath, input) {
1271
- const { archiveFailures } = await import("./dist-ALQDD67R.js");
1445
+ const { archiveFailures } = await import("./dist-MF5BK5AD.js");
1272
1446
  const result = await archiveFailures(projectPath, input.stream, input.session);
1273
1447
  if (!result.ok) return resultToMcpResponse(result);
1274
1448
  return resultToMcpResponse(Ok({ archived: true }));
1275
1449
  }
1276
1450
  async function handleReset(projectPath, input) {
1277
- const { saveState, DEFAULT_STATE } = await import("./dist-ALQDD67R.js");
1451
+ const { saveState, DEFAULT_STATE } = await import("./dist-MF5BK5AD.js");
1278
1452
  const result = await saveState(projectPath, { ...DEFAULT_STATE }, input.stream, input.session);
1279
1453
  if (!result.ok) return resultToMcpResponse(result);
1280
1454
  return resultToMcpResponse(Ok({ reset: true }));
1281
1455
  }
1282
1456
  async function handleGate(projectPath, _input) {
1283
- const { runMechanicalGate } = await import("./dist-ALQDD67R.js");
1457
+ const { runMechanicalGate } = await import("./dist-MF5BK5AD.js");
1284
1458
  return resultToMcpResponse(await runMechanicalGate(projectPath));
1285
1459
  }
1286
1460
  async function handleSaveHandoff(projectPath, input) {
1287
1461
  if (!input.handoff) return mcpError("Error: handoff is required for save-handoff action");
1288
- const { saveHandoff } = await import("./dist-ALQDD67R.js");
1462
+ const { saveHandoff } = await import("./dist-MF5BK5AD.js");
1289
1463
  const result = await saveHandoff(
1290
1464
  projectPath,
1291
1465
  input.handoff,
@@ -1297,7 +1471,7 @@ async function handleSaveHandoff(projectPath, input) {
1297
1471
  return resultToMcpResponse(Ok({ saved: true }));
1298
1472
  }
1299
1473
  async function handleLoadHandoff(projectPath, input) {
1300
- const { loadHandoff } = await import("./dist-ALQDD67R.js");
1474
+ const { loadHandoff } = await import("./dist-MF5BK5AD.js");
1301
1475
  return resultToMcpResponse(await loadHandoff(projectPath, input.stream, input.session));
1302
1476
  }
1303
1477
  async function handleAppendEntry(projectPath, input) {
@@ -1305,7 +1479,7 @@ async function handleAppendEntry(projectPath, input) {
1305
1479
  if (!input.section) return mcpError("Error: section is required for append_entry action");
1306
1480
  if (!input.authorSkill) return mcpError("Error: authorSkill is required for append_entry action");
1307
1481
  if (!input.content) return mcpError("Error: content is required for append_entry action");
1308
- const { appendSessionEntry } = await import("./dist-ALQDD67R.js");
1482
+ const { appendSessionEntry } = await import("./dist-MF5BK5AD.js");
1309
1483
  const result = await appendSessionEntry(
1310
1484
  projectPath,
1311
1485
  input.session,
@@ -1321,7 +1495,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
1321
1495
  if (!input.entryId) return mcpError("Error: entryId is required for update_entry_status action");
1322
1496
  if (!input.newStatus)
1323
1497
  return mcpError("Error: newStatus is required for update_entry_status action");
1324
- const { updateSessionEntryStatus } = await import("./dist-ALQDD67R.js");
1498
+ const { updateSessionEntryStatus } = await import("./dist-MF5BK5AD.js");
1325
1499
  const result = await updateSessionEntryStatus(
1326
1500
  projectPath,
1327
1501
  input.session,
@@ -1334,7 +1508,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
1334
1508
  async function handleReadSection(projectPath, input) {
1335
1509
  if (!input.session) return mcpError("Error: session is required for read_section action");
1336
1510
  if (!input.section) return mcpError("Error: section is required for read_section action");
1337
- const { readSessionSection } = await import("./dist-ALQDD67R.js");
1511
+ const { readSessionSection } = await import("./dist-MF5BK5AD.js");
1338
1512
  const result = await readSessionSection(
1339
1513
  projectPath,
1340
1514
  input.session,
@@ -1344,18 +1518,34 @@ async function handleReadSection(projectPath, input) {
1344
1518
  }
1345
1519
  async function handleReadSections(projectPath, input) {
1346
1520
  if (!input.session) return mcpError("Error: session is required for read_sections action");
1347
- const { readSessionSections } = await import("./dist-ALQDD67R.js");
1521
+ const { readSessionSections } = await import("./dist-MF5BK5AD.js");
1348
1522
  const result = await readSessionSections(projectPath, input.session);
1349
1523
  return resultToMcpResponse(result);
1350
1524
  }
1351
1525
  async function handleArchiveSession(projectPath, input) {
1352
1526
  if (!input.session) return mcpError("Error: session is required for archive_session action");
1353
- const { archiveSession } = await import("./dist-ALQDD67R.js");
1527
+ const { archiveSession } = await import("./dist-MF5BK5AD.js");
1354
1528
  const result = await archiveSession(projectPath, input.session);
1355
1529
  if (!result.ok) return resultToMcpResponse(result);
1356
1530
  await autoSyncRoadmap(projectPath);
1357
1531
  return resultToMcpResponse(Ok({ archived: true }));
1358
1532
  }
1533
+ async function handleTaskStart(projectPath, _input) {
1534
+ await autoSyncRoadmap(projectPath);
1535
+ return resultToMcpResponse(Ok({ synced: true, trigger: "task-start" }));
1536
+ }
1537
+ async function handleTaskComplete(projectPath, _input) {
1538
+ await autoSyncRoadmap(projectPath);
1539
+ return resultToMcpResponse(Ok({ synced: true, trigger: "task-complete" }));
1540
+ }
1541
+ async function handlePhaseStart(projectPath, _input) {
1542
+ await autoSyncRoadmap(projectPath);
1543
+ return resultToMcpResponse(Ok({ synced: true, trigger: "phase-start" }));
1544
+ }
1545
+ async function handlePhaseComplete(projectPath, _input) {
1546
+ await autoSyncRoadmap(projectPath);
1547
+ return resultToMcpResponse(Ok({ synced: true, trigger: "phase-complete" }));
1548
+ }
1359
1549
  var ACTION_HANDLERS = {
1360
1550
  show: handleShow,
1361
1551
  learn: handleLearn,
@@ -1369,7 +1559,11 @@ var ACTION_HANDLERS = {
1369
1559
  update_entry_status: handleUpdateEntryStatus,
1370
1560
  read_section: handleReadSection,
1371
1561
  read_sections: handleReadSections,
1372
- archive_session: handleArchiveSession
1562
+ archive_session: handleArchiveSession,
1563
+ "task-start": handleTaskStart,
1564
+ "task-complete": handleTaskComplete,
1565
+ "phase-start": handlePhaseStart,
1566
+ "phase-complete": handlePhaseComplete
1373
1567
  };
1374
1568
  async function handleManageState(input) {
1375
1569
  try {
@@ -1394,7 +1588,7 @@ var listStreamsDefinition = {
1394
1588
  };
1395
1589
  async function handleListStreams(input) {
1396
1590
  try {
1397
- const { listStreams, loadStreamIndex } = await import("./dist-ALQDD67R.js");
1591
+ const { listStreams, loadStreamIndex } = await import("./dist-MF5BK5AD.js");
1398
1592
  const projectPath = sanitizePath(input.path);
1399
1593
  const indexResult = await loadStreamIndex(projectPath);
1400
1594
  const streamsResult = await listStreams(projectPath);
@@ -1432,7 +1626,7 @@ var checkPhaseGateDefinition = {
1432
1626
  };
1433
1627
  async function handleCheckPhaseGate(input) {
1434
1628
  try {
1435
- const { runCheckPhaseGate } = await import("./check-phase-gate-ZOXVBDCN.js");
1629
+ const { runCheckPhaseGate } = await import("./check-phase-gate-OSHN2AEL.js");
1436
1630
  const result = await runCheckPhaseGate({ cwd: sanitizePath(input.path) });
1437
1631
  if (result.ok) {
1438
1632
  return { content: [{ type: "text", text: JSON.stringify(result.value) }] };
@@ -1488,7 +1682,7 @@ async function handleValidateCrossCheck(input) {
1488
1682
  };
1489
1683
  }
1490
1684
  try {
1491
- const { runCrossCheck } = await import("./validate-cross-check-OABMREW4.js");
1685
+ const { runCrossCheck } = await import("./validate-cross-check-YTDWIMFI.js");
1492
1686
  const specsDir = path12.resolve(projectPath, input.specsDir ?? "docs/specs");
1493
1687
  if (!specsDir.startsWith(projectPath)) {
1494
1688
  return {
@@ -1527,8 +1721,8 @@ async function handleValidateCrossCheck(input) {
1527
1721
 
1528
1722
  // src/commands/generate-slash-commands.ts
1529
1723
  import { Command } from "commander";
1530
- import fs12 from "fs";
1531
- import path14 from "path";
1724
+ import fs13 from "fs";
1725
+ import path15 from "path";
1532
1726
  import os from "os";
1533
1727
  import readline from "readline";
1534
1728
 
@@ -1560,8 +1754,12 @@ function readSkillYaml(yamlPath) {
1560
1754
  }
1561
1755
  return SkillMetadataSchema.safeParse(parse3(raw));
1562
1756
  }
1757
+ var DERIVED_FROM_CLAUDE_CODE = ["cursor", "codex"];
1563
1758
  function shouldSkipSkill(meta, platforms) {
1564
- const matchesPlatform = platforms.some((p) => meta.platforms.includes(p));
1759
+ const effectivePlatforms = platforms.map(
1760
+ (p) => DERIVED_FROM_CLAUDE_CODE.includes(p) ? "claude-code" : p
1761
+ );
1762
+ const matchesPlatform = effectivePlatforms.some((p) => meta.platforms.includes(p));
1565
1763
  if (!matchesPlatform) return true;
1566
1764
  if (meta.tier === 3 || meta.internal) return true;
1567
1765
  return false;
@@ -1642,6 +1840,7 @@ function buildSpec(meta, normalized, entry, skillsDir, source) {
1642
1840
  sourceDir: entry.name,
1643
1841
  skillsBaseDir: skillsDir,
1644
1842
  source,
1843
+ ...meta.cursor ? { cursor: meta.cursor } : {},
1645
1844
  prompt: {
1646
1845
  context: buildContextLines(meta).join("\n"),
1647
1846
  objective: buildObjectiveLines(meta).join("\n"),
@@ -1766,27 +1965,140 @@ function renderGemini(spec, skillMdContent, skillYamlContent) {
1766
1965
  return lines.join("\n");
1767
1966
  }
1768
1967
 
1968
+ // src/slash-commands/render-cursor.ts
1969
+ function renderCursor(spec, skillMdContent, cursorConfig) {
1970
+ const lines = ["---"];
1971
+ lines.push(`description: ${spec.description}`);
1972
+ if (cursorConfig?.globs && cursorConfig.globs.length > 0) {
1973
+ lines.push("globs:");
1974
+ for (const glob of cursorConfig.globs) {
1975
+ lines.push(` - ${glob}`);
1976
+ }
1977
+ }
1978
+ const alwaysApply = cursorConfig?.alwaysApply ?? false;
1979
+ lines.push(`alwaysApply: ${alwaysApply}`);
1980
+ lines.push("---");
1981
+ lines.push("");
1982
+ lines.push(GENERATED_HEADER_CURSOR);
1983
+ lines.push("");
1984
+ lines.push(skillMdContent);
1985
+ lines.push("");
1986
+ return lines.join("\n");
1987
+ }
1988
+
1989
+ // src/slash-commands/render-codex.ts
1990
+ function renderCodexSkill(skillMdContent) {
1991
+ return `<!-- ${GENERATED_HEADER_CODEX.replace(/<!--\s*|\s*-->/g, "").trim()} -->
1992
+
1993
+ ${skillMdContent}
1994
+ `;
1995
+ }
1996
+ function renderCodexOpenaiYaml(spec) {
1997
+ return [
1998
+ "# Reserved for Phase B native integration",
1999
+ `name: ${spec.skillYamlName}`,
2000
+ `version: "1.0.0"`,
2001
+ ""
2002
+ ].join("\n");
2003
+ }
2004
+ function renderCodexAgentsMd(specs) {
2005
+ const lines = [];
2006
+ lines.push(`<!-- ${GENERATED_HEADER_CODEX.replace(/<!--\s*|\s*-->/g, "").trim()} -->`);
2007
+ lines.push("");
2008
+ lines.push("# Harness Skills");
2009
+ lines.push("");
2010
+ lines.push(
2011
+ "This file bootstraps harness context for Codex CLI. Each skill is available as a structured workflow in the `harness/` directory."
2012
+ );
2013
+ lines.push("");
2014
+ lines.push("## Available Skills");
2015
+ lines.push("");
2016
+ for (const spec of specs) {
2017
+ lines.push(`- **${spec.skillYamlName}** \u2014 ${spec.description}`);
2018
+ }
2019
+ lines.push("");
2020
+ return lines.join("\n");
2021
+ }
2022
+
2023
+ // src/slash-commands/sync-codex.ts
2024
+ import fs12 from "fs";
2025
+ import path14 from "path";
2026
+ function computeCodexSync(outputDir, specs, dryRun) {
2027
+ const added = [];
2028
+ const updated = [];
2029
+ const unchanged = [];
2030
+ const specSkillNames = /* @__PURE__ */ new Set();
2031
+ for (const spec of specs) {
2032
+ const mdPath = path14.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
2033
+ const skillMd = fs12.existsSync(mdPath) ? fs12.readFileSync(mdPath, "utf-8") : "";
2034
+ const skillDir = path14.join(outputDir, spec.skillYamlName);
2035
+ specSkillNames.add(spec.skillYamlName);
2036
+ const renderedSkillMd = renderCodexSkill(skillMd);
2037
+ const renderedOpenaiYaml = renderCodexOpenaiYaml(spec);
2038
+ const existingSkillMdPath = path14.join(skillDir, "SKILL.md");
2039
+ const existingOpenaiYamlPath = path14.join(skillDir, "agents", "openai.yaml");
2040
+ if (!fs12.existsSync(skillDir)) {
2041
+ added.push(spec.skillYamlName);
2042
+ } else {
2043
+ const existingSkillMd = fs12.existsSync(existingSkillMdPath) ? fs12.readFileSync(existingSkillMdPath, "utf-8") : "";
2044
+ const existingOpenaiYaml = fs12.existsSync(existingOpenaiYamlPath) ? fs12.readFileSync(existingOpenaiYamlPath, "utf-8") : "";
2045
+ if (existingSkillMd === renderedSkillMd && existingOpenaiYaml === renderedOpenaiYaml) {
2046
+ unchanged.push(spec.skillYamlName);
2047
+ } else {
2048
+ updated.push(spec.skillYamlName);
2049
+ }
2050
+ }
2051
+ if (!dryRun && !unchanged.includes(spec.skillYamlName)) {
2052
+ const agentsSubDir = path14.join(skillDir, "agents");
2053
+ fs12.mkdirSync(agentsSubDir, { recursive: true });
2054
+ fs12.writeFileSync(existingSkillMdPath, renderedSkillMd, "utf-8");
2055
+ fs12.writeFileSync(existingOpenaiYamlPath, renderedOpenaiYaml, "utf-8");
2056
+ }
2057
+ }
2058
+ const removed = detectCodexOrphans(outputDir, specSkillNames);
2059
+ return { added, updated, removed, unchanged };
2060
+ }
2061
+ function detectCodexOrphans(outputDir, specSkillNames) {
2062
+ const removed = [];
2063
+ if (!fs12.existsSync(outputDir)) return removed;
2064
+ const existingDirs = fs12.readdirSync(outputDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
2065
+ for (const dirName of existingDirs) {
2066
+ if (specSkillNames.has(dirName)) continue;
2067
+ const skillMdPath = path14.join(outputDir, dirName, "SKILL.md");
2068
+ if (fs12.existsSync(skillMdPath)) {
2069
+ const content = fs12.readFileSync(skillMdPath, "utf-8");
2070
+ if (content.includes(GENERATED_HEADER_CODEX)) {
2071
+ removed.push(dirName);
2072
+ }
2073
+ }
2074
+ }
2075
+ return removed;
2076
+ }
2077
+
1769
2078
  // src/commands/generate-slash-commands.ts
1770
2079
  function resolveOutputDir(platform, opts) {
1771
2080
  if (opts.output) {
1772
- return path14.join(opts.output, "harness");
2081
+ return path15.join(opts.output, "harness");
1773
2082
  }
1774
2083
  if (opts.global) {
1775
2084
  const home = os.homedir();
1776
- return platform === "claude-code" ? path14.join(home, ".claude", "commands", "harness") : path14.join(home, ".gemini", "commands", "harness");
2085
+ if (platform === "claude-code") return path15.join(home, ".claude", "commands", "harness");
2086
+ if (platform === "gemini-cli") return path15.join(home, ".gemini", "commands", "harness");
2087
+ if (platform === "cursor") return path15.join(home, ".cursor", "rules", "harness");
2088
+ return path15.join(home, ".codex", "harness");
1777
2089
  }
1778
- return platform === "claude-code" ? path14.join("agents", "commands", "claude-code", "harness") : path14.join("agents", "commands", "gemini-cli", "harness");
1779
- }
1780
- function fileExtension(platform) {
1781
- return platform === "claude-code" ? ".md" : ".toml";
2090
+ if (platform === "claude-code") return path15.join("agents", "commands", "claude-code", "harness");
2091
+ if (platform === "gemini-cli") return path15.join("agents", "commands", "gemini-cli", "harness");
2092
+ if (platform === "cursor") return path15.join("agents", "commands", "cursor", "harness");
2093
+ return path15.join("agents", "commands", "codex", "harness");
1782
2094
  }
1783
2095
  async function confirmDeletion(files) {
1784
2096
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
1785
- return new Promise((resolve2) => {
2097
+ return new Promise((resolve3) => {
1786
2098
  rl.question(`
1787
2099
  Remove ${files.length} orphaned command(s)? (y/N) `, (answer) => {
1788
2100
  rl.close();
1789
- resolve2(answer.toLowerCase() === "y");
2101
+ resolve3(answer.toLowerCase() === "y");
1790
2102
  });
1791
2103
  });
1792
2104
  }
@@ -1800,12 +2112,12 @@ function resolveSkillSources(opts) {
1800
2112
  sources.push({ dir: projectDir, source: "project" });
1801
2113
  }
1802
2114
  const communityDir = resolveCommunitySkillsDir();
1803
- if (fs12.existsSync(communityDir)) {
2115
+ if (fs13.existsSync(communityDir)) {
1804
2116
  sources.push({ dir: communityDir, source: "community" });
1805
2117
  }
1806
2118
  if (opts.includeGlobal || sources.length === 0) {
1807
2119
  const globalDir = resolveGlobalSkillsDir();
1808
- if (!projectDir || path14.resolve(globalDir) !== path14.resolve(projectDir)) {
2120
+ if (!projectDir || path15.resolve(globalDir) !== path15.resolve(projectDir)) {
1809
2121
  sources.push({ dir: globalDir, source: "global" });
1810
2122
  }
1811
2123
  }
@@ -1817,12 +2129,26 @@ function generateSlashCommands(opts) {
1817
2129
  const results = [];
1818
2130
  for (const platform of opts.platforms) {
1819
2131
  const outputDir = resolveOutputDir(platform, opts);
1820
- const ext = fileExtension(platform);
1821
2132
  const useAbsolutePaths = opts.global;
1822
2133
  const rendered = /* @__PURE__ */ new Map();
2134
+ if (platform === "codex") {
2135
+ const codexSync = computeCodexSync(outputDir, specs, opts.dryRun);
2136
+ const codexRoot = path15.dirname(outputDir);
2137
+ if (!opts.dryRun) {
2138
+ fs13.mkdirSync(codexRoot, { recursive: true });
2139
+ fs13.writeFileSync(path15.join(codexRoot, "AGENTS.md"), renderCodexAgentsMd(specs), "utf-8");
2140
+ }
2141
+ results.push({ platform, ...codexSync, outputDir });
2142
+ continue;
2143
+ }
1823
2144
  for (const spec of specs) {
1824
- const filename = `${spec.name}${ext}`;
1825
- if (platform === "claude-code") {
2145
+ if (platform === "cursor") {
2146
+ const filename = `${spec.skillYamlName}.mdc`;
2147
+ const mdPath = path15.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
2148
+ const skillMd = fs13.existsSync(mdPath) ? fs13.readFileSync(mdPath, "utf-8") : "";
2149
+ rendered.set(filename, renderCursor(spec, skillMd, spec.cursor));
2150
+ } else if (platform === "claude-code") {
2151
+ const filename = `${spec.name}.md`;
1826
2152
  const renderSpec = useAbsolutePaths ? {
1827
2153
  ...spec,
1828
2154
  prompt: {
@@ -1830,7 +2156,7 @@ function generateSlashCommands(opts) {
1830
2156
  executionContext: spec.prompt.executionContext.split("\n").map((line) => {
1831
2157
  if (line.startsWith("@")) {
1832
2158
  const relPath = line.slice(1);
1833
- return `@${path14.resolve(relPath)}`;
2159
+ return `@${path15.resolve(relPath)}`;
1834
2160
  }
1835
2161
  return line;
1836
2162
  }).join("\n")
@@ -1838,10 +2164,11 @@ function generateSlashCommands(opts) {
1838
2164
  } : spec;
1839
2165
  rendered.set(filename, renderClaudeCode(renderSpec));
1840
2166
  } else {
1841
- const mdPath = path14.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
1842
- const yamlPath = path14.join(spec.skillsBaseDir, spec.sourceDir, "skill.yaml");
1843
- const mdContent = fs12.existsSync(mdPath) ? fs12.readFileSync(mdPath, "utf-8") : "";
1844
- const yamlContent = fs12.existsSync(yamlPath) ? fs12.readFileSync(yamlPath, "utf-8") : "";
2167
+ const filename = `${spec.name}.toml`;
2168
+ const mdPath = path15.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
2169
+ const yamlPath = path15.join(spec.skillsBaseDir, spec.sourceDir, "skill.yaml");
2170
+ const mdContent = fs13.existsSync(mdPath) ? fs13.readFileSync(mdPath, "utf-8") : "";
2171
+ const yamlContent = fs13.existsSync(yamlPath) ? fs13.readFileSync(yamlPath, "utf-8") : "";
1845
2172
  rendered.set(filename, renderGemini(spec, mdContent, yamlContent));
1846
2173
  }
1847
2174
  }
@@ -1867,9 +2194,14 @@ async function handleOrphanDeletion(results, opts) {
1867
2194
  const shouldDelete = opts.yes || await confirmDeletion(result.removed);
1868
2195
  if (shouldDelete) {
1869
2196
  for (const filename of result.removed) {
1870
- const filePath = path14.join(result.outputDir, filename);
1871
- if (fs12.existsSync(filePath)) {
1872
- fs12.unlinkSync(filePath);
2197
+ const filePath = path15.join(result.outputDir, filename);
2198
+ if (fs13.existsSync(filePath)) {
2199
+ const stat = fs13.statSync(filePath);
2200
+ if (stat.isDirectory()) {
2201
+ fs13.rmSync(filePath, { recursive: true, force: true });
2202
+ } else {
2203
+ fs13.unlinkSync(filePath);
2204
+ }
1873
2205
  }
1874
2206
  }
1875
2207
  }
@@ -1877,7 +2209,7 @@ async function handleOrphanDeletion(results, opts) {
1877
2209
  }
1878
2210
  function createGenerateSlashCommandsCommand() {
1879
2211
  return new Command("generate-slash-commands").description(
1880
- "Generate native slash commands for Claude Code and Gemini CLI from skill metadata"
2212
+ "Generate native commands for Claude Code, Gemini CLI, Codex CLI, and Cursor from skill metadata"
1881
2213
  ).option("--platforms <list>", "Target platforms (comma-separated)", "claude-code,gemini-cli").option("--global", "Write to global config directories", false).option("--include-global", "Include built-in global skills alongside project skills", false).option("--output <dir>", "Custom output directory").option("--skills-dir <path>", "Skills directory to scan").option("--dry-run", "Show what would change without writing", false).option("--yes", "Skip deletion confirmation prompts", false).action(async (opts, cmd) => {
1882
2214
  const globalOpts = cmd.optsWithGlobals();
1883
2215
  const platforms = opts.platforms.split(",").map((p) => p.trim());
@@ -1995,7 +2327,7 @@ async function handleGenerateSlashCommands(input) {
1995
2327
  // src/mcp/resources/state.ts
1996
2328
  async function getStateResource(projectRoot) {
1997
2329
  try {
1998
- const { loadState, migrateToStreams } = await import("./dist-ALQDD67R.js");
2330
+ const { loadState, migrateToStreams } = await import("./dist-MF5BK5AD.js");
1999
2331
  await migrateToStreams(projectRoot);
2000
2332
  const result = await loadState(projectRoot);
2001
2333
  if (result.ok) {
@@ -2083,7 +2415,7 @@ async function handleQueryGraph(input) {
2083
2415
  const projectPath = sanitizePath(input.path);
2084
2416
  const store = await loadGraphStore(projectPath);
2085
2417
  if (!store) return graphNotFoundError();
2086
- const { ContextQL } = await import("./dist-B26DFXMP.js");
2418
+ const { ContextQL } = await import("./dist-U7EAO6T2.js");
2087
2419
  const cql = new ContextQL(store);
2088
2420
  const result = cql.execute({
2089
2421
  rootNodeIds: input.rootNodeIds,
@@ -2174,7 +2506,7 @@ async function handleSearchSimilar(input) {
2174
2506
  const projectPath = sanitizePath(input.path);
2175
2507
  const store = await loadGraphStore(projectPath);
2176
2508
  if (!store) return graphNotFoundError();
2177
- const { FusionLayer } = await import("./dist-B26DFXMP.js");
2509
+ const { FusionLayer } = await import("./dist-U7EAO6T2.js");
2178
2510
  const fusion = new FusionLayer(store);
2179
2511
  const results = fusion.search(input.query, input.topK ?? 10);
2180
2512
  if (input.mode === "summary") {
@@ -2229,7 +2561,7 @@ async function handleFindContextFor(input) {
2229
2561
  const projectPath = sanitizePath(input.path);
2230
2562
  const store = await loadGraphStore(projectPath);
2231
2563
  if (!store) return graphNotFoundError();
2232
- const { FusionLayer, ContextQL } = await import("./dist-B26DFXMP.js");
2564
+ const { FusionLayer, ContextQL } = await import("./dist-U7EAO6T2.js");
2233
2565
  const fusion = new FusionLayer(store);
2234
2566
  const cql = new ContextQL(store);
2235
2567
  const tokenBudget = input.tokenBudget ?? 4e3;
@@ -2325,7 +2657,7 @@ async function handleGetRelationships(input) {
2325
2657
  const projectPath = sanitizePath(input.path);
2326
2658
  const store = await loadGraphStore(projectPath);
2327
2659
  if (!store) return graphNotFoundError();
2328
- const { ContextQL } = await import("./dist-B26DFXMP.js");
2660
+ const { ContextQL } = await import("./dist-U7EAO6T2.js");
2329
2661
  const cql = new ContextQL(store);
2330
2662
  const direction = input.direction ?? "both";
2331
2663
  const bidirectional = direction === "both" || direction === "inbound";
@@ -2431,7 +2763,7 @@ async function handleGetImpact(input) {
2431
2763
  const projectPath = sanitizePath(input.path);
2432
2764
  const store = await loadGraphStore(projectPath);
2433
2765
  if (!store) return graphNotFoundError();
2434
- const { ContextQL } = await import("./dist-B26DFXMP.js");
2766
+ const { ContextQL } = await import("./dist-U7EAO6T2.js");
2435
2767
  let targetNodeId = input.nodeId;
2436
2768
  if (!targetNodeId && input.filePath) {
2437
2769
  const fileNodes = store.findNodes({ type: "file" });
@@ -2542,7 +2874,7 @@ async function handleGetImpact(input) {
2542
2874
  }
2543
2875
 
2544
2876
  // src/mcp/tools/graph/ingest-source.ts
2545
- import * as path15 from "path";
2877
+ import * as path16 from "path";
2546
2878
  var ingestSourceDefinition = {
2547
2879
  name: "ingest_source",
2548
2880
  description: "Ingest sources into the project knowledge graph. Supports code analysis, knowledge documents, git history, or all at once.",
@@ -2562,10 +2894,10 @@ var ingestSourceDefinition = {
2562
2894
  async function handleIngestSource(input) {
2563
2895
  try {
2564
2896
  const projectPath = sanitizePath(input.path);
2565
- const graphDir = path15.join(projectPath, ".harness", "graph");
2566
- const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-B26DFXMP.js");
2567
- const fs15 = await import("fs/promises");
2568
- await fs15.mkdir(graphDir, { recursive: true });
2897
+ const graphDir = path16.join(projectPath, ".harness", "graph");
2898
+ const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-U7EAO6T2.js");
2899
+ const fs16 = await import("fs/promises");
2900
+ await fs16.mkdir(graphDir, { recursive: true });
2569
2901
  const store = new GraphStore();
2570
2902
  await store.load(graphDir);
2571
2903
  const results = [];
@@ -2638,7 +2970,7 @@ async function handleDetectAnomalies(input) {
2638
2970
  const projectPath = sanitizePath(input.path);
2639
2971
  const store = await loadGraphStore(projectPath);
2640
2972
  if (!store) return graphNotFoundError();
2641
- const { GraphAnomalyAdapter } = await import("./dist-B26DFXMP.js");
2973
+ const { GraphAnomalyAdapter } = await import("./dist-U7EAO6T2.js");
2642
2974
  const adapter = new GraphAnomalyAdapter(store);
2643
2975
  const report = adapter.detect({
2644
2976
  ...input.threshold !== void 0 && { threshold: input.threshold },
@@ -2678,7 +3010,7 @@ async function handleAskGraph(input) {
2678
3010
  const projectPath = sanitizePath(input.path);
2679
3011
  const store = await loadGraphStore(projectPath);
2680
3012
  if (!store) return graphNotFoundError();
2681
- const { askGraph } = await import("./dist-B26DFXMP.js");
3013
+ const { askGraph } = await import("./dist-U7EAO6T2.js");
2682
3014
  const result = await askGraph(store, input.question);
2683
3015
  return {
2684
3016
  content: [{ type: "text", text: JSON.stringify(result) }]
@@ -2697,8 +3029,8 @@ async function handleAskGraph(input) {
2697
3029
  }
2698
3030
 
2699
3031
  // src/mcp/resources/graph.ts
2700
- import * as fs13 from "fs/promises";
2701
- import * as path16 from "path";
3032
+ import * as fs14 from "fs/promises";
3033
+ import * as path17 from "path";
2702
3034
  var MAX_ITEMS = 5e3;
2703
3035
  function formatStaleness(isoTimestamp) {
2704
3036
  const then = new Date(isoTimestamp).getTime();
@@ -2721,11 +3053,11 @@ async function getGraphResource(projectRoot) {
2721
3053
  message: "No knowledge graph found. Run harness scan to build one."
2722
3054
  });
2723
3055
  }
2724
- const graphDir = path16.join(projectRoot, ".harness", "graph");
2725
- const metadataPath = path16.join(graphDir, "metadata.json");
3056
+ const graphDir = path17.join(projectRoot, ".harness", "graph");
3057
+ const metadataPath = path17.join(graphDir, "metadata.json");
2726
3058
  let lastScanTimestamp = null;
2727
3059
  try {
2728
- const raw = JSON.parse(await fs13.readFile(metadataPath, "utf-8"));
3060
+ const raw = JSON.parse(await fs14.readFile(metadataPath, "utf-8"));
2729
3061
  lastScanTimestamp = raw.lastScanTimestamp ?? null;
2730
3062
  } catch {
2731
3063
  }
@@ -2814,7 +3146,7 @@ var generateAgentDefinitionsDefinition = {
2814
3146
  }
2815
3147
  };
2816
3148
  async function handleGenerateAgentDefinitions(input) {
2817
- const { generateAgentDefinitions } = await import("./generate-agent-definitions-ZAE726AU.js");
3149
+ const { generateAgentDefinitions } = await import("./generate-agent-definitions-EYG263XD.js");
2818
3150
  const platforms = input.platform === "all" || !input.platform ? ["claude-code", "gemini-cli"] : [input.platform];
2819
3151
  const results = generateAgentDefinitions({
2820
3152
  platforms: [...platforms],
@@ -2825,8 +3157,8 @@ async function handleGenerateAgentDefinitions(input) {
2825
3157
  }
2826
3158
 
2827
3159
  // src/mcp/tools/roadmap.ts
2828
- import * as fs14 from "fs";
2829
- import * as path17 from "path";
3160
+ import * as fs15 from "fs";
3161
+ import * as path18 from "path";
2830
3162
  var manageRoadmapDefinition = {
2831
3163
  name: "manage_roadmap",
2832
3164
  description: "Manage the project roadmap: show, add, update, remove, sync features, or query by filter. Reads and writes docs/roadmap.md.",
@@ -2881,21 +3213,21 @@ var manageRoadmapDefinition = {
2881
3213
  }
2882
3214
  };
2883
3215
  function roadmapPath(projectRoot) {
2884
- return path17.join(projectRoot, "docs", "roadmap.md");
3216
+ return path18.join(projectRoot, "docs", "roadmap.md");
2885
3217
  }
2886
3218
  function readRoadmapFile(projectRoot) {
2887
3219
  const filePath = roadmapPath(projectRoot);
2888
3220
  try {
2889
- return fs14.readFileSync(filePath, "utf-8");
3221
+ return fs15.readFileSync(filePath, "utf-8");
2890
3222
  } catch {
2891
3223
  return null;
2892
3224
  }
2893
3225
  }
2894
3226
  function writeRoadmapFile(projectRoot, content) {
2895
3227
  const filePath = roadmapPath(projectRoot);
2896
- const dir = path17.dirname(filePath);
2897
- fs14.mkdirSync(dir, { recursive: true });
2898
- fs14.writeFileSync(filePath, content, "utf-8");
3228
+ const dir = path18.dirname(filePath);
3229
+ fs15.mkdirSync(dir, { recursive: true });
3230
+ fs15.writeFileSync(filePath, content, "utf-8");
2899
3231
  }
2900
3232
  function roadmapNotFoundError() {
2901
3233
  return {
@@ -2982,7 +3314,10 @@ function handleAdd(projectPath, input, deps) {
2982
3314
  spec: input.spec ?? null,
2983
3315
  plans: input.plans ?? [],
2984
3316
  blockedBy: input.blocked_by ?? [],
2985
- summary: input.summary
3317
+ summary: input.summary,
3318
+ assignee: null,
3319
+ priority: null,
3320
+ externalId: null
2986
3321
  });
2987
3322
  roadmap.frontmatter.lastManualEdit = (/* @__PURE__ */ new Date()).toISOString();
2988
3323
  writeRoadmapFile(projectPath, serializeRoadmap(roadmap));
@@ -3108,7 +3443,7 @@ function handleSync(projectPath, input, deps) {
3108
3443
  }
3109
3444
  async function handleManageRoadmap(input) {
3110
3445
  try {
3111
- const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-ALQDD67R.js");
3446
+ const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-MF5BK5AD.js");
3112
3447
  const { Ok: Ok2 } = await import("./dist-USY2C5JL.js");
3113
3448
  const projectPath = sanitizePath(input.path);
3114
3449
  const deps = { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges, Ok: Ok2 };
@@ -3536,7 +3871,7 @@ async function handleTransition(validInput, projectPath, id) {
3536
3871
  const transition = transitionResult.data;
3537
3872
  const prompt = renderTransition(transition);
3538
3873
  try {
3539
- const { saveHandoff } = await import("./dist-ALQDD67R.js");
3874
+ const { saveHandoff } = await import("./dist-MF5BK5AD.js");
3540
3875
  await saveHandoff(
3541
3876
  projectPath,
3542
3877
  {
@@ -3606,7 +3941,7 @@ async function handleEmitInteraction(input) {
3606
3941
  }
3607
3942
  async function recordInteraction(projectPath, id, type, decision, stream) {
3608
3943
  try {
3609
- const { loadState, saveState } = await import("./dist-ALQDD67R.js");
3944
+ const { loadState, saveState } = await import("./dist-MF5BK5AD.js");
3610
3945
  const stateResult = await loadState(projectPath, stream);
3611
3946
  if (stateResult.ok) {
3612
3947
  const state = stateResult.value;
@@ -3695,10 +4030,10 @@ async function handleGatherContext(input) {
3695
4030
  input.include ?? ["state", "learnings", "handoff", "graph", "validation"]
3696
4031
  );
3697
4032
  const errors = [];
3698
- const statePromise = includeSet.has("state") ? import("./dist-ALQDD67R.js").then(
4033
+ const statePromise = includeSet.has("state") ? import("./dist-MF5BK5AD.js").then(
3699
4034
  (core) => core.loadState(projectPath, void 0, input.session)
3700
4035
  ) : Promise.resolve(null);
3701
- const learningsPromise = includeSet.has("learnings") ? import("./dist-ALQDD67R.js").then(
4036
+ const learningsPromise = includeSet.has("learnings") ? import("./dist-MF5BK5AD.js").then(
3702
4037
  (core) => core.loadBudgetedLearnings(projectPath, {
3703
4038
  intent: input.intent,
3704
4039
  tokenBudget: input.learningsBudget ?? 1e3,
@@ -3707,14 +4042,14 @@ async function handleGatherContext(input) {
3707
4042
  ...input.depth !== void 0 && { depth: input.depth }
3708
4043
  })
3709
4044
  ) : Promise.resolve(null);
3710
- const handoffPromise = includeSet.has("handoff") ? import("./dist-ALQDD67R.js").then(
4045
+ const handoffPromise = includeSet.has("handoff") ? import("./dist-MF5BK5AD.js").then(
3711
4046
  (core) => core.loadHandoff(projectPath, void 0, input.session)
3712
4047
  ) : Promise.resolve(null);
3713
4048
  const graphPromise = includeSet.has("graph") ? (async () => {
3714
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-2M2HXDQI.js");
4049
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-KMHDQYDT.js");
3715
4050
  const store = await loadGraphStore2(projectPath);
3716
4051
  if (!store) return null;
3717
- const { FusionLayer, ContextQL } = await import("./dist-B26DFXMP.js");
4052
+ const { FusionLayer, ContextQL } = await import("./dist-U7EAO6T2.js");
3718
4053
  const fusion = new FusionLayer(store);
3719
4054
  const cql = new ContextQL(store);
3720
4055
  const tokenBudget = input.tokenBudget ?? 4e3;
@@ -3751,11 +4086,11 @@ async function handleGatherContext(input) {
3751
4086
  context: contextBlocks
3752
4087
  };
3753
4088
  })() : Promise.resolve(null);
3754
- const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-ALQDD67R.js").then(
4089
+ const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-MF5BK5AD.js").then(
3755
4090
  (core) => core.readSessionSections(projectPath, input.session)
3756
4091
  ) : Promise.resolve(null);
3757
4092
  const shouldIncludeEvents = input.includeEvents !== void 0 ? input.includeEvents : includeSet.has("events") || !!input.session && !input.include;
3758
- const eventsPromise = shouldIncludeEvents ? import("./dist-ALQDD67R.js").then(async (core) => {
4093
+ const eventsPromise = shouldIncludeEvents ? import("./dist-MF5BK5AD.js").then(async (core) => {
3759
4094
  const result = await core.loadEvents(projectPath, {
3760
4095
  session: input.session
3761
4096
  });
@@ -3763,7 +4098,7 @@ async function handleGatherContext(input) {
3763
4098
  return core.formatEventTimeline(result.value);
3764
4099
  }) : Promise.resolve(null);
3765
4100
  const validationPromise = includeSet.has("validation") ? (async () => {
3766
- const { handleValidateProject: handleValidateProject2 } = await import("./validate-KBYQAEWE.js");
4101
+ const { handleValidateProject: handleValidateProject2 } = await import("./validate-SPSTH2YW.js");
3767
4102
  const result = await handleValidateProject2({ path: projectPath });
3768
4103
  const first = result.content[0];
3769
4104
  return first ? JSON.parse(first.text) : null;
@@ -3857,7 +4192,7 @@ async function handleGatherContext(input) {
3857
4192
  };
3858
4193
  if (input.session) {
3859
4194
  try {
3860
- const core = await import("./dist-ALQDD67R.js");
4195
+ const core = await import("./dist-MF5BK5AD.js");
3861
4196
  core.updateSessionIndex(
3862
4197
  projectPath,
3863
4198
  input.session,
@@ -3927,7 +4262,7 @@ async function handleAssessProject(input) {
3927
4262
  let validateResult = null;
3928
4263
  if (checksToRun.has("validate")) {
3929
4264
  try {
3930
- const { handleValidateProject: handleValidateProject2 } = await import("./validate-KBYQAEWE.js");
4265
+ const { handleValidateProject: handleValidateProject2 } = await import("./validate-SPSTH2YW.js");
3931
4266
  const result = await handleValidateProject2({ path: projectPath });
3932
4267
  const first = result.content[0];
3933
4268
  const parsed = first ? JSON.parse(first.text) : {};
@@ -3952,7 +4287,7 @@ async function handleAssessProject(input) {
3952
4287
  parallelChecks.push(
3953
4288
  (async () => {
3954
4289
  try {
3955
- const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-ZLIH5533.js");
4290
+ const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-UBO5KKUV.js");
3956
4291
  const result = await handleCheckDependencies2({ path: projectPath });
3957
4292
  const first = result.content[0];
3958
4293
  const parsed = first ? JSON.parse(first.text) : {};
@@ -3979,7 +4314,7 @@ async function handleAssessProject(input) {
3979
4314
  parallelChecks.push(
3980
4315
  (async () => {
3981
4316
  try {
3982
- const { handleCheckDocs: handleCheckDocs2 } = await import("./docs-NRMQCOJ6.js");
4317
+ const { handleCheckDocs: handleCheckDocs2 } = await import("./docs-WZHW4N4P.js");
3983
4318
  const result = await handleCheckDocs2({ path: projectPath, scope: "coverage" });
3984
4319
  const first = result.content[0];
3985
4320
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4006,7 +4341,7 @@ async function handleAssessProject(input) {
4006
4341
  parallelChecks.push(
4007
4342
  (async () => {
4008
4343
  try {
4009
- const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-6AGX2ZUN.js");
4344
+ const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-FCIGJIIT.js");
4010
4345
  const result = await handleDetectEntropy2({ path: projectPath, type: "all" });
4011
4346
  const first = result.content[0];
4012
4347
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4033,7 +4368,7 @@ async function handleAssessProject(input) {
4033
4368
  parallelChecks.push(
4034
4369
  (async () => {
4035
4370
  try {
4036
- const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-2RPQEN62.js");
4371
+ const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-HTDKKGMX.js");
4037
4372
  const result = await handleRunSecurityScan2({ path: projectPath });
4038
4373
  const first = result.content[0];
4039
4374
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4065,14 +4400,28 @@ async function handleAssessProject(input) {
4065
4400
  parallelChecks.push(
4066
4401
  (async () => {
4067
4402
  try {
4068
- const { handleCheckPerformance: handleCheckPerformance2 } = await import("./performance-2D7G6NMJ.js");
4403
+ const { handleCheckPerformance: handleCheckPerformance2 } = await import("./performance-NMJDV6HF.js");
4069
4404
  const result = await handleCheckPerformance2({ path: projectPath });
4405
+ if ("isError" in result && result.isError) {
4406
+ const msg = result.content[0]?.text ?? "Performance check failed";
4407
+ return { name: "perf", passed: false, issueCount: 1, topIssue: msg };
4408
+ }
4070
4409
  const first = result.content[0];
4071
- const parsed = first ? JSON.parse(first.text) : {};
4410
+ let parsed = {};
4411
+ try {
4412
+ parsed = first ? JSON.parse(first.text) : {};
4413
+ } catch {
4414
+ return {
4415
+ name: "perf",
4416
+ passed: false,
4417
+ issueCount: 1,
4418
+ topIssue: first?.text ?? "Invalid perf output"
4419
+ };
4420
+ }
4072
4421
  const issues = parsed.violations?.length ?? parsed.issues?.length ?? 0;
4073
4422
  return {
4074
4423
  name: "perf",
4075
- passed: !("isError" in result && result.isError) && issues === 0,
4424
+ passed: issues === 0,
4076
4425
  issueCount: issues,
4077
4426
  ...issues > 0 ? { topIssue: "Performance issues detected" } : {},
4078
4427
  ...mode === "detailed" ? { detailed: parsed } : {}
@@ -4254,7 +4603,7 @@ async function handleReviewChanges(input) {
4254
4603
  }
4255
4604
  }
4256
4605
  async function runQuickReview(projectPath, diff, diffLines, downgraded) {
4257
- const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-MY4QZIFD.js");
4606
+ const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-O3FYTZIE.js");
4258
4607
  const result = await handleAnalyzeDiff2({ diff, path: projectPath });
4259
4608
  const firstContent = result.content[0];
4260
4609
  if (!firstContent) throw new Error("Empty analyze_diff response");
@@ -4285,7 +4634,7 @@ function extractFileCount(diffParsed) {
4285
4634
  return files?.length ?? 0;
4286
4635
  }
4287
4636
  async function runStandardReview(projectPath, diff, diffLines, downgraded) {
4288
- const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-MY4QZIFD.js");
4637
+ const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-O3FYTZIE.js");
4289
4638
  const [diffResult, reviewResult] = await Promise.all([
4290
4639
  handleAnalyzeDiff2({ diff, path: projectPath }),
4291
4640
  handleCreateSelfReview2({ path: projectPath, diff })
@@ -4317,7 +4666,7 @@ async function runStandardReview(projectPath, diff, diffLines, downgraded) {
4317
4666
  };
4318
4667
  }
4319
4668
  async function runDeepReview(projectPath, diff, diffLines, _downgraded) {
4320
- const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-RAQ55ISU.js");
4669
+ const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-MSEJWTKM.js");
4321
4670
  const result = await handleRunCodeReview2({ path: projectPath, diff });
4322
4671
  const deepContent = result.content[0];
4323
4672
  if (!deepContent) throw new Error("Empty code review response");
@@ -4388,7 +4737,7 @@ async function handleCheckTaskIndependence(input) {
4388
4737
  try {
4389
4738
  const projectPath = sanitizePath(input.path);
4390
4739
  const store = await loadGraphStore(projectPath);
4391
- const { TaskIndependenceAnalyzer } = await import("./dist-B26DFXMP.js");
4740
+ const { TaskIndependenceAnalyzer } = await import("./dist-U7EAO6T2.js");
4392
4741
  const analyzer = new TaskIndependenceAnalyzer(store ?? void 0);
4393
4742
  const result = analyzer.analyze({
4394
4743
  tasks: input.tasks,
@@ -4476,7 +4825,7 @@ async function handlePredictConflicts(input) {
4476
4825
  try {
4477
4826
  const projectPath = sanitizePath(input.path);
4478
4827
  const store = await loadGraphStore(projectPath);
4479
- const { ConflictPredictor } = await import("./dist-B26DFXMP.js");
4828
+ const { ConflictPredictor } = await import("./dist-U7EAO6T2.js");
4480
4829
  const predictor = new ConflictPredictor(store ?? void 0);
4481
4830
  const result = predictor.predict({
4482
4831
  tasks: input.tasks,
@@ -4582,7 +4931,7 @@ async function handleDetectStaleConstraints(input) {
4582
4931
  isError: true
4583
4932
  };
4584
4933
  }
4585
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-2M2HXDQI.js");
4934
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-KMHDQYDT.js");
4586
4935
  const store = await loadGraphStore2(projectPath);
4587
4936
  if (!store) {
4588
4937
  return {
@@ -4603,7 +4952,7 @@ async function handleDetectStaleConstraints(input) {
4603
4952
  ]
4604
4953
  };
4605
4954
  }
4606
- const { detectStaleConstraints } = await import("./dist-ALQDD67R.js");
4955
+ const { detectStaleConstraints } = await import("./dist-MF5BK5AD.js");
4607
4956
  const result = detectStaleConstraints(
4608
4957
  store,
4609
4958
  windowDays,
@@ -4735,7 +5084,7 @@ async function handleCodeOutline(input) {
4735
5084
  };
4736
5085
  }
4737
5086
  try {
4738
- const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-ALQDD67R.js");
5087
+ const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-MF5BK5AD.js");
4739
5088
  const { stat } = await import("fs/promises");
4740
5089
  const stats = await stat(targetPath).catch(() => null);
4741
5090
  if (stats?.isFile()) {
@@ -4815,7 +5164,7 @@ async function handleCodeSearch(input) {
4815
5164
  };
4816
5165
  }
4817
5166
  try {
4818
- const { searchSymbols } = await import("./dist-ALQDD67R.js");
5167
+ const { searchSymbols } = await import("./dist-MF5BK5AD.js");
4819
5168
  const result = await searchSymbols(input.query, directory, input.glob);
4820
5169
  const lines = [`Search: "${result.query}" \u2014 ${result.matches.length} matches`];
4821
5170
  for (const match of result.matches) {
@@ -4884,7 +5233,7 @@ async function handleCodeUnfold(input) {
4884
5233
  }
4885
5234
  try {
4886
5235
  if (input.symbol) {
4887
- const { unfoldSymbol } = await import("./dist-ALQDD67R.js");
5236
+ const { unfoldSymbol } = await import("./dist-MF5BK5AD.js");
4888
5237
  const result = await unfoldSymbol(filePath, input.symbol);
4889
5238
  const header = result.warning ? `${result.file}:${result.startLine}-${result.endLine} ${result.warning}
4890
5239
  ` : `${result.file}:${result.startLine}-${result.endLine}
@@ -4892,7 +5241,7 @@ async function handleCodeUnfold(input) {
4892
5241
  return { content: [{ type: "text", text: header + result.content }] };
4893
5242
  }
4894
5243
  if (input.startLine != null && input.endLine != null) {
4895
- const { unfoldRange } = await import("./dist-ALQDD67R.js");
5244
+ const { unfoldRange } = await import("./dist-MF5BK5AD.js");
4896
5245
  const result = await unfoldRange(filePath, input.startLine, input.endLine);
4897
5246
  const header = `${result.file}:${result.startLine}-${result.endLine}
4898
5247
  `;
@@ -5107,7 +5456,7 @@ async function appendUpdateNotification(result, resolvedRoot) {
5107
5456
  shouldRunCheck,
5108
5457
  readCheckState,
5109
5458
  spawnBackgroundCheck
5110
- } = await import("./dist-ALQDD67R.js");
5459
+ } = await import("./dist-MF5BK5AD.js");
5111
5460
  const { CLI_VERSION } = await import("./version-KFFPOQAX.js");
5112
5461
  const configInterval = readConfigInterval(resolvedRoot);
5113
5462
  const DEFAULT_INTERVAL = 864e5;
@@ -5125,19 +5474,24 @@ ${notification}` });
5125
5474
  } catch {
5126
5475
  }
5127
5476
  }
5128
- function createHarnessServer(projectRoot) {
5477
+ function createHarnessServer(projectRoot, toolFilter) {
5129
5478
  const resolvedRoot = projectRoot ?? process.cwd();
5130
5479
  let sessionChecked = false;
5480
+ const filteredDefinitions = toolFilter ? TOOL_DEFINITIONS.filter((t) => toolFilter.includes(t.name)) : TOOL_DEFINITIONS;
5481
+ const filteredHandlers = toolFilter ? Object.fromEntries(
5482
+ Object.entries(TOOL_HANDLERS).filter(([name]) => toolFilter.includes(name))
5483
+ ) : TOOL_HANDLERS;
5131
5484
  const server = new Server(
5132
5485
  { name: "harness-engineering", version: "0.1.0" },
5133
5486
  { capabilities: { tools: {}, resources: {} } }
5134
5487
  );
5135
5488
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
5136
- tools: TOOL_DEFINITIONS
5489
+ tools: filteredDefinitions
5137
5490
  }));
5491
+ const guardedHandlers = applyInjectionGuard(filteredHandlers, { projectRoot: resolvedRoot });
5138
5492
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
5139
5493
  const { name, arguments: args } = request.params;
5140
- const handler = TOOL_HANDLERS[name];
5494
+ const handler = guardedHandlers[name];
5141
5495
  if (!handler) {
5142
5496
  return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
5143
5497
  }
@@ -5166,8 +5520,8 @@ function createHarnessServer(projectRoot) {
5166
5520
  });
5167
5521
  return server;
5168
5522
  }
5169
- async function startServer() {
5170
- const server = createHarnessServer();
5523
+ async function startServer(toolFilter) {
5524
+ const server = createHarnessServer(void 0, toolFilter);
5171
5525
  const transport = new StdioServerTransport();
5172
5526
  await server.connect(transport);
5173
5527
  }