@weavecode/weave 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/node_modules/@weavecode/cli/dist/cli.js +3 -3
  2. package/node_modules/@weavecode/cli/dist/commands/daemon.d.ts +7 -0
  3. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  4. package/node_modules/@weavecode/cli/dist/commands/dashboard.d.ts +0 -2
  5. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -1
  6. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  7. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  8. package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
  9. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  10. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  11. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +6 -12
  12. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +44 -2
  13. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +6 -12
  14. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.d.ts +2 -3
  15. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +4 -4
  16. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  17. package/node_modules/@weavecode/cli/dist/init/git-commit.js +1 -1
  18. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  19. package/node_modules/@weavecode/cli/dist/init/harnesses/zcode.d.ts +29 -0
  20. package/node_modules/@weavecode/cli/dist/init/harnesses/zcode.js +1 -0
  21. package/node_modules/@weavecode/cli/dist/init/helpers-gen.d.ts +4 -0
  22. package/node_modules/@weavecode/cli/dist/init/helpers-gen.js +1 -20
  23. package/node_modules/@weavecode/cli/dist/init/mcp-gen.d.ts +3 -20
  24. package/node_modules/@weavecode/cli/dist/init/mcp-gen.js +1 -1
  25. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  26. package/node_modules/@weavecode/cli/dist/init/settings-gen.d.ts +3 -30
  27. package/node_modules/@weavecode/cli/dist/init/settings-gen.js +1 -1
  28. package/node_modules/@weavecode/cli/package.json +5 -5
  29. package/node_modules/@weavecode/core/dist/harness.d.ts +45 -2
  30. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  31. package/node_modules/@weavecode/core/dist/index.d.ts +2 -2
  32. package/node_modules/@weavecode/core/dist/index.js +1 -1
  33. package/node_modules/@weavecode/core/dist/terminal.d.ts +28 -4
  34. package/node_modules/@weavecode/core/dist/terminal.js +1 -1
  35. package/node_modules/@weavecode/core/dist/types.d.ts +188 -19
  36. package/node_modules/@weavecode/core/dist/types.js +1 -1
  37. package/node_modules/@weavecode/core/package.json +1 -1
  38. package/node_modules/@weavecode/harness/dist/claude/assets.d.ts +10 -0
  39. package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -1
  40. package/node_modules/@weavecode/harness/dist/claude/capture.d.ts +15 -3
  41. package/node_modules/@weavecode/harness/dist/claude/capture.js +15 -9
  42. package/node_modules/@weavecode/harness/dist/claude/event-source.d.ts +1 -1
  43. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  44. package/node_modules/@weavecode/harness/dist/claude/helpers-gen.d.ts +5 -0
  45. package/node_modules/@weavecode/harness/dist/claude/helpers-gen.js +20 -0
  46. package/node_modules/@weavecode/harness/dist/claude/index.d.ts +10 -1
  47. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  48. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.d.ts +22 -0
  49. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -0
  50. package/node_modules/@weavecode/harness/dist/claude/messaging.d.ts +11 -2
  51. package/node_modules/@weavecode/harness/dist/claude/messaging.js +4 -1
  52. package/node_modules/@weavecode/harness/dist/claude/model-aliases.d.ts +39 -0
  53. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -0
  54. package/node_modules/@weavecode/harness/dist/claude/plan.d.ts +2 -0
  55. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -0
  56. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -1
  57. package/node_modules/@weavecode/harness/dist/claude/settings-gen.d.ts +32 -0
  58. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -0
  59. package/node_modules/@weavecode/harness/dist/claude/side-question.d.ts +12 -0
  60. package/node_modules/@weavecode/harness/dist/claude/side-question.js +1 -0
  61. package/node_modules/@weavecode/harness/dist/claude/statusline/config.d.ts +200 -0
  62. package/node_modules/@weavecode/harness/dist/claude/statusline/config.js +1 -0
  63. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.d.ts +12 -0
  64. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +745 -0
  65. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.d.ts +10 -0
  66. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -0
  67. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.d.ts +20 -0
  68. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -0
  69. package/node_modules/@weavecode/harness/dist/claude/transcript.d.ts +16 -0
  70. package/node_modules/@weavecode/harness/dist/claude/transcript.js +4 -2
  71. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  72. package/node_modules/@weavecode/harness/dist/codex/index.d.ts +1 -0
  73. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  74. package/node_modules/@weavecode/harness/dist/codex/mcp.d.ts +30 -0
  75. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -0
  76. package/node_modules/@weavecode/harness/dist/codex/messaging.js +1 -1
  77. package/node_modules/@weavecode/harness/dist/driver.d.ts +168 -3
  78. package/node_modules/@weavecode/harness/dist/index.d.ts +1 -0
  79. package/node_modules/@weavecode/harness/dist/index.js +1 -1
  80. package/node_modules/@weavecode/harness/dist/init/generated.d.ts +37 -0
  81. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -0
  82. package/node_modules/@weavecode/harness/dist/registry-wiring.d.ts +3 -1
  83. package/node_modules/@weavecode/harness/dist/zcode/assets.d.ts +8 -0
  84. package/node_modules/@weavecode/harness/dist/zcode/assets.js +1 -0
  85. package/node_modules/@weavecode/harness/dist/zcode/capture.d.ts +36 -0
  86. package/node_modules/@weavecode/harness/dist/zcode/capture.js +3 -0
  87. package/node_modules/@weavecode/harness/dist/zcode/detect.d.ts +2 -0
  88. package/node_modules/@weavecode/harness/dist/zcode/detect.js +1 -0
  89. package/node_modules/@weavecode/harness/dist/zcode/event-source.d.ts +8 -0
  90. package/node_modules/@weavecode/harness/dist/zcode/event-source.js +1 -0
  91. package/node_modules/@weavecode/harness/dist/zcode/index.d.ts +13 -0
  92. package/node_modules/@weavecode/harness/dist/zcode/index.js +1 -0
  93. package/node_modules/@weavecode/harness/dist/zcode/mcp.d.ts +6 -0
  94. package/node_modules/@weavecode/harness/dist/zcode/mcp.js +2 -0
  95. package/node_modules/@weavecode/harness/dist/zcode/messaging.d.ts +13 -0
  96. package/node_modules/@weavecode/harness/dist/zcode/messaging.js +1 -0
  97. package/node_modules/@weavecode/harness/dist/zcode/resume.d.ts +7 -0
  98. package/node_modules/@weavecode/harness/dist/zcode/resume.js +1 -0
  99. package/node_modules/@weavecode/harness/package.json +2 -2
  100. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  101. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  102. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  103. package/node_modules/@weavecode/server/dist/daemon/api-log.d.ts +48 -0
  104. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -0
  105. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  106. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
  107. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  108. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.js +1 -1
  109. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  110. package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
  111. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  112. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  113. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.d.ts +13 -1
  114. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  115. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  116. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  117. package/node_modules/@weavecode/server/dist/daemon/opener.d.ts +102 -19
  118. package/node_modules/@weavecode/server/dist/daemon/opener.js +97 -7
  119. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  120. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  121. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.d.ts +4 -3
  122. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  123. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +15 -0
  124. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -6
  125. package/node_modules/@weavecode/server/dist/daemon/session-probe.d.ts +72 -2
  126. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  127. package/node_modules/@weavecode/server/dist/daemon/settings.d.ts +10 -0
  128. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  129. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.d.ts +7 -1
  130. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  131. package/node_modules/@weavecode/server/dist/daemon/sse-hub.d.ts +40 -0
  132. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -0
  133. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  134. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  135. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  136. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.d.ts +4 -1
  137. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  138. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  139. package/node_modules/@weavecode/server/dist/db/db.js +38 -2
  140. package/node_modules/@weavecode/server/dist/db/paths.d.ts +4 -0
  141. package/node_modules/@weavecode/server/dist/db/paths.js +1 -1
  142. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  143. package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +5 -0
  144. package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
  145. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  146. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  147. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  148. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.d.ts +17 -4
  149. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -1
  150. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.d.ts +27 -6
  151. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  152. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  153. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.d.ts +200 -13
  154. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +3 -2
  155. package/node_modules/@weavecode/server/dist/hooks/mirror.d.ts +9 -4
  156. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  157. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  158. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  159. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  160. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  161. package/node_modules/@weavecode/server/dist/hooks/promptbox.d.ts +13 -0
  162. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  163. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  164. package/node_modules/@weavecode/server/dist/hooks/question-tracker.d.ts +6 -4
  165. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  166. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  167. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  168. package/node_modules/@weavecode/server/dist/hooks/sequence-engine.js +1 -1
  169. package/node_modules/@weavecode/server/dist/hooks/session-purge.d.ts +7 -0
  170. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  171. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.d.ts +5 -8
  172. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.js +1 -1
  173. package/node_modules/@weavecode/server/dist/hooks/side-questions.d.ts +41 -0
  174. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -0
  175. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  176. package/node_modules/@weavecode/server/dist/hooks/toolkit.d.ts +8 -0
  177. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  178. package/node_modules/@weavecode/server/dist/hooks/watch-engine.d.ts +7 -0
  179. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  180. package/node_modules/@weavecode/server/dist/index.d.ts +1 -1
  181. package/node_modules/@weavecode/server/dist/install/apply-update.d.ts +1 -1
  182. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  183. package/node_modules/@weavecode/server/dist/install/capabilities.d.ts +10 -0
  184. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  185. package/node_modules/@weavecode/server/dist/install/codex-toml.d.ts +8 -26
  186. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  187. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  188. package/node_modules/@weavecode/server/dist/install/fingerprint.d.ts +5 -1
  189. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  190. package/node_modules/@weavecode/server/dist/install/git-classify.d.ts +30 -0
  191. package/node_modules/@weavecode/server/dist/install/git-classify.js +1 -0
  192. package/node_modules/@weavecode/server/dist/install/global-config.d.ts +2 -4
  193. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -2
  194. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  195. package/node_modules/@weavecode/server/dist/install/init-files.d.ts +46 -0
  196. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -0
  197. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  198. package/node_modules/@weavecode/server/dist/install/installer.d.ts +3 -5
  199. package/node_modules/@weavecode/server/dist/install/installer.js +1 -3
  200. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  201. package/node_modules/@weavecode/server/dist/install/mcp-rows.d.ts +5 -5
  202. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  203. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  204. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  205. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  206. package/node_modules/@weavecode/server/dist/install/project-config.d.ts +0 -2
  207. package/node_modules/@weavecode/server/dist/install/project-config.js +2 -2
  208. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  209. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  210. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  211. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  212. package/node_modules/@weavecode/server/dist/install/updates.d.ts +17 -5
  213. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  214. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  215. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  216. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  217. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  218. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  219. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  220. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  221. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
  222. package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +7 -0
  223. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +2 -2
  224. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  225. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  226. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  227. package/node_modules/@weavecode/server/dist/repositories/projects.d.ts +7 -0
  228. package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
  229. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  230. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  231. package/node_modules/@weavecode/server/dist/repositories/sessions.d.ts +32 -8
  232. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  233. package/node_modules/@weavecode/server/dist/repositories/side-questions.d.ts +50 -0
  234. package/node_modules/@weavecode/server/dist/repositories/side-questions.js +6 -0
  235. package/node_modules/@weavecode/server/dist/repositories/uploads.d.ts +66 -0
  236. package/node_modules/@weavecode/server/dist/repositories/uploads.js +7 -0
  237. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  238. package/node_modules/@weavecode/server/dist/statusline/config.d.ts +4 -198
  239. package/node_modules/@weavecode/server/dist/statusline/config.js +1 -1
  240. package/node_modules/@weavecode/server/dist/statusline/generator.d.ts +5 -0
  241. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -676
  242. package/node_modules/@weavecode/server/dist/statusline/manager.d.ts +7 -5
  243. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -4
  244. package/node_modules/@weavecode/server/dist/surfaces.d.ts +11 -1
  245. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  246. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  247. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  248. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  249. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.d.ts +8 -4
  250. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  251. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  252. package/node_modules/@weavecode/server/package.json +4 -4
  253. package/node_modules/@weavecode/server/web/dist/assets/index-CHWbLAje.js +594 -0
  254. package/node_modules/@weavecode/server/web/dist/assets/index-D0s5v8QS.css +11 -0
  255. package/node_modules/@weavecode/server/web/dist/index.html +14 -2
  256. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-plugin-creator/skills/weave-plugin-creator/SKILL.md +2 -2
  257. package/node_modules/@weavecode/templates/package.json +2 -2
  258. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/asn1js/README.md +50 -32
  259. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/asn1js/build/index.d.ts +86 -40
  260. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/asn1js/build/index.es.js +860 -353
  261. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/asn1js/build/index.js +860 -353
  262. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/asn1js/package.json +20 -17
  263. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/node_modules/asn1js/README.md +50 -32
  264. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/node_modules/asn1js/build/index.d.ts +86 -40
  265. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/node_modules/asn1js/build/index.es.js +860 -353
  266. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/node_modules/asn1js/build/index.js +860 -353
  267. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/node_modules/asn1js/package.json +20 -17
  268. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/node_modules/asn1js/README.md +50 -32
  269. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/node_modules/asn1js/build/index.d.ts +86 -40
  270. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/node_modules/asn1js/build/index.es.js +860 -353
  271. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/node_modules/asn1js/build/index.js +860 -353
  272. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/node_modules/asn1js/package.json +20 -17
  273. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/asn1js/README.md +50 -32
  274. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/asn1js/build/index.d.ts +86 -40
  275. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/asn1js/build/index.es.js +860 -353
  276. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/asn1js/build/index.js +860 -353
  277. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/asn1js/package.json +20 -17
  278. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/node_modules/asn1js/README.md +50 -32
  279. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/node_modules/asn1js/build/index.d.ts +86 -40
  280. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/node_modules/asn1js/build/index.es.js +860 -353
  281. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/node_modules/asn1js/build/index.js +860 -353
  282. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/node_modules/asn1js/package.json +20 -17
  283. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/node_modules/asn1js/README.md +50 -32
  284. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/node_modules/asn1js/build/index.d.ts +86 -40
  285. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/node_modules/asn1js/build/index.es.js +860 -353
  286. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/node_modules/asn1js/build/index.js +860 -353
  287. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/node_modules/asn1js/package.json +20 -17
  288. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/node_modules/asn1js/README.md +50 -32
  289. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/node_modules/asn1js/build/index.d.ts +86 -40
  290. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/node_modules/asn1js/build/index.es.js +860 -353
  291. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/node_modules/asn1js/build/index.js +860 -353
  292. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/node_modules/asn1js/package.json +20 -17
  293. package/node_modules/selfsigned/node_modules/pkijs/node_modules/asn1js/README.md +50 -32
  294. package/node_modules/selfsigned/node_modules/pkijs/node_modules/asn1js/build/index.d.ts +86 -40
  295. package/node_modules/selfsigned/node_modules/pkijs/node_modules/asn1js/build/index.es.js +860 -353
  296. package/node_modules/selfsigned/node_modules/pkijs/node_modules/asn1js/build/index.js +860 -353
  297. package/node_modules/selfsigned/node_modules/pkijs/node_modules/asn1js/package.json +20 -17
  298. package/package.json +6 -6
  299. package/node_modules/@weavecode/server/web/dist/assets/index-BOzaRlQE.js +0 -560
  300. package/node_modules/@weavecode/server/web/dist/assets/index-ChX8G8cT.css +0 -11
