@weavecode/weave 0.1.6 → 0.1.8

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 (435) hide show
  1. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +1 -1
  2. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
  3. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/context.js +1 -1
  4. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +3 -5
  5. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono-base.js +4 -10
  6. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono.js +0 -1
  7. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +1 -1
  8. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +1 -1
  9. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/csrf/index.js +2 -2
  10. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +2 -2
  11. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +2 -2
  12. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/mount/index.js +4 -4
  13. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +13 -11
  14. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +4 -4
  15. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +39 -51
  16. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +15 -5
  17. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/jwt/jwt.js +2 -1
  18. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/mount.js +35 -0
  19. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +10 -0
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/validator/validator.js +1 -1
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/context.js +1 -1
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +3 -5
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono-base.js +4 -10
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono.js +0 -1
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/basic-auth/index.js +1 -1
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +1 -1
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/csrf/index.js +2 -2
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwk/jwk.js +2 -2
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwt/jwt.js +2 -2
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/language/language.js +1 -1
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/mount/index.js +4 -4
  32. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/node.js +13 -11
  33. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +5 -5
  34. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/router.js +40 -52
  35. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/trie.js +15 -5
  36. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/mount/index.d.ts +1 -0
  37. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -3
  38. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +1 -1
  39. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/mount.d.ts +4 -0
  40. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/url.d.ts +1 -0
  41. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/jwt/jwt.js +2 -1
  42. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/mount.js +34 -0
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +10 -1
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/validator/validator.js +1 -1
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +3 -1
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/deflate.js +2 -1
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +2 -1
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
  50. package/node_modules/@weavecode/cli/dist/cli.js +3 -3
  51. package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
  52. package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
  53. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  54. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
  55. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  56. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  57. package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
  58. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  59. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  60. package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
  61. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +1 -1
  62. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +1 -0
  63. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +2 -2
  64. package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
  65. package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
  66. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
  67. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  68. package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
  69. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  70. package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
  71. package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
  72. package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
  73. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  74. package/node_modules/@weavecode/cli/dist/init/provision.js +1 -1
  75. package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
  76. package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
  77. package/node_modules/@weavecode/cli/dist/parser.js +1 -1
  78. package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
  79. package/node_modules/@weavecode/cli/package.json +5 -5
  80. package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
  81. package/node_modules/@weavecode/core/dist/harness.d.ts +89 -0
  82. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  83. package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
  84. package/node_modules/@weavecode/core/dist/index.js +1 -1
  85. package/node_modules/@weavecode/core/dist/platform.js +1 -1
  86. package/node_modules/@weavecode/core/dist/types.js +1 -1
  87. package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
  88. package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
  89. package/node_modules/@weavecode/core/package.json +1 -1
  90. package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
  91. package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
  92. package/node_modules/@weavecode/harness/dist/claude/commands.d.ts +2 -0
  93. package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -2
  94. package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
  95. package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
  96. package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
  97. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  98. package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
  99. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  100. package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -1
  101. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
  102. package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
  103. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
  104. package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -1
  105. package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
  106. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
  107. package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
  108. package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
  109. package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
  110. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
  111. package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
  112. package/node_modules/@weavecode/harness/dist/claude/rewind.js +1 -1
  113. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
  114. package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
  115. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +14 -14
  116. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
  117. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
  118. package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.js +2 -2
  119. package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -7
  120. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  121. package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
  122. package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
  123. package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
  124. package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
  125. package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
  126. package/node_modules/@weavecode/harness/dist/codex/images.js +1 -1
  127. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  128. package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -1
  129. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
  130. package/node_modules/@weavecode/harness/dist/codex/messaging.js +2 -2
  131. package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -1
  132. package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
  133. package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
  134. package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -1
  135. package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -2
  136. package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
  137. package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -4
  138. package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -4
  139. package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
  140. package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
  141. package/node_modules/@weavecode/harness/dist/driver.d.ts +13 -0
  142. package/node_modules/@weavecode/harness/dist/driver.js +1 -1
  143. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
  144. package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
  145. package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
  146. package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
  147. package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
  148. package/node_modules/@weavecode/harness/package.json +2 -2
  149. package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
  150. package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
  151. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  152. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  153. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  154. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
  155. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  156. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
  157. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  158. package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
  159. package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
  160. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  161. package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
  162. package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
  163. package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
  164. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  165. package/node_modules/@weavecode/server/dist/daemon/entry.js +2 -2
  166. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  167. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  168. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  169. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  170. package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -1
  171. package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
  172. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -2
  173. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -1
  174. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +1 -1
  175. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -2
  176. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -1
  177. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -1
  178. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -1
  179. package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -1
  180. package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
  181. package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
  182. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
  183. package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
  184. package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -1
  185. package/node_modules/@weavecode/server/dist/daemon/pet-seed.d.ts +6 -0
  186. package/node_modules/@weavecode/server/dist/daemon/pet-seed.js +1 -0
  187. package/node_modules/@weavecode/server/dist/daemon/pet-window.d.ts +17 -0
  188. package/node_modules/@weavecode/server/dist/daemon/pet-window.js +2 -0
  189. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  190. package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +1 -1
  191. package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
  192. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  193. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  194. package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
  195. package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
  196. package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
  197. package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
  198. package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
  199. package/node_modules/@weavecode/server/dist/daemon/routes/pets.d.ts +3 -0
  200. package/node_modules/@weavecode/server/dist/daemon/routes/pets.js +1 -0
  201. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -1
  202. package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
  203. package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -1
  204. package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
  205. package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
  206. package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
  207. package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
  208. package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +2 -1
  209. package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
  210. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +2 -0
  211. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
  212. package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +17 -0
  213. package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
  214. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  215. package/node_modules/@weavecode/server/dist/daemon/settings.d.ts +21 -0
  216. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  217. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  218. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
  219. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  220. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  221. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  222. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
  223. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  224. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  225. package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
  226. package/node_modules/@weavecode/server/dist/db/db.d.ts +4 -1
  227. package/node_modules/@weavecode/server/dist/db/db.js +2 -2
  228. package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
  229. package/node_modules/@weavecode/server/dist/db/paths.d.ts +4 -0
  230. package/node_modules/@weavecode/server/dist/db/paths.js +1 -1
  231. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  232. package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
  233. package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
  234. package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
  235. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
  236. package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
  237. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
  238. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
  239. package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
  240. package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
  241. package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
  242. package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
  243. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  244. package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
  245. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  246. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  247. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
  248. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  249. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  250. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +5 -5
  251. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  252. package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
  253. package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
  254. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  255. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  256. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  257. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  258. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  259. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  260. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  261. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  262. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  263. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  264. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
  265. package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
  266. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  267. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  268. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  269. package/node_modules/@weavecode/server/dist/index.d.ts +1 -1
  270. package/node_modules/@weavecode/server/dist/index.js +1 -1
  271. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  272. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  273. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  274. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  275. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  276. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
  277. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  278. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
  279. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  280. package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
  281. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  282. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  283. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  284. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  285. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  286. package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
  287. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  288. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  289. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  290. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  291. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  292. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  293. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  294. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  295. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  296. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  297. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  298. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  299. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
  300. package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +6 -0
  301. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +8 -5
  302. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  303. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  304. package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
  305. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  306. package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
  307. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  308. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  309. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  310. package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
  311. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  312. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
  313. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
  314. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  315. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  316. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  317. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  318. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  319. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  320. package/node_modules/@weavecode/server/package.json +4 -4
  321. package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-t5OQjhuS.js +1 -0
  322. package/node_modules/@weavecode/server/web/dist/assets/{arc-DH8-rYAa.js → arc-De-uH_Q9.js} +1 -1
  323. package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-ImPclD43.js +36 -0
  324. package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-pT5eO-cB.js → blockDiagram-RJAE7QA3-B5xEQs6X.js} +2 -2
  325. package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DHDBDMb1.js → c4Diagram-XDPPPE54-DP8MjIgJ.js} +2 -2
  326. package/node_modules/@weavecode/server/web/dist/assets/channel-C0RGiobt.js +1 -0
  327. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-CT951PH5.js → chunk-2E7WHVMD-C3UFIDyj.js} +1 -1
  328. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-E5AD7_ZY.js → chunk-2Q5K7J3B-Bgw-3YfG.js} +1 -1
  329. package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DWz9qkcy.js → chunk-4EMNKR2T-Dy_Wq9qn.js} +1 -1
  330. package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D32C0DXX.js +1 -0
  331. package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-ci6YzbO5.js → chunk-5VM5RSS4-Dpmi-9Gi.js} +1 -1
  332. package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CY4mr2f4.js → chunk-JWPE2WC7-CEYXaZDX.js} +1 -1
  333. package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CON8zyg8.js → chunk-VQ5W62QI-A616Pgzo.js} +1 -1
  334. package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-CnxFMLWV.js +1 -0
  335. package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-BhjCTig8.js +2 -0
  336. package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-GiWZ9xtF.js → classDiagram-v2-4MYWR3UA-rzlq5tPv.js} +2 -2
  337. package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-CxWQXzj8.js +1 -0
  338. package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-9B__MaRM.js → cynefin-EF2NZ3EQ-AFHjx2wU.js} +1 -1
  339. package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-Bp_Oaf9U.js +62 -0
  340. package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-7oUPIU35.js +4 -0
  341. package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-D_rS_rSY.js +24 -0
  342. package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-Duc_cKMb.js +24 -0
  343. package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-CckywF4W.js → diagram-ODIL2UCW-DA0XFVXm.js} +2 -2
  344. package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-Dpjlc7Wh.js → diagram-PFBEJUXE-D1U0Xhtt.js} +2 -2
  345. package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-CbDFY871.js +41 -0
  346. package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-DgRJ3zL1.js → diagram-TYUNFSNR-jPg9AxQv.js} +2 -2
  347. package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-ZHfGTB0N.js +1 -0
  348. package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-Ch6Gs9G9.js → elk-QONTBCTQ-C-ESJrUi.js} +3 -3
  349. package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-COxT-Pxb.js → erDiagram-KYQIGQAA-DGK7TeHj.js} +2 -2
  350. package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-CJVWnTBa.js → flowDiagram-IUGLLWBU-CVV4rL8v.js} +1 -1
  351. package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-CuAwNvbm.js +292 -0
  352. package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-D_15Wtf-.js +106 -0
  353. package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-ClqhbrCa.js +2 -0
  354. package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-BNjEDIZy.js → ishikawaDiagram-HPEHV2GE-CUJ891JX.js} +2 -2
  355. package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-Cao6h91a.js → journeyDiagram-BOSHW7O7-B4skiMu-.js} +2 -2
  356. package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CXIx2CHQ.js → kanban-definition-FNSA4HC5-UNGJR_y_.js} +2 -2
  357. package/node_modules/@weavecode/server/web/dist/assets/linear-BEB-UwbR.js +1 -0
  358. package/node_modules/@weavecode/server/web/dist/assets/main-B_0jS_Gz.js +1096 -0
  359. package/node_modules/@weavecode/server/web/dist/assets/main-Czzlavi4.css +11 -0
  360. package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D39fi_iR.js → mermaid.core-knGXJfjz.js} +4 -4
  361. package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-DHqpz_AK.js → mindmap-definition-6OY57UG3-CEldbr3a.js} +2 -2
  362. package/node_modules/@weavecode/server/web/dist/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
  363. package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-cNCkGLx3.js +1 -0
  364. package/node_modules/@weavecode/server/web/dist/assets/pet-DJCpIDM5.js +1 -0
  365. package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-CfMEFiQD.js +39 -0
  366. package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-zSM6o7mB.js → quadrantDiagram-D57K4MC3-knmi2rwP.js} +4 -4
  367. package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-BJ7AzhEo.js +1 -0
  368. package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-CbCLBjHf.js → requirementDiagram-EQYSW5RA-Dte2LGQM.js} +2 -2
  369. package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BucVk6EP.js → sankeyDiagram-SY24JHO5-3noLaWgd.js} +2 -2
  370. package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-Dg8CYEnT.js → sequenceDiagram-BLEHNHQU-CclOWTTc.js} +2 -2
  371. package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-B82sbLhA.js +1 -0
  372. package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-BvK2l3is.js → stateDiagram-v2-A6IESKWZ-BXfVDwSN.js} +2 -2
  373. package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-D4lKZaeV.js +1 -0
  374. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DbdFh_d6.js +8 -0
  375. package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-CadU4Qq4.js → timeline-definition-JXYKGLGB-D6H6zP5b.js} +2 -2
  376. package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-BYuZwTDZ.js → usecaseDiagram-WPOLBNNX-D2J2bKo_.js} +2 -2
  377. package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-C7zgxe07.js → vennDiagram-Q3Y3IDCW-pdRbIkpB.js} +2 -2
  378. package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-DA4Otf4s.js → wardleyDiagram-IVAIDKWA-Cyd2QPMf.js} +2 -2
  379. package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-Bs5YGwMU.js → xychartDiagram-4URNHDU4-Bd4BkwVM.js} +2 -2
  380. package/node_modules/@weavecode/server/web/dist/icons/apple-touch-icon.png +0 -0
  381. package/node_modules/@weavecode/server/web/dist/icons/icon-192.png +0 -0
  382. package/node_modules/@weavecode/server/web/dist/icons/icon-512.png +0 -0
  383. package/node_modules/@weavecode/server/web/dist/icons/icon-maskable-512.png +0 -0
  384. package/node_modules/@weavecode/server/web/dist/index.html +12 -2
  385. package/node_modules/@weavecode/server/web/dist/manifest.webmanifest +16 -0
  386. package/node_modules/@weavecode/server/web/dist/pet.html +60 -0
  387. package/node_modules/@weavecode/templates/dist/index.d.ts +2 -0
  388. package/node_modules/@weavecode/templates/dist/index.js +1 -1
  389. package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/pet.json +7 -0
  390. package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/spritesheet.png +0 -0
  391. package/node_modules/@weavecode/templates/dist/resources/weave-market/.claude-plugin/marketplace.json +6 -0
  392. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/.claude-plugin/plugin.json +8 -0
  393. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/SKILL.md +121 -0
  394. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/scripts/assemble-pet.mjs +308 -0
  395. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/weave.json +4 -0
  396. package/node_modules/@weavecode/templates/package.json +2 -2
  397. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/README.md +3 -8
  398. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/package.json +1 -1
  399. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.d.ts +4 -2
  400. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.js +10 -1
  401. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.mjs +10 -1
  402. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.js +10 -1
  403. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/README.md +3 -8
  404. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/package.json +1 -1
  405. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.d.ts +4 -2
  406. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.js +10 -1
  407. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.mjs +10 -1
  408. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.js +10 -1
  409. package/package.json +11 -7
  410. package/scripts/preinstall.mjs +70 -0
  411. package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-CbIFQh0R.js +0 -1
  412. package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-qnv6S0sc.js +0 -36
  413. package/node_modules/@weavecode/server/web/dist/assets/channel-BHPeeuzN.js +0 -1
  414. package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D-SgWD8w.js +0 -1
  415. package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-DXXXZ4pW.js +0 -1
  416. package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-CukvPvkM.js +0 -2
  417. package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-D7aJ-akq.js +0 -1
  418. package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-B2ujZh2k.js +0 -62
  419. package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-nHaB6IWf.js +0 -4
  420. package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-xKfjDvgr.js +0 -24
  421. package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-BHT2-5mY.js +0 -24
  422. package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-M6WznOaW.js +0 -41
  423. package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-BzzVN__a.js +0 -1
  424. package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-BkRpWPUl.js +0 -292
  425. package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-Ba8BJcvZ.js +0 -106
  426. package/node_modules/@weavecode/server/web/dist/assets/index-CtifxEiF.css +0 -11
  427. package/node_modules/@weavecode/server/web/dist/assets/index-FwH9INgS.js +0 -1090
  428. package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-HTQ5FUNK.js +0 -2
  429. package/node_modules/@weavecode/server/web/dist/assets/linear-65WmlvQb.js +0 -1
  430. package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-Cpy1nsER.js +0 -1
  431. package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-B1IyNqzr.js +0 -39
  432. package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-oM4XJIwA.js +0 -1
  433. package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-C51zb7Oc.js +0 -1
  434. package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-Ds7QOfXW.js +0 -1
  435. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-ByBF02UJ.js +0 -8
@@ -1 +1 @@
1
- import{existsSync as a,readFileSync as r,rmSync as e}from"node:fs";import{getAuthPath as n,getInitialPasswordPath as s}from"@weavecode/server";import{logger as i}from"@weavecode/core";import{t as c}from"../i18n/index.js";export function localTokenHeader(){try{const t=JSON.parse(r(n(),"utf8"));return typeof t.localToken=="string"&&t.localToken?{"x-weave-local":t.localToken}:{}}catch{return{}}}export function announceInitialPassword(){const t=s();if(!a(t))return;let o;try{o=r(t,"utf8").trim()}catch{return}e(t,{force:!0}),o&&i.info(c("out.dash.initialPassword",{password:o}))}
1
+ import{existsSync as e,readFileSync as o,rmSync as n}from"node:fs";import{getAuthPath as a,getInitialPasswordPath as i}from"@weavecode/server";import{logger as c}from"@weavecode/core";import{t as l}from"../i18n/index.js";export function localTokenHeader(){try{const t=JSON.parse(o(a(),"utf8"));return typeof t.localToken=="string"&&t.localToken?{"x-weave-local":t.localToken}:{}}catch{return{}}}export function announceInitialPassword(){const t=i();if(!e(t))return;let r;try{r=o(t,"utf8").trim()}catch{return}n(t,{force:!0}),r&&c.info(l("out.dash.initialPassword",{password:r}))}
@@ -1,2 +1,2 @@
1
- import{spawn as w}from"node:child_process";import{DEFAULT_PORT as c,DAEMON_HOST as d,isPortFree as h,findFreePort as $,readDaemonState as m,writeDaemonState as y,clearDaemonState as D,resolveDaemonEntry as g,accessUrls as P}from"@weavecode/server";import{logger as n}from"@weavecode/core";import{t as r}from"../i18n/index.js";export async function probeDaemon(t){try{const e=await fetch(`http://${d}:${t}/health`);return e.ok?(await e.json()).service==="weave-daemon":!1}catch{return!1}}export async function waitForDaemon(t,e=1e4){const o=Date.now()+e;for(;!await probeDaemon(t);){if(Date.now()>=o)return!1;await new Promise(a=>setTimeout(a,100))}return!0}async function S(t,e){if(process.platform!=="win32")return!1;const o=i=>/\s/.test(i)?`"${i}"`:i,a=i=>`'${i.replace(/'/g,"''")}'`,s=`$ErrorActionPreference='Stop';$su=[wmiclass]'Win32_ProcessStartup';$psi=$su.CreateInstance();$psi.ShowWindow=0;$proc=[wmiclass]'Win32_Process';$r=$proc.Create(${a([t,...e].map(o).join(" "))},${a(process.cwd())},$psi);if($r.ReturnValue -ne 0){exit 1}`,p=Buffer.from(s,"utf16le").toString("base64");return new Promise(i=>{const u=w("powershell.exe",["-NoProfile","-NonInteractive","-EncodedCommand",p],{windowsHide:!0,stdio:"ignore"});u.on("error",()=>i(!1)),u.on("exit",l=>i(l===0))})}export async function ensureDaemonRunning(){const t=m();if(t&&await probeDaemon(t.port))return{port:t.port,started:!1,ready:!0};if(await probeDaemon(c))return{port:c,started:!1,ready:!0};const e=await h(c)?c:await $(c+1);y({pid:0,port:e,startedAt:new Date().toISOString()});const o=g(),a=o.isTs?["--import","tsx",o.path]:[o.path];await S(process.execPath,a)||w(process.execPath,a,{detached:!0,stdio:"ignore"}).unref();const s=await waitForDaemon(e);return{port:e,started:!0,ready:s}}async function x(){const t=await ensureDaemonRunning();if(!t.started){n.info(r("out.daemon.alreadyRunning",{port:t.port}));return}t.ready?n.success(r("out.daemon.started",{host:d,port:t.port})):n.warn(r("out.daemon.startUnconfirmed",{port:t.port}))}async function f(t){return await(await fetch(`http://${d}:${t}/health`)).json()}async function R(){const t=m(),e=t?.port??c;let o=t?.pid;if(await probeDaemon(e))o=(await f(e)).pid;else if(!t){n.info(r("out.daemon.statusNotRunning"));return}let a;if(o)try{process.kill(o),a=o}catch{}D(),a!==void 0?(await T(a,e),n.success(r("out.daemon.stopped",{pid:a}))):n.warn(r("out.daemon.statusStale",{pid:o??0,port:e}))}async function T(t,e,o=5e3){const a=Date.now()+o;for(;;){let s;try{process.kill(t,0),s=!0}catch{s=!1}if(!s&&!await probeDaemon(e)||Date.now()>=a)return;await new Promise(p=>setTimeout(p,100))}}async function v(){const t=m(),e=t?.port??c;if(await probeDaemon(e)){const o=await f(e);n.info(r("out.daemon.statusRunning",{pid:o.pid,port:o.port,uptime:Math.round(o.uptimeMs/1e3)}));const a=P(e,t?.tlsPort??0);a.length>0&&(n.dim(r("out.daemon.urlsTitle")),n.dim(a.map(s=>` ${s.url}`).join(`
2
- `)))}else t?n.warn(r("out.daemon.statusStale",{pid:t.pid,port:t.port})):n.info(r("out.daemon.statusNotRunning"))}export const daemonCommand={name:"daemon",description:"cmd.daemon.desc",subcommands:[{name:"start",description:"cmd.daemon.start.desc",action:x},{name:"stop",description:"cmd.daemon.stop.desc",action:R},{name:"status",description:"cmd.daemon.status.desc",action:v}]};
1
+ import{spawn as f}from"node:child_process";import{DEFAULT_PORT as c,DAEMON_HOST as u,isPortFree as h,findFreePort as y,readDaemonState as p,writeDaemonState as $,clearDaemonState as g,resolveDaemonEntry as D,accessUrls as P}from"@weavecode/server";import{logger as a}from"@weavecode/core";import{t as r}from"../i18n/index.js";export async function probeDaemon(t){try{const e=await fetch(`http://${u}:${t}/health`);return e.ok?(await e.json()).service==="weave-daemon":!1}catch{return!1}}export async function waitForDaemon(t,e=1e4){const o=Date.now()+e;for(;!await probeDaemon(t);){if(Date.now()>=o)return!1;await new Promise(n=>setTimeout(n,100))}return!0}async function x(t,e){if(process.platform!=="win32")return!1;const o=i=>/\s/.test(i)?`"${i}"`:i,n=i=>`'${i.replace(/'/g,"''")}'`,s=`$ErrorActionPreference='Stop';$su=[wmiclass]'Win32_ProcessStartup';$psi=$su.CreateInstance();$psi.ShowWindow=0;$proc=[wmiclass]'Win32_Process';$r=$proc.Create(${n([t,...e].map(o).join(" "))},${n(process.cwd())},$psi);if($r.ReturnValue -ne 0){exit 1}`,d=Buffer.from(s,"utf16le").toString("base64");return new Promise(i=>{const m=f("powershell.exe",["-NoProfile","-NonInteractive","-EncodedCommand",d],{windowsHide:!0,stdio:"ignore"});m.on("error",()=>i(!1)),m.on("exit",w=>i(w===0))})}export async function ensureDaemonRunning(){const t=p();if(t&&await probeDaemon(t.port))return{port:t.port,started:!1,ready:!0};if(await probeDaemon(c))return{port:c,started:!1,ready:!0};const e=await h(c)?c:await y(c+1);$({pid:0,port:e,startedAt:new Date().toISOString()});const o=D(),n=o.isTs?["--import","tsx",o.path]:[o.path];await x(process.execPath,n)||f(process.execPath,n,{detached:!0,stdio:"ignore"}).unref();const s=await waitForDaemon(e);return{port:e,started:!0,ready:s}}async function S(){const t=await ensureDaemonRunning();if(!t.started){a.info(r("out.daemon.alreadyRunning",{port:t.port}));return}t.ready?a.success(r("out.daemon.started",{host:u,port:t.port})):a.warn(r("out.daemon.startUnconfirmed",{port:t.port}))}async function l(t){return await(await fetch(`http://${u}:${t}/health`)).json()}async function A(){const t=p(),e=t?.port??c;let o=t?.pid;if(await probeDaemon(e))o=(await l(e)).pid;else if(!t){a.info(r("out.daemon.statusNotRunning"));return}let n;if(o)try{process.kill(o),n=o}catch{}g(),n!==void 0?(await R(n,e),a.success(r("out.daemon.stopped",{pid:n}))):a.warn(r("out.daemon.statusStale",{pid:o??0,port:e}))}async function R(t,e,o=5e3){const n=Date.now()+o;for(;;){let s;try{process.kill(t,0),s=!0}catch{s=!1}if(!s&&!await probeDaemon(e)||Date.now()>=n)return;await new Promise(d=>setTimeout(d,100))}}async function T(){const t=p(),e=t?.port??c;if(await probeDaemon(e)){const o=await l(e);a.info(r("out.daemon.statusRunning",{pid:o.pid,port:o.port,uptime:Math.round(o.uptimeMs/1e3)}));const n=P(e,t?.tlsPort??0);n.length>0&&(a.dim(r("out.daemon.urlsTitle")),a.dim(n.map(s=>` ${s.url}`).join(`
2
+ `)))}else t?a.warn(r("out.daemon.statusStale",{pid:t.pid,port:t.port})):a.info(r("out.daemon.statusNotRunning"))}export const daemonCommand={name:"daemon",description:"cmd.daemon.desc",subcommands:[{name:"start",description:"cmd.daemon.start.desc",action:S},{name:"stop",description:"cmd.daemon.stop.desc",action:A},{name:"status",description:"cmd.daemon.status.desc",action:T}]};
@@ -1,2 +1,2 @@
1
- import{spawn as p}from"node:child_process";import{accessUrls as m,DAEMON_HOST as d,readDaemonState as u,resolveStaticDir as c}from"@weavecode/server";import{logger as o}from"@weavecode/core";import{t}from"../i18n/index.js";import{ensureDaemonRunning as l}from"./daemon.js";import{announceInitialPassword as f}from"./daemon-auth.js";export function openBrowser(n){const[s,a]=process.platform==="win32"?["cmd",["/c","start","",n]]:process.platform==="darwin"?["open",[n]]:["xdg-open",[n]],r=p(s,a,{detached:!0,stdio:"ignore"});r.on("error",()=>{o.dim(t("out.dash.browserFailed"))}),r.unref()}export function dashboardUrl(n){return`http://${d}:${n}/`}async function h(n){const s=!!n.flags.noOpen,a=await l();a.started?a.ready?(o.success(t("out.daemon.started",{host:d,port:a.port})),o.dim(t("out.dash.stopHint"))):o.warn(t("out.daemon.startUnconfirmed",{port:a.port})):o.info(t("out.daemon.alreadyRunning",{port:a.port})),c()||(o.warn(t("out.dash.noBundle")),o.dim(t("out.dash.buildHint")));const r=dashboardUrl(a.port);o.info(t("out.dash.url",{url:r}));const e=m(a.port,u()?.tlsPort??0);if(e.length>0&&(o.dim(t("out.daemon.urlsTitle")),o.dim(e.map(i=>` ${i.url}`).join(`
2
- `))),f(),s){o.dim(t("out.dash.noOpen"));return}openBrowser(r)}export const dashboardCommand={name:"dashboard",aliases:["dash"],description:"cmd.dashboard.desc",options:[{name:"no-open",description:"flag.dashboard.noOpen",type:"boolean",default:!1}],action:h};
1
+ import{spawn as p}from"node:child_process";import{accessUrls as m,DAEMON_HOST as d,readDaemonState as c,resolveStaticDir as l}from"@weavecode/server";import{logger as o}from"@weavecode/core";import{t as n}from"../i18n/index.js";import{ensureDaemonRunning as u}from"./daemon.js";import{announceInitialPassword as f}from"./daemon-auth.js";export function openBrowser(r){const[e,t]=process.platform==="win32"?["cmd",["/c","start","",r]]:process.platform==="darwin"?["open",[r]]:["xdg-open",[r]],a=p(e,t,{detached:!0,stdio:"ignore"});a.on("error",()=>{o.dim(n("out.dash.browserFailed"))}),a.unref()}export function dashboardUrl(r){return`http://${d}:${r}/`}async function h(r){const e=!!r.flags.noOpen,t=await u();t.started?t.ready?(o.success(n("out.daemon.started",{host:d,port:t.port})),o.dim(n("out.dash.stopHint"))):o.warn(n("out.daemon.startUnconfirmed",{port:t.port})):o.info(n("out.daemon.alreadyRunning",{port:t.port})),l()||(o.warn(n("out.dash.noBundle")),o.dim(n("out.dash.buildHint")));const a=dashboardUrl(t.port);o.info(n("out.dash.url",{url:a}));const s=m(t.port,c()?.tlsPort??0);if(s.length>0&&(o.dim(n("out.daemon.urlsTitle")),o.dim(s.map(i=>` ${i.url}`).join(`
2
+ `))),f(),e){o.dim(n("out.dash.noOpen"));return}openBrowser(a)}export const dashboardCommand={name:"dashboard",aliases:["dash"],description:"cmd.dashboard.desc",options:[{name:"no-open",description:"flag.dashboard.noOpen",type:"boolean",default:!1}],action:h};
@@ -1 +1 @@
1
- import{existsSync as m,readFileSync as k}from"node:fs";import u from"node:path";import{DAEMON_HOST as w,DEFAULT_PORT as S,getDbPath as x,ensureDataLayout as y,openDatabase as N,ProjectRepository as b,readDaemonState as T}from"@weavecode/server";import{formatTable as f,logger as r}from"@weavecode/core";import{checkHarness as P}from"../init/harness-checks.js";import{probeDaemon as E}from"./daemon.js";import{localTokenHeader as C}from"./daemon-auth.js";import{t as o}from"../i18n/index.js";const q={"no-mechanism":"out.doctor.reason.noMechanism","no-credentials":"out.doctor.reason.noCredentials","auth-token-required":"out.doctor.reason.authTokenRequired","no-peer-name":"out.doctor.reason.noPeerName","no-backend":"out.doctor.reason.noBackend","no-pane-env":"out.doctor.reason.noPaneEnv","pane-env-conflict":"out.doctor.reason.paneEnvConflict"},D={"no-hook-script":"out.doctor.hint.noHookScript","hook-script-not-weave":"out.doctor.hint.hookScriptNotWeave","hook-script-stale":"out.doctor.hint.hookScriptStale","no-events":"out.doctor.hint.noEvents","no-inbox-credentials":"out.doctor.hint.noInboxCredentials","inbox-token-required":"out.doctor.hint.inboxTokenRequired","no-peer-name":"out.doctor.hint.noPeerName","terminal-no-backend":"out.doctor.hint.terminalNoBackend","terminal-no-pane-env":"out.doctor.hint.terminalNoPaneEnv","terminal-pane-env-conflict":"out.doctor.hint.terminalPaneEnvConflict","not-running":"out.doctor.hint.notRunning",queued:"out.doctor.hint.queued",stalled:"out.doctor.hint.stalled"};function p(n,e){if(!e)return"";const i=n[e];return i?o(i):e}function j(n){if(!n||!n.present)return o("out.doctor.diagScriptNone");const e=n.source==="user"?o("out.doctor.diagSourceUser"):n.source==="project"?o("out.doctor.diagSourceProject"):o("out.doctor.diagSourceNone");if(!n.weaveOwned)return o("out.doctor.diagScriptNotOwned",{source:e});const i=o("out.doctor.diagYes");return o("out.doctor.diagScriptValue",{harness:n.harness,source:e,version:n.generatedVersion??o("out.doctor.diagMissing"),inbox:n.reportsInbox?i:o("out.doctor.diagNo"),pane:n.reportsPaneEnv?i:o("out.doctor.diagNo")})}function l(n){const e=p(q,n.reason);return n.status==="ready"?o("out.doctor.diagReady"):n.status==="unknown"?o("out.doctor.diagUnknown",{reason:e}):o("out.doctor.diagUnavailable",{reason:e})}async function H(n,e){let i;try{const t=await fetch(`http://${w}:${n}/messaging/diagnostics?project=${e}`,{headers:C()});if(!t.ok)throw new Error(`HTTP ${t.status}`);try{i=await t.json()}catch{throw new Error(`HTTP ${t.status}`)}}catch(t){r.warn(o("out.doctor.diagFailed",{error:t instanceof Error?t.message:String(t)}));return}const{daemon:d}=i,s=i.projects.find(t=>t.id===e)?.captures[0]??null;if(console.log(),r.info(o("out.doctor.diagHeader",{id:e})),console.log(f([[o("out.doctor.diagDaemon"),o("out.doctor.diagDaemonValue",{version:d.version,platform:d.platform,preset:d.terminalPreset,channel:o(d.terminalTextChannel?"out.doctor.diagChannelOn":"out.doctor.diagChannelOff")})],[o("out.doctor.diagScript"),j(s)]])),i.sessions.length===0){r.dim(o("out.doctor.diagNoSessions"));return}const a=t=>t===null?o("out.doctor.diagUnknownAlive"):o(t?"out.doctor.diagYes":"out.doctor.diagNo");for(const t of i.sessions)console.log(),console.log(" "+o("out.doctor.diagSession",{id:t.sessionId.slice(0,8),title:t.title??o("out.doctor.diagUntitled"),alive:a(t.alive),events:t.eventCount,last:t.lastEventType??o("out.doctor.diagMissing")})),console.log(" "+o("out.doctor.diagChannels",{inbox:l(t.channels.inbox),queue:l(t.channels.queue),relay:l(t.channels.relay),terminal:l(t.channels.terminal)})),console.log(" "+o("out.doctor.diagQueue",{pending:t.queue.pending,stalled:o(t.queue.stalled?"out.doctor.diagYes":"out.doctor.diagNo")})),t.hints.length>0&&r.dim(" "+o("out.doctor.diagHints",{hints:t.hints.map(c=>p(D,c)).join("\uFF1B")}))}const v=n=>{const e=u.resolve(n);return process.platform==="win32"?e.toLowerCase():e};function O(n){if(!m(x()))return null;const e=N();try{const i=new b(e),d=v(n),s=[...i.list(),...i.listArchived()].find(a=>v(a.path)===d);return s?{id:s.id,source:s.source,archived:s.archivedAt!==null,token:s.token}:null}finally{e.close()}}function R(n){const e=u.join(n,".weave","token");return m(e)?k(e,"utf-8").trim():null}export const doctorCommand={name:"doctor",description:"cmd.doctor.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(n){y();const e=u.resolve(String(n.flags.dir??process.cwd())),i=m(u.join(e,".weave","config.yaml")),d=T()?.port??S,s=await E(d),a=O(e),t=R(e);let c;t===null?c=o("out.doctor.tokenMissing"):a?t===a.token?c=o("out.doctor.tokenOk"):c=o("out.doctor.tokenStale"):c=o("out.doctor.tokenUnregistered"),r.info(o("out.doctor.header")),console.log(f([[o("out.doctor.dir"),e],[o("out.doctor.initialized"),i?o("out.doctor.yes"):o("out.doctor.no")],[o("out.doctor.daemon"),s?o("out.doctor.daemonRunning",{port:d}):o("out.doctor.daemonStopped")],[o("out.doctor.registered"),a?o(a.archived?"out.doctor.registeredArchived":"out.doctor.registeredYes",{id:a.id,source:a.source}):o("out.doctor.registeredNo")],[o("out.doctor.token"),c]])),console.log();const g=await P(e);if(g.length>0){r.warn(o("out.status.issuesFound",{count:g.length}));for(const h of g)r.warn(o("out.status.issue",{message:h.message})),r.dim(o("out.status.fix",{fix:h.fix}));console.log()}if(s&&a&&!a.archived&&await H(d,a.id),!a){r.warn(o("out.doctor.warnNotRegistered")),r.dim(o("out.doctor.fixInit")),i||r.dim(o("out.doctor.fixScan",{dir:e}));return}if(a.archived){r.warn(o("out.doctor.warnArchived"));return}if(t===null){r.warn(o("out.doctor.warnTokenMissing")),r.dim(o("out.doctor.fixInit"));return}if(t!==a.token){r.warn(o("out.doctor.warnTokenStale")),r.dim(o("out.doctor.fixInit"));return}r.success(o("out.doctor.ok")),s||r.dim(o("out.doctor.fixDaemon"))}};
1
+ import{existsSync as m,readFileSync as w}from"node:fs";import l from"node:path";import{DAEMON_HOST as S,DEFAULT_PORT as x,getDbPath as y,ensureDataLayout as T,openDatabase as N,ProjectRepository as b,readDaemonState as P}from"@weavecode/server";import{formatTable as p,logger as r}from"@weavecode/core";import{checkHarness as E}from"../init/harness-checks.js";import{probeDaemon as D}from"./daemon.js";import{localTokenHeader as C}from"./daemon-auth.js";import{t as o}from"../i18n/index.js";const q={"no-mechanism":"out.doctor.reason.noMechanism","no-credentials":"out.doctor.reason.noCredentials","auth-token-required":"out.doctor.reason.authTokenRequired","no-peer-name":"out.doctor.reason.noPeerName","no-backend":"out.doctor.reason.noBackend","no-pane-env":"out.doctor.reason.noPaneEnv","pane-env-conflict":"out.doctor.reason.paneEnvConflict"},R={"no-hook-script":"out.doctor.hint.noHookScript","hook-script-not-weave":"out.doctor.hint.hookScriptNotWeave","hook-script-stale":"out.doctor.hint.hookScriptStale","no-events":"out.doctor.hint.noEvents","no-inbox-credentials":"out.doctor.hint.noInboxCredentials","inbox-token-required":"out.doctor.hint.inboxTokenRequired","no-peer-name":"out.doctor.hint.noPeerName","terminal-no-backend":"out.doctor.hint.terminalNoBackend","terminal-no-pane-env":"out.doctor.hint.terminalNoPaneEnv","terminal-pane-env-conflict":"out.doctor.hint.terminalPaneEnvConflict","not-running":"out.doctor.hint.notRunning",queued:"out.doctor.hint.queued",stalled:"out.doctor.hint.stalled"};function k(n,e){if(!e)return"";const i=n[e];return i?o(i):e}function H(n){if(!n||!n.present)return o("out.doctor.diagScriptNone");const e=n.source==="user"?o("out.doctor.diagSourceUser"):n.source==="project"?o("out.doctor.diagSourceProject"):o("out.doctor.diagSourceNone");if(!n.weaveOwned)return o("out.doctor.diagScriptNotOwned",{source:e});const i=o("out.doctor.diagYes");return o("out.doctor.diagScriptValue",{harness:n.harness,source:e,version:n.generatedVersion??o("out.doctor.diagMissing"),inbox:n.reportsInbox?i:o("out.doctor.diagNo"),pane:n.reportsPaneEnv?i:o("out.doctor.diagNo")})}function g(n){const e=k(q,n.reason);return n.status==="ready"?o("out.doctor.diagReady"):n.status==="unknown"?o("out.doctor.diagUnknown",{reason:e}):o("out.doctor.diagUnavailable",{reason:e})}async function O(n,e){let i;try{const t=await fetch(`http://${S}:${n}/messaging/diagnostics?project=${e}`,{headers:C()});if(!t.ok)throw new Error(`HTTP ${t.status}`);try{i=await t.json()}catch{throw new Error(`HTTP ${t.status}`)}}catch(t){r.warn(o("out.doctor.diagFailed",{error:t instanceof Error?t.message:String(t)}));return}const{daemon:a}=i,s=i.projects.find(t=>t.id===e)?.captures[0]??null;if(console.log(),r.info(o("out.doctor.diagHeader",{id:e})),console.log(p([[o("out.doctor.diagDaemon"),o("out.doctor.diagDaemonValue",{version:a.version,platform:a.platform,preset:a.terminalPreset,channel:o(a.terminalTextChannel?"out.doctor.diagChannelOn":"out.doctor.diagChannelOff")})],[o("out.doctor.diagScript"),H(s)]])),i.sessions.length===0){r.dim(o("out.doctor.diagNoSessions"));return}const d=t=>t===null?o("out.doctor.diagUnknownAlive"):o(t?"out.doctor.diagYes":"out.doctor.diagNo");for(const t of i.sessions)console.log(),console.log(" "+o("out.doctor.diagSession",{id:t.sessionId.slice(0,8),title:t.title??o("out.doctor.diagUntitled"),alive:d(t.alive),events:t.eventCount,last:t.lastEventType??o("out.doctor.diagMissing")})),console.log(" "+o("out.doctor.diagChannels",{inbox:g(t.channels.inbox),queue:g(t.channels.queue),relay:g(t.channels.relay),terminal:g(t.channels.terminal)})),console.log(" "+o("out.doctor.diagQueue",{pending:t.queue.pending,stalled:o(t.queue.stalled?"out.doctor.diagYes":"out.doctor.diagNo")})),t.hints.length>0&&r.dim(" "+o("out.doctor.diagHints",{hints:t.hints.map(c=>k(R,c)).join("\uFF1B")}))}const v=n=>{const e=l.resolve(n);return process.platform==="win32"?e.toLowerCase():e};function j(n){if(!m(y()))return null;const e=N();try{const i=new b(e),a=v(n),s=[...i.list(),...i.listArchived()].find(d=>v(d.path)===a);return s?{id:s.id,source:s.source,archived:s.archivedAt!==null,token:s.token}:null}finally{e.close()}}function A(n){const e=l.join(n,".weave","token");return m(e)?w(e,"utf-8").trim():null}export const doctorCommand={name:"doctor",description:"cmd.doctor.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(n){T();const e=l.resolve(String(n.flags.dir??process.cwd())),i=m(l.join(e,".weave","config.yaml")),s=P()?.port??x,d=await D(s),t=j(e),c=A(e);let u;c===null?u=o("out.doctor.tokenMissing"):t?c===t.token?u=o("out.doctor.tokenOk"):u=o("out.doctor.tokenStale"):u=o("out.doctor.tokenUnregistered"),r.info(o("out.doctor.header")),console.log(p([[o("out.doctor.dir"),e],[o("out.doctor.initialized"),i?o("out.doctor.yes"):o("out.doctor.no")],[o("out.doctor.daemon"),d?o("out.doctor.daemonRunning",{port:s}):o("out.doctor.daemonStopped")],[o("out.doctor.registered"),t?o(t.archived?"out.doctor.registeredArchived":"out.doctor.registeredYes",{id:t.id,source:t.source}):o("out.doctor.registeredNo")],[o("out.doctor.token"),u]])),console.log();const f=await E(e);if(f.length>0){r.warn(o("out.status.issuesFound",{count:f.length}));for(const h of f)r.warn(o("out.status.issue",{message:h.message})),r.dim(o("out.status.fix",{fix:h.fix}));console.log()}if(d&&t&&!t.archived&&await O(s,t.id),!t){r.warn(o("out.doctor.warnNotRegistered")),r.dim(o("out.doctor.fixInit")),i||r.dim(o("out.doctor.fixScan",{dir:e}));return}if(t.archived){r.warn(o("out.doctor.warnArchived"));return}if(c===null){r.warn(o("out.doctor.warnTokenMissing")),r.dim(o("out.doctor.fixInit"));return}if(c!==t.token){r.warn(o("out.doctor.warnTokenStale")),r.dim(o("out.doctor.fixInit"));return}r.success(o("out.doctor.ok")),d||r.dim(o("out.doctor.fixDaemon"))}};
@@ -1 +1 @@
1
- import{PresetSchema as p,HARNESS_KEYS as m,logger as n,formatTable as g,resolveComponents as f}from"@weavecode/core";import{executeInit as u}from"../init/executor.js";import{registerProject as h,WEAVE_VERSION as S}from"@weavecode/server";import{t as e}from"../i18n/index.js";const d=["preToolUse","postToolUse","userPromptSubmit","sessionStart","stop","stopFailure","subagentStop","subagentStart","notification","postToolUseFailure","permissionRequest","permissionDenied","preCompact","sessionEnd","preModelSwitch"];function b(s){const r=s.trim();if(!r)return{};const c=Object.fromEntries(d.map(i=>[i,!1]));if(r==="none")return c;const a=new Set(r.split(",").map(i=>i.trim()).filter(Boolean)),o=[...a].filter(i=>!d.includes(i));return o.length>0&&n.warn(e("init.hooksUnknownKeys",{keys:o.join(", ")})),Object.fromEntries(d.map(i=>[i,a.has(i)]))}export function parseHarnessFlag(s){const r=s.trim();if(!r)return;const c=r.split(",").map(i=>i.trim().toLowerCase()).filter(Boolean),a=[...new Set(c.filter(i=>m.includes(i)))],o=c.filter(i=>!m.includes(i));return o.length>0&&n.warn(e("init.harnessUnknownKeys",{keys:o.join(", ")})),a.length>0?a:["claude"]}export const initCommand={name:"init",description:"cmd.init.desc",options:[{name:"preset",short:"p",description:"flag.init.preset",type:"string",default:"default",choices:["minimal","default","full"]},{name:"force",short:"f",description:"flag.init.force",type:"boolean",default:!1},{name:"no-interactive",description:"flag.init.noInteractive",type:"boolean",default:!1},{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()},{name:"hooks",description:"flag.init.hooks",type:"string",default:""},{name:"harness",description:"flag.init.harness",type:"string",default:""}],async action(s){const r=p.parse(s.flags.preset??"default"),c=!!s.flags.force,a=s.flags.noInteractive!==!0&&s.flags.interactive!==!1,o=String(s.flags.dir??process.cwd());n.info(e("init.banner",{version:S})),n.dim(e("init.presetTarget",{preset:r,target:o}));const i=f(r);let t;try{t=await u({targetDir:o,force:c,interactive:a,preset:r,harnesses:parseHarnessFlag(String(s.flags.harness??"")),components:i,hooks:b(String(s.flags.hooks??"")),skills:{},commands:{},agents:{},mcp:{}})}catch(l){n.error(e("init.failed",{error:l instanceof Error?l.message:String(l)})),process.exit(1)}if(t.success){h(o,"init"),n.success(e("init.complete"));const l=[[e("init.table.directories"),String(t.created.directories.length)],[e("init.table.filesCreated"),String(t.created.files.length)],[e("init.table.filesMerged"),String(t.merged.length)],[e("init.table.weaveUpdated"),String(t.updated.length)],[e("init.table.skills"),String(t.summary.skillsCount)],[e("init.table.commands"),String(t.summary.commandsCount)],[e("init.table.agents"),String(t.summary.agentsCount)]];console.log(g(l)),console.log(),t.merged.length>0&&n.dim(e("init.merged",{count:t.merged.length})),t.updated.length>0&&n.dim(e("init.refreshed",{count:t.updated.length})),t.removed.length>0&&n.dim(e("init.removed",{count:t.removed.length})),t.skipped.length>0&&n.dim(e("init.skipped",{count:t.skipped.length}))}else{n.error(e("init.completedWithErrors"));for(const l of t.errors)n.error(e("init.errorLine",{error:l}))}}};
1
+ import{PresetSchema as f,HARNESS_KEYS as m,logger as i,formatTable as p,resolveComponents as g}from"@weavecode/core";import{executeInit as u}from"../init/executor.js";import{registerProject as h,WEAVE_VERSION as S}from"@weavecode/server";import{t as e}from"../i18n/index.js";const d=["preToolUse","postToolUse","userPromptSubmit","sessionStart","stop","stopFailure","subagentStop","subagentStart","notification","postToolUseFailure","permissionRequest","permissionDenied","preCompact","sessionEnd","preModelSwitch"];function k(r){const s=r.trim();if(!s)return{};const c=Object.fromEntries(d.map(n=>[n,!1]));if(s==="none")return c;const a=new Set(s.split(",").map(n=>n.trim()).filter(Boolean)),o=[...a].filter(n=>!d.includes(n));return o.length>0&&i.warn(e("init.hooksUnknownKeys",{keys:o.join(", ")})),Object.fromEntries(d.map(n=>[n,a.has(n)]))}export function parseHarnessFlag(r){const s=r.trim();if(!s)return;const c=s.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean),a=[...new Set(c.filter(n=>m.includes(n)))],o=c.filter(n=>!m.includes(n));return o.length>0&&i.warn(e("init.harnessUnknownKeys",{keys:o.join(", ")})),a.length>0?a:["claude"]}export const initCommand={name:"init",description:"cmd.init.desc",options:[{name:"preset",short:"p",description:"flag.init.preset",type:"string",default:"default",choices:["minimal","default","full"]},{name:"force",short:"f",description:"flag.init.force",type:"boolean",default:!1},{name:"no-interactive",description:"flag.init.noInteractive",type:"boolean",default:!1},{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()},{name:"hooks",description:"flag.init.hooks",type:"string",default:""},{name:"harness",description:"flag.init.harness",type:"string",default:""}],async action(r){const s=f.parse(r.flags.preset??"default"),c=!!r.flags.force,a=r.flags.noInteractive!==!0&&r.flags.interactive!==!1,o=String(r.flags.dir??process.cwd());i.info(e("init.banner",{version:S})),i.dim(e("init.presetTarget",{preset:s,target:o}));const n=g(s);let t;try{t=await u({targetDir:o,force:c,interactive:a,preset:s,harnesses:parseHarnessFlag(String(r.flags.harness??"")),components:n,hooks:k(String(r.flags.hooks??"")),skills:{},commands:{},agents:{},mcp:{}})}catch(l){i.error(e("init.failed",{error:l instanceof Error?l.message:String(l)})),process.exit(1)}if(t.success){h(o,"init"),i.success(e("init.complete"));const l=[[e("init.table.directories"),String(t.created.directories.length)],[e("init.table.filesCreated"),String(t.created.files.length)],[e("init.table.filesMerged"),String(t.merged.length)],[e("init.table.weaveUpdated"),String(t.updated.length)],[e("init.table.skills"),String(t.summary.skillsCount)],[e("init.table.commands"),String(t.summary.commandsCount)],[e("init.table.agents"),String(t.summary.agentsCount)]];console.log(p(l)),console.log(),t.merged.length>0&&i.dim(e("init.merged",{count:t.merged.length})),t.updated.length>0&&i.dim(e("init.refreshed",{count:t.updated.length})),t.removed.length>0&&i.dim(e("init.removed",{count:t.removed.length})),t.skipped.length>0&&i.dim(e("init.skipped",{count:t.skipped.length}))}else{i.error(e("init.completedWithErrors"));for(const l of t.errors)i.error(e("init.errorLine",{error:l}))}}};
@@ -1,2 +1,2 @@
1
- import{DAEMON_HOST as h}from"@weavecode/server";import{logger as a}from"@weavecode/core";import{createRuntimeRegistry as y}from"@weavecode/harness";import{ensureDaemonRunning as u}from"./daemon.js";import{t as i}from"../i18n/index.js";async function g(s,o,e){const t=await fetch(`http://${h}:${s}${o}`,e),n=await t.json().catch(()=>({}));if(!t.ok)throw new Error(String(n.error??`HTTP ${t.status}`));return n}export function resolveSessionRef(s,o){const e=o.toLowerCase(),t=s.filter(c=>c.sessionId.toLowerCase()===e);if(t.length===1)return{row:t[0]};const n=s.filter(c=>c.sessionId.toLowerCase().startsWith(e));if(n.length===1)return{row:n[0]};const r=s.filter(c=>c.title!=null&&c.title.toLowerCase().includes(e));if(r.length===1)return{row:r[0]};const d=n.length>0?n:r;return d.length>1?{error:"ambiguous",rows:d}:{error:"not-found"}}export function currentSessionId(s,o){for(const e of o){if(!e)continue;const t=s[e];if(typeof t=="string"&&t!=="")return t}return null}export function pickReplyTarget(s,o){for(let e=s.length-1;e>=0;e--){const t=s[e];if(t.toSessionId===o&&t.fromSessionId!=null)return t.fromSessionId}return null}function I(s){const o=s[0].map((e,t)=>Math.max(...s.map(n=>n[t].length)));return s.map(e=>e.map((t,n)=>t.padEnd(o[n])).join(" ").trimEnd()).join(`
2
- `)}const l=s=>s.slice(0,8);function f(s,o){return g(s,"/sessions").then(({sessions:e})=>{const t=resolveSessionRef(e,o);if("row"in t)return t.row;throw t.error==="ambiguous"?new Error(i("out.msg.ambiguous",{ref:o,candidates:t.rows.map(n=>`${l(n.sessionId)}${n.title?` (${n.title})`:""}`).join(", ")})):new Error(i("out.msg.notFound",{ref:o}))})}function p(){const s=y().byCapability("messaging").flatMap(o=>o.messaging?.sessionEnv?[o.messaging.sessionEnv]:[]);return currentSessionId(process.env,s)}async function w(s,o,e,t,n){const r=await f(s,o),d=await g(s,`/sessions/${encodeURIComponent(r.sessionId)}/messages`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:e,mode:t,fromKind:"cli",fromSessionId:n})});a.success(i("out.msg.sendOk",{target:r.title??l(r.sessionId),id:d.messageId,status:d.status}))}async function S(s,o){const{sessions:e}=await g(s,"/sessions");if(!o){const{capabilities:r}=await g(s,"/messaging/capabilities"),d=new Set(r.filter(m=>m.discovery).map(m=>m.harness)),c=e.map(m=>[l(m.sessionId),m.title??"",m.harness??"-",m.turnOpen===void 0?"-":m.turnOpen?i("out.msg.busy"):i("out.msg.idle"),m.harness!=null&&d.has(m.harness)?"\u2713":"\u2014"]);if(c.length===0){a.info(i("out.msg.noSessions"));return}a.info(i("out.msg.sessionHeader",{n:c.length})),console.log(I([[i("out.msg.col.session"),i("out.msg.col.title"),i("out.msg.col.harness"),i("out.msg.col.state"),i("out.msg.col.msg")],...c]));return}const t=await f(s,o),{messages:n}=await g(s,`/sessions/${encodeURIComponent(t.sessionId)}/messages`);a.info(i("out.msg.threadHeader",{session:t.title??t.sessionId,n:n.length}));for(const r of n){const d=r.fromSessionId===t.sessionId?"\u25B6":"\u25C0",c=r.fromKind==="dashboard"?"dashboard":r.fromKind==="cli"?"cli":r.fromSessionId??"?";console.log(`${r.createdAt.slice(11,19)} ${d} ${c} [${r.status}] ${r.text.slice(0,80)}`)}}async function C(s,o,e){const t=await f(s,o),n=p(),r=await g(s,`/sessions/${encodeURIComponent(t.sessionId)}/watch`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({watcherSessionId:n,notify:e??null})});a.success(i("out.msg.watchOk",{target:t.title??l(t.sessionId),id:r.watchId,via:n??i("out.msg.watchViaDashboard")}))}async function x(s,o){const e=p();if(!e){a.warn(i("out.msg.replyNoSession")),process.exitCode=1;return}const{messages:t}=await g(s,`/sessions/${encodeURIComponent(e)}/messages`),n=pickReplyTarget(t,e);if(!n){a.warn(i("out.msg.replyNothing")),process.exitCode=1;return}await w(s,n,o,"inject",e)}export const msgCommand={name:"msg",description:"cmd.msg.desc",subcommands:[{name:"ls",description:"cmd.msg.ls.desc",async action(s){const o=await u();try{await S(o.port,s.positional[0])}catch(e){a.warn(i("out.msg.failed",{error:e instanceof Error?e.message:String(e)})),process.exitCode=1}}},{name:"send",description:"cmd.msg.send.desc",options:[{name:"mode",short:"m",description:"flag.msg.mode",type:"string",choices:["auto","inject","headless"],default:"inject"}],async action(s){const o=s.positional[0],e=s.positional.slice(1).join(" ");if(!o||!e){a.warn(i("out.msg.sendUsage")),process.exitCode=1;return}const t=await u();try{await w(t.port,o,e,String(s.flags.mode??"inject"),p())}catch(n){a.warn(i("out.msg.sendFail",{error:n instanceof Error?n.message:String(n)})),process.exitCode=1}}},{name:"watch",description:"cmd.msg.watch.desc",options:[{name:"notify",description:"flag.msg.notify",type:"string"}],async action(s){const o=s.positional[0];if(!o){a.warn(i("out.msg.watchUsage")),process.exitCode=1;return}const e=await u();try{await C(e.port,o,s.flags.notify==null?void 0:String(s.flags.notify))}catch(t){a.warn(i("out.msg.watchFail",{error:t instanceof Error?t.message:String(t)})),process.exitCode=1}}},{name:"reply",description:"cmd.msg.reply.desc",async action(s){const o=s.positional.join(" ");if(!o){a.warn(i("out.msg.replyUsage")),process.exitCode=1;return}const e=await u();try{await x(e.port,o)}catch(t){a.warn(i("out.msg.sendFail",{error:t instanceof Error?t.message:String(t)})),process.exitCode=1}}}]};
1
+ import{DAEMON_HOST as h}from"@weavecode/server";import{logger as a}from"@weavecode/core";import{createRuntimeRegistry as y}from"@weavecode/harness";import{ensureDaemonRunning as d}from"./daemon.js";import{t as i}from"../i18n/index.js";async function u(s,o,e){const t=await fetch(`http://${h}:${s}${o}`,e),n=await t.json().catch(()=>({}));if(!t.ok)throw new Error(String(n.error??`HTTP ${t.status}`));return n}export function resolveSessionRef(s,o){const e=o.toLowerCase(),t=s.filter(c=>c.sessionId.toLowerCase()===e);if(t.length===1)return{row:t[0]};const n=s.filter(c=>c.sessionId.toLowerCase().startsWith(e));if(n.length===1)return{row:n[0]};const r=s.filter(c=>c.title!=null&&c.title.toLowerCase().includes(e));if(r.length===1)return{row:r[0]};const g=n.length>0?n:r;return g.length>1?{error:"ambiguous",rows:g}:{error:"not-found"}}export function currentSessionId(s,o){for(const e of o){if(!e)continue;const t=s[e];if(typeof t=="string"&&t!=="")return t}return null}export function pickReplyTarget(s,o){for(let e=s.length-1;e>=0;e--){const t=s[e];if(t.toSessionId===o&&t.fromSessionId!=null)return t.fromSessionId}return null}function I(s){const o=s[0].map((e,t)=>Math.max(...s.map(n=>n[t].length)));return s.map(e=>e.map((t,n)=>t.padEnd(o[n])).join(" ").trimEnd()).join(`
2
+ `)}const l=s=>s.slice(0,8);function f(s,o){return u(s,"/sessions").then(({sessions:e})=>{const t=resolveSessionRef(e,o);if("row"in t)return t.row;throw t.error==="ambiguous"?new Error(i("out.msg.ambiguous",{ref:o,candidates:t.rows.map(n=>`${l(n.sessionId)}${n.title?` (${n.title})`:""}`).join(", ")})):new Error(i("out.msg.notFound",{ref:o}))})}function p(){const s=y().byCapability("messaging").flatMap(o=>o.messaging?.sessionEnv?[o.messaging.sessionEnv]:[]);return currentSessionId(process.env,s)}async function w(s,o,e,t,n){const r=await f(s,o),g=await u(s,`/sessions/${encodeURIComponent(r.sessionId)}/messages`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:e,mode:t,fromKind:"cli",fromSessionId:n})});a.success(i("out.msg.sendOk",{target:r.title??l(r.sessionId),id:g.messageId,status:g.status}))}async function S(s,o){const{sessions:e}=await u(s,"/sessions");if(!o){const{capabilities:r}=await u(s,"/messaging/capabilities"),g=new Set(r.filter(m=>m.discovery).map(m=>m.harness)),c=e.map(m=>[l(m.sessionId),m.title??"",m.harness??"-",m.turnOpen===void 0?"-":m.turnOpen?i("out.msg.busy"):i("out.msg.idle"),m.harness!=null&&g.has(m.harness)?"\u2713":"\u2014"]);if(c.length===0){a.info(i("out.msg.noSessions"));return}a.info(i("out.msg.sessionHeader",{n:c.length})),console.log(I([[i("out.msg.col.session"),i("out.msg.col.title"),i("out.msg.col.harness"),i("out.msg.col.state"),i("out.msg.col.msg")],...c]));return}const t=await f(s,o),{messages:n}=await u(s,`/sessions/${encodeURIComponent(t.sessionId)}/messages`);a.info(i("out.msg.threadHeader",{session:t.title??t.sessionId,n:n.length}));for(const r of n){const g=r.fromSessionId===t.sessionId?"\u25B6":"\u25C0",c=r.fromKind==="dashboard"?"dashboard":r.fromKind==="cli"?"cli":r.fromSessionId??"?";console.log(`${r.createdAt.slice(11,19)} ${g} ${c} [${r.status}] ${r.text.slice(0,80)}`)}}async function C(s,o,e){const t=await f(s,o),n=p(),r=await u(s,`/sessions/${encodeURIComponent(t.sessionId)}/watch`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({watcherSessionId:n,notify:e??null})});a.success(i("out.msg.watchOk",{target:t.title??l(t.sessionId),id:r.watchId,via:n??i("out.msg.watchViaDashboard")}))}async function x(s,o){const e=p();if(!e){a.warn(i("out.msg.replyNoSession")),process.exitCode=1;return}const{messages:t}=await u(s,`/sessions/${encodeURIComponent(e)}/messages`),n=pickReplyTarget(t,e);if(!n){a.warn(i("out.msg.replyNothing")),process.exitCode=1;return}await w(s,n,o,"inject",e)}export const msgCommand={name:"msg",description:"cmd.msg.desc",subcommands:[{name:"ls",description:"cmd.msg.ls.desc",async action(s){const o=await d();try{await S(o.port,s.positional[0])}catch(e){a.warn(i("out.msg.failed",{error:e instanceof Error?e.message:String(e)})),process.exitCode=1}}},{name:"send",description:"cmd.msg.send.desc",options:[{name:"mode",short:"m",description:"flag.msg.mode",type:"string",choices:["auto","inject","headless"],default:"inject"}],async action(s){const o=s.positional[0],e=s.positional.slice(1).join(" ");if(!o||!e){a.warn(i("out.msg.sendUsage")),process.exitCode=1;return}const t=await d();try{await w(t.port,o,e,String(s.flags.mode??"inject"),p())}catch(n){a.warn(i("out.msg.sendFail",{error:n instanceof Error?n.message:String(n)})),process.exitCode=1}}},{name:"watch",description:"cmd.msg.watch.desc",options:[{name:"notify",description:"flag.msg.notify",type:"string"}],async action(s){const o=s.positional[0];if(!o){a.warn(i("out.msg.watchUsage")),process.exitCode=1;return}const e=await d();try{await C(e.port,o,s.flags.notify==null?void 0:String(s.flags.notify))}catch(t){a.warn(i("out.msg.watchFail",{error:t instanceof Error?t.message:String(t)})),process.exitCode=1}}},{name:"reply",description:"cmd.msg.reply.desc",async action(s){const o=s.positional.join(" ");if(!o){a.warn(i("out.msg.replyUsage")),process.exitCode=1;return}const e=await d();try{await x(e.port,o)}catch(t){a.warn(i("out.msg.sendFail",{error:t instanceof Error?t.message:String(t)})),process.exitCode=1}}}]};
@@ -1 +1 @@
1
- import{readdir as c}from"node:fs/promises";import{existsSync as m}from"node:fs";import{join as n}from"node:path";import{registerProject as d}from"@weavecode/server";import{logger as a}from"@weavecode/core";import{createRuntimeRegistry as f}from"@weavecode/harness";import{t as p}from"../i18n/index.js";const g=new Set(["node_modules",".git","dist","build",".next","coverage",".cache"]),u=f().byCapability("detect").map(t=>t.detect).filter(t=>t!==void 0);export async function findProjectDirs(t,s=0,r=6){if(s>r)return[];if(m(n(t,".weave"))||u.some(e=>e.present(t)))return[t];let o;try{o=await c(t,{withFileTypes:!0})}catch{return[]}const i=[];for(const e of o)e.isDirectory()&&(e.name.startsWith(".")||g.has(e.name)||i.push(...await findProjectDirs(n(t,e.name),s+1,r)));return i}export const scanCommand={name:"scan",description:"cmd.scan.desc",options:[{name:"dir",short:"d",description:"flag.scan.dir",type:"string",default:process.cwd()}],async action(t){const s=String(t.flags.dir??process.cwd()),r=await findProjectDirs(s);for(const o of r)d(o,"scan");if(a.success(p("out.scan.registered",{count:r.length,root:s})),r.length>0)for(const o of r)a.dim(` ${o}`)}};
1
+ import{readdir as a}from"node:fs/promises";import{existsSync as d}from"node:fs";import{join as o}from"node:path";import{registerProject as f}from"@weavecode/server";import{logger as c}from"@weavecode/core";import{createRuntimeRegistry as m}from"@weavecode/harness";import{t as u}from"../i18n/index.js";const p=new Set(["node_modules",".git","dist","build",".next","coverage",".cache"]),g=m().byCapability("detect").map(t=>t.detect).filter(t=>t!==void 0);export async function findProjectDirs(e,t=0,r=6){if(t>r)return[];if(d(o(e,".weave"))||g.some(i=>i.present(e)))return[e];let n;try{n=await a(e,{withFileTypes:!0})}catch{return[]}const s=[];for(const i of n)i.isDirectory()&&(i.name.startsWith(".")||p.has(i.name)||s.push(...await findProjectDirs(o(e,i.name),t+1,r)));return s}export const scanCommand={name:"scan",description:"cmd.scan.desc",options:[{name:"dir",short:"d",description:"flag.scan.dir",type:"string",default:process.cwd()}],async action(e){const t=String(e.flags.dir??process.cwd()),r=await findProjectDirs(t);for(const n of r)f(n,"scan");if(c.success(u("out.scan.registered",{count:r.length,root:t})),r.length>0)for(const n of r)c.dim(` ${n}`)}};
@@ -1,2 +1,2 @@
1
- import c from"node:path";import R from"node:os";import{readFile as k}from"node:fs/promises";import{fileExists as S,logger as l,formatTable as E,HARNESS_DIRS as j,HARNESS_INSTRUCTION_FILES as x,HARNESS_KEYS as I}from"@weavecode/core";import{createRuntimeRegistry as N}from"@weavecode/harness";import{WEAVE_VERSION as $}from"@weavecode/server";import{checkHarness as b}from"../init/harness-checks.js";import{t as o}from"../i18n/index.js";async function V(i){const t=c.join(i,".weave","config.yaml");if(!await S(t))return null;try{const a=await k(t,"utf-8"),e={};for(const r of a.split(`
2
- `)){const n=r.indexOf(":");n>0&&(e[r.slice(0,n).trim()]=r.slice(n+1).trim())}return e}catch{return null}}async function D(i,t){return await S(c.join(t,i))?"out.status.present":"out.status.missing"}async function u(i,t,a){return[i,o(await D(t,a))]}function _(i,t,a){if(!i)return null;try{const e=i.targetDir(t,"project",a,R.homedir());return c.relative(a,e).split(c.sep).join("/")}catch{return null}}export const statusCommand={name:"status",description:"cmd.status.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(i){const t=String(i.flags.dir??process.cwd()),a=await V(t);if(!a){l.warn(o("out.status.notInitialized"));return}l.info(o("out.status.header"));const e=N(),r=e.byCapability("detect").flatMap(s=>s.detect&&s.detect.detect(t).present?[s.id]:[]),n=[[o("out.status.col.cliVersion"),$],[o("out.status.col.initVersion"),a.initVersion??o("out.status.unknown")],[o("out.status.col.initialized"),a.initTimestamp??o("out.status.unknown")],[o("out.status.col.preset"),a.preset??o("out.status.unknown")],[o("out.status.col.harness"),r.length>0?r.join(", "):o("out.status.unknown")]],p=I[0],m=j[p].projectDir,g=e.get(p)?.assets;for(const s of x[p])n.push(await u(s,s,t));n.push(await u("settings.json",`${m}/settings.json`,t)),n.push(await u(".mcp.json",".mcp.json",t)),n.push(await u("helpers",`${m}/helpers`,t));const w=g?.projectSkillsRoots()[0]??`${m}/skills`;n.push(await u(c.posix.basename(w),w,t));const y=[["commands","command"],["agents","agent"]];for(const[s,f]of y){const h=_(g,f,t)??`${m}/${s}`;n.push(await u(c.posix.basename(h),h,t))}for(const s of r){if(s===p)continue;const f=e.get(s)?.assets?.projectSkillsRoots()[0]??`${j[s].projectDir}/skills`;n.push(await u(f,f,t))}console.log(E(n)),console.log();const d=await b(t);if(d.length>0){l.warn(o("out.status.issuesFound",{count:d.length}));for(const s of d)l.warn(o("out.status.issue",{message:s.message})),l.dim(o("out.status.fix",{fix:s.fix}));console.log()}}};
1
+ import u from"node:path";import b from"node:os";import{readFile as y}from"node:fs/promises";import{fileExists as S,logger as l,formatTable as k,HARNESS_DIRS as j,HARNESS_INSTRUCTION_FILES as x,HARNESS_KEYS as E}from"@weavecode/core";import{createRuntimeRegistry as I}from"@weavecode/harness";import{WEAVE_VERSION as N}from"@weavecode/server";import{checkHarness as $}from"../init/harness-checks.js";import{t as o}from"../i18n/index.js";async function C(i){const t=u.join(i,".weave","config.yaml");if(!await S(t))return null;try{const e=await y(t,"utf-8"),a={};for(const r of e.split(`
2
+ `)){const n=r.indexOf(":");n>0&&(a[r.slice(0,n).trim()]=r.slice(n+1).trim())}return a}catch{return null}}async function D(i,t){return await S(u.join(t,i))?"out.status.present":"out.status.missing"}async function c(i,t,e){return[i,o(await D(t,e))]}function V(i,t,e){if(!i)return null;try{const a=i.targetDir(t,"project",e,b.homedir());return u.relative(e,a).split(u.sep).join("/")}catch{return null}}export const statusCommand={name:"status",description:"cmd.status.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(i){const t=String(i.flags.dir??process.cwd()),e=await C(t);if(!e){l.warn(o("out.status.notInitialized"));return}l.info(o("out.status.header"));const a=I(),r=a.byCapability("detect").flatMap(s=>s.detect&&s.detect.detect(t).present?[s.id]:[]),n=[[o("out.status.col.cliVersion"),N],[o("out.status.col.initVersion"),e.initVersion??o("out.status.unknown")],[o("out.status.col.initialized"),e.initTimestamp??o("out.status.unknown")],[o("out.status.col.preset"),e.preset??o("out.status.unknown")],[o("out.status.col.harness"),r.length>0?r.join(", "):o("out.status.unknown")]],f=E[0],p=j[f].projectDir,d=a.get(f)?.assets;for(const s of x[f])n.push(await c(s,s,t));n.push(await c("settings.json",`${p}/settings.json`,t)),n.push(await c(".mcp.json",".mcp.json",t)),n.push(await c("helpers",`${p}/helpers`,t));const w=d?.projectSkillsRoots()[0]??`${p}/skills`;n.push(await c(u.posix.basename(w),w,t));const R=[["commands","command"],["agents","agent"]];for(const[s,m]of R){const h=V(d,m,t)??`${p}/${s}`;n.push(await c(u.posix.basename(h),h,t))}for(const s of r){if(s===f)continue;const m=a.get(s)?.assets?.projectSkillsRoots()[0]??`${j[s].projectDir}/skills`;n.push(await c(m,m,t))}console.log(k(n)),console.log();const g=await $(t);if(g.length>0){l.warn(o("out.status.issuesFound",{count:g.length}));for(const s of g)l.warn(o("out.status.issue",{message:s.message})),l.dim(o("out.status.fix",{fix:s.fix}));console.log()}}};
@@ -1 +1 @@
1
- import{logger as t}from"@weavecode/core";import{executeUninstall as a}from"../init/uninstall.js";import{t as i}from"../i18n/index.js";function r(s){s.outcome==="removed"?t.dim(i("out.uninstall.serverRemoved",{name:s.name??"",events:s.purged?.events??0,dispatches:s.purged?.dispatches??0,sessions:s.purged?.sessions??0})):s.outcome==="failed"&&t.warn(i("out.uninstall.serverFailed",{error:s.error??""}))}export const uninstallCommand={name:"uninstall",description:"cmd.uninstall.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(s){const n=String(s.flags.dir??process.cwd());t.info(i("out.uninstall.banner",{target:n}));const e=await a({targetDir:n});if(e.status==="not-initialized"){t.warn(i("out.uninstall.notInitialized")),r(e.server);return}if(t.success(i("out.uninstall.done",{files:e.removedFiles.length,dirs:e.removedDirs.length})),e.modifiedFiles.length>0&&t.dim(i("out.uninstall.modified",{count:e.modifiedFiles.length})),e.keptUserFiles.length>0){t.dim(i("out.uninstall.keptUser",{count:e.keptUserFiles.length}));for(const o of e.keptUserFiles)t.dim(` ${o}`)}switch(e.restoredFromBackup&&t.dim(i("out.uninstall.restored",{path:e.restoredFromBackup})),r(e.server),e.git){case"reset":t.dim(i("out.uninstall.gitReset",{sha:e.gitSha??""}));break;case"committed":t.dim(i("out.uninstall.gitCommit",{sha:e.gitSha??"",count:e.removedFiles.length+e.modifiedFiles.length}));break;case"no-changes":t.dim(i("out.uninstall.gitNoChanges"));break;case"skipped-dirty-index":t.warn(i("out.uninstall.gitDirty"));break;case"skipped-not-repo":t.dim(i("out.uninstall.gitNotRepo"));break;case"failed":t.warn(i("out.uninstall.gitFailed",{error:e.gitError??""}));break}}};
1
+ import{logger as t}from"@weavecode/core";import{executeUninstall as a}from"../init/uninstall.js";import{t as i}from"../i18n/index.js";function o(n){n.outcome==="removed"?t.dim(i("out.uninstall.serverRemoved",{name:n.name??"",events:n.purged?.events??0,dispatches:n.purged?.dispatches??0,sessions:n.purged?.sessions??0})):n.outcome==="failed"&&t.warn(i("out.uninstall.serverFailed",{error:n.error??""}))}export const uninstallCommand={name:"uninstall",description:"cmd.uninstall.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(n){const s=String(n.flags.dir??process.cwd());t.info(i("out.uninstall.banner",{target:s}));const e=await a({targetDir:s});if(e.status==="not-initialized"){t.warn(i("out.uninstall.notInitialized")),o(e.server);return}if(t.success(i("out.uninstall.done",{files:e.removedFiles.length,dirs:e.removedDirs.length})),e.modifiedFiles.length>0&&t.dim(i("out.uninstall.modified",{count:e.modifiedFiles.length})),e.keptUserFiles.length>0){t.dim(i("out.uninstall.keptUser",{count:e.keptUserFiles.length}));for(const r of e.keptUserFiles)t.dim(` ${r}`)}switch(e.restoredFromBackup&&t.dim(i("out.uninstall.restored",{path:e.restoredFromBackup})),o(e.server),e.git){case"reset":t.dim(i("out.uninstall.gitReset",{sha:e.gitSha??""}));break;case"committed":t.dim(i("out.uninstall.gitCommit",{sha:e.gitSha??"",count:e.removedFiles.length+e.modifiedFiles.length}));break;case"no-changes":t.dim(i("out.uninstall.gitNoChanges"));break;case"skipped-dirty-index":t.warn(i("out.uninstall.gitDirty"));break;case"skipped-not-repo":t.dim(i("out.uninstall.gitNotRepo"));break;case"failed":t.warn(i("out.uninstall.gitFailed",{error:e.gitError??""}));break}}};
@@ -47,5 +47,5 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en
47
47
  - Don't introduce XSS, SQL injection, or command injection vectors
48
48
  - Prefer parameterized queries and safe APIs over string concatenation
49
49
 
50
- `,"claudemd.skills":"## Skills\n\nReusable skills live in your harness's own skills directory (Claude Code: `.claude/skills/`): one directory per skill, each with a `SKILL.md`; invoke a skill by name when the task matches one.\n\n","init.removed":` Removed {count} stale generated file(s) by marker.
50
+ `,"claudemd.skills":"## Skills\n\nReusable skills live in your harness's own skills directory (Claude Code: `.claude/skills/`): one directory per skill, each with a `SKILL.md`; invoke a skill by name when the task matches one.\n\n","claudemd.visualize":'## Render Blocks\n\nTo embed an HTML snapshot in a weave conversation: write the fragment inside the project (e.g. `.weave/previews/<name>.html`) or under `{dir}` \u2014 the server rejects any other location; put the reference on its **own line**: U+E200 + `visualize` + U+E202 + `{"path":"<abs>"}` + U+E201.\n\n',"init.removed":` Removed {count} stale generated file(s) by marker.
51
51
  `,"harness.instructionLinkNotMaterialised.message":'{agents} is a plain file containing "{claude}" \u2014 git checked the symlink out as text.',"harness.instructionLinkNotMaterialised.fix":"Enable Developer Mode, then run `git config core.symlinks true` and re-checkout the file.","harness.instructionFilesDuplicated.message":"{claude} and {agents} are both regular files \u2014 they will drift apart.","harness.instructionFilesDuplicated.fix":"Run `weave init` to link one to the other (the displaced file is backed up).","harness.instructionLinkDangling.message":"{name} is a symlink whose target does not exist.","harness.instructionLinkDangling.fix":"Run `weave init` to rewrite the link and the instruction file.","harness.statuslinePathUnresolved.message":"statusLine command does not resolve to a script path: {command}","harness.statuslinePathUnresolved.fix":`Run \`weave init\` to regenerate \`${t[e[0]].projectDir}/settings.json\`.`,"harness.statuslinePathForeign.message":"statusLine points outside this project ({path}) \u2014 it was generated for another checkout.","harness.statuslinePathForeign.fix":"Run `weave init` in this project to rewrite the absolute path.","harness.statuslineScriptMissing.message":"statusLine script is missing: {path}","harness.statuslineScriptMissing.fix":"Run `weave init` to regenerate it.","ilink.bothHaveContent":"CLAUDE.md and AGENTS.md both contain content","ilink.replaceDetail":"AGENTS.md will be replaced with a symlink to CLAUDE.md (the original is backed up to {backupDir}).","ilink.linkFailed":"Could not create {link} -> {target} ({path}): {detail}","ilink.symlinkNotAllowed":"this system does not allow symlinks without elevation. On Windows, enable Developer Mode (Settings > System > For developers) or run weave init from an elevated shell, then retry."};
@@ -208,6 +208,7 @@ export declare const zh: {
208
208
  'claudemd.files': string;
209
209
  'claudemd.security': string;
210
210
  'claudemd.skills': string;
211
+ 'claudemd.visualize': string;
211
212
  'harness.instructionLinkNotMaterialised.message': string;
212
213
  'harness.instructionLinkNotMaterialised.fix': string;
213
214
  'harness.instructionFilesDuplicated.message': string;
@@ -1,4 +1,4 @@
1
- import{HARNESS_DIRS as F,HARNESS_KEYS as u}from"@weavecode/core";export const zh={"help.tagline":"weave v{version} \u2014 Harness \u5DE5\u5177","help.usage":"\u7528\u6CD5\uFF1Aweave <\u547D\u4EE4> [\u9009\u9879]","help.commands":"\u547D\u4EE4\uFF1A","help.globalOptions":"\u5168\u5C40\u9009\u9879\uFF1A","help.subcommands":"\u53EF\u7528\u5B50\u547D\u4EE4\uFF1A","cli.unknownCommand":"\u672A\u77E5\u547D\u4EE4\uFF1A{command}","cli.error":"\u9519\u8BEF\uFF1A{error}","cli.missingRequired":"\u7F3A\u5C11\u5FC5\u586B\u9009\u9879\uFF1A--{name}","cli.invalidChoice":'--{name} \u7684\u53D6\u503C "{value}" \u65E0\u6548\uFF0C\u53EF\u9009\u503C\uFF1A{choices}',"cli.missingSubcommand":"\u547D\u4EE4 {command} \u9700\u8981\u4E00\u4E2A\u5B50\u547D\u4EE4","cli.unknownSubcommand":"\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A{command} {subcommand}","cli.unexpectedPositional":"\u547D\u4EE4 {command} \u4E0D\u63A5\u53D7\u53C2\u6570\u300C{arg}\u300D","flag.help":"\u663E\u793A\u5E2E\u52A9","flag.version":"\u663E\u793A\u7248\u672C","flag.verbose":"\u8BE6\u7EC6\u8F93\u51FA","flag.quiet":"\u6291\u5236\u975E\u5FC5\u8981\u8F93\u51FA","cmd.init.desc":"\u5728\u5F53\u524D\u9879\u76EE\u521D\u59CB\u5316 weave harness","cmd.uninstall.desc":"\u5378\u8F7D weave\uFF1A\u79FB\u9664 init \u751F\u6210\u7269\uFF08init \u63D0\u4EA4\u521A\u843D\u76D8\u65F6\u56DE\u6EDA\u6307\u9488\uFF0C\u5426\u5219\u751F\u6210\u5378\u8F7D\u63D0\u4EA4\uFF09","cmd.status.desc":"\u67E5\u770B\u5F53\u524D harness \u72B6\u6001","cmd.daemon.desc":"\u7BA1\u7406\u540E\u53F0\u5B88\u62A4\u8FDB\u7A0B\uFF08start\u3001stop\u3001status\uFF09","cmd.daemon.start.desc":"\u5728\u540E\u53F0\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF08\u4E0D\u5F00\u6D4F\u89C8\u5668\u2014\u2014\u89C1 `weave dashboard`\uFF09","cmd.daemon.stop.desc":"\u505C\u6B62\u8FD0\u884C\u4E2D\u7684\u5B88\u62A4\u8FDB\u7A0B","cmd.daemon.status.desc":"\u67E5\u770B\u5B88\u62A4\u8FDB\u7A0B\u72B6\u6001","cmd.dashboard.desc":"\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00 web \u63A7\u5236\u53F0\uFF08\u5FC5\u8981\u65F6\u5148\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF09","cmd.chpass.desc":"\u4FEE\u6539 dashboard \u767B\u5F55\u5BC6\u7801\uFF08\u6307\u5B9A\u65B0\u5BC6\u7801\uFF1B\u672C\u673A\u6267\u884C\u4E0D\u9700\u8981\u65E7\u5BC6\u7801\uFF09","cmd.scan.desc":"\u626B\u63CF\u5DF2\u521D\u59CB\u5316 weave \u7684\u9879\u76EE\u5E76\u6CE8\u518C","cmd.doctor.desc":"\u8BCA\u65AD\u672C\u673A\u63A5\u7EBF\uFF1A\u8FD9\u6761\u68C0\u51FA\u662F\u5426\u5DF2\u6CE8\u518C\u8FDB\u672C\u673A weave server","flag.init.preset":"\u914D\u7F6E\u9884\u8BBE\uFF1Aminimal\u3001default \u6216 full","flag.init.force":"\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6587\u4EF6","flag.init.noInteractive":"\u7981\u7528\u4EA4\u4E92\u5F0F\u63D0\u793A","flag.init.hooks":"\u542F\u7528\u7684 hook \u4E8B\u4EF6\uFF0C\u9017\u53F7\u5206\u9694\uFF08preToolUse,postToolUse,userPromptSubmit,sessionStart,stop,stopFailure,subagentStop,subagentStart,notification,postToolUseFailure,permissionRequest,permissionDenied,preCompact,sessionEnd,preModelSwitch\uFF09\uFF1Bnone \u8868\u793A\u5168\u4E0D\u6CE8\u518C\uFF1B\u9ED8\u8BA4\u5168\u5F00","flag.init.harness":`\u8981\u521D\u59CB\u5316\u7684 harness \u9762\uFF0C\u9017\u53F7\u5206\u9694\uFF08${u.join("\u3001")}\uFF09\uFF1B\u7F3A\u7701\u65F6 TTY \u4E0B\u4EA4\u4E92\u591A\u9009\uFF0C\u9ED8\u8BA4 ${u[0]}`,"flag.dir":"\u76EE\u6807\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.scan.dir":"\u626B\u63CF\u7684\u6839\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.dashboard.noOpen":"\u53EA\u6253\u5370 dashboard URL\uFF0C\u4E0D\u6253\u5F00\u6D4F\u89C8\u5668","out.daemon.alreadyRunning":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u5728 {port} \u7AEF\u53E3\u8FD0\u884C","out.daemon.started":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8\uFF1Ahttp://{host}:{port}","out.daemon.startUnconfirmed":"\u5B88\u62A4\u8FDB\u7A0B\u5728 {port} \u7AEF\u53E3\u8FDF\u8FDF\u672A\u5E94\u7B54\u2014\u2014\u53EF\u80FD\u542F\u52A8\u5931\u8D25\u4E86\uFF08\u8BE6\u89C1\u6570\u636E\u76EE\u5F55 cache/logs/daemon-boot.log\uFF09","out.daemon.stopped":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\uFF08pid {pid}\uFF09\u3002","out.daemon.statusNotRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u672A\u8FD0\u884C","out.daemon.statusRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u8FD0\u884C\u4E2D\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port}\uFF0C\u5DF2\u8FD0\u884C {uptime}s\uFF09","out.daemon.urlsTitle":"\u8BBF\u95EE\u5730\u5740\uFF1A","out.daemon.statusStale":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u72B6\u6001\u8FC7\u671F\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port} \u65E0\u54CD\u5E94\uFF09","out.doctor.header":`
1
+ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const zh={"help.tagline":"weave v{version} \u2014 Harness \u5DE5\u5177","help.usage":"\u7528\u6CD5\uFF1Aweave <\u547D\u4EE4> [\u9009\u9879]","help.commands":"\u547D\u4EE4\uFF1A","help.globalOptions":"\u5168\u5C40\u9009\u9879\uFF1A","help.subcommands":"\u53EF\u7528\u5B50\u547D\u4EE4\uFF1A","cli.unknownCommand":"\u672A\u77E5\u547D\u4EE4\uFF1A{command}","cli.error":"\u9519\u8BEF\uFF1A{error}","cli.missingRequired":"\u7F3A\u5C11\u5FC5\u586B\u9009\u9879\uFF1A--{name}","cli.invalidChoice":'--{name} \u7684\u53D6\u503C "{value}" \u65E0\u6548\uFF0C\u53EF\u9009\u503C\uFF1A{choices}',"cli.missingSubcommand":"\u547D\u4EE4 {command} \u9700\u8981\u4E00\u4E2A\u5B50\u547D\u4EE4","cli.unknownSubcommand":"\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A{command} {subcommand}","cli.unexpectedPositional":"\u547D\u4EE4 {command} \u4E0D\u63A5\u53D7\u53C2\u6570\u300C{arg}\u300D","flag.help":"\u663E\u793A\u5E2E\u52A9","flag.version":"\u663E\u793A\u7248\u672C","flag.verbose":"\u8BE6\u7EC6\u8F93\u51FA","flag.quiet":"\u6291\u5236\u975E\u5FC5\u8981\u8F93\u51FA","cmd.init.desc":"\u5728\u5F53\u524D\u9879\u76EE\u521D\u59CB\u5316 weave harness","cmd.uninstall.desc":"\u5378\u8F7D weave\uFF1A\u79FB\u9664 init \u751F\u6210\u7269\uFF08init \u63D0\u4EA4\u521A\u843D\u76D8\u65F6\u56DE\u6EDA\u6307\u9488\uFF0C\u5426\u5219\u751F\u6210\u5378\u8F7D\u63D0\u4EA4\uFF09","cmd.status.desc":"\u67E5\u770B\u5F53\u524D harness \u72B6\u6001","cmd.daemon.desc":"\u7BA1\u7406\u540E\u53F0\u5B88\u62A4\u8FDB\u7A0B\uFF08start\u3001stop\u3001status\uFF09","cmd.daemon.start.desc":"\u5728\u540E\u53F0\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF08\u4E0D\u5F00\u6D4F\u89C8\u5668\u2014\u2014\u89C1 `weave dashboard`\uFF09","cmd.daemon.stop.desc":"\u505C\u6B62\u8FD0\u884C\u4E2D\u7684\u5B88\u62A4\u8FDB\u7A0B","cmd.daemon.status.desc":"\u67E5\u770B\u5B88\u62A4\u8FDB\u7A0B\u72B6\u6001","cmd.dashboard.desc":"\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00 web \u63A7\u5236\u53F0\uFF08\u5FC5\u8981\u65F6\u5148\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF09","cmd.chpass.desc":"\u4FEE\u6539 dashboard \u767B\u5F55\u5BC6\u7801\uFF08\u6307\u5B9A\u65B0\u5BC6\u7801\uFF1B\u672C\u673A\u6267\u884C\u4E0D\u9700\u8981\u65E7\u5BC6\u7801\uFF09","cmd.scan.desc":"\u626B\u63CF\u5DF2\u521D\u59CB\u5316 weave \u7684\u9879\u76EE\u5E76\u6CE8\u518C","cmd.doctor.desc":"\u8BCA\u65AD\u672C\u673A\u63A5\u7EBF\uFF1A\u8FD9\u6761\u68C0\u51FA\u662F\u5426\u5DF2\u6CE8\u518C\u8FDB\u672C\u673A weave server","flag.init.preset":"\u914D\u7F6E\u9884\u8BBE\uFF1Aminimal\u3001default \u6216 full","flag.init.force":"\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6587\u4EF6","flag.init.noInteractive":"\u7981\u7528\u4EA4\u4E92\u5F0F\u63D0\u793A","flag.init.hooks":"\u542F\u7528\u7684 hook \u4E8B\u4EF6\uFF0C\u9017\u53F7\u5206\u9694\uFF08preToolUse,postToolUse,userPromptSubmit,sessionStart,stop,stopFailure,subagentStop,subagentStart,notification,postToolUseFailure,permissionRequest,permissionDenied,preCompact,sessionEnd,preModelSwitch\uFF09\uFF1Bnone \u8868\u793A\u5168\u4E0D\u6CE8\u518C\uFF1B\u9ED8\u8BA4\u5168\u5F00","flag.init.harness":`\u8981\u521D\u59CB\u5316\u7684 harness \u9762\uFF0C\u9017\u53F7\u5206\u9694\uFF08${e.join("\u3001")}\uFF09\uFF1B\u7F3A\u7701\u65F6 TTY \u4E0B\u4EA4\u4E92\u591A\u9009\uFF0C\u9ED8\u8BA4 ${e[0]}`,"flag.dir":"\u76EE\u6807\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.scan.dir":"\u626B\u63CF\u7684\u6839\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.dashboard.noOpen":"\u53EA\u6253\u5370 dashboard URL\uFF0C\u4E0D\u6253\u5F00\u6D4F\u89C8\u5668","out.daemon.alreadyRunning":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u5728 {port} \u7AEF\u53E3\u8FD0\u884C","out.daemon.started":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8\uFF1Ahttp://{host}:{port}","out.daemon.startUnconfirmed":"\u5B88\u62A4\u8FDB\u7A0B\u5728 {port} \u7AEF\u53E3\u8FDF\u8FDF\u672A\u5E94\u7B54\u2014\u2014\u53EF\u80FD\u542F\u52A8\u5931\u8D25\u4E86\uFF08\u8BE6\u89C1\u6570\u636E\u76EE\u5F55 cache/logs/daemon-boot.log\uFF09","out.daemon.stopped":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\uFF08pid {pid}\uFF09\u3002","out.daemon.statusNotRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u672A\u8FD0\u884C","out.daemon.statusRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u8FD0\u884C\u4E2D\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port}\uFF0C\u5DF2\u8FD0\u884C {uptime}s\uFF09","out.daemon.urlsTitle":"\u8BBF\u95EE\u5730\u5740\uFF1A","out.daemon.statusStale":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u72B6\u6001\u8FC7\u671F\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port} \u65E0\u54CD\u5E94\uFF09","out.doctor.header":`
2
2
  Weave Doctor \u2014\u2014 \u672C\u673A\u63A5\u7EBF
3
3
  `,"out.doctor.dir":"\u76EE\u5F55","out.doctor.initialized":"\u5DF2\u521D\u59CB\u5316","out.doctor.yes":"\u662F","out.doctor.no":"\u5426","out.doctor.daemon":"\u5B88\u62A4\u8FDB\u7A0B","out.doctor.daemonRunning":"\u8FD0\u884C\u4E2D\uFF08\u7AEF\u53E3 {port}\uFF09","out.doctor.daemonStopped":"\u672A\u8FD0\u884C","out.doctor.registered":"\u672C\u673A\u6CE8\u518C","out.doctor.registeredYes":"\u662F\uFF08id {id}\uFF0C\u6765\u6E90 {source}\uFF09","out.doctor.registeredNo":"\u5426\u2014\u2014\u8FD9\u6761\u68C0\u51FA\u4E0D\u5728\u672C\u673A\u6CE8\u518C\u8868\u91CC","out.doctor.registeredArchived":"\u5DF2\u5F52\u6863\uFF08id {id}\uFF09","out.doctor.token":"\u4EE4\u724C","out.doctor.tokenOk":"\u6B63\u5E38","out.doctor.tokenMissing":"\u7F3A\u5931\uFF08.weave/token \u4E0D\u5B58\u5728\uFF09","out.doctor.tokenUnregistered":"\u5B58\u5728\uFF0C\u4F46\u9879\u76EE\u672A\u6CE8\u518C","out.doctor.tokenStale":"\u8FC7\u671F\u2014\u2014\u4E0E\u672C\u673A\u6CE8\u518C\u8868\u7684\u4EE4\u724C\u4E0D\u4E00\u81F4","out.doctor.warnNotRegistered":"\u8FD9\u4E2A\u9879\u76EE\u5E26\u7740 weave \u6587\u4EF6\uFF0C\u5374\u6CA1\u6709\u6CE8\u518C\u8FDB\u672C\u673A weave server\u3002","out.doctor.fixInit":"\u8FD0\u884C `weave init` \u53EF\u91CD\u65B0\u6CE8\u518C\u8FD9\u6761\u68C0\u51FA\u3001\u5237\u65B0 harness \u6587\u4EF6\u5E76\u91CD\u5199\u672C\u5730\u8DEF\u5F84\u3002","out.doctor.fixScan":"\u6216\u7528 `weave scan -d <\u4E0A\u7EA7\u76EE\u5F55>` \u6279\u91CF\u53D1\u73B0\u5E76\u6CE8\u518C\u3002","out.doctor.warnArchived":"\u8FD9\u4E2A\u9879\u76EE\u5DF2\u6CE8\u518C\u4F46\u5904\u4E8E\u5F52\u6863\u6001\u2014\u2014\u5728 dashboard \u91CC\u6062\u590D\u540E\u624D\u80FD\u4F7F\u7528\u3002","out.doctor.warnTokenMissing":"\u5DF2\u6CE8\u518C\uFF0C\u4F46 `.weave/token` \u7F3A\u5931\u2014\u2014\u91CD\u65B0\u751F\u6210\u524D hook \u65E0\u6CD5\u901A\u8FC7\u9274\u6743\u3002","out.doctor.warnTokenStale":"\u5DF2\u6CE8\u518C\uFF0C\u4F46 `.weave/token` \u5C5E\u4E8E\u53E6\u4E00\u6B21\u68C0\u51FA\u2014\u2014\u9700\u8981\u91CD\u65B0\u751F\u6210\u3002","out.doctor.ok":"\u6B63\u5E38\u2014\u2014\u8FD9\u6761\u68C0\u51FA\u5DF2\u6CE8\u518C\uFF0C\u4EE4\u724C\u4E00\u81F4\u3002","out.doctor.fixDaemon":"\u5B88\u62A4\u8FDB\u7A0B\u672A\u8FD0\u884C\uFF1B\u9700\u8981\u91C7\u96C6\u65F6\u7528 `weave daemon start` \u542F\u52A8\u3002","out.doctor.diagHeader":`
4
4
  Weave Doctor \u2014\u2014 \u6D88\u606F\u6295\u9012\u8BCA\u65AD\uFF08\u9879\u76EE #{id}\uFF09
@@ -48,4 +48,4 @@ import{HARNESS_DIRS as F,HARNESS_KEYS as u}from"@weavecode/core";export const zh
48
48
  - \u4E0D\u5F15\u5165 XSS\u3001SQL \u6CE8\u5165\u3001\u547D\u4EE4\u6CE8\u5165\u9762
49
49
  - \u4F18\u5148\u53C2\u6570\u5316\u67E5\u8BE2\u4E0E\u5B89\u5168 API\uFF0C\u800C\u4E0D\u662F\u5B57\u7B26\u4E32\u62FC\u63A5
50
50
 
51
- `,"claudemd.skills":"## \u6280\u80FD\n\n\u53EF\u590D\u7528\u6280\u80FD\u653E harness \u81EA\u5DF1\u7684\u6280\u80FD\u76EE\u5F55\uFF08Claude Code \u4E3A `.claude/skills/`\uFF09\uFF1A\u4E00\u4E2A\u6280\u80FD\u4E00\u4E2A\u76EE\u5F55\u3001\u5185\u542B `SKILL.md`\uFF1B\u4EFB\u52A1\u547D\u4E2D\u67D0\u4E2A\u6280\u80FD\u65F6\u6309\u540D\u8C03\u7528\u3002\n\n","harness.instructionLinkNotMaterialised.message":'{agents} \u662F\u5185\u5BB9\u4E3A "{claude}" \u7684\u666E\u901A\u6587\u4EF6\u2014\u2014git \u628A\u8F6F\u94FE\u63A5\u68C0\u51FA\u6210\u4E86\u6587\u672C\u3002',"harness.instructionLinkNotMaterialised.fix":"\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF0C\u7136\u540E\u8FD0\u884C `git config core.symlinks true` \u5E76\u91CD\u65B0\u68C0\u51FA\u8BE5\u6587\u4EF6\u3002","harness.instructionFilesDuplicated.message":"{claude} \u4E0E {agents} \u90FD\u662F\u72EC\u7ACB\u6587\u4EF6\u2014\u2014\u4E24\u8005\u5185\u5BB9\u4F1A\u5404\u81EA\u6F02\u79FB\u3002","harness.instructionFilesDuplicated.fix":"\u8FD0\u884C `weave init` \u8BA9\u5176\u4E2D\u4E00\u4E2A\u94FE\u63A5\u5230\u53E6\u4E00\u4E2A\uFF08\u88AB\u66FF\u6362\u7684\u6587\u4EF6\u4F1A\u5148\u5907\u4EFD\uFF09\u3002","harness.instructionLinkDangling.message":"{name} \u662F\u76EE\u6807\u4E0D\u5B58\u5728\u7684\u8F6F\u94FE\u63A5\u3002","harness.instructionLinkDangling.fix":"\u8FD0\u884C `weave init` \u91CD\u5EFA\u94FE\u63A5\u4E0E\u6307\u4EE4\u6587\u4EF6\u3002","harness.statuslinePathUnresolved.message":"statusLine \u547D\u4EE4\u65E0\u6CD5\u89E3\u6790\u51FA\u811A\u672C\u8DEF\u5F84\uFF1A{command}","harness.statuslinePathUnresolved.fix":`\u8FD0\u884C \`weave init\` \u91CD\u65B0\u751F\u6210 \`${F[u[0]].projectDir}/settings.json\`\u3002`,"harness.statuslinePathForeign.message":"statusLine \u6307\u5411\u672C\u9879\u76EE\u4E4B\u5916\uFF08{path}\uFF09\u2014\u2014\u5B83\u662F\u4E3A\u53E6\u4E00\u4E2A\u68C0\u51FA\u751F\u6210\u7684\u3002","harness.statuslinePathForeign.fix":"\u5728\u672C\u9879\u76EE\u4E2D\u8FD0\u884C `weave init` \u91CD\u5199\u7EDD\u5BF9\u8DEF\u5F84\u3002","harness.statuslineScriptMissing.message":"statusLine \u811A\u672C\u7F3A\u5931\uFF1A{path}","harness.statuslineScriptMissing.fix":"\u8FD0\u884C `weave init` \u91CD\u65B0\u751F\u6210\u3002","ilink.bothHaveContent":"CLAUDE.md \u4E0E AGENTS.md \u90FD\u5305\u542B\u5185\u5BB9","ilink.replaceDetail":"\u5C06\u628A AGENTS.md \u66FF\u6362\u4E3A\u6307\u5411 CLAUDE.md \u7684\u8F6F\u8FDE\u63A5\uFF08\u539F\u6587\u4EF6\u4F1A\u5907\u4EFD\u5230 {backupDir}\uFF09\u3002","ilink.linkFailed":"\u65E0\u6CD5\u521B\u5EFA {link} -> {target}\uFF08{path}\uFF09\uFF1A{detail}","ilink.symlinkNotAllowed":"\u6B64\u7CFB\u7EDF\u4E0D\u5141\u8BB8\u672A\u63D0\u6743\u521B\u5EFA\u8F6F\u94FE\u63A5\u3002\u5728 Windows \u4E0A\u8BF7\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF08\u8BBE\u7F6E > \u7CFB\u7EDF > \u5F00\u53D1\u8005\u9009\u9879\uFF09\uFF0C\u6216\u4ECE\u63D0\u6743\u7EC8\u7AEF\u8FD0\u884C weave init\uFF0C\u7136\u540E\u91CD\u8BD5\u3002"};
51
+ `,"claudemd.skills":"## \u6280\u80FD\n\n\u53EF\u590D\u7528\u6280\u80FD\u653E harness \u81EA\u5DF1\u7684\u6280\u80FD\u76EE\u5F55\uFF08Claude Code \u4E3A `.claude/skills/`\uFF09\uFF1A\u4E00\u4E2A\u6280\u80FD\u4E00\u4E2A\u76EE\u5F55\u3001\u5185\u542B `SKILL.md`\uFF1B\u4EFB\u52A1\u547D\u4E2D\u67D0\u4E2A\u6280\u80FD\u65F6\u6309\u540D\u8C03\u7528\u3002\n\n","claudemd.visualize":'## \u6E32\u67D3\u5757\n\n\u8981\u8BA9 weave \u5BF9\u8BDD\u91CC\u5185\u5D4C HTML \u5FEB\u7167\uFF1Afragment \u5199\u8FDB\u9879\u76EE\u5185\uFF08\u5982 `.weave/previews/<name>.html`\uFF09\u6216\u5199\u5230 `{dir}`\uFF0C\u5176\u5B83\u4F4D\u7F6E\u670D\u52A1\u7AEF\u4F1A\u62D2\uFF1B\u56DE\u590D\u91CC**\u5355\u72EC\u4E00\u884C**\u5199\u5F15\u7528\u884C\uFF1AU+E200 + `visualize` + U+E202 + `{"path":"<\u7EDD\u5BF9\u8DEF\u5F84>"}` + U+E201\u3002\n\n',"harness.instructionLinkNotMaterialised.message":'{agents} \u662F\u5185\u5BB9\u4E3A "{claude}" \u7684\u666E\u901A\u6587\u4EF6\u2014\u2014git \u628A\u8F6F\u94FE\u63A5\u68C0\u51FA\u6210\u4E86\u6587\u672C\u3002',"harness.instructionLinkNotMaterialised.fix":"\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF0C\u7136\u540E\u8FD0\u884C `git config core.symlinks true` \u5E76\u91CD\u65B0\u68C0\u51FA\u8BE5\u6587\u4EF6\u3002","harness.instructionFilesDuplicated.message":"{claude} \u4E0E {agents} \u90FD\u662F\u72EC\u7ACB\u6587\u4EF6\u2014\u2014\u4E24\u8005\u5185\u5BB9\u4F1A\u5404\u81EA\u6F02\u79FB\u3002","harness.instructionFilesDuplicated.fix":"\u8FD0\u884C `weave init` \u8BA9\u5176\u4E2D\u4E00\u4E2A\u94FE\u63A5\u5230\u53E6\u4E00\u4E2A\uFF08\u88AB\u66FF\u6362\u7684\u6587\u4EF6\u4F1A\u5148\u5907\u4EFD\uFF09\u3002","harness.instructionLinkDangling.message":"{name} \u662F\u76EE\u6807\u4E0D\u5B58\u5728\u7684\u8F6F\u94FE\u63A5\u3002","harness.instructionLinkDangling.fix":"\u8FD0\u884C `weave init` \u91CD\u5EFA\u94FE\u63A5\u4E0E\u6307\u4EE4\u6587\u4EF6\u3002","harness.statuslinePathUnresolved.message":"statusLine \u547D\u4EE4\u65E0\u6CD5\u89E3\u6790\u51FA\u811A\u672C\u8DEF\u5F84\uFF1A{command}","harness.statuslinePathUnresolved.fix":`\u8FD0\u884C \`weave init\` \u91CD\u65B0\u751F\u6210 \`${t[e[0]].projectDir}/settings.json\`\u3002`,"harness.statuslinePathForeign.message":"statusLine \u6307\u5411\u672C\u9879\u76EE\u4E4B\u5916\uFF08{path}\uFF09\u2014\u2014\u5B83\u662F\u4E3A\u53E6\u4E00\u4E2A\u68C0\u51FA\u751F\u6210\u7684\u3002","harness.statuslinePathForeign.fix":"\u5728\u672C\u9879\u76EE\u4E2D\u8FD0\u884C `weave init` \u91CD\u5199\u7EDD\u5BF9\u8DEF\u5F84\u3002","harness.statuslineScriptMissing.message":"statusLine \u811A\u672C\u7F3A\u5931\uFF1A{path}","harness.statuslineScriptMissing.fix":"\u8FD0\u884C `weave init` \u91CD\u65B0\u751F\u6210\u3002","ilink.bothHaveContent":"CLAUDE.md \u4E0E AGENTS.md \u90FD\u5305\u542B\u5185\u5BB9","ilink.replaceDetail":"\u5C06\u628A AGENTS.md \u66FF\u6362\u4E3A\u6307\u5411 CLAUDE.md \u7684\u8F6F\u8FDE\u63A5\uFF08\u539F\u6587\u4EF6\u4F1A\u5907\u4EFD\u5230 {backupDir}\uFF09\u3002","ilink.linkFailed":"\u65E0\u6CD5\u521B\u5EFA {link} -> {target}\uFF08{path}\uFF09\uFF1A{detail}","ilink.symlinkNotAllowed":"\u6B64\u7CFB\u7EDF\u4E0D\u5141\u8BB8\u672A\u63D0\u6743\u521B\u5EFA\u8F6F\u94FE\u63A5\u3002\u5728 Windows \u4E0A\u8BF7\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF08\u8BBE\u7F6E > \u7CFB\u7EDF > \u5F00\u53D1\u8005\u9009\u9879\uFF09\uFF0C\u6216\u4ECE\u63D0\u6743\u7EC8\u7AEF\u8FD0\u884C weave init\uFF0C\u7136\u540E\u91CD\u8BD5\u3002"};
@@ -1 +1 @@
1
- import{DEFAULT_LOCALE as e,SUPPORTED_LOCALES as L,readDaemonSettings as f}from"@weavecode/server";import{DICTS as n}from"./dict/index.js";import{makeT as a}from"./t.js";let c=e,i=a(n[e],n[e]);function r(o){c=o,i=a(n[o],n[e])}export async function initCliLocale(){const o=process.env.WEAVE_LOCALE;if(o&&L.includes(o)){r(o);return}try{r((await f()).locale)}catch{r(e)}}export function setLocale(o){r(o)}export function getLocale(){return c}export function t(o,s){return i(o,s)}
1
+ import{DEFAULT_LOCALE as o,SUPPORTED_LOCALES as L,readDaemonSettings as p}from"@weavecode/server";import{DICTS as n}from"./dict/index.js";import{makeT as c}from"./t.js";let a=o,i=c(n[o],n[o]);function r(e){a=e,i=c(n[e],n[o])}export async function initCliLocale(){const e=process.env.WEAVE_LOCALE;if(e&&L.includes(e)){r(e);return}try{r((await p()).locale)}catch{r(o)}}export function setLocale(e){r(e)}export function getLocale(){return a}export function t(e,l){return i(e,l)}
@@ -1 +1 @@
1
- export function interpolate(n,t){return t?n.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e):n}export function makeT(n,t){return(e,r)=>interpolate(n[e]??t[e]??String(e),r)}
1
+ export function interpolate(t,r){return r?t.replace(/\{(\w+)\}/g,(n,e)=>e in r?String(r[e]):n):t}export function makeT(t,r){return(n,e)=>interpolate(t[n]??r[n]??String(n),e)}
@@ -1,11 +1,11 @@
1
- import{t as a}from"../i18n/index.js";export const WEAVE_BLOCK_START="<!-- weave:start -->",WEAVE_BLOCK_END="<!-- weave:end -->",WEAVE_MANAGED_HEADER="> This file is managed by [weave](https://github.com/zijing66/weave) \u2014 a coding-agent harness.";function r(e){return`# ${e}
1
+ import{getVisualizationsDir as d}from"@weavecode/server";import{t as r}from"../i18n/index.js";export const WEAVE_BLOCK_START="<!-- weave:start -->",WEAVE_BLOCK_END="<!-- weave:end -->",WEAVE_MANAGED_HEADER="> This file is managed by [weave](https://github.com/zijing66/weave) \u2014 a coding-agent harness.";function i(e){return`# ${e}
2
2
 
3
3
  > This file is managed by [weave](https://github.com/zijing66/weave) \u2014 a coding-agent harness.
4
4
  > Re-run \`weave init\` to regenerate.
5
5
 
6
6
  `}export function generateClaudeMdSection(e){const{template:n}=e;let t=`${WEAVE_BLOCK_START}
7
- `;return t+=a("claudemd.rules"),(n==="standard"||n==="full")&&(t+=a("claudemd.files")),n==="full"&&(t+=a("claudemd.security")),t+=a("claudemd.skills"),t+=`${WEAVE_BLOCK_END}
8
- `,t}export function generateClaudeMd(e){return r(e.projectName)+generateClaudeMdSection(e)}export function mergeClaudeMd(e,n){const t=e.indexOf(WEAVE_BLOCK_START),i=e.indexOf(WEAVE_BLOCK_END);return t!==-1&&i!==-1&&i>t?e.slice(0,t)+n.trimEnd()+e.slice(i+WEAVE_BLOCK_END.length):e.replace(/\s+$/,"")+`
7
+ `;return t+=r("claudemd.rules"),(n==="standard"||n==="full")&&(t+=r("claudemd.files")),n==="full"&&(t+=r("claudemd.security")),t+=r("claudemd.skills"),t+=r("claudemd.visualize",{dir:d()}),t+=`${WEAVE_BLOCK_END}
8
+ `,t}export function generateClaudeMd(e){return i(e.projectName)+generateClaudeMdSection(e)}export function mergeClaudeMd(e,n){const t=e.indexOf(WEAVE_BLOCK_START),a=e.indexOf(WEAVE_BLOCK_END);return t!==-1&&a!==-1&&a>t?e.slice(0,t)+n.trimEnd()+e.slice(a+WEAVE_BLOCK_END.length):e.replace(/\s+$/,"")+`
9
9
 
10
10
  `+n.trimEnd()+`
11
11
  `}
@@ -1,6 +1,6 @@
1
- import m from"node:path";import{readFile as P,writeFile as g}from"node:fs/promises";import{detectPlatform as x,resolveComponents as B,DEFAULT_HOOKS as H,DEFAULT_MCP as G,HARNESS_DIRS as L,HARNESS_KEYS as V,ensureDir as D,fileExists as Y,logger as S}from"@weavecode/core";import{templateRegistry as j}from"@weavecode/templates";import{WEAVE_VERSION as K}from"@weavecode/server";import{generateClaudeMd as $,generateClaudeMdSection as q,mergeClaudeMd as J}from"./claudemd-gen.js";import{ensureInstructionLink as W}from"./instruction-link.js";import{buildInitRegistry as z}from"./wiring.js";import{createPromptPort as Q}from"./prompt.js";import{commitInitOutputs as X,findGitRepoRoot as Z}from"./git-commit.js";import{ensureHarnessInstalled as tt,prewriteTrust as et}from"./provision.js";import{t as N}from"../i18n/index.js";const st={minimal:"minimal",default:"standard",full:"full"},E=["claude"];async function at(t,n){if(t.harnesses&&t.harnesses.length>0)return[...t.harnesses];if(!t.interactive)return[...E];if(!process.stdin.isTTY||!process.stdout.isTTY)return[...E];const a=await n.multiselect(V,E);return a.length>0?[...a]:[...E]}export async function executeInit(t,n){const{targetDir:a,force:u,interactive:h,preset:T}=t,C=x(),o={directories:[],files:[]},v=[],k=[],b=[],I=[],M=[],r=B(T,t.components),e={...H,...t.hooks},U={...G,...t.mcp},w=n??Q(h);h||S.dim(N("init.nonInteractive"));const d=await at(t,w);try{await tt(d,w)}catch(s){S.warn(s.message)}try{await et(d,a)}catch(s){S.warn(s.message)}const F={...t,platform:C},_=z();for(const s of d){const p=new(_.initFor(s))(F);await p.runSurface();const i=p.records;o.directories.push(...i.created.directories),o.files.push(...i.created.files),v.push(...i.skipped),k.push(...i.merged),b.push(...i.updated),I.push(...i.removed)}if(r.claudeMd||r.agentsMd){const s=await W(a,{force:u,interactive:h,confirm:(f,l)=>w.confirm(f,l)});s.backedUpTo&&(S.dim(N("init.backedUp",{path:s.backedUpTo})),o.files.push(s.backedUpTo));const p=st[T]??"standard",i=m.basename(a),c=m.join(a,s.realFile),y=$({template:p,projectName:i});if(u)await g(c,y,"utf-8"),o.files.push(c);else{const f=await O(c);if(f===null)await g(c,y,"utf-8"),o.files.push(c);else{const l=q({template:p,projectName:i});await g(c,J(f,l),"utf-8"),k.push(c)}}}{const s=m.join(a,".weave");await D(s),o.directories.push(s);const p={initVersion:K,initTimestamp:new Date().toISOString(),preset:T,harnesses:d,components:{settings:r.settings,skills:r.skills,commands:r.commands,agents:r.agents,helpers:r.helpers,mcp:r.mcp,claudeMd:r.claudeMd,agentsMd:r.agentsMd},hooks:e,mcp:U},i=m.join(s,"config.yaml"),c=Object.entries(p).map(([f,l])=>`${f}: ${typeof l=="object"?JSON.stringify(l):l}`).join(`
1
+ import u from"node:path";import{readFile as A,writeFile as g}from"node:fs/promises";import{detectPlatform as _,resolveComponents as H,DEFAULT_HOOKS as L,DEFAULT_MCP as B,HARNESS_DIRS as G,HARNESS_KEYS as V,ensureDir as D,fileExists as Y,logger as S}from"@weavecode/core";import{templateRegistry as b}from"@weavecode/templates";import{WEAVE_VERSION as K}from"@weavecode/server";import{generateClaudeMd as $,generateClaudeMdSection as q,mergeClaudeMd as J}from"./claudemd-gen.js";import{ensureInstructionLink as W}from"./instruction-link.js";import{buildInitRegistry as z}from"./wiring.js";import{createPromptPort as Q}from"./prompt.js";import{commitInitOutputs as X,findGitRepoRoot as Z}from"./git-commit.js";import{ensureHarnessInstalled as ee,prewriteTrust as te}from"./provision.js";import{t as N}from"../i18n/index.js";const se={minimal:"minimal",default:"standard",full:"full"},y=["claude"];async function ne(e,a){if(e.harnesses&&e.harnesses.length>0)return[...e.harnesses];if(!e.interactive)return[...y];if(!process.stdin.isTTY||!process.stdout.isTTY)return[...y];const n=await a.multiselect(V,y);return n.length>0?[...n]:[...y]}export async function executeInit(e,a){const{targetDir:n,force:p,interactive:h,preset:T}=e,M=_(),o={directories:[],files:[]},j=[],k=[],C=[],I=[],R=[],r=H(T,e.components),t={...L,...e.hooks},U={...B,...e.mcp},w=a??Q(h);h||S.dim(N("init.nonInteractive"));const f=await ne(e,w);try{await ee(f,w)}catch(s){S.warn(s.message)}try{await te(f,n)}catch(s){S.warn(s.message)}const O={...e,platform:M},v=z();for(const s of f){const l=new(v.initFor(s))(O);await l.runSurface();const i=l.records;o.directories.push(...i.created.directories),o.files.push(...i.created.files),j.push(...i.skipped),k.push(...i.merged),C.push(...i.updated),I.push(...i.removed)}if(r.claudeMd||r.agentsMd){const s=await W(n,{force:p,interactive:h,confirm:(d,m)=>w.confirm(d,m)});s.backedUpTo&&(S.dim(N("init.backedUp",{path:s.backedUpTo})),o.files.push(s.backedUpTo));const l=se[T]??"standard",i=u.basename(n),c=u.join(n,s.realFile),E=$({template:l,projectName:i});if(p)await g(c,E,"utf-8"),o.files.push(c);else{const d=await P(c);if(d===null)await g(c,E,"utf-8"),o.files.push(c);else{const m=q({template:l,projectName:i});await g(c,J(d,m),"utf-8"),k.push(c)}}}{const s=u.join(n,".weave");await D(s),o.directories.push(s);const l={initVersion:K,initTimestamp:new Date().toISOString(),preset:T,harnesses:f,components:{settings:r.settings,skills:r.skills,commands:r.commands,agents:r.agents,helpers:r.helpers,mcp:r.mcp,claudeMd:r.claudeMd,agentsMd:r.agentsMd},hooks:t,mcp:U},i=u.join(s,"config.yaml"),c=Object.entries(l).map(([d,m])=>`${d}: ${typeof m=="object"?JSON.stringify(m):m}`).join(`
2
2
  `)+`
3
- `,y=await Y(i);await g(i,c,"utf-8"),(y?b:o.files).push(i)}for(const s of d)await R(a,m.join(a,L[s].projectDir),o);await R(a,m.join(a,".weave"),o),await X({targetDir:a,interactive:h,selected:d,prompt:w});const A={skillsCount:j.getByCategory("skill").length,commandsCount:j.getByCategory("command").length,agentsCount:j.getByCategory("agent").length,hooksEnabled:[e.preToolUse,e.postToolUse,e.userPromptSubmit,e.sessionStart,e.stop,e.stopFailure,e.subagentStop,e.subagentStart,e.notification,e.postToolUseFailure,e.permissionRequest,e.permissionDenied,e.preCompact,e.sessionEnd,e.preModelSwitch].filter(Boolean).length};return{success:M.length===0,platform:C,created:o,skipped:v,merged:k,updated:b,removed:I,errors:M,summary:A}}export const NESTED_GITIGNORE=`# weave \u2014 generated; do not commit
3
+ `,E=await Y(i);await g(i,c,"utf-8"),(E?C:o.files).push(i)}for(const s of f)await F(n,u.join(n,G[s].projectDir),o);await F(n,u.join(n,".weave"),o),await X({targetDir:n,interactive:h,selected:f,prompt:w});const x={skillsCount:b.getByCategory("skill").length,commandsCount:b.getByCategory("command").length,agentsCount:b.getByCategory("agent").length,hooksEnabled:[t.preToolUse,t.postToolUse,t.userPromptSubmit,t.sessionStart,t.stop,t.stopFailure,t.subagentStop,t.subagentStart,t.notification,t.postToolUseFailure,t.permissionRequest,t.permissionDenied,t.preCompact,t.sessionEnd,t.preModelSwitch].filter(Boolean).length};return{success:R.length===0,platform:M,created:o,skipped:j,merged:k,updated:C,removed:I,errors:R,summary:x}}export const NESTED_GITIGNORE=`# weave \u2014 generated; do not commit
4
4
  *
5
5
  !.gitignore
6
- `;async function R(t,n,a){if(!await Z(t))return;const u=m.join(n,".gitignore");await O(u)===null&&(await D(n),await g(u,NESTED_GITIGNORE,"utf-8"),a.files.push(u))}async function O(t){try{return await P(t,"utf-8")}catch(n){if(it(n))return null;throw n}}function it(t){return typeof t=="object"&&t!==null&&t.code==="ENOENT"}
6
+ `;async function F(e,a,n){if(!await Z(e))return;const p=u.join(a,".gitignore");await P(p)===null&&(await D(a),await g(p,NESTED_GITIGNORE,"utf-8"),n.files.push(p))}async function P(e){try{return await A(e,"utf-8")}catch(a){if(ie(a))return null;throw a}}function ie(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}
@@ -1,2 +1,2 @@
1
- import f from"node:path";import{execFile as y}from"node:child_process";import{promisify as S}from"node:util";import{lstat as E,stat as I}from"node:fs/promises";import{HARNESS_DIRS as T,INSTRUCTION_FILES as j,logger as c}from"@weavecode/core";import{t as s}from"../i18n/index.js";export async function findGitRepoRoot(i){let r=f.resolve(i);for(;;){try{return(await I(f.join(r,".git"))).isDirectory()?r:null}catch{}const o=f.dirname(r);if(o===r)return null;r=o}}const v=S(y);export const defaultGitExec=async(i,r,o)=>{try{const{stdout:e,stderr:t}=await v(i,r,{cwd:o.cwd,windowsHide:!0,timeout:1e4,maxBuffer:1048576});return{stdout:String(e),stderr:String(t),code:0}}catch(e){const t=e;if(typeof t.code=="number")return{stdout:String(t.stdout??""),stderr:String(t.stderr??""),code:t.code};throw e}};export async function collectCommitPaths(i,r){const o=[...j,".mcp.json",...r.map(t=>T[t].projectDir),".weave"],e=[];for(const t of o)try{await E(f.join(i,t)),e.includes(t)||e.push(t)}catch{}return e}export const COMMIT_MESSAGE="chore: weave init \u751F\u6210\u521D\u59CB\u5316\u4EA7\u7269";export async function commitInitOutputs(i){try{return await D(i)}catch(r){return c.warn(s("init.commit.failed",{error:r instanceof Error?r.message:String(r)})),{status:"failed"}}}async function D({targetDir:i,interactive:r,selected:o,prompt:e,execGit:t=defaultGitExec}){if(!await findGitRepoRoot(i))return{status:"not-repo"};if(!r||!process.stdin.isTTY||!process.stdout.isTTY)return{status:"skipped"};const n=await t("git",["diff","--cached","--quiet"],{cwd:i});if(n.code!==0){if(n.code===1)return c.dim(s("init.commit.preStaged")),{status:"skipped"};throw new Error(n.stderr.trim()||`git diff --cached exited ${n.code}`)}const a=await collectCommitPaths(i,o);if(a.length===0)return{status:"no-changes"};const d=await t("git",["status","--porcelain","--",...a],{cwd:i});if(d.code!==0)throw new Error(d.stderr.trim()||`git status exited ${d.code}`);if(!d.stdout.trim())return{status:"no-changes"};const x=s("init.commit.detail",{paths:a.join(", ")});if(!await e.confirm(s("init.commit.question"),x))return{status:"declined"};const w=[];for(const l of a)(await t("git",["add","--",l],{cwd:i})).code!==0&&w.push(l);w.length>0&&c.warn(s("init.commit.pathIgnored",{paths:w.join(", ")}));const u=await t("git",["diff","--cached","--quiet"],{cwd:i});if(u.code===0)return c.warn(s("init.commit.failed",{error:"nothing staged after git add"})),{status:"no-changes"};if(u.code!==1)throw new Error(u.stderr.trim()||`git diff --cached exited ${u.code}`);const p=(await t("git",["diff","--cached","--name-only"],{cwd:i})).stdout.split(`
2
- `).filter(Boolean).length,m=await t("git",["commit","-m",COMMIT_MESSAGE],{cwd:i});if(m.code!==0)throw new Error(m.stderr.trim()||m.stdout.trim()||`git commit exited ${m.code}`);const g=await t("git",["rev-parse","--short","HEAD"],{cwd:i}),h=g.code===0?g.stdout.trim():"";return c.success(s("init.commit.done",{sha:h,count:p})),{status:"committed",sha:h,count:p}}
1
+ import f from"node:path";import{execFile as S}from"node:child_process";import{promisify as E}from"node:util";import{lstat as x,stat as I}from"node:fs/promises";import{HARNESS_DIRS as T,INSTRUCTION_FILES as j,logger as n}from"@weavecode/core";import{t as s}from"../i18n/index.js";export async function findGitRepoRoot(o){let i=f.resolve(o);for(;;){try{return(await I(f.join(i,".git"))).isDirectory()?i:null}catch{}const e=f.dirname(i);if(e===i)return null;i=e}}const R=E(S);export const defaultGitExec=async(o,i,e)=>{try{const{stdout:r,stderr:t}=await R(o,i,{cwd:e.cwd,windowsHide:!0,timeout:1e4,maxBuffer:1048576});return{stdout:String(r),stderr:String(t),code:0}}catch(r){const t=r;if(typeof t.code=="number")return{stdout:String(t.stdout??""),stderr:String(t.stderr??""),code:t.code};throw r}};export async function collectCommitPaths(o,i){const e=[...j,".mcp.json",...i.map(t=>T[t].projectDir),".weave"],r=[];for(const t of e)try{await x(f.join(o,t)),r.includes(t)||r.push(t)}catch{}return r}export const COMMIT_MESSAGE="chore: weave init \u751F\u6210\u521D\u59CB\u5316\u4EA7\u7269";export async function commitInitOutputs(o){try{return await v(o)}catch(i){return n.warn(s("init.commit.failed",{error:i instanceof Error?i.message:String(i)})),{status:"failed"}}}async function v({targetDir:o,interactive:i,selected:e,prompt:r,execGit:t=defaultGitExec}){if(!await findGitRepoRoot(o))return{status:"not-repo"};if(!i||!process.stdin.isTTY||!process.stdout.isTTY)return{status:"skipped"};const c=await t("git",["diff","--cached","--quiet"],{cwd:o});if(c.code!==0){if(c.code===1)return n.dim(s("init.commit.preStaged")),{status:"skipped"};throw new Error(c.stderr.trim()||`git diff --cached exited ${c.code}`)}const d=await collectCommitPaths(o,e);if(d.length===0)return{status:"no-changes"};const a=await t("git",["status","--porcelain","--",...d],{cwd:o});if(a.code!==0)throw new Error(a.stderr.trim()||`git status exited ${a.code}`);if(!a.stdout.trim())return{status:"no-changes"};const y=s("init.commit.detail",{paths:d.join(", ")});if(!await r.confirm(s("init.commit.question"),y))return{status:"declined"};const p=[];for(const g of d)(await t("git",["add","--",g],{cwd:o})).code!==0&&p.push(g);p.length>0&&n.warn(s("init.commit.pathIgnored",{paths:p.join(", ")}));const m=await t("git",["diff","--cached","--quiet"],{cwd:o});if(m.code===0)return n.warn(s("init.commit.failed",{error:"nothing staged after git add"})),{status:"no-changes"};if(m.code!==1)throw new Error(m.stderr.trim()||`git diff --cached exited ${m.code}`);const w=(await t("git",["diff","--cached","--name-only"],{cwd:o})).stdout.split(`
2
+ `).filter(Boolean).length,u=await t("git",["commit","-m",COMMIT_MESSAGE],{cwd:o});if(u.code!==0)throw new Error(u.stderr.trim()||u.stdout.trim()||`git commit exited ${u.code}`);const h=await t("git",["rev-parse","--short","HEAD"],{cwd:o}),l=h.code===0?h.stdout.trim():"";return n.success(s("init.commit.done",{sha:l,count:w})),{status:"committed",sha:l,count:w}}
@@ -1,7 +1,7 @@
1
- import a from"node:path";import{readFile as f,writeFile as c,readdir as D,unlink as T}from"node:fs/promises";import{DEFAULT_AGENTS as A,DEFAULT_COMMANDS as F,DEFAULT_HOOKS as O,DEFAULT_MCP as J,DEFAULT_SKILLS as N,ensureDir as m,fileExists as w,logger as p,resolveComponents as b,writeFileIfAbsent as y}from"@weavecode/core";import{templateRegistry as d}from"@weavecode/templates";import{generateStatuslineScript as M,readStatuslineConfig as C,WEAVE_VERSION as U}from"@weavecode/server";import{InitPipeline as L,generateHookHandler as P,readUserCapture as _}from"@weavecode/harness";import{generateSettingsJson as I,mergeSettingsJson as R}from"../settings-gen.js";import{generateMcpJson as H,mergeMcpJson as x}from"../mcp-gen.js";import{generateAutoMemoryHook as K}from"../helpers-gen.js";import{registerPluginTemplates as V,collectPluginMcpServers as W}from"../plugin-templates.js";import{t as l}from"../../i18n/index.js";export const WEAVE_HELPER_MARKER="@version weave@";const q={preToolUse:!1,postToolUse:!1,userPromptSubmit:!1,sessionStart:!1,stop:!1,stopFailure:!1,subagentStop:!1,subagentStart:!1,notification:!1,postToolUseFailure:!1,permissionRequest:!1,permissionDenied:!1,preCompact:!1,sessionEnd:!1,preModelSwitch:!1,timeout:5e3,continueOnError:!0};export class ClaudeInitTemplate extends L{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};st;constructor(s){super(s);const i=a.join(s.targetDir,".claude");this.st={targetDir:s.targetDir,force:s.force,platform:s.platform,components:b(s.preset,s.components),hooks:{...O,...s.hooks},skills:{...N,...s.skills},commands:{...F,...s.commands},agents:{...A,...s.agents},mcp:{...J,...s.mcp},claudeDir:i,skillsDir:a.join(i,"skills"),commandsDir:a.join(i,"commands"),agentsDir:a.join(i,"agents"),helpersDir:a.join(i,"helpers"),...this.records}}ensureDirs(){return G(this.st)}writeSettings(){return z(this.st)}writeMcp(){return B(this.st)}copySkills(){return Q(this.st)}copyCommands(){return X(this.st)}copyAgents(){return Y(this.st)}injectPluginTemplates(){return Z(this.st)}writeHelpers(){return $(this.st)}}async function G(t){await m(t.claudeDir),t.created.directories.push(t.claudeDir),t.components.skills&&(await m(t.skillsDir),t.created.directories.push(t.skillsDir)),t.components.commands&&(await m(t.commandsDir),t.created.directories.push(t.commandsDir)),t.components.agents&&(await m(t.agentsDir),t.created.directories.push(t.agentsDir)),t.components.helpers&&(await m(t.helpersDir),t.created.directories.push(t.helpersDir))}async function z(t){if(t.components.settings){const s=await _({home:t.platform.homeDir}),i=s.installed?q:t.hooks;s.installed&&p.dim(l("init.userCaptureActive"));const o=I({components:t.components,hooks:i,platform:t.platform,helpersDir:t.helpersDir}),e=a.join(t.claudeDir,"settings.json");if(t.force)await c(e,JSON.stringify(o,null,2)+`
2
- `,"utf-8"),t.created.files.push(e);else{const r=await S(e);if(r===void 0)await w(e)?(t.skipped.push(e),p.warn(l("init.skippedInvalidJson",{path:e}))):(await c(e,JSON.stringify(o,null,2)+`
3
- `,"utf-8"),t.created.files.push(e));else{const n=R(r,o);await c(e,JSON.stringify(n,null,2)+`
4
- `,"utf-8"),t.merged.push(e)}}}}async function B(t){if(t.components.mcp){const s=H({platform:t.platform,includeWeaveServer:t.mcp.weave}),i=Object.keys(s.mcpServers),o=await W(t.targetDir,void 0,i),e=s.mcpServers;for(const[r,n]of Object.entries(o.servers))e[r]=n;for(const r of o.renamed)p.warn(l("init.pluginMcpRenamed",{renamed:r}));if(Object.keys(e).length>0){const r=a.join(t.targetDir,".mcp.json");if(t.force)await c(r,JSON.stringify(s,null,2)+`
5
- `,"utf-8"),t.created.files.push(r);else{const n=await S(r);if(n===void 0)await w(r)?(t.skipped.push(r),p.warn(l("init.skippedInvalidJson",{path:r}))):(await c(r,JSON.stringify(s,null,2)+`
6
- `,"utf-8"),t.created.files.push(r));else{const u=x(n,s);await c(r,JSON.stringify(u,null,2)+`
7
- `,"utf-8"),t.merged.push(r)}}}else await w(a.join(t.targetDir,".mcp.json"))&&t.skipped.push(a.join(t.targetDir,".mcp.json"))}}async function Q(t){if(t.components.skills&&t.skills.core){const s=d.getSkillsSourceDir();await h(s,t.skillsDir,t.force,t.created,t.skipped)}}async function X(t){if(t.components.commands&&t.commands.core){const s=d.getCommandsSourceDir();await h(s,t.commandsDir,t.force,t.created,t.skipped)}}async function Y(t){if(t.components.agents&&t.agents.core){const s=d.getAgentsSourceDir();await h(s,t.agentsDir,t.force,t.created,t.skipped)}}async function Z(t){try{const{registered:s}=await V(t.targetDir);for(const i of s){const o=d.resolvePath(i);if(i.category==="skill"){await h(o,a.join(t.skillsDir,a.basename(o)),t.force,t.created,t.skipped);continue}const e=i.category==="command"?t.commandsDir:t.agentsDir,r=a.join(e,a.basename(o));try{const n=await f(o,"utf-8");await y(r,n,t.force)?t.created.files.push(r):t.skipped.push(r)}catch(n){p.warn(l("init.copyTemplatesFailed",{srcDir:o,error:String(n)}))}}}catch(s){p.warn(l("init.copyTemplatesFailed",{srcDir:"plugins",error:String(s)}))}}async function $(t){if(t.components.helpers){const s=await C(t.targetDir),i=[["hook-handler.cjs",P(U)],["statusline.cjs",M(s)],["auto-memory-hook.mjs",K()]];for(const[e,r]of i){const n=a.join(t.helpersDir,e);if(t.force){await c(n,r,"utf-8"),t.created.files.push(n);continue}const u=await k(n);u===null?(await c(n,r,"utf-8"),t.created.files.push(n)):u.includes(WEAVE_HELPER_MARKER)?(await c(n,r,"utf-8"),t.updated.push(n)):t.skipped.push(n)}const o=new Set(i.map(([e])=>e));try{for(const e of await D(t.helpersDir,{withFileTypes:!0})){if(!e.isFile()||o.has(e.name))continue;const r=a.join(t.helpersDir,e.name),n=await k(r);n!==null&&n.includes(WEAVE_HELPER_MARKER)&&(await T(r),t.removed.push(r))}}catch{}}}async function k(t){try{return await f(t,"utf-8")}catch(s){if(j(s))return null;throw s}}async function S(t){let s;try{s=await f(t,"utf-8")}catch(i){if(j(i))return;throw i}try{const i=JSON.parse(s);if(typeof i=="object"&&i!==null&&!Array.isArray(i))return i}catch{}}function j(t){return typeof t=="object"&&t!==null&&t.code==="ENOENT"}async function h(t,s,i,o,e){try{const r=await v(t);for(const n of r){const u=a.relative(t,n),g=a.join(s,u),E=await f(n,"utf-8");await y(g,E,i)?o.files.push(g):e.push(g)}}catch(r){p.warn(l("init.copyTemplatesFailed",{srcDir:t,error:String(r)}))}}async function v(t){const s=[];try{const i=await D(t,{withFileTypes:!0});for(const o of i){const e=a.join(t,o.name);o.isDirectory()?s.push(...await v(e)):s.push(e)}}catch{}return s}
1
+ import a from"node:path";import{readFile as d,writeFile as l,readdir as D,unlink as v}from"node:fs/promises";import{DEFAULT_AGENTS as F,DEFAULT_COMMANDS as A,DEFAULT_HOOKS as O,DEFAULT_MCP as C,DEFAULT_SKILLS as J,ensureDir as m,fileExists as w,logger as p,resolveComponents as M,writeFileIfAbsent as y}from"@weavecode/core";import{templateRegistry as g}from"@weavecode/templates";import{generateStatuslineScript as P,readStatuslineConfig as N,WEAVE_VERSION as b}from"@weavecode/server";import{InitPipeline as U,generateHookHandler as _,readUserCapture as R}from"@weavecode/harness";import{generateSettingsJson as I,mergeSettingsJson as L}from"../settings-gen.js";import{generateMcpJson as H,mergeMcpJson as K}from"../mcp-gen.js";import{generateAutoMemoryHook as V}from"../helpers-gen.js";import{registerPluginTemplates as W,collectPluginMcpServers as q}from"../plugin-templates.js";import{t as f}from"../../i18n/index.js";export const WEAVE_HELPER_MARKER="@version weave@";const G={preToolUse:!1,postToolUse:!1,userPromptSubmit:!1,sessionStart:!1,stop:!1,stopFailure:!1,subagentStop:!1,subagentStart:!1,notification:!1,postToolUseFailure:!1,permissionRequest:!1,permissionDenied:!1,preCompact:!1,sessionEnd:!1,preModelSwitch:!1,timeout:5e3,continueOnError:!0};export class ClaudeInitTemplate extends U{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};st;constructor(i){super(i);const t=a.join(i.targetDir,".claude");this.st={targetDir:i.targetDir,force:i.force,platform:i.platform,components:M(i.preset,i.components),hooks:{...O,...i.hooks},skills:{...J,...i.skills},commands:{...A,...i.commands},agents:{...F,...i.agents},mcp:{...C,...i.mcp},claudeDir:t,skillsDir:a.join(t,"skills"),commandsDir:a.join(t,"commands"),agentsDir:a.join(t,"agents"),helpersDir:a.join(t,"helpers"),...this.records}}ensureDirs(){return z(this.st)}writeSettings(){return B(this.st)}writeMcp(){return Q(this.st)}copySkills(){return X(this.st)}copyCommands(){return Y(this.st)}copyAgents(){return Z(this.st)}injectPluginTemplates(){return $(this.st)}writeHelpers(){return x(this.st)}}async function z(e){await m(e.claudeDir),e.created.directories.push(e.claudeDir),e.components.skills&&(await m(e.skillsDir),e.created.directories.push(e.skillsDir)),e.components.commands&&(await m(e.commandsDir),e.created.directories.push(e.commandsDir)),e.components.agents&&(await m(e.agentsDir),e.created.directories.push(e.agentsDir)),e.components.helpers&&(await m(e.helpersDir),e.created.directories.push(e.helpersDir))}async function B(e){if(e.components.settings){const i=await R({home:e.platform.homeDir}),t=i.installed?G:e.hooks;i.installed&&p.dim(f("init.userCaptureActive"));const s=I({components:e.components,hooks:t,platform:e.platform,helpersDir:e.helpersDir}),n=a.join(e.claudeDir,"settings.json");if(e.force)await l(n,JSON.stringify(s,null,2)+`
2
+ `,"utf-8"),e.created.files.push(n);else{const o=await k(n);if(o===void 0)await w(n)?(e.skipped.push(n),p.warn(f("init.skippedInvalidJson",{path:n}))):(await l(n,JSON.stringify(s,null,2)+`
3
+ `,"utf-8"),e.created.files.push(n));else{const r=L(o,s);await l(n,JSON.stringify(r,null,2)+`
4
+ `,"utf-8"),e.merged.push(n)}}}}async function Q(e){if(e.components.mcp){const i=H({platform:e.platform,includeWeaveServer:e.mcp.weave}),t=Object.keys(i.mcpServers),s=await q(e.targetDir,void 0,t),n=i.mcpServers;for(const[r,c]of Object.entries(s.servers))n[r]=c;for(const r of s.renamed)p.warn(f("init.pluginMcpRenamed",{renamed:r}));if(Object.keys(n).length>0){const r=a.join(e.targetDir,".mcp.json");if(e.force)await l(r,JSON.stringify(i,null,2)+`
5
+ `,"utf-8"),e.created.files.push(r);else{const c=await k(r);if(c===void 0)await w(r)?(e.skipped.push(r),p.warn(f("init.skippedInvalidJson",{path:r}))):(await l(r,JSON.stringify(i,null,2)+`
6
+ `,"utf-8"),e.created.files.push(r));else{const u=K(c,i);await l(r,JSON.stringify(u,null,2)+`
7
+ `,"utf-8"),e.merged.push(r)}}}else await w(a.join(e.targetDir,".mcp.json"))&&e.skipped.push(a.join(e.targetDir,".mcp.json"))}}async function X(e){if(e.components.skills&&e.skills.core){const i=g.getSkillsSourceDir();await h(i,e.skillsDir,e.force,e.created,e.skipped)}}async function Y(e){if(e.components.commands&&e.commands.core){const i=g.getCommandsSourceDir();await h(i,e.commandsDir,e.force,e.created,e.skipped)}}async function Z(e){if(e.components.agents&&e.agents.core){const i=g.getAgentsSourceDir();await h(i,e.agentsDir,e.force,e.created,e.skipped)}}async function $(e){try{const{registered:i}=await W(e.targetDir);for(const t of i){const s=g.resolvePath(t);if(t.category==="skill"){await h(s,a.join(e.skillsDir,a.basename(s)),e.force,e.created,e.skipped);continue}const n=t.category==="command"?e.commandsDir:e.agentsDir,o=a.join(n,a.basename(s));try{const r=await d(s,"utf-8");await y(o,r,e.force)?e.created.files.push(o):e.skipped.push(o)}catch(r){p.warn(f("init.copyTemplatesFailed",{srcDir:s,error:String(r)}))}}}catch(i){p.warn(f("init.copyTemplatesFailed",{srcDir:"plugins",error:String(i)}))}}async function x(e){if(e.components.helpers){const i=await N(e.targetDir),t=[["hook-handler.cjs",_(b)],["statusline.cjs",P(i)],["auto-memory-hook.mjs",V()]];for(const[n,o]of t){const r=a.join(e.helpersDir,n);if(e.force){await l(r,o,"utf-8"),e.created.files.push(r);continue}const c=await S(r);c===null?(await l(r,o,"utf-8"),e.created.files.push(r)):c.includes(WEAVE_HELPER_MARKER)?(await l(r,o,"utf-8"),e.updated.push(r)):e.skipped.push(r)}const s=new Set(t.map(([n])=>n));try{for(const n of await D(e.helpersDir,{withFileTypes:!0})){if(!n.isFile()||s.has(n.name))continue;const o=a.join(e.helpersDir,n.name),r=await S(o);r!==null&&r.includes(WEAVE_HELPER_MARKER)&&(await v(o),e.removed.push(o))}}catch{}}}async function S(e){try{return await d(e,"utf-8")}catch(i){if(j(i))return null;throw i}}async function k(e){let i;try{i=await d(e,"utf-8")}catch(t){if(j(t))return;throw t}try{const t=JSON.parse(i);if(typeof t=="object"&&t!==null&&!Array.isArray(t))return t}catch{}}function j(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}async function h(e,i,t,s,n){try{const o=await T(e);for(const r of o){const c=a.relative(e,r),u=a.join(i,c),E=await d(r,"utf-8");await y(u,E,t)?s.files.push(u):n.push(u)}}catch(o){p.warn(f("init.copyTemplatesFailed",{srcDir:e,error:String(o)}))}}async function T(e){const i=[];try{const t=await D(e,{withFileTypes:!0});for(const s of t){const n=a.join(e,s.name);s.isDirectory()?i.push(...await T(n)):i.push(n)}}catch{}return i}
@@ -1 +1 @@
1
- import o from"node:path";import{readdir as m,readFile as k}from"node:fs/promises";import{DEFAULT_SKILLS as f,HARNESS_DIRS as u,ensureDir as n,logger as p,resolveComponents as D,writeFileIfAbsent as w}from"@weavecode/core";import{templateRegistry as y}from"@weavecode/templates";import{InitPipeline as g}from"@weavecode/harness";import{t as a}from"../../i18n/index.js";export class CodexInitTemplate extends g{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};force;components;skills;codexDir;skillsDir;constructor(s){super(s);const i=D(s.preset,s.components),e=o.join(s.targetDir,u.codex.projectDir);this.force=s.force,this.components=i,this.skills={...f,...s.skills},this.codexDir=e,this.skillsDir=o.join(e,"skills")}async ensureDirs(){await n(this.codexDir),this.records.created.directories.push(this.codexDir),this.components.skills&&(await n(this.skillsDir),this.records.created.directories.push(this.skillsDir))}writeSettings(){this.skipNoFace("writeSettings")}writeMcp(){this.skipNoFace("writeMcp")}async copySkills(){if(this.components.skills&&this.skills.core){const s=y.getSkillsSourceDir();await F(s,this.skillsDir,this.force,this.records)}}copyCommands(){this.skipNoFace("copyCommands")}copyAgents(){this.skipNoFace("copyAgents")}injectPluginTemplates(){this.skipNoFace("injectPluginTemplates")}writeHelpers(){this.skipNoFace("writeHelpers")}skipNoFace(s){const i=a("init.noPeerFace");this.skip(s,i),p.dim(a("init.stepSkipped",{step:s,reason:i}))}}async function F(t,s,i,e){try{for(const r of await l(t)){const h=o.relative(t,r),c=o.join(s,h),d=await k(r,"utf-8");await w(c,d,i)?e.created.files.push(c):e.skipped.push(c)}}catch(r){p.warn(a("init.copyTemplatesFailed",{srcDir:t,error:String(r)}))}}async function l(t){const s=[];try{const i=await m(t,{withFileTypes:!0});for(const e of i){const r=o.join(t,e.name);e.isDirectory()?s.push(...await l(r)):s.push(r)}}catch{return s}return s}
1
+ import o from"node:path";import{readdir as d,readFile as k}from"node:fs/promises";import{DEFAULT_SKILLS as f,HARNESS_DIRS as u,ensureDir as l,logger as p,resolveComponents as w,writeFileIfAbsent as D}from"@weavecode/core";import{templateRegistry as y}from"@weavecode/templates";import{InitPipeline as F}from"@weavecode/harness";import{t as n}from"../../i18n/index.js";export class CodexInitTemplate extends F{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};force;components;skills;codexDir;skillsDir;constructor(e){super(e);const i=w(e.preset,e.components),s=o.join(e.targetDir,u.codex.projectDir);this.force=e.force,this.components=i,this.skills={...f,...e.skills},this.codexDir=s,this.skillsDir=o.join(s,"skills")}async ensureDirs(){await l(this.codexDir),this.records.created.directories.push(this.codexDir),this.components.skills&&(await l(this.skillsDir),this.records.created.directories.push(this.skillsDir))}writeSettings(){this.skipNoFace("writeSettings")}writeMcp(){this.skipNoFace("writeMcp")}async copySkills(){if(this.components.skills&&this.skills.core){const e=y.getSkillsSourceDir();await g(e,this.skillsDir,this.force,this.records)}}copyCommands(){this.skipNoFace("copyCommands")}copyAgents(){this.skipNoFace("copyAgents")}injectPluginTemplates(){this.skipNoFace("injectPluginTemplates")}writeHelpers(){this.skipNoFace("writeHelpers")}skipNoFace(e){const i=n("init.noPeerFace");this.skip(e,i),p.dim(n("init.stepSkipped",{step:e,reason:i}))}}async function g(t,e,i,s){try{for(const r of await a(t)){const h=o.relative(t,r),c=o.join(e,h),m=await k(r,"utf-8");await D(c,m,i)?s.created.files.push(c):s.skipped.push(c)}}catch(r){p.warn(n("init.copyTemplatesFailed",{srcDir:t,error:String(r)}))}}async function a(t){const e=[];try{const i=await d(t,{withFileTypes:!0});for(const s of i){const r=o.join(t,s.name);s.isDirectory()?e.push(...await a(r)):e.push(r)}}catch{return e}return e}
@@ -1 +1 @@
1
- import o from"node:path";import{lstat as m,mkdir as p,readFile as u,readlink as b,symlink as g,unlink as f,writeFile as y}from"node:fs/promises";import{INSTRUCTION_FILES as F}from"@weavecode/core";import{t as c}from"../i18n/index.js";const[n,s]=F;async function w(t){try{if((await m(t)).isSymbolicLink()){const a=await b(t);try{return await u(o.resolve(o.dirname(t),a)),{state:"link",target:a}}catch{return{state:"broken-link",target:a}}}return{state:"file"}}catch{return{state:"absent"}}}async function k(t,a,r){const l=o.join(t,a);try{await g(r,l,"file")}catch(e){const i=e.code;throw new Error(c("ilink.linkFailed",{link:a,target:r,path:l,detail:i==="EPERM"||i==="EACCES"||i==="UNKNOWN"?c("ilink.symlinkNotAllowed"):String(e)}))}}async function h(t,a){const r=o.join(t,".weave","backup");await p(r,{recursive:!0});const l=new Date().toISOString().replace(/[:.]/g,"-"),e=o.join(r,`${a}.${l}`);return await y(e,await u(o.join(t,a),"utf-8"),"utf-8"),e}export async function ensureInstructionLink(t,a){const r=o.join(t,n),l=o.join(t,s),e=await w(r),i=await w(l);if(e.state==="link"&&e.target===s&&i.state==="file")return{action:"unchanged",realFile:s};if((i.state==="link"||i.state==="broken-link")&&i.target===n)return{action:"unchanged",realFile:n};if(e.state==="absent"&&i.state==="file")return await k(t,n,s),{action:"adopted",realFile:s};if(i.state==="absent")return(e.state==="link"||e.state==="broken-link")&&await f(r),await k(t,s,n),{action:"created",realFile:n};if(!(a.force||await a.confirm(c("ilink.bothHaveContent"),c("ilink.replaceDetail",{backupDir:".weave/backup/"}))))return{action:"unchanged",realFile:n};const d=i.state==="file"?await h(t,s):void 0;return await f(l),await k(t,s,n),{action:"replaced",realFile:n,backedUpTo:d}}
1
+ import c from"node:path";import{lstat as d,mkdir as h,readFile as k,readlink as b,symlink as g,unlink as f,writeFile as m}from"node:fs/promises";import{INSTRUCTION_FILES as y}from"@weavecode/core";import{t as l}from"../i18n/index.js";const[r,o]=y;async function w(t){try{if((await d(t)).isSymbolicLink()){const a=await b(t);try{return await k(c.resolve(c.dirname(t),a)),{state:"link",target:a}}catch{return{state:"broken-link",target:a}}}return{state:"file"}}catch{return{state:"absent"}}}async function u(t,i,a){const s=c.join(t,i);try{await g(a,s,"file")}catch(e){const n=e.code;throw new Error(l("ilink.linkFailed",{link:i,target:a,path:s,detail:n==="EPERM"||n==="EACCES"||n==="UNKNOWN"?l("ilink.symlinkNotAllowed"):String(e)}))}}async function F(t,i){const a=c.join(t,".weave","backup");await h(a,{recursive:!0});const s=new Date().toISOString().replace(/[:.]/g,"-"),e=c.join(a,`${i}.${s}`);return await m(e,await k(c.join(t,i),"utf-8"),"utf-8"),e}export async function ensureInstructionLink(t,i){const a=c.join(t,r),s=c.join(t,o),e=await w(a),n=await w(s);if(e.state==="link"&&e.target===o&&n.state==="file")return{action:"unchanged",realFile:o};if((n.state==="link"||n.state==="broken-link")&&n.target===r)return{action:"unchanged",realFile:r};if(e.state==="absent"&&n.state==="file")return await u(t,r,o),{action:"adopted",realFile:o};if(n.state==="absent")return(e.state==="link"||e.state==="broken-link")&&await f(a),await u(t,o,r),{action:"created",realFile:r};if(!(i.force?!0:await i.confirm(l("ilink.bothHaveContent"),l("ilink.replaceDetail",{backupDir:".weave/backup/"}))))return{action:"unchanged",realFile:r};const p=n.state==="file"?await F(t,o):void 0;return await f(s),await u(t,o,r),{action:"replaced",realFile:r,backedUpTo:p}}
@@ -1 +1 @@
1
- import o from"node:path";import{readdir as y,readFile as $}from"node:fs/promises";import{detectPlatform as w,WEAVE_PLUGIN_MANIFEST as P,WeavePluginManifestSchema as S}from"@weavecode/core";import{templateRegistry as j}from"@weavecode/templates";async function*g(f,m){const i=[m??o.join(w().configDir,"weave","data","plugins"),o.join(f,".weave","plugins")];for(const e of i){let s;try{s=await y(e)}catch{continue}for(const r of s){const t=o.join(e,r);let n;try{n=JSON.parse(await $(o.join(t,P),"utf8"))}catch{continue}const c=S.safeParse(n);c.success&&(yield{dir:t,manifest:c.data})}}}export async function registerPluginTemplates(f,m){const i=[],e=[];for await(const{dir:s,manifest:r}of g(f,m)){if(!r.templates)continue;const{id:t,templates:n}=r,c={skills:"skill",commands:"command",agents:"agent"};for(const[a,h]of Object.entries(n)){const l=c[a];if(l)for(const d of h??[]){const u=o.resolve(s,d);if(!u.startsWith(o.resolve(s)+o.sep)){e.push(d);continue}const v=o.basename(u).replace(/\.md$/,""),p={name:`${t}:${v}`,category:l,sourcePath:u,description:`${t} \u63D2\u4EF6\u6A21\u677F`};j.register(p)?i.push(p):e.push(p.name)}}}return{registered:i,skipped:e}}export async function collectPluginMcpServers(f,m,i=[]){const e={},s=[],r=new Set(i);for await(const{manifest:t}of g(f,m))if(t.mcpServers)for(const[n,c]of Object.entries(t.mcpServers)){let a=n;r.has(a)&&(a=`${t.id}-${n}`,s.push(`${n} \u2192 ${a}`)),r.add(a),e[a]=c}return{servers:e,renamed:s}}
1
+ import o from"node:path";import{readdir as v,readFile as w}from"node:fs/promises";import{detectPlatform as P,WEAVE_PLUGIN_MANIFEST as $,WeavePluginManifestSchema as S}from"@weavecode/core";import{templateRegistry as j}from"@weavecode/templates";async function*g(f,m){const i=[m??o.join(P().configDir,"weave","data","plugins"),o.join(f,".weave","plugins")];for(const e of i){let n;try{n=await v(e)}catch{continue}for(const r of n){const t=o.join(e,r);let s;try{s=JSON.parse(await w(o.join(t,$),"utf8"))}catch{continue}const c=S.safeParse(s);c.success&&(yield{dir:t,manifest:c.data})}}}export async function registerPluginTemplates(f,m){const i=[],e=[];for await(const{dir:n,manifest:r}of g(f,m)){if(!r.templates)continue;const{id:t,templates:s}=r,c={skills:"skill",commands:"command",agents:"agent"};for(const[a,h]of Object.entries(s)){const u=c[a];if(u)for(const d of h??[]){const p=o.resolve(n,d);if(!p.startsWith(o.resolve(n)+o.sep)){e.push(d);continue}const y=o.basename(p).replace(/\.md$/,""),l={name:`${t}:${y}`,category:u,sourcePath:p,description:`${t} \u63D2\u4EF6\u6A21\u677F`};j.register(l)?i.push(l):e.push(l.name)}}}return{registered:i,skipped:e}}export async function collectPluginMcpServers(f,m,i=[]){const e={},n=[],r=new Set(i);for await(const{manifest:t}of g(f,m))if(t.mcpServers)for(const[s,c]of Object.entries(t.mcpServers)){let a=s;r.has(a)&&(a=`${t.id}-${s}`,n.push(`${s} \u2192 ${a}`)),r.add(a),e[a]=c}return{servers:e,renamed:n}}
@@ -1,5 +1,5 @@
1
- import{logger as m}from"@weavecode/core";import{t as u}from"../i18n/index.js";export async function confirmPrompt(e,l,t){if(!t||!process.stdin.isTTY||!process.stdout.isTTY)return!0;const{createInterface:s}=await import("node:readline/promises"),n=s({input:process.stdin,output:process.stdout});try{const r=await n.question(`
2
- ${e}
1
+ import{logger as m}from"@weavecode/core";import{t as c}from"../i18n/index.js";export async function confirmPrompt(o,l,t){if(!t||!process.stdin.isTTY||!process.stdout.isTTY)return!0;const{createInterface:e}=await import("node:readline/promises"),s=e({input:process.stdin,output:process.stdout});try{const i=await s.question(`
2
+ ${o}
3
3
  ${l}
4
- ${u("init.proceed")} `);return!/^n(o)?$/i.test(r.trim())}finally{n.close()}}export function createPromptPort(e){const l=()=>e&&!!process.stdin.isTTY&&!!process.stdout.isTTY;return{confirm:(t,s="")=>confirmPrompt(t,s,e),async multiselect(t,s){if(!l())return[...s];if(t.length===0)return[];const{createInterface:n}=await import("node:readline/promises"),r=n({input:process.stdin,output:process.stdout});try{console.log(`
5
- ${u("init.multiselect.title")}`),t.forEach((o,i)=>console.log(` ${i+1}) ${o}`));const p=(await r.question(` ${u("init.multiselect.hint",{defaults:s.join(",")})} `)).trim();if(!p)return[...s];const c=[],a=[];for(const o of p.split(/[,\s]+/).filter(Boolean)){const i=(/^\d+$/.test(o)?t[Number(o)-1]:void 0)??t.find(f=>f.toLowerCase()===o.toLowerCase());i===void 0?a.push(o):c.includes(i)||c.push(i)}return a.length>0&&m.warn(u("init.multiselect.invalid",{keys:a.join(", ")})),c.length>0?c:[...s]}finally{r.close()}}}}
4
+ ${c("init.proceed")} `);return!/^n(o)?$/i.test(i.trim())}finally{s.close()}}export function createPromptPort(o){const l=()=>o&&!!process.stdin.isTTY&&!!process.stdout.isTTY;return{confirm:(t,e="")=>confirmPrompt(t,e,o),async multiselect(t,e){if(!l())return[...e];if(t.length===0)return[];const{createInterface:s}=await import("node:readline/promises"),i=s({input:process.stdin,output:process.stdout});try{console.log(`
5
+ ${c("init.multiselect.title")}`),t.forEach((n,f)=>console.log(` ${f+1}) ${n}`));const p=(await i.question(` ${c("init.multiselect.hint",{defaults:e.join(",")})} `)).trim();if(!p)return[...e];const r=[],u=[];for(const n of p.split(/[,\s]+/).filter(Boolean)){const a=(/^\d+$/.test(n)?t[Number(n)-1]:void 0)??t.find(d=>d.toLowerCase()===n.toLowerCase());a===void 0?u.push(n):r.includes(a)||r.push(a)}return u.length>0&&m.warn(c("init.multiselect.invalid",{keys:u.join(", ")})),r.length>0?r:[...e]}finally{i.close()}}}}
@@ -1 +1 @@
1
- import{spawn as u}from"node:child_process";import{HARNESS_DRIVERS as f,HARNESS_INSTALL as w,ensureClaudeTrustAccepted as p,ensureCodexTrustAccepted as h}from"@weavecode/harness";import{probeBinVersion as v}from"@weavecode/server";import{logger as r}from"@weavecode/core";import{t as s}from"../i18n/index.js";const g={versionOf:o=>v(o),runInstall:o=>new Promise((a,i)=>{const t=u(o,{shell:!0,stdio:"inherit",windowsHide:!0});t.on("error",i),t.on("close",n=>n===0?a():i(new Error(`exit ${n}`)))})};export async function ensureHarnessInstalled(o,a,i=g){const t=!!process.stdin.isTTY&&!!process.stdout.isTTY;for(const n of o){const e=f[n].resume;if(!e?.bin)continue;const c=w[n].command,l=await i.versionOf(e.bin);if(l!==null){const m=e.minVersion;m&&!I(l,m)?r.warn(s("init.install.versionLow",{harness:n,version:l,min:m,command:c})):r.dim(s("init.install.installed",{harness:n,version:l})),await y(n,e.bin);continue}if(r.info(s("init.install.notFound",{harness:n})),!t){r.warn(s("init.install.declined",{command:c}));continue}if(await i.versionOf("npm")===null){r.warn(s("init.install.npmMissing",{command:c}));continue}if(!await a.confirm(s("init.install.confirm",{harness:n}),s("init.install.detail",{command:c}))){r.warn(s("init.install.declined",{command:c}));continue}r.dim(s("init.install.running",{harness:n}));try{await i.runInstall(c)}catch{r.warn(s("init.install.verifyFailed",{harness:n,command:c}));continue}const d=await i.versionOf(e.bin);d!==null?r.success(s("init.install.done",{harness:n,version:d})):r.warn(s("init.install.verifyFailed",{harness:n,command:c}))}}async function y(o,a){const i=f[o].provision;if(i)try{const t=await i.check(a);for(let n=0;n<t.warnings.length;n++){const e=t.hints[n];r.warn(s("init.provision.conflict",{harness:o,warning:t.warnings[n],hint:e??""}))}}catch(t){r.warn(s("init.provision.checkFailed",{harness:o,error:t.message}))}}const T={claude:p,codex:h};export async function prewriteTrust(o,a){for(const i of o){const t=T[i];if(t)try{await t(a),r.dim(s("init.trust.prewritten",{harness:i}))}catch(n){r.warn(s("init.trust.failed",{harness:i,error:n.message}))}}}function I(o,a){const i=o.split(".").map(n=>Number.parseInt(n,10)),t=a.split(".").map(n=>Number.parseInt(n,10));for(let n=0;n<3;n++){const e=(i[n]??0)-(t[n]??0);if(e!==0)return e>0}return!0}
1
+ import{spawn as d}from"node:child_process";import{HARNESS_DRIVERS as m,HARNESS_INSTALL as p,ensureClaudeTrustAccepted as w,ensureCodexTrustAccepted as h}from"@weavecode/harness";import{probeBinVersion as v}from"@weavecode/server";import{logger as r}from"@weavecode/core";import{t}from"../i18n/index.js";const T={versionOf:e=>v(e),runInstall:e=>new Promise((a,i)=>{const s=d(e,{shell:!0,stdio:"inherit",windowsHide:!0});s.on("error",i),s.on("close",n=>n===0?a():i(new Error(`exit ${n}`)))})};export async function ensureHarnessInstalled(e,a,i=T){const s=!!process.stdin.isTTY&&!!process.stdout.isTTY;for(const n of e){const o=m[n].resume;if(!o?.bin)continue;const c=p[n].command,l=await i.versionOf(o.bin);if(l!==null){const u=o.minVersion;u&&!y(l,u)?r.warn(t("init.install.versionLow",{harness:n,version:l,min:u,command:c})):r.dim(t("init.install.installed",{harness:n,version:l})),await g(n,o.bin);continue}if(r.info(t("init.install.notFound",{harness:n})),!s){r.warn(t("init.install.declined",{command:c}));continue}if(await i.versionOf("npm")===null){r.warn(t("init.install.npmMissing",{command:c}));continue}if(!await a.confirm(t("init.install.confirm",{harness:n}),t("init.install.detail",{command:c}))){r.warn(t("init.install.declined",{command:c}));continue}r.dim(t("init.install.running",{harness:n}));try{await i.runInstall(c)}catch{r.warn(t("init.install.verifyFailed",{harness:n,command:c}));continue}const f=await i.versionOf(o.bin);f!==null?r.success(t("init.install.done",{harness:n,version:f})):r.warn(t("init.install.verifyFailed",{harness:n,command:c}))}}async function g(e,a){const i=m[e].provision;if(i)try{const s=await i.check(a);for(let n=0;n<s.warnings.length;n++){const o=s.hints[n];r.warn(t("init.provision.conflict",{harness:e,warning:s.warnings[n],hint:o??""}))}}catch(s){r.warn(t("init.provision.checkFailed",{harness:e,error:s.message}))}}const I={claude:w,codex:h};export async function prewriteTrust(e,a){for(const i of e){const s=I[i];if(s)try{await s(a),r.dim(t("init.trust.prewritten",{harness:i}))}catch(n){r.warn(t("init.trust.failed",{harness:i,error:n.message}))}}}function y(e,a){const i=e.split(".").map(n=>Number.parseInt(n,10)),s=a.split(".").map(n=>Number.parseInt(n,10));for(let n=0;n<3;n++){const o=(i[n]??0)-(s[n]??0);if(o!==0)return o>0}return!0}