hunter-harness 0.1.3 → 0.2.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 (566) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +11 -0
  3. package/dist/bin.js +891 -271
  4. package/package.json +1 -1
  5. package/resources/harness/bundles/general/claude-code/.harness-build.json +6 -0
  6. package/resources/harness/{general → bundles/general/claude-code}/agents/harness-reviewer.md +2 -2
  7. package/resources/harness/{general → bundles/general/claude-code}/harness-archive/SKILL.md +1 -1
  8. package/resources/harness/{java → bundles/general/claude-code}/harness-codebase-map/SKILL.md +1 -1
  9. package/resources/harness/{java → bundles/general/claude-code}/harness-knowledge-ingest/SKILL.md +1 -1
  10. package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-ingest/reference.md +1 -1
  11. package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-query/SKILL.md +1 -1
  12. package/resources/harness/{general → bundles/general/claude-code}/harness-plan/SKILL.md +1 -1
  13. package/resources/harness/{java → bundles/general/claude-code}/harness-review/SKILL.md +8 -4
  14. package/resources/harness/{general → bundles/general/claude-code}/harness-review/checklist.md +3 -3
  15. package/resources/harness/{general → bundles/general/claude-code}/harness-run/SKILL.md +1 -1
  16. package/resources/harness/{general → bundles/general/claude-code}/harness-run/checklist.md +1 -1
  17. package/resources/harness/{general → bundles/general/claude-code}/harness-run/reference.md +2 -2
  18. package/resources/harness/{general → bundles/general/claude-code}/harness-submit/SKILL.md +1 -1
  19. package/resources/harness/{java → bundles/general/claude-code}/harness-sync/SKILL.md +2 -2
  20. package/resources/harness/{general → bundles/general/claude-code}/harness-sync/reference.md +7 -7
  21. package/resources/harness/{general → bundles/general/claude-code}/harness-test/SKILL.md +1 -1
  22. package/resources/harness/{general → bundles/general/claude-code}/harness-test/checklist.md +1 -1
  23. package/resources/harness/{java → bundles/general/claude-code}/scripts/harness_archive.py +2300 -2300
  24. package/resources/harness/{general → bundles/general/claude-code}/scripts/harness_deploy.py +74 -13
  25. package/resources/harness/{general → bundles/general/claude-code}/scripts/harness_events.py +680 -680
  26. package/resources/harness/{general → bundles/general/claude-code}/scripts/harness_ledger.py +660 -660
  27. package/resources/harness/{java → bundles/general/claude-code}/scripts/harness_preflight.py +765 -765
  28. package/resources/harness/{general → bundles/general/claude-code}/scripts/harness_service.py +1331 -1331
  29. package/resources/harness/bundles/general/codebuddy/.harness-build.json +6 -0
  30. package/resources/harness/bundles/general/codebuddy/agents/harness-evaluator.md +94 -0
  31. package/resources/harness/bundles/general/codebuddy/agents/harness-explorer.md +53 -0
  32. package/resources/harness/bundles/general/codebuddy/agents/harness-reviewer.md +52 -0
  33. package/resources/harness/bundles/general/codebuddy/harness-archive/SKILL.md +198 -0
  34. package/resources/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +95 -0
  35. package/resources/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +229 -0
  36. package/resources/harness/{java → bundles/general/codebuddy}/harness-knowledge-ingest/reference.md +1 -1
  37. package/resources/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +147 -0
  38. package/resources/harness/bundles/general/codebuddy/harness-plan/SKILL.md +109 -0
  39. package/resources/harness/bundles/general/codebuddy/harness-review/SKILL.md +142 -0
  40. package/resources/harness/{java → bundles/general/codebuddy}/harness-review/checklist.md +3 -3
  41. package/resources/harness/bundles/general/codebuddy/harness-run/SKILL.md +113 -0
  42. package/resources/harness/bundles/general/codebuddy/harness-run/checklist.md +259 -0
  43. package/resources/harness/bundles/general/codebuddy/harness-run/reference.md +834 -0
  44. package/resources/harness/bundles/general/codebuddy/harness-submit/SKILL.md +142 -0
  45. package/resources/harness/bundles/general/codebuddy/harness-sync/SKILL.md +65 -0
  46. package/resources/harness/{java → bundles/general/codebuddy}/harness-sync/reference.md +7 -7
  47. package/resources/harness/bundles/general/codebuddy/harness-test/SKILL.md +160 -0
  48. package/resources/harness/bundles/general/codebuddy/harness-test/checklist.md +319 -0
  49. package/resources/harness/bundles/general/codebuddy/harness-test/reference.md +791 -0
  50. package/resources/harness/{general → bundles/general/codebuddy}/scripts/harness_archive.py +2300 -2300
  51. package/resources/harness/{java → bundles/general/codebuddy}/scripts/harness_deploy.py +74 -13
  52. package/resources/harness/{java → bundles/general/codebuddy}/scripts/harness_events.py +680 -680
  53. package/resources/harness/{java → bundles/general/codebuddy}/scripts/harness_ledger.py +660 -660
  54. package/resources/harness/{general → bundles/general/codebuddy}/scripts/harness_preflight.py +765 -765
  55. package/resources/harness/{java → bundles/general/codebuddy}/scripts/harness_service.py +1331 -1331
  56. package/resources/harness/bundles/general/codex/.harness-build.json +6 -0
  57. package/resources/harness/bundles/general/codex/CONTEXT.md +65 -0
  58. package/resources/harness/bundles/general/codex/README.md +478 -0
  59. package/resources/harness/bundles/general/codex/harness-archive/SKILL.md +198 -0
  60. package/resources/harness/bundles/general/codex/harness-archive/checklist.md +52 -0
  61. package/resources/harness/bundles/general/codex/harness-archive/reference.md +103 -0
  62. package/resources/harness/bundles/general/codex/harness-archive/scripts/gen-manifest.ps1 +31 -0
  63. package/resources/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +171 -0
  64. package/resources/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +128 -0
  65. package/resources/harness/bundles/general/codex/harness-codebase-map/SKILL.md +95 -0
  66. package/resources/harness/bundles/general/codex/harness-codebase-map/checklist.md +126 -0
  67. package/resources/harness/bundles/general/codex/harness-codebase-map/reference.md +364 -0
  68. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
  69. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/CONCERNS.md +49 -0
  70. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/CONVENTIONS.md +57 -0
  71. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
  72. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/STACK.md +55 -0
  73. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/STRUCTURE.md +69 -0
  74. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/TESTING.md +64 -0
  75. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/map-manifest.schema.json +73 -0
  76. package/resources/harness/bundles/general/codex/harness-codebase-map/templates/map-summary.md +64 -0
  77. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +229 -0
  78. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/design.md +842 -0
  79. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +42 -0
  80. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/mcp-config.example.json +10 -0
  81. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +309 -0
  82. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +4082 -0
  83. package/resources/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +273 -0
  84. package/resources/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +147 -0
  85. package/resources/harness/bundles/general/codex/harness-plan/SKILL.md +109 -0
  86. package/resources/harness/bundles/general/codex/harness-plan/checklist.md +243 -0
  87. package/resources/harness/bundles/general/codex/harness-plan/protocols.md +124 -0
  88. package/resources/harness/bundles/general/codex/harness-plan/reference.md +376 -0
  89. package/resources/harness/bundles/general/codex/harness-review/SKILL.md +137 -0
  90. package/resources/harness/bundles/general/codex/harness-review/checklist.md +124 -0
  91. package/resources/harness/bundles/general/codex/harness-review/protocols.md +68 -0
  92. package/resources/harness/bundles/general/codex/harness-review/reference.md +86 -0
  93. package/resources/harness/bundles/general/codex/harness-run/SKILL.md +113 -0
  94. package/resources/harness/bundles/general/codex/harness-run/checklist.md +259 -0
  95. package/resources/harness/bundles/general/codex/harness-run/protocols.md +78 -0
  96. package/resources/harness/bundles/general/codex/harness-run/reference.md +834 -0
  97. package/resources/harness/bundles/general/codex/harness-submit/SKILL.md +142 -0
  98. package/resources/harness/bundles/general/codex/harness-submit/checklist.md +407 -0
  99. package/resources/harness/bundles/general/codex/harness-submit/reference.md +152 -0
  100. package/resources/harness/bundles/general/codex/harness-sync/SKILL.md +65 -0
  101. package/resources/harness/bundles/general/codex/harness-sync/reference.md +153 -0
  102. package/resources/harness/bundles/general/codex/harness-test/SKILL.md +160 -0
  103. package/resources/harness/bundles/general/codex/harness-test/checklist.md +319 -0
  104. package/resources/harness/bundles/general/codex/harness-test/pitfalls.md +260 -0
  105. package/resources/harness/bundles/general/codex/harness-test/reference.md +791 -0
  106. package/resources/harness/bundles/general/codex/protocols/archive-report-protocol.md +175 -0
  107. package/resources/harness/bundles/general/codex/protocols/evidence-based-reporting-protocol.md +134 -0
  108. package/resources/harness/bundles/general/codex/protocols/ledger-protocol.md +270 -0
  109. package/resources/harness/bundles/general/codex/protocols/powershell-protocol.md +181 -0
  110. package/resources/harness/bundles/general/codex/protocols/report-pipeline-protocol.md +150 -0
  111. package/resources/harness/bundles/general/codex/protocols/sensitive-info-protocol.md +92 -0
  112. package/resources/harness/bundles/general/codex/protocols/state-layout-protocol.md +131 -0
  113. package/resources/harness/bundles/general/codex/protocols/submit-protocol.md +78 -0
  114. package/resources/harness/bundles/general/codex/scripts/harness_archive.py +2319 -0
  115. package/resources/harness/bundles/general/codex/scripts/harness_deploy.py +674 -0
  116. package/resources/harness/bundles/general/codex/scripts/harness_events.py +680 -0
  117. package/resources/harness/bundles/general/codex/scripts/harness_ledger.py +671 -0
  118. package/resources/harness/bundles/general/codex/scripts/harness_preflight.py +780 -0
  119. package/resources/harness/bundles/general/codex/scripts/harness_service.py +1331 -0
  120. package/resources/harness/bundles/general/cursor/.harness-build.json +6 -0
  121. package/resources/harness/bundles/general/cursor/CONTEXT.md +65 -0
  122. package/resources/harness/bundles/general/cursor/README.md +478 -0
  123. package/resources/harness/bundles/general/cursor/harness-archive/SKILL.md +198 -0
  124. package/resources/harness/bundles/general/cursor/harness-archive/checklist.md +52 -0
  125. package/resources/harness/bundles/general/cursor/harness-archive/reference.md +103 -0
  126. package/resources/harness/bundles/general/cursor/harness-archive/scripts/gen-manifest.ps1 +31 -0
  127. package/resources/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +171 -0
  128. package/resources/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +128 -0
  129. package/resources/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +95 -0
  130. package/resources/harness/bundles/general/cursor/harness-codebase-map/checklist.md +126 -0
  131. package/resources/harness/bundles/general/cursor/harness-codebase-map/reference.md +364 -0
  132. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
  133. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/CONCERNS.md +49 -0
  134. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/CONVENTIONS.md +57 -0
  135. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
  136. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/STACK.md +55 -0
  137. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/STRUCTURE.md +69 -0
  138. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/TESTING.md +64 -0
  139. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/map-manifest.schema.json +73 -0
  140. package/resources/harness/bundles/general/cursor/harness-codebase-map/templates/map-summary.md +64 -0
  141. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +229 -0
  142. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/design.md +842 -0
  143. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +42 -0
  144. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/mcp-config.example.json +10 -0
  145. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +309 -0
  146. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +4082 -0
  147. package/resources/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +273 -0
  148. package/resources/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +147 -0
  149. package/resources/harness/bundles/general/cursor/harness-plan/SKILL.md +109 -0
  150. package/resources/harness/bundles/general/cursor/harness-plan/checklist.md +243 -0
  151. package/resources/harness/bundles/general/cursor/harness-plan/protocols.md +124 -0
  152. package/resources/harness/bundles/general/cursor/harness-plan/reference.md +376 -0
  153. package/resources/harness/bundles/general/cursor/harness-review/SKILL.md +137 -0
  154. package/resources/harness/bundles/general/cursor/harness-review/checklist.md +124 -0
  155. package/resources/harness/bundles/general/cursor/harness-review/protocols.md +68 -0
  156. package/resources/harness/bundles/general/cursor/harness-review/reference.md +86 -0
  157. package/resources/harness/bundles/general/cursor/harness-run/SKILL.md +113 -0
  158. package/resources/harness/bundles/general/cursor/harness-run/checklist.md +259 -0
  159. package/resources/harness/bundles/general/cursor/harness-run/protocols.md +78 -0
  160. package/resources/harness/bundles/general/cursor/harness-run/reference.md +834 -0
  161. package/resources/harness/bundles/general/cursor/harness-submit/SKILL.md +142 -0
  162. package/resources/harness/bundles/general/cursor/harness-submit/checklist.md +407 -0
  163. package/resources/harness/bundles/general/cursor/harness-submit/reference.md +152 -0
  164. package/resources/harness/bundles/general/cursor/harness-sync/SKILL.md +65 -0
  165. package/resources/harness/bundles/general/cursor/harness-sync/reference.md +153 -0
  166. package/resources/harness/bundles/general/cursor/harness-test/SKILL.md +160 -0
  167. package/resources/harness/bundles/general/cursor/harness-test/checklist.md +319 -0
  168. package/resources/harness/bundles/general/cursor/harness-test/pitfalls.md +260 -0
  169. package/resources/harness/bundles/general/cursor/harness-test/reference.md +791 -0
  170. package/resources/harness/bundles/general/cursor/protocols/archive-report-protocol.md +175 -0
  171. package/resources/harness/bundles/general/cursor/protocols/evidence-based-reporting-protocol.md +134 -0
  172. package/resources/harness/bundles/general/cursor/protocols/ledger-protocol.md +270 -0
  173. package/resources/harness/bundles/general/cursor/protocols/powershell-protocol.md +181 -0
  174. package/resources/harness/bundles/general/cursor/protocols/report-pipeline-protocol.md +150 -0
  175. package/resources/harness/bundles/general/cursor/protocols/sensitive-info-protocol.md +92 -0
  176. package/resources/harness/bundles/general/cursor/protocols/state-layout-protocol.md +131 -0
  177. package/resources/harness/bundles/general/cursor/protocols/submit-protocol.md +78 -0
  178. package/resources/harness/bundles/general/cursor/scripts/harness_archive.py +2319 -0
  179. package/resources/harness/bundles/general/cursor/scripts/harness_deploy.py +674 -0
  180. package/resources/harness/bundles/general/cursor/scripts/harness_events.py +680 -0
  181. package/resources/harness/bundles/general/cursor/scripts/harness_ledger.py +671 -0
  182. package/resources/harness/bundles/general/cursor/scripts/harness_preflight.py +780 -0
  183. package/resources/harness/bundles/general/cursor/scripts/harness_service.py +1331 -0
  184. package/resources/harness/bundles/java/claude-code/.harness-build.json +6 -0
  185. package/resources/harness/bundles/java/claude-code/CONTEXT.md +65 -0
  186. package/resources/harness/bundles/java/claude-code/README.md +478 -0
  187. package/resources/harness/{java → bundles/java/claude-code}/agents/harness-reviewer.md +2 -2
  188. package/resources/harness/{java → bundles/java/claude-code}/harness-apidoc/SKILL.md +1 -1
  189. package/resources/harness/{java → bundles/java/claude-code}/harness-archive/SKILL.md +1 -1
  190. package/resources/harness/bundles/java/claude-code/harness-archive/checklist.md +52 -0
  191. package/resources/harness/bundles/java/claude-code/harness-archive/reference.md +103 -0
  192. package/resources/harness/bundles/java/claude-code/harness-archive/scripts/gen-manifest.ps1 +31 -0
  193. package/resources/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +171 -0
  194. package/resources/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +128 -0
  195. package/resources/harness/{general → bundles/java/claude-code}/harness-codebase-map/SKILL.md +1 -1
  196. package/resources/harness/bundles/java/claude-code/harness-codebase-map/checklist.md +126 -0
  197. package/resources/harness/bundles/java/claude-code/harness-codebase-map/reference.md +364 -0
  198. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
  199. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/CONCERNS.md +49 -0
  200. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/CONVENTIONS.md +57 -0
  201. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
  202. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/STACK.md +55 -0
  203. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/STRUCTURE.md +69 -0
  204. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/TESTING.md +64 -0
  205. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/map-manifest.schema.json +73 -0
  206. package/resources/harness/bundles/java/claude-code/harness-codebase-map/templates/map-summary.md +64 -0
  207. package/resources/harness/{general → bundles/java/claude-code}/harness-knowledge-ingest/SKILL.md +1 -1
  208. package/resources/harness/bundles/java/claude-code/harness-knowledge-ingest/design.md +842 -0
  209. package/resources/harness/bundles/java/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +42 -0
  210. package/resources/harness/bundles/java/claude-code/harness-knowledge-ingest/mcp-config.example.json +10 -0
  211. package/resources/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +309 -0
  212. package/resources/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +4082 -0
  213. package/resources/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +273 -0
  214. package/resources/harness/{java → bundles/java/claude-code}/harness-knowledge-query/SKILL.md +1 -1
  215. package/resources/harness/{java → bundles/java/claude-code}/harness-package/SKILL.md +1 -1
  216. package/resources/harness/{java → bundles/java/claude-code}/harness-package/reference.md +1 -1
  217. package/resources/harness/{java → bundles/java/claude-code}/harness-plan/SKILL.md +1 -1
  218. package/resources/harness/bundles/java/claude-code/harness-plan/checklist.md +243 -0
  219. package/resources/harness/bundles/java/claude-code/harness-plan/protocols.md +124 -0
  220. package/resources/harness/bundles/java/claude-code/harness-plan/reference.md +376 -0
  221. package/resources/harness/{general → bundles/java/claude-code}/harness-review/SKILL.md +8 -4
  222. package/resources/harness/bundles/java/claude-code/harness-review/checklist.md +124 -0
  223. package/resources/harness/bundles/java/claude-code/harness-review/protocols.md +68 -0
  224. package/resources/harness/bundles/java/claude-code/harness-review/reference.md +86 -0
  225. package/resources/harness/{java → bundles/java/claude-code}/harness-run/SKILL.md +1 -1
  226. package/resources/harness/{java → bundles/java/claude-code}/harness-run/checklist.md +1 -1
  227. package/resources/harness/bundles/java/claude-code/harness-run/protocols.md +78 -0
  228. package/resources/harness/{java → bundles/java/claude-code}/harness-run/reference.md +2 -2
  229. package/resources/harness/{java → bundles/java/claude-code}/harness-submit/SKILL.md +1 -1
  230. package/resources/harness/bundles/java/claude-code/harness-submit/checklist.md +407 -0
  231. package/resources/harness/bundles/java/claude-code/harness-submit/reference.md +152 -0
  232. package/resources/harness/{general → bundles/java/claude-code}/harness-sync/SKILL.md +2 -2
  233. package/resources/harness/bundles/java/claude-code/harness-sync/reference.md +153 -0
  234. package/resources/harness/{java → bundles/java/claude-code}/harness-test/SKILL.md +1 -1
  235. package/resources/harness/{java → bundles/java/claude-code}/harness-test/checklist.md +316 -316
  236. package/resources/harness/bundles/java/claude-code/harness-test/pitfalls.md +260 -0
  237. package/resources/harness/{java → bundles/java/claude-code}/harness-test/reference.md +788 -788
  238. package/resources/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +175 -0
  239. package/resources/harness/bundles/java/claude-code/protocols/evidence-based-reporting-protocol.md +134 -0
  240. package/resources/harness/bundles/java/claude-code/protocols/ledger-protocol.md +270 -0
  241. package/resources/harness/bundles/java/claude-code/protocols/powershell-protocol.md +181 -0
  242. package/resources/harness/bundles/java/claude-code/protocols/report-pipeline-protocol.md +150 -0
  243. package/resources/harness/bundles/java/claude-code/protocols/sensitive-info-protocol.md +92 -0
  244. package/resources/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +131 -0
  245. package/resources/harness/bundles/java/claude-code/protocols/submit-protocol.md +78 -0
  246. package/resources/harness/bundles/java/claude-code/scripts/harness_archive.py +2319 -0
  247. package/resources/harness/bundles/java/claude-code/scripts/harness_deploy.py +674 -0
  248. package/resources/harness/bundles/java/claude-code/scripts/harness_events.py +680 -0
  249. package/resources/harness/bundles/java/claude-code/scripts/harness_ledger.py +671 -0
  250. package/resources/harness/bundles/java/claude-code/scripts/harness_preflight.py +780 -0
  251. package/resources/harness/bundles/java/claude-code/scripts/harness_service.py +1331 -0
  252. package/resources/harness/bundles/java/codebuddy/.harness-build.json +6 -0
  253. package/resources/harness/bundles/java/codebuddy/CONTEXT.md +65 -0
  254. package/resources/harness/bundles/java/codebuddy/README.md +478 -0
  255. package/resources/harness/bundles/java/codebuddy/agents/harness-evaluator.md +94 -0
  256. package/resources/harness/bundles/java/codebuddy/agents/harness-explorer.md +53 -0
  257. package/resources/harness/bundles/java/codebuddy/agents/harness-reviewer.md +52 -0
  258. package/resources/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +68 -0
  259. package/resources/harness/bundles/java/codebuddy/harness-apidoc/checklist.md +142 -0
  260. package/resources/harness/bundles/java/codebuddy/harness-apidoc/reference.md +233 -0
  261. package/resources/harness/bundles/java/codebuddy/harness-archive/SKILL.md +198 -0
  262. package/resources/harness/bundles/java/codebuddy/harness-archive/checklist.md +52 -0
  263. package/resources/harness/bundles/java/codebuddy/harness-archive/reference.md +103 -0
  264. package/resources/harness/bundles/java/codebuddy/harness-archive/scripts/gen-manifest.ps1 +31 -0
  265. package/resources/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +171 -0
  266. package/resources/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +128 -0
  267. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +95 -0
  268. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/checklist.md +126 -0
  269. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/reference.md +364 -0
  270. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
  271. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/CONCERNS.md +49 -0
  272. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/CONVENTIONS.md +57 -0
  273. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
  274. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/STACK.md +55 -0
  275. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/STRUCTURE.md +69 -0
  276. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/TESTING.md +64 -0
  277. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/map-manifest.schema.json +73 -0
  278. package/resources/harness/bundles/java/codebuddy/harness-codebase-map/templates/map-summary.md +64 -0
  279. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +229 -0
  280. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/design.md +842 -0
  281. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +42 -0
  282. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/mcp-config.example.json +10 -0
  283. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +309 -0
  284. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +4082 -0
  285. package/resources/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +273 -0
  286. package/resources/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +147 -0
  287. package/resources/harness/bundles/java/codebuddy/harness-package/SKILL.md +69 -0
  288. package/resources/harness/bundles/java/codebuddy/harness-package/checklist.md +322 -0
  289. package/resources/harness/bundles/java/codebuddy/harness-package/reference.md +210 -0
  290. package/resources/harness/bundles/java/codebuddy/harness-plan/SKILL.md +109 -0
  291. package/resources/harness/bundles/java/codebuddy/harness-plan/checklist.md +243 -0
  292. package/resources/harness/bundles/java/codebuddy/harness-plan/protocols.md +124 -0
  293. package/resources/harness/bundles/java/codebuddy/harness-plan/reference.md +376 -0
  294. package/resources/harness/bundles/java/codebuddy/harness-review/SKILL.md +142 -0
  295. package/resources/harness/bundles/java/codebuddy/harness-review/checklist.md +124 -0
  296. package/resources/harness/bundles/java/codebuddy/harness-review/protocols.md +68 -0
  297. package/resources/harness/bundles/java/codebuddy/harness-review/reference.md +86 -0
  298. package/resources/harness/bundles/java/codebuddy/harness-run/SKILL.md +129 -0
  299. package/resources/harness/bundles/java/codebuddy/harness-run/checklist.md +250 -0
  300. package/resources/harness/bundles/java/codebuddy/harness-run/protocols.md +78 -0
  301. package/resources/harness/bundles/java/codebuddy/harness-run/reference.md +814 -0
  302. package/resources/harness/bundles/java/codebuddy/harness-submit/SKILL.md +149 -0
  303. package/resources/harness/bundles/java/codebuddy/harness-submit/checklist.md +407 -0
  304. package/resources/harness/bundles/java/codebuddy/harness-submit/reference.md +152 -0
  305. package/resources/harness/bundles/java/codebuddy/harness-sync/SKILL.md +65 -0
  306. package/resources/harness/bundles/java/codebuddy/harness-sync/reference.md +153 -0
  307. package/resources/harness/bundles/java/codebuddy/harness-test/SKILL.md +172 -0
  308. package/resources/harness/bundles/java/codebuddy/harness-test/checklist.md +317 -0
  309. package/resources/harness/bundles/java/codebuddy/harness-test/pitfalls-java.md +16 -0
  310. package/resources/harness/bundles/java/codebuddy/harness-test/pitfalls.md +260 -0
  311. package/resources/harness/bundles/java/codebuddy/harness-test/reference.md +788 -0
  312. package/resources/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +175 -0
  313. package/resources/harness/bundles/java/codebuddy/protocols/evidence-based-reporting-protocol.md +134 -0
  314. package/resources/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +270 -0
  315. package/resources/harness/bundles/java/codebuddy/protocols/powershell-protocol.md +181 -0
  316. package/resources/harness/bundles/java/codebuddy/protocols/report-pipeline-protocol.md +150 -0
  317. package/resources/harness/bundles/java/codebuddy/protocols/sensitive-info-protocol.md +92 -0
  318. package/resources/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +131 -0
  319. package/resources/harness/bundles/java/codebuddy/protocols/submit-protocol.md +78 -0
  320. package/resources/harness/bundles/java/codebuddy/scripts/harness_archive.py +2319 -0
  321. package/resources/harness/bundles/java/codebuddy/scripts/harness_deploy.py +674 -0
  322. package/resources/harness/bundles/java/codebuddy/scripts/harness_events.py +680 -0
  323. package/resources/harness/bundles/java/codebuddy/scripts/harness_ledger.py +671 -0
  324. package/resources/harness/bundles/java/codebuddy/scripts/harness_preflight.py +780 -0
  325. package/resources/harness/bundles/java/codebuddy/scripts/harness_service.py +1331 -0
  326. package/resources/harness/bundles/java/codex/.harness-build.json +6 -0
  327. package/resources/harness/bundles/java/codex/CONTEXT.md +65 -0
  328. package/resources/harness/bundles/java/codex/README.md +478 -0
  329. package/resources/harness/bundles/java/codex/harness-apidoc/SKILL.md +68 -0
  330. package/resources/harness/bundles/java/codex/harness-apidoc/checklist.md +142 -0
  331. package/resources/harness/bundles/java/codex/harness-apidoc/reference.md +233 -0
  332. package/resources/harness/bundles/java/codex/harness-archive/SKILL.md +198 -0
  333. package/resources/harness/bundles/java/codex/harness-archive/checklist.md +52 -0
  334. package/resources/harness/bundles/java/codex/harness-archive/reference.md +103 -0
  335. package/resources/harness/bundles/java/codex/harness-archive/scripts/gen-manifest.ps1 +31 -0
  336. package/resources/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +171 -0
  337. package/resources/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +128 -0
  338. package/resources/harness/bundles/java/codex/harness-codebase-map/SKILL.md +95 -0
  339. package/resources/harness/bundles/java/codex/harness-codebase-map/checklist.md +126 -0
  340. package/resources/harness/bundles/java/codex/harness-codebase-map/reference.md +364 -0
  341. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
  342. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/CONCERNS.md +49 -0
  343. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/CONVENTIONS.md +57 -0
  344. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
  345. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/STACK.md +55 -0
  346. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/STRUCTURE.md +69 -0
  347. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/TESTING.md +64 -0
  348. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/map-manifest.schema.json +73 -0
  349. package/resources/harness/bundles/java/codex/harness-codebase-map/templates/map-summary.md +64 -0
  350. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +229 -0
  351. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/design.md +842 -0
  352. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +42 -0
  353. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/mcp-config.example.json +10 -0
  354. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +309 -0
  355. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +4082 -0
  356. package/resources/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +273 -0
  357. package/resources/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +147 -0
  358. package/resources/harness/bundles/java/codex/harness-package/SKILL.md +69 -0
  359. package/resources/harness/bundles/java/codex/harness-package/checklist.md +322 -0
  360. package/resources/harness/bundles/java/codex/harness-package/reference.md +210 -0
  361. package/resources/harness/bundles/java/codex/harness-plan/SKILL.md +109 -0
  362. package/resources/harness/bundles/java/codex/harness-plan/checklist.md +243 -0
  363. package/resources/harness/bundles/java/codex/harness-plan/protocols.md +124 -0
  364. package/resources/harness/bundles/java/codex/harness-plan/reference.md +376 -0
  365. package/resources/harness/bundles/java/codex/harness-review/SKILL.md +137 -0
  366. package/resources/harness/bundles/java/codex/harness-review/checklist.md +124 -0
  367. package/resources/harness/bundles/java/codex/harness-review/protocols.md +68 -0
  368. package/resources/harness/bundles/java/codex/harness-review/reference.md +86 -0
  369. package/resources/harness/bundles/java/codex/harness-run/SKILL.md +129 -0
  370. package/resources/harness/bundles/java/codex/harness-run/checklist.md +250 -0
  371. package/resources/harness/bundles/java/codex/harness-run/protocols.md +78 -0
  372. package/resources/harness/bundles/java/codex/harness-run/reference.md +814 -0
  373. package/resources/harness/bundles/java/codex/harness-submit/SKILL.md +149 -0
  374. package/resources/harness/bundles/java/codex/harness-submit/checklist.md +407 -0
  375. package/resources/harness/bundles/java/codex/harness-submit/reference.md +152 -0
  376. package/resources/harness/bundles/java/codex/harness-sync/SKILL.md +65 -0
  377. package/resources/harness/bundles/java/codex/harness-sync/reference.md +153 -0
  378. package/resources/harness/bundles/java/codex/harness-test/SKILL.md +172 -0
  379. package/resources/harness/bundles/java/codex/harness-test/checklist.md +317 -0
  380. package/resources/harness/bundles/java/codex/harness-test/pitfalls-java.md +16 -0
  381. package/resources/harness/bundles/java/codex/harness-test/pitfalls.md +260 -0
  382. package/resources/harness/bundles/java/codex/harness-test/reference.md +788 -0
  383. package/resources/harness/bundles/java/codex/protocols/archive-report-protocol.md +175 -0
  384. package/resources/harness/bundles/java/codex/protocols/evidence-based-reporting-protocol.md +134 -0
  385. package/resources/harness/bundles/java/codex/protocols/ledger-protocol.md +270 -0
  386. package/resources/harness/bundles/java/codex/protocols/powershell-protocol.md +181 -0
  387. package/resources/harness/bundles/java/codex/protocols/report-pipeline-protocol.md +150 -0
  388. package/resources/harness/bundles/java/codex/protocols/sensitive-info-protocol.md +92 -0
  389. package/resources/harness/bundles/java/codex/protocols/state-layout-protocol.md +131 -0
  390. package/resources/harness/bundles/java/codex/protocols/submit-protocol.md +78 -0
  391. package/resources/harness/bundles/java/codex/scripts/harness_archive.py +2319 -0
  392. package/resources/harness/bundles/java/codex/scripts/harness_deploy.py +674 -0
  393. package/resources/harness/bundles/java/codex/scripts/harness_events.py +680 -0
  394. package/resources/harness/bundles/java/codex/scripts/harness_ledger.py +671 -0
  395. package/resources/harness/bundles/java/codex/scripts/harness_preflight.py +780 -0
  396. package/resources/harness/bundles/java/codex/scripts/harness_service.py +1331 -0
  397. package/resources/harness/bundles/java/cursor/.harness-build.json +6 -0
  398. package/resources/harness/bundles/java/cursor/CONTEXT.md +65 -0
  399. package/resources/harness/bundles/java/cursor/README.md +478 -0
  400. package/resources/harness/bundles/java/cursor/harness-apidoc/SKILL.md +68 -0
  401. package/resources/harness/bundles/java/cursor/harness-apidoc/checklist.md +142 -0
  402. package/resources/harness/bundles/java/cursor/harness-apidoc/reference.md +233 -0
  403. package/resources/harness/bundles/java/cursor/harness-archive/SKILL.md +198 -0
  404. package/resources/harness/bundles/java/cursor/harness-archive/checklist.md +52 -0
  405. package/resources/harness/bundles/java/cursor/harness-archive/reference.md +103 -0
  406. package/resources/harness/bundles/java/cursor/harness-archive/scripts/gen-manifest.ps1 +31 -0
  407. package/resources/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +171 -0
  408. package/resources/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +128 -0
  409. package/resources/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +95 -0
  410. package/resources/harness/bundles/java/cursor/harness-codebase-map/checklist.md +126 -0
  411. package/resources/harness/bundles/java/cursor/harness-codebase-map/reference.md +364 -0
  412. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
  413. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/CONCERNS.md +49 -0
  414. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/CONVENTIONS.md +57 -0
  415. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
  416. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/STACK.md +55 -0
  417. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/STRUCTURE.md +69 -0
  418. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/TESTING.md +64 -0
  419. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/map-manifest.schema.json +73 -0
  420. package/resources/harness/bundles/java/cursor/harness-codebase-map/templates/map-summary.md +64 -0
  421. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +229 -0
  422. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/design.md +842 -0
  423. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +42 -0
  424. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/mcp-config.example.json +10 -0
  425. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +309 -0
  426. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +4082 -0
  427. package/resources/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +273 -0
  428. package/resources/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +147 -0
  429. package/resources/harness/bundles/java/cursor/harness-package/SKILL.md +69 -0
  430. package/resources/harness/bundles/java/cursor/harness-package/checklist.md +322 -0
  431. package/resources/harness/bundles/java/cursor/harness-package/reference.md +210 -0
  432. package/resources/harness/bundles/java/cursor/harness-plan/SKILL.md +109 -0
  433. package/resources/harness/bundles/java/cursor/harness-plan/checklist.md +243 -0
  434. package/resources/harness/bundles/java/cursor/harness-plan/protocols.md +124 -0
  435. package/resources/harness/bundles/java/cursor/harness-plan/reference.md +376 -0
  436. package/resources/harness/bundles/java/cursor/harness-review/SKILL.md +137 -0
  437. package/resources/harness/bundles/java/cursor/harness-review/checklist.md +124 -0
  438. package/resources/harness/bundles/java/cursor/harness-review/protocols.md +68 -0
  439. package/resources/harness/bundles/java/cursor/harness-review/reference.md +86 -0
  440. package/resources/harness/bundles/java/cursor/harness-run/SKILL.md +129 -0
  441. package/resources/harness/bundles/java/cursor/harness-run/checklist.md +250 -0
  442. package/resources/harness/bundles/java/cursor/harness-run/protocols.md +78 -0
  443. package/resources/harness/bundles/java/cursor/harness-run/reference.md +814 -0
  444. package/resources/harness/bundles/java/cursor/harness-submit/SKILL.md +149 -0
  445. package/resources/harness/bundles/java/cursor/harness-submit/checklist.md +407 -0
  446. package/resources/harness/bundles/java/cursor/harness-submit/reference.md +152 -0
  447. package/resources/harness/bundles/java/cursor/harness-sync/SKILL.md +65 -0
  448. package/resources/harness/bundles/java/cursor/harness-sync/reference.md +153 -0
  449. package/resources/harness/bundles/java/cursor/harness-test/SKILL.md +172 -0
  450. package/resources/harness/bundles/java/cursor/harness-test/checklist.md +317 -0
  451. package/resources/harness/bundles/java/cursor/harness-test/pitfalls-java.md +16 -0
  452. package/resources/harness/bundles/java/cursor/harness-test/pitfalls.md +260 -0
  453. package/resources/harness/bundles/java/cursor/harness-test/reference.md +788 -0
  454. package/resources/harness/bundles/java/cursor/protocols/archive-report-protocol.md +175 -0
  455. package/resources/harness/bundles/java/cursor/protocols/evidence-based-reporting-protocol.md +134 -0
  456. package/resources/harness/bundles/java/cursor/protocols/ledger-protocol.md +270 -0
  457. package/resources/harness/bundles/java/cursor/protocols/powershell-protocol.md +181 -0
  458. package/resources/harness/bundles/java/cursor/protocols/report-pipeline-protocol.md +150 -0
  459. package/resources/harness/bundles/java/cursor/protocols/sensitive-info-protocol.md +92 -0
  460. package/resources/harness/bundles/java/cursor/protocols/state-layout-protocol.md +131 -0
  461. package/resources/harness/bundles/java/cursor/protocols/submit-protocol.md +78 -0
  462. package/resources/harness/bundles/java/cursor/scripts/harness_archive.py +2319 -0
  463. package/resources/harness/bundles/java/cursor/scripts/harness_deploy.py +674 -0
  464. package/resources/harness/bundles/java/cursor/scripts/harness_events.py +680 -0
  465. package/resources/harness/bundles/java/cursor/scripts/harness_ledger.py +671 -0
  466. package/resources/harness/bundles/java/cursor/scripts/harness_preflight.py +780 -0
  467. package/resources/harness/bundles/java/cursor/scripts/harness_service.py +1331 -0
  468. package/resources/harness/manifests/{general.json → general/claude-code.json} +27 -26
  469. package/resources/harness/manifests/general/codebuddy.json +277 -0
  470. package/resources/harness/manifests/general/codex.json +265 -0
  471. package/resources/harness/manifests/general/cursor.json +265 -0
  472. package/resources/harness/manifests/{java.json → java/claude-code.json} +31 -30
  473. package/resources/harness/manifests/java/codebuddy.json +305 -0
  474. package/resources/harness/manifests/java/codex.json +293 -0
  475. package/resources/harness/manifests/java/cursor.json +293 -0
  476. package/resources/harness/general/.harness-build.json +0 -5
  477. package/resources/harness/java/.harness-build.json +0 -5
  478. /package/resources/harness/{general → bundles/general/claude-code}/CONTEXT.md +0 -0
  479. /package/resources/harness/{general → bundles/general/claude-code}/README.md +0 -0
  480. /package/resources/harness/{general → bundles/general/claude-code}/agents/harness-evaluator.md +0 -0
  481. /package/resources/harness/{general → bundles/general/claude-code}/agents/harness-explorer.md +0 -0
  482. /package/resources/harness/{general → bundles/general/claude-code}/harness-archive/checklist.md +0 -0
  483. /package/resources/harness/{general → bundles/general/claude-code}/harness-archive/reference.md +0 -0
  484. /package/resources/harness/{general → bundles/general/claude-code}/harness-archive/scripts/gen-manifest.ps1 +0 -0
  485. /package/resources/harness/{general → bundles/general/claude-code}/harness-archive/templates/render-summary.mjs +0 -0
  486. /package/resources/harness/{general → bundles/general/claude-code}/harness-archive/templates/summary-data-template.json +0 -0
  487. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/checklist.md +0 -0
  488. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/reference.md +0 -0
  489. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/ARCHITECTURE.md +0 -0
  490. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/CONCERNS.md +0 -0
  491. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/CONVENTIONS.md +0 -0
  492. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/INTEGRATIONS.md +0 -0
  493. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/STACK.md +0 -0
  494. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/STRUCTURE.md +0 -0
  495. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/TESTING.md +0 -0
  496. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/map-manifest.schema.json +0 -0
  497. /package/resources/harness/{general → bundles/general/claude-code}/harness-codebase-map/templates/map-summary.md +0 -0
  498. /package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-ingest/design.md +0 -0
  499. /package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -0
  500. /package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-ingest/mcp-config.example.json +0 -0
  501. /package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -0
  502. /package/resources/harness/{general → bundles/general/claude-code}/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -0
  503. /package/resources/harness/{general → bundles/general/claude-code}/harness-plan/checklist.md +0 -0
  504. /package/resources/harness/{general → bundles/general/claude-code}/harness-plan/protocols.md +0 -0
  505. /package/resources/harness/{general → bundles/general/claude-code}/harness-plan/reference.md +0 -0
  506. /package/resources/harness/{general → bundles/general/claude-code}/harness-review/protocols.md +0 -0
  507. /package/resources/harness/{general → bundles/general/claude-code}/harness-review/reference.md +0 -0
  508. /package/resources/harness/{general → bundles/general/claude-code}/harness-run/protocols.md +0 -0
  509. /package/resources/harness/{general → bundles/general/claude-code}/harness-submit/checklist.md +0 -0
  510. /package/resources/harness/{general → bundles/general/claude-code}/harness-submit/reference.md +0 -0
  511. /package/resources/harness/{general → bundles/general/claude-code}/harness-test/pitfalls.md +0 -0
  512. /package/resources/harness/{general → bundles/general/claude-code}/harness-test/reference.md +0 -0
  513. /package/resources/harness/{general → bundles/general/claude-code}/protocols/archive-report-protocol.md +0 -0
  514. /package/resources/harness/{general → bundles/general/claude-code}/protocols/evidence-based-reporting-protocol.md +0 -0
  515. /package/resources/harness/{general → bundles/general/claude-code}/protocols/ledger-protocol.md +0 -0
  516. /package/resources/harness/{general → bundles/general/claude-code}/protocols/powershell-protocol.md +0 -0
  517. /package/resources/harness/{general → bundles/general/claude-code}/protocols/report-pipeline-protocol.md +0 -0
  518. /package/resources/harness/{general → bundles/general/claude-code}/protocols/sensitive-info-protocol.md +0 -0
  519. /package/resources/harness/{general → bundles/general/claude-code}/protocols/state-layout-protocol.md +0 -0
  520. /package/resources/harness/{general → bundles/general/claude-code}/protocols/submit-protocol.md +0 -0
  521. /package/resources/harness/{java → bundles/general/codebuddy}/CONTEXT.md +0 -0
  522. /package/resources/harness/{java → bundles/general/codebuddy}/README.md +0 -0
  523. /package/resources/harness/{java → bundles/general/codebuddy}/harness-archive/checklist.md +0 -0
  524. /package/resources/harness/{java → bundles/general/codebuddy}/harness-archive/reference.md +0 -0
  525. /package/resources/harness/{java → bundles/general/codebuddy}/harness-archive/scripts/gen-manifest.ps1 +0 -0
  526. /package/resources/harness/{java → bundles/general/codebuddy}/harness-archive/templates/render-summary.mjs +0 -0
  527. /package/resources/harness/{java → bundles/general/codebuddy}/harness-archive/templates/summary-data-template.json +0 -0
  528. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/checklist.md +0 -0
  529. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/reference.md +0 -0
  530. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/ARCHITECTURE.md +0 -0
  531. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/CONCERNS.md +0 -0
  532. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/CONVENTIONS.md +0 -0
  533. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/INTEGRATIONS.md +0 -0
  534. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/STACK.md +0 -0
  535. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/STRUCTURE.md +0 -0
  536. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/TESTING.md +0 -0
  537. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/map-manifest.schema.json +0 -0
  538. /package/resources/harness/{java → bundles/general/codebuddy}/harness-codebase-map/templates/map-summary.md +0 -0
  539. /package/resources/harness/{java → bundles/general/codebuddy}/harness-knowledge-ingest/design.md +0 -0
  540. /package/resources/harness/{java → bundles/general/codebuddy}/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -0
  541. /package/resources/harness/{java → bundles/general/codebuddy}/harness-knowledge-ingest/mcp-config.example.json +0 -0
  542. /package/resources/harness/{java → bundles/general/codebuddy}/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -0
  543. /package/resources/harness/{java → bundles/general/codebuddy}/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -0
  544. /package/resources/harness/{java → bundles/general/codebuddy}/harness-plan/checklist.md +0 -0
  545. /package/resources/harness/{java → bundles/general/codebuddy}/harness-plan/protocols.md +0 -0
  546. /package/resources/harness/{java → bundles/general/codebuddy}/harness-plan/reference.md +0 -0
  547. /package/resources/harness/{java → bundles/general/codebuddy}/harness-review/protocols.md +0 -0
  548. /package/resources/harness/{java → bundles/general/codebuddy}/harness-review/reference.md +0 -0
  549. /package/resources/harness/{java → bundles/general/codebuddy}/harness-run/protocols.md +0 -0
  550. /package/resources/harness/{java → bundles/general/codebuddy}/harness-submit/checklist.md +0 -0
  551. /package/resources/harness/{java → bundles/general/codebuddy}/harness-submit/reference.md +0 -0
  552. /package/resources/harness/{java → bundles/general/codebuddy}/harness-test/pitfalls.md +0 -0
  553. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/archive-report-protocol.md +0 -0
  554. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/evidence-based-reporting-protocol.md +0 -0
  555. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/ledger-protocol.md +0 -0
  556. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/powershell-protocol.md +0 -0
  557. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/report-pipeline-protocol.md +0 -0
  558. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/sensitive-info-protocol.md +0 -0
  559. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/state-layout-protocol.md +0 -0
  560. /package/resources/harness/{java → bundles/general/codebuddy}/protocols/submit-protocol.md +0 -0
  561. /package/resources/harness/{java → bundles/java/claude-code}/agents/harness-evaluator.md +0 -0
  562. /package/resources/harness/{java → bundles/java/claude-code}/agents/harness-explorer.md +0 -0
  563. /package/resources/harness/{java → bundles/java/claude-code}/harness-apidoc/checklist.md +0 -0
  564. /package/resources/harness/{java → bundles/java/claude-code}/harness-apidoc/reference.md +0 -0
  565. /package/resources/harness/{java → bundles/java/claude-code}/harness-package/checklist.md +0 -0
  566. /package/resources/harness/{java → bundles/java/claude-code}/harness-test/pitfalls-java.md +0 -0