@@ -1,4 +1,4 @@
1
- import{readFileSync as f}from"node:fs";import l from"node:path";import{fileURLToPath as g}from"node:url";import{CommandParser as h}from"./parser.js";import{initCommand as u}from"./commands/init.js";import{statusCommand as C}from"./commands/status.js";import{daemonCommand as $}from"./commands/daemon.js";import{dashboardCommand as b}from"./commands/dashboard.js";import{scanCommand as w}from"./commands/scan.js";import{chpassCommand as x}from"./commands/chpass.js";import{doctorCommand as E}from"./commands/doctor.js";import{uninstallCommand as S}from"./commands/uninstall.js";import{initCliLocale as j,t as r}from"./i18n/index.js";const v=l.dirname(g(import.meta.url));function d(){try{return JSON.parse(f(l.join(v,"..","package.json"),"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}function L(a){if(a.description){console.log(` ${a.name.padEnd(12)}${r(a.description)}`);for(const n of a.subcommands??[]){const o=[n.name,...n.aliases??[]].join(", "),s=n.description?r(n.description):"";console.log(` ${o.padEnd(12)}${s}`)}}}function m(a){const n=d();console.log(`${r("help.tagline",{version:n})}
1
+ import{readFileSync as f}from"node:fs";import l from"node:path";import{fileURLToPath as g}from"node:url";import{CommandParser as h}from"./parser.js";import{initCommand as u}from"./commands/init.js";import{statusCommand as C}from"./commands/status.js";import{daemonCommand as $}from"./commands/daemon.js";import{dashboardCommand as b}from"./commands/dashboard.js";import{scanCommand as w}from"./commands/scan.js";import{chpassCommand as x}from"./commands/chpass.js";import{doctorCommand as E}from"./commands/doctor.js";import{uninstallCommand as S}from"./commands/uninstall.js";import{initCliLocale as j,t as r}from"./i18n/index.js";const v=l.dirname(g(import.meta.url));function d(){try{return JSON.parse(f(l.join(v,"..","package.json"),"utf-8")).version??"0.0.0"}catch{return"0.0.0"}}function P(a){if(a.description){console.log(` ${a.name.padEnd(12)}${r(a.description)}`);for(const n of a.subcommands??[]){const o=[n.name,...n.aliases??[]].join(", "),s=n.description?r(n.description):"";console.log(` ${o.padEnd(12)}${s}`)}}}function m(a){const n=d();console.log(`${r("help.tagline",{version:n})}
2
2
  `),console.log(`${r("help.usage")}
3
- `),console.log(r("help.commands"));for(const o of a.getAllCommands())L(o);console.log(`
4
- ${r("help.globalOptions")}`);for(const o of a.getGlobalOptions()){const s=o.short?`-${o.short}, --${o.name}`:` --${o.name}`;console.log(` ${s.padEnd(20)}${r(o.description)}`)}}function P(a){console.error(r("help.subcommands"));for(const n of a.subcommands??[]){const o=[n.name,...n.aliases??[]].join(", "),s=n.description?r(n.description):"";console.error(` ${o.padEnd(12)}${s}`)}}export class CLI{parser;constructor(){this.parser=new h,this.registerCommands()}registerCommands(){this.parser.registerCommand(u),this.parser.registerCommand(S),this.parser.registerCommand(C),this.parser.registerCommand($),this.parser.registerCommand(b),this.parser.registerCommand(w),this.parser.registerCommand(x),this.parser.registerCommand(E)}async run(n=process.argv.slice(2)){delete process.env.CLAUDE_CODE_CHILD_SESSION,await j();const o=this.parser.parse(n);if(o.flags.version){console.log(d());return}if(o.flags.help||o.command.length===0){m(this.parser);return}let s;for(const e of o.command)s=(s?s.subcommands?.find(c=>c.name===e||c.aliases?.includes(e)):this.parser.getCommand(e))??s;if(!s?.action){if(s?.subcommands?.length){const e=o.positional[0];console.error(e?r("cli.unknownSubcommand",{command:s.name,subcommand:e}):r("cli.missingSubcommand",{command:s.name})),P(s),process.exit(1)}console.error(r("cli.unknownCommand",{command:o.command.join(" ")})),m(this.parser),process.exit(1)}const i=s.maxPositionals??0;if(o.positional.length>i){const e=o.command.join(" ");console.error(r("cli.unexpectedPositional",{command:e,arg:o.positional[i]})),m(this.parser),process.exit(1)}const t=this.parser.validateFlags(o.flags,s);if(t.length>0){for(const e of t)console.error(r("cli.error",{error:e}));process.exit(1)}const p={commandPath:o.command,flags:o.flags,positional:o.positional,raw:o.raw};await s.action(p)}}
3
+ `),console.log(r("help.commands"));for(const o of a.getAllCommands())P(o);console.log(`
4
+ ${r("help.globalOptions")}`);for(const o of a.getGlobalOptions()){const s=o.short?`-${o.short}, --${o.name}`:` --${o.name}`;console.log(` ${s.padEnd(20)}${r(o.description)}`)}}function L(a){console.error(r("help.subcommands"));for(const n of a.subcommands??[]){const o=[n.name,...n.aliases??[]].join(", "),s=n.description?r(n.description):"";console.error(` ${o.padEnd(12)}${s}`)}}export class CLI{parser;constructor(){this.parser=new h,this.registerCommands()}registerCommands(){this.parser.registerCommand(u),this.parser.registerCommand(S),this.parser.registerCommand(C),this.parser.registerCommand($),this.parser.registerCommand(b),this.parser.registerCommand(w),this.parser.registerCommand(x),this.parser.registerCommand(E)}async run(n=process.argv.slice(2)){delete process.env.CLAUDE_CODE_CHILD_SESSION,await j();const o=this.parser.parse(n);if(o.flags.version){console.log(d());return}if(o.flags.help||o.command.length===0){m(this.parser);return}let s;for(const e of o.command)s=(s?s.subcommands?.find(c=>c.name===e||c.aliases?.includes(e)):this.parser.getCommand(e))??s;if(!s?.action){if(s?.subcommands?.length){const e=o.positional[0];console.error(e?r("cli.unknownSubcommand",{command:s.name,subcommand:e}):r("cli.missingSubcommand",{command:s.name})),L(s),process.exit(1)}console.error(r("cli.unknownCommand",{command:o.command.join(" ")})),m(this.parser),process.exit(1)}const i=s.maxPositionals??0;if(o.positional.length>i){const e=o.command.join(" ");console.error(r("cli.unexpectedPositional",{command:e,arg:o.positional[i]})),m(this.parser),process.exit(1)}const t=this.parser.validateFlags(o.flags,s);if(t.length>0){for(const e of t)console.error(r("cli.error",{error:e}));process.exit(1)}const p={commandPath:o.command,flags:o.flags,positional:o.positional,raw:o.raw};await s.action(p)}}
@@ -6,6 +6,13 @@ export interface DaemonHandle {
6
6
  /** False when an already-running daemon was reused. */
7
7
  started: boolean;
8
8
  }
9
+ /**
10
+ * 等守护进程真能应答。/health 是它起好的标志:`spawn` 返回的只是子进程,此刻
11
+ * 它连模块都还没加载完——首启的初始密码标记文件、auth.json 都是启动过程中才写
12
+ * 出的,早一步问就扑空(`weave dashboard` 因此首次运行默默不打印密码),紧接着
13
+ * 的 HTTP 请求也会连不上(`weave chpass`)。超时就不再等,让后续请求照常报错。
14
+ */
15
+ export declare function waitForDaemon(port: number, timeoutMs?: number): Promise<boolean>;
9
16
  /**
10
17
  * Ensure a daemon is running and return how to reach it.
11
18
  *
@@ -1,2 +1,2 @@
1
- import{spawn as m}from"node:child_process";import{DEFAULT_PORT as s,DAEMON_HOST as i,isPortFree as u,findFreePort as f,readDaemonState as c,writeDaemonState as l,clearDaemonState as w,resolveDaemonEntry as h,accessUrls as g}from"@weavecode/server";import{logger as n}from"@weavecode/core";import{t as e}from"../i18n/index.js";export async function probeDaemon(t){try{const a=await fetch(`http://${i}:${t}/health`);return a.ok?(await a.json()).service==="weave-daemon":!1}catch{return!1}}export async function ensureDaemonRunning(){const t=c();if(t&&await probeDaemon(t.port))return{port:t.port,started:!1};if(await probeDaemon(s))return{port:s,started:!1};const a=await u(s)?s:await f(s+1);l({pid:0,port:a,startedAt:new Date().toISOString()});const o=h();return m(process.execPath,o.isTs?["--import","tsx",o.path]:[o.path],{detached:!0,stdio:"ignore"}).unref(),{port:a,started:!0}}async function y(){const t=await ensureDaemonRunning();if(!t.started){n.info(e("out.daemon.alreadyRunning",{port:t.port}));return}n.success(e("out.daemon.started",{host:i,port:t.port}))}async function d(t){return await(await fetch(`http://${i}:${t}/health`)).json()}async function D(){const t=c(),a=t?.port??s;let o=t?.pid;if(await probeDaemon(a))o=(await d(a)).pid;else if(!t){n.info(e("out.daemon.statusNotRunning"));return}let r;if(o)try{process.kill(o),r=o}catch{}w(),r!==void 0?n.success(e("out.daemon.stopped",{pid:r})):n.warn(e("out.daemon.statusStale",{pid:o??0,port:a}))}async function S(){const t=c(),a=t?.port??s;if(await probeDaemon(a)){const o=await d(a);n.info(e("out.daemon.statusRunning",{pid:o.pid,port:o.port,uptime:Math.round(o.uptimeMs/1e3)}));const r=g(a,t?.tlsPort??0);r.length>0&&(n.dim(e("out.daemon.urlsTitle")),n.dim(r.map(p=>` ${p.url}`).join(`
2
- `)))}else t?n.warn(e("out.daemon.statusStale",{pid:t.pid,port:t.port})):n.info(e("out.daemon.statusNotRunning"))}export const daemonCommand={name:"daemon",description:"cmd.daemon.desc",subcommands:[{name:"start",description:"cmd.daemon.start.desc",action:y},{name:"stop",description:"cmd.daemon.stop.desc",action:D},{name:"status",description:"cmd.daemon.status.desc",action:S}]};
1
+ import{spawn as u}from"node:child_process";import{DEFAULT_PORT as i,DAEMON_HOST as d,isPortFree as h,findFreePort as g,readDaemonState as m,writeDaemonState as y,clearDaemonState as D,resolveDaemonEntry as $,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://${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(n=>setTimeout(n,100))}return!0}async function x(t,e){if(process.platform!=="win32")return!1;const o=s=>/\s/.test(s)?`"${s}"`:s,n=s=>`'${s.replace(/'/g,"''")}'`,c=`$ErrorActionPreference='Stop';$r=Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine=${n([t,...e].map(o).join(" "))};CurrentDirectory=${n(process.cwd())}};if($r.ReturnValue -ne 0){exit 1}`,w=Buffer.from(c,"utf16le").toString("base64");return new Promise(s=>{const p=u("powershell.exe",["-NoProfile","-NonInteractive","-EncodedCommand",w],{windowsHide:!0,stdio:"ignore"});p.on("error",()=>s(!1)),p.on("exit",l=>s(l===0))})}export async function ensureDaemonRunning(){const t=m();if(t&&await probeDaemon(t.port))return{port:t.port,started:!1};if(await probeDaemon(i))return{port:i,started:!1};const e=await h(i)?i:await g(i+1);y({pid:0,port:e,startedAt:new Date().toISOString()});const o=$(),n=o.isTs?["--import","tsx",o.path]:[o.path];return await x(process.execPath,n)||u(process.execPath,n,{detached:!0,stdio:"ignore"}).unref(),await waitForDaemon(e),{port:e,started:!0}}async function S(){const t=await ensureDaemonRunning();if(!t.started){a.info(r("out.daemon.alreadyRunning",{port:t.port}));return}a.success(r("out.daemon.started",{host:d,port:t.port}))}async function f(t){return await(await fetch(`http://${d}:${t}/health`)).json()}async function C(){const t=m(),e=t?.port??i;let o=t?.pid;if(await probeDaemon(e))o=(await f(e)).pid;else if(!t){a.info(r("out.daemon.statusNotRunning"));return}let n;if(o)try{process.kill(o),n=o}catch{}D(),n!==void 0?a.success(r("out.daemon.stopped",{pid:n})):a.warn(r("out.daemon.statusStale",{pid:o??0,port:e}))}async function N(){const t=m(),e=t?.port??i;if(await probeDaemon(e)){const o=await f(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(c=>` ${c.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:C},{name:"status",description:"cmd.daemon.status.desc",action:N}]};
@@ -10,6 +10,4 @@ import type { Command } from '../parser.js';
10
10
  export declare function openBrowser(url: string): void;
11
11
  /** The console URL for a daemon port. */
12
12
  export declare function dashboardUrl(port: number): string;
13
- /** 绑非回环时的局域网访问地址(IPv4 非内部);绑回环 / 无状态文件 → 空表。 */
14
- export declare function lanUrls(port: number): string[];
15
13
  export declare const dashboardCommand: Command;
@@ -1 +1,2 @@
1
- import{spawn as i}from"node:child_process";import{networkInterfaces as p}from"node:os";import{DAEMON_HOST as d,readDaemonState as c,resolveStaticDir as m}from"@weavecode/server";import{logger as t}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[a,o]=process.platform==="win32"?["cmd",["/c","start","",r]]:process.platform==="darwin"?["open",[r]]:["xdg-open",[r]],s=i(a,o,{detached:!0,stdio:"ignore"});s.on("error",()=>{t.dim(n("out.dash.browserFailed"))}),s.unref()}export function dashboardUrl(r){return`http://${d}:${r}/`}export function lanUrls(r){const a=c()?.host;if(!a||a==="127.0.0.1"||a==="localhost")return[];const o=[];for(const s of Object.values(p()))for(const e of s??[])e.family==="IPv4"&&!e.internal&&o.push(`http://${e.address}:${r}/`);return o}async function l(r){const a=!!r.flags.noOpen,o=await u();o.started?(t.success(n("out.daemon.started",{host:d,port:o.port})),t.dim(n("out.dash.stopHint"))):t.info(n("out.daemon.alreadyRunning",{port:o.port})),m()||(t.warn(n("out.dash.noBundle")),t.dim(n("out.dash.buildHint")));const s=dashboardUrl(o.port);t.info(n("out.dash.url",{url:s}));for(const e of lanUrls(o.port))t.info(n("out.dash.lanUrl",{url:e}));if(f(),a){t.dim(n("out.dash.noOpen"));return}openBrowser(s)}export const dashboardCommand={name:"dashboard",aliases:["dash"],description:"cmd.dashboard.desc",options:[{name:"no-open",description:"flag.dashboard.noOpen",type:"boolean",default:!1}],action:l};
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 as a}from"../i18n/index.js";import{ensureDaemonRunning as l}from"./daemon.js";import{announceInitialPassword as f}from"./daemon-auth.js";export function openBrowser(r){const[s,n]=process.platform==="win32"?["cmd",["/c","start","",r]]:process.platform==="darwin"?["open",[r]]:["xdg-open",[r]],t=p(s,n,{detached:!0,stdio:"ignore"});t.on("error",()=>{o.dim(a("out.dash.browserFailed"))}),t.unref()}export function dashboardUrl(r){return`http://${d}:${r}/`}async function h(r){const s=!!r.flags.noOpen,n=await l();n.started?(o.success(a("out.daemon.started",{host:d,port:n.port})),o.dim(a("out.dash.stopHint"))):o.info(a("out.daemon.alreadyRunning",{port:n.port})),c()||(o.warn(a("out.dash.noBundle")),o.dim(a("out.dash.buildHint")));const t=dashboardUrl(n.port);o.info(a("out.dash.url",{url:t}));const e=m(n.port,u()?.tlsPort??0);if(e.length>0&&(o.dim(a("out.daemon.urlsTitle")),o.dim(e.map(i=>` ${i.url}`).join(`
2
+ `))),f(),s){o.dim(a("out.dash.noOpen"));return}openBrowser(t)}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 p}from"node:fs";import u from"node:path";import{DEFAULT_PORT as w,getDbPath as k,openDatabase as h,ProjectRepository as v,readDaemonState as x}from"@weavecode/server";import{formatTable as y,logger as r}from"@weavecode/core";import{checkHarness as S}from"../init/harness-checks.js";import{probeDaemon as D}from"./daemon.js";import{t as o}from"../i18n/index.js";const g=i=>{const t=u.resolve(i);return process.platform==="win32"?t.toLowerCase():t};function A(i){if(!m(k()))return null;const t=h();try{const s=new v(t),d=g(i),n=[...s.list(),...s.listArchived()].find(e=>g(e.path)===d);return n?{id:n.id,source:n.source,archived:n.archivedAt!==null,token:n.token}:null}finally{t.close()}}function T(i){const t=u.join(i,".weave","token");return m(t)?p(t,"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(i){const t=u.resolve(String(i.flags.dir??process.cwd())),s=m(u.join(t,".weave","config.yaml")),d=x()?.port??w,n=await D(d),e=A(t),a=T(t);let c;a===null?c=o("out.doctor.tokenMissing"):e?a===e.token?c=o("out.doctor.tokenOk"):c=o("out.doctor.tokenStale"):c=o("out.doctor.tokenUnregistered"),r.info(o("out.doctor.header")),console.log(y([[o("out.doctor.dir"),t],[o("out.doctor.initialized"),s?o("out.doctor.yes"):o("out.doctor.no")],[o("out.doctor.daemon"),n?o("out.doctor.daemonRunning",{port:d}):o("out.doctor.daemonStopped")],[o("out.doctor.registered"),e?o(e.archived?"out.doctor.registeredArchived":"out.doctor.registeredYes",{id:e.id,source:e.source}):o("out.doctor.registeredNo")],[o("out.doctor.token"),c]])),console.log();const l=await S(t);if(l.length>0){r.warn(o("out.status.issuesFound",{count:l.length}));for(const f of l)r.warn(o("out.status.issue",{message:f.message})),r.dim(o("out.status.fix",{fix:f.fix}));console.log()}if(!e){r.warn(o("out.doctor.warnNotRegistered")),r.dim(o("out.doctor.fixInit")),s||r.dim(o("out.doctor.fixScan",{dir:t}));return}if(e.archived){r.warn(o("out.doctor.warnArchived"));return}if(a===null){r.warn(o("out.doctor.warnTokenMissing")),r.dim(o("out.doctor.fixInit"));return}if(a!==e.token){r.warn(o("out.doctor.warnTokenStale")),r.dim(o("out.doctor.fixInit"));return}r.success(o("out.doctor.ok")),n||r.dim(o("out.doctor.fixDaemon"))}};
1
+ import{existsSync as g,readFileSync as w}from"node:fs";import u from"node:path";import{DAEMON_HOST as v,DEFAULT_PORT as S,getDbPath as x,openDatabase as y,ProjectRepository as N,readDaemonState as b}from"@weavecode/server";import{formatTable as f,logger as r}from"@weavecode/core";import{checkHarness as T}from"../init/harness-checks.js";import{probeDaemon as P}from"./daemon.js";import{localTokenHeader as E}from"./daemon-auth.js";import{t as o}from"../i18n/index.js";const j={"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"},C={"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","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 D(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 m(n){const e=p(j,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 q(n,e){let i;try{const t=await fetch(`http://${v}:${n}/messaging/diagnostics?project=${e}`,{headers:E()});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"),D(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:m(t.channels.inbox),relay:m(t.channels.relay),terminal:m(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(C,c)).join("\uFF1B")}))}const k=n=>{const e=u.resolve(n);return process.platform==="win32"?e.toLowerCase():e};function H(n){if(!g(x()))return null;const e=y();try{const i=new N(e),d=k(n),s=[...i.list(),...i.listArchived()].find(a=>k(a.path)===d);return s?{id:s.id,source:s.source,archived:s.archivedAt!==null,token:s.token}:null}finally{e.close()}}function O(n){const e=u.join(n,".weave","token");return g(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){const e=u.resolve(String(n.flags.dir??process.cwd())),i=g(u.join(e,".weave","config.yaml")),d=b()?.port??S,s=await P(d),a=H(e),t=O(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 l=await T(e);if(l.length>0){r.warn(o("out.status.issuesFound",{count:l.length}));for(const h of l)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 q(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 +1 @@
1
- import{PresetSchema as g,HARNESS_KEYS as d,logger as i,formatTable as p,resolveComponents as f}from"@weavecode/core";import{executeInit as u}from"../init/executor.js";import{registerProject as h}from"@weavecode/server";import{t as e}from"../i18n/index.js";const m=["preToolUse","postToolUse","userPromptSubmit","sessionStart","stop","subagentStop","notification","preCompact"];function S(r){const s=r.trim();if(!s)return{};const c=Object.fromEntries(m.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=>!m.includes(n));return o.length>0&&i.warn(e("init.hooksUnknownKeys",{keys:o.join(", ")})),Object.fromEntries(m.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=>d.includes(n)))],o=c.filter(n=>!d.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=g.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")),i.dim(e("init.presetTarget",{preset:s,target:o}));const n=f(s);let t;try{t=await u({targetDir:o,force:c,interactive:a,preset:s,harnesses:parseHarnessFlag(String(r.flags.harness??"")),components:n,hooks:S(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
+ 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}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 S(r){const s=r.trim();if(!s)return{};const c=Object.fromEntries(d.map(i=>[i,!1]));if(s==="none")return c;const a=new Set(s.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(r){const s=r.trim();if(!s)return;const c=s.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(r){const s=p.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());n.info(e("init.banner")),n.dim(e("init.presetTarget",{preset:s,target:o}));const i=f(s);let t;try{t=await u({targetDir:o,force:c,interactive:a,preset:s,harnesses:parseHarnessFlag(String(r.flags.harness??"")),components:i,hooks:S(String(r.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,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 m=n.length>0?n:r;return m.length>1?{error:"ambiguous",rows:m}:{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),m=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:m.messageId,status:m.status}))}async function S(s,o){const{sessions:e}=await g(s,"/sessions");if(!o){const{capabilities:r}=await g(s,"/messaging/capabilities"),m=new Set(r.filter(d=>d.discovery).map(d=>d.harness)),c=e.map(d=>[l(d.sessionId),d.title??"",d.harness??"-",d.turnOpen===void 0?"-":d.turnOpen?i("out.msg.busy"):i("out.msg.idle"),d.harness!=null&&m.has(d.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 m=r.fromSessionId===t.sessionId?"\u25B6":"\u25C0",c=r.fromKind==="dashboard"?"dashboard":r.fromKind==="cli"?"cli":r.fromSessionId??"?";console.log(`${r.createdAt.slice(11,19)} ${m} ${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 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 +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(o=>o.present(t)))return[t];let e;try{e=await c(t,{withFileTypes:!0})}catch{return[]}const i=[];for(const o of e)o.isDirectory()&&(o.name.startsWith(".")||g.has(o.name)||i.push(...await findProjectDirs(n(t,o.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 e of r)d(e,"scan");if(a.success(p("out.scan.registered",{count:r.length,root:s})),r.length>0)for(const e of r)a.dim(` ${e}`)}};
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,2 +1,2 @@
1
- import c from"node:path";import k from"node:os";import{readFile as x}from"node:fs/promises";import{fileExists as j,logger as l,formatTable as R,HARNESS_DIRS as S,HARNESS_INSTRUCTION_FILES as D,HARNESS_KEYS as E}from"@weavecode/core";import{createRuntimeRegistry as $}from"@weavecode/harness";import{checkHarness as b}from"../init/harness-checks.js";import{t as o}from"../i18n/index.js";async function I(i){const t=c.join(i,".weave","config.yaml");if(!await j(t))return null;try{const e=await x(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 N(i,t){return await j(c.join(t,i))?"out.status.present":"out.status.missing"}async function u(i,t,e){return[i,o(await N(t,e))]}function C(i,t,e){if(!i)return null;try{const a=i.targetDir(t,"project",e,k.homedir());return c.relative(e,a).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()),e=await I(t);if(!e){l.warn(o("out.status.notInitialized"));return}l.info(o("out.status.header"));const a=$(),r=a.byCapability("detect").flatMap(s=>s.detect&&s.detect.detect(t).present?[s.id]:[]),n=[[o("out.status.col.version"),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")]],p=E[0],m=S[p].projectDir,g=a.get(p)?.assets;for(const s of D[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?.projectSkillsDir()??`${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=C(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=a.get(s)?.assets?.projectSkillsDir()??`${S[s].projectDir}/skills`;n.push(await u(f,f,t))}console.log(R(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 c from"node:path";import k from"node:os";import{readFile as x}from"node:fs/promises";import{fileExists as j,logger as l,formatTable as R,HARNESS_DIRS as S,HARNESS_INSTRUCTION_FILES as D,HARNESS_KEYS as E}from"@weavecode/core";import{createRuntimeRegistry as $}from"@weavecode/harness";import{checkHarness as b}from"../init/harness-checks.js";import{t as o}from"../i18n/index.js";async function I(e){const t=c.join(e,".weave","config.yaml");if(!await j(t))return null;try{const a=await x(t,"utf-8"),i={};for(const r of a.split(`
2
+ `)){const n=r.indexOf(":");n>0&&(i[r.slice(0,n).trim()]=r.slice(n+1).trim())}return i}catch{return null}}async function N(e,t){return await j(c.join(t,e))?"out.status.present":"out.status.missing"}async function u(e,t,a){return[e,o(await N(t,a))]}function C(e,t,a){if(!e)return null;try{const i=e.targetDir(t,"project",a,k.homedir());return c.relative(a,i).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(e){const t=String(e.flags.dir??process.cwd()),a=await I(t);if(!a){l.warn(o("out.status.notInitialized"));return}l.info(o("out.status.header"));const i=$(),r=i.byCapability("detect").flatMap(s=>s.detect&&s.detect.detect(t).present?[s.id]:[]),n=[[o("out.status.col.version"),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=E[0],m=S[p].projectDir,g=i.get(p)?.assets;for(const s of D[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?.projectSkillsDir()??`${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=C(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=i.get(s)?.assets?.projectSkillsDir()??`${S[s].projectDir}/skills`;n.push(await u(f,f,t))}console.log(R(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,8 +1,10 @@
1
- import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en={"help.tagline":"weave v{version} \u2014 Harness tool","help.usage":"Usage: weave <command> [options]","help.commands":"Commands:","help.globalOptions":"Global options:","help.subcommands":"Available subcommands:","cli.unknownCommand":"Unknown command: {command}","cli.error":"Error: {error}","cli.missingRequired":"Missing required option: --{name}","cli.invalidChoice":'Invalid value for --{name}: "{value}". Choices: {choices}',"cli.missingSubcommand":"Command {command} requires a subcommand","cli.unknownSubcommand":"Unknown subcommand: {command} {subcommand}","cli.unexpectedPositional":'Command {command} does not accept argument "{arg}"',"flag.help":"Show help","flag.version":"Show version","flag.verbose":"Verbose output","flag.quiet":"Suppress non-essential output","cmd.init.desc":"Initialize weave harness in the current project","cmd.uninstall.desc":"Remove weave init outputs (reset the init commit when it is HEAD, otherwise commit the removal)","cmd.status.desc":"Show current harness status","cmd.daemon.desc":"Manage the background daemon (start, stop, status)","cmd.daemon.start.desc":"Start the daemon in the background (no browser \u2014 see `weave dashboard`)","cmd.daemon.stop.desc":"Stop the running daemon","cmd.daemon.status.desc":"Show daemon status","cmd.dashboard.desc":"Open the web console in a browser (starts the daemon if needed)","cmd.chpass.desc":"Change the dashboard login password (new password given; no old password needed locally)","cmd.scan.desc":"Scan for weave-initialized projects and register them","cmd.doctor.desc":"Diagnose local wiring: is this checkout registered with the local weave server","flag.init.preset":"Configuration preset: minimal, default, or full","flag.init.force":"Overwrite existing files","flag.init.noInteractive":"Disable interactive prompts","flag.init.hooks":'Comma-separated hook events to register (preToolUse,postToolUse,userPromptSubmit,sessionStart,stop,subagentStop,notification,preCompact); "none" registers none; default: all',"flag.init.harness":`Comma-separated harness surfaces to initialize (${e.join(", ")}); omitted \u2192 interactive multiselect on a TTY, default ${e[0]}`,"flag.dir":"Target directory (default: current directory)","flag.scan.dir":"Root directory to scan (default: current directory)","flag.dashboard.noOpen":"Print the dashboard URL without opening a browser","out.daemon.alreadyRunning":"Daemon already running on port {port}","out.daemon.started":"Daemon started on http://{host}:{port}","out.daemon.stopped":"Daemon stopped (pid {pid}).","out.daemon.statusNotRunning":"Daemon: not running","out.daemon.statusRunning":"Daemon: running (pid {pid}, port {port}, up {uptime}s)","out.daemon.urlsTitle":"Access URLs:","out.daemon.statusStale":"Daemon: stale state (pid {pid}, port {port} not responding)","out.doctor.header":`
1
+ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en={"help.tagline":"weave v{version} \u2014 Harness tool","help.usage":"Usage: weave <command> [options]","help.commands":"Commands:","help.globalOptions":"Global options:","help.subcommands":"Available subcommands:","cli.unknownCommand":"Unknown command: {command}","cli.error":"Error: {error}","cli.missingRequired":"Missing required option: --{name}","cli.invalidChoice":'Invalid value for --{name}: "{value}". Choices: {choices}',"cli.missingSubcommand":"Command {command} requires a subcommand","cli.unknownSubcommand":"Unknown subcommand: {command} {subcommand}","cli.unexpectedPositional":'Command {command} does not accept argument "{arg}"',"flag.help":"Show help","flag.version":"Show version","flag.verbose":"Verbose output","flag.quiet":"Suppress non-essential output","cmd.init.desc":"Initialize weave harness in the current project","cmd.uninstall.desc":"Remove weave init outputs (reset the init commit when it is HEAD, otherwise commit the removal)","cmd.status.desc":"Show current harness status","cmd.daemon.desc":"Manage the background daemon (start, stop, status)","cmd.daemon.start.desc":"Start the daemon in the background (no browser \u2014 see `weave dashboard`)","cmd.daemon.stop.desc":"Stop the running daemon","cmd.daemon.status.desc":"Show daemon status","cmd.dashboard.desc":"Open the web console in a browser (starts the daemon if needed)","cmd.chpass.desc":"Change the dashboard login password (new password given; no old password needed locally)","cmd.scan.desc":"Scan for weave-initialized projects and register them","cmd.doctor.desc":"Diagnose local wiring: is this checkout registered with the local weave server","flag.init.preset":"Configuration preset: minimal, default, or full","flag.init.force":"Overwrite existing files","flag.init.noInteractive":"Disable interactive prompts","flag.init.hooks":'Comma-separated hook events to register (preToolUse,postToolUse,userPromptSubmit,sessionStart,stop,stopFailure,subagentStop,subagentStart,notification,postToolUseFailure,permissionRequest,permissionDenied,preCompact,sessionEnd,preModelSwitch); "none" registers none; default: all',"flag.init.harness":`Comma-separated harness surfaces to initialize (${e.join(", ")}); omitted \u2192 interactive multiselect on a TTY, default ${e[0]}`,"flag.dir":"Target directory (default: current directory)","flag.scan.dir":"Root directory to scan (default: current directory)","flag.dashboard.noOpen":"Print the dashboard URL without opening a browser","out.daemon.alreadyRunning":"Daemon already running on port {port}","out.daemon.started":"Daemon started on http://{host}:{port}","out.daemon.stopped":"Daemon stopped (pid {pid}).","out.daemon.statusNotRunning":"Daemon: not running","out.daemon.statusRunning":"Daemon: running (pid {pid}, port {port}, up {uptime}s)","out.daemon.urlsTitle":"Access URLs:","out.daemon.statusStale":"Daemon: stale state (pid {pid}, port {port} not responding)","out.doctor.header":`
2
2
  Weave Doctor \u2014 local wiring
3
- `,"out.doctor.dir":"directory","out.doctor.initialized":"initialized","out.doctor.yes":"yes","out.doctor.no":"no","out.doctor.daemon":"daemon","out.doctor.daemonRunning":"running on port {port}","out.doctor.daemonStopped":"not running","out.doctor.registered":"registered","out.doctor.registeredYes":"yes (id {id}, source {source})","out.doctor.registeredNo":"no \u2014 this checkout is not in the local registry","out.doctor.registeredArchived":"archived (id {id})","out.doctor.token":"token","out.doctor.tokenOk":"ok","out.doctor.tokenMissing":"missing (.weave/token absent)","out.doctor.tokenUnregistered":"present, but the project is not registered","out.doctor.tokenStale":"stale \u2014 differs from the registry token","out.doctor.warnNotRegistered":"This project carries weave files but is not registered with the local weave server.","out.doctor.fixInit":"Run `weave init` to (re)register this checkout, refresh harness files, and rewrite local paths.","out.doctor.fixScan":"Or `weave scan -d <parent>` to discover and register projects in bulk.","out.doctor.warnArchived":"This project is registered but archived \u2014 restore it from the dashboard to use it again.","out.doctor.warnTokenMissing":"Registered, but `.weave/token` is missing \u2014 hooks cannot authenticate until it is regenerated.","out.doctor.warnTokenStale":"Registered, but `.weave/token` belongs to another checkout \u2014 regenerate it.","out.doctor.ok":"OK \u2014 this checkout is registered and its token matches.","out.doctor.fixDaemon":"The daemon is not running; start it with `weave daemon start` when you need collection.","out.dash.browserFailed":"(could not launch a browser automatically \u2014 open it manually)","out.dash.stopHint":"Stop it later with `weave daemon stop`.","out.dash.noBundle":"The web bundle is not built, so the daemon has nothing to serve.","out.dash.buildHint":" Build it with `pnpm build:web`, or run the Vite dev server: `pnpm dev:web` (http://localhost:9527).","out.dash.url":`
3
+ `,"out.doctor.dir":"directory","out.doctor.initialized":"initialized","out.doctor.yes":"yes","out.doctor.no":"no","out.doctor.daemon":"daemon","out.doctor.daemonRunning":"running on port {port}","out.doctor.daemonStopped":"not running","out.doctor.registered":"registered","out.doctor.registeredYes":"yes (id {id}, source {source})","out.doctor.registeredNo":"no \u2014 this checkout is not in the local registry","out.doctor.registeredArchived":"archived (id {id})","out.doctor.token":"token","out.doctor.tokenOk":"ok","out.doctor.tokenMissing":"missing (.weave/token absent)","out.doctor.tokenUnregistered":"present, but the project is not registered","out.doctor.tokenStale":"stale \u2014 differs from the registry token","out.doctor.warnNotRegistered":"This project carries weave files but is not registered with the local weave server.","out.doctor.fixInit":"Run `weave init` to (re)register this checkout, refresh harness files, and rewrite local paths.","out.doctor.fixScan":"Or `weave scan -d <parent>` to discover and register projects in bulk.","out.doctor.warnArchived":"This project is registered but archived \u2014 restore it from the dashboard to use it again.","out.doctor.warnTokenMissing":"Registered, but `.weave/token` is missing \u2014 hooks cannot authenticate until it is regenerated.","out.doctor.warnTokenStale":"Registered, but `.weave/token` belongs to another checkout \u2014 regenerate it.","out.doctor.ok":"OK \u2014 this checkout is registered and its token matches.","out.doctor.fixDaemon":"The daemon is not running; start it with `weave daemon start` when you need collection.","out.doctor.diagHeader":`
4
+ Weave Doctor \u2014 message delivery (project #{id})
5
+ `,"out.doctor.diagFailed":"Delivery diagnostics unavailable ({error}) \u2014 the daemon refused, the local token is wrong, or the daemon predates this route.","out.doctor.diagDaemon":"daemon","out.doctor.diagDaemonValue":"v{version} \xB7 {platform} \xB7 terminal preset {preset} {channel}","out.doctor.diagChannelOn":"(text-injection channel present)","out.doctor.diagChannelOff":"(no text-injection channel)","out.doctor.diagScript":"capture script","out.doctor.diagScriptNone":"absent \u2014 no weave-generated hook script (run `weave init`)","out.doctor.diagScriptNotOwned":"the {source}-level script is not weave-generated (weave neither refreshes nor trusts it; `weave init --force` overwrites)","out.doctor.diagScriptValue":"{harness} \xB7 {source} level \xB7 version {version} \xB7 reports credentials {inbox} \xB7 reports pane {pane}","out.doctor.diagSourceUser":"user","out.doctor.diagSourceProject":"project","out.doctor.diagSourceNone":"none","out.doctor.diagYes":"yes","out.doctor.diagNo":"no","out.doctor.diagMissing":"\u2014","out.doctor.diagUnknownAlive":"undecidable","out.doctor.diagUntitled":"untitled","out.doctor.diagNoSessions":"Nothing to diagnose \u2014 no session is alive right now.","out.doctor.diagReady":"ready","out.doctor.diagUnavailable":"unavailable ({reason})","out.doctor.diagUnknown":"undecidable ({reason})","out.doctor.diagSession":'{id} "{title}" alive {alive} \xB7 events {events} \xB7 last {last}',"out.doctor.diagChannels":"inbox {inbox} relay {relay} terminal {terminal}","out.doctor.diagQueue":"queue {pending} \xB7 stalled {stalled}","out.doctor.diagHints":"fix: {hints}","out.doctor.reason.noMechanism":"this harness has no such mechanism","out.doctor.reason.noCredentials":"no credentials","out.doctor.reason.authTokenRequired":"this platform needs credentials and the host gave none","out.doctor.reason.noPeerName":"no peer name in the registry","out.doctor.reason.noBackend":"this terminal preset has no text-injection backend","out.doctor.reason.noPaneEnv":"no pane locator was reported","out.doctor.hint.noHookScript":"no weave-generated hook script \u2192 run `weave init`","out.doctor.hint.hookScriptNotWeave":"the hook script is not weave-generated (weave neither refreshes nor trusts it) \u2192 move it aside, or `weave init --force`","out.doctor.hint.hookScriptStale":"the hook script was generated by an older weave and does not report delivery credentials \u2192 re-run `weave init`, then restart the session","out.doctor.hint.noEvents":"this session has no hook events at all (started before init? the script never ran?)","out.doctor.hint.noInboxCredentials":"the script can report, yet this session never did (the host exports no messaging socket env, or the session predates the script) \u2192 restart the session","out.doctor.hint.inboxTokenRequired":"inbox delivery needs a token on this platform; the host exports no messaging token env","out.doctor.hint.noPeerName":"this session has no peer name \u2014 the relay addresses sessions by name and skips nameless ones","out.doctor.hint.terminalNoBackend":"this terminal preset cannot inject text \u2192 wezterm is what gives layer \u2461 a fallback","out.doctor.hint.terminalNoPaneEnv":"no pane locator was reported (this terminal exports no WEZTERM_*) \u2192 only the title+cwd fallback is left","out.doctor.hint.notRunning":"the session process is gone (messages settle as failed/offline, they never queue)","out.doctor.hint.queued":"the queue still holds backlog","out.doctor.hint.stalled":"the ack gate is set (no receipt in time, or delivery failed) \u2192 resend, or wait for the receipt","out.dash.browserFailed":"(could not launch a browser automatically \u2014 open it manually)","out.dash.stopHint":"Stop it later with `weave daemon stop`.","out.dash.noBundle":"The web bundle is not built, so the daemon has nothing to serve.","out.dash.buildHint":" Build it with `pnpm build:web`, or run the Vite dev server: `pnpm dev:web` (http://localhost:9527).","out.dash.url":`
4
6
  Dashboard: {url}
5
- `,"out.dash.noOpen":" (--no-open: not launching a browser)","out.dash.lanUrl":" LAN: {url}","out.dash.initialPassword":`
7
+ `,"out.dash.noOpen":" (--no-open: not launching a browser)","out.dash.initialPassword":`
6
8
  Initial login password: {password}
7
9
  (shown only once; change it with \`weave chpass <new password>\`)
8
10
  `,"out.chpass.ok":"Dashboard login password updated \u2014 signed-in browsers must log in again.","out.chpass.fail":"Failed to change password: {error}","out.chpass.usage":"Usage: weave chpass <new password> (at least 6 characters)","out.scan.registered":"Registered {count} project(s) from {root}","out.uninstall.banner":"Uninstalling weave: {target}","out.uninstall.notInitialized":"No .weave/ found \u2014 this project is not initialized, nothing to uninstall.","out.uninstall.done":"Uninstalled: removed {files} file(s), {dirs} directorie(s)","out.uninstall.modified":"Rewrote {count} file(s) (weave-added keys/sections stripped)","out.uninstall.keptUser":"Kept {count} generated-location file(s) that differ from weave sources (likely user-edited):","out.uninstall.restored":"Restored the AGENTS.md displaced by init (from .weave/backup/)","out.uninstall.gitReset":"The init commit was HEAD \u2014 pointer rolled back to {sha}, history clean","out.uninstall.gitCommit":"Created removal commit {sha} ({count} file(s))","out.uninstall.gitNoChanges":"No tracked weave files changed \u2014 nothing committed","out.uninstall.gitDirty":"Index not empty \u2014 files cleaned, git skipped to avoid touching staged content","out.uninstall.gitNotRepo":"Not inside a git repository \u2014 files cleaned only","out.uninstall.gitFailed":"git failed: {error} (files are already cleaned)","out.uninstall.serverRemoved":"Unregistered project {name} from the weave server (purged {events} events / {dispatches} dispatches / {sessions} sessions)","out.uninstall.serverFailed":"Failed to unregister from the weave server: {error}","uninstall.pluginScanFailed":"Plugin template scan failed (that part skipped): {error}","out.status.notInitialized":"Weave not initialized. Run `weave init` first.","out.status.header":`
@@ -44,13 +46,5 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en
44
46
  - Don't introduce XSS, SQL injection, or command injection vectors
45
47
  - Prefer parameterized queries and safe APIs over string concatenation
46
48
 
47
- `,"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.injected":`## weave-injected messages
48
-
49
- A user message starting with \`{marker}\` was injected by the weave dashboard, not typed by someone at the terminal:
50
-
51
- - The text after the marker is the full instruction \u2014 **just follow it**;
52
- - Don't echo the marker back as content, and don't reply to it (this path has no reply channel);
53
- - **Only this direct-injection path carries the marker**: relay, terminal fallback and inject deliveries do not \u2014 so "no marker" does not mean "typed by the user"; don't infer the sender from it.
54
-
55
- `,"init.removed":` Removed {count} stale generated file(s) by marker.
49
+ `,"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.
56
50
  `,"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."};
@@ -67,13 +67,56 @@ export declare const zh: {
67
67
  'out.doctor.warnTokenStale': string;
68
68
  'out.doctor.ok': string;
69
69
  'out.doctor.fixDaemon': string;
70
+ 'out.doctor.diagHeader': string;
71
+ 'out.doctor.diagFailed': string;
72
+ 'out.doctor.diagDaemon': string;
73
+ 'out.doctor.diagDaemonValue': string;
74
+ 'out.doctor.diagChannelOn': string;
75
+ 'out.doctor.diagChannelOff': string;
76
+ 'out.doctor.diagScript': string;
77
+ 'out.doctor.diagScriptNone': string;
78
+ 'out.doctor.diagScriptNotOwned': string;
79
+ 'out.doctor.diagScriptValue': string;
80
+ 'out.doctor.diagSourceUser': string;
81
+ 'out.doctor.diagSourceProject': string;
82
+ 'out.doctor.diagSourceNone': string;
83
+ 'out.doctor.diagYes': string;
84
+ 'out.doctor.diagNo': string;
85
+ 'out.doctor.diagMissing': string;
86
+ 'out.doctor.diagUnknownAlive': string;
87
+ 'out.doctor.diagUntitled': string;
88
+ 'out.doctor.diagNoSessions': string;
89
+ 'out.doctor.diagReady': string;
90
+ 'out.doctor.diagUnavailable': string;
91
+ 'out.doctor.diagUnknown': string;
92
+ 'out.doctor.diagSession': string;
93
+ 'out.doctor.diagChannels': string;
94
+ 'out.doctor.diagQueue': string;
95
+ 'out.doctor.diagHints': string;
96
+ 'out.doctor.reason.noMechanism': string;
97
+ 'out.doctor.reason.noCredentials': string;
98
+ 'out.doctor.reason.authTokenRequired': string;
99
+ 'out.doctor.reason.noPeerName': string;
100
+ 'out.doctor.reason.noBackend': string;
101
+ 'out.doctor.reason.noPaneEnv': string;
102
+ 'out.doctor.hint.noHookScript': string;
103
+ 'out.doctor.hint.hookScriptNotWeave': string;
104
+ 'out.doctor.hint.hookScriptStale': string;
105
+ 'out.doctor.hint.noEvents': string;
106
+ 'out.doctor.hint.noInboxCredentials': string;
107
+ 'out.doctor.hint.inboxTokenRequired': string;
108
+ 'out.doctor.hint.noPeerName': string;
109
+ 'out.doctor.hint.terminalNoBackend': string;
110
+ 'out.doctor.hint.terminalNoPaneEnv': string;
111
+ 'out.doctor.hint.notRunning': string;
112
+ 'out.doctor.hint.queued': string;
113
+ 'out.doctor.hint.stalled': string;
70
114
  'out.dash.browserFailed': string;
71
115
  'out.dash.stopHint': string;
72
116
  'out.dash.noBundle': string;
73
117
  'out.dash.buildHint': string;
74
118
  'out.dash.url': string;
75
119
  'out.dash.noOpen': string;
76
- 'out.dash.lanUrl': string;
77
120
  'out.dash.initialPassword': string;
78
121
  'out.chpass.ok': string;
79
122
  'out.chpass.fail': string;
@@ -147,7 +190,6 @@ export declare const zh: {
147
190
  'claudemd.files': string;
148
191
  'claudemd.security': string;
149
192
  'claudemd.skills': string;
150
- 'claudemd.injected': string;
151
193
  'harness.instructionLinkNotMaterialised.message': string;
152
194
  'harness.instructionLinkNotMaterialised.fix': string;
153
195
  'harness.instructionFilesDuplicated.message': string;
@@ -1,8 +1,10 @@
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,subagentStop,notification,preCompact\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.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 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.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
- `,"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.dash.browserFailed":"\uFF08\u65E0\u6CD5\u81EA\u52A8\u542F\u52A8\u6D4F\u89C8\u5668\u2014\u2014\u8BF7\u624B\u52A8\u6253\u5F00\uFF09","out.dash.stopHint":"\u7A0D\u540E\u53EF\u7528 `weave daemon stop` \u505C\u6B62\u5B83\u3002","out.dash.noBundle":"Web \u8D44\u6E90\u5305\u5C1A\u672A\u6784\u5EFA\uFF0C\u5B88\u62A4\u8FDB\u7A0B\u6CA1\u6709\u53EF\u63D0\u4F9B\u7684\u5185\u5BB9\u3002","out.dash.buildHint":" \u53EF\u7528 `pnpm build:web` \u6784\u5EFA\uFF0C\u6216\u8FD0\u884C Vite \u5F00\u53D1\u670D\u52A1\u5668\uFF1A`pnpm dev:web`\uFF08http://localhost:9527\uFF09\u3002","out.dash.url":`
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
+ Weave Doctor \u2014\u2014 \u6D88\u606F\u6295\u9012\u8BCA\u65AD\uFF08\u9879\u76EE #{id}\uFF09
5
+ `,"out.doctor.diagFailed":"\u6295\u9012\u8BCA\u65AD\u4E0D\u53EF\u7528\uFF08{error}\uFF09\u2014\u2014daemon \u62D2\u7B54\u3001\u4EE4\u724C\u4E0D\u5BF9\uFF0C\u6216 daemon \u7248\u672C\u8F83\u65E7\uFF08\u6CA1\u6709\u8FD9\u6761\u8DEF\u7531\uFF09\u3002","out.doctor.diagDaemon":"\u5B88\u62A4\u8FDB\u7A0B","out.doctor.diagDaemonValue":"v{version} \xB7 {platform} \xB7 \u7EC8\u7AEF preset {preset}{channel}","out.doctor.diagChannelOn":"\uFF08\u6709\u6587\u672C\u6CE8\u5165\u901A\u9053\uFF09","out.doctor.diagChannelOff":"\uFF08\u65E0\u6587\u672C\u6CE8\u5165\u901A\u9053\uFF09","out.doctor.diagScript":"\u91C7\u96C6\u811A\u672C","out.doctor.diagScriptNone":"\u672A\u5B89\u88C5\u2014\u2014\u6CA1\u6709 weave \u751F\u6210\u7684 hook \u811A\u672C\uFF08\u8DD1 `weave init`\uFF09","out.doctor.diagScriptNotOwned":"{source} \u6863\u811A\u672C\u4E0D\u662F weave \u751F\u6210\u7684\uFF08weave \u65E2\u4E0D\u5237\u65B0\u4E5F\u4E0D\u8BA4\uFF1B`weave init --force` \u53EF\u8986\u76D6\uFF09","out.doctor.diagScriptValue":"{harness} \xB7 {source} \u6863 \xB7 \u7248\u672C {version} \xB7 \u51ED\u636E\u4E0A\u62A5 {inbox} \xB7 pane \u4E0A\u62A5 {pane}","out.doctor.diagSourceUser":"user","out.doctor.diagSourceProject":"project","out.doctor.diagSourceNone":"\u65E0","out.doctor.diagYes":"\u662F","out.doctor.diagNo":"\u5426","out.doctor.diagMissing":"\u2014","out.doctor.diagUnknownAlive":"\u5224\u4E0D\u52A8","out.doctor.diagUntitled":"\u65E0\u9898","out.doctor.diagNoSessions":"\u6CA1\u6709\u9700\u8981\u8BCA\u65AD\u7684\u4F1A\u8BDD\uFF08\u5F53\u524D\u6CA1\u6709\u6D3B\u7740\u7684\u4F1A\u8BDD\uFF09\u3002","out.doctor.diagReady":"\u53EF\u7528","out.doctor.diagUnavailable":"\u4E0D\u53EF\u7528\uFF08{reason}\uFF09","out.doctor.diagUnknown":"\u5224\u4E0D\u52A8\uFF08{reason}\uFF09","out.doctor.diagSession":"{id}\u300C{title}\u300D \u5B58\u6D3B {alive} \xB7 \u4E8B\u4EF6 {events} \xB7 \u672B\u6B21 {last}","out.doctor.diagChannels":"\u76F4\u6295 {inbox} \u4E2D\u7EE7 {relay} \u7EC8\u7AEF {terminal}","out.doctor.diagQueue":"\u961F\u5217 {pending} \u6761 \xB7 \u6682\u505C\u95F8 {stalled}","out.doctor.diagHints":"\u4FEE\u6CD5\uFF1A{hints}","out.doctor.reason.noMechanism":"\u8BE5 harness \u6CA1\u6709\u8FD9\u4E2A\u673A\u5236","out.doctor.reason.noCredentials":"\u6CA1\u6709\u51ED\u636E","out.doctor.reason.authTokenRequired":"\u672C\u5E73\u53F0\u9700\u8981\u51ED\u636E\u4F46\u5BBF\u4E3B\u6CA1\u7ED9","out.doctor.reason.noPeerName":"\u6CE8\u518C\u8868\u91CC\u6CA1\u6709 peer name","out.doctor.reason.noBackend":"\u8BE5\u7EC8\u7AEF preset \u6CA1\u6709\u6587\u672C\u6CE8\u5165\u540E\u7AEF","out.doctor.reason.noPaneEnv":"\u6CA1\u4E0A\u62A5 pane \u5B9A\u4F4D","out.doctor.hint.noHookScript":"\u6CA1\u88C5 weave \u751F\u6210\u7684 hook \u811A\u672C \u2192 \u8DD1 `weave init`","out.doctor.hint.hookScriptNotWeave":"hook \u811A\u672C\u4E0D\u662F weave \u751F\u6210\u7684\uFF08weave \u4E0D\u5237\u65B0\u4E5F\u4E0D\u8BA4\uFF09\u2192 \u79FB\u8D70\u5B83\uFF0C\u6216 `weave init --force` \u8986\u76D6","out.doctor.hint.hookScriptStale":"hook \u811A\u672C\u662F\u65E7\u7248 weave \u751F\u6210\u7684\u3001\u4E0D\u4E0A\u62A5\u76F4\u6295\u51ED\u636E \u2192 \u91CD\u8DD1 `weave init` \u5237\u65B0\u811A\u672C\uFF0C\u518D\u91CD\u542F\u4F1A\u8BDD","out.doctor.hint.noEvents":"\u8FD9\u6761\u4F1A\u8BDD\u4E00\u6761 hook \u4E8B\u4EF6\u90FD\u6CA1\u6709\uFF08\u4F1A\u8BDD\u65E9\u4E8E init\uFF1F\u811A\u672C\u6CA1\u8DD1\u8FC7\uFF1F\uFF09","out.doctor.hint.noInboxCredentials":"\u811A\u672C\u80FD\u4E0A\u62A5\u3001\u4F46\u8FD9\u6761\u4F1A\u8BDD\u4ECE\u6CA1\u62A5\u8FC7\u51ED\u636E\uFF08\u5BBF\u4E3B\u6CA1\u7ED9 messaging socket env\uFF0C\u6216\u4F1A\u8BDD\u65E9\u4E8E\u811A\u672C\u66F4\u65B0\uFF09\u2192 \u91CD\u542F\u4F1A\u8BDD","out.doctor.hint.inboxTokenRequired":"\u672C\u5E73\u53F0\u76F4\u6295\u9700\u8981 token\uFF0C\u5BBF\u4E3B\u6CA1\u7ED9 messaging token env","out.doctor.hint.noPeerName":"\u8FD9\u6761\u4F1A\u8BDD\u5728\u6CE8\u518C\u8868\u91CC\u6CA1\u6709 peer name\u2014\u2014\u4E2D\u7EE7\u6309\u540D\u5B57\u5BFB\u5740\uFF0C\u6CA1\u540D\u5B57\u76F4\u63A5\u8DF3\u8FC7","out.doctor.hint.terminalNoBackend":"\u7EC8\u7AEF preset \u4E0D\u652F\u6301\u6587\u672C\u6CE8\u5165 \u2192 \u6362 wezterm \u624D\u6709\u5C42\u2461 \u515C\u5E95","out.doctor.hint.terminalNoPaneEnv":"\u6CA1\u4E0A\u62A5 pane \u5B9A\u4F4D\uFF08\u8BE5\u7EC8\u7AEF\u4E0D\u5BFC\u51FA WEZTERM_*\uFF09\u2192 \u53EA\u5269\u6807\u9898+cwd \u56DE\u843D","out.doctor.hint.notRunning":"\u4F1A\u8BDD\u8FDB\u7A0B\u5DF2\u4E0D\u5728\u8DD1\uFF08\u6D88\u606F\u843D failed/offline\uFF0C\u8FDE\u961F\u5217\u90FD\u4E0D\u8FDB\uFF09","out.doctor.hint.queued":"\u961F\u5217\u91CC\u8FD8\u6709\u79EF\u538B","out.doctor.hint.stalled":"\u6682\u505C\u95F8\u5DF2\u7F6E\uFF08\u672A\u56DE\u6267\u8D85\u7A97\u6216\u6295\u9012\u5931\u8D25\uFF09\u2192 \u91CD\u53D1\u3001\u6216\u7B49\u56DE\u6267\u89E3\u9664","out.dash.browserFailed":"\uFF08\u65E0\u6CD5\u81EA\u52A8\u542F\u52A8\u6D4F\u89C8\u5668\u2014\u2014\u8BF7\u624B\u52A8\u6253\u5F00\uFF09","out.dash.stopHint":"\u7A0D\u540E\u53EF\u7528 `weave daemon stop` \u505C\u6B62\u5B83\u3002","out.dash.noBundle":"Web \u8D44\u6E90\u5305\u5C1A\u672A\u6784\u5EFA\uFF0C\u5B88\u62A4\u8FDB\u7A0B\u6CA1\u6709\u53EF\u63D0\u4F9B\u7684\u5185\u5BB9\u3002","out.dash.buildHint":" \u53EF\u7528 `pnpm build:web` \u6784\u5EFA\uFF0C\u6216\u8FD0\u884C Vite \u5F00\u53D1\u670D\u52A1\u5668\uFF1A`pnpm dev:web`\uFF08http://localhost:9527\uFF09\u3002","out.dash.url":`
4
6
  \u63A7\u5236\u53F0\uFF1A{url}
5
- `,"out.dash.noOpen":" \uFF08--no-open\uFF1A\u4E0D\u542F\u52A8\u6D4F\u89C8\u5668\uFF09","out.dash.lanUrl":" \u5C40\u57DF\u7F51\uFF1A{url}","out.dash.initialPassword":`
7
+ `,"out.dash.noOpen":" \uFF08--no-open\uFF1A\u4E0D\u542F\u52A8\u6D4F\u89C8\u5668\uFF09","out.dash.initialPassword":`
6
8
  \u521D\u59CB\u767B\u5F55\u5BC6\u7801\uFF1A{password}
7
9
  \uFF08\u53EA\u663E\u793A\u8FD9\u4E00\u6B21\uFF1B\u53EF\u7528 \`weave chpass <\u65B0\u5BC6\u7801>\` \u4FEE\u6539\uFF09
8
10
  `,"out.chpass.ok":"\u5DF2\u66F4\u65B0 dashboard \u767B\u5F55\u5BC6\u7801\u2014\u2014\u6240\u6709\u5DF2\u767B\u5F55\u7684\u6D4F\u89C8\u5668\u9700\u91CD\u65B0\u767B\u5F55\u3002","out.chpass.fail":"\u4FEE\u6539\u5BC6\u7801\u5931\u8D25\uFF1A{error}","out.chpass.usage":"\u7528\u6CD5\uFF1Aweave chpass <\u65B0\u5BC6\u7801>\uFF08\u81F3\u5C11 6 \u4F4D\uFF09","out.scan.registered":"\u5DF2\u4ECE {root} \u6CE8\u518C {count} \u4E2A\u9879\u76EE","out.uninstall.banner":"\u5378\u8F7D weave\uFF1A{target}","out.uninstall.notInitialized":"\u672A\u627E\u5230 .weave/ \u2014\u2014 \u672C\u9879\u76EE\u672A\u521D\u59CB\u5316 weave\uFF0C\u65E0\u9700\u5378\u8F7D\u3002","out.uninstall.done":"\u5378\u8F7D\u5B8C\u6210\uFF1A\u5220\u9664 {files} \u4E2A\u6587\u4EF6\u3001{dirs} \u4E2A\u76EE\u5F55","out.uninstall.modified":"\u6539\u5199 {count} \u4E2A\u6587\u4EF6\uFF08\u5265\u9664 weave \u5199\u5165\u7684\u952E/\u6BB5\u843D\uFF09","out.uninstall.keptUser":"\u4FDD\u7559\u7591\u4F3C\u7528\u6237\u4FEE\u6539\u7684\u751F\u6210\u4F4D\u6587\u4EF6 {count} \u4E2A\uFF08\u5185\u5BB9\u4E0E weave \u6765\u6E90\u4E0D\u4E00\u81F4\uFF09\uFF1A","out.uninstall.restored":"\u5DF2\u8FD8\u539F\u88AB init \u9876\u66FF\u7684 AGENTS.md\uFF08\u6765\u81EA .weave/backup/\uFF09","out.uninstall.gitReset":"init \u63D0\u4EA4\u662F\u6700\u8FD1\u4E00\u6B21\u63D0\u4EA4\u2014\u2014\u6307\u9488\u5DF2\u56DE\u6EDA\u5230 {sha}\uFF0C\u5386\u53F2\u65E0\u75D5","out.uninstall.gitCommit":"\u5DF2\u751F\u6210\u5378\u8F7D\u63D0\u4EA4 {sha}\uFF08{count} \u4E2A\u6587\u4EF6\uFF09","out.uninstall.gitNoChanges":"\u6CA1\u6709\u5DF2\u8DDF\u8E2A\u7684 weave \u6587\u4EF6\u53D8\u5316\u2014\u2014\u672A\u4EA7\u751F\u63D0\u4EA4","out.uninstall.gitDirty":"\u6682\u5B58\u533A\u975E\u7A7A\u2014\u2014\u6587\u4EF6\u5DF2\u6E05\u7406\uFF0C\u4F46\u8DF3\u8FC7 git \u64CD\u4F5C\u4EE5\u514D\u6CE2\u53CA\u5DF2\u6682\u5B58\u5185\u5BB9","out.uninstall.gitNotRepo":"\u4E0D\u5728 git \u4ED3\u5E93\u5185\u2014\u2014\u4EC5\u6E05\u7406\u6587\u4EF6","out.uninstall.gitFailed":"git \u64CD\u4F5C\u5931\u8D25\uFF1A{error}\uFF08\u6587\u4EF6\u5DF2\u6E05\u7406\uFF09","out.uninstall.serverRemoved":"\u5DF2\u4ECE server \u6CE8\u9500\u9879\u76EE {name}\uFF08\u6E05\u7406 {events} \u4E8B\u4EF6 / {dispatches} \u6D3E\u53D1 / {sessions} \u4F1A\u8BDD\uFF09","out.uninstall.serverFailed":"server \u6CE8\u9500\u5931\u8D25\uFF1A{error}","uninstall.pluginScanFailed":"\u63D2\u4EF6\u6A21\u677F\u626B\u63CF\u5931\u8D25\uFF08\u8DF3\u8FC7\u8BE5\u90E8\u5206\uFF09\uFF1A{error}","out.status.notInitialized":"Weave \u5C1A\u672A\u521D\u59CB\u5316\u3002\u8BF7\u5148\u8FD0\u884C `weave init`\u3002","out.status.header":`
@@ -45,12 +47,4 @@ import{HARNESS_DIRS as F,HARNESS_KEYS as u}from"@weavecode/core";export const zh
45
47
  - \u4E0D\u5F15\u5165 XSS\u3001SQL \u6CE8\u5165\u3001\u547D\u4EE4\u6CE8\u5165\u9762
46
48
  - \u4F18\u5148\u53C2\u6570\u5316\u67E5\u8BE2\u4E0E\u5B89\u5168 API\uFF0C\u800C\u4E0D\u662F\u5B57\u7B26\u4E32\u62FC\u63A5
47
49
 
48
- `,"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.injected":`## weave \u6CE8\u5165\u7684\u6D88\u606F
49
-
50
- \u4EE5 \`{marker}\` \u5F00\u5934\u7684\u7528\u6237\u6D88\u606F\u6765\u81EA weave \u63A7\u5236\u53F0\u7684\u76F4\u6295\uFF0C\u4E0D\u662F\u5750\u5728\u7EC8\u7AEF\u524D\u7684\u4EBA\u624B\u6253\u7684\uFF1A
51
-
52
- - \u53BB\u6389\u8BE5\u6807\u8BB0\u540E\u7684\u5168\u6587\u5C31\u662F\u5B8C\u6574\u6307\u4EE4\uFF0C**\u7167\u5B83\u6267\u884C**\uFF1B
53
- - \u4E0D\u8981\u628A\u6807\u8BB0\u5F53\u5185\u5BB9\u590D\u8FF0\uFF0C\u4E5F\u4E0D\u5FC5\u5C31\u8FD9\u6761\u6D88\u606F\u56DE\u8BDD\uFF08\u8FD9\u6761\u8DEF\u5F84\u6CA1\u6709\u56DE\u590D\u9762\uFF09\uFF1B
54
- - **\u53EA\u6709\u76F4\u6295\u8FD9\u4E00\u6761\u8DEF\u5F84\u5E26\u6807\u8BB0**\uFF1A\u4E2D\u7EE7\u3001\u7EC8\u7AEF\u515C\u5E95\u3001\u6CE8\u5165\u4E09\u6761\u8DEF\u5F84\u7684\u6295\u9012\u90FD\u4E0D\u5E26\u2014\u2014\u6240\u4EE5\u300C\u6CA1\u6709\u6807\u8BB0\u300D\u4E0D\u7B49\u4E8E\u300C\u7528\u6237\u624B\u6253\u300D\uFF0C\u522B\u636E\u6B64\u5224\u65AD\u6765\u6E90\u3002
55
-
56
- `,"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"};
50
+ `,"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"};
@@ -12,9 +12,8 @@ export interface ClaudeMdGeneratorInput {
12
12
  *
13
13
  * The block text lives in the CLI dictionary (`claudemd.*`) and renders in the
14
14
  * active locale. What belongs here is anything the agent needs to work in THIS
15
- * project — including the console-injection marker note, since the session has
16
- * to know what an injected `[weave] …` user message means. weave's own
17
- * engineering notes (internal paths, module layout, dev workflow) do not.
15
+ * project. weave's own engineering notes (internal paths, module layout, dev
16
+ * workflow) do not.
18
17
  */
19
18
  /** Delimit weave's managed block so re-init can replace it in place. */
20
19
  export declare const WEAVE_BLOCK_START = "<!-- weave:start -->";
@@ -1,11 +1,11 @@
1
- import{WEAVE_INJECTION_MARKER as i}from"@weavecode/core";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 d(e){return`# ${e}
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}
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
- `}function u(){return a("claudemd.injected",{marker:i})}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+=u(),t+=`${WEAVE_BLOCK_END}
8
- `,t}export function generateClaudeMd(e){return d(e.projectName)+generateClaudeMdSection(e)}export function mergeClaudeMd(e,n){const t=e.indexOf(WEAVE_BLOCK_START),r=e.indexOf(WEAVE_BLOCK_END);return t!==-1&&r!==-1&&r>t?e.slice(0,t)+n.trimEnd()+e.slice(r+WEAVE_BLOCK_END.length):e.replace(/\s+$/,"")+`
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+$/,"")+`
9
9
 
10
10
  `+n.trimEnd()+`
11
11
  `}
@@ -1,6 +1,6 @@
1
- import m from"node:path";import{readFile as x,writeFile as d}from"node:fs/promises";import{detectPlatform as A,resolveComponents as B,DEFAULT_HOOKS as P,HARNESS_DIRS as G,HARNESS_KEYS as H,ensureDir as N,fileExists as V,logger as M}from"@weavecode/core";import{templateRegistry as k}from"@weavecode/templates";import{WEAVE_VERSION as Y}from"@weavecode/server";import{generateClaudeMd as K,generateClaudeMdSection as L,mergeClaudeMd as $}from"./claudemd-gen.js";import{ensureInstructionLink as J}from"./instruction-link.js";import{buildInitRegistry as W}from"./wiring.js";import{createPromptPort as q}from"./prompt.js";import{commitInitOutputs as z,findGitRepoRoot as Q}from"./git-commit.js";import{t as O}from"../i18n/index.js";const X={minimal:"minimal",default:"standard",full:"full"},y=["claude"];async function Z(e,n){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 t=await n.multiselect(H,y);return t.length>0?[...t]:[...y]}export async function executeInit(e,n){const{targetDir:t,force:u,interactive:g,preset:S}=e,b=A(),i={directories:[],files:[]},v=[],E=[],T=[],C=[],I=[],o=B(S,e.components),c={...P,...e.hooks},j=n??q(g);g||M.dim(O("init.nonInteractive"));const h=await Z(e,j),U={...e,platform:b},F=W();for(const a of h){const l=new(F.initFor(a))(U);await l.runSurface();const s=l.records;i.directories.push(...s.created.directories),i.files.push(...s.created.files),v.push(...s.skipped),E.push(...s.merged),T.push(...s.updated),C.push(...s.removed)}if(o.claudeMd||o.agentsMd){const a=await J(t,{force:u,interactive:g,confirm:(f,p)=>j.confirm(f,p)});a.backedUpTo&&(M.dim(O("init.backedUp",{path:a.backedUpTo})),i.files.push(a.backedUpTo));const l=X[S]??"standard",s=m.basename(t),r=m.join(t,a.realFile),w=K({template:l,projectName:s});if(u)await d(r,w,"utf-8"),i.files.push(r);else{const f=await D(r);if(f===null)await d(r,w,"utf-8"),i.files.push(r);else{const p=L({template:l,projectName:s});await d(r,$(f,p),"utf-8"),E.push(r)}}}{const a=m.join(t,".weave");await N(a),i.directories.push(a);const l={initVersion:Y,initTimestamp:new Date().toISOString(),preset:S,harnesses:h,components:{settings:o.settings,skills:o.skills,commands:o.commands,agents:o.agents,helpers:o.helpers,mcp:o.mcp,claudeMd:o.claudeMd,agentsMd:o.agentsMd}},s=m.join(a,"config.yaml"),r=Object.entries(l).map(([f,p])=>`${f}: ${typeof p=="object"?JSON.stringify(p):p}`).join(`
1
+ import m from"node:path";import{readFile as P,writeFile as f}from"node:fs/promises";import{detectPlatform as x,resolveComponents as B,DEFAULT_HOOKS as G,DEFAULT_MCP as H,HARNESS_DIRS as L,HARNESS_KEYS as V,ensureDir as D,fileExists as Y,logger as I}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{t as N}from"../i18n/index.js";const tt={minimal:"minimal",default:"standard",full:"full"},S=["claude"];async function et(t,r){if(t.harnesses&&t.harnesses.length>0)return[...t.harnesses];if(!t.interactive)return[...S];if(!process.stdin.isTTY||!process.stdout.isTTY)return[...S];const s=await r.multiselect(V,S);return s.length>0?[...s]:[...S]}export async function executeInit(t,r){const{targetDir:s,force:u,interactive:g,preset:y}=t,j=x(),a={directories:[],files:[]},C=[],E=[],T=[],v=[],M=[],n=B(y,t.components),e={...G,...t.hooks},U={...H,...t.mcp},k=r??Q(g);g||I.dim(N("init.nonInteractive"));const h=await et(t,k),F={...t,platform:j},_=z();for(const o of h){const p=new(_.initFor(o))(F);await p.runSurface();const i=p.records;a.directories.push(...i.created.directories),a.files.push(...i.created.files),C.push(...i.skipped),E.push(...i.merged),T.push(...i.updated),v.push(...i.removed)}if(n.claudeMd||n.agentsMd){const o=await W(s,{force:u,interactive:g,confirm:(d,l)=>k.confirm(d,l)});o.backedUpTo&&(I.dim(N("init.backedUp",{path:o.backedUpTo})),a.files.push(o.backedUpTo));const p=tt[y]??"standard",i=m.basename(s),c=m.join(s,o.realFile),w=$({template:p,projectName:i});if(u)await f(c,w,"utf-8"),a.files.push(c);else{const d=await O(c);if(d===null)await f(c,w,"utf-8"),a.files.push(c);else{const l=q({template:p,projectName:i});await f(c,J(d,l),"utf-8"),E.push(c)}}}{const o=m.join(s,".weave");await D(o),a.directories.push(o);const p={initVersion:K,initTimestamp:new Date().toISOString(),preset:y,harnesses:h,components:{settings:n.settings,skills:n.skills,commands:n.commands,agents:n.agents,helpers:n.helpers,mcp:n.mcp,claudeMd:n.claudeMd,agentsMd:n.agentsMd},hooks:e,mcp:U},i=m.join(o,"config.yaml"),c=Object.entries(p).map(([d,l])=>`${d}: ${typeof l=="object"?JSON.stringify(l):l}`).join(`
2
2
  `)+`
3
- `,w=await V(s);await d(s,r,"utf-8"),(w?T:i.files).push(s)}for(const a of h)await R(t,m.join(t,G[a].projectDir),i);await R(t,m.join(t,".weave"),i),await z({targetDir:t,interactive:g,selected:h,prompt:j});const _={skillsCount:k.getByCategory("skill").length,commandsCount:k.getByCategory("command").length,agentsCount:k.getByCategory("agent").length,hooksEnabled:[c.preToolUse,c.postToolUse,c.userPromptSubmit,c.sessionStart,c.stop,c.subagentStop,c.notification,c.preCompact].filter(Boolean).length};return{success:I.length===0,platform:b,created:i,skipped:v,merged:E,updated:T,removed:C,errors:I,summary:_}}export const NESTED_GITIGNORE=`# weave \u2014 generated; do not commit
3
+ `,w=await Y(i);await f(i,c,"utf-8"),(w?T:a.files).push(i)}for(const o of h)await R(s,m.join(s,L[o].projectDir),a);await R(s,m.join(s,".weave"),a),await X({targetDir:s,interactive:g,selected:h,prompt:k});const A={skillsCount:b.getByCategory("skill").length,commandsCount:b.getByCategory("command").length,agentsCount:b.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:j,created:a,skipped:C,merged:E,updated:T,removed:v,errors:M,summary:A}}export const NESTED_GITIGNORE=`# weave \u2014 generated; do not commit
4
4
  *
5
5
  !.gitignore
6
- `;async function R(e,n,t){if(!await Q(e))return;const u=m.join(n,".gitignore");await D(u)===null&&(await N(n),await d(u,NESTED_GITIGNORE,"utf-8"),t.files.push(u))}async function D(e){try{return await x(e,"utf-8")}catch(n){if(ee(n))return null;throw n}}function ee(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}
6
+ `;async function R(t,r,s){if(!await Z(t))return;const u=m.join(r,".gitignore");await O(u)===null&&(await D(r),await f(u,NESTED_GITIGNORE,"utf-8"),s.files.push(u))}async function O(t){try{return await P(t,"utf-8")}catch(r){if(st(r))return null;throw r}}function st(t){return typeof t=="object"&&t!==null&&t.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 e=f.resolve(i);for(;;){try{return(await I(f.join(e,".git"))).isDirectory()?e:null}catch{}const r=f.dirname(e);if(r===e)return null;e=r}}const D=S(y);export const defaultGitExec=async(i,e,r)=>{try{const{stdout:o,stderr:t}=await D(i,e,{cwd:r.cwd,windowsHide:!0,timeout:1e4,maxBuffer:1048576});return{stdout:String(o),stderr:String(t),code:0}}catch(o){const t=o;if(typeof t.code=="number")return{stdout:String(t.stdout??""),stderr:String(t.stderr??""),code:t.code};throw o}};export async function collectCommitPaths(i,e){const r=[...j,".mcp.json",...e.map(t=>T[t].projectDir),".weave"],o=[];for(const t of r)try{await E(f.join(i,t)),o.includes(t)||o.push(t)}catch{}return o}export const COMMIT_MESSAGE="chore: weave init \u751F\u6210\u521D\u59CB\u5316\u4EA7\u7269";export async function commitInitOutputs(i){try{return await v(i)}catch(e){return c.warn(s("init.commit.failed",{error:e instanceof Error?e.message:String(e)})),{status:"failed"}}}async function v({targetDir:i,interactive:e,selected:r,prompt:o,execGit:t=defaultGitExec}){if(!await findGitRepoRoot(i))return{status:"not-repo"};if(!e||!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,r);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 o.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(`
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
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}}