harnery 0.0.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -2
  3. package/bin/agent-coord +42 -0
  4. package/bin/agent-hook +44 -0
  5. package/bin/harn +40 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +18 -0
  9. package/dist/commander.d.ts +128 -0
  10. package/dist/commander.d.ts.map +1 -0
  11. package/dist/commander.js +126 -0
  12. package/dist/commands/agents.d.ts +18 -0
  13. package/dist/commands/agents.d.ts.map +1 -0
  14. package/dist/commands/agents.js +3946 -0
  15. package/dist/commands/backup.d.ts +22 -0
  16. package/dist/commands/backup.d.ts.map +1 -0
  17. package/dist/commands/backup.js +262 -0
  18. package/dist/commands/browse-ai.d.ts +4 -0
  19. package/dist/commands/browse-ai.d.ts.map +1 -0
  20. package/dist/commands/browse-ai.js +156 -0
  21. package/dist/commands/browse.d.ts +4 -0
  22. package/dist/commands/browse.d.ts.map +1 -0
  23. package/dist/commands/browse.js +590 -0
  24. package/dist/commands/callers.d.ts +4 -0
  25. package/dist/commands/callers.d.ts.map +1 -0
  26. package/dist/commands/callers.js +276 -0
  27. package/dist/commands/completion.d.ts +17 -0
  28. package/dist/commands/completion.d.ts.map +1 -0
  29. package/dist/commands/completion.js +158 -0
  30. package/dist/commands/config-get.d.ts +4 -0
  31. package/dist/commands/config-get.d.ts.map +1 -0
  32. package/dist/commands/config-get.js +131 -0
  33. package/dist/commands/context.d.ts +11 -0
  34. package/dist/commands/context.d.ts.map +1 -0
  35. package/dist/commands/context.js +185 -0
  36. package/dist/commands/cookies.d.ts +4 -0
  37. package/dist/commands/cookies.d.ts.map +1 -0
  38. package/dist/commands/cookies.js +140 -0
  39. package/dist/commands/docs.d.ts +4 -0
  40. package/dist/commands/docs.d.ts.map +1 -0
  41. package/dist/commands/docs.js +137 -0
  42. package/dist/commands/doctor.d.ts +25 -0
  43. package/dist/commands/doctor.d.ts.map +1 -0
  44. package/dist/commands/doctor.js +200 -0
  45. package/dist/commands/edit-batch.d.ts +18 -0
  46. package/dist/commands/edit-batch.d.ts.map +1 -0
  47. package/dist/commands/edit-batch.js +172 -0
  48. package/dist/commands/eml.d.ts +4 -0
  49. package/dist/commands/eml.d.ts.map +1 -0
  50. package/dist/commands/eml.js +428 -0
  51. package/dist/commands/env.d.ts +4 -0
  52. package/dist/commands/env.d.ts.map +1 -0
  53. package/dist/commands/env.js +201 -0
  54. package/dist/commands/fetch.d.ts +4 -0
  55. package/dist/commands/fetch.d.ts.map +1 -0
  56. package/dist/commands/fetch.js +99 -0
  57. package/dist/commands/file-history.d.ts +4 -0
  58. package/dist/commands/file-history.d.ts.map +1 -0
  59. package/dist/commands/file-history.js +152 -0
  60. package/dist/commands/grep.d.ts +4 -0
  61. package/dist/commands/grep.d.ts.map +1 -0
  62. package/dist/commands/grep.js +317 -0
  63. package/dist/commands/init.d.ts +82 -0
  64. package/dist/commands/init.d.ts.map +1 -0
  65. package/dist/commands/init.js +288 -0
  66. package/dist/commands/outline.d.ts +4 -0
  67. package/dist/commands/outline.d.ts.map +1 -0
  68. package/dist/commands/outline.js +509 -0
  69. package/dist/commands/presence.d.ts +12 -0
  70. package/dist/commands/presence.d.ts.map +1 -0
  71. package/dist/commands/presence.js +123 -0
  72. package/dist/commands/read.d.ts +7 -0
  73. package/dist/commands/read.d.ts.map +1 -0
  74. package/dist/commands/read.js +46 -0
  75. package/dist/commands/scratch.d.ts +4 -0
  76. package/dist/commands/scratch.d.ts.map +1 -0
  77. package/dist/commands/scratch.js +426 -0
  78. package/dist/commands/session.d.ts +4 -0
  79. package/dist/commands/session.d.ts.map +1 -0
  80. package/dist/commands/session.js +162 -0
  81. package/dist/commands/sync.d.ts +24 -0
  82. package/dist/commands/sync.d.ts.map +1 -0
  83. package/dist/commands/sync.js +275 -0
  84. package/dist/commands/toc.d.ts +5 -0
  85. package/dist/commands/toc.d.ts.map +1 -0
  86. package/dist/commands/toc.js +153 -0
  87. package/dist/commands/tokens.d.ts +4 -0
  88. package/dist/commands/tokens.d.ts.map +1 -0
  89. package/dist/commands/tokens.js +48 -0
  90. package/dist/commands/tunnel.d.ts +4 -0
  91. package/dist/commands/tunnel.d.ts.map +1 -0
  92. package/dist/commands/tunnel.js +513 -0
  93. package/dist/commands/uninstall.d.ts +22 -0
  94. package/dist/commands/uninstall.d.ts.map +1 -0
  95. package/dist/commands/uninstall.js +126 -0
  96. package/dist/commands/web.d.ts +4 -0
  97. package/dist/commands/web.d.ts.map +1 -0
  98. package/dist/commands/web.js +165 -0
  99. package/dist/core/agents/canonical-emit.d.ts +27 -0
  100. package/dist/core/agents/canonical-emit.d.ts.map +1 -0
  101. package/dist/core/agents/canonical-emit.js +72 -0
  102. package/dist/core/agents/cli-emit.d.ts +27 -0
  103. package/dist/core/agents/cli-emit.d.ts.map +1 -0
  104. package/dist/core/agents/cli-emit.js +57 -0
  105. package/dist/core/agents/cli.d.ts +10 -0
  106. package/dist/core/agents/cli.d.ts.map +1 -0
  107. package/dist/core/agents/cli.js +757 -0
  108. package/dist/core/agents/codex-replay.d.ts +29 -0
  109. package/dist/core/agents/codex-replay.d.ts.map +1 -0
  110. package/dist/core/agents/codex-replay.js +138 -0
  111. package/dist/core/agents/coord-client.d.ts +98 -0
  112. package/dist/core/agents/coord-client.d.ts.map +1 -0
  113. package/dist/core/agents/coord-client.js +212 -0
  114. package/dist/core/agents/events/consume.d.ts +59 -0
  115. package/dist/core/agents/events/consume.d.ts.map +1 -0
  116. package/dist/core/agents/events/consume.js +147 -0
  117. package/dist/core/agents/events/emit.d.ts +42 -0
  118. package/dist/core/agents/events/emit.d.ts.map +1 -0
  119. package/dist/core/agents/events/emit.js +70 -0
  120. package/dist/core/agents/events/ulid.d.ts +11 -0
  121. package/dist/core/agents/events/ulid.d.ts.map +1 -0
  122. package/dist/core/agents/events/ulid.js +47 -0
  123. package/dist/core/agents/index.d.ts +14 -0
  124. package/dist/core/agents/index.d.ts.map +1 -0
  125. package/dist/core/agents/index.js +13 -0
  126. package/dist/core/agents/paths.d.ts +6 -0
  127. package/dist/core/agents/paths.d.ts.map +1 -0
  128. package/dist/core/agents/paths.js +17 -0
  129. package/dist/core/agents/render/prompt-context.d.ts +43 -0
  130. package/dist/core/agents/render/prompt-context.d.ts.map +1 -0
  131. package/dist/core/agents/render/prompt-context.js +335 -0
  132. package/dist/core/agents/render/session-context.d.ts +39 -0
  133. package/dist/core/agents/render/session-context.d.ts.map +1 -0
  134. package/dist/core/agents/render/session-context.js +283 -0
  135. package/dist/core/agents/rules/claim-conflict.d.ts +35 -0
  136. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -0
  137. package/dist/core/agents/rules/claim-conflict.js +244 -0
  138. package/dist/core/agents/rules/commit-conflict.d.ts +59 -0
  139. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -0
  140. package/dist/core/agents/rules/commit-conflict.js +244 -0
  141. package/dist/core/agents/rules/stop-hook.d.ts +44 -0
  142. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -0
  143. package/dist/core/agents/rules/stop-hook.js +161 -0
  144. package/dist/core/agents/session-events.d.ts +41 -0
  145. package/dist/core/agents/session-events.d.ts.map +1 -0
  146. package/dist/core/agents/session-events.js +205 -0
  147. package/dist/core/agents/state/activity-log.d.ts +18 -0
  148. package/dist/core/agents/state/activity-log.d.ts.map +1 -0
  149. package/dist/core/agents/state/activity-log.js +34 -0
  150. package/dist/core/agents/state/council.d.ts +39 -0
  151. package/dist/core/agents/state/council.d.ts.map +1 -0
  152. package/dist/core/agents/state/council.js +216 -0
  153. package/dist/core/agents/state/heartbeat-projector.d.ts +59 -0
  154. package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -0
  155. package/dist/core/agents/state/heartbeat-projector.js +436 -0
  156. package/dist/core/agents/state/heartbeat-writer.d.ts +64 -0
  157. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -0
  158. package/dist/core/agents/state/heartbeat-writer.js +271 -0
  159. package/dist/core/agents/state/names.d.ts +35 -0
  160. package/dist/core/agents/state/names.d.ts.map +1 -0
  161. package/dist/core/agents/state/names.js +376 -0
  162. package/dist/core/agents/state/pidmap.d.ts +11 -0
  163. package/dist/core/agents/state/pidmap.d.ts.map +1 -0
  164. package/dist/core/agents/state/pidmap.js +32 -0
  165. package/dist/core/agents/state/scratch.d.ts +27 -0
  166. package/dist/core/agents/state/scratch.d.ts.map +1 -0
  167. package/dist/core/agents/state/scratch.js +90 -0
  168. package/dist/core/agents/state/shell-mutation.d.ts +17 -0
  169. package/dist/core/agents/state/shell-mutation.d.ts.map +1 -0
  170. package/dist/core/agents/state/shell-mutation.js +41 -0
  171. package/dist/core/agents/state/stale-sweep.d.ts +16 -0
  172. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -0
  173. package/dist/core/agents/state/stale-sweep.js +166 -0
  174. package/dist/core/config.d.ts +29 -0
  175. package/dist/core/config.d.ts.map +1 -0
  176. package/dist/core/config.js +108 -0
  177. package/dist/core/hooks/cli.d.ts +21 -0
  178. package/dist/core/hooks/cli.d.ts.map +1 -0
  179. package/dist/core/hooks/cli.js +1123 -0
  180. package/dist/core/hooks/effects/image-capture.d.ts +43 -0
  181. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -0
  182. package/dist/core/hooks/effects/image-capture.js +288 -0
  183. package/dist/core/hooks/effects/index.d.ts +64 -0
  184. package/dist/core/hooks/effects/index.d.ts.map +1 -0
  185. package/dist/core/hooks/effects/index.js +197 -0
  186. package/dist/core/hooks/events/emit.d.ts +31 -0
  187. package/dist/core/hooks/events/emit.d.ts.map +1 -0
  188. package/dist/core/hooks/events/emit.js +89 -0
  189. package/dist/core/hooks/events/schema.d.ts +235 -0
  190. package/dist/core/hooks/events/schema.d.ts.map +1 -0
  191. package/dist/core/hooks/events/schema.js +12 -0
  192. package/dist/core/hooks/events/ulid.d.ts +10 -0
  193. package/dist/core/hooks/events/ulid.d.ts.map +1 -0
  194. package/dist/core/hooks/events/ulid.js +47 -0
  195. package/dist/core/hooks/harness/detect.d.ts +9 -0
  196. package/dist/core/hooks/harness/detect.d.ts.map +1 -0
  197. package/dist/core/hooks/harness/detect.js +29 -0
  198. package/dist/core/hooks/harness/events.d.ts +45 -0
  199. package/dist/core/hooks/harness/events.d.ts.map +1 -0
  200. package/dist/core/hooks/harness/events.js +71 -0
  201. package/dist/core/hooks/harness/output.d.ts +46 -0
  202. package/dist/core/hooks/harness/output.d.ts.map +1 -0
  203. package/dist/core/hooks/harness/output.js +87 -0
  204. package/dist/core/hooks/harness/parse.d.ts +67 -0
  205. package/dist/core/hooks/harness/parse.d.ts.map +1 -0
  206. package/dist/core/hooks/harness/parse.js +132 -0
  207. package/dist/core/hooks/index.d.ts +8 -0
  208. package/dist/core/hooks/index.d.ts.map +1 -0
  209. package/dist/core/hooks/index.js +7 -0
  210. package/dist/core/hooks/resolve/anchor.d.ts +37 -0
  211. package/dist/core/hooks/resolve/anchor.d.ts.map +1 -0
  212. package/dist/core/hooks/resolve/anchor.js +48 -0
  213. package/dist/core/hooks/resolve/coord-root.d.ts +6 -0
  214. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -0
  215. package/dist/core/hooks/resolve/coord-root.js +27 -0
  216. package/dist/core/hooks/resolve/intent.d.ts +33 -0
  217. package/dist/core/hooks/resolve/intent.d.ts.map +1 -0
  218. package/dist/core/hooks/resolve/intent.js +79 -0
  219. package/dist/core/hooks/resolve/owner.d.ts +42 -0
  220. package/dist/core/hooks/resolve/owner.d.ts.map +1 -0
  221. package/dist/core/hooks/resolve/owner.js +140 -0
  222. package/dist/core/hooks/resolve/transcript.d.ts +26 -0
  223. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -0
  224. package/dist/core/hooks/resolve/transcript.js +73 -0
  225. package/dist/index.d.ts +15 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +13 -0
  228. package/dist/lib/agent-browser/client.d.ts +99 -0
  229. package/dist/lib/agent-browser/client.d.ts.map +1 -0
  230. package/dist/lib/agent-browser/client.js +177 -0
  231. package/dist/lib/agent-browser/index.d.ts +2 -0
  232. package/dist/lib/agent-browser/index.d.ts.map +1 -0
  233. package/dist/lib/agent-browser/index.js +1 -0
  234. package/dist/lib/browser/client.d.ts +193 -0
  235. package/dist/lib/browser/client.d.ts.map +1 -0
  236. package/dist/lib/browser/client.js +325 -0
  237. package/dist/lib/browser/dev-overlay.d.ts +23 -0
  238. package/dist/lib/browser/dev-overlay.d.ts.map +1 -0
  239. package/dist/lib/browser/dev-overlay.js +153 -0
  240. package/dist/lib/browser/index.d.ts +5 -0
  241. package/dist/lib/browser/index.d.ts.map +1 -0
  242. package/dist/lib/browser/index.js +2 -0
  243. package/dist/lib/browser/layout.d.ts +79 -0
  244. package/dist/lib/browser/layout.d.ts.map +1 -0
  245. package/dist/lib/browser/layout.js +220 -0
  246. package/dist/lib/browser/visibility.d.ts +86 -0
  247. package/dist/lib/browser/visibility.d.ts.map +1 -0
  248. package/dist/lib/browser/visibility.js +333 -0
  249. package/dist/lib/browser/visual-diff.d.ts +38 -0
  250. package/dist/lib/browser/visual-diff.d.ts.map +1 -0
  251. package/dist/lib/browser/visual-diff.js +107 -0
  252. package/dist/lib/completion/bash.d.ts +25 -0
  253. package/dist/lib/completion/bash.d.ts.map +1 -0
  254. package/dist/lib/completion/bash.js +284 -0
  255. package/dist/lib/completion/fish.d.ts +16 -0
  256. package/dist/lib/completion/fish.d.ts.map +1 -0
  257. package/dist/lib/completion/fish.js +118 -0
  258. package/dist/lib/completion/index.d.ts +5 -0
  259. package/dist/lib/completion/index.d.ts.map +1 -0
  260. package/dist/lib/completion/index.js +4 -0
  261. package/dist/lib/completion/walk.d.ts +68 -0
  262. package/dist/lib/completion/walk.d.ts.map +1 -0
  263. package/dist/lib/completion/walk.js +102 -0
  264. package/dist/lib/completion/zsh.d.ts +13 -0
  265. package/dist/lib/completion/zsh.d.ts.map +1 -0
  266. package/dist/lib/completion/zsh.js +249 -0
  267. package/dist/lib/context/index.d.ts +107 -0
  268. package/dist/lib/context/index.d.ts.map +1 -0
  269. package/dist/lib/context/index.js +275 -0
  270. package/dist/lib/cookies/client.d.ts +131 -0
  271. package/dist/lib/cookies/client.d.ts.map +1 -0
  272. package/dist/lib/cookies/client.js +239 -0
  273. package/dist/lib/cookies/index.d.ts +2 -0
  274. package/dist/lib/cookies/index.d.ts.map +1 -0
  275. package/dist/lib/cookies/index.js +1 -0
  276. package/dist/lib/council/index.d.ts +266 -0
  277. package/dist/lib/council/index.d.ts.map +1 -0
  278. package/dist/lib/council/index.js +674 -0
  279. package/dist/lib/docs-index.d.ts +28 -0
  280. package/dist/lib/docs-index.d.ts.map +1 -0
  281. package/dist/lib/docs-index.js +169 -0
  282. package/dist/lib/docs-lint.d.ts +26 -0
  283. package/dist/lib/docs-lint.d.ts.map +1 -0
  284. package/dist/lib/docs-lint.js +378 -0
  285. package/dist/lib/docs-sweep.d.ts +34 -0
  286. package/dist/lib/docs-sweep.d.ts.map +1 -0
  287. package/dist/lib/docs-sweep.js +304 -0
  288. package/dist/lib/docs.d.ts +27 -0
  289. package/dist/lib/docs.d.ts.map +1 -0
  290. package/dist/lib/docs.js +142 -0
  291. package/dist/lib/env.d.ts +11 -0
  292. package/dist/lib/env.d.ts.map +1 -0
  293. package/dist/lib/env.js +12 -0
  294. package/dist/lib/exec.d.ts +32 -0
  295. package/dist/lib/exec.d.ts.map +1 -0
  296. package/dist/lib/exec.js +54 -0
  297. package/dist/lib/format.d.ts +29 -0
  298. package/dist/lib/format.d.ts.map +1 -0
  299. package/dist/lib/format.js +139 -0
  300. package/dist/lib/http/client.d.ts +56 -0
  301. package/dist/lib/http/client.d.ts.map +1 -0
  302. package/dist/lib/http/client.js +160 -0
  303. package/dist/lib/http/index.d.ts +2 -0
  304. package/dist/lib/http/index.d.ts.map +1 -0
  305. package/dist/lib/http/index.js +1 -0
  306. package/dist/lib/identities/index.d.ts +77 -0
  307. package/dist/lib/identities/index.d.ts.map +1 -0
  308. package/dist/lib/identities/index.js +190 -0
  309. package/dist/lib/machine.d.ts +19 -0
  310. package/dist/lib/machine.d.ts.map +1 -0
  311. package/dist/lib/machine.js +61 -0
  312. package/dist/lib/presence.d.ts +48 -0
  313. package/dist/lib/presence.d.ts.map +1 -0
  314. package/dist/lib/presence.js +123 -0
  315. package/dist/lib/readability/client.d.ts +39 -0
  316. package/dist/lib/readability/client.d.ts.map +1 -0
  317. package/dist/lib/readability/client.js +121 -0
  318. package/dist/lib/readability/index.d.ts +2 -0
  319. package/dist/lib/readability/index.d.ts.map +1 -0
  320. package/dist/lib/readability/index.js +1 -0
  321. package/dist/lib/scratch/index.d.ts +74 -0
  322. package/dist/lib/scratch/index.d.ts.map +1 -0
  323. package/dist/lib/scratch/index.js +393 -0
  324. package/dist/lib/tunnel/gate.d.ts +12 -0
  325. package/dist/lib/tunnel/gate.d.ts.map +1 -0
  326. package/dist/lib/tunnel/gate.js +101 -0
  327. package/dist/lib/tunnel/state.d.ts +34 -0
  328. package/dist/lib/tunnel/state.d.ts.map +1 -0
  329. package/dist/lib/tunnel/state.js +132 -0
  330. package/package.json +160 -8
  331. package/schemas/.gitkeep +0 -0
  332. package/schemas/config.schema.json +109 -0
  333. package/src/cli.ts +22 -0
  334. package/src/commander.ts +242 -0
  335. package/src/commands/.gitkeep +0 -0
  336. package/src/commands/agents.ts +4567 -0
  337. package/src/commands/backup.ts +305 -0
  338. package/src/commands/browse-ai.ts +198 -0
  339. package/src/commands/browse.ts +849 -0
  340. package/src/commands/callers.ts +363 -0
  341. package/src/commands/completion.ts +193 -0
  342. package/src/commands/config-get.ts +161 -0
  343. package/src/commands/context.ts +209 -0
  344. package/src/commands/cookies.ts +198 -0
  345. package/src/commands/docs.ts +174 -0
  346. package/src/commands/doctor.ts +231 -0
  347. package/src/commands/edit-batch.ts +233 -0
  348. package/src/commands/eml.ts +519 -0
  349. package/src/commands/env.ts +254 -0
  350. package/src/commands/fetch.ts +136 -0
  351. package/src/commands/file-history.ts +202 -0
  352. package/src/commands/grep.ts +371 -0
  353. package/src/commands/init.ts +335 -0
  354. package/src/commands/outline.ts +583 -0
  355. package/src/commands/presence.ts +152 -0
  356. package/src/commands/read.ts +64 -0
  357. package/src/commands/scratch.ts +445 -0
  358. package/src/commands/session.ts +187 -0
  359. package/src/commands/sync.ts +306 -0
  360. package/src/commands/toc.ts +218 -0
  361. package/src/commands/tokens.ts +79 -0
  362. package/src/commands/tunnel.ts +633 -0
  363. package/src/commands/uninstall.ts +144 -0
  364. package/src/commands/web.ts +193 -0
  365. package/src/core/agents/canonical-emit.ts +77 -0
  366. package/src/core/agents/cli-emit.ts +64 -0
  367. package/src/core/agents/cli.ts +838 -0
  368. package/src/core/agents/codex-replay.ts +163 -0
  369. package/src/core/agents/coord-client.ts +249 -0
  370. package/src/core/agents/events/consume.ts +196 -0
  371. package/src/core/agents/events/emit.ts +108 -0
  372. package/src/core/agents/events/ulid.ts +51 -0
  373. package/src/core/agents/index.ts +14 -0
  374. package/src/core/agents/paths.ts +16 -0
  375. package/src/core/agents/render/prompt-context.ts +401 -0
  376. package/src/core/agents/render/session-context.ts +341 -0
  377. package/src/core/agents/rules/claim-conflict.ts +282 -0
  378. package/src/core/agents/rules/commit-conflict.ts +303 -0
  379. package/src/core/agents/rules/stop-hook.ts +229 -0
  380. package/src/core/agents/session-events.ts +228 -0
  381. package/src/core/agents/state/activity-log.ts +33 -0
  382. package/src/core/agents/state/council.ts +265 -0
  383. package/src/core/agents/state/heartbeat-projector.ts +488 -0
  384. package/src/core/agents/state/heartbeat-writer.ts +333 -0
  385. package/src/core/agents/state/names.ts +399 -0
  386. package/src/core/agents/state/pidmap.ts +38 -0
  387. package/src/core/agents/state/scratch.ts +121 -0
  388. package/src/core/agents/state/shell-mutation.ts +44 -0
  389. package/src/core/agents/state/stale-sweep.ts +190 -0
  390. package/src/core/config.ts +111 -0
  391. package/src/core/hooks/cli.ts +1247 -0
  392. package/src/core/hooks/effects/image-capture.ts +330 -0
  393. package/src/core/hooks/effects/index.ts +210 -0
  394. package/src/core/hooks/events/emit.ts +120 -0
  395. package/src/core/hooks/events/schema.ts +430 -0
  396. package/src/core/hooks/events/ulid.ts +51 -0
  397. package/src/core/hooks/harness/detect.ts +30 -0
  398. package/src/core/hooks/harness/events.ts +102 -0
  399. package/src/core/hooks/harness/output.ts +100 -0
  400. package/src/core/hooks/harness/parse.ts +180 -0
  401. package/src/core/hooks/index.ts +16 -0
  402. package/src/core/hooks/resolve/anchor.ts +51 -0
  403. package/src/core/hooks/resolve/coord-root.ts +25 -0
  404. package/src/core/hooks/resolve/intent.ts +89 -0
  405. package/src/core/hooks/resolve/owner.ts +140 -0
  406. package/src/core/hooks/resolve/transcript.ts +72 -0
  407. package/src/hooks/.gitkeep +0 -0
  408. package/src/index.ts +15 -0
  409. package/src/lib/agent-browser/client.ts +239 -0
  410. package/src/lib/agent-browser/index.ts +1 -0
  411. package/src/lib/browser/client.ts +449 -0
  412. package/src/lib/browser/dev-overlay.ts +207 -0
  413. package/src/lib/browser/index.ts +24 -0
  414. package/src/lib/browser/layout.ts +288 -0
  415. package/src/lib/browser/visibility.ts +419 -0
  416. package/src/lib/browser/visual-diff.ts +150 -0
  417. package/src/lib/completion/bash.ts +291 -0
  418. package/src/lib/completion/fish.ts +134 -0
  419. package/src/lib/completion/index.ts +10 -0
  420. package/src/lib/completion/walk.ts +184 -0
  421. package/src/lib/completion/zsh.ts +262 -0
  422. package/src/lib/context/index.ts +386 -0
  423. package/src/lib/cookies/client.ts +301 -0
  424. package/src/lib/cookies/index.ts +13 -0
  425. package/src/lib/council/index.ts +803 -0
  426. package/src/lib/docs-index.ts +216 -0
  427. package/src/lib/docs-lint.ts +413 -0
  428. package/src/lib/docs-sweep.ts +348 -0
  429. package/src/lib/docs.ts +199 -0
  430. package/src/lib/env.ts +12 -0
  431. package/src/lib/exec.ts +74 -0
  432. package/src/lib/format.ts +147 -0
  433. package/src/lib/http/client.ts +211 -0
  434. package/src/lib/http/index.ts +1 -0
  435. package/src/lib/identities/index.ts +210 -0
  436. package/src/lib/machine.ts +61 -0
  437. package/src/lib/presence.ts +154 -0
  438. package/src/lib/readability/client.ts +169 -0
  439. package/src/lib/readability/index.ts +5 -0
  440. package/src/lib/readability/turndown-plugin-gfm.d.ts +10 -0
  441. package/src/lib/scratch/index.ts +470 -0
  442. package/src/lib/tunnel/gate.ts +113 -0
  443. package/src/lib/tunnel/state.ts +167 -0
  444. package/src/web/.gitkeep +0 -0
  445. package/index.js +0 -1