@@ -0,0 +1,674 @@
1
+ #!/usr/bin/env python3
2
+ """Harness deploy: build core + overlay into self-contained skills tree (D9/D12).
3
+
4
+ Python 3.10+ stdlib only. UTF-8 without BOM.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import datetime as dt
11
+ import filecmp
12
+ import hashlib
13
+ import json
14
+ import os
15
+ import re
16
+ import shutil
17
+ import sys
18
+ import uuid
19
+ from pathlib import Path
20
+ from typing import Any, Iterable
21
+
22
+ if hasattr(sys.stdout, "reconfigure"):
23
+ sys.stdout.reconfigure(encoding="utf-8")
24
+ if hasattr(sys.stderr, "reconfigure"):
25
+ sys.stderr.reconfigure(encoding="utf-8")
26
+
27
+ INCLUDE_RE = re.compile(r"<!--\s*@include\s+shared/([^\s]+)\s*-->")
28
+ # §7.5: overlay anchors support both new section-id and legacy section:"title".
29
+ OVERRIDE_RE = re.compile(r'<!--\s*@override\s+(?:section-id:"([^"]+)"|section:"([^"]+)")\s*-->')
30
+ APPEND_RE = re.compile(r'<!--\s*@append-after\s+(?:section-id:"([^"]+)"|section:"([^"]+)")\s*-->')
31
+ SECTION_ID_RE = re.compile(r"<!--\s*@section-id\s+([\w.-]+)\s*-->")
32
+ HEADING_RE = re.compile(r"^(#{2,6})\s+(.+?)\s*$")
33
+ FRAGMENT_HINT_RE = re.compile(r"^>\s*片段:\[\[shared/[^\]]+\]\]\s*.*$")
34
+
35
+ BUILD_MARKER = ".harness-build.json"
36
+
37
+ SKIP_DIR_NAMES = {
38
+ "__pycache__",
39
+ ".pytest_cache",
40
+ "redesign",
41
+ "shared",
42
+ "overlays",
43
+ "adapters",
44
+ ".git",
45
+ }
46
+ SKIP_TOP_NAMES = {"harness-merge", "harness-report"}
47
+ HARNESS_AGENTS = ("claude-code", "codex", "cursor", "codebuddy")
48
+ AGENTS_WITH_CUSTOM_AGENTS = frozenset({"claude-code", "codebuddy"})
49
+
50
+
51
+ def now_iso() -> str:
52
+ return dt.datetime.now().astimezone().isoformat(timespec="seconds")
53
+
54
+
55
+ def emit_json(payload: dict[str, Any], *, ok: bool = True) -> int:
56
+ print(json.dumps(payload, ensure_ascii=False, indent=2))
57
+ return 0 if ok else 1
58
+
59
+
60
+ def normalize_section_title(title: str) -> str:
61
+ t = title.strip()
62
+ t = re.sub(r"\s*⚠️.*$", "", t)
63
+ t = re.sub(r"\s*([^)]*)\s*$", "", t)
64
+ return t.strip()
65
+
66
+
67
+ def sha256_file(path: Path) -> str:
68
+ h = hashlib.sha256()
69
+ with path.open("rb") as fh:
70
+ for chunk in iter(lambda: fh.read(65536), b""):
71
+ h.update(chunk)
72
+ return h.hexdigest()
73
+
74
+
75
+ def iter_copy_entries(skills_root: Path, agent: str = "claude-code") -> Iterable[Path]:
76
+ for entry in sorted(skills_root.iterdir()):
77
+ if entry.name in SKIP_TOP_NAMES:
78
+ continue
79
+ if entry.is_dir() and entry.name in SKIP_DIR_NAMES:
80
+ continue
81
+ if entry.is_dir() and entry.name == "agents" and agent not in AGENTS_WITH_CUSTOM_AGENTS:
82
+ continue
83
+ if entry.is_file() and entry.name.startswith("."):
84
+ continue
85
+ yield entry
86
+
87
+
88
+ RUNTIME_IGNORE = shutil.ignore_patterns(
89
+ "tests", "__pycache__", "*.pyc", ".pytest_cache", "_last_run.txt", "_same_proc_*"
90
+ )
91
+ RUNTIME_SKIP_FILES = {"_last_run.txt", "_same_proc_pid.txt", "_same_proc_tmp.txt"}
92
+
93
+
94
+ def copy_tree(skills_root: Path, out_dir: Path, agent: str = "claude-code") -> list[str]:
95
+ copied: list[str] = []
96
+ out_dir.mkdir(parents=True, exist_ok=True)
97
+ for entry in iter_copy_entries(skills_root, agent):
98
+ dest = out_dir / entry.name
99
+ if entry.is_dir():
100
+ if entry.name == "scripts":
101
+ # §7.4: runtime keeps only scripts/*.py; scripts/tests/ excluded.
102
+ # harness_acceptance.py is an acceptance meta-tool (not a runtime
103
+ # skill script) and is excluded from the deployed tree.
104
+ dest.mkdir(parents=True, exist_ok=True)
105
+ for py in sorted(entry.glob("*.py")):
106
+ if py.name == "harness_acceptance.py":
107
+ continue
108
+ shutil.copy2(py, dest / py.name)
109
+ copied.append(f"scripts/{py.name}")
110
+ else:
111
+ shutil.copytree(entry, dest, ignore=RUNTIME_IGNORE)
112
+ copied.append(entry.name + "/")
113
+ else:
114
+ if entry.name in RUNTIME_SKIP_FILES or entry.name.endswith(".pyc"):
115
+ continue
116
+ shutil.copy2(entry, dest)
117
+ copied.append(entry.name)
118
+ return copied
119
+
120
+
121
+ def expand_includes(text: str, shared_dir: Path) -> str:
122
+ def repl(match: re.Match[str]) -> str:
123
+ rel = match.group(1)
124
+ inc_path = shared_dir / rel
125
+ if not inc_path.is_file():
126
+ raise FileNotFoundError(f"shared include not found: {rel}")
127
+ body = inc_path.read_text(encoding="utf-8").rstrip()
128
+ return body
129
+
130
+ expanded = INCLUDE_RE.sub(repl, text)
131
+ lines = [ln for ln in expanded.splitlines() if not FRAGMENT_HINT_RE.match(ln)]
132
+ return "\n".join(lines) + ("\n" if text.endswith("\n") else "")
133
+
134
+
135
+ def find_section_span(lines: list[str], section: str) -> tuple[int, int, int]:
136
+ target = normalize_section_title(section)
137
+ start = end = level = -1
138
+ for i, line in enumerate(lines):
139
+ m = HEADING_RE.match(line)
140
+ if not m:
141
+ continue
142
+ title = normalize_section_title(m.group(2))
143
+ if title == target or title.startswith(target):
144
+ start = i
145
+ level = len(m.group(1))
146
+ break
147
+ if start < 0:
148
+ raise KeyError(section)
149
+ end = len(lines)
150
+ for j in range(start + 1, len(lines)):
151
+ m = HEADING_RE.match(lines[j])
152
+ if m and len(m.group(1)) <= level:
153
+ end = j
154
+ break
155
+ return start, end, level
156
+
157
+
158
+ def parse_section_ids(text: str) -> dict[str, tuple[int, int, int]]:
159
+ """Parse ``<!-- @section-id name -->`` markers; map id -> (start, end, level)
160
+ of the heading that follows. Raise ValueError on duplicate ids (§7.5)."""
161
+ lines = text.splitlines()
162
+ ids: dict[str, tuple[int, int, int]] = {}
163
+ pending: str | None = None
164
+ for i, line in enumerate(lines):
165
+ m = SECTION_ID_RE.search(line)
166
+ if m:
167
+ sid = m.group(1)
168
+ if sid in ids:
169
+ raise ValueError(f"duplicate section-id: {sid}")
170
+ pending = sid
171
+ continue
172
+ hm = HEADING_RE.match(line)
173
+ if hm and pending is not None:
174
+ level = len(hm.group(1))
175
+ start = i
176
+ end = len(lines)
177
+ for j in range(i + 1, len(lines)):
178
+ m2 = HEADING_RE.match(lines[j])
179
+ if m2 and len(m2.group(1)) <= level:
180
+ end = j
181
+ break
182
+ ids[pending] = (start, end, level)
183
+ pending = None
184
+ return ids
185
+
186
+
187
+ def apply_overlay_blocks(
188
+ core_text: str, overlay_text: str, section_ids: dict[str, tuple[int, int, int]] | None = None
189
+ ) -> str:
190
+ lines = core_text.splitlines()
191
+ pos = 0
192
+ while pos < len(overlay_text):
193
+ override = OVERRIDE_RE.search(overlay_text, pos)
194
+ append = APPEND_RE.search(overlay_text, pos)
195
+ candidates = [(m.start(), "override", m) for m in [override] if m]
196
+ candidates += [(m.start(), "append", m) for m in [append] if m]
197
+ if not candidates:
198
+ break
199
+ candidates.sort(key=lambda x: x[0])
200
+ _, kind, match = candidates[0]
201
+ section_id = match.group(1) # new style, may be None
202
+ section_title = match.group(2) # legacy style, may be None
203
+ content_start = match.end()
204
+ next_marker = min(
205
+ (
206
+ m.start()
207
+ for m in (
208
+ OVERRIDE_RE.search(overlay_text, content_start),
209
+ APPEND_RE.search(overlay_text, content_start),
210
+ )
211
+ if m
212
+ ),
213
+ default=len(overlay_text),
214
+ )
215
+ block = overlay_text[content_start:next_marker].strip("\n")
216
+ if section_id:
217
+ if not section_ids or section_id not in section_ids:
218
+ raise KeyError(f"section-id:{section_id}")
219
+ start, end, _ = section_ids[section_id]
220
+ else:
221
+ start, end, _ = find_section_span(lines, section_title)
222
+ if kind == "override":
223
+ replacement = block.splitlines()
224
+ lines = lines[:start] + replacement + lines[end:]
225
+ else:
226
+ insertion = block.splitlines()
227
+ lines = lines[:end] + insertion + lines[end:]
228
+ pos = next_marker
229
+ return "\n".join(lines) + ("\n" if core_text.endswith("\n") else "")
230
+
231
+
232
+ def _is_relative_to(child: Path, parent: Path) -> bool:
233
+ try:
234
+ child.relative_to(parent)
235
+ return True
236
+ except ValueError:
237
+ return False
238
+
239
+
240
+ def validate_build_paths(skills_root: Path, out_dir: Path) -> tuple[Path, Path]:
241
+ """Return resolved safe paths; raise ValueError for every forbidden relation.
242
+
243
+ §7.1: refuse out==source, out as ancestor of source, out inside source,
244
+ an existing non-empty out without the build marker, and obvious danger
245
+ dirs (user home).
246
+ """
247
+ skills_root = skills_root.resolve()
248
+ out_dir = out_dir.resolve()
249
+
250
+ if out_dir == skills_root:
251
+ raise ValueError(f"out_dir must not equal skills_root: {out_dir}")
252
+ if _is_relative_to(skills_root, out_dir):
253
+ raise ValueError(f"out_dir must not be an ancestor of skills_root: {out_dir}")
254
+ if _is_relative_to(out_dir, skills_root):
255
+ raise ValueError(f"out_dir must not be inside skills_root: {out_dir}")
256
+ try:
257
+ home = Path.home().resolve()
258
+ except OSError:
259
+ home = None
260
+ if home is not None and out_dir == home:
261
+ raise ValueError(f"out_dir must not be the user home: {out_dir}")
262
+
263
+ if out_dir.exists() and out_dir.is_dir():
264
+ has_marker = (out_dir / BUILD_MARKER).is_file()
265
+ has_user_files = any(p.name != BUILD_MARKER for p in out_dir.iterdir())
266
+ if has_user_files and not has_marker:
267
+ raise ValueError(
268
+ f"out_dir exists with user files and no {BUILD_MARKER} marker: {out_dir}"
269
+ )
270
+ return skills_root, out_dir
271
+
272
+
273
+ def core_content_hash(
274
+ skills_root: Path,
275
+ overlay_dir: Path | None,
276
+ agent_overlay_dir: Path | None = None,
277
+ ) -> str:
278
+ """SHA-256 over the actual core/shared/protocol/script/overlay files that
279
+ participate in the build (path-relative + content). Deterministic across
280
+ time and machine paths (§7.3)."""
281
+ h = hashlib.sha256()
282
+ files: list[Path] = []
283
+ # Hash exactly the runtime source universe copied by copy_tree, including
284
+ # references/templates/checklists rather than only SKILL.md files.
285
+ for entry in iter_copy_entries(skills_root):
286
+ if entry.is_file():
287
+ if entry.name not in RUNTIME_SKIP_FILES and not entry.name.endswith(".pyc"):
288
+ files.append(entry)
289
+ elif entry.name == "scripts":
290
+ files.extend(p for p in entry.glob("*.py") if p.name != "harness_acceptance.py")
291
+ else:
292
+ files.extend(
293
+ p for p in entry.rglob("*")
294
+ if p.is_file() and "__pycache__" not in p.parts and "tests" not in p.parts
295
+ and not p.name.endswith(".pyc") and p.name not in RUNTIME_SKIP_FILES
296
+ )
297
+ if overlay_dir and overlay_dir.is_dir():
298
+ files.extend(p for p in overlay_dir.rglob("*") if p.is_file())
299
+ if agent_overlay_dir and agent_overlay_dir.is_dir():
300
+ files.extend(p for p in agent_overlay_dir.rglob("*") if p.is_file())
301
+ for f in sorted(set(files)):
302
+ rel = f.resolve().relative_to(skills_root.resolve()).as_posix()
303
+ h.update(rel.encode("utf-8"))
304
+ h.update(b"\0")
305
+ h.update(sha256_file(f).encode("ascii"))
306
+ h.update(b"\0")
307
+ return h.hexdigest()[:16]
308
+
309
+
310
+ def synthesis_header(
311
+ skills_root: Path,
312
+ overlay_dir: Path | None,
313
+ agent: str = "claude-code",
314
+ agent_overlay_dir: Path | None = None,
315
+ ) -> str:
316
+ """Deterministic synth header: no absolute path, no timestamp (§7.3)."""
317
+ core_hash = core_content_hash(skills_root, overlay_dir, agent_overlay_dir)
318
+ overlay_name = overlay_dir.name if overlay_dir else "none"
319
+ return (
320
+ f"<!-- generated by harness_deploy.py; core={core_hash}; "
321
+ f"overlay={overlay_name}; agent={agent}; do not edit -->\n"
322
+ )
323
+
324
+
325
+ def inject_header(text: str, header: str) -> str:
326
+ if text.startswith("---"):
327
+ parts = text.split("---", 2)
328
+ if len(parts) >= 3:
329
+ body = parts[2].lstrip("\n")
330
+ return f"---{parts[1]}---\n{header}{body}"
331
+ return header + text
332
+
333
+
334
+ def process_skill_md(
335
+ path: Path,
336
+ shared_dir: Path,
337
+ overlay_path: Path | None,
338
+ header: str,
339
+ agent_overlay_path: Path | None = None,
340
+ ) -> None:
341
+ text = path.read_text(encoding="utf-8")
342
+ text = expand_includes(text, shared_dir)
343
+ section_ids = parse_section_ids(text) # §7.5: raises on duplicate section-id
344
+ if overlay_path and overlay_path.is_file():
345
+ overlay = overlay_path.read_text(encoding="utf-8")
346
+ text = apply_overlay_blocks(text, overlay, section_ids)
347
+ section_ids = parse_section_ids(text)
348
+ if agent_overlay_path and agent_overlay_path.is_file():
349
+ agent_overlay = agent_overlay_path.read_text(encoding="utf-8")
350
+ text = apply_overlay_blocks(text, agent_overlay, section_ids)
351
+ text = inject_header(text, header)
352
+ if INCLUDE_RE.search(text):
353
+ raise RuntimeError(f"unexpanded include placeholder remains in {path}")
354
+ path.write_text(text, encoding="utf-8", newline="\n")
355
+
356
+
357
+ def overlay_for_skill(overlay_dir: Path, skill_name: str) -> Path | None:
358
+ candidate = overlay_dir / f"{skill_name}.overlay.md"
359
+ return candidate if candidate.is_file() else None
360
+
361
+
362
+ def copy_adapter_agents(adapter_agents_dir: Path, staging: Path) -> list[str]:
363
+ """Copy adapters/<agent>/agents/*.md over staging/agents/."""
364
+ if not adapter_agents_dir.is_dir():
365
+ return []
366
+ dest = staging / "agents"
367
+ dest.mkdir(parents=True, exist_ok=True)
368
+ copied: list[str] = []
369
+ for agent_file in sorted(adapter_agents_dir.glob("*.md")):
370
+ shutil.copy2(agent_file, dest / agent_file.name)
371
+ copied.append(f"agents/{agent_file.name}")
372
+ return copied
373
+
374
+
375
+ def copy_overlay_unique_skills(overlay_dir: Path, out_dir: Path) -> list[str]:
376
+ added: list[str] = []
377
+ for entry in sorted(overlay_dir.iterdir()):
378
+ if not entry.is_dir():
379
+ continue
380
+ if not entry.name.startswith("harness-"):
381
+ continue
382
+ if not (entry / "SKILL.md").is_file():
383
+ continue
384
+ if (out_dir / entry.name).exists():
385
+ continue
386
+ shutil.copytree(
387
+ entry,
388
+ out_dir / entry.name,
389
+ ignore=shutil.ignore_patterns("__pycache__", "*.pyc"),
390
+ )
391
+ added.append(entry.name + "/")
392
+ return added
393
+
394
+
395
+ def merge_overlay_skill_extras(overlay_dir: Path, out_dir: Path) -> list[str]:
396
+ """Copy overlays/java/harness-<name>/* into existing out/harness-<name>/ (reference, etc.)."""
397
+ merged: list[str] = []
398
+ unique = {
399
+ p.name
400
+ for p in overlay_dir.iterdir()
401
+ if p.is_dir() and (p / "SKILL.md").is_file()
402
+ }
403
+ for entry in sorted(overlay_dir.iterdir()):
404
+ if not entry.is_dir() or not entry.name.startswith("harness-"):
405
+ continue
406
+ if entry.name in unique:
407
+ continue
408
+ dest_skill = out_dir / entry.name
409
+ if not dest_skill.is_dir():
410
+ continue
411
+ for src in entry.rglob("*"):
412
+ if src.is_dir() or "__pycache__" in src.parts:
413
+ continue
414
+ rel = src.relative_to(entry)
415
+ dest = dest_skill / rel
416
+ dest.parent.mkdir(parents=True, exist_ok=True)
417
+ shutil.copy2(src, dest)
418
+ merged.append(f"{entry.name}/{rel.as_posix()}")
419
+ return merged
420
+
421
+
422
+ def copy_overlay_extras(overlay_dir: Path, out_dir: Path) -> list[str]:
423
+ extras: list[str] = []
424
+ # §7.4: PROJECT-PROFILE-EXAMPLE.md stays a Vault doc (UDP real values);
425
+ # it must NOT be installed to runtime. Only pitfalls-java.md is runtime.
426
+ pitfalls = overlay_dir / "pitfalls-java.md"
427
+ if pitfalls.is_file():
428
+ test_pit = out_dir / "harness-test" / "pitfalls-java.md"
429
+ test_pit.parent.mkdir(parents=True, exist_ok=True)
430
+ shutil.copy2(pitfalls, test_pit)
431
+ extras.append("harness-test/pitfalls-java.md")
432
+ return extras
433
+
434
+
435
+ def cmd_build(
436
+ skills_root: Path,
437
+ out_dir: Path,
438
+ overlay: str | None,
439
+ agent: str | None = None,
440
+ ) -> dict[str, Any]:
441
+ skills_root, out_dir = validate_build_paths(skills_root, out_dir)
442
+ shared_dir = skills_root / "shared"
443
+ if not shared_dir.is_dir():
444
+ raise FileNotFoundError(f"shared/ missing under {skills_root}")
445
+ if agent is None:
446
+ print(
447
+ "WARNING: --agent missing, defaulting to claude-code (deprecated)",
448
+ file=sys.stderr,
449
+ )
450
+ agent = "claude-code"
451
+ if agent not in HARNESS_AGENTS:
452
+ raise ValueError(f"unknown agent: {agent}")
453
+ overlay_dir = skills_root / "overlays" / overlay if overlay else None
454
+ if overlay and (not overlay_dir or not overlay_dir.is_dir()):
455
+ raise FileNotFoundError(f"overlay not found: overlays/{overlay}")
456
+ agent_overlay_dir = skills_root / "adapters" / agent / "skill-overlays"
457
+ if not agent_overlay_dir.is_dir():
458
+ agent_overlay_dir = None
459
+ adapter_agents_dir = skills_root / "adapters" / agent / "agents"
460
+
461
+ # §7.2: build entirely in a staging dir; out_dir is untouched until the
462
+ # atomic swap. Never `shutil.rmtree(out_dir)` at build start.
463
+ staging = out_dir.parent / f".{out_dir.name}.staging-{uuid.uuid4().hex[:8]}"
464
+ if staging.exists():
465
+ shutil.rmtree(staging)
466
+ try:
467
+ copied = copy_tree(skills_root, staging, agent)
468
+ if overlay:
469
+ copied.extend(copy_overlay_unique_skills(overlay_dir, staging))
470
+ copied.extend(copy_overlay_extras(overlay_dir, staging))
471
+ copied.extend(merge_overlay_skill_extras(overlay_dir, staging))
472
+ if agent in AGENTS_WITH_CUSTOM_AGENTS:
473
+ copied.extend(copy_adapter_agents(adapter_agents_dir, staging))
474
+
475
+ header = synthesis_header(skills_root, overlay_dir, agent, agent_overlay_dir)
476
+ processed: list[str] = []
477
+ for skill_md in sorted(staging.glob("harness-*/SKILL.md")):
478
+ ov = overlay_for_skill(overlay_dir, skill_md.parent.name) if overlay_dir else None
479
+ agent_ov = (
480
+ overlay_for_skill(agent_overlay_dir, skill_md.parent.name)
481
+ if agent_overlay_dir
482
+ else None
483
+ )
484
+ try:
485
+ process_skill_md(skill_md, shared_dir, ov, header, agent_ov)
486
+ except KeyError as exc:
487
+ raise KeyError(
488
+ f"overlay anchor not found: {exc.args[0]} ({skill_md})"
489
+ ) from exc
490
+ processed.append(str(skill_md.relative_to(staging)))
491
+
492
+ for skill_md in sorted(staging.glob("harness-*/SKILL.md")):
493
+ if INCLUDE_RE.search(skill_md.read_text(encoding="utf-8")):
494
+ raise RuntimeError(f"include placeholder remains: {skill_md}")
495
+
496
+ # deterministic build marker (no timestamp -> byte-identical builds)
497
+ core_hash = core_content_hash(skills_root, overlay_dir, agent_overlay_dir)
498
+ (staging / BUILD_MARKER).write_text(
499
+ json.dumps(
500
+ {
501
+ "schemaVersion": 1,
502
+ "overlay": overlay or "none",
503
+ "agent": agent,
504
+ "coreHash": core_hash,
505
+ },
506
+ ensure_ascii=False,
507
+ indent=2,
508
+ )
509
+ + "\n",
510
+ encoding="utf-8",
511
+ newline="\n",
512
+ )
513
+ except Exception:
514
+ # build failed: clean staging, leave out_dir completely untouched
515
+ shutil.rmtree(staging, ignore_errors=True)
516
+ raise
517
+
518
+ # atomic swap: move old out aside (if a valid build), rename staging -> out
519
+ old_backup = None
520
+ if out_dir.exists():
521
+ if (out_dir / BUILD_MARKER).is_file():
522
+ old_backup = out_dir.parent / f".{out_dir.name}.old-{uuid.uuid4().hex[:8]}"
523
+ os.replace(out_dir, old_backup)
524
+ else:
525
+ shutil.rmtree(staging, ignore_errors=True)
526
+ raise ValueError(f"refusing to overwrite unmarked out_dir: {out_dir}")
527
+ try:
528
+ os.replace(staging, out_dir)
529
+ except OSError:
530
+ if old_backup is not None and old_backup.exists():
531
+ os.replace(old_backup, out_dir)
532
+ raise
533
+ if old_backup is not None:
534
+ shutil.rmtree(old_backup, ignore_errors=True)
535
+
536
+ return {
537
+ "ok": True,
538
+ "action": "build",
539
+ "skillsRoot": str(skills_root),
540
+ "outDir": str(out_dir),
541
+ "overlay": overlay,
542
+ "agent": agent,
543
+ "copied": copied,
544
+ "processedSkills": processed,
545
+ }
546
+
547
+
548
+ def collect_files(root: Path) -> dict[str, str]:
549
+ files: dict[str, str] = {}
550
+ for path in sorted(root.rglob("*")):
551
+ if path.is_file() and "__pycache__" not in path.parts:
552
+ rel = path.relative_to(root).as_posix()
553
+ files[rel] = sha256_file(path)
554
+ return files
555
+
556
+
557
+ def cmd_install(build_out: Path, project: Path, target: Path | None) -> dict[str, Any]:
558
+ build_out = build_out.resolve()
559
+ project = project.resolve()
560
+ dest = (target or project / ".claude" / "skills").resolve()
561
+ if not (build_out / BUILD_MARKER).is_file():
562
+ raise ValueError(f"install source is not a marked harness build: {build_out}")
563
+ backup: str | None = None
564
+ staging = dest.parent / f".{dest.name}.staging-{uuid.uuid4().hex[:8]}"
565
+ shutil.copytree(build_out, staging)
566
+ if dest.exists() and any(dest.iterdir()):
567
+ stamp = dt.datetime.now().strftime("%Y%m%d-%H%M%S")
568
+ backup_path = dest.parent / f"skills-backup-{stamp}"
569
+ os.replace(dest, backup_path)
570
+ backup = str(backup_path)
571
+ try:
572
+ os.replace(staging, dest)
573
+ except OSError:
574
+ shutil.rmtree(staging, ignore_errors=True)
575
+ if backup:
576
+ os.replace(Path(backup), dest)
577
+ raise
578
+
579
+ agents_src = build_out / "agents"
580
+ agents_dest = project / ".claude" / "agents"
581
+ if agents_src.is_dir():
582
+ agents_dest.mkdir(parents=True, exist_ok=True)
583
+ for agent in agents_src.glob("*.md"):
584
+ shutil.copy2(agent, agents_dest / agent.name)
585
+
586
+ return {
587
+ "ok": True,
588
+ "action": "install",
589
+ "from": str(build_out),
590
+ "project": str(project),
591
+ "target": str(dest),
592
+ "backup": backup,
593
+ "installedAt": now_iso(),
594
+ }
595
+
596
+
597
+ def cmd_diff(build_out: Path, project: Path, target: Path | None) -> dict[str, Any]:
598
+ build_out = build_out.resolve()
599
+ project = project.resolve()
600
+ installed = (target or project / ".claude" / "skills").resolve()
601
+ if not installed.is_dir():
602
+ return {
603
+ "ok": True,
604
+ "action": "diff",
605
+ "stale": True,
606
+ "missingInstall": True,
607
+ "outdated": [],
608
+ "missing": [],
609
+ "extra": [],
610
+ }
611
+
612
+ built = collect_files(build_out)
613
+ current = collect_files(installed)
614
+ outdated = [p for p, h in built.items() if p in current and current[p] != h]
615
+ missing = [p for p in built if p not in current]
616
+ extra = [p for p in current if p not in built]
617
+ return {
618
+ "ok": True,
619
+ "action": "diff",
620
+ "stale": bool(outdated or missing),
621
+ "outdated": sorted(outdated),
622
+ "missing": sorted(missing),
623
+ "extra": sorted(extra),
624
+ "comparedAt": now_iso(),
625
+ }
626
+
627
+
628
+ def build_parser() -> argparse.ArgumentParser:
629
+ p = argparse.ArgumentParser(description="Harness skills deploy (build/install/diff)")
630
+ sub = p.add_subparsers(dest="command", required=True)
631
+
632
+ b = sub.add_parser("build", help="Synthesize core + overlay into output dir")
633
+ b.add_argument("--skills-root", type=Path, required=True)
634
+ b.add_argument("--out", type=Path, required=True)
635
+ b.add_argument("--overlay")
636
+ b.add_argument("--agent", choices=HARNESS_AGENTS)
637
+ b.add_argument("--json", action="store_true")
638
+
639
+ i = sub.add_parser("install", help="Install build output to project .claude/skills")
640
+ i.add_argument("--from", dest="from_dir", type=Path, required=True)
641
+ i.add_argument("--project", type=Path, required=True)
642
+ i.add_argument("--target", type=Path)
643
+ i.add_argument("--json", action="store_true")
644
+
645
+ d = sub.add_parser("diff", help="Compare installed skills vs build output")
646
+ d.add_argument("--from", dest="from_dir", type=Path, required=True)
647
+ d.add_argument("--project", type=Path, required=True)
648
+ d.add_argument("--target", type=Path)
649
+ d.add_argument("--json", action="store_true")
650
+ return p
651
+
652
+
653
+ def main(argv: list[str] | None = None) -> int:
654
+ args = build_parser().parse_args(argv)
655
+ try:
656
+ if args.command == "build":
657
+ result = cmd_build(args.skills_root, args.out, args.overlay, args.agent)
658
+ return emit_json(result) if args.json else 0
659
+ if args.command == "install":
660
+ result = cmd_install(args.from_dir, args.project, args.target)
661
+ return emit_json(result) if args.json else 0
662
+ if args.command == "diff":
663
+ result = cmd_diff(args.from_dir, args.project, args.target)
664
+ return emit_json(result) if args.json else 0
665
+ except (FileNotFoundError, KeyError, RuntimeError, ValueError) as exc:
666
+ if getattr(args, "json", False):
667
+ return emit_json({"ok": False, "error": str(exc)}, ok=False)
668
+ print(f"ERROR: {exc}", file=sys.stderr)
669
+ return 1
670
+ return 1
671
+
672
+
673
+ if __name__ == "__main__":
674
+ raise SystemExit(main())