metaharness 0.3.0 → 0.3.2

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 (384) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +111 -74
  3. package/dist/bin.js +14 -2
  4. package/dist/bin.js.map +1 -1
  5. package/dist/completions-cmd.js +94 -94
  6. package/dist/diag.d.ts +8 -0
  7. package/dist/diag.d.ts.map +1 -1
  8. package/dist/diag.js +79 -15
  9. package/dist/diag.js.map +1 -1
  10. package/dist/export-config.d.ts.map +1 -1
  11. package/dist/export-config.js +3 -12
  12. package/dist/export-config.js.map +1 -1
  13. package/dist/genome.d.ts.map +1 -1
  14. package/dist/genome.js +3 -12
  15. package/dist/genome.js.map +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +101 -75
  18. package/dist/index.js.map +1 -1
  19. package/dist/meta-proxy.d.ts +57 -0
  20. package/dist/meta-proxy.d.ts.map +1 -0
  21. package/dist/meta-proxy.js +325 -0
  22. package/dist/meta-proxy.js.map +1 -0
  23. package/dist/publish-cmd.d.ts.map +1 -1
  24. package/dist/publish-cmd.js +5 -0
  25. package/dist/publish-cmd.js.map +1 -1
  26. package/dist/publish.d.ts +6 -0
  27. package/dist/publish.d.ts.map +1 -1
  28. package/dist/publish.js +9 -0
  29. package/dist/publish.js.map +1 -1
  30. package/dist/redact.d.ts +25 -0
  31. package/dist/redact.d.ts.map +1 -0
  32. package/dist/redact.js +62 -0
  33. package/dist/redact.js.map +1 -0
  34. package/dist/score.d.ts +9 -0
  35. package/dist/score.d.ts.map +1 -1
  36. package/dist/score.js +20 -14
  37. package/dist/score.js.map +1 -1
  38. package/dist/threat-model.d.ts.map +1 -1
  39. package/dist/threat-model.js +3 -12
  40. package/dist/threat-model.js.map +1 -1
  41. package/dist/with-wasm.js +43 -43
  42. package/dist/witness-client.d.ts +7 -0
  43. package/dist/witness-client.d.ts.map +1 -1
  44. package/dist/witness-client.js +5 -1
  45. package/dist/witness-client.js.map +1 -1
  46. package/genomes/README.md +23 -23
  47. package/genomes/genome-promoted-cand6-edit-by-midpoint.json +26 -26
  48. package/package.json +126 -125
  49. package/templates/catalog.def.mjs +542 -542
  50. package/templates/catalog.json +1274 -1274
  51. package/templates/minimal/.claude/settings.json.tmpl +18 -18
  52. package/templates/minimal/.claude-plugin/plugin.json.tmpl +13 -13
  53. package/templates/minimal/CLAUDE.md.tmpl +26 -23
  54. package/templates/minimal/README.md.tmpl +20 -20
  55. package/templates/minimal/__tests__/smoke.test.ts.tmpl +37 -37
  56. package/templates/minimal/bin/cli.js.tmpl +100 -100
  57. package/templates/minimal/manifest.json +20 -20
  58. package/templates/minimal/package.json.tmpl +31 -31
  59. package/templates/minimal/src/init.ts.tmpl +21 -21
  60. package/templates/minimal/tsconfig.json.tmpl +19 -19
  61. package/templates/minimal/vitest.config.ts.tmpl +23 -23
  62. package/templates/vertical_advertising/.claude/commands/doctor.md.tmpl +12 -12
  63. package/templates/vertical_advertising/.claude/settings.json.tmpl +33 -33
  64. package/templates/vertical_advertising/.claude/skills/media-plan/SKILL.md.tmpl +13 -13
  65. package/templates/vertical_advertising/.claude-plugin/plugin.json.tmpl +23 -23
  66. package/templates/vertical_advertising/CLAUDE.md.tmpl +30 -30
  67. package/templates/vertical_advertising/README.md.tmpl +29 -29
  68. package/templates/vertical_advertising/__tests__/smoke.test.ts.tmpl +37 -37
  69. package/templates/vertical_advertising/bin/cli.js.tmpl +100 -100
  70. package/templates/vertical_advertising/manifest.json +101 -101
  71. package/templates/vertical_advertising/package.json.tmpl +30 -30
  72. package/templates/vertical_advertising/src/agents/copywriter.ts.tmpl +7 -7
  73. package/templates/vertical_advertising/src/agents/media-planner.ts.tmpl +7 -7
  74. package/templates/vertical_advertising/src/agents/performance-analyst.ts.tmpl +7 -7
  75. package/templates/vertical_advertising/src/init.ts.tmpl +21 -21
  76. package/templates/vertical_advertising/tsconfig.json.tmpl +19 -19
  77. package/templates/vertical_advertising/vitest.config.ts.tmpl +23 -23
  78. package/templates/vertical_agentics/.claude/commands/doctor.md.tmpl +12 -12
  79. package/templates/vertical_agentics/.claude/settings.json.tmpl +33 -33
  80. package/templates/vertical_agentics/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  81. package/templates/vertical_agentics/.claude/skills/run-swarm/SKILL.md.tmpl +14 -14
  82. package/templates/vertical_agentics/.claude-plugin/plugin.json.tmpl +23 -23
  83. package/templates/vertical_agentics/CLAUDE.md.tmpl +32 -32
  84. package/templates/vertical_agentics/README.md.tmpl +30 -30
  85. package/templates/vertical_agentics/__tests__/smoke.test.ts.tmpl +37 -37
  86. package/templates/vertical_agentics/bin/cli.js.tmpl +100 -100
  87. package/templates/vertical_agentics/manifest.json +111 -111
  88. package/templates/vertical_agentics/package.json.tmpl +30 -30
  89. package/templates/vertical_agentics/src/agents/critic.ts.tmpl +7 -7
  90. package/templates/vertical_agentics/src/agents/orchestrator.ts.tmpl +7 -7
  91. package/templates/vertical_agentics/src/agents/planner.ts.tmpl +7 -7
  92. package/templates/vertical_agentics/src/agents/worker.ts.tmpl +7 -7
  93. package/templates/vertical_agentics/src/init.ts.tmpl +21 -21
  94. package/templates/vertical_agentics/tsconfig.json.tmpl +19 -19
  95. package/templates/vertical_agentics/vitest.config.ts.tmpl +23 -23
  96. package/templates/vertical_ai/.claude/commands/doctor.md.tmpl +12 -12
  97. package/templates/vertical_ai/.claude/settings.json.tmpl +35 -35
  98. package/templates/vertical_ai/.claude/skills/eval-report/SKILL.md.tmpl +13 -13
  99. package/templates/vertical_ai/.claude-plugin/plugin.json.tmpl +23 -23
  100. package/templates/vertical_ai/CLAUDE.md.tmpl +31 -31
  101. package/templates/vertical_ai/README.md.tmpl +30 -30
  102. package/templates/vertical_ai/__tests__/smoke.test.ts.tmpl +37 -37
  103. package/templates/vertical_ai/bin/cli.js.tmpl +100 -100
  104. package/templates/vertical_ai/manifest.json +106 -106
  105. package/templates/vertical_ai/package.json.tmpl +30 -30
  106. package/templates/vertical_ai/src/agents/data-curator.ts.tmpl +7 -7
  107. package/templates/vertical_ai/src/agents/deployer.ts.tmpl +7 -7
  108. package/templates/vertical_ai/src/agents/evaluator.ts.tmpl +7 -7
  109. package/templates/vertical_ai/src/agents/trainer.ts.tmpl +7 -7
  110. package/templates/vertical_ai/src/init.ts.tmpl +21 -21
  111. package/templates/vertical_ai/tsconfig.json.tmpl +19 -19
  112. package/templates/vertical_ai/vitest.config.ts.tmpl +23 -23
  113. package/templates/vertical_business/.claude/commands/doctor.md.tmpl +12 -12
  114. package/templates/vertical_business/.claude/settings.json.tmpl +33 -33
  115. package/templates/vertical_business/.claude/skills/quarterly-plan/SKILL.md.tmpl +13 -13
  116. package/templates/vertical_business/.claude-plugin/plugin.json.tmpl +23 -23
  117. package/templates/vertical_business/CLAUDE.md.tmpl +30 -30
  118. package/templates/vertical_business/README.md.tmpl +29 -29
  119. package/templates/vertical_business/__tests__/smoke.test.ts.tmpl +37 -37
  120. package/templates/vertical_business/bin/cli.js.tmpl +100 -100
  121. package/templates/vertical_business/manifest.json +101 -101
  122. package/templates/vertical_business/package.json.tmpl +30 -30
  123. package/templates/vertical_business/src/agents/analyst.ts.tmpl +7 -7
  124. package/templates/vertical_business/src/agents/ops-coordinator.ts.tmpl +7 -7
  125. package/templates/vertical_business/src/agents/strategist.ts.tmpl +7 -7
  126. package/templates/vertical_business/src/init.ts.tmpl +21 -21
  127. package/templates/vertical_business/tsconfig.json.tmpl +19 -19
  128. package/templates/vertical_business/vitest.config.ts.tmpl +23 -23
  129. package/templates/vertical_coding/.claude/commands/doctor.md.tmpl +12 -12
  130. package/templates/vertical_coding/.claude/commands/review-diff.md.tmpl +10 -10
  131. package/templates/vertical_coding/.claude/settings.json.tmpl +40 -40
  132. package/templates/vertical_coding/.claude/skills/plan-change/SKILL.md.tmpl +15 -15
  133. package/templates/vertical_coding/.claude-plugin/plugin.json.tmpl +23 -23
  134. package/templates/vertical_coding/CLAUDE.md.tmpl +32 -32
  135. package/templates/vertical_coding/README.md.tmpl +30 -30
  136. package/templates/vertical_coding/__tests__/smoke.test.ts.tmpl +37 -37
  137. package/templates/vertical_coding/bin/cli.js.tmpl +100 -100
  138. package/templates/vertical_coding/manifest.json +111 -111
  139. package/templates/vertical_coding/package.json.tmpl +30 -30
  140. package/templates/vertical_coding/src/agents/architect.ts.tmpl +7 -7
  141. package/templates/vertical_coding/src/agents/implementer.ts.tmpl +7 -7
  142. package/templates/vertical_coding/src/agents/reviewer.ts.tmpl +7 -7
  143. package/templates/vertical_coding/src/agents/test-writer.ts.tmpl +7 -7
  144. package/templates/vertical_coding/src/init.ts.tmpl +21 -21
  145. package/templates/vertical_coding/tsconfig.json.tmpl +19 -19
  146. package/templates/vertical_coding/vitest.config.ts.tmpl +23 -23
  147. package/templates/vertical_crm/.claude/commands/doctor.md.tmpl +12 -12
  148. package/templates/vertical_crm/.claude/settings.json.tmpl +33 -33
  149. package/templates/vertical_crm/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  150. package/templates/vertical_crm/.claude-plugin/plugin.json.tmpl +23 -23
  151. package/templates/vertical_crm/CLAUDE.md.tmpl +30 -30
  152. package/templates/vertical_crm/README.md.tmpl +29 -29
  153. package/templates/vertical_crm/__tests__/smoke.test.ts.tmpl +37 -37
  154. package/templates/vertical_crm/bin/cli.js.tmpl +100 -100
  155. package/templates/vertical_crm/manifest.json +101 -101
  156. package/templates/vertical_crm/package.json.tmpl +30 -30
  157. package/templates/vertical_crm/src/agents/account-manager.ts.tmpl +7 -7
  158. package/templates/vertical_crm/src/agents/churn-watcher.ts.tmpl +7 -7
  159. package/templates/vertical_crm/src/agents/lead-qualifier.ts.tmpl +7 -7
  160. package/templates/vertical_crm/src/init.ts.tmpl +21 -21
  161. package/templates/vertical_crm/tsconfig.json.tmpl +19 -19
  162. package/templates/vertical_crm/vitest.config.ts.tmpl +23 -23
  163. package/templates/vertical_devops/.claude/settings.json.tmpl +36 -36
  164. package/templates/vertical_devops/.claude-plugin/plugin.json.tmpl +23 -23
  165. package/templates/vertical_devops/CLAUDE.md.tmpl +34 -34
  166. package/templates/vertical_devops/README.md.tmpl +27 -27
  167. package/templates/vertical_devops/__tests__/smoke.test.ts.tmpl +37 -37
  168. package/templates/vertical_devops/bin/cli.js.tmpl +100 -100
  169. package/templates/vertical_devops/manifest.json +100 -100
  170. package/templates/vertical_devops/package.json.tmpl +27 -27
  171. package/templates/vertical_devops/runbooks/README.md.tmpl +32 -32
  172. package/templates/vertical_devops/src/agents/escalator.ts.tmpl +19 -19
  173. package/templates/vertical_devops/src/agents/postmortem.ts.tmpl +23 -23
  174. package/templates/vertical_devops/src/agents/responder.ts.tmpl +14 -14
  175. package/templates/vertical_devops/src/agents/runbook-runner.ts.tmpl +17 -17
  176. package/templates/vertical_devops/src/init.ts.tmpl +23 -23
  177. package/templates/vertical_devops/tsconfig.json.tmpl +19 -19
  178. package/templates/vertical_devops/vitest.config.ts.tmpl +23 -23
  179. package/templates/vertical_education/.claude/commands/doctor.md.tmpl +12 -12
  180. package/templates/vertical_education/.claude/commands/mastery-report.md.tmpl +12 -12
  181. package/templates/vertical_education/.claude/settings.json.tmpl +45 -45
  182. package/templates/vertical_education/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  183. package/templates/vertical_education/.claude/skills/teach-next/SKILL.md.tmpl +16 -16
  184. package/templates/vertical_education/.claude-plugin/plugin.json.tmpl +23 -23
  185. package/templates/vertical_education/CLAUDE.md.tmpl +33 -33
  186. package/templates/vertical_education/README.md.tmpl +30 -30
  187. package/templates/vertical_education/__tests__/smoke.test.ts.tmpl +37 -37
  188. package/templates/vertical_education/bin/cli.js.tmpl +100 -100
  189. package/templates/vertical_education/manifest.json +116 -116
  190. package/templates/vertical_education/package.json.tmpl +30 -30
  191. package/templates/vertical_education/src/agents/explainer.ts.tmpl +7 -7
  192. package/templates/vertical_education/src/agents/grader.ts.tmpl +7 -7
  193. package/templates/vertical_education/src/agents/quiz-master.ts.tmpl +7 -7
  194. package/templates/vertical_education/src/agents/tutor.ts.tmpl +7 -7
  195. package/templates/vertical_education/src/init.ts.tmpl +21 -21
  196. package/templates/vertical_education/tsconfig.json.tmpl +19 -19
  197. package/templates/vertical_education/vitest.config.ts.tmpl +23 -23
  198. package/templates/vertical_exotic/.claude/commands/doctor.md.tmpl +12 -12
  199. package/templates/vertical_exotic/.claude/settings.json.tmpl +44 -44
  200. package/templates/vertical_exotic/.claude/skills/evolve/SKILL.md.tmpl +14 -14
  201. package/templates/vertical_exotic/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  202. package/templates/vertical_exotic/.claude-plugin/plugin.json.tmpl +23 -23
  203. package/templates/vertical_exotic/CLAUDE.md.tmpl +31 -31
  204. package/templates/vertical_exotic/README.md.tmpl +29 -29
  205. package/templates/vertical_exotic/__tests__/smoke.test.ts.tmpl +37 -37
  206. package/templates/vertical_exotic/bin/cli.js.tmpl +100 -100
  207. package/templates/vertical_exotic/manifest.json +106 -106
  208. package/templates/vertical_exotic/package.json.tmpl +30 -30
  209. package/templates/vertical_exotic/src/agents/experimenter.ts.tmpl +7 -7
  210. package/templates/vertical_exotic/src/agents/federator.ts.tmpl +7 -7
  211. package/templates/vertical_exotic/src/agents/hypothesizer.ts.tmpl +7 -7
  212. package/templates/vertical_exotic/src/init.ts.tmpl +21 -21
  213. package/templates/vertical_exotic/tsconfig.json.tmpl +19 -19
  214. package/templates/vertical_exotic/vitest.config.ts.tmpl +23 -23
  215. package/templates/vertical_gaming/.claude/commands/design-doc-diff.md.tmpl +13 -13
  216. package/templates/vertical_gaming/.claude/commands/doctor.md.tmpl +12 -12
  217. package/templates/vertical_gaming/.claude/settings.json.tmpl +45 -45
  218. package/templates/vertical_gaming/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  219. package/templates/vertical_gaming/.claude/skills/playtest-recap/SKILL.md.tmpl +16 -16
  220. package/templates/vertical_gaming/.claude-plugin/plugin.json.tmpl +23 -23
  221. package/templates/vertical_gaming/CLAUDE.md.tmpl +33 -33
  222. package/templates/vertical_gaming/README.md.tmpl +30 -30
  223. package/templates/vertical_gaming/__tests__/smoke.test.ts.tmpl +37 -37
  224. package/templates/vertical_gaming/bin/cli.js.tmpl +100 -100
  225. package/templates/vertical_gaming/manifest.json +116 -116
  226. package/templates/vertical_gaming/package.json.tmpl +30 -30
  227. package/templates/vertical_gaming/src/agents/balance-critic.ts.tmpl +7 -7
  228. package/templates/vertical_gaming/src/agents/economy-modeler.ts.tmpl +7 -7
  229. package/templates/vertical_gaming/src/agents/narrative-keeper.ts.tmpl +7 -7
  230. package/templates/vertical_gaming/src/agents/playtest-reader.ts.tmpl +7 -7
  231. package/templates/vertical_gaming/src/init.ts.tmpl +21 -21
  232. package/templates/vertical_gaming/tsconfig.json.tmpl +19 -19
  233. package/templates/vertical_gaming/vitest.config.ts.tmpl +23 -23
  234. package/templates/vertical_health/.claude/commands/doctor.md.tmpl +12 -12
  235. package/templates/vertical_health/.claude/settings.json.tmpl +33 -33
  236. package/templates/vertical_health/.claude/skills/wellness-intake/SKILL.md.tmpl +15 -15
  237. package/templates/vertical_health/.claude-plugin/plugin.json.tmpl +23 -23
  238. package/templates/vertical_health/CLAUDE.md.tmpl +30 -30
  239. package/templates/vertical_health/README.md.tmpl +29 -29
  240. package/templates/vertical_health/__tests__/smoke.test.ts.tmpl +37 -37
  241. package/templates/vertical_health/bin/cli.js.tmpl +100 -100
  242. package/templates/vertical_health/manifest.json +101 -101
  243. package/templates/vertical_health/package.json.tmpl +30 -30
  244. package/templates/vertical_health/src/agents/care-coordinator.ts.tmpl +7 -7
  245. package/templates/vertical_health/src/agents/intake.ts.tmpl +7 -7
  246. package/templates/vertical_health/src/agents/triage.ts.tmpl +7 -7
  247. package/templates/vertical_health/src/init.ts.tmpl +21 -21
  248. package/templates/vertical_health/tsconfig.json.tmpl +19 -19
  249. package/templates/vertical_health/vitest.config.ts.tmpl +23 -23
  250. package/templates/vertical_legal/.claude/settings.json.tmpl +10 -10
  251. package/templates/vertical_legal/.claude-plugin/plugin.json.tmpl +23 -23
  252. package/templates/vertical_legal/CLAUDE.md.tmpl +24 -24
  253. package/templates/vertical_legal/README.md.tmpl +21 -21
  254. package/templates/vertical_legal/__tests__/smoke.test.ts.tmpl +37 -37
  255. package/templates/vertical_legal/bin/cli.js.tmpl +100 -100
  256. package/templates/vertical_legal/manifest.json +90 -90
  257. package/templates/vertical_legal/package.json.tmpl +14 -14
  258. package/templates/vertical_legal/src/agents/citation-checker.ts.tmpl +7 -7
  259. package/templates/vertical_legal/src/agents/redline.ts.tmpl +7 -7
  260. package/templates/vertical_legal/src/agents/risk-rater.ts.tmpl +8 -8
  261. package/templates/vertical_legal/src/init.ts.tmpl +13 -13
  262. package/templates/vertical_legal/tsconfig.json.tmpl +19 -19
  263. package/templates/vertical_legal/vitest.config.ts.tmpl +23 -23
  264. package/templates/vertical_marketing/.claude/commands/doctor.md.tmpl +12 -12
  265. package/templates/vertical_marketing/.claude/settings.json.tmpl +33 -33
  266. package/templates/vertical_marketing/.claude/skills/campaign-brief/SKILL.md.tmpl +13 -13
  267. package/templates/vertical_marketing/.claude-plugin/plugin.json.tmpl +23 -23
  268. package/templates/vertical_marketing/CLAUDE.md.tmpl +30 -30
  269. package/templates/vertical_marketing/README.md.tmpl +29 -29
  270. package/templates/vertical_marketing/__tests__/smoke.test.ts.tmpl +37 -37
  271. package/templates/vertical_marketing/bin/cli.js.tmpl +100 -100
  272. package/templates/vertical_marketing/manifest.json +101 -101
  273. package/templates/vertical_marketing/package.json.tmpl +30 -30
  274. package/templates/vertical_marketing/src/agents/content-creator.ts.tmpl +7 -7
  275. package/templates/vertical_marketing/src/agents/seo-analyst.ts.tmpl +7 -7
  276. package/templates/vertical_marketing/src/agents/strategist.ts.tmpl +7 -7
  277. package/templates/vertical_marketing/src/init.ts.tmpl +21 -21
  278. package/templates/vertical_marketing/tsconfig.json.tmpl +19 -19
  279. package/templates/vertical_marketing/vitest.config.ts.tmpl +23 -23
  280. package/templates/vertical_repo-maintainer/.claude/commands/doctor.md.tmpl +12 -12
  281. package/templates/vertical_repo-maintainer/.claude/commands/release-check.md.tmpl +13 -13
  282. package/templates/vertical_repo-maintainer/.claude/commands/repo-triage.md.tmpl +16 -16
  283. package/templates/vertical_repo-maintainer/.claude/settings.json.tmpl +44 -44
  284. package/templates/vertical_repo-maintainer/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  285. package/templates/vertical_repo-maintainer/.claude/skills/plan-change/SKILL.md.tmpl +15 -15
  286. package/templates/vertical_repo-maintainer/.claude-plugin/plugin.json.tmpl +23 -23
  287. package/templates/vertical_repo-maintainer/CLAUDE.md.tmpl +34 -34
  288. package/templates/vertical_repo-maintainer/README.md.tmpl +30 -30
  289. package/templates/vertical_repo-maintainer/__tests__/smoke.test.ts.tmpl +37 -37
  290. package/templates/vertical_repo-maintainer/bin/cli.js.tmpl +100 -100
  291. package/templates/vertical_repo-maintainer/manifest.json +121 -121
  292. package/templates/vertical_repo-maintainer/package.json.tmpl +30 -30
  293. package/templates/vertical_repo-maintainer/src/agents/benchmarker.ts.tmpl +7 -7
  294. package/templates/vertical_repo-maintainer/src/agents/maintainer.ts.tmpl +7 -7
  295. package/templates/vertical_repo-maintainer/src/agents/release.ts.tmpl +7 -7
  296. package/templates/vertical_repo-maintainer/src/agents/security.ts.tmpl +7 -7
  297. package/templates/vertical_repo-maintainer/src/init.ts.tmpl +21 -21
  298. package/templates/vertical_repo-maintainer/tsconfig.json.tmpl +19 -19
  299. package/templates/vertical_repo-maintainer/vitest.config.ts.tmpl +23 -23
  300. package/templates/vertical_research/.claude/settings.json.tmpl +9 -9
  301. package/templates/vertical_research/.claude-plugin/plugin.json.tmpl +23 -23
  302. package/templates/vertical_research/CLAUDE.md.tmpl +33 -33
  303. package/templates/vertical_research/README.md.tmpl +17 -17
  304. package/templates/vertical_research/__tests__/smoke.test.ts.tmpl +37 -37
  305. package/templates/vertical_research/bin/cli.js.tmpl +100 -100
  306. package/templates/vertical_research/manifest.json +105 -105
  307. package/templates/vertical_research/package.json.tmpl +14 -14
  308. package/templates/vertical_research/src/agents/citer.ts.tmpl +8 -8
  309. package/templates/vertical_research/src/agents/fact-checker.ts.tmpl +8 -8
  310. package/templates/vertical_research/src/agents/scout.ts.tmpl +7 -7
  311. package/templates/vertical_research/src/agents/source-grader.ts.tmpl +10 -10
  312. package/templates/vertical_research/src/agents/synthesizer.ts.tmpl +8 -8
  313. package/templates/vertical_research/src/agents/web-searcher.ts.tmpl +6 -6
  314. package/templates/vertical_research/src/init.ts.tmpl +13 -13
  315. package/templates/vertical_research/tsconfig.json.tmpl +19 -19
  316. package/templates/vertical_research/vitest.config.ts.tmpl +23 -23
  317. package/templates/vertical_ruview/.claude/commands/doctor.md.tmpl +12 -12
  318. package/templates/vertical_ruview/.claude/settings.json.tmpl +33 -33
  319. package/templates/vertical_ruview/.claude/skills/index-and-ask/SKILL.md.tmpl +15 -15
  320. package/templates/vertical_ruview/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  321. package/templates/vertical_ruview/.claude-plugin/plugin.json.tmpl +23 -23
  322. package/templates/vertical_ruview/CLAUDE.md.tmpl +31 -31
  323. package/templates/vertical_ruview/README.md.tmpl +29 -29
  324. package/templates/vertical_ruview/__tests__/smoke.test.ts.tmpl +37 -37
  325. package/templates/vertical_ruview/bin/cli.js.tmpl +100 -100
  326. package/templates/vertical_ruview/manifest.json +106 -106
  327. package/templates/vertical_ruview/package.json.tmpl +30 -30
  328. package/templates/vertical_ruview/src/agents/indexer.ts.tmpl +7 -7
  329. package/templates/vertical_ruview/src/agents/retriever.ts.tmpl +7 -7
  330. package/templates/vertical_ruview/src/agents/reviewer.ts.tmpl +7 -7
  331. package/templates/vertical_ruview/src/init.ts.tmpl +21 -21
  332. package/templates/vertical_ruview/tsconfig.json.tmpl +19 -19
  333. package/templates/vertical_ruview/vitest.config.ts.tmpl +23 -23
  334. package/templates/vertical_sales/.claude/commands/doctor.md.tmpl +12 -12
  335. package/templates/vertical_sales/.claude/commands/pipeline-report.md.tmpl +13 -13
  336. package/templates/vertical_sales/.claude/settings.json.tmpl +45 -45
  337. package/templates/vertical_sales/.claude/skills/memory-inspect/SKILL.md.tmpl +14 -14
  338. package/templates/vertical_sales/.claude/skills/qualify-lead/SKILL.md.tmpl +15 -15
  339. package/templates/vertical_sales/.claude-plugin/plugin.json.tmpl +23 -23
  340. package/templates/vertical_sales/CLAUDE.md.tmpl +33 -33
  341. package/templates/vertical_sales/README.md.tmpl +30 -30
  342. package/templates/vertical_sales/__tests__/smoke.test.ts.tmpl +37 -37
  343. package/templates/vertical_sales/bin/cli.js.tmpl +100 -100
  344. package/templates/vertical_sales/manifest.json +116 -116
  345. package/templates/vertical_sales/package.json.tmpl +30 -30
  346. package/templates/vertical_sales/src/agents/closer.ts.tmpl +7 -7
  347. package/templates/vertical_sales/src/agents/demo-coach.ts.tmpl +7 -7
  348. package/templates/vertical_sales/src/agents/prospector.ts.tmpl +7 -7
  349. package/templates/vertical_sales/src/agents/qualifier.ts.tmpl +7 -7
  350. package/templates/vertical_sales/src/init.ts.tmpl +21 -21
  351. package/templates/vertical_sales/tsconfig.json.tmpl +19 -19
  352. package/templates/vertical_sales/vitest.config.ts.tmpl +23 -23
  353. package/templates/vertical_support/.claude/settings.json.tmpl +25 -25
  354. package/templates/vertical_support/.claude-plugin/plugin.json.tmpl +23 -23
  355. package/templates/vertical_support/CLAUDE.md.tmpl +34 -34
  356. package/templates/vertical_support/README.md.tmpl +16 -16
  357. package/templates/vertical_support/__tests__/smoke.test.ts.tmpl +37 -37
  358. package/templates/vertical_support/bin/cli.js.tmpl +100 -100
  359. package/templates/vertical_support/kb/README.md.tmpl +23 -23
  360. package/templates/vertical_support/manifest.json +100 -100
  361. package/templates/vertical_support/package.json.tmpl +25 -25
  362. package/templates/vertical_support/src/agents/escalator.ts.tmpl +6 -6
  363. package/templates/vertical_support/src/agents/kb-searcher.ts.tmpl +6 -6
  364. package/templates/vertical_support/src/agents/responder.ts.tmpl +7 -7
  365. package/templates/vertical_support/src/agents/triager.ts.tmpl +6 -6
  366. package/templates/vertical_support/src/init.ts.tmpl +16 -16
  367. package/templates/vertical_support/tsconfig.json.tmpl +19 -19
  368. package/templates/vertical_support/vitest.config.ts.tmpl +23 -23
  369. package/templates/vertical_trading/.claude/settings.json.tmpl +20 -20
  370. package/templates/vertical_trading/.claude-plugin/plugin.json.tmpl +23 -23
  371. package/templates/vertical_trading/CLAUDE.md.tmpl +24 -24
  372. package/templates/vertical_trading/README.md.tmpl +17 -17
  373. package/templates/vertical_trading/__tests__/smoke.test.ts.tmpl +37 -37
  374. package/templates/vertical_trading/bin/cli.js.tmpl +100 -100
  375. package/templates/vertical_trading/manifest.json +100 -100
  376. package/templates/vertical_trading/package.json.tmpl +14 -14
  377. package/templates/vertical_trading/src/agents/executor.ts.tmpl +8 -8
  378. package/templates/vertical_trading/src/agents/market-watcher.ts.tmpl +7 -7
  379. package/templates/vertical_trading/src/agents/postmortem.ts.tmpl +8 -8
  380. package/templates/vertical_trading/src/agents/risk-checker.ts.tmpl +11 -11
  381. package/templates/vertical_trading/src/agents/signal-gen.ts.tmpl +8 -8
  382. package/templates/vertical_trading/src/init.ts.tmpl +20 -20
  383. package/templates/vertical_trading/tsconfig.json.tmpl +19 -19
  384. package/templates/vertical_trading/vitest.config.ts.tmpl +23 -23
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Optional Meta-Proxy integration for the published `metaharness` CLI.
3
+ *
4
+ * Meta-Proxy is deliberately not an npm dependency: it is a separately released
5
+ * Rust binary. This module downloads its public, signed release only when the
6
+ * user explicitly asks for `metaharness proxy install --yes`, verifies the
7
+ * signed SHA256 manifest with a pinned Ed25519 public key, and then installs it
8
+ * under the user's MetaHarness state directory.
9
+ */
10
+ import { spawn, spawnSync } from 'node:child_process';
11
+ import { createHash, createPublicKey, verify as verifySignature } from 'node:crypto';
12
+ import { chmodSync, closeSync, existsSync, mkdirSync, mkdtempSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
13
+ import { homedir } from 'node:os';
14
+ import { basename, join } from 'node:path';
15
+ export const META_PROXY_VERSION = '0.3.0';
16
+ export const META_PROXY_RELEASE_BASE = 'https://github.com/cognitum-one/meta-proxy-dist/releases/download';
17
+ /** The release signing key, pinned in the client rather than fetched from GitHub. */
18
+ export const META_PROXY_SIGNING_PUBKEY_PEM = `-----BEGIN PUBLIC KEY-----
19
+ MCowBQYDK2VwAyEAjhLDomjIGdcltYC7j+aiESQFD4LWoHaULietG1PuDjw=
20
+ -----END PUBLIC KEY-----
21
+ `;
22
+ const PLATFORM_TABLE = {
23
+ 'darwin-arm64': { target: 'aarch64-apple-darwin', archive: 'tar.gz' },
24
+ 'darwin-x64': { target: 'x86_64-apple-darwin', archive: 'tar.gz' },
25
+ 'linux-arm64': { target: 'aarch64-unknown-linux-gnu', archive: 'tar.gz' },
26
+ 'linux-x64': { target: 'x86_64-unknown-linux-gnu', archive: 'tar.gz' },
27
+ 'win32-x64': { target: 'x86_64-pc-windows-msvc', archive: 'zip' },
28
+ };
29
+ export function resolveMetaProxyAsset(platform = process.platform, arch = process.arch, version = META_PROXY_VERSION) {
30
+ const entry = PLATFORM_TABLE[`${platform}-${arch}`];
31
+ if (!entry) {
32
+ throw new Error(`No signed Meta-Proxy release for ${platform}-${arch}. Supported: ${Object.keys(PLATFORM_TABLE).join(', ')}.`);
33
+ }
34
+ return {
35
+ ...entry,
36
+ assetName: `meta-proxy-${version}-${entry.target}.${entry.archive}`,
37
+ };
38
+ }
39
+ export function isValidReleaseVersion(value) {
40
+ return /^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9.-]+)?$/.test(value);
41
+ }
42
+ export function sha256Hex(bytes) {
43
+ return createHash('sha256').update(bytes).digest('hex');
44
+ }
45
+ export function parseSha256Sums(text) {
46
+ const entries = new Map();
47
+ for (const line of text.split(/\r?\n/)) {
48
+ const match = line.trim().match(/^([0-9a-fA-F]{64})[ \t]+\*?(.+)$/);
49
+ if (match)
50
+ entries.set(match[2].trim(), match[1].toLowerCase());
51
+ }
52
+ return entries;
53
+ }
54
+ export function verifyMetaProxyChecksum(archive, assetName, sums) {
55
+ return parseSha256Sums(sums.toString('utf8')).get(assetName) === sha256Hex(archive);
56
+ }
57
+ /** Verify the raw SHA256SUMS bytes against the pinned Ed25519 release key. */
58
+ export function verifyMetaProxyManifest(sums, signatureBase64) {
59
+ try {
60
+ const signature = Buffer.from(signatureBase64.trim(), 'base64');
61
+ return signature.length > 0 && verifySignature(null, sums, createPublicKey(META_PROXY_SIGNING_PUBKEY_PEM), signature);
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ export function metaProxyDataDir(home = homedir()) {
68
+ return process.env.METAHARNESS_META_PROXY_DIR?.trim() || join(home, '.metaharness', 'meta-proxy');
69
+ }
70
+ export function metaProxyBinaryPath(platform = process.platform, home = homedir()) {
71
+ return join(metaProxyDataDir(home), 'bin', platform === 'win32' ? 'meta-proxy.exe' : 'meta-proxy');
72
+ }
73
+ function pidPath(home = homedir()) {
74
+ return join(metaProxyDataDir(home), 'meta-proxy.pid');
75
+ }
76
+ function versionPath(bin) {
77
+ return `${bin}.version`;
78
+ }
79
+ async function fetchBytes(fetcher, url) {
80
+ try {
81
+ const response = await fetcher(url);
82
+ return response.ok ? Buffer.from(await response.arrayBuffer()) : null;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ /** Download, authenticate, extract, and atomically install a Meta-Proxy release. */
89
+ export async function installMetaProxy(options = {}) {
90
+ const version = options.version ?? META_PROXY_VERSION;
91
+ if (!isValidReleaseVersion(version))
92
+ return { ok: false, message: `Invalid Meta-Proxy version "${version}".` };
93
+ let asset;
94
+ try {
95
+ asset = resolveMetaProxyAsset(options.platform, options.arch, version);
96
+ }
97
+ catch (error) {
98
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
99
+ }
100
+ const base = `${(options.releaseBase ?? META_PROXY_RELEASE_BASE).replace(/\/$/, '')}/v${version}`;
101
+ const fetcher = options.fetcher ?? globalThis.fetch;
102
+ const [archive, sums, signature] = await Promise.all([
103
+ fetchBytes(fetcher, `${base}/${asset.assetName}`),
104
+ fetchBytes(fetcher, `${base}/SHA256SUMS`),
105
+ fetchBytes(fetcher, `${base}/SHA256SUMS.sig`),
106
+ ]);
107
+ if (!archive || !sums || !signature) {
108
+ return { ok: false, message: `Signed Meta-Proxy v${version} release assets were not available for ${asset.target}.` };
109
+ }
110
+ if (!verifyMetaProxyManifest(sums, signature.toString('utf8'))) {
111
+ return { ok: false, message: 'Meta-Proxy SHA256SUMS signature verification failed; refusing to install.' };
112
+ }
113
+ if (!verifyMetaProxyChecksum(archive, asset.assetName, sums)) {
114
+ return { ok: false, message: `Meta-Proxy checksum verification failed for ${asset.assetName}; refusing to install.` };
115
+ }
116
+ const root = metaProxyDataDir(options.home);
117
+ const binDir = join(root, 'bin');
118
+ mkdirSync(binDir, { recursive: true, mode: 0o700 });
119
+ const work = mkdtempSync(join(root, '.install-'));
120
+ try {
121
+ const archivePath = join(work, asset.assetName);
122
+ writeFileSync(archivePath, archive, { mode: 0o600 });
123
+ extractArchive(archivePath, asset.archive, work);
124
+ const binaryName = (options.platform ?? process.platform) === 'win32' ? 'meta-proxy.exe' : 'meta-proxy';
125
+ const extractedBinary = findFile(work, binaryName);
126
+ if (!extractedBinary)
127
+ return { ok: false, message: `Verified archive did not contain ${binaryName}.` };
128
+ const destination = metaProxyBinaryPath(options.platform, options.home);
129
+ if (existsSync(destination))
130
+ rmSync(destination, { force: true });
131
+ renameSync(extractedBinary, destination);
132
+ if ((options.platform ?? process.platform) !== 'win32')
133
+ chmodSync(destination, 0o755);
134
+ writeFileSync(versionPath(destination), `${version}\n`, { encoding: 'utf8', mode: 0o600 });
135
+ return { ok: true, message: `Installed verified Meta-Proxy v${version} at ${destination}.`, binaryPath: destination, version };
136
+ }
137
+ catch (error) {
138
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
139
+ }
140
+ finally {
141
+ rmSync(work, { recursive: true, force: true });
142
+ }
143
+ }
144
+ function extractArchive(archivePath, archive, work) {
145
+ const command = archive === 'zip' ? 'tar' : 'tar';
146
+ const args = archive === 'zip'
147
+ ? ['-xf', archivePath, '-C', work]
148
+ : ['-xzf', archivePath, '-C', work];
149
+ const result = spawnSync(command, args, { encoding: 'utf8', timeout: 60_000 });
150
+ if (result.error || result.status !== 0) {
151
+ throw new Error(`Could not extract the Meta-Proxy archive: ${result.error?.message ?? result.stderr ?? `tar exited ${result.status}`}`);
152
+ }
153
+ }
154
+ function findFile(dir, basename) {
155
+ for (const entry of readdirSync(dir)) {
156
+ const candidate = join(dir, entry);
157
+ const stat = statSync(candidate);
158
+ if (stat.isDirectory()) {
159
+ const nested = findFile(candidate, basename);
160
+ if (nested)
161
+ return nested;
162
+ }
163
+ else if (entry === basename) {
164
+ return candidate;
165
+ }
166
+ }
167
+ return null;
168
+ }
169
+ function processExists(pid) {
170
+ try {
171
+ process.kill(pid, 0);
172
+ return true;
173
+ }
174
+ catch (error) {
175
+ return error.code === 'EPERM';
176
+ }
177
+ }
178
+ /**
179
+ * A pid file alone is not sufficient authority to terminate a process: operating
180
+ * systems eventually reuse PIDs. Confirm that it is still our exact executable
181
+ * before reporting it as managed or sending a stop signal.
182
+ */
183
+ function processMatchesBinary(pid, binaryPath, platform) {
184
+ try {
185
+ if (platform === 'linux') {
186
+ const result = spawnSync('readlink', ['-f', `/proc/${pid}/exe`], { encoding: 'utf8', timeout: 2_000 });
187
+ return result.status === 0 && result.stdout.trim() === binaryPath;
188
+ }
189
+ if (platform === 'win32') {
190
+ const command = `$p = Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; if ($null -ne $p) { [Console]::Out.Write($p.ExecutablePath) }`;
191
+ const result = spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', command], { encoding: 'utf8', timeout: 2_000, windowsHide: true });
192
+ return result.status === 0 && result.stdout.trim().toLowerCase() === binaryPath.toLowerCase();
193
+ }
194
+ const result = spawnSync('ps', ['-p', String(pid), '-o', 'comm='], { encoding: 'utf8', timeout: 2_000 });
195
+ return result.status === 0 && result.stdout.trim().endsWith(basename(binaryPath));
196
+ }
197
+ catch {
198
+ return false;
199
+ }
200
+ }
201
+ export function metaProxyStatus(home = homedir(), platform = process.platform) {
202
+ const binaryPath = metaProxyBinaryPath(platform, home);
203
+ const installed = existsSync(binaryPath);
204
+ let version = null;
205
+ try {
206
+ version = readFileSync(versionPath(binaryPath), 'utf8').trim() || null;
207
+ }
208
+ catch { /* no sidecar */ }
209
+ let pid = null;
210
+ try {
211
+ const parsed = Number.parseInt(readFileSync(pidPath(home), 'utf8').trim(), 10);
212
+ if (Number.isSafeInteger(parsed) && parsed > 0 && processExists(parsed) && processMatchesBinary(parsed, binaryPath, platform))
213
+ pid = parsed;
214
+ }
215
+ catch { /* no managed process */ }
216
+ return { installed, running: pid !== null, binaryPath, version, pid };
217
+ }
218
+ export function startMetaProxy(home = homedir(), platform = process.platform) {
219
+ const status = metaProxyStatus(home, platform);
220
+ if (!status.installed)
221
+ return { ok: false, message: 'Meta-Proxy is not installed. Run `metaharness proxy install --yes` first.' };
222
+ if (status.running)
223
+ return { ok: true, message: `Meta-Proxy is already running (pid ${status.pid}).`, binaryPath: status.binaryPath, version: status.version ?? undefined };
224
+ const root = metaProxyDataDir(home);
225
+ mkdirSync(root, { recursive: true, mode: 0o700 });
226
+ const log = openSync(join(root, 'meta-proxy.log'), 'a', 0o600);
227
+ try {
228
+ const child = spawn(status.binaryPath, [], { detached: true, stdio: ['ignore', log, log], windowsHide: true });
229
+ if (!child.pid)
230
+ return { ok: false, message: 'Meta-Proxy did not return a process id.' };
231
+ child.unref();
232
+ writeFileSync(pidPath(home), `${child.pid}\n`, { encoding: 'utf8', mode: 0o600 });
233
+ return { ok: true, message: `Meta-Proxy started (pid ${child.pid}).`, binaryPath: status.binaryPath, version: status.version ?? undefined };
234
+ }
235
+ finally {
236
+ closeSync(log);
237
+ }
238
+ }
239
+ export function stopMetaProxy(home = homedir()) {
240
+ let pid;
241
+ try {
242
+ pid = Number.parseInt(readFileSync(pidPath(home), 'utf8').trim(), 10);
243
+ }
244
+ catch {
245
+ return { ok: true, message: 'Meta-Proxy is not running (no managed pid file).' };
246
+ }
247
+ const status = metaProxyStatus(home);
248
+ if (!Number.isSafeInteger(pid) || pid <= 0 || !status.running || status.pid !== pid) {
249
+ rmSync(pidPath(home), { force: true });
250
+ return { ok: true, message: 'Meta-Proxy is not running under this managed binary (stale pid file removed).' };
251
+ }
252
+ try {
253
+ process.kill(pid, 'SIGTERM');
254
+ rmSync(pidPath(home), { force: true });
255
+ return { ok: true, message: `Meta-Proxy stop requested (pid ${pid}).` };
256
+ }
257
+ catch (error) {
258
+ return { ok: false, message: `Could not stop Meta-Proxy pid ${pid}: ${error instanceof Error ? error.message : String(error)}` };
259
+ }
260
+ }
261
+ /** `metaharness proxy` command surface. OAuth remains inside the Meta-Proxy binary. */
262
+ export async function metaProxyCmd(args) {
263
+ const subcommand = args[0] ?? 'help';
264
+ if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
265
+ return {
266
+ code: 0,
267
+ lines: [
268
+ 'Usage: metaharness proxy <install|status|start|stop|path|login|logout> [options]',
269
+ '',
270
+ 'Optional signed Meta-Proxy sidecar for local Claude-compatible routing.',
271
+ ` install [--version ${META_PROXY_VERSION}] --yes download, verify, and install`,
272
+ ' status show installed version and managed process state',
273
+ ' start | stop | path manage the optional local sidecar',
274
+ ' login | logout run Meta-Proxy Cognitum OAuth login/logout',
275
+ ],
276
+ };
277
+ }
278
+ if (subcommand === 'install') {
279
+ const versionIndex = args.indexOf('--version');
280
+ const version = versionIndex >= 0 ? args[versionIndex + 1] : undefined;
281
+ if (versionIndex >= 0 && !version)
282
+ return { code: 2, lines: ['--version requires a value, for example 0.3.0.'] };
283
+ if (!args.includes('--yes')) {
284
+ return { code: 2, lines: ['Refusing to download a binary without explicit consent. Re-run: metaharness proxy install --yes'] };
285
+ }
286
+ const result = await installMetaProxy({ version });
287
+ return { code: result.ok ? 0 : 1, lines: [result.message] };
288
+ }
289
+ if (subcommand === 'status') {
290
+ const status = metaProxyStatus();
291
+ return {
292
+ code: status.installed ? 0 : 1,
293
+ lines: [
294
+ 'Meta-Proxy',
295
+ ` installed: ${status.installed ? 'yes' : 'no'}`,
296
+ ` binary: ${status.binaryPath}`,
297
+ ` version: ${status.version ?? 'unknown'}`,
298
+ ` managed process: ${status.running ? `running (pid ${status.pid})` : 'not running'}`,
299
+ ],
300
+ };
301
+ }
302
+ if (subcommand === 'path') {
303
+ const status = metaProxyStatus();
304
+ return { code: status.installed ? 0 : 1, lines: status.installed ? [status.binaryPath] : ['Meta-Proxy is not installed. Run `metaharness proxy install --yes`.'] };
305
+ }
306
+ if (subcommand === 'start') {
307
+ const result = startMetaProxy();
308
+ return { code: result.ok ? 0 : 1, lines: [result.message] };
309
+ }
310
+ if (subcommand === 'stop') {
311
+ const result = stopMetaProxy();
312
+ return { code: result.ok ? 0 : 1, lines: [result.message] };
313
+ }
314
+ if (subcommand === 'login' || subcommand === 'logout') {
315
+ const status = metaProxyStatus();
316
+ if (!status.installed)
317
+ return { code: 1, lines: ['Meta-Proxy is not installed. Run `metaharness proxy install --yes` first.'] };
318
+ const result = spawnSync(status.binaryPath, [subcommand, ...args.slice(1)], { stdio: 'inherit', windowsHide: true });
319
+ if (result.error)
320
+ return { code: 1, lines: [`Could not run Meta-Proxy ${subcommand}: ${result.error.message}`] };
321
+ return { code: result.status ?? 1, lines: [] };
322
+ }
323
+ return { code: 2, lines: [`Unknown proxy subcommand "${subcommand}". Try: install | status | start | stop | path | login | logout`] };
324
+ }
325
+ //# sourceMappingURL=meta-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-proxy.js","sourceRoot":"","sources":["../src/meta-proxy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"publish-cmd.d.ts","sourceRoot":"","sources":["../src/publish-cmd.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0C1E"}
1
+ {"version":3,"file":"publish-cmd.d.ts","sourceRoot":"","sources":["../src/publish-cmd.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+C1E"}
@@ -19,8 +19,12 @@ export async function publishCmd(args) {
19
19
  const positional = args.filter(a => !a.startsWith('--'));
20
20
  const dir = resolve(positional[0] ?? process.cwd());
21
21
  const confirm = args.includes('--confirm');
22
+ const allowUnverified = args.includes('--allow-unverified-witness');
22
23
  const nameOverride = args.find(a => a.startsWith('--name='))?.slice('--name='.length);
23
24
  const lines = [`harness publish — ${dir} ${confirm ? '(CONFIRMED)' : '(DRY-RUN)'}`];
25
+ if (allowUnverified) {
26
+ lines.push(' ⚠️ --allow-unverified-witness: the witness signature will NOT be cryptographically checked.');
27
+ }
24
28
  if (confirm) {
25
29
  const jwt = process.env.PINATA_JWT;
26
30
  if (!jwt) {
@@ -36,6 +40,7 @@ export async function publishCmd(args) {
36
40
  },
37
41
  confirm,
38
42
  name: nameOverride,
43
+ allowUnverified,
39
44
  });
40
45
  lines.push(` manifest CID: ${r.manifestCid}`);
41
46
  lines.push(` size: ${r.manifestSize} bytes`);
@@ -1 +1 @@
1
- {"version":3,"file":"publish-cmd.js","sourceRoot":"","sources":["../src/publish-cmd.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,uDAAuD;AACvD,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,qEAAqE;AACrE,2BAA2B;AAC3B,EAAE;AACF,oCAAoC;AACpC,8DAA8D;AAC9D,oCAAoC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEtF,MAAM,KAAK,GAAa,CAAC,qBAAqB,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAE9F,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CACR,+BAA+B,EAC/B,gDAAgD,EAChD,iCAAiC,CAClC,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC;YAC7B,UAAU,EAAE,GAAG;YACf,MAAM,EAAE;gBACN,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB;aAChD;YACD,OAAO;YACP,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8DAA8D,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gFAAgF,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"publish-cmd.js","sourceRoot":"","sources":["../src/publish-cmd.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,uDAAuD;AACvD,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,qEAAqE;AACrE,2BAA2B;AAC3B,EAAE;AACF,oCAAoC;AACpC,8DAA8D;AAC9D,oCAAoC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEtF,MAAM,KAAK,GAAa,CAAC,qBAAqB,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;IAC/G,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CACR,+BAA+B,EAC/B,gDAAgD,EAChD,iCAAiC,CAClC,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC;YAC7B,UAAU,EAAE,GAAG;YACf,MAAM,EAAE;gBACN,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB;aAChD;YACD,OAAO;YACP,IAAI,EAAE,YAAY;YAClB,eAAe;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,QAAQ,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8DAA8D,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gFAAgF,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
package/dist/publish.d.ts CHANGED
@@ -31,6 +31,12 @@ export interface HarnessPublishOptions {
31
31
  confirm: boolean;
32
32
  /** Optional override of the harness's name (defaults to manifest.vars.name). */
33
33
  name?: string;
34
+ /**
35
+ * GH #4 (HIGH-1): explicitly publish even when a present witness could NOT be cryptographically
36
+ * verified (no verifier available). Off by default — publishing is fail-closed on an unverified
37
+ * witness so a garbage signature can't masquerade as signed. The signature is NOT checked when set.
38
+ */
39
+ allowUnverified?: boolean;
34
40
  }
35
41
  export interface PublishResult {
36
42
  /** IPFS CID of the pinned manifest. */
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7D,OAAO,CAAC,SAAS,CAAC,CAiCpB;AAED,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwCxF"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7D,OAAO,CAAC,SAAS,CAAC,CAiCpB;AAED,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmDxF"}
package/dist/publish.js CHANGED
@@ -80,6 +80,15 @@ export async function publishHarness(opts) {
80
80
  if (!result.valid) {
81
81
  throw new Error(`witness verification failed: ${result.reason ?? 'unknown'}`);
82
82
  }
83
+ // GH #4 (HIGH-1): a witness whose signature was NOT cryptographically verified (shape-only
84
+ // degraded mode — no kernel verifier) must NOT be published as "signed". Before this, that path
85
+ // returned valid:true, so a shape-valid witness carrying a garbage signature published silently as
86
+ // verified. Fail closed unless the caller explicitly opts in (and is then told the sig was unchecked).
87
+ if (result.unverified && !opts.allowUnverified) {
88
+ throw new Error(`witness present at ${witnessPath} but its signature was NOT cryptographically verified ` +
89
+ `(${result.reason ?? 'no verifier available'}). Refusing to publish this harness as signed. ` +
90
+ `Re-run with --allow-unverified-witness to publish anyway — the signature will NOT have been checked.`);
91
+ }
83
92
  }
84
93
  if (!opts.confirm) {
85
94
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Heuristic: does this STRING look like a secret, independent of the key it's stored under?
3
+ *
4
+ * Conservative by construction — precision is favoured over recall because over-redacting a legitimate
5
+ * value in a score/genome dump is a real (if smaller) cost:
6
+ * 1. a known provider token prefix (sk-/ghp_/AKIA/AIza/JWT/PEM/…) — high confidence, OR
7
+ * 2. a generic ≥40-char base64/token run that is MIXED-CASE alphanumeric (letters+digits, upper+lower).
8
+ *
9
+ * The mixed-case+digit requirement in (2) deliberately EXCLUDES lowercase-hex git SHAs, uppercase-hex
10
+ * digests, and dashed UUIDs — all common NON-secret identifiers — so we don't redact them.
11
+ */
12
+ export declare function looksLikeSecretValue(s: unknown): boolean;
13
+ export interface RedactOptions {
14
+ /** Redact a value when its KEY name matches (the existing behaviour of every call site). */
15
+ keyRe: RegExp;
16
+ /** The replacement token — kept per-site (`<redacted>` for bundles, `[REDACTED]` for score/genome/threat). */
17
+ replacement: string;
18
+ }
19
+ /**
20
+ * Deep-copy `value`, redacting (a) any object value whose KEY matches `keyRe`, and (b) any string
21
+ * value that `looksLikeSecretValue` — anywhere in the tree, including a bare top-level string.
22
+ * Non-string primitives pass through. Pure (no I/O); safe to run on untrusted manifest/config data.
23
+ */
24
+ export declare function redactSecretsDeep(value: unknown, opts: RedactOptions): unknown;
25
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CASxD;AAED,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,KAAK,EAAE,MAAM,CAAC;IACd,8GAA8G;IAC9G,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAa9E"}
package/dist/redact.js ADDED
@@ -0,0 +1,62 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // Single source of truth for secret redaction in every user-facing output surface — the diag
4
+ // support-bundle, export-config, score/genome/threat-model sanitisers (GH #4 finding #7). Before this,
5
+ // five copies of the same recursive redactor each keyed ONLY on object-key NAMES, so a secret-shaped
6
+ // VALUE landing in a field NOT named secret/token/key (e.g. a token pasted into a `vars` entry) sailed
7
+ // through into a `harness diag --bundle` a user pastes into a GitHub issue — the exact HIGH-2 leak in #4
8
+ // (the "bundle is sanitised" promise was value-blind). This module adds VALUE-aware detection on top of
9
+ // the key-name pass, so both a secret-named key AND a secret-shaped value redact.
10
+ // High-confidence provider token shapes (prefix-anchored — near-zero false positives).
11
+ const SECRET_PREFIX_RE = /(?:^|[^A-Za-z0-9])(sk-[A-Za-z0-9]|sk-ant-|rk_[A-Za-z0-9]|ghp_|gho_|ghu_|ghs_|github_pat_|glpat-|xox[baprs]-|AKIA[0-9A-Z]{16}|ASIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{10,}|ya29\.|npm_[A-Za-z0-9]{20}|AC[a-z0-9]{30,}|SK[a-z0-9]{30,})/;
12
+ // PEM private-key blocks.
13
+ const PEM_RE = /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/;
14
+ // JWT (header.payload.signature, all base64url).
15
+ const JWT_RE = /\beyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/;
16
+ /**
17
+ * Heuristic: does this STRING look like a secret, independent of the key it's stored under?
18
+ *
19
+ * Conservative by construction — precision is favoured over recall because over-redacting a legitimate
20
+ * value in a score/genome dump is a real (if smaller) cost:
21
+ * 1. a known provider token prefix (sk-/ghp_/AKIA/AIza/JWT/PEM/…) — high confidence, OR
22
+ * 2. a generic ≥40-char base64/token run that is MIXED-CASE alphanumeric (letters+digits, upper+lower).
23
+ *
24
+ * The mixed-case+digit requirement in (2) deliberately EXCLUDES lowercase-hex git SHAs, uppercase-hex
25
+ * digests, and dashed UUIDs — all common NON-secret identifiers — so we don't redact them.
26
+ */
27
+ export function looksLikeSecretValue(s) {
28
+ if (typeof s !== 'string' || s.length < 20)
29
+ return false;
30
+ if (PEM_RE.test(s) || JWT_RE.test(s) || SECRET_PREFIX_RE.test(s))
31
+ return true;
32
+ const m = s.match(/[A-Za-z0-9_\-+/=]{40,}/);
33
+ if (m) {
34
+ const tok = m[0];
35
+ if (/[A-Z]/.test(tok) && /[a-z]/.test(tok) && /[0-9]/.test(tok))
36
+ return true;
37
+ }
38
+ return false;
39
+ }
40
+ /**
41
+ * Deep-copy `value`, redacting (a) any object value whose KEY matches `keyRe`, and (b) any string
42
+ * value that `looksLikeSecretValue` — anywhere in the tree, including a bare top-level string.
43
+ * Non-string primitives pass through. Pure (no I/O); safe to run on untrusted manifest/config data.
44
+ */
45
+ export function redactSecretsDeep(value, opts) {
46
+ const { keyRe, replacement } = opts;
47
+ if (value == null)
48
+ return value;
49
+ if (typeof value === 'string')
50
+ return looksLikeSecretValue(value) ? replacement : value;
51
+ if (Array.isArray(value))
52
+ return value.map(v => redactSecretsDeep(v, opts));
53
+ if (typeof value === 'object') {
54
+ const out = {};
55
+ for (const [k, v] of Object.entries(value)) {
56
+ out[k] = keyRe.test(k) ? replacement : redactSecretsDeep(v, opts);
57
+ }
58
+ return out;
59
+ }
60
+ return value;
61
+ }
62
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,6FAA6F;AAC7F,uGAAuG;AACvG,qGAAqG;AACrG,uGAAuG;AACvG,yGAAyG;AACzG,wGAAwG;AACxG,kFAAkF;AAElF,uFAAuF;AACvF,MAAM,gBAAgB,GACpB,kOAAkO,CAAC;AACrO,0BAA0B;AAC1B,MAAM,MAAM,GAAG,6DAA6D,CAAC;AAC7E,iDAAiD;AACjD,MAAM,MAAM,GAAG,mEAAmE,CAAC;AAEnF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAU;IAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,IAAmB;IACnE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACpC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;IACxF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/score.d.ts CHANGED
@@ -2,6 +2,15 @@ export type SubcommandResult = {
2
2
  code: number;
3
3
  lines: string[];
4
4
  };
5
+ /**
6
+ * #15 — schema discriminator for the `harness score` badge JSON (`--json` / `--out`). It lets a
7
+ * downstream consumer detect this shape at the data layer and REFUSE the wrong one: `harness score`
8
+ * (this flat badge set) and `metaharness score` (the repo-scorecard, numeric `schema: 1`) are
9
+ * DIFFERENT operations with different keys, and an unmarked badge blob silently mis-parsed as the
10
+ * metaharness scorecard (every numeric field defaulting to 0). A string id is unambiguously distinct
11
+ * from the numeric `schema: 1`.
12
+ */
13
+ export declare const HARNESS_SCORE_SCHEMA = "harness-quickcheck-v1";
5
14
  interface DimensionScore {
6
15
  name: string;
7
16
  weight: number;
@@ -1 +1 @@
1
- {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC7B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;QAC5C,YAAY,EAAE,OAAO,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,IAAI,EAAE,OAAO,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrB;AAuMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,MAAiC,GAAG,SAAS,CA+CrG;AAcD,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAqBvD;AAmCD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDxE"}
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC7B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;QAC5C,YAAY,EAAE,OAAO,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,IAAI,EAAE,OAAO,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrB;AAuMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,MAAiC,GAAG,SAAS,CA+CrG;AAcD,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAqBvD;AA2BD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8DxE"}
package/dist/score.js CHANGED
@@ -20,6 +20,16 @@
20
20
  // - score < 50 → 'F' (exit 2, blocked)
21
21
  import { existsSync, statSync, writeFileSync, readFileSync, readdirSync } from 'node:fs';
22
22
  import { resolve, join } from 'node:path';
23
+ import { redactSecretsDeep } from './redact.js';
24
+ /**
25
+ * #15 — schema discriminator for the `harness score` badge JSON (`--json` / `--out`). It lets a
26
+ * downstream consumer detect this shape at the data layer and REFUSE the wrong one: `harness score`
27
+ * (this flat badge set) and `metaharness score` (the repo-scorecard, numeric `schema: 1`) are
28
+ * DIFFERENT operations with different keys, and an unmarked badge blob silently mis-parsed as the
29
+ * metaharness scorecard (every numeric field defaulting to 0). A string id is unambiguously distinct
30
+ * from the numeric `schema: 1`.
31
+ */
32
+ export const HARNESS_SCORE_SCHEMA = 'harness-quickcheck-v1';
23
33
  // --- helpers ---------------------------------------------------------------
24
34
  function safeReadJson(path) {
25
35
  try {
@@ -293,19 +303,9 @@ export function formatScorecard(sc) {
293
303
  }
294
304
  // --- sanitisation (ADR-031) ------------------------------------------------
295
305
  const SECRET_RE = /(secret|token|key|password|passphrase)/i;
306
+ // GH #4 (HIGH-2): redact by KEY name AND by VALUE shape (redact.ts — single source of truth, #7).
296
307
  function sanitise(v) {
297
- if (v == null)
298
- return v;
299
- if (Array.isArray(v))
300
- return v.map(sanitise);
301
- if (typeof v === 'object') {
302
- const out = {};
303
- for (const [k, val] of Object.entries(v)) {
304
- out[k] = SECRET_RE.test(k) ? '[REDACTED]' : sanitise(val);
305
- }
306
- return out;
307
- }
308
- return v;
308
+ return redactSecretsDeep(v, { keyRe: SECRET_RE, replacement: '[REDACTED]' });
309
309
  }
310
310
  // --- dispatch --------------------------------------------------------------
311
311
  function usage() {
@@ -361,9 +361,15 @@ export async function scoreCmd(args) {
361
361
  return { code: 2, lines: [`harness score: not a directory: ${dir}`] };
362
362
  }
363
363
  const sc = buildScorecard(dir);
364
+ // #15 — carry the schema discriminator on the badge output so a consumer can detect this shape at
365
+ // the DATA layer. `harness score` and `metaharness score` are DIFFERENT operations with different
366
+ // JSON shapes; an unmarked badge blob was silently mis-parsed as the `metaharness score` scorecard
367
+ // (every field defaulting to 0). The metaharness scorecard uses numeric `schema: 1`; this string id
368
+ // is unambiguously distinct so downstream code can refuse the wrong shape instead of guessing.
369
+ const badgeOutput = { schema: HARNESS_SCORE_SCHEMA, ...sc.badges };
364
370
  if (outPath) {
365
371
  try {
366
- writeFileSync(resolve(outPath), JSON.stringify(sc.badges, null, 2) + '\n', 'utf-8');
372
+ writeFileSync(resolve(outPath), JSON.stringify(badgeOutput, null, 2) + '\n', 'utf-8');
367
373
  }
368
374
  catch (e) {
369
375
  const err = { schema: 1, error: 'out-write-failed', detail: String(e), exitCode: 2 };
@@ -374,7 +380,7 @@ export async function scoreCmd(args) {
374
380
  return { code: sc.exitCode, lines: [JSON.stringify(sanitise(sc), null, 2)] };
375
381
  }
376
382
  if (json) {
377
- return { code: sc.exitCode, lines: [JSON.stringify(sc.badges, null, 2)] };
383
+ return { code: sc.exitCode, lines: [JSON.stringify(badgeOutput, null, 2)] };
378
384
  }
379
385
  return { code: sc.exitCode, lines: formatScorecard(sc) };
380
386
  }