@@ -0,0 +1,288 @@
1
+ /**
2
+ * `harn init`: idempotently wire harnery into a project.
3
+ *
4
+ * Two things a fresh consumer otherwise has to know to do by hand (both silent
5
+ * if skipped):
6
+ * 1. Create the `.harnery/` coord root; without it `findCoordRoot` returns
7
+ * null and every hook no-ops forever.
8
+ * 2. Register the agent-hook entries in the harness settings file.
9
+ *
10
+ * Wires whichever harness `--harness` names (Claude Code `.claude/settings.json`,
11
+ * Cursor `.cursor/hooks.json`, or Codex `.codex/hooks.json`): the per-harness
12
+ * file path, event list, and hook-entry shape all come from HARNESS_SPECS.
13
+ *
14
+ * `harn init` does both, non-destructively: it merges hook entries into an
15
+ * existing settings file (preserving any other hooks) and skips entries that are
16
+ * already wired, so it's safe to re-run. `--dry-run` previews without writing.
17
+ */
18
+ import { spawnSync } from "node:child_process";
19
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
20
+ import { dirname, relative, resolve } from "node:path";
21
+ import { fileURLToPath } from "node:url";
22
+ import { DEFAULT_BIN_NAME, stripJsonComments } from "../core/config.js";
23
+ import { HARNESS_SPECS, } from "../core/hooks/harness/events.js";
24
+ // This file is src/commands/init.ts → harnery package root is two levels up.
25
+ const HARNERY_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
26
+ export function registerInitCommand(program, emit, binName) {
27
+ program
28
+ .command("init")
29
+ .description("Bootstrap harnery in this project: create .harnery/ and wire the harness " +
30
+ "hooks (idempotent; safe to re-run). Use --dry-run to preview.")
31
+ .option("--harness <id>", "claude-code | cursor | codex", "claude-code")
32
+ .option("--dry-run", "Show what would change without writing")
33
+ .option("--project-root <path>", "Project root (default: git toplevel, else cwd)")
34
+ .action((opts) => {
35
+ const harness = opts.harness;
36
+ const spec = HARNESS_SPECS[harness];
37
+ if (!spec) {
38
+ emit.text(`Unknown harness '${opts.harness}'. Expected: claude-code | cursor | codex.`);
39
+ emit.setExitCode(1);
40
+ return;
41
+ }
42
+ const projectRoot = resolve(opts.projectRoot ?? gitTopLevel() ?? process.cwd());
43
+ const dryRun = opts.dryRun === true;
44
+ const actions = [];
45
+ // ── 1. coord root ──────────────────────────────────────────────────────
46
+ const coordDir = resolve(projectRoot, ".harnery");
47
+ if (existsSync(coordDir)) {
48
+ actions.push("· .harnery/ already exists");
49
+ }
50
+ else if (dryRun) {
51
+ actions.push("+ would create .harnery/ (+ .harnery/.gitignore)");
52
+ }
53
+ else {
54
+ mkdirSync(coordDir, { recursive: true });
55
+ // Runtime state is machine-local; don't let consumers commit heartbeats.
56
+ writeFileSync(resolve(coordDir, ".gitignore"), "*\n!.gitignore\n");
57
+ actions.push("+ created .harnery/ (+ .harnery/.gitignore)");
58
+ }
59
+ // ── 1b. stamp the host bin name ────────────────────────────────────────
60
+ // The coord binaries (agent-hook/agent-coord) and web UI run as harnery
61
+ // itself, so they can't see a consumer CLI's name; they read it back from
62
+ // config.jsonc. Standalone `harn` is the resolver's default, so only a
63
+ // consumer (binName ≠ "harn") needs the stamp.
64
+ if (binName && binName !== DEFAULT_BIN_NAME) {
65
+ const configPath = resolve(coordDir, "config.jsonc");
66
+ const stamp = stampBinName(configPath, binName, dryRun);
67
+ if (stamp)
68
+ actions.push(stamp);
69
+ }
70
+ // ── 2. harness hooks ───────────────────────────────────────────────────
71
+ const settingsPath = resolve(projectRoot, spec.settingsFile);
72
+ const agentHook = relative(projectRoot, resolve(HARNERY_ROOT, "bin", "agent-hook"));
73
+ let settings;
74
+ if (existsSync(settingsPath)) {
75
+ try {
76
+ settings = JSON.parse(readFileSync(settingsPath, "utf8"));
77
+ }
78
+ catch (err) {
79
+ emit.text(`✗ ${rel(projectRoot, settingsPath)} exists but isn't valid JSON; refusing to ` +
80
+ `overwrite. Fix it and re-run.\n (${err.message})`);
81
+ emit.setExitCode(1);
82
+ return;
83
+ }
84
+ }
85
+ else {
86
+ settings = {};
87
+ }
88
+ const { wired, already } = wireHooks(settings, spec, agentHook, harness);
89
+ if (wired === 0) {
90
+ actions.push(`· all ${spec.events.length} ${harness} hooks already wired in ${rel(projectRoot, settingsPath)}`);
91
+ }
92
+ else if (dryRun) {
93
+ actions.push(`+ would wire ${wired} hook(s) into ${rel(projectRoot, settingsPath)} (${already} already present)`);
94
+ }
95
+ else {
96
+ mkdirSync(dirname(settingsPath), { recursive: true });
97
+ writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
98
+ actions.push(`+ wired ${wired} hook(s) into ${rel(projectRoot, settingsPath)} (${already} already present)`);
99
+ }
100
+ emit.text(render(projectRoot, dryRun, actions));
101
+ });
102
+ }
103
+ /**
104
+ * Merge agent-hook entries into a harness settings object in place, idempotently.
105
+ * Preserves every existing hook; skips events already wired to
106
+ * `agent-hook <subcommand>`. Honors the harness's entry shape (Claude/Codex nest
107
+ * under an inner `hooks` array; Cursor uses a flat `{ command }`) and ensures the
108
+ * root `version` key when the harness requires one. Pure (no fs/git) so it's
109
+ * unit-testable.
110
+ *
111
+ * The trailing space in the match (`agent-hook ${subcommand} `) is load-bearing:
112
+ * it keeps `stop` from matching `stop-failure`.
113
+ */
114
+ export function wireHooks(settings, spec, agentHookPath, harness) {
115
+ if (spec.rootVersion !== undefined && settings.version === undefined) {
116
+ settings.version = spec.rootVersion;
117
+ }
118
+ if (!settings.hooks)
119
+ settings.hooks = {};
120
+ let wired = 0;
121
+ let already = 0;
122
+ for (const { settingsKey, subcommand } of spec.events) {
123
+ const command = `bash ${agentHookPath} ${subcommand} --harness ${harness}`;
124
+ const groups = settings.hooks[settingsKey] ?? [];
125
+ const present = groups.some((g) => groupCommands(g).some((c) => c.includes(`agent-hook ${subcommand} `)));
126
+ if (present) {
127
+ already++;
128
+ continue;
129
+ }
130
+ groups.push(makeEntry(spec.entryShape, command));
131
+ settings.hooks[settingsKey] = groups;
132
+ wired++;
133
+ }
134
+ return { wired, already };
135
+ }
136
+ /**
137
+ * Inverse of {@link wireHooks}: strip every harnery-owned hook entry from a
138
+ * settings object in place, idempotently. A hook is "harnery's" when its command
139
+ * contains `agent-hook ` (the trailing space matches `agent-hook <subcommand>`),
140
+ * so any non-harnery hook the consumer added is preserved. Emptied
141
+ * `hooks[settingsKey]` arrays are dropped; an emptied `hooks` object is dropped
142
+ * entirely. Harness-agnostic (scans every key) so it removes entries left by any
143
+ * harness. Pure (no fs) so it's unit-testable. Returns the count removed and the
144
+ * count of non-harnery hooks left behind.
145
+ */
146
+ export function unwireHooks(settings) {
147
+ if (!settings.hooks || typeof settings.hooks !== "object")
148
+ return { removed: 0, remaining: 0 };
149
+ let removed = 0;
150
+ for (const key of Object.keys(settings.hooks)) {
151
+ const groups = settings.hooks[key];
152
+ if (!Array.isArray(groups))
153
+ continue;
154
+ const kept = groups.filter((g) => !groupCommands(g).some((c) => c.includes("agent-hook ")));
155
+ removed += groups.length - kept.length;
156
+ // removing the emptied hook key is the intent (tiny one-shot object)
157
+ if (kept.length === 0)
158
+ delete settings.hooks[key];
159
+ else
160
+ settings.hooks[key] = kept;
161
+ }
162
+ let remaining = 0;
163
+ for (const groups of Object.values(settings.hooks)) {
164
+ if (Array.isArray(groups))
165
+ remaining += groups.length;
166
+ }
167
+ // drop the now-empty hooks object so callers see a clean shape
168
+ if (Object.keys(settings.hooks).length === 0)
169
+ delete settings.hooks;
170
+ return { removed, remaining };
171
+ }
172
+ /** Build a hook entry in the harness's shape. */
173
+ function makeEntry(shape, command) {
174
+ return shape === "cursor" ? { command } : { hooks: [{ type: "command", command }] };
175
+ }
176
+ /** Pull every command string out of a hook entry, regardless of shape. */
177
+ function groupCommands(group) {
178
+ if ("command" in group && typeof group.command === "string")
179
+ return [group.command];
180
+ if ("hooks" in group && Array.isArray(group.hooks)) {
181
+ return group.hooks.map((h) => h.command).filter((c) => typeof c === "string");
182
+ }
183
+ return [];
184
+ }
185
+ /**
186
+ * Idempotently record `binName` in `.harnery/config.jsonc`, preserving any
187
+ * existing JSONC comments and the `files` section. Returns an action line, or
188
+ * null when nothing changed. Three cases:
189
+ * - file absent → write a minimal commented stub;
190
+ * - `binName` already present + matching → no-op;
191
+ * - present-but-different value → comment-safe in-place value swap;
192
+ * - key absent → splice it in as the first key (comment-safe).
193
+ */
194
+ export function stampBinName(configPath, binName, dryRun) {
195
+ const rel = (p) => relative(dirname(dirname(configPath)), p) || p;
196
+ const quoted = JSON.stringify(binName);
197
+ if (!existsSync(configPath)) {
198
+ if (dryRun)
199
+ return `+ would stamp binName "${binName}" into ${rel(configPath)}`;
200
+ writeFileSync(configPath, `{\n // Host CLI bin name, surfaced in agent-facing prompts + nudges.\n "binName": ${quoted}\n}\n`);
201
+ return `+ stamped binName "${binName}" into ${rel(configPath)}`;
202
+ }
203
+ let raw;
204
+ try {
205
+ raw = readFileSync(configPath, "utf8");
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ let parsed;
211
+ try {
212
+ parsed = JSON.parse(stripJsonComments(raw)) ?? {};
213
+ }
214
+ catch {
215
+ // Unparseable config: don't clobber it; leave the bin name to env/manual fix.
216
+ return `· ${rel(configPath)} isn't valid JSONC; skipped binName stamp`;
217
+ }
218
+ if (parsed.binName === binName)
219
+ return null;
220
+ if (typeof parsed.binName === "string") {
221
+ // Existing value differs; swap it in place (keeps comments + layout).
222
+ const next = raw.replace(/("binName"\s*:\s*)"(?:[^"\\]|\\.)*"/, `$1${quoted}`);
223
+ if (dryRun)
224
+ return `~ would update binName → "${binName}" in ${rel(configPath)}`;
225
+ writeFileSync(configPath, next);
226
+ return `~ updated binName → "${binName}" in ${rel(configPath)}`;
227
+ }
228
+ // No binName key yet; splice it as the first key.
229
+ const keys = Object.keys(parsed);
230
+ let next;
231
+ if (keys.length === 0) {
232
+ next = `{\n "binName": ${quoted}\n}\n`;
233
+ }
234
+ else {
235
+ // Insert after the first structural `{` (skipping leading ws + comments).
236
+ const at = firstBraceIndex(raw);
237
+ if (at < 0)
238
+ return `· ${rel(configPath)} has no object literal; skipped binName stamp`;
239
+ next = `${raw.slice(0, at + 1)}\n "binName": ${quoted},${raw.slice(at + 1)}`;
240
+ }
241
+ if (dryRun)
242
+ return `+ would add binName "${binName}" to ${rel(configPath)}`;
243
+ writeFileSync(configPath, next);
244
+ return `+ added binName "${binName}" to ${rel(configPath)}`;
245
+ }
246
+ /** Index of the first structural `{`, skipping leading whitespace + comments. */
247
+ function firstBraceIndex(raw) {
248
+ let i = 0;
249
+ while (i < raw.length) {
250
+ const ch = raw[i];
251
+ if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") {
252
+ i++;
253
+ }
254
+ else if (ch === "/" && raw[i + 1] === "/") {
255
+ while (i < raw.length && raw[i] !== "\n")
256
+ i++;
257
+ }
258
+ else if (ch === "/" && raw[i + 1] === "*") {
259
+ i += 2;
260
+ while (i < raw.length && !(raw[i] === "*" && raw[i + 1] === "/"))
261
+ i++;
262
+ i += 2;
263
+ }
264
+ else if (ch === "{") {
265
+ return i;
266
+ }
267
+ else {
268
+ return -1;
269
+ }
270
+ }
271
+ return -1;
272
+ }
273
+ function render(projectRoot, dryRun, actions) {
274
+ const head = dryRun ? "harn init (dry run): no changes written" : "harn init";
275
+ const tail = dryRun
276
+ ? "\nRe-run without --dry-run to apply."
277
+ : "\nDone. Start a session and check `harn agents whoami`.";
278
+ return `${head}\n root: ${projectRoot}\n${actions.map((a) => ` ${a}`).join("\n")}${tail}`;
279
+ }
280
+ function gitTopLevel() {
281
+ const r = spawnSync("git", ["rev-parse", "--show-toplevel"], { encoding: "utf8" });
282
+ const out = r.status === 0 ? r.stdout.trim() : "";
283
+ return out || null;
284
+ }
285
+ function rel(root, p) {
286
+ const r = relative(root, p);
287
+ return r || p;
288
+ }
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { EmitContext } from "../commander.js";
3
+ export declare function registerOutlineCommand(program: Command, emit: EmitContext): void;
4
+ //# sourceMappingURL=outline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/commands/outline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAqDnD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAwBhF"}