@weavecode/weave 0.1.8 → 0.1.9

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 (351) hide show
  1. package/node_modules/@modelcontextprotocol/sdk/node_modules/@hono/node-server/dist/index.cjs +31 -6
  2. package/node_modules/@modelcontextprotocol/sdk/node_modules/@hono/node-server/dist/index.mjs +31 -6
  3. package/node_modules/@modelcontextprotocol/sdk/node_modules/@hono/node-server/package.json +1 -1
  4. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.cjs +1 -1
  5. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.mjs +1 -1
  6. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/README.md +39 -39
  7. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/dist/ipv6.js +1 -1
  8. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/package.json +1 -1
  9. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/package.json +1 -1
  10. package/node_modules/@weavecode/cli/dist/cli.js +4 -4
  11. package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
  12. package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
  13. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  14. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
  15. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  16. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  17. package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
  18. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  19. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  20. package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
  21. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +2 -2
  22. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +7 -0
  23. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +3 -3
  24. package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
  25. package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
  26. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +5 -5
  27. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  28. package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
  29. package/node_modules/@weavecode/cli/dist/init/git-exclude.d.ts +20 -0
  30. package/node_modules/@weavecode/cli/dist/init/git-exclude.js +7 -0
  31. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  32. package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
  33. package/node_modules/@weavecode/cli/dist/init/instruction-files.d.ts +14 -0
  34. package/node_modules/@weavecode/cli/dist/init/instruction-files.js +1 -0
  35. package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
  36. package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
  37. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  38. package/node_modules/@weavecode/cli/dist/init/provision.js +1 -1
  39. package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
  40. package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
  41. package/node_modules/@weavecode/cli/dist/parser.js +1 -1
  42. package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
  43. package/node_modules/@weavecode/cli/dist/statusline/mock-input.js +1 -1
  44. package/node_modules/@weavecode/cli/dist/statusline/preview.js +2 -2
  45. package/node_modules/@weavecode/cli/package.json +5 -5
  46. package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
  47. package/node_modules/@weavecode/core/dist/harness.d.ts +37 -0
  48. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  49. package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
  50. package/node_modules/@weavecode/core/dist/index.js +1 -1
  51. package/node_modules/@weavecode/core/dist/platform.js +1 -1
  52. package/node_modules/@weavecode/core/dist/types.d.ts +4 -4
  53. package/node_modules/@weavecode/core/dist/types.js +1 -1
  54. package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
  55. package/node_modules/@weavecode/core/package.json +1 -1
  56. package/node_modules/@weavecode/harness/dist/claude/assets.js +3 -3
  57. package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
  58. package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -3
  59. package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
  60. package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
  61. package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
  62. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  63. package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
  64. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  65. package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -1
  66. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
  67. package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
  68. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
  69. package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -1
  70. package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
  71. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
  72. package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
  73. package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
  74. package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
  75. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
  76. package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
  77. package/node_modules/@weavecode/harness/dist/claude/rewind.js +1 -1
  78. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
  79. package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
  80. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.d.ts +6 -0
  81. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +21 -14
  82. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
  83. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
  84. package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.js +2 -2
  85. package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -7
  86. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  87. package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
  88. package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
  89. package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
  90. package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
  91. package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
  92. package/node_modules/@weavecode/harness/dist/codex/images.js +1 -1
  93. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  94. package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -1
  95. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
  96. package/node_modules/@weavecode/harness/dist/codex/messaging.js +2 -2
  97. package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -1
  98. package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
  99. package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
  100. package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -1
  101. package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -2
  102. package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
  103. package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -4
  104. package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -4
  105. package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
  106. package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
  107. package/node_modules/@weavecode/harness/dist/driver.js +1 -1
  108. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
  109. package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
  110. package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
  111. package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
  112. package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
  113. package/node_modules/@weavecode/harness/dist/zcode/assets.js +1 -1
  114. package/node_modules/@weavecode/harness/dist/zcode/capture.js +3 -3
  115. package/node_modules/@weavecode/harness/dist/zcode/mcp.js +2 -2
  116. package/node_modules/@weavecode/harness/package.json +2 -2
  117. package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
  118. package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
  119. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  120. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  121. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  122. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
  123. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  124. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +3 -3
  125. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  126. package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
  127. package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
  128. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  129. package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
  130. package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
  131. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  132. package/node_modules/@weavecode/server/dist/daemon/entry.js +2 -2
  133. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  134. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  135. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  136. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  137. package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -1
  138. package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
  139. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -2
  140. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -1
  141. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +1 -1
  142. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -2
  143. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -1
  144. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -1
  145. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -1
  146. package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -1
  147. package/node_modules/@weavecode/server/dist/daemon/opener/launch.js +1 -1
  148. package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +1 -1
  149. package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
  150. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
  151. package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
  152. package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -1
  153. package/node_modules/@weavecode/server/dist/daemon/pet-seed.d.ts +4 -6
  154. package/node_modules/@weavecode/server/dist/daemon/pet-seed.js +2 -1
  155. package/node_modules/@weavecode/server/dist/daemon/pet-window.js +1 -1
  156. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  157. package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
  158. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  159. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  160. package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
  161. package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
  162. package/node_modules/@weavecode/server/dist/daemon/routes/installations.d.ts +29 -0
  163. package/node_modules/@weavecode/server/dist/daemon/routes/installations.js +1 -0
  164. package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
  165. package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
  166. package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
  167. package/node_modules/@weavecode/server/dist/daemon/routes/pets.js +1 -1
  168. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -1
  169. package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
  170. package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -1
  171. package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
  172. package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
  173. package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
  174. package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
  175. package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +2 -2
  176. package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
  177. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +2 -0
  178. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
  179. package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
  180. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  181. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  182. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  183. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
  184. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  185. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  186. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  187. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
  188. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  189. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  190. package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
  191. package/node_modules/@weavecode/server/dist/db/db.js +2 -2
  192. package/node_modules/@weavecode/server/dist/db/layout.d.ts +5 -0
  193. package/node_modules/@weavecode/server/dist/db/layout.js +2 -1
  194. package/node_modules/@weavecode/server/dist/db/paths.d.ts +5 -0
  195. package/node_modules/@weavecode/server/dist/db/paths.js +1 -1
  196. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  197. package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
  198. package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
  199. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
  200. package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
  201. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
  202. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
  203. package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
  204. package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
  205. package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
  206. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  207. package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
  208. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  209. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  210. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
  211. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  212. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  213. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +5 -5
  214. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  215. package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
  216. package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
  217. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  218. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  219. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  220. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  221. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  222. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  223. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  224. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  225. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  226. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  227. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
  228. package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
  229. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  230. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  231. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  232. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  233. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  234. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  235. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  236. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  237. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
  238. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  239. package/node_modules/@weavecode/server/dist/install/init-files.d.ts +0 -9
  240. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
  241. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  242. package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
  243. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  244. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  245. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  246. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  247. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  248. package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
  249. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  250. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  251. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  252. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  253. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  254. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  255. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  256. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  257. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  258. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  259. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  260. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  261. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +4 -4
  262. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +6 -6
  263. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  264. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  265. package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
  266. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  267. package/node_modules/@weavecode/server/dist/repositories/projects.js +1 -1
  268. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  269. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  270. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  271. package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
  272. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  273. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
  274. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
  275. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  276. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  277. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  278. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  279. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  280. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  281. package/node_modules/@weavecode/server/package.json +4 -4
  282. package/node_modules/@weavecode/server/web/dist/assets/{abnfDiagram-WEYOIA3C-t5OQjhuS.js → abnfDiagram-WEYOIA3C-S1lL1V_n.js} +1 -1
  283. package/node_modules/@weavecode/server/web/dist/assets/{arc-De-uH_Q9.js → arc-CoTNHyHV.js} +1 -1
  284. package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-ImPclD43.js → architectureDiagram-ZHVYKT53-C6ttfnzW.js} +1 -1
  285. package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-B5xEQs6X.js → blockDiagram-RJAE7QA3-CYr3Cpu9.js} +1 -1
  286. package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DP8MjIgJ.js → c4Diagram-XDPPPE54-BFS7PhLD.js} +1 -1
  287. package/node_modules/@weavecode/server/web/dist/assets/channel-DxQHp3Yc.js +1 -0
  288. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-C3UFIDyj.js → chunk-2E7WHVMD-DJ7X_Shu.js} +1 -1
  289. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-Bgw-3YfG.js → chunk-2Q5K7J3B-B8nr2rdz.js} +1 -1
  290. package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-Dy_Wq9qn.js → chunk-4EMNKR2T-DmnZmUMU.js} +1 -1
  291. package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-D32C0DXX.js → chunk-55XCU76K-Xz9a8dmp.js} +1 -1
  292. package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-Dpmi-9Gi.js → chunk-5VM5RSS4-Dg9mg7pf.js} +1 -1
  293. package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CEYXaZDX.js → chunk-JWPE2WC7-CmjTZO8o.js} +1 -1
  294. package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-A616Pgzo.js → chunk-VQ5W62QI-D3YDdJ3E.js} +1 -1
  295. package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-CnxFMLWV.js → chunk-XXDRQBXY-s1OG9sqW.js} +1 -1
  296. package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-BhjCTig8.js → chunk-ZCHMQSOR-C3hINQU3.js} +2 -2
  297. package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-rzlq5tPv.js → classDiagram-v2-4MYWR3UA-BTsbYrVl.js} +1 -1
  298. package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-CxWQXzj8.js → cose-bilkent-JH36ORCC-C0W8Y-jI.js} +1 -1
  299. package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-AFHjx2wU.js → cynefin-EF2NZ3EQ-stAu4Rh-.js} +1 -1
  300. package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-Bp_Oaf9U.js → cynefinDiagram-WF24UDRP-CqYibiiv.js} +1 -1
  301. package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-7oUPIU35.js → dagre-NK4GIZVX-qqcoJAqB.js} +1 -1
  302. package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-D_rS_rSY.js → diagram-CBK3MWTC-D0YTopb7.js} +1 -1
  303. package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-Duc_cKMb.js → diagram-I5XIIV2D-Csvw6aYr.js} +1 -1
  304. package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-DA0XFVXm.js → diagram-ODIL2UCW-Dl0tYLkF.js} +1 -1
  305. package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-D1U0Xhtt.js → diagram-PFBEJUXE-BCPSWZPe.js} +1 -1
  306. package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-CbDFY871.js → diagram-RJA3I4VV-ETg-BrAJ.js} +1 -1
  307. package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-jPg9AxQv.js → diagram-TYUNFSNR-_M6ZxBG7.js} +1 -1
  308. package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-ZHfGTB0N.js → ebnfDiagram-V4P3TTPT-C-e_W7qx.js} +1 -1
  309. package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-C-ESJrUi.js → elk-QONTBCTQ-B5TBharB.js} +1 -1
  310. package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-DGK7TeHj.js → erDiagram-KYQIGQAA-D08rj2pv.js} +1 -1
  311. package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-CVV4rL8v.js → flowDiagram-IUGLLWBU-BALTxsKh.js} +1 -1
  312. package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-CuAwNvbm.js → ganttDiagram-R7GPNTJY-Cts193jT.js} +1 -1
  313. package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-D_15Wtf-.js → gitGraphDiagram-PDYL7XHY-L9qYUX0v.js} +1 -1
  314. package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-ClqhbrCa.js → infoDiagram-MVDRKAX5-Bv47rgU0.js} +1 -1
  315. package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-CUJ891JX.js → ishikawaDiagram-HPEHV2GE-Da8_s6cs.js} +1 -1
  316. package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-B4skiMu-.js → journeyDiagram-BOSHW7O7-Bj3CjZOf.js} +1 -1
  317. package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-UNGJR_y_.js → kanban-definition-FNSA4HC5-D1hicmMu.js} +1 -1
  318. package/node_modules/@weavecode/server/web/dist/assets/{linear-BEB-UwbR.js → linear-CWQg2iA1.js} +1 -1
  319. package/node_modules/@weavecode/server/web/dist/assets/main-XLn3EZFh.css +11 -0
  320. package/node_modules/@weavecode/server/web/dist/assets/main-bsb0lQoL.js +1096 -0
  321. package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-knGXJfjz.js → mermaid.core-C-wP0Zg2.js} +4 -4
  322. package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-CEldbr3a.js → mindmap-definition-6OY57UG3-Dk0VKqre.js} +1 -1
  323. package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-cNCkGLx3.js → pegDiagram-ECIUJNBX-Bp1K_F9z.js} +1 -1
  324. package/node_modules/@weavecode/server/web/dist/assets/pet-J6izA90s.js +1 -0
  325. package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-CfMEFiQD.js → pieDiagram-GNMPY74T-BZ4rGy3t.js} +1 -1
  326. package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-knmi2rwP.js → quadrantDiagram-D57K4MC3-B4N5KRsR.js} +1 -1
  327. package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-BJ7AzhEo.js → railroadDiagram-Y72NRBL7-C8nx8oHf.js} +1 -1
  328. package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-Dte2LGQM.js → requirementDiagram-EQYSW5RA-VSH57d0d.js} +1 -1
  329. package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-3noLaWgd.js → sankeyDiagram-SY24JHO5-jUb1hcya.js} +1 -1
  330. package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-CclOWTTc.js → sequenceDiagram-BLEHNHQU-E2BioCNi.js} +1 -1
  331. package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-B82sbLhA.js → sizeCapture-INFHLROL-BdKrbRmI.js} +1 -1
  332. package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-BXfVDwSN.js → stateDiagram-v2-A6IESKWZ-tFz7uNM7.js} +1 -1
  333. package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-D4lKZaeV.js → swimlanes-B3ENRKFQ-B9BAPDWw.js} +1 -1
  334. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DQ2NPLl9.js +8 -0
  335. package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-D6H6zP5b.js → timeline-definition-JXYKGLGB-CofNnFTK.js} +1 -1
  336. package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-D2J2bKo_.js → usecaseDiagram-WPOLBNNX-DOvjhJjJ.js} +1 -1
  337. package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-pdRbIkpB.js → vennDiagram-Q3Y3IDCW-BcFHWnhS.js} +1 -1
  338. package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-Cyd2QPMf.js → wardleyDiagram-IVAIDKWA-Bz2aqRAs.js} +1 -1
  339. package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-Bd4BkwVM.js → xychartDiagram-4URNHDU4-DpNF6Vsq.js} +1 -1
  340. package/node_modules/@weavecode/server/web/dist/index.html +2 -2
  341. package/node_modules/@weavecode/server/web/dist/pet.html +80 -10
  342. package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/pet.json +1 -1
  343. package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/spritesheet.png +0 -0
  344. package/node_modules/@weavecode/templates/package.json +2 -2
  345. package/package.json +6 -6
  346. package/scripts/preinstall.mjs +60 -22
  347. package/node_modules/@weavecode/server/web/dist/assets/channel-C0RGiobt.js +0 -1
  348. package/node_modules/@weavecode/server/web/dist/assets/main-B_0jS_Gz.js +0 -1096
  349. package/node_modules/@weavecode/server/web/dist/assets/main-Czzlavi4.css +0 -11
  350. package/node_modules/@weavecode/server/web/dist/assets/pet-DJCpIDM5.js +0 -1
  351. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DbdFh_d6.js +0 -8
@@ -1 +1 @@
1
- import{readdir as a}from"node:fs/promises";import{existsSync as d}from"node:fs";import{join as o}from"node:path";import{registerProject as f}from"@weavecode/server";import{logger as c}from"@weavecode/core";import{createRuntimeRegistry as m}from"@weavecode/harness";import{t as u}from"../i18n/index.js";const p=new Set(["node_modules",".git","dist","build",".next","coverage",".cache"]),g=m().byCapability("detect").map(t=>t.detect).filter(t=>t!==void 0);export async function findProjectDirs(e,t=0,r=6){if(t>r)return[];if(d(o(e,".weave"))||g.some(i=>i.present(e)))return[e];let n;try{n=await a(e,{withFileTypes:!0})}catch{return[]}const s=[];for(const i of n)i.isDirectory()&&(i.name.startsWith(".")||p.has(i.name)||s.push(...await findProjectDirs(o(e,i.name),t+1,r)));return s}export const scanCommand={name:"scan",description:"cmd.scan.desc",options:[{name:"dir",short:"d",description:"flag.scan.dir",type:"string",default:process.cwd()}],async action(e){const t=String(e.flags.dir??process.cwd()),r=await findProjectDirs(t);for(const n of r)f(n,"scan");if(c.success(u("out.scan.registered",{count:r.length,root:t})),r.length>0)for(const n of r)c.dim(` ${n}`)}};
1
+ 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,e=6){if(s>e)return[];if(m(n(t,".weave"))||u.some(o=>o.present(t)))return[t];let r;try{r=await c(t,{withFileTypes:!0})}catch{return[]}const i=[];for(const o of r)o.isDirectory()&&(o.name.startsWith(".")||g.has(o.name)||i.push(...await findProjectDirs(n(t,o.name),s+1,e)));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()),e=await findProjectDirs(s);for(const r of e)d(r,"scan");if(a.success(p("out.scan.registered",{count:e.length,root:s})),e.length>0)for(const r of e)a.dim(` ${r}`)}};
@@ -1,2 +1,2 @@
1
- import u from"node:path";import b from"node:os";import{readFile as y}from"node:fs/promises";import{fileExists as S,logger as l,formatTable as k,HARNESS_DIRS as j,HARNESS_INSTRUCTION_FILES as x,HARNESS_KEYS as E}from"@weavecode/core";import{createRuntimeRegistry as I}from"@weavecode/harness";import{WEAVE_VERSION as N}from"@weavecode/server";import{checkHarness as $}from"../init/harness-checks.js";import{t as o}from"../i18n/index.js";async function C(i){const t=u.join(i,".weave","config.yaml");if(!await S(t))return null;try{const e=await y(t,"utf-8"),a={};for(const r of e.split(`
2
- `)){const n=r.indexOf(":");n>0&&(a[r.slice(0,n).trim()]=r.slice(n+1).trim())}return a}catch{return null}}async function D(i,t){return await S(u.join(t,i))?"out.status.present":"out.status.missing"}async function c(i,t,e){return[i,o(await D(t,e))]}function V(i,t,e){if(!i)return null;try{const a=i.targetDir(t,"project",e,b.homedir());return u.relative(e,a).split(u.sep).join("/")}catch{return null}}export const statusCommand={name:"status",description:"cmd.status.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(i){const t=String(i.flags.dir??process.cwd()),e=await C(t);if(!e){l.warn(o("out.status.notInitialized"));return}l.info(o("out.status.header"));const a=I(),r=a.byCapability("detect").flatMap(s=>s.detect&&s.detect.detect(t).present?[s.id]:[]),n=[[o("out.status.col.cliVersion"),N],[o("out.status.col.initVersion"),e.initVersion??o("out.status.unknown")],[o("out.status.col.initialized"),e.initTimestamp??o("out.status.unknown")],[o("out.status.col.preset"),e.preset??o("out.status.unknown")],[o("out.status.col.harness"),r.length>0?r.join(", "):o("out.status.unknown")]],f=E[0],p=j[f].projectDir,d=a.get(f)?.assets;for(const s of x[f])n.push(await c(s,s,t));n.push(await c("settings.json",`${p}/settings.json`,t)),n.push(await c(".mcp.json",".mcp.json",t)),n.push(await c("helpers",`${p}/helpers`,t));const w=d?.projectSkillsRoots()[0]??`${p}/skills`;n.push(await c(u.posix.basename(w),w,t));const R=[["commands","command"],["agents","agent"]];for(const[s,m]of R){const h=V(d,m,t)??`${p}/${s}`;n.push(await c(u.posix.basename(h),h,t))}for(const s of r){if(s===f)continue;const m=a.get(s)?.assets?.projectSkillsRoots()[0]??`${j[s].projectDir}/skills`;n.push(await c(m,m,t))}console.log(k(n)),console.log();const g=await $(t);if(g.length>0){l.warn(o("out.status.issuesFound",{count:g.length}));for(const s of g)l.warn(o("out.status.issue",{message:s.message})),l.dim(o("out.status.fix",{fix:s.fix}));console.log()}}};
1
+ import c from"node:path";import R from"node:os";import{readFile as k}from"node:fs/promises";import{fileExists as S,logger as l,formatTable as E,HARNESS_DIRS as j,HARNESS_INSTRUCTION_FILES as x,HARNESS_KEYS as I}from"@weavecode/core";import{createRuntimeRegistry as N}from"@weavecode/harness";import{WEAVE_VERSION as $}from"@weavecode/server";import{checkHarness as b}from"../init/harness-checks.js";import{t as o}from"../i18n/index.js";async function V(e){const t=c.join(e,".weave","config.yaml");if(!await S(t))return null;try{const i=await k(t,"utf-8"),a={};for(const r of i.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 _(e,t){return await S(c.join(t,e))?"out.status.present":"out.status.missing"}async function u(e,t,i){return[e,o(await _(t,i))]}function D(e,t,i){if(!e)return null;try{const a=e.targetDir(t,"project",i,R.homedir());return c.relative(i,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(e){const t=String(e.flags.dir??process.cwd()),i=await V(t);if(!i){l.warn(o("out.status.notInitialized"));return}l.info(o("out.status.header"));const a=N(),r=a.byCapability("detect").flatMap(s=>s.detect&&s.detect.detect(t).present?[s.id]:[]),n=[[o("out.status.col.cliVersion"),$],[o("out.status.col.initVersion"),i.initVersion??o("out.status.unknown")],[o("out.status.col.initialized"),i.initTimestamp??o("out.status.unknown")],[o("out.status.col.preset"),i.preset??o("out.status.unknown")],[o("out.status.col.harness"),r.length>0?r.join(", "):o("out.status.unknown")]],p=I[0],f=j[p].projectDir,g=a.get(p)?.assets;for(const s of x[p])n.push(await u(s,s,t));n.push(await u("settings.json",`${f}/settings.json`,t)),n.push(await u(".mcp.json",".mcp.json",t)),n.push(await u("helpers",`${f}/helpers`,t));const w=g?.projectSkillsRoots()[0]??`${f}/skills`;n.push(await u(c.posix.basename(w),w,t));const y=[["commands","command"],["agents","agent"]];for(const[s,m]of y){const h=D(g,m,t)??`${f}/${s}`;n.push(await u(c.posix.basename(h),h,t))}for(const s of r){if(s===p)continue;const m=a.get(s)?.assets?.projectSkillsRoots()[0]??`${j[s].projectDir}/skills`;n.push(await u(m,m,t))}console.log(E(n)),console.log();const d=await b(t);if(d.length>0){l.warn(o("out.status.issuesFound",{count:d.length}));for(const s of d)l.warn(o("out.status.issue",{message:s.message})),l.dim(o("out.status.fix",{fix:s.fix}));console.log()}}};
@@ -1 +1 @@
1
- import{logger as t}from"@weavecode/core";import{executeUninstall as a}from"../init/uninstall.js";import{t as i}from"../i18n/index.js";function o(n){n.outcome==="removed"?t.dim(i("out.uninstall.serverRemoved",{name:n.name??"",events:n.purged?.events??0,dispatches:n.purged?.dispatches??0,sessions:n.purged?.sessions??0})):n.outcome==="failed"&&t.warn(i("out.uninstall.serverFailed",{error:n.error??""}))}export const uninstallCommand={name:"uninstall",description:"cmd.uninstall.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(n){const s=String(n.flags.dir??process.cwd());t.info(i("out.uninstall.banner",{target:s}));const e=await a({targetDir:s});if(e.status==="not-initialized"){t.warn(i("out.uninstall.notInitialized")),o(e.server);return}if(t.success(i("out.uninstall.done",{files:e.removedFiles.length,dirs:e.removedDirs.length})),e.modifiedFiles.length>0&&t.dim(i("out.uninstall.modified",{count:e.modifiedFiles.length})),e.keptUserFiles.length>0){t.dim(i("out.uninstall.keptUser",{count:e.keptUserFiles.length}));for(const r of e.keptUserFiles)t.dim(` ${r}`)}switch(e.restoredFromBackup&&t.dim(i("out.uninstall.restored",{path:e.restoredFromBackup})),o(e.server),e.git){case"reset":t.dim(i("out.uninstall.gitReset",{sha:e.gitSha??""}));break;case"committed":t.dim(i("out.uninstall.gitCommit",{sha:e.gitSha??"",count:e.removedFiles.length+e.modifiedFiles.length}));break;case"no-changes":t.dim(i("out.uninstall.gitNoChanges"));break;case"skipped-dirty-index":t.warn(i("out.uninstall.gitDirty"));break;case"skipped-not-repo":t.dim(i("out.uninstall.gitNotRepo"));break;case"failed":t.warn(i("out.uninstall.gitFailed",{error:e.gitError??""}));break}}};
1
+ import{logger as t}from"@weavecode/core";import{executeUninstall as a}from"../init/uninstall.js";import{t as i}from"../i18n/index.js";function r(n){n.outcome==="removed"?t.dim(i("out.uninstall.serverRemoved",{name:n.name??"",events:n.purged?.events??0,dispatches:n.purged?.dispatches??0,sessions:n.purged?.sessions??0})):n.outcome==="failed"&&t.warn(i("out.uninstall.serverFailed",{error:n.error??""}))}export const uninstallCommand={name:"uninstall",description:"cmd.uninstall.desc",options:[{name:"dir",short:"d",description:"flag.dir",type:"string",default:process.cwd()}],async action(n){const s=String(n.flags.dir??process.cwd());t.info(i("out.uninstall.banner",{target:s}));const e=await a({targetDir:s});if(e.status==="not-initialized"){t.warn(i("out.uninstall.notInitialized")),r(e.server);return}if(t.success(i("out.uninstall.done",{files:e.removedFiles.length,dirs:e.removedDirs.length})),e.modifiedFiles.length>0&&t.dim(i("out.uninstall.modified",{count:e.modifiedFiles.length})),e.keptUserFiles.length>0){t.dim(i("out.uninstall.keptUser",{count:e.keptUserFiles.length}));for(const o of e.keptUserFiles)t.dim(` ${o}`)}switch(e.restoredFromBackup&&t.dim(i("out.uninstall.restored",{path:e.restoredFromBackup})),r(e.server),e.git){case"reset":t.dim(i("out.uninstall.gitReset",{sha:e.gitSha??""}));break;case"committed":t.dim(i("out.uninstall.gitCommit",{sha:e.gitSha??"",count:e.removedFiles.length+e.modifiedFiles.length}));break;case"no-changes":t.dim(i("out.uninstall.gitNoChanges"));break;case"skipped-dirty-index":t.warn(i("out.uninstall.gitDirty"));break;case"skipped-not-repo":t.dim(i("out.uninstall.gitNotRepo"));break;case"failed":t.warn(i("out.uninstall.gitFailed",{error:e.gitError??""}));break}}};
@@ -22,7 +22,7 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en
22
22
  `,"init.skipped":` Skipped {count} existing file(s). Use --force to overwrite.
23
23
  `,"init.completedWithErrors":`
24
24
  Init completed with errors
25
- `,"init.errorLine":" - {error}","init.nonInteractive":"Running in non-interactive mode","init.userCaptureActive":"User-scope capture is installed \u2014 skipping project hooks (weave groups swept)","init.skippedInvalidJson":"Skipped {path}: not valid JSON. Fix or remove it, or use --force.","init.backedUp":"Backed up the previous AGENTS.md to {path}","init.copyTemplatesFailed":"Could not copy templates from {srcDir}: {error}","init.pluginMcpRenamed":"Plugin MCP server name conflict, prefixed: {renamed}","init.proceed":"Proceed? [Y/n]","init.commit.question":"Commit the outputs of this init as a single commit?","init.commit.detail":"Will commit: {paths}","init.commit.preStaged":"Staged changes already present \u2014 skipping the auto-commit (to avoid sweeping in unrelated edits).","init.commit.pathIgnored":"Ignored by .gitignore, not added: {paths}","init.commit.failed":"Commit failed: {error}","init.commit.done":"Created commit {sha} ({count} files)","init.hooksUnknownKeys":"Ignored unknown hook event names: {keys}","init.harnessUnknownKeys":"Ignored unknown harness name(s): {keys}","init.multiselect.title":"Select harnesses to initialize (multiple allowed):","init.multiselect.hint":"Enter numbers or names (comma-separated), or press Enter for {defaults}:","init.multiselect.invalid":"Ignored unrecognized selection(s): {keys}","init.noPeerFace":"no equivalent surface","init.stepSkipped":"Skipped {step}: {reason}","init.install.installed":" {harness} installed ({version})","init.install.versionLow":" {harness} version {version} is below the suggested minimum {min} \u2014 run `{command}` to upgrade","init.install.notFound":" {harness} not detected","init.install.confirm":"Install {harness} now?","init.install.detail":"Will run: {command}","init.install.running":" Installing {harness}...","init.install.done":" {harness} installed ({version})","init.install.verifyFailed":" {harness} still not detected after install \u2014 run manually later: {command}","init.install.declined":" Skipped install. Run manually later: {command}","init.install.npmMissing":" npm not found \u2014 cannot auto-install. Run manually: {command}","init.trust.prewritten":" Prewrote {harness} folder trust (first open won't ask)","init.trust.failed":" Failed to prewrite {harness} trust state (init continues): {error}","init.provision.conflict":` \u26A0 {harness} install-shape conflict: {warning}
25
+ `,"init.errorLine":" - {error}","init.nonInteractive":"Running in non-interactive mode","init.userCaptureActive":"User-scope capture is installed \u2014 skipping project hooks (weave groups swept)","init.skippedInvalidJson":"Skipped {path}: not valid JSON. Fix or remove it, or use --force.","init.backedUp":"Backed up the previous AGENTS.md to {path}","init.copyTemplatesFailed":"Could not copy templates from {srcDir}: {error}","init.pluginMcpRenamed":"Plugin MCP server name conflict, prefixed: {renamed}","init.proceed":"Proceed? [Y/n]","init.commit.question":"Commit the outputs of this init as a single commit?","init.commit.detail":"Will commit: {paths}","init.commit.preStaged":"Staged changes already present \u2014 skipping the auto-commit (to avoid sweeping in unrelated edits).","init.commit.pathIgnored":"Ignored by .gitignore, not added: {paths}","init.commit.failed":"Commit failed: {error}","init.commit.done":"Created commit {sha} ({count} files)","init.exclude.done":"Local files registered in git exclude: {file}","init.instruction.localCreated":"Wrote local instruction file {file} (not version-controlled)","init.instruction.agentsMerged":"Merged weave's block into {file} (codex reads shared instructions from it)","init.hooksUnknownKeys":"Ignored unknown hook event names: {keys}","init.harnessUnknownKeys":"Ignored unknown harness name(s): {keys}","init.multiselect.title":"Select harnesses to initialize (multiple allowed):","init.multiselect.hint":"Enter numbers or names (comma-separated), or press Enter for {defaults}:","init.multiselect.invalid":"Ignored unrecognized selection(s): {keys}","init.noPeerFace":"no equivalent surface","init.stepSkipped":"Skipped {step}: {reason}","init.install.installed":" {harness} installed ({version})","init.install.versionLow":" {harness} version {version} is below the suggested minimum {min} \u2014 run `{command}` to upgrade","init.install.notFound":" {harness} not detected","init.install.confirm":"Install {harness} now?","init.install.detail":"Will run: {command}","init.install.running":" Installing {harness}...","init.install.done":" {harness} installed ({version})","init.install.verifyFailed":" {harness} still not detected after install \u2014 run manually later: {command}","init.install.declined":" Skipped install. Run manually later: {command}","init.install.npmMissing":" npm not found \u2014 cannot auto-install. Run manually: {command}","init.trust.prewritten":" Prewrote {harness} folder trust (first open won't ask)","init.trust.failed":" Failed to prewrite {harness} trust state (init continues): {error}","init.provision.conflict":` \u26A0 {harness} install-shape conflict: {warning}
26
26
  Official fix: {hint}`,"init.provision.checkFailed":" {harness} install-shape check failed (init continues): {error}","claudemd.rules":`## Behavioral Rules
27
27
 
28
28
  - Follow existing code conventions and patterns in this project
@@ -48,4 +48,4 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en
48
48
  - Prefer parameterized queries and safe APIs over string concatenation
49
49
 
50
50
  `,"claudemd.skills":"## Skills\n\nReusable skills live in your harness's own skills directory (Claude Code: `.claude/skills/`): one directory per skill, each with a `SKILL.md`; invoke a skill by name when the task matches one.\n\n","claudemd.visualize":'## Render Blocks\n\nTo embed an HTML snapshot in a weave conversation: write the fragment inside the project (e.g. `.weave/previews/<name>.html`) or under `{dir}` \u2014 the server rejects any other location; put the reference on its **own line**: U+E200 + `visualize` + U+E202 + `{"path":"<abs>"}` + U+E201.\n\n',"init.removed":` Removed {count} stale generated file(s) by marker.
51
- `,"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."};
51
+ `,"harness.instructionLinkNotMaterialised.message":'{agents} is a plain file containing "{claude}" \u2014 git checked the symlink out as text.',"harness.instructionLinkNotMaterialised.fix":"Enable Developer Mode, then run `git config core.symlinks true` and re-checkout the file.","harness.instructionFilesDuplicated.message":"{claude} and {agents} are both regular files \u2014 they will drift apart.","harness.instructionFilesDuplicated.fix":"Run `weave init` to link one to the other (the displaced file is backed up).","harness.instructionLinkDangling.message":"{name} is a symlink whose target does not exist.","harness.instructionLinkDangling.fix":"Run `weave init` to rewrite the link and the instruction file.","harness.localInstructionAppend.message":"{file}: local private instructions active (stacked with the project instructions).","harness.localInstructionAppend.fix":"This file is machine-local (not version-controlled) \u2014 instructions meant to be shared go in CLAUDE.md.","harness.localInstructionOverride.message":"{file}: local OVERRIDE instructions active \u2014 the host no longer reads AGENTS.md in this directory; include shared instructions here too.","harness.localInstructionOverride.fix":"After editing AGENTS.md, copy the shared instructions here for them to take effect.","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."};
@@ -182,6 +182,9 @@ export declare const zh: {
182
182
  'init.commit.pathIgnored': string;
183
183
  'init.commit.failed': string;
184
184
  'init.commit.done': string;
185
+ 'init.exclude.done': string;
186
+ 'init.instruction.localCreated': string;
187
+ 'init.instruction.agentsMerged': string;
185
188
  'init.hooksUnknownKeys': string;
186
189
  'init.harnessUnknownKeys': string;
187
190
  'init.multiselect.title': string;
@@ -215,6 +218,10 @@ export declare const zh: {
215
218
  'harness.instructionFilesDuplicated.fix': string;
216
219
  'harness.instructionLinkDangling.message': string;
217
220
  'harness.instructionLinkDangling.fix': string;
221
+ 'harness.localInstructionAppend.message': string;
222
+ 'harness.localInstructionAppend.fix': string;
223
+ 'harness.localInstructionOverride.message': string;
224
+ 'harness.localInstructionOverride.fix': string;
218
225
  'harness.statuslinePathUnresolved.message': string;
219
226
  'harness.statuslinePathUnresolved.fix': string;
220
227
  'harness.statuslinePathForeign.message': string;
@@ -1,4 +1,4 @@
1
- import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const zh={"help.tagline":"weave v{version} \u2014 Harness \u5DE5\u5177","help.usage":"\u7528\u6CD5\uFF1Aweave <\u547D\u4EE4> [\u9009\u9879]","help.commands":"\u547D\u4EE4\uFF1A","help.globalOptions":"\u5168\u5C40\u9009\u9879\uFF1A","help.subcommands":"\u53EF\u7528\u5B50\u547D\u4EE4\uFF1A","cli.unknownCommand":"\u672A\u77E5\u547D\u4EE4\uFF1A{command}","cli.error":"\u9519\u8BEF\uFF1A{error}","cli.missingRequired":"\u7F3A\u5C11\u5FC5\u586B\u9009\u9879\uFF1A--{name}","cli.invalidChoice":'--{name} \u7684\u53D6\u503C "{value}" \u65E0\u6548\uFF0C\u53EF\u9009\u503C\uFF1A{choices}',"cli.missingSubcommand":"\u547D\u4EE4 {command} \u9700\u8981\u4E00\u4E2A\u5B50\u547D\u4EE4","cli.unknownSubcommand":"\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A{command} {subcommand}","cli.unexpectedPositional":"\u547D\u4EE4 {command} \u4E0D\u63A5\u53D7\u53C2\u6570\u300C{arg}\u300D","flag.help":"\u663E\u793A\u5E2E\u52A9","flag.version":"\u663E\u793A\u7248\u672C","flag.verbose":"\u8BE6\u7EC6\u8F93\u51FA","flag.quiet":"\u6291\u5236\u975E\u5FC5\u8981\u8F93\u51FA","cmd.init.desc":"\u5728\u5F53\u524D\u9879\u76EE\u521D\u59CB\u5316 weave harness","cmd.uninstall.desc":"\u5378\u8F7D weave\uFF1A\u79FB\u9664 init \u751F\u6210\u7269\uFF08init \u63D0\u4EA4\u521A\u843D\u76D8\u65F6\u56DE\u6EDA\u6307\u9488\uFF0C\u5426\u5219\u751F\u6210\u5378\u8F7D\u63D0\u4EA4\uFF09","cmd.status.desc":"\u67E5\u770B\u5F53\u524D harness \u72B6\u6001","cmd.daemon.desc":"\u7BA1\u7406\u540E\u53F0\u5B88\u62A4\u8FDB\u7A0B\uFF08start\u3001stop\u3001status\uFF09","cmd.daemon.start.desc":"\u5728\u540E\u53F0\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF08\u4E0D\u5F00\u6D4F\u89C8\u5668\u2014\u2014\u89C1 `weave dashboard`\uFF09","cmd.daemon.stop.desc":"\u505C\u6B62\u8FD0\u884C\u4E2D\u7684\u5B88\u62A4\u8FDB\u7A0B","cmd.daemon.status.desc":"\u67E5\u770B\u5B88\u62A4\u8FDB\u7A0B\u72B6\u6001","cmd.dashboard.desc":"\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00 web \u63A7\u5236\u53F0\uFF08\u5FC5\u8981\u65F6\u5148\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF09","cmd.chpass.desc":"\u4FEE\u6539 dashboard \u767B\u5F55\u5BC6\u7801\uFF08\u6307\u5B9A\u65B0\u5BC6\u7801\uFF1B\u672C\u673A\u6267\u884C\u4E0D\u9700\u8981\u65E7\u5BC6\u7801\uFF09","cmd.scan.desc":"\u626B\u63CF\u5DF2\u521D\u59CB\u5316 weave \u7684\u9879\u76EE\u5E76\u6CE8\u518C","cmd.doctor.desc":"\u8BCA\u65AD\u672C\u673A\u63A5\u7EBF\uFF1A\u8FD9\u6761\u68C0\u51FA\u662F\u5426\u5DF2\u6CE8\u518C\u8FDB\u672C\u673A weave server","flag.init.preset":"\u914D\u7F6E\u9884\u8BBE\uFF1Aminimal\u3001default \u6216 full","flag.init.force":"\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6587\u4EF6","flag.init.noInteractive":"\u7981\u7528\u4EA4\u4E92\u5F0F\u63D0\u793A","flag.init.hooks":"\u542F\u7528\u7684 hook \u4E8B\u4EF6\uFF0C\u9017\u53F7\u5206\u9694\uFF08preToolUse,postToolUse,userPromptSubmit,sessionStart,stop,stopFailure,subagentStop,subagentStart,notification,postToolUseFailure,permissionRequest,permissionDenied,preCompact,sessionEnd,preModelSwitch\uFF09\uFF1Bnone \u8868\u793A\u5168\u4E0D\u6CE8\u518C\uFF1B\u9ED8\u8BA4\u5168\u5F00","flag.init.harness":`\u8981\u521D\u59CB\u5316\u7684 harness \u9762\uFF0C\u9017\u53F7\u5206\u9694\uFF08${e.join("\u3001")}\uFF09\uFF1B\u7F3A\u7701\u65F6 TTY \u4E0B\u4EA4\u4E92\u591A\u9009\uFF0C\u9ED8\u8BA4 ${e[0]}`,"flag.dir":"\u76EE\u6807\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.scan.dir":"\u626B\u63CF\u7684\u6839\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.dashboard.noOpen":"\u53EA\u6253\u5370 dashboard URL\uFF0C\u4E0D\u6253\u5F00\u6D4F\u89C8\u5668","out.daemon.alreadyRunning":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u5728 {port} \u7AEF\u53E3\u8FD0\u884C","out.daemon.started":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8\uFF1Ahttp://{host}:{port}","out.daemon.startUnconfirmed":"\u5B88\u62A4\u8FDB\u7A0B\u5728 {port} \u7AEF\u53E3\u8FDF\u8FDF\u672A\u5E94\u7B54\u2014\u2014\u53EF\u80FD\u542F\u52A8\u5931\u8D25\u4E86\uFF08\u8BE6\u89C1\u6570\u636E\u76EE\u5F55 cache/logs/daemon-boot.log\uFF09","out.daemon.stopped":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\uFF08pid {pid}\uFF09\u3002","out.daemon.statusNotRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u672A\u8FD0\u884C","out.daemon.statusRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u8FD0\u884C\u4E2D\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port}\uFF0C\u5DF2\u8FD0\u884C {uptime}s\uFF09","out.daemon.urlsTitle":"\u8BBF\u95EE\u5730\u5740\uFF1A","out.daemon.statusStale":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u72B6\u6001\u8FC7\u671F\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port} \u65E0\u54CD\u5E94\uFF09","out.doctor.header":`
1
+ import{HARNESS_DIRS as F,HARNESS_KEYS as u}from"@weavecode/core";export const zh={"help.tagline":"weave v{version} \u2014 Harness \u5DE5\u5177","help.usage":"\u7528\u6CD5\uFF1Aweave <\u547D\u4EE4> [\u9009\u9879]","help.commands":"\u547D\u4EE4\uFF1A","help.globalOptions":"\u5168\u5C40\u9009\u9879\uFF1A","help.subcommands":"\u53EF\u7528\u5B50\u547D\u4EE4\uFF1A","cli.unknownCommand":"\u672A\u77E5\u547D\u4EE4\uFF1A{command}","cli.error":"\u9519\u8BEF\uFF1A{error}","cli.missingRequired":"\u7F3A\u5C11\u5FC5\u586B\u9009\u9879\uFF1A--{name}","cli.invalidChoice":'--{name} \u7684\u53D6\u503C "{value}" \u65E0\u6548\uFF0C\u53EF\u9009\u503C\uFF1A{choices}',"cli.missingSubcommand":"\u547D\u4EE4 {command} \u9700\u8981\u4E00\u4E2A\u5B50\u547D\u4EE4","cli.unknownSubcommand":"\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A{command} {subcommand}","cli.unexpectedPositional":"\u547D\u4EE4 {command} \u4E0D\u63A5\u53D7\u53C2\u6570\u300C{arg}\u300D","flag.help":"\u663E\u793A\u5E2E\u52A9","flag.version":"\u663E\u793A\u7248\u672C","flag.verbose":"\u8BE6\u7EC6\u8F93\u51FA","flag.quiet":"\u6291\u5236\u975E\u5FC5\u8981\u8F93\u51FA","cmd.init.desc":"\u5728\u5F53\u524D\u9879\u76EE\u521D\u59CB\u5316 weave harness","cmd.uninstall.desc":"\u5378\u8F7D weave\uFF1A\u79FB\u9664 init \u751F\u6210\u7269\uFF08init \u63D0\u4EA4\u521A\u843D\u76D8\u65F6\u56DE\u6EDA\u6307\u9488\uFF0C\u5426\u5219\u751F\u6210\u5378\u8F7D\u63D0\u4EA4\uFF09","cmd.status.desc":"\u67E5\u770B\u5F53\u524D harness \u72B6\u6001","cmd.daemon.desc":"\u7BA1\u7406\u540E\u53F0\u5B88\u62A4\u8FDB\u7A0B\uFF08start\u3001stop\u3001status\uFF09","cmd.daemon.start.desc":"\u5728\u540E\u53F0\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF08\u4E0D\u5F00\u6D4F\u89C8\u5668\u2014\u2014\u89C1 `weave dashboard`\uFF09","cmd.daemon.stop.desc":"\u505C\u6B62\u8FD0\u884C\u4E2D\u7684\u5B88\u62A4\u8FDB\u7A0B","cmd.daemon.status.desc":"\u67E5\u770B\u5B88\u62A4\u8FDB\u7A0B\u72B6\u6001","cmd.dashboard.desc":"\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00 web \u63A7\u5236\u53F0\uFF08\u5FC5\u8981\u65F6\u5148\u542F\u52A8\u5B88\u62A4\u8FDB\u7A0B\uFF09","cmd.chpass.desc":"\u4FEE\u6539 dashboard \u767B\u5F55\u5BC6\u7801\uFF08\u6307\u5B9A\u65B0\u5BC6\u7801\uFF1B\u672C\u673A\u6267\u884C\u4E0D\u9700\u8981\u65E7\u5BC6\u7801\uFF09","cmd.scan.desc":"\u626B\u63CF\u5DF2\u521D\u59CB\u5316 weave \u7684\u9879\u76EE\u5E76\u6CE8\u518C","cmd.doctor.desc":"\u8BCA\u65AD\u672C\u673A\u63A5\u7EBF\uFF1A\u8FD9\u6761\u68C0\u51FA\u662F\u5426\u5DF2\u6CE8\u518C\u8FDB\u672C\u673A weave server","flag.init.preset":"\u914D\u7F6E\u9884\u8BBE\uFF1Aminimal\u3001default \u6216 full","flag.init.force":"\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6587\u4EF6","flag.init.noInteractive":"\u7981\u7528\u4EA4\u4E92\u5F0F\u63D0\u793A","flag.init.hooks":"\u542F\u7528\u7684 hook \u4E8B\u4EF6\uFF0C\u9017\u53F7\u5206\u9694\uFF08preToolUse,postToolUse,userPromptSubmit,sessionStart,stop,stopFailure,subagentStop,subagentStart,notification,postToolUseFailure,permissionRequest,permissionDenied,preCompact,sessionEnd,preModelSwitch\uFF09\uFF1Bnone \u8868\u793A\u5168\u4E0D\u6CE8\u518C\uFF1B\u9ED8\u8BA4\u5168\u5F00","flag.init.harness":`\u8981\u521D\u59CB\u5316\u7684 harness \u9762\uFF0C\u9017\u53F7\u5206\u9694\uFF08${u.join("\u3001")}\uFF09\uFF1B\u7F3A\u7701\u65F6 TTY \u4E0B\u4EA4\u4E92\u591A\u9009\uFF0C\u9ED8\u8BA4 ${u[0]}`,"flag.dir":"\u76EE\u6807\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.scan.dir":"\u626B\u63CF\u7684\u6839\u76EE\u5F55\uFF08\u9ED8\u8BA4\uFF1A\u5F53\u524D\u76EE\u5F55\uFF09","flag.dashboard.noOpen":"\u53EA\u6253\u5370 dashboard URL\uFF0C\u4E0D\u6253\u5F00\u6D4F\u89C8\u5668","out.daemon.alreadyRunning":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u5728 {port} \u7AEF\u53E3\u8FD0\u884C","out.daemon.started":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u542F\u52A8\uFF1Ahttp://{host}:{port}","out.daemon.startUnconfirmed":"\u5B88\u62A4\u8FDB\u7A0B\u5728 {port} \u7AEF\u53E3\u8FDF\u8FDF\u672A\u5E94\u7B54\u2014\u2014\u53EF\u80FD\u542F\u52A8\u5931\u8D25\u4E86\uFF08\u8BE6\u89C1\u6570\u636E\u76EE\u5F55 cache/logs/daemon-boot.log\uFF09","out.daemon.stopped":"\u5B88\u62A4\u8FDB\u7A0B\u5DF2\u505C\u6B62\uFF08pid {pid}\uFF09\u3002","out.daemon.statusNotRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u672A\u8FD0\u884C","out.daemon.statusRunning":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u8FD0\u884C\u4E2D\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port}\uFF0C\u5DF2\u8FD0\u884C {uptime}s\uFF09","out.daemon.urlsTitle":"\u8BBF\u95EE\u5730\u5740\uFF1A","out.daemon.statusStale":"\u5B88\u62A4\u8FDB\u7A0B\uFF1A\u72B6\u6001\u8FC7\u671F\uFF08pid {pid}\uFF0C\u7AEF\u53E3 {port} \u65E0\u54CD\u5E94\uFF09","out.doctor.header":`
2
2
  Weave Doctor \u2014\u2014 \u672C\u673A\u63A5\u7EBF
3
3
  `,"out.doctor.dir":"\u76EE\u5F55","out.doctor.initialized":"\u5DF2\u521D\u59CB\u5316","out.doctor.yes":"\u662F","out.doctor.no":"\u5426","out.doctor.daemon":"\u5B88\u62A4\u8FDB\u7A0B","out.doctor.daemonRunning":"\u8FD0\u884C\u4E2D\uFF08\u7AEF\u53E3 {port}\uFF09","out.doctor.daemonStopped":"\u672A\u8FD0\u884C","out.doctor.registered":"\u672C\u673A\u6CE8\u518C","out.doctor.registeredYes":"\u662F\uFF08id {id}\uFF0C\u6765\u6E90 {source}\uFF09","out.doctor.registeredNo":"\u5426\u2014\u2014\u8FD9\u6761\u68C0\u51FA\u4E0D\u5728\u672C\u673A\u6CE8\u518C\u8868\u91CC","out.doctor.registeredArchived":"\u5DF2\u5F52\u6863\uFF08id {id}\uFF09","out.doctor.token":"\u4EE4\u724C","out.doctor.tokenOk":"\u6B63\u5E38","out.doctor.tokenMissing":"\u7F3A\u5931\uFF08.weave/token \u4E0D\u5B58\u5728\uFF09","out.doctor.tokenUnregistered":"\u5B58\u5728\uFF0C\u4F46\u9879\u76EE\u672A\u6CE8\u518C","out.doctor.tokenStale":"\u8FC7\u671F\u2014\u2014\u4E0E\u672C\u673A\u6CE8\u518C\u8868\u7684\u4EE4\u724C\u4E0D\u4E00\u81F4","out.doctor.warnNotRegistered":"\u8FD9\u4E2A\u9879\u76EE\u5E26\u7740 weave \u6587\u4EF6\uFF0C\u5374\u6CA1\u6709\u6CE8\u518C\u8FDB\u672C\u673A weave server\u3002","out.doctor.fixInit":"\u8FD0\u884C `weave init` \u53EF\u91CD\u65B0\u6CE8\u518C\u8FD9\u6761\u68C0\u51FA\u3001\u5237\u65B0 harness \u6587\u4EF6\u5E76\u91CD\u5199\u672C\u5730\u8DEF\u5F84\u3002","out.doctor.fixScan":"\u6216\u7528 `weave scan -d <\u4E0A\u7EA7\u76EE\u5F55>` \u6279\u91CF\u53D1\u73B0\u5E76\u6CE8\u518C\u3002","out.doctor.warnArchived":"\u8FD9\u4E2A\u9879\u76EE\u5DF2\u6CE8\u518C\u4F46\u5904\u4E8E\u5F52\u6863\u6001\u2014\u2014\u5728 dashboard \u91CC\u6062\u590D\u540E\u624D\u80FD\u4F7F\u7528\u3002","out.doctor.warnTokenMissing":"\u5DF2\u6CE8\u518C\uFF0C\u4F46 `.weave/token` \u7F3A\u5931\u2014\u2014\u91CD\u65B0\u751F\u6210\u524D hook \u65E0\u6CD5\u901A\u8FC7\u9274\u6743\u3002","out.doctor.warnTokenStale":"\u5DF2\u6CE8\u518C\uFF0C\u4F46 `.weave/token` \u5C5E\u4E8E\u53E6\u4E00\u6B21\u68C0\u51FA\u2014\u2014\u9700\u8981\u91CD\u65B0\u751F\u6210\u3002","out.doctor.ok":"\u6B63\u5E38\u2014\u2014\u8FD9\u6761\u68C0\u51FA\u5DF2\u6CE8\u518C\uFF0C\u4EE4\u724C\u4E00\u81F4\u3002","out.doctor.fixDaemon":"\u5B88\u62A4\u8FDB\u7A0B\u672A\u8FD0\u884C\uFF1B\u9700\u8981\u91C7\u96C6\u65F6\u7528 `weave daemon start` \u542F\u52A8\u3002","out.doctor.diagHeader":`
4
4
  Weave Doctor \u2014\u2014 \u6D88\u606F\u6295\u9012\u8BCA\u65AD\uFF08\u9879\u76EE #{id}\uFF09
@@ -22,7 +22,7 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const zh
22
22
  `,"init.skipped":` \u5DF2\u8DF3\u8FC7 {count} \u4E2A\u5DF2\u6709\u6587\u4EF6\u3002\u4F7F\u7528 --force \u8986\u76D6\u3002
23
23
  `,"init.completedWithErrors":`
24
24
  \u521D\u59CB\u5316\u5B8C\u6210\uFF0C\u4F46\u6709\u9519\u8BEF
25
- `,"init.errorLine":" - {error}","init.nonInteractive":"\u4EE5\u975E\u4EA4\u4E92\u6A21\u5F0F\u8FD0\u884C","init.userCaptureActive":"user \u6863\u91C7\u96C6\u5DF2\u5B89\u88C5\u2014\u2014\u8DF3\u8FC7\u9879\u76EE\u6863 hooks\uFF08\u6E05\u626B weave \u7EC4\uFF09","init.skippedInvalidJson":"\u5DF2\u8DF3\u8FC7 {path}\uFF1A\u4E0D\u662F\u5408\u6CD5 JSON\u3002\u8BF7\u4FEE\u590D\u6216\u5220\u9664\u5B83\uFF0C\u6216\u4F7F\u7528 --force\u3002","init.pluginMcpRenamed":"\u63D2\u4EF6 MCP server \u91CD\u540D\u5DF2\u52A0\u524D\u7F00\uFF1A{renamed}","init.backedUp":"\u5DF2\u5C06\u539F AGENTS.md \u5907\u4EFD\u5230 {path}","init.copyTemplatesFailed":"\u65E0\u6CD5\u4ECE {srcDir} \u590D\u5236\u6A21\u677F\uFF1A{error}","init.proceed":"\u662F\u5426\u7EE7\u7EED\uFF1F[Y/n]","init.commit.question":"\u5C06\u672C\u6B21 init \u7684\u751F\u6210\u7269\u63D0\u4EA4\u4E3A\u4E00\u4E2A commit\uFF1F","init.commit.detail":"\u5C06\u63D0\u4EA4\uFF1A{paths}","init.commit.preStaged":"\u5DE5\u4F5C\u533A\u5DF2\u6709\u6682\u5B58\u53D8\u66F4\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u63D0\u4EA4\uFF08\u907F\u514D\u5E26\u5165\u65E0\u5173\u6539\u52A8\uFF09\u3002","init.commit.pathIgnored":"\u88AB .gitignore \u5FFD\u7565\uFF0C\u672A\u52A0\u5165\uFF1A{paths}","init.commit.failed":"\u521B\u5EFA commit \u5931\u8D25\uFF1A{error}","init.commit.done":"\u5DF2\u521B\u5EFA\u63D0\u4EA4 {sha}\uFF08{count} \u4E2A\u6587\u4EF6\uFF09","init.hooksUnknownKeys":"\u5DF2\u5FFD\u7565\u672A\u77E5\u7684 hooks \u4E8B\u4EF6\u540D\uFF1A{keys}","init.harnessUnknownKeys":"\u5DF2\u5FFD\u7565\u672A\u77E5\u7684 harness\uFF1A{keys}","init.multiselect.title":"\u9009\u62E9\u8981\u521D\u59CB\u5316\u7684 harness\uFF08\u53EF\u591A\u9009\uFF09\uFF1A","init.multiselect.hint":"\u8F93\u5165\u7F16\u53F7\u6216\u540D\u79F0\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF0C\u76F4\u63A5\u56DE\u8F66\u53D6\u9ED8\u8BA4 {defaults}\uFF1A","init.multiselect.invalid":"\u5DF2\u5FFD\u7565\u65E0\u6CD5\u8BC6\u522B\u7684\u9009\u62E9\uFF1A{keys}","init.noPeerFace":"\u65E0\u5BF9\u7B49\u9762","init.stepSkipped":"\u5DF2\u8DF3\u8FC7 {step}\uFF1A{reason}","init.removed":` \u5DF2\u6309\u6807\u8BB0\u6E05\u7406 {count} \u4E2A\u9057\u7559\u751F\u6210\u7269\u3002
25
+ `,"init.errorLine":" - {error}","init.nonInteractive":"\u4EE5\u975E\u4EA4\u4E92\u6A21\u5F0F\u8FD0\u884C","init.userCaptureActive":"user \u6863\u91C7\u96C6\u5DF2\u5B89\u88C5\u2014\u2014\u8DF3\u8FC7\u9879\u76EE\u6863 hooks\uFF08\u6E05\u626B weave \u7EC4\uFF09","init.skippedInvalidJson":"\u5DF2\u8DF3\u8FC7 {path}\uFF1A\u4E0D\u662F\u5408\u6CD5 JSON\u3002\u8BF7\u4FEE\u590D\u6216\u5220\u9664\u5B83\uFF0C\u6216\u4F7F\u7528 --force\u3002","init.pluginMcpRenamed":"\u63D2\u4EF6 MCP server \u91CD\u540D\u5DF2\u52A0\u524D\u7F00\uFF1A{renamed}","init.backedUp":"\u5DF2\u5C06\u539F AGENTS.md \u5907\u4EFD\u5230 {path}","init.copyTemplatesFailed":"\u65E0\u6CD5\u4ECE {srcDir} \u590D\u5236\u6A21\u677F\uFF1A{error}","init.proceed":"\u662F\u5426\u7EE7\u7EED\uFF1F[Y/n]","init.commit.question":"\u5C06\u672C\u6B21 init \u7684\u751F\u6210\u7269\u63D0\u4EA4\u4E3A\u4E00\u4E2A commit\uFF1F","init.commit.detail":"\u5C06\u63D0\u4EA4\uFF1A{paths}","init.commit.preStaged":"\u5DE5\u4F5C\u533A\u5DF2\u6709\u6682\u5B58\u53D8\u66F4\uFF0C\u8DF3\u8FC7\u81EA\u52A8\u63D0\u4EA4\uFF08\u907F\u514D\u5E26\u5165\u65E0\u5173\u6539\u52A8\uFF09\u3002","init.commit.pathIgnored":"\u88AB .gitignore \u5FFD\u7565\uFF0C\u672A\u52A0\u5165\uFF1A{paths}","init.commit.failed":"\u521B\u5EFA commit \u5931\u8D25\uFF1A{error}","init.commit.done":"\u5DF2\u521B\u5EFA\u63D0\u4EA4 {sha}\uFF08{count} \u4E2A\u6587\u4EF6\uFF09","init.exclude.done":"\u5DF2\u767B\u8BB0\u672C\u673A\u6587\u4EF6\u514D\u63D0\u4EA4\uFF1A{file}","init.instruction.localCreated":"\u5DF2\u5199\u5165\u672C\u673A\u6307\u4EE4\u6587\u4EF6 {file}\uFF08\u4E0D\u5165\u7248\u672C\u5E93\uFF09","init.instruction.agentsMerged":"\u5DF2\u628A weave \u5757\u5E76\u5165 {file}\uFF08codex \u4ECE\u5B83\u8BFB\u53D6\u5171\u4EAB\u6307\u4EE4\uFF09","init.hooksUnknownKeys":"\u5DF2\u5FFD\u7565\u672A\u77E5\u7684 hooks \u4E8B\u4EF6\u540D\uFF1A{keys}","init.harnessUnknownKeys":"\u5DF2\u5FFD\u7565\u672A\u77E5\u7684 harness\uFF1A{keys}","init.multiselect.title":"\u9009\u62E9\u8981\u521D\u59CB\u5316\u7684 harness\uFF08\u53EF\u591A\u9009\uFF09\uFF1A","init.multiselect.hint":"\u8F93\u5165\u7F16\u53F7\u6216\u540D\u79F0\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF0C\u76F4\u63A5\u56DE\u8F66\u53D6\u9ED8\u8BA4 {defaults}\uFF1A","init.multiselect.invalid":"\u5DF2\u5FFD\u7565\u65E0\u6CD5\u8BC6\u522B\u7684\u9009\u62E9\uFF1A{keys}","init.noPeerFace":"\u65E0\u5BF9\u7B49\u9762","init.stepSkipped":"\u5DF2\u8DF3\u8FC7 {step}\uFF1A{reason}","init.removed":` \u5DF2\u6309\u6807\u8BB0\u6E05\u7406 {count} \u4E2A\u9057\u7559\u751F\u6210\u7269\u3002
26
26
  `,"init.install.installed":" {harness} \u5DF2\u5B89\u88C5\uFF08{version}\uFF09","init.install.versionLow":" {harness} \u7248\u672C {version} \u4F4E\u4E8E\u5EFA\u8BAE\u4E0B\u9650 {min}\uFF0C\u53EF\u8FD0\u884C `{command}` \u5347\u7EA7","init.install.notFound":" \u672A\u68C0\u6D4B\u5230 {harness}","init.install.confirm":"\u662F\u5426\u73B0\u5728\u5B89\u88C5 {harness}\uFF1F","init.install.detail":"\u5C06\u6267\u884C\uFF1A{command}","init.install.running":" \u6B63\u5728\u5B89\u88C5 {harness}\u2026\u2026","init.install.done":" {harness} \u5B89\u88C5\u5B8C\u6210\uFF08{version}\uFF09","init.install.verifyFailed":" {harness} \u5B89\u88C5\u540E\u4ECD\u672A\u68C0\u6D4B\u5230\uFF0C\u53EF\u7A0D\u540E\u624B\u52A8\u8FD0\u884C\uFF1A{command}","init.install.declined":" \u5DF2\u8DF3\u8FC7\u5B89\u88C5\u3002\u7A0D\u540E\u53EF\u624B\u52A8\u8FD0\u884C\uFF1A{command}","init.install.npmMissing":" \u672A\u627E\u5230 npm\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5\u3002\u8BF7\u624B\u52A8\u6267\u884C\uFF1A{command}","init.trust.prewritten":" \u5DF2\u9884\u5199 {harness} \u7684\u6587\u4EF6\u5939\u4FE1\u4EFB\uFF08\u9996\u6B21\u6253\u5F00\u4E0D\u518D\u8BE2\u95EE\uFF09","init.trust.failed":" \u9884\u5199 {harness} \u4FE1\u4EFB\u72B6\u6001\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD init\uFF09\uFF1A{error}","init.provision.conflict":` \u26A0 {harness} \u5B89\u88C5\u5F62\u6001\u51B2\u7A81\uFF1A{warning}
27
27
  \u5B98\u65B9\u4FEE\u6CD5\uFF1A{hint}`,"init.provision.checkFailed":" {harness} \u5B89\u88C5\u5F62\u6001\u68C0\u67E5\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD init\uFF09\uFF1A{error}","claudemd.rules":`## \u884C\u4E3A\u51C6\u5219
28
28
 
@@ -48,4 +48,4 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const zh
48
48
  - \u4E0D\u5F15\u5165 XSS\u3001SQL \u6CE8\u5165\u3001\u547D\u4EE4\u6CE8\u5165\u9762
49
49
  - \u4F18\u5148\u53C2\u6570\u5316\u67E5\u8BE2\u4E0E\u5B89\u5168 API\uFF0C\u800C\u4E0D\u662F\u5B57\u7B26\u4E32\u62FC\u63A5
50
50
 
51
- `,"claudemd.skills":"## \u6280\u80FD\n\n\u53EF\u590D\u7528\u6280\u80FD\u653E harness \u81EA\u5DF1\u7684\u6280\u80FD\u76EE\u5F55\uFF08Claude Code \u4E3A `.claude/skills/`\uFF09\uFF1A\u4E00\u4E2A\u6280\u80FD\u4E00\u4E2A\u76EE\u5F55\u3001\u5185\u542B `SKILL.md`\uFF1B\u4EFB\u52A1\u547D\u4E2D\u67D0\u4E2A\u6280\u80FD\u65F6\u6309\u540D\u8C03\u7528\u3002\n\n","claudemd.visualize":'## \u6E32\u67D3\u5757\n\n\u8981\u8BA9 weave \u5BF9\u8BDD\u91CC\u5185\u5D4C HTML \u5FEB\u7167\uFF1Afragment \u5199\u8FDB\u9879\u76EE\u5185\uFF08\u5982 `.weave/previews/<name>.html`\uFF09\u6216\u5199\u5230 `{dir}`\uFF0C\u5176\u5B83\u4F4D\u7F6E\u670D\u52A1\u7AEF\u4F1A\u62D2\uFF1B\u56DE\u590D\u91CC**\u5355\u72EC\u4E00\u884C**\u5199\u5F15\u7528\u884C\uFF1AU+E200 + `visualize` + U+E202 + `{"path":"<\u7EDD\u5BF9\u8DEF\u5F84>"}` + U+E201\u3002\n\n',"harness.instructionLinkNotMaterialised.message":'{agents} \u662F\u5185\u5BB9\u4E3A "{claude}" \u7684\u666E\u901A\u6587\u4EF6\u2014\u2014git \u628A\u8F6F\u94FE\u63A5\u68C0\u51FA\u6210\u4E86\u6587\u672C\u3002',"harness.instructionLinkNotMaterialised.fix":"\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF0C\u7136\u540E\u8FD0\u884C `git config core.symlinks true` \u5E76\u91CD\u65B0\u68C0\u51FA\u8BE5\u6587\u4EF6\u3002","harness.instructionFilesDuplicated.message":"{claude} \u4E0E {agents} \u90FD\u662F\u72EC\u7ACB\u6587\u4EF6\u2014\u2014\u4E24\u8005\u5185\u5BB9\u4F1A\u5404\u81EA\u6F02\u79FB\u3002","harness.instructionFilesDuplicated.fix":"\u8FD0\u884C `weave init` \u8BA9\u5176\u4E2D\u4E00\u4E2A\u94FE\u63A5\u5230\u53E6\u4E00\u4E2A\uFF08\u88AB\u66FF\u6362\u7684\u6587\u4EF6\u4F1A\u5148\u5907\u4EFD\uFF09\u3002","harness.instructionLinkDangling.message":"{name} \u662F\u76EE\u6807\u4E0D\u5B58\u5728\u7684\u8F6F\u94FE\u63A5\u3002","harness.instructionLinkDangling.fix":"\u8FD0\u884C `weave init` \u91CD\u5EFA\u94FE\u63A5\u4E0E\u6307\u4EE4\u6587\u4EF6\u3002","harness.statuslinePathUnresolved.message":"statusLine \u547D\u4EE4\u65E0\u6CD5\u89E3\u6790\u51FA\u811A\u672C\u8DEF\u5F84\uFF1A{command}","harness.statuslinePathUnresolved.fix":`\u8FD0\u884C \`weave init\` \u91CD\u65B0\u751F\u6210 \`${t[e[0]].projectDir}/settings.json\`\u3002`,"harness.statuslinePathForeign.message":"statusLine \u6307\u5411\u672C\u9879\u76EE\u4E4B\u5916\uFF08{path}\uFF09\u2014\u2014\u5B83\u662F\u4E3A\u53E6\u4E00\u4E2A\u68C0\u51FA\u751F\u6210\u7684\u3002","harness.statuslinePathForeign.fix":"\u5728\u672C\u9879\u76EE\u4E2D\u8FD0\u884C `weave init` \u91CD\u5199\u7EDD\u5BF9\u8DEF\u5F84\u3002","harness.statuslineScriptMissing.message":"statusLine \u811A\u672C\u7F3A\u5931\uFF1A{path}","harness.statuslineScriptMissing.fix":"\u8FD0\u884C `weave init` \u91CD\u65B0\u751F\u6210\u3002","ilink.bothHaveContent":"CLAUDE.md \u4E0E AGENTS.md \u90FD\u5305\u542B\u5185\u5BB9","ilink.replaceDetail":"\u5C06\u628A AGENTS.md \u66FF\u6362\u4E3A\u6307\u5411 CLAUDE.md \u7684\u8F6F\u8FDE\u63A5\uFF08\u539F\u6587\u4EF6\u4F1A\u5907\u4EFD\u5230 {backupDir}\uFF09\u3002","ilink.linkFailed":"\u65E0\u6CD5\u521B\u5EFA {link} -> {target}\uFF08{path}\uFF09\uFF1A{detail}","ilink.symlinkNotAllowed":"\u6B64\u7CFB\u7EDF\u4E0D\u5141\u8BB8\u672A\u63D0\u6743\u521B\u5EFA\u8F6F\u94FE\u63A5\u3002\u5728 Windows \u4E0A\u8BF7\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF08\u8BBE\u7F6E > \u7CFB\u7EDF > \u5F00\u53D1\u8005\u9009\u9879\uFF09\uFF0C\u6216\u4ECE\u63D0\u6743\u7EC8\u7AEF\u8FD0\u884C weave init\uFF0C\u7136\u540E\u91CD\u8BD5\u3002"};
51
+ `,"claudemd.skills":"## \u6280\u80FD\n\n\u53EF\u590D\u7528\u6280\u80FD\u653E harness \u81EA\u5DF1\u7684\u6280\u80FD\u76EE\u5F55\uFF08Claude Code \u4E3A `.claude/skills/`\uFF09\uFF1A\u4E00\u4E2A\u6280\u80FD\u4E00\u4E2A\u76EE\u5F55\u3001\u5185\u542B `SKILL.md`\uFF1B\u4EFB\u52A1\u547D\u4E2D\u67D0\u4E2A\u6280\u80FD\u65F6\u6309\u540D\u8C03\u7528\u3002\n\n","claudemd.visualize":'## \u6E32\u67D3\u5757\n\n\u8981\u8BA9 weave \u5BF9\u8BDD\u91CC\u5185\u5D4C HTML \u5FEB\u7167\uFF1Afragment \u5199\u8FDB\u9879\u76EE\u5185\uFF08\u5982 `.weave/previews/<name>.html`\uFF09\u6216\u5199\u5230 `{dir}`\uFF0C\u5176\u5B83\u4F4D\u7F6E\u670D\u52A1\u7AEF\u4F1A\u62D2\uFF1B\u56DE\u590D\u91CC**\u5355\u72EC\u4E00\u884C**\u5199\u5F15\u7528\u884C\uFF1AU+E200 + `visualize` + U+E202 + `{"path":"<\u7EDD\u5BF9\u8DEF\u5F84>"}` + U+E201\u3002\n\n',"harness.instructionLinkNotMaterialised.message":'{agents} \u662F\u5185\u5BB9\u4E3A "{claude}" \u7684\u666E\u901A\u6587\u4EF6\u2014\u2014git \u628A\u8F6F\u94FE\u63A5\u68C0\u51FA\u6210\u4E86\u6587\u672C\u3002',"harness.instructionLinkNotMaterialised.fix":"\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF0C\u7136\u540E\u8FD0\u884C `git config core.symlinks true` \u5E76\u91CD\u65B0\u68C0\u51FA\u8BE5\u6587\u4EF6\u3002","harness.instructionFilesDuplicated.message":"{claude} \u4E0E {agents} \u90FD\u662F\u72EC\u7ACB\u6587\u4EF6\u2014\u2014\u4E24\u8005\u5185\u5BB9\u4F1A\u5404\u81EA\u6F02\u79FB\u3002","harness.instructionFilesDuplicated.fix":"\u8FD0\u884C `weave init` \u8BA9\u5176\u4E2D\u4E00\u4E2A\u94FE\u63A5\u5230\u53E6\u4E00\u4E2A\uFF08\u88AB\u66FF\u6362\u7684\u6587\u4EF6\u4F1A\u5148\u5907\u4EFD\uFF09\u3002","harness.instructionLinkDangling.message":"{name} \u662F\u76EE\u6807\u4E0D\u5B58\u5728\u7684\u8F6F\u94FE\u63A5\u3002","harness.instructionLinkDangling.fix":"\u8FD0\u884C `weave init` \u91CD\u5EFA\u94FE\u63A5\u4E0E\u6307\u4EE4\u6587\u4EF6\u3002","harness.localInstructionAppend.message":"{file}\uFF1A\u672C\u673A\u79C1\u6709\u6307\u4EE4\u5DF2\u751F\u6548\uFF08\u4E0E\u9879\u76EE\u6307\u4EE4\u53E0\u52A0\uFF09\u3002","harness.localInstructionAppend.fix":"\u5B83\u662F\u672C\u673A\u6587\u4EF6\uFF08\u4E0D\u5165\u7248\u672C\u5E93\uFF09\u2014\u2014\u8981\u968F\u4ED3\u5171\u4EAB\u7684\u6307\u4EE4\u8BF7\u5199\u8FDB CLAUDE.md\u3002","harness.localInstructionOverride.message":"{file}\uFF1A\u672C\u673A**\u8986\u76D6**\u6307\u4EE4\u751F\u6548\u4E2D\u2014\u2014\u5BBF\u4E3B\u4E0D\u518D\u8BFB\u53D6\u540C\u76EE\u5F55 AGENTS.md\uFF0C\u5171\u4EAB\u6307\u4EE4\u987B\u4E00\u5E76\u5199\u8FDB\u6765\u3002","harness.localInstructionOverride.fix":"\u8981\u968F\u4ED3\u5171\u4EAB\u7684\u6307\u4EE4\u5199\u8FDB AGENTS.md \u540E\uFF0C\u987B\u540C\u6B65\u6284\u8FDB\u672C\u6587\u4EF6\u624D\u4F1A\u751F\u6548\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"};
@@ -1 +1 @@
1
- import{DEFAULT_LOCALE as o,SUPPORTED_LOCALES as L,readDaemonSettings as p}from"@weavecode/server";import{DICTS as n}from"./dict/index.js";import{makeT as c}from"./t.js";let a=o,i=c(n[o],n[o]);function r(e){a=e,i=c(n[e],n[o])}export async function initCliLocale(){const e=process.env.WEAVE_LOCALE;if(e&&L.includes(e)){r(e);return}try{r((await p()).locale)}catch{r(o)}}export function setLocale(e){r(e)}export function getLocale(){return a}export function t(e,l){return i(e,l)}
1
+ import{DEFAULT_LOCALE as o,SUPPORTED_LOCALES as L,readDaemonSettings as f}from"@weavecode/server";import{DICTS as n}from"./dict/index.js";import{makeT as a}from"./t.js";let c=o,i=a(n[o],n[o]);function r(e){c=e,i=a(n[e],n[o])}export async function initCliLocale(){const e=process.env.WEAVE_LOCALE;if(e&&L.includes(e)){r(e);return}try{r((await f()).locale)}catch{r(o)}}export function setLocale(e){r(e)}export function getLocale(){return c}export function t(e,s){return i(e,s)}
@@ -1 +1 @@
1
- export function interpolate(t,r){return r?t.replace(/\{(\w+)\}/g,(n,e)=>e in r?String(r[e]):n):t}export function makeT(t,r){return(n,e)=>interpolate(t[n]??r[n]??String(n),e)}
1
+ export function interpolate(t,n){return n?t.replace(/\{(\w+)\}/g,(r,e)=>e in n?String(n[e]):r):t}export function makeT(t,n){return(r,e)=>interpolate(t[r]??n[r]??String(r),e)}
@@ -1,11 +1,11 @@
1
- import{getVisualizationsDir as d}from"@weavecode/server";import{t as r}from"../i18n/index.js";export const WEAVE_BLOCK_START="<!-- weave:start -->",WEAVE_BLOCK_END="<!-- weave:end -->",WEAVE_MANAGED_HEADER="> This file is managed by [weave](https://github.com/zijing66/weave) \u2014 a coding-agent harness.";function i(e){return`# ${e}
1
+ import{getVisualizationsDir as r}from"@weavecode/server";import{t as n}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}
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
- `}export function generateClaudeMdSection(e){const{template:n}=e;let t=`${WEAVE_BLOCK_START}
7
- `;return t+=r("claudemd.rules"),(n==="standard"||n==="full")&&(t+=r("claudemd.files")),n==="full"&&(t+=r("claudemd.security")),t+=r("claudemd.skills"),t+=r("claudemd.visualize",{dir:d()}),t+=`${WEAVE_BLOCK_END}
8
- `,t}export function generateClaudeMd(e){return i(e.projectName)+generateClaudeMdSection(e)}export function mergeClaudeMd(e,n){const t=e.indexOf(WEAVE_BLOCK_START),a=e.indexOf(WEAVE_BLOCK_END);return t!==-1&&a!==-1&&a>t?e.slice(0,t)+n.trimEnd()+e.slice(a+WEAVE_BLOCK_END.length):e.replace(/\s+$/,"")+`
6
+ `}export function generateClaudeMdSection(e){const{template:i}=e;let t=`${WEAVE_BLOCK_START}
7
+ `;return t+=n("claudemd.rules"),(i==="standard"||i==="full")&&(t+=n("claudemd.files")),i==="full"&&(t+=n("claudemd.security")),t+=n("claudemd.skills"),t+=n("claudemd.visualize",{dir:r()}),t+=`${WEAVE_BLOCK_END}
8
+ `,t}export function generateClaudeMd(e){return d(e.projectName)+generateClaudeMdSection(e)}export function mergeClaudeMd(e,i){const t=e.indexOf(WEAVE_BLOCK_START),a=e.indexOf(WEAVE_BLOCK_END);return t!==-1&&a!==-1&&a>t?e.slice(0,t)+i.trimEnd()+e.slice(a+WEAVE_BLOCK_END.length):e.replace(/\s+$/,"")+`
9
9
 
10
- `+n.trimEnd()+`
10
+ `+i.trimEnd()+`
11
11
  `}
@@ -1,6 +1,6 @@
1
- import u from"node:path";import{readFile as A,writeFile as g}from"node:fs/promises";import{detectPlatform as _,resolveComponents as H,DEFAULT_HOOKS as L,DEFAULT_MCP as B,HARNESS_DIRS as G,HARNESS_KEYS as V,ensureDir as D,fileExists as Y,logger as S}from"@weavecode/core";import{templateRegistry as b}from"@weavecode/templates";import{WEAVE_VERSION as K}from"@weavecode/server";import{generateClaudeMd as $,generateClaudeMdSection as q,mergeClaudeMd as J}from"./claudemd-gen.js";import{ensureInstructionLink as W}from"./instruction-link.js";import{buildInitRegistry as z}from"./wiring.js";import{createPromptPort as Q}from"./prompt.js";import{commitInitOutputs as X,findGitRepoRoot as Z}from"./git-commit.js";import{ensureHarnessInstalled as ee,prewriteTrust as te}from"./provision.js";import{t as N}from"../i18n/index.js";const se={minimal:"minimal",default:"standard",full:"full"},y=["claude"];async function ne(e,a){if(e.harnesses&&e.harnesses.length>0)return[...e.harnesses];if(!e.interactive)return[...y];if(!process.stdin.isTTY||!process.stdout.isTTY)return[...y];const n=await a.multiselect(V,y);return n.length>0?[...n]:[...y]}export async function executeInit(e,a){const{targetDir:n,force:p,interactive:h,preset:T}=e,M=_(),o={directories:[],files:[]},j=[],k=[],C=[],I=[],R=[],r=H(T,e.components),t={...L,...e.hooks},U={...B,...e.mcp},w=a??Q(h);h||S.dim(N("init.nonInteractive"));const f=await ne(e,w);try{await ee(f,w)}catch(s){S.warn(s.message)}try{await te(f,n)}catch(s){S.warn(s.message)}const O={...e,platform:M},v=z();for(const s of f){const l=new(v.initFor(s))(O);await l.runSurface();const i=l.records;o.directories.push(...i.created.directories),o.files.push(...i.created.files),j.push(...i.skipped),k.push(...i.merged),C.push(...i.updated),I.push(...i.removed)}if(r.claudeMd||r.agentsMd){const s=await W(n,{force:p,interactive:h,confirm:(d,m)=>w.confirm(d,m)});s.backedUpTo&&(S.dim(N("init.backedUp",{path:s.backedUpTo})),o.files.push(s.backedUpTo));const l=se[T]??"standard",i=u.basename(n),c=u.join(n,s.realFile),E=$({template:l,projectName:i});if(p)await g(c,E,"utf-8"),o.files.push(c);else{const d=await P(c);if(d===null)await g(c,E,"utf-8"),o.files.push(c);else{const m=q({template:l,projectName:i});await g(c,J(d,m),"utf-8"),k.push(c)}}}{const s=u.join(n,".weave");await D(s),o.directories.push(s);const l={initVersion:K,initTimestamp:new Date().toISOString(),preset:T,harnesses:f,components:{settings:r.settings,skills:r.skills,commands:r.commands,agents:r.agents,helpers:r.helpers,mcp:r.mcp,claudeMd:r.claudeMd,agentsMd:r.agentsMd},hooks:t,mcp:U},i=u.join(s,"config.yaml"),c=Object.entries(l).map(([d,m])=>`${d}: ${typeof m=="object"?JSON.stringify(m):m}`).join(`
1
+ import p from"node:path";import{readFile as x,writeFile as v}from"node:fs/promises";import{detectPlatform as _,resolveComponents as A,DEFAULT_HOOKS as P,DEFAULT_MCP as U,HARNESS_DIRS as B,HARNESS_KEYS as G,ensureDir as D,fileExists as H,logger as u}from"@weavecode/core";import{templateRegistry as y}from"@weavecode/templates";import{WEAVE_VERSION as V}from"@weavecode/server";import{writeInstructionFiles as Y}from"./instruction-files.js";import{buildInitRegistry as K}from"./wiring.js";import{createPromptPort as L}from"./prompt.js";import{commitInitOutputs as $,findGitRepoRoot as q}from"./git-commit.js";import{ensureGitExcludes as J}from"./git-exclude.js";import{ensureHarnessInstalled as W,prewriteTrust as z}from"./provision.js";import{t as Q}from"../i18n/index.js";const X={minimal:"minimal",default:"standard",full:"full"},d=["claude"];async function Z(e,i){if(e.harnesses&&e.harnesses.length>0)return[...e.harnesses];if(!e.interactive)return[...d];if(!process.stdin.isTTY||!process.stdout.isTTY)return[...d];const s=await i.multiselect(G,d);return s.length>0?[...s]:[...d]}export async function executeInit(e,i){const{targetDir:s,interactive:l,preset:f}=e,E=_(),n={directories:[],files:[]},T=[],g=[],h=[],j=[],I=[],a=A(f,e.components),t={...P,...e.hooks},R={...U,...e.mcp},w=i??L(l);l||u.dim(Q("init.nonInteractive"));const c=await Z(e,w);try{await W(c,w)}catch(o){u.warn(o.message)}try{await z(c,s)}catch(o){u.warn(o.message)}const b={...e,platform:E},k=K();for(const o of c){const m=new(k.initFor(o))(b);await m.runSurface();const r=m.records;n.directories.push(...r.created.directories),n.files.push(...r.created.files),T.push(...r.skipped),g.push(...r.merged),h.push(...r.updated),j.push(...r.removed)}if(a.claudeMd||a.agentsMd){const o=X[f]??"standard",m=await Y(s,{claude:a.claudeMd&&c.includes("claude"),codex:a.agentsMd&&c.includes("codex"),template:o,projectName:p.basename(s)});n.files.push(...m.created),g.push(...m.merged);for(const r of m.notes)u.dim(r)}{const o=p.join(s,".weave");await D(o),n.directories.push(o);const m={initVersion:V,initTimestamp:new Date().toISOString(),preset:f,harnesses:c,components:{settings:a.settings,skills:a.skills,commands:a.commands,agents:a.agents,helpers:a.helpers,mcp:a.mcp,claudeMd:a.claudeMd,agentsMd:a.agentsMd},hooks:t,mcp:R},r=p.join(o,"config.yaml"),N=Object.entries(m).map(([O,S])=>`${O}: ${typeof S=="object"?JSON.stringify(S):S}`).join(`
2
2
  `)+`
3
- `,E=await Y(i);await g(i,c,"utf-8"),(E?C:o.files).push(i)}for(const s of f)await F(n,u.join(n,G[s].projectDir),o);await F(n,u.join(n,".weave"),o),await X({targetDir:n,interactive:h,selected:f,prompt:w});const x={skillsCount:b.getByCategory("skill").length,commandsCount:b.getByCategory("command").length,agentsCount:b.getByCategory("agent").length,hooksEnabled:[t.preToolUse,t.postToolUse,t.userPromptSubmit,t.sessionStart,t.stop,t.stopFailure,t.subagentStop,t.subagentStart,t.notification,t.postToolUseFailure,t.permissionRequest,t.permissionDenied,t.preCompact,t.sessionEnd,t.preModelSwitch].filter(Boolean).length};return{success:R.length===0,platform:M,created:o,skipped:j,merged:k,updated:C,removed:I,errors:R,summary:x}}export const NESTED_GITIGNORE=`# weave \u2014 generated; do not commit
3
+ `,F=await H(r);await v(r,N,"utf-8"),(F?h:n.files).push(r)}for(const o of c)await M(s,p.join(s,B[o].projectDir),n);await M(s,p.join(s,".weave"),n),await J(s),await $({targetDir:s,interactive:l,selected:c,prompt:w});const C={skillsCount:y.getByCategory("skill").length,commandsCount:y.getByCategory("command").length,agentsCount:y.getByCategory("agent").length,hooksEnabled:[t.preToolUse,t.postToolUse,t.userPromptSubmit,t.sessionStart,t.stop,t.stopFailure,t.subagentStop,t.subagentStart,t.notification,t.postToolUseFailure,t.permissionRequest,t.permissionDenied,t.preCompact,t.sessionEnd,t.preModelSwitch].filter(Boolean).length};return{success:I.length===0,platform:E,created:n,skipped:T,merged:g,updated:h,removed:j,errors:I,summary:C}}export const NESTED_GITIGNORE=`# weave \u2014 generated; do not commit
4
4
  *
5
5
  !.gitignore
6
- `;async function F(e,a,n){if(!await Z(e))return;const p=u.join(a,".gitignore");await P(p)===null&&(await D(a),await g(p,NESTED_GITIGNORE,"utf-8"),n.files.push(p))}async function P(e){try{return await A(e,"utf-8")}catch(a){if(ie(a))return null;throw a}}function ie(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}
6
+ `;async function M(e,i,s){if(!await q(e))return;const l=p.join(i,".gitignore");await ee(l)===null&&(await D(i),await v(l,NESTED_GITIGNORE,"utf-8"),s.files.push(l))}async function ee(e){try{return await x(e,"utf-8")}catch(i){if(te(i))return null;throw i}}function te(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}
@@ -1,2 +1,2 @@
1
- import f from"node:path";import{execFile as S}from"node:child_process";import{promisify as E}from"node:util";import{lstat as x,stat as I}from"node:fs/promises";import{HARNESS_DIRS as T,INSTRUCTION_FILES as j,logger as n}from"@weavecode/core";import{t as s}from"../i18n/index.js";export async function findGitRepoRoot(o){let i=f.resolve(o);for(;;){try{return(await I(f.join(i,".git"))).isDirectory()?i:null}catch{}const e=f.dirname(i);if(e===i)return null;i=e}}const R=E(S);export const defaultGitExec=async(o,i,e)=>{try{const{stdout:r,stderr:t}=await R(o,i,{cwd:e.cwd,windowsHide:!0,timeout:1e4,maxBuffer:1048576});return{stdout:String(r),stderr:String(t),code:0}}catch(r){const t=r;if(typeof t.code=="number")return{stdout:String(t.stdout??""),stderr:String(t.stderr??""),code:t.code};throw r}};export async function collectCommitPaths(o,i){const e=[...j,".mcp.json",...i.map(t=>T[t].projectDir),".weave"],r=[];for(const t of e)try{await x(f.join(o,t)),r.includes(t)||r.push(t)}catch{}return r}export const COMMIT_MESSAGE="chore: weave init \u751F\u6210\u521D\u59CB\u5316\u4EA7\u7269";export async function commitInitOutputs(o){try{return await v(o)}catch(i){return n.warn(s("init.commit.failed",{error:i instanceof Error?i.message:String(i)})),{status:"failed"}}}async function v({targetDir:o,interactive:i,selected:e,prompt:r,execGit:t=defaultGitExec}){if(!await findGitRepoRoot(o))return{status:"not-repo"};if(!i||!process.stdin.isTTY||!process.stdout.isTTY)return{status:"skipped"};const c=await t("git",["diff","--cached","--quiet"],{cwd:o});if(c.code!==0){if(c.code===1)return n.dim(s("init.commit.preStaged")),{status:"skipped"};throw new Error(c.stderr.trim()||`git diff --cached exited ${c.code}`)}const d=await collectCommitPaths(o,e);if(d.length===0)return{status:"no-changes"};const a=await t("git",["status","--porcelain","--",...d],{cwd:o});if(a.code!==0)throw new Error(a.stderr.trim()||`git status exited ${a.code}`);if(!a.stdout.trim())return{status:"no-changes"};const y=s("init.commit.detail",{paths:d.join(", ")});if(!await r.confirm(s("init.commit.question"),y))return{status:"declined"};const p=[];for(const g of d)(await t("git",["add","--",g],{cwd:o})).code!==0&&p.push(g);p.length>0&&n.warn(s("init.commit.pathIgnored",{paths:p.join(", ")}));const m=await t("git",["diff","--cached","--quiet"],{cwd:o});if(m.code===0)return n.warn(s("init.commit.failed",{error:"nothing staged after git add"})),{status:"no-changes"};if(m.code!==1)throw new Error(m.stderr.trim()||`git diff --cached exited ${m.code}`);const w=(await t("git",["diff","--cached","--name-only"],{cwd:o})).stdout.split(`
2
- `).filter(Boolean).length,u=await t("git",["commit","-m",COMMIT_MESSAGE],{cwd:o});if(u.code!==0)throw new Error(u.stderr.trim()||u.stdout.trim()||`git commit exited ${u.code}`);const h=await t("git",["rev-parse","--short","HEAD"],{cwd:o}),l=h.code===0?h.stdout.trim():"";return n.success(s("init.commit.done",{sha:l,count:w})),{status:"committed",sha:l,count:w}}
1
+ 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(r){let e=f.resolve(r);for(;;){try{return(await I(f.join(e,".git"))).isDirectory()?e:null}catch{}const o=f.dirname(e);if(o===e)return null;e=o}}const D=S(y);export const defaultGitExec=async(r,e,o)=>{try{const{stdout:i,stderr:t}=await D(r,e,{cwd:o.cwd,windowsHide:!0,timeout:1e4,maxBuffer:1048576});return{stdout:String(i),stderr:String(t),code:0}}catch(i){const t=i;if(typeof t.code=="number")return{stdout:String(t.stdout??""),stderr:String(t.stderr??""),code:t.code};throw i}};export async function collectCommitPaths(r,e){const o=[...j,".mcp.json",...e.map(t=>T[t].projectDir),".weave"],i=[];for(const t of o)try{await E(f.join(r,t)),i.includes(t)||i.push(t)}catch{}return i}export const COMMIT_MESSAGE="chore: weave init \u751F\u6210\u521D\u59CB\u5316\u4EA7\u7269";export async function commitInitOutputs(r){try{return await v(r)}catch(e){return c.warn(s("init.commit.failed",{error:e instanceof Error?e.message:String(e)})),{status:"failed"}}}async function v({targetDir:r,interactive:e,selected:o,prompt:i,execGit:t=defaultGitExec}){if(!await findGitRepoRoot(r))return{status:"not-repo"};if(!e||!process.stdin.isTTY||!process.stdout.isTTY)return{status:"skipped"};const n=await t("git",["diff","--cached","--quiet"],{cwd:r});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(r,o);if(a.length===0)return{status:"no-changes"};const d=await t("git",["status","--porcelain","--",...a],{cwd:r});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 i.confirm(s("init.commit.question"),x))return{status:"declined"};const w=[];for(const l of a)(await t("git",["add","--",l],{cwd:r})).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:r});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:r})).stdout.split(`
2
+ `).filter(Boolean).length,m=await t("git",["commit","-m",COMMIT_MESSAGE],{cwd:r});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:r}),h=g.code===0?g.stdout.trim():"";return c.success(s("init.commit.done",{sha:h,count:p})),{status:"committed",sha:h,count:p}}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 本机私有指令文件的 git 免登记(`.git/info/exclude`)。
3
+ *
4
+ * `CLAUDE.local.md` / `AGENTS.override.md` 是**机器本地的**(用户手编、weave
5
+ * 从不写内容)——与嵌套 gitignore「要随仓传播」的需求相反,exclude 的
6
+ * per-clone 语义恰好正确:本机不进 git status、协作者不受影响。用户自己的
7
+ * `.gitignore` 永不碰(既有裁决),git 仓缺席时静默跳过。
8
+ *
9
+ * 写入走 `# weave:start/end` 标记块(与 CLAUDE.md 管理块同约定):重跑 init
10
+ * 原地替换,幂等。
11
+ */
12
+ export declare const EXCLUDE_BLOCK_START = "# weave:start";
13
+ export declare const EXCLUDE_BLOCK_END = "# weave:end";
14
+ /** 免登记名单:local 指令文件 + `.weave/token`(本机凭据,config.yaml 仍可提交)。 */
15
+ export declare function excludeEntries(): readonly string[];
16
+ /**
17
+ * Ensure the repo's `info/exclude` carries weave's block. Idempotent; a no-op
18
+ * outside a git repository (matches nested-gitignore behaviour).
19
+ */
20
+ export declare function ensureGitExcludes(targetDir: string): Promise<void>;
@@ -0,0 +1,7 @@
1
+ import n from"node:path";import{mkdir as c,readFile as m,writeFile as u}from"node:fs/promises";import{LOCAL_INSTRUCTION_FILES as d,logger as l}from"@weavecode/core";import{t as p}from"../i18n/index.js";import{findGitRepoRoot as x}from"./git-commit.js";export const EXCLUDE_BLOCK_START="# weave:start",EXCLUDE_BLOCK_END="# weave:end";export function excludeEntries(){return[...d,".weave/token"]}export async function ensureGitExcludes(a){const i=await x(a);if(!i)return;const t=n.join(i,".git","info","exclude"),e=await m(t,"utf-8").catch(()=>null)??"",r=e.indexOf(EXCLUDE_BLOCK_START),o=e.indexOf(EXCLUDE_BLOCK_END);if(r!==-1&&o!==-1&&o>r)return;const s=`${EXCLUDE_BLOCK_START}
2
+ ${excludeEntries().join(`
3
+ `)}
4
+ ${EXCLUDE_BLOCK_END}
5
+ `,f=r!==-1||o!==-1?e:e.replace(/\s*$/,"")+(e.trim()?`
6
+
7
+ `:"")+s;await c(n.dirname(t),{recursive:!0}),await u(t,f,"utf-8"),l.dim(p("init.exclude.done",{file:n.relative(i,t)}))}
@@ -1,7 +1,7 @@
1
- import a from"node:path";import{readFile as d,writeFile as l,readdir as D,unlink as v}from"node:fs/promises";import{DEFAULT_AGENTS as F,DEFAULT_COMMANDS as A,DEFAULT_HOOKS as O,DEFAULT_MCP as C,DEFAULT_SKILLS as J,ensureDir as m,fileExists as w,logger as p,resolveComponents as M,writeFileIfAbsent as y}from"@weavecode/core";import{templateRegistry as g}from"@weavecode/templates";import{generateStatuslineScript as P,readStatuslineConfig as N,WEAVE_VERSION as b}from"@weavecode/server";import{InitPipeline as U,generateHookHandler as _,readUserCapture as R}from"@weavecode/harness";import{generateSettingsJson as I,mergeSettingsJson as L}from"../settings-gen.js";import{generateMcpJson as H,mergeMcpJson as K}from"../mcp-gen.js";import{generateAutoMemoryHook as V}from"../helpers-gen.js";import{registerPluginTemplates as W,collectPluginMcpServers as q}from"../plugin-templates.js";import{t as f}from"../../i18n/index.js";export const WEAVE_HELPER_MARKER="@version weave@";const G={preToolUse:!1,postToolUse:!1,userPromptSubmit:!1,sessionStart:!1,stop:!1,stopFailure:!1,subagentStop:!1,subagentStart:!1,notification:!1,postToolUseFailure:!1,permissionRequest:!1,permissionDenied:!1,preCompact:!1,sessionEnd:!1,preModelSwitch:!1,timeout:5e3,continueOnError:!0};export class ClaudeInitTemplate extends U{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};st;constructor(i){super(i);const t=a.join(i.targetDir,".claude");this.st={targetDir:i.targetDir,force:i.force,platform:i.platform,components:M(i.preset,i.components),hooks:{...O,...i.hooks},skills:{...J,...i.skills},commands:{...A,...i.commands},agents:{...F,...i.agents},mcp:{...C,...i.mcp},claudeDir:t,skillsDir:a.join(t,"skills"),commandsDir:a.join(t,"commands"),agentsDir:a.join(t,"agents"),helpersDir:a.join(t,"helpers"),...this.records}}ensureDirs(){return z(this.st)}writeSettings(){return B(this.st)}writeMcp(){return Q(this.st)}copySkills(){return X(this.st)}copyCommands(){return Y(this.st)}copyAgents(){return Z(this.st)}injectPluginTemplates(){return $(this.st)}writeHelpers(){return x(this.st)}}async function z(e){await m(e.claudeDir),e.created.directories.push(e.claudeDir),e.components.skills&&(await m(e.skillsDir),e.created.directories.push(e.skillsDir)),e.components.commands&&(await m(e.commandsDir),e.created.directories.push(e.commandsDir)),e.components.agents&&(await m(e.agentsDir),e.created.directories.push(e.agentsDir)),e.components.helpers&&(await m(e.helpersDir),e.created.directories.push(e.helpersDir))}async function B(e){if(e.components.settings){const i=await R({home:e.platform.homeDir}),t=i.installed?G:e.hooks;i.installed&&p.dim(f("init.userCaptureActive"));const s=I({components:e.components,hooks:t,platform:e.platform,helpersDir:e.helpersDir}),n=a.join(e.claudeDir,"settings.json");if(e.force)await l(n,JSON.stringify(s,null,2)+`
2
- `,"utf-8"),e.created.files.push(n);else{const o=await k(n);if(o===void 0)await w(n)?(e.skipped.push(n),p.warn(f("init.skippedInvalidJson",{path:n}))):(await l(n,JSON.stringify(s,null,2)+`
3
- `,"utf-8"),e.created.files.push(n));else{const r=L(o,s);await l(n,JSON.stringify(r,null,2)+`
4
- `,"utf-8"),e.merged.push(n)}}}}async function Q(e){if(e.components.mcp){const i=H({platform:e.platform,includeWeaveServer:e.mcp.weave}),t=Object.keys(i.mcpServers),s=await q(e.targetDir,void 0,t),n=i.mcpServers;for(const[r,c]of Object.entries(s.servers))n[r]=c;for(const r of s.renamed)p.warn(f("init.pluginMcpRenamed",{renamed:r}));if(Object.keys(n).length>0){const r=a.join(e.targetDir,".mcp.json");if(e.force)await l(r,JSON.stringify(i,null,2)+`
5
- `,"utf-8"),e.created.files.push(r);else{const c=await k(r);if(c===void 0)await w(r)?(e.skipped.push(r),p.warn(f("init.skippedInvalidJson",{path:r}))):(await l(r,JSON.stringify(i,null,2)+`
6
- `,"utf-8"),e.created.files.push(r));else{const u=K(c,i);await l(r,JSON.stringify(u,null,2)+`
7
- `,"utf-8"),e.merged.push(r)}}}else await w(a.join(e.targetDir,".mcp.json"))&&e.skipped.push(a.join(e.targetDir,".mcp.json"))}}async function X(e){if(e.components.skills&&e.skills.core){const i=g.getSkillsSourceDir();await h(i,e.skillsDir,e.force,e.created,e.skipped)}}async function Y(e){if(e.components.commands&&e.commands.core){const i=g.getCommandsSourceDir();await h(i,e.commandsDir,e.force,e.created,e.skipped)}}async function Z(e){if(e.components.agents&&e.agents.core){const i=g.getAgentsSourceDir();await h(i,e.agentsDir,e.force,e.created,e.skipped)}}async function $(e){try{const{registered:i}=await W(e.targetDir);for(const t of i){const s=g.resolvePath(t);if(t.category==="skill"){await h(s,a.join(e.skillsDir,a.basename(s)),e.force,e.created,e.skipped);continue}const n=t.category==="command"?e.commandsDir:e.agentsDir,o=a.join(n,a.basename(s));try{const r=await d(s,"utf-8");await y(o,r,e.force)?e.created.files.push(o):e.skipped.push(o)}catch(r){p.warn(f("init.copyTemplatesFailed",{srcDir:s,error:String(r)}))}}}catch(i){p.warn(f("init.copyTemplatesFailed",{srcDir:"plugins",error:String(i)}))}}async function x(e){if(e.components.helpers){const i=await N(e.targetDir),t=[["hook-handler.cjs",_(b)],["statusline.cjs",P(i)],["auto-memory-hook.mjs",V()]];for(const[n,o]of t){const r=a.join(e.helpersDir,n);if(e.force){await l(r,o,"utf-8"),e.created.files.push(r);continue}const c=await S(r);c===null?(await l(r,o,"utf-8"),e.created.files.push(r)):c.includes(WEAVE_HELPER_MARKER)?(await l(r,o,"utf-8"),e.updated.push(r)):e.skipped.push(r)}const s=new Set(t.map(([n])=>n));try{for(const n of await D(e.helpersDir,{withFileTypes:!0})){if(!n.isFile()||s.has(n.name))continue;const o=a.join(e.helpersDir,n.name),r=await S(o);r!==null&&r.includes(WEAVE_HELPER_MARKER)&&(await v(o),e.removed.push(o))}}catch{}}}async function S(e){try{return await d(e,"utf-8")}catch(i){if(j(i))return null;throw i}}async function k(e){let i;try{i=await d(e,"utf-8")}catch(t){if(j(t))return;throw t}try{const t=JSON.parse(i);if(typeof t=="object"&&t!==null&&!Array.isArray(t))return t}catch{}}function j(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}async function h(e,i,t,s,n){try{const o=await T(e);for(const r of o){const c=a.relative(e,r),u=a.join(i,c),E=await d(r,"utf-8");await y(u,E,t)?s.files.push(u):n.push(u)}}catch(o){p.warn(f("init.copyTemplatesFailed",{srcDir:e,error:String(o)}))}}async function T(e){const i=[];try{const t=await D(e,{withFileTypes:!0});for(const s of t){const n=a.join(e,s.name);s.isDirectory()?i.push(...await T(n)):i.push(n)}}catch{}return i}
1
+ import a from"node:path";import{readFile as f,writeFile as c,readdir as D,unlink as T}from"node:fs/promises";import{DEFAULT_AGENTS as A,DEFAULT_COMMANDS as F,DEFAULT_HOOKS as O,DEFAULT_MCP as J,DEFAULT_SKILLS as N,ensureDir as m,fileExists as w,logger as p,resolveComponents as b,writeFileIfAbsent as y}from"@weavecode/core";import{templateRegistry as d}from"@weavecode/templates";import{generateStatuslineScript as M,readStatuslineConfig as C,WEAVE_VERSION as U}from"@weavecode/server";import{InitPipeline as L,generateHookHandler as P,readUserCapture as _}from"@weavecode/harness";import{generateSettingsJson as I,mergeSettingsJson as R}from"../settings-gen.js";import{generateMcpJson as H,mergeMcpJson as x}from"../mcp-gen.js";import{generateAutoMemoryHook as K}from"../helpers-gen.js";import{registerPluginTemplates as V,collectPluginMcpServers as W}from"../plugin-templates.js";import{t as l}from"../../i18n/index.js";export const WEAVE_HELPER_MARKER="@version weave@";const q={preToolUse:!1,postToolUse:!1,userPromptSubmit:!1,sessionStart:!1,stop:!1,stopFailure:!1,subagentStop:!1,subagentStart:!1,notification:!1,postToolUseFailure:!1,permissionRequest:!1,permissionDenied:!1,preCompact:!1,sessionEnd:!1,preModelSwitch:!1,timeout:5e3,continueOnError:!0};export class ClaudeInitTemplate extends L{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};st;constructor(s){super(s);const r=a.join(s.targetDir,".claude");this.st={targetDir:s.targetDir,force:s.force,platform:s.platform,components:b(s.preset,s.components),hooks:{...O,...s.hooks},skills:{...N,...s.skills},commands:{...F,...s.commands},agents:{...A,...s.agents},mcp:{...J,...s.mcp},claudeDir:r,skillsDir:a.join(r,"skills"),commandsDir:a.join(r,"commands"),agentsDir:a.join(r,"agents"),helpersDir:a.join(r,"helpers"),...this.records}}ensureDirs(){return G(this.st)}writeSettings(){return z(this.st)}writeMcp(){return B(this.st)}copySkills(){return Q(this.st)}copyCommands(){return X(this.st)}copyAgents(){return Y(this.st)}injectPluginTemplates(){return Z(this.st)}writeHelpers(){return $(this.st)}}async function G(e){await m(e.claudeDir),e.created.directories.push(e.claudeDir),e.components.skills&&(await m(e.skillsDir),e.created.directories.push(e.skillsDir)),e.components.commands&&(await m(e.commandsDir),e.created.directories.push(e.commandsDir)),e.components.agents&&(await m(e.agentsDir),e.created.directories.push(e.agentsDir)),e.components.helpers&&(await m(e.helpersDir),e.created.directories.push(e.helpersDir))}async function z(e){if(e.components.settings){const s=await _({home:e.platform.homeDir}),r=s.installed?q:e.hooks;s.installed&&p.dim(l("init.userCaptureActive"));const o=I({components:e.components,hooks:r,platform:e.platform,helpersDir:e.helpersDir}),t=a.join(e.claudeDir,"settings.json");if(e.force)await c(t,JSON.stringify(o,null,2)+`
2
+ `,"utf-8"),e.created.files.push(t);else{const i=await S(t);if(i===void 0)await w(t)?(e.skipped.push(t),p.warn(l("init.skippedInvalidJson",{path:t}))):(await c(t,JSON.stringify(o,null,2)+`
3
+ `,"utf-8"),e.created.files.push(t));else{const n=R(i,o);await c(t,JSON.stringify(n,null,2)+`
4
+ `,"utf-8"),e.merged.push(t)}}}}async function B(e){if(e.components.mcp){const s=H({platform:e.platform,includeWeaveServer:e.mcp.weave}),r=Object.keys(s.mcpServers),o=await W(e.targetDir,void 0,r),t=s.mcpServers;for(const[i,n]of Object.entries(o.servers))t[i]=n;for(const i of o.renamed)p.warn(l("init.pluginMcpRenamed",{renamed:i}));if(Object.keys(t).length>0){const i=a.join(e.targetDir,".mcp.json");if(e.force)await c(i,JSON.stringify(s,null,2)+`
5
+ `,"utf-8"),e.created.files.push(i);else{const n=await S(i);if(n===void 0)await w(i)?(e.skipped.push(i),p.warn(l("init.skippedInvalidJson",{path:i}))):(await c(i,JSON.stringify(s,null,2)+`
6
+ `,"utf-8"),e.created.files.push(i));else{const u=x(n,s);await c(i,JSON.stringify(u,null,2)+`
7
+ `,"utf-8"),e.merged.push(i)}}}else await w(a.join(e.targetDir,".mcp.json"))&&e.skipped.push(a.join(e.targetDir,".mcp.json"))}}async function Q(e){if(e.components.skills&&e.skills.core){const s=d.getSkillsSourceDir();await h(s,e.skillsDir,e.force,e.created,e.skipped)}}async function X(e){if(e.components.commands&&e.commands.core){const s=d.getCommandsSourceDir();await h(s,e.commandsDir,e.force,e.created,e.skipped)}}async function Y(e){if(e.components.agents&&e.agents.core){const s=d.getAgentsSourceDir();await h(s,e.agentsDir,e.force,e.created,e.skipped)}}async function Z(e){try{const{registered:s}=await V(e.targetDir);for(const r of s){const o=d.resolvePath(r);if(r.category==="skill"){await h(o,a.join(e.skillsDir,a.basename(o)),e.force,e.created,e.skipped);continue}const t=r.category==="command"?e.commandsDir:e.agentsDir,i=a.join(t,a.basename(o));try{const n=await f(o,"utf-8");await y(i,n,e.force)?e.created.files.push(i):e.skipped.push(i)}catch(n){p.warn(l("init.copyTemplatesFailed",{srcDir:o,error:String(n)}))}}}catch(s){p.warn(l("init.copyTemplatesFailed",{srcDir:"plugins",error:String(s)}))}}async function $(e){if(e.components.helpers){const s=await C(e.targetDir),r=[["hook-handler.cjs",P(U)],["statusline.cjs",M(s)],["auto-memory-hook.mjs",K()]];for(const[t,i]of r){const n=a.join(e.helpersDir,t);if(e.force){await c(n,i,"utf-8"),e.created.files.push(n);continue}const u=await k(n);u===null?(await c(n,i,"utf-8"),e.created.files.push(n)):u.includes(WEAVE_HELPER_MARKER)?(await c(n,i,"utf-8"),e.updated.push(n)):e.skipped.push(n)}const o=new Set(r.map(([t])=>t));try{for(const t of await D(e.helpersDir,{withFileTypes:!0})){if(!t.isFile()||o.has(t.name))continue;const i=a.join(e.helpersDir,t.name),n=await k(i);n!==null&&n.includes(WEAVE_HELPER_MARKER)&&(await T(i),e.removed.push(i))}}catch{}}}async function k(e){try{return await f(e,"utf-8")}catch(s){if(j(s))return null;throw s}}async function S(e){let s;try{s=await f(e,"utf-8")}catch(r){if(j(r))return;throw r}try{const r=JSON.parse(s);if(typeof r=="object"&&r!==null&&!Array.isArray(r))return r}catch{}}function j(e){return typeof e=="object"&&e!==null&&e.code==="ENOENT"}async function h(e,s,r,o,t){try{const i=await v(e);for(const n of i){const u=a.relative(e,n),g=a.join(s,u),E=await f(n,"utf-8");await y(g,E,r)?o.files.push(g):t.push(g)}}catch(i){p.warn(l("init.copyTemplatesFailed",{srcDir:e,error:String(i)}))}}async function v(e){const s=[];try{const r=await D(e,{withFileTypes:!0});for(const o of r){const t=a.join(e,o.name);o.isDirectory()?s.push(...await v(t)):s.push(t)}}catch{}return s}
@@ -1 +1 @@
1
- import o from"node:path";import{readdir as d,readFile as k}from"node:fs/promises";import{DEFAULT_SKILLS as f,HARNESS_DIRS as u,ensureDir as l,logger as p,resolveComponents as w,writeFileIfAbsent as D}from"@weavecode/core";import{templateRegistry as y}from"@weavecode/templates";import{InitPipeline as F}from"@weavecode/harness";import{t as n}from"../../i18n/index.js";export class CodexInitTemplate extends F{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};force;components;skills;codexDir;skillsDir;constructor(e){super(e);const i=w(e.preset,e.components),s=o.join(e.targetDir,u.codex.projectDir);this.force=e.force,this.components=i,this.skills={...f,...e.skills},this.codexDir=s,this.skillsDir=o.join(s,"skills")}async ensureDirs(){await l(this.codexDir),this.records.created.directories.push(this.codexDir),this.components.skills&&(await l(this.skillsDir),this.records.created.directories.push(this.skillsDir))}writeSettings(){this.skipNoFace("writeSettings")}writeMcp(){this.skipNoFace("writeMcp")}async copySkills(){if(this.components.skills&&this.skills.core){const e=y.getSkillsSourceDir();await g(e,this.skillsDir,this.force,this.records)}}copyCommands(){this.skipNoFace("copyCommands")}copyAgents(){this.skipNoFace("copyAgents")}injectPluginTemplates(){this.skipNoFace("injectPluginTemplates")}writeHelpers(){this.skipNoFace("writeHelpers")}skipNoFace(e){const i=n("init.noPeerFace");this.skip(e,i),p.dim(n("init.stepSkipped",{step:e,reason:i}))}}async function g(t,e,i,s){try{for(const r of await a(t)){const h=o.relative(t,r),c=o.join(e,h),m=await k(r,"utf-8");await D(c,m,i)?s.created.files.push(c):s.skipped.push(c)}}catch(r){p.warn(n("init.copyTemplatesFailed",{srcDir:t,error:String(r)}))}}async function a(t){const e=[];try{const i=await d(t,{withFileTypes:!0});for(const s of i){const r=o.join(t,s.name);s.isDirectory()?e.push(...await a(r)):e.push(r)}}catch{return e}return e}
1
+ import o from"node:path";import{readdir as m,readFile as k}from"node:fs/promises";import{DEFAULT_SKILLS as f,HARNESS_DIRS as u,ensureDir as n,logger as p,resolveComponents as D,writeFileIfAbsent as w}from"@weavecode/core";import{templateRegistry as y}from"@weavecode/templates";import{InitPipeline as g}from"@weavecode/harness";import{t as a}from"../../i18n/index.js";export class CodexInitTemplate extends g{records={created:{directories:[],files:[]},skipped:[],merged:[],updated:[],removed:[]};force;components;skills;codexDir;skillsDir;constructor(i){super(i);const s=D(i.preset,i.components),e=o.join(i.targetDir,u.codex.projectDir);this.force=i.force,this.components=s,this.skills={...f,...i.skills},this.codexDir=e,this.skillsDir=o.join(e,"skills")}async ensureDirs(){await n(this.codexDir),this.records.created.directories.push(this.codexDir),this.components.skills&&(await n(this.skillsDir),this.records.created.directories.push(this.skillsDir))}writeSettings(){this.skipNoFace("writeSettings")}writeMcp(){this.skipNoFace("writeMcp")}async copySkills(){if(this.components.skills&&this.skills.core){const i=y.getSkillsSourceDir();await F(i,this.skillsDir,this.force,this.records)}}copyCommands(){this.skipNoFace("copyCommands")}copyAgents(){this.skipNoFace("copyAgents")}injectPluginTemplates(){this.skipNoFace("injectPluginTemplates")}writeHelpers(){this.skipNoFace("writeHelpers")}skipNoFace(i){const s=a("init.noPeerFace");this.skip(i,s),p.dim(a("init.stepSkipped",{step:i,reason:s}))}}async function F(t,i,s,e){try{for(const r of await l(t)){const h=o.relative(t,r),c=o.join(i,h),d=await k(r,"utf-8");await w(c,d,s)?e.created.files.push(c):e.skipped.push(c)}}catch(r){p.warn(a("init.copyTemplatesFailed",{srcDir:t,error:String(r)}))}}async function l(t){const i=[];try{const s=await m(t,{withFileTypes:!0});for(const e of s){const r=o.join(t,e.name);e.isDirectory()?i.push(...await l(r)):i.push(r)}}catch{return i}return i}
@@ -0,0 +1,14 @@
1
+ import { type ClaudeMdTemplate } from './claudemd-gen.js';
2
+ export interface InstructionFilesInput {
3
+ claude: boolean;
4
+ codex: boolean;
5
+ template: ClaudeMdTemplate;
6
+ projectName: string;
7
+ }
8
+ export interface InstructionFilesResult {
9
+ created: string[];
10
+ merged: string[];
11
+ /** i18n 已渲染的提示行(fresh local / 并入共享文件)。 */
12
+ notes: string[];
13
+ }
14
+ export declare function writeInstructionFiles(dir: string, input: InstructionFilesInput): Promise<InstructionFilesResult>;
@@ -0,0 +1 @@
1
+ import s from"node:path";import{lstat as S,readFile as g,writeFile as p}from"node:fs/promises";import{HARNESS_LOCAL_INSTRUCTION_FILES as c,INSTRUCTION_FILES as h}from"@weavecode/core";import{generateClaudeMd as I,generateClaudeMdSection as F,mergeClaudeMd as N}from"./claudemd-gen.js";import{t as u}from"../i18n/index.js";const w=h[1];async function C(t,e){const i=F(e),a=await g(t,"utf-8").catch(()=>null);return a===null?(await p(t,I(e),"utf-8"),"created"):(await p(t,N(a,i),"utf-8"),"merged")}export async function writeInstructionFiles(t,e){const i=[],a=[],r=[];if(e.claude){const n=s.join(t,c.claude.file),o=await C(n,e);(o==="created"?i:a).push(n),o==="created"&&r.push(u("init.instruction.localCreated",{file:c.claude.file}))}if(e.codex){const n=s.join(t,w),o=s.join(t,c.codex.file),l=await S(n).catch(()=>null),d=l!==null&&(l.isFile()||l.isSymbolicLink()),f=d?n:o,m=await C(f,e);(m==="created"?i:a).push(f),d?r.push(u("init.instruction.agentsMerged",{file:w})):m==="created"&&r.push(u("init.instruction.localCreated",{file:c.codex.file}))}return{created:i,merged:a,notes:r}}
@@ -1 +1 @@
1
- import c from"node:path";import{lstat as d,mkdir as h,readFile as k,readlink as b,symlink as g,unlink as f,writeFile as m}from"node:fs/promises";import{INSTRUCTION_FILES as y}from"@weavecode/core";import{t as l}from"../i18n/index.js";const[r,o]=y;async function w(t){try{if((await d(t)).isSymbolicLink()){const a=await b(t);try{return await k(c.resolve(c.dirname(t),a)),{state:"link",target:a}}catch{return{state:"broken-link",target:a}}}return{state:"file"}}catch{return{state:"absent"}}}async function u(t,i,a){const s=c.join(t,i);try{await g(a,s,"file")}catch(e){const n=e.code;throw new Error(l("ilink.linkFailed",{link:i,target:a,path:s,detail:n==="EPERM"||n==="EACCES"||n==="UNKNOWN"?l("ilink.symlinkNotAllowed"):String(e)}))}}async function F(t,i){const a=c.join(t,".weave","backup");await h(a,{recursive:!0});const s=new Date().toISOString().replace(/[:.]/g,"-"),e=c.join(a,`${i}.${s}`);return await m(e,await k(c.join(t,i),"utf-8"),"utf-8"),e}export async function ensureInstructionLink(t,i){const a=c.join(t,r),s=c.join(t,o),e=await w(a),n=await w(s);if(e.state==="link"&&e.target===o&&n.state==="file")return{action:"unchanged",realFile:o};if((n.state==="link"||n.state==="broken-link")&&n.target===r)return{action:"unchanged",realFile:r};if(e.state==="absent"&&n.state==="file")return await u(t,r,o),{action:"adopted",realFile:o};if(n.state==="absent")return(e.state==="link"||e.state==="broken-link")&&await f(a),await u(t,o,r),{action:"created",realFile:r};if(!(i.force?!0:await i.confirm(l("ilink.bothHaveContent"),l("ilink.replaceDetail",{backupDir:".weave/backup/"}))))return{action:"unchanged",realFile:r};const p=n.state==="file"?await F(t,o):void 0;return await f(s),await u(t,o,r),{action:"replaced",realFile:r,backedUpTo:p}}
1
+ import o from"node:path";import{lstat as m,mkdir as p,readFile as u,readlink as b,symlink as g,unlink as f,writeFile as y}from"node:fs/promises";import{INSTRUCTION_FILES as F}from"@weavecode/core";import{t as c}from"../i18n/index.js";const[n,l]=F;async function w(t){try{if((await m(t)).isSymbolicLink()){const a=await b(t);try{return await u(o.resolve(o.dirname(t),a)),{state:"link",target:a}}catch{return{state:"broken-link",target:a}}}return{state:"file"}}catch{return{state:"absent"}}}async function k(t,a,r){const s=o.join(t,a);try{await g(r,s,"file")}catch(e){const i=e.code;throw new Error(c("ilink.linkFailed",{link:a,target:r,path:s,detail:i==="EPERM"||i==="EACCES"||i==="UNKNOWN"?c("ilink.symlinkNotAllowed"):String(e)}))}}async function h(t,a){const r=o.join(t,".weave","backup");await p(r,{recursive:!0});const s=new Date().toISOString().replace(/[:.]/g,"-"),e=o.join(r,`${a}.${s}`);return await y(e,await u(o.join(t,a),"utf-8"),"utf-8"),e}export async function ensureInstructionLink(t,a){const r=o.join(t,n),s=o.join(t,l),e=await w(r),i=await w(s);if(e.state==="link"&&e.target===l&&i.state==="file")return{action:"unchanged",realFile:l};if((i.state==="link"||i.state==="broken-link")&&i.target===n)return{action:"unchanged",realFile:n};if(e.state==="absent"&&i.state==="file")return await k(t,n,l),{action:"adopted",realFile:l};if(i.state==="absent")return(e.state==="link"||e.state==="broken-link")&&await f(r),await k(t,l,n),{action:"created",realFile:n};if(!(a.force||await a.confirm(c("ilink.bothHaveContent"),c("ilink.replaceDetail",{backupDir:".weave/backup/"}))))return{action:"unchanged",realFile:n};const d=i.state==="file"?await h(t,l):void 0;return await f(s),await k(t,l,n),{action:"replaced",realFile:n,backedUpTo:d}}
@@ -1 +1 @@
1
- import o from"node:path";import{readdir as v,readFile as w}from"node:fs/promises";import{detectPlatform as P,WEAVE_PLUGIN_MANIFEST as $,WeavePluginManifestSchema as S}from"@weavecode/core";import{templateRegistry as j}from"@weavecode/templates";async function*g(f,m){const i=[m??o.join(P().configDir,"weave","data","plugins"),o.join(f,".weave","plugins")];for(const e of i){let n;try{n=await v(e)}catch{continue}for(const r of n){const t=o.join(e,r);let s;try{s=JSON.parse(await w(o.join(t,$),"utf8"))}catch{continue}const c=S.safeParse(s);c.success&&(yield{dir:t,manifest:c.data})}}}export async function registerPluginTemplates(f,m){const i=[],e=[];for await(const{dir:n,manifest:r}of g(f,m)){if(!r.templates)continue;const{id:t,templates:s}=r,c={skills:"skill",commands:"command",agents:"agent"};for(const[a,h]of Object.entries(s)){const u=c[a];if(u)for(const d of h??[]){const p=o.resolve(n,d);if(!p.startsWith(o.resolve(n)+o.sep)){e.push(d);continue}const y=o.basename(p).replace(/\.md$/,""),l={name:`${t}:${y}`,category:u,sourcePath:p,description:`${t} \u63D2\u4EF6\u6A21\u677F`};j.register(l)?i.push(l):e.push(l.name)}}}return{registered:i,skipped:e}}export async function collectPluginMcpServers(f,m,i=[]){const e={},n=[],r=new Set(i);for await(const{manifest:t}of g(f,m))if(t.mcpServers)for(const[s,c]of Object.entries(t.mcpServers)){let a=s;r.has(a)&&(a=`${t.id}-${s}`,n.push(`${s} \u2192 ${a}`)),r.add(a),e[a]=c}return{servers:e,renamed:n}}
1
+ import o from"node:path";import{readdir as y,readFile as $}from"node:fs/promises";import{detectPlatform as w,WEAVE_PLUGIN_MANIFEST as P,WeavePluginManifestSchema as S}from"@weavecode/core";import{templateRegistry as j}from"@weavecode/templates";async function*g(f,m){const i=[m??o.join(w().configDir,"weave","data","plugins"),o.join(f,".weave","plugins")];for(const e of i){let s;try{s=await y(e)}catch{continue}for(const r of s){const t=o.join(e,r);let n;try{n=JSON.parse(await $(o.join(t,P),"utf8"))}catch{continue}const c=S.safeParse(n);c.success&&(yield{dir:t,manifest:c.data})}}}export async function registerPluginTemplates(f,m){const i=[],e=[];for await(const{dir:s,manifest:r}of g(f,m)){if(!r.templates)continue;const{id:t,templates:n}=r,c={skills:"skill",commands:"command",agents:"agent"};for(const[a,h]of Object.entries(n)){const l=c[a];if(l)for(const d of h??[]){const u=o.resolve(s,d);if(!u.startsWith(o.resolve(s)+o.sep)){e.push(d);continue}const v=o.basename(u).replace(/\.md$/,""),p={name:`${t}:${v}`,category:l,sourcePath:u,description:`${t} \u63D2\u4EF6\u6A21\u677F`};j.register(p)?i.push(p):e.push(p.name)}}}return{registered:i,skipped:e}}export async function collectPluginMcpServers(f,m,i=[]){const e={},s=[],r=new Set(i);for await(const{manifest:t}of g(f,m))if(t.mcpServers)for(const[n,c]of Object.entries(t.mcpServers)){let a=n;r.has(a)&&(a=`${t.id}-${n}`,s.push(`${n} \u2192 ${a}`)),r.add(a),e[a]=c}return{servers:e,renamed:s}}
@@ -1,5 +1,5 @@
1
- import{logger as m}from"@weavecode/core";import{t as c}from"../i18n/index.js";export async function confirmPrompt(o,l,t){if(!t||!process.stdin.isTTY||!process.stdout.isTTY)return!0;const{createInterface:e}=await import("node:readline/promises"),s=e({input:process.stdin,output:process.stdout});try{const i=await s.question(`
2
- ${o}
1
+ import{logger as m}from"@weavecode/core";import{t as u}from"../i18n/index.js";export async function confirmPrompt(i,l,t){if(!t||!process.stdin.isTTY||!process.stdout.isTTY)return!0;const{createInterface:o}=await import("node:readline/promises"),n=o({input:process.stdin,output:process.stdout});try{const r=await n.question(`
2
+ ${i}
3
3
  ${l}
4
- ${c("init.proceed")} `);return!/^n(o)?$/i.test(i.trim())}finally{s.close()}}export function createPromptPort(o){const l=()=>o&&!!process.stdin.isTTY&&!!process.stdout.isTTY;return{confirm:(t,e="")=>confirmPrompt(t,e,o),async multiselect(t,e){if(!l())return[...e];if(t.length===0)return[];const{createInterface:s}=await import("node:readline/promises"),i=s({input:process.stdin,output:process.stdout});try{console.log(`
5
- ${c("init.multiselect.title")}`),t.forEach((n,f)=>console.log(` ${f+1}) ${n}`));const p=(await i.question(` ${c("init.multiselect.hint",{defaults:e.join(",")})} `)).trim();if(!p)return[...e];const r=[],u=[];for(const n of p.split(/[,\s]+/).filter(Boolean)){const a=(/^\d+$/.test(n)?t[Number(n)-1]:void 0)??t.find(d=>d.toLowerCase()===n.toLowerCase());a===void 0?u.push(n):r.includes(a)||r.push(a)}return u.length>0&&m.warn(c("init.multiselect.invalid",{keys:u.join(", ")})),r.length>0?r:[...e]}finally{i.close()}}}}
4
+ ${u("init.proceed")} `);return!/^n(o)?$/i.test(r.trim())}finally{n.close()}}export function createPromptPort(i){const l=()=>i&&!!process.stdin.isTTY&&!!process.stdout.isTTY;return{confirm:(t,o="")=>confirmPrompt(t,o,i),async multiselect(t,o){if(!l())return[...o];if(t.length===0)return[];const{createInterface:n}=await import("node:readline/promises"),r=n({input:process.stdin,output:process.stdout});try{console.log(`
5
+ ${u("init.multiselect.title")}`),t.forEach((e,s)=>console.log(` ${s+1}) ${e}`));const p=(await r.question(` ${u("init.multiselect.hint",{defaults:o.join(",")})} `)).trim();if(!p)return[...o];const c=[],a=[];for(const e of p.split(/[,\s]+/).filter(Boolean)){const s=(/^\d+$/.test(e)?t[Number(e)-1]:void 0)??t.find(f=>f.toLowerCase()===e.toLowerCase());s===void 0?a.push(e):c.includes(s)||c.push(s)}return a.length>0&&m.warn(u("init.multiselect.invalid",{keys:a.join(", ")})),c.length>0?c:[...o]}finally{r.close()}}}}
@@ -1 +1 @@
1
- import{spawn as d}from"node:child_process";import{HARNESS_DRIVERS as m,HARNESS_INSTALL as p,ensureClaudeTrustAccepted as w,ensureCodexTrustAccepted as h}from"@weavecode/harness";import{probeBinVersion as v}from"@weavecode/server";import{logger as r}from"@weavecode/core";import{t}from"../i18n/index.js";const T={versionOf:e=>v(e),runInstall:e=>new Promise((a,i)=>{const s=d(e,{shell:!0,stdio:"inherit",windowsHide:!0});s.on("error",i),s.on("close",n=>n===0?a():i(new Error(`exit ${n}`)))})};export async function ensureHarnessInstalled(e,a,i=T){const s=!!process.stdin.isTTY&&!!process.stdout.isTTY;for(const n of e){const o=m[n].resume;if(!o?.bin)continue;const c=p[n].command,l=await i.versionOf(o.bin);if(l!==null){const u=o.minVersion;u&&!y(l,u)?r.warn(t("init.install.versionLow",{harness:n,version:l,min:u,command:c})):r.dim(t("init.install.installed",{harness:n,version:l})),await g(n,o.bin);continue}if(r.info(t("init.install.notFound",{harness:n})),!s){r.warn(t("init.install.declined",{command:c}));continue}if(await i.versionOf("npm")===null){r.warn(t("init.install.npmMissing",{command:c}));continue}if(!await a.confirm(t("init.install.confirm",{harness:n}),t("init.install.detail",{command:c}))){r.warn(t("init.install.declined",{command:c}));continue}r.dim(t("init.install.running",{harness:n}));try{await i.runInstall(c)}catch{r.warn(t("init.install.verifyFailed",{harness:n,command:c}));continue}const f=await i.versionOf(o.bin);f!==null?r.success(t("init.install.done",{harness:n,version:f})):r.warn(t("init.install.verifyFailed",{harness:n,command:c}))}}async function g(e,a){const i=m[e].provision;if(i)try{const s=await i.check(a);for(let n=0;n<s.warnings.length;n++){const o=s.hints[n];r.warn(t("init.provision.conflict",{harness:e,warning:s.warnings[n],hint:o??""}))}}catch(s){r.warn(t("init.provision.checkFailed",{harness:e,error:s.message}))}}const I={claude:w,codex:h};export async function prewriteTrust(e,a){for(const i of e){const s=I[i];if(s)try{await s(a),r.dim(t("init.trust.prewritten",{harness:i}))}catch(n){r.warn(t("init.trust.failed",{harness:i,error:n.message}))}}}function y(e,a){const i=e.split(".").map(n=>Number.parseInt(n,10)),s=a.split(".").map(n=>Number.parseInt(n,10));for(let n=0;n<3;n++){const o=(i[n]??0)-(s[n]??0);if(o!==0)return o>0}return!0}
1
+ import{spawn as u}from"node:child_process";import{HARNESS_DRIVERS as f,HARNESS_INSTALL as w,ensureClaudeTrustAccepted as p,ensureCodexTrustAccepted as h}from"@weavecode/harness";import{probeBinVersion as v}from"@weavecode/server";import{logger as r}from"@weavecode/core";import{t as s}from"../i18n/index.js";const g={versionOf:e=>v(e),runInstall:e=>new Promise((a,i)=>{const t=u(e,{shell:!0,stdio:"inherit",windowsHide:!0});t.on("error",i),t.on("close",n=>n===0?a():i(new Error(`exit ${n}`)))})};export async function ensureHarnessInstalled(e,a,i=g){const t=!!process.stdin.isTTY&&!!process.stdout.isTTY;for(const n of e){const o=f[n].resume;if(!o?.bin)continue;const c=w[n].command,l=await i.versionOf(o.bin);if(l!==null){const m=o.minVersion;m&&!I(l,m)?r.warn(s("init.install.versionLow",{harness:n,version:l,min:m,command:c})):r.dim(s("init.install.installed",{harness:n,version:l})),await y(n,o.bin);continue}if(r.info(s("init.install.notFound",{harness:n})),!t){r.warn(s("init.install.declined",{command:c}));continue}if(await i.versionOf("npm")===null){r.warn(s("init.install.npmMissing",{command:c}));continue}if(!await a.confirm(s("init.install.confirm",{harness:n}),s("init.install.detail",{command:c}))){r.warn(s("init.install.declined",{command:c}));continue}r.dim(s("init.install.running",{harness:n}));try{await i.runInstall(c)}catch{r.warn(s("init.install.verifyFailed",{harness:n,command:c}));continue}const d=await i.versionOf(o.bin);d!==null?r.success(s("init.install.done",{harness:n,version:d})):r.warn(s("init.install.verifyFailed",{harness:n,command:c}))}}async function y(e,a){const i=f[e].provision;if(i)try{const t=await i.check(a);for(let n=0;n<t.warnings.length;n++){const o=t.hints[n];r.warn(s("init.provision.conflict",{harness:e,warning:t.warnings[n],hint:o??""}))}}catch(t){r.warn(s("init.provision.checkFailed",{harness:e,error:t.message}))}}const T={claude:p,codex:h};export async function prewriteTrust(e,a){for(const i of e){const t=T[i];if(t)try{await t(a),r.dim(s("init.trust.prewritten",{harness:i}))}catch(n){r.warn(s("init.trust.failed",{harness:i,error:n.message}))}}}function I(e,a){const i=e.split(".").map(n=>Number.parseInt(n,10)),t=a.split(".").map(n=>Number.parseInt(n,10));for(let n=0;n<3;n++){const o=(i[n]??0)-(t[n]??0);if(o!==0)return o>0}return!0}
@@ -1,6 +1,6 @@
1
- import s from"node:path";import{lstat as T,readdir as _,readFile as G,rm as O,rmdir as W,unlink as m,writeFile as v}from"node:fs/promises";import{HARNESS_DIRS as x,HARNESS_KEYS as N,INSTRUCTION_FILES as S,logger as H}from"@weavecode/core";import{hashFile as C,projectPackFiles as U,unregisterProject as B}from"@weavecode/server";import{templateRegistry as F}from"@weavecode/templates";import{stripWeaveSettings as L}from"./settings-gen.js";import{stripWeaveMcp as V}from"./mcp-gen.js";import{WEAVE_BLOCK_START as J,WEAVE_BLOCK_END as R,WEAVE_MANAGED_HEADER as K}from"./claudemd-gen.js";import{WEAVE_HELPER_MARKER as q}from"./harnesses/claude.js";import{registerPluginTemplates as z}from"./plugin-templates.js";import{NESTED_GITIGNORE as Y}from"./executor.js";import{COMMIT_MESSAGE as $,findGitRepoRoot as Q,defaultGitExec as X}from"./git-commit.js";import{t as Z}from"../i18n/index.js";const tt="chore: weave uninstall \u79FB\u9664 init \u751F\u6210\u7269",k=S[1],et=[...S,".mcp.json",...N.map(n=>x[n].projectDir),".weave"];async function D(n){try{return await T(n),!0}catch{return!1}}async function p(n){try{return await G(n,"utf-8")}catch{return null}}async function b(n){const t=await p(n);if(t!==null)try{const i=JSON.parse(t);if(i&&typeof i=="object"&&!Array.isArray(i))return i}catch{}}async function j(n){const t=[];let i;try{i=await _(n,{withFileTypes:!0})}catch{return t}for(const e of i){const a=s.join(n,e.name);e.isDirectory()?t.push(...await j(a)):t.push(a)}return t}async function it(n,t){const[i,e]=await Promise.all([p(n),p(t)]);return i!==null&&i===e}async function A(n,t,i){let e=n;const a=s.resolve(t);for(;;){if(s.resolve(e)===a||!e.startsWith(a+s.sep))return;try{await W(e),i.push(e)}catch{return}e=s.dirname(e)}}class st{targetDir;execGit;dbPath;hooksDir;result;constructor(t){this.targetDir=s.resolve(t.targetDir),this.execGit=t.execGit??X,this.dbPath=t.dbPath,this.hooksDir=t.hooksDir,this.result={status:"ok",removedFiles:[],removedDirs:[],modifiedFiles:[],keptUserFiles:[],git:"no-changes",server:{outcome:"absent"}}}async run(){const t=s.join(this.targetDir,".weave");if(!await D(t))return this.result.status="not-initialized",this.unregisterFromServer(),this.result;const i=await U(this.targetDir),e=await rt(t);let a=[];try{a=(await z(this.targetDir)).registered}catch(r){H.warn(Z("uninstall.pluginScanFailed",{error:String(r)}))}for(const r of N)await this.sweepHarness(r,a);return await this.sweepMcp(),await this.sweepInstructionFiles(e),await this.sweepPackFiles(i),await O(t,{recursive:!0,force:!0}),this.result.removedDirs.push(t),await this.runGit(),this.unregisterFromServer(),this.result}unregisterFromServer(){try{const t=B(this.targetDir,this.dbPath,this.hooksDir);t&&(this.result.server={outcome:"removed",name:t.name,purged:t.purged})}catch(t){this.result.server={outcome:"failed",error:t instanceof Error?t.message:String(t)}}}async sweepHarness(t,i){const e=s.join(this.targetDir,x[t].projectDir);if(!await D(e))return;const a=s.join(e,"helpers");for(const o of await j(a)){const u=await p(o);u!==null&&u.includes(q)?(await m(o),this.result.removedFiles.push(o)):this.result.keptUserFiles.push(o)}const r=[["skills",F.getSkillsSourceDir()],["commands",F.getCommandsSourceDir()],["agents",F.getAgentsSourceDir()]];for(const[o,u]of r)u&&await this.removeTemplateMirrors(s.join(e,o),u);for(const o of i){const u=o.sourcePath;if(o.category==="skill")await this.removeTemplateMirrors(s.join(e,"skills",s.basename(u)),u);else{const y=o.category==="command"?"commands":"agents",l=s.join(e,y,s.basename(u));await this.removeIfSame(l,u)}}const c=s.join(e,"settings.json"),f=await b(c);if(f){const o=L(f);Object.keys(o).length>0?(await v(c,JSON.stringify(o,null,2)+`
2
- `,"utf-8"),this.result.modifiedFiles.push(c)):(await m(c),this.result.removedFiles.push(c))}const h=s.join(e,".gitignore");await p(h)===Y&&(await m(h),this.result.removedFiles.push(h));for(const o of["helpers","skills","commands","agents"])await A(s.join(e,o),this.targetDir,this.result.removedDirs);await A(e,this.targetDir,this.result.removedDirs)}async removeTemplateMirrors(t,i){for(const e of await j(i)){const a=s.relative(i,e);await this.removeIfSame(s.join(t,a),e)}}async removeIfSame(t,i){await D(t)&&(await it(t,i)?(await m(t),this.result.removedFiles.push(t)):this.result.keptUserFiles.push(t))}async sweepMcp(){const t=s.join(this.targetDir,".mcp.json"),i=await b(t);if(!i)return;const e=V(i);Object.keys(e).length>0?(await v(t,JSON.stringify(e,null,2)+`
3
- `,"utf-8"),this.result.modifiedFiles.push(t)):(await m(t),this.result.removedFiles.push(t))}async sweepInstructionFiles(t){for(const i of[...S].reverse()){const e=s.join(this.targetDir,i);let a;try{a=await T(e)}catch{continue}if(a.isSymbolicLink()){await m(e),this.result.removedFiles.push(e);continue}if(!a.isFile())continue;const r=await p(e);if(r===null)continue;if(r.includes(K)){await m(e),this.result.removedFiles.push(e);continue}const c=r.indexOf(J),f=r.indexOf(R);if(c!==-1&&f!==-1&&f>c){const h=(r.slice(0,c)+r.slice(f+R.length)).replace(/\s+$/,"");h===""?(await m(e),this.result.removedFiles.push(e)):(await v(e,h+`
4
- `,"utf-8"),this.result.modifiedFiles.push(e))}}if(t&&!await D(s.join(this.targetDir,k))){const i=await p(t);i!==null&&(await v(s.join(this.targetDir,k),i,"utf-8"),this.result.restoredFromBackup=s.join(this.targetDir,k))}}async sweepPackFiles(t){for(const[e,a]of t){const r=s.resolve(this.targetDir,e);r!==this.targetDir&&!r.startsWith(this.targetDir+s.sep)||(await C(r)===a?(await m(r).catch(()=>{}),this.result.removedFiles.push(r)):await D(r)&&this.result.keptUserFiles.push(r))}const i=[...new Set([...t.keys()].map(e=>s.dirname(s.resolve(this.targetDir,e))))];for(const e of i)await A(e,this.targetDir,this.result.removedDirs)}async git(t){return this.execGit("git",t,{cwd:this.targetDir})}async runGit(){if(!await Q(this.targetDir)){this.result.git="skipped-not-repo";return}try{if((await this.git(["diff","--cached","--quiet"])).code!==0){this.result.git="skipped-dirty-index";return}const e=await this.git(["log","-1","--format=%s %H %P"]);if(e.code===0){const[l,d,w]=e.stdout.trimEnd().split(" ");if(l===$&&w){const I=await this.git(["diff-tree","--no-commit-id","--name-only","-r",d]),P=I.code===0?I.stdout.split(`
5
- `).map(g=>g.trim()).filter(Boolean):[],M=g=>et.some(E=>g===E||g===E+"/"||g.startsWith(E+"/"));if(P.length>0&&P.every(M)){const g=await this.git(["reset","--mixed","HEAD~1"]);if(g.code===0){this.result.git="reset",this.result.gitSha=w.slice(0,7);return}this.result.git="failed",this.result.gitError=g.stderr.trim()||"git reset failed";return}}}const a=[...this.result.removedFiles,...this.result.modifiedFiles,...this.result.restoredFromBackup?[this.result.restoredFromBackup]:[],s.join(this.targetDir,".weave")],r=[...new Set(a.map(l=>s.relative(this.targetDir,l).replace(/\\/g,"/")))],c=50,f=new Set;for(let l=0;l<r.length;l+=c){const d=await this.git(["ls-files","--",...r.slice(l,l+c)]);if(d.code!==0){this.result.git="failed",this.result.gitError=d.stderr.trim()||"git ls-files failed";return}for(const w of d.stdout.split(`
6
- `))w.trim()&&f.add(w.trim().replace(/\\/g,"/"))}const h=[...f];if(h.length>0)for(let l=0;l<h.length;l+=c){const d=await this.git(["add","--",...h.slice(l,l+c)]);if(d.code!==0){this.result.git="failed",this.result.gitError=d.stderr.trim()||"git add failed";return}}if((await this.git(["diff","--cached","--quiet"])).code===0){this.result.git="no-changes";return}const u=await this.git(["commit","-m",tt]);if(u.code!==0){this.result.git="failed",this.result.gitError=u.stderr.trim()||"git commit failed";return}const y=await this.git(["rev-parse","--short","HEAD"]);this.result.git="committed",this.result.gitSha=y.code===0?y.stdout.trim():void 0}catch(i){this.result.git="failed",this.result.gitError=i instanceof Error?i.message:String(i)}}}async function rt(n){const t=s.join(n,"backup");let i;try{i=await _(t)}catch{return null}const e=i.filter(a=>S.some(r=>a.startsWith(r+"."))).sort();return e.length>0?s.join(t,e[e.length-1]):null}export async function executeUninstall(n){return new st(n).run()}
1
+ import s from"node:path";import{lstat as A,readdir as _,readFile as P,rm as G,rmdir as x,unlink as m,writeFile as v}from"node:fs/promises";import{HARNESS_DIRS as I,HARNESS_KEYS as O,HARNESS_LOCAL_INSTRUCTION_FILES as M,INSTRUCTION_FILES as D,logger as H}from"@weavecode/core";import{hashFile as W,projectPackFiles as L,unregisterProject as B}from"@weavecode/server";import{templateRegistry as F}from"@weavecode/templates";import{stripWeaveSettings as C}from"./settings-gen.js";import{stripWeaveMcp as U}from"./mcp-gen.js";import{WEAVE_BLOCK_START as K,WEAVE_BLOCK_END as R,WEAVE_MANAGED_HEADER as V}from"./claudemd-gen.js";import{WEAVE_HELPER_MARKER as J}from"./harnesses/claude.js";import{registerPluginTemplates as q}from"./plugin-templates.js";import{NESTED_GITIGNORE as z}from"./executor.js";import{COMMIT_MESSAGE as Y,findGitRepoRoot as $,defaultGitExec as Q}from"./git-commit.js";import{t as X}from"../i18n/index.js";const Z="chore: weave uninstall \u79FB\u9664 init \u751F\u6210\u7269",S=D[1],N=Object.values(M).map(n=>n.file),tt=[...D,...N,".mcp.json",...O.map(n=>I[n].projectDir),".weave"];async function p(n){try{return await A(n),!0}catch{return!1}}async function g(n){try{return await P(n,"utf-8")}catch{return null}}async function T(n){const t=await g(n);if(t!==null)try{const i=JSON.parse(t);if(i&&typeof i=="object"&&!Array.isArray(i))return i}catch{}}async function E(n){const t=[];let i;try{i=await _(n,{withFileTypes:!0})}catch{return t}for(const e of i){const a=s.join(n,e.name);e.isDirectory()?t.push(...await E(a)):t.push(a)}return t}async function et(n,t){const[i,e]=await Promise.all([g(n),g(t)]);return i!==null&&i===e}async function j(n,t,i){let e=n;const a=s.resolve(t);for(;;){if(s.resolve(e)===a||!e.startsWith(a+s.sep))return;try{await x(e),i.push(e)}catch{return}e=s.dirname(e)}}class it{targetDir;execGit;dbPath;hooksDir;result;constructor(t){this.targetDir=s.resolve(t.targetDir),this.execGit=t.execGit??Q,this.dbPath=t.dbPath,this.hooksDir=t.hooksDir,this.result={status:"ok",removedFiles:[],removedDirs:[],modifiedFiles:[],keptUserFiles:[],git:"no-changes",server:{outcome:"absent"}}}async run(){const t=s.join(this.targetDir,".weave");if(!await p(t))return this.result.status="not-initialized",this.unregisterFromServer(),this.result;const i=await L(this.targetDir),e=await st(t);let a=[];try{a=(await q(this.targetDir)).registered}catch(o){H.warn(X("uninstall.pluginScanFailed",{error:String(o)}))}for(const o of O)await this.sweepHarness(o,a);return await this.sweepMcp(),await this.sweepInstructionFiles(e),await this.sweepPackFiles(i),await G(t,{recursive:!0,force:!0}),this.result.removedDirs.push(t),await this.runGit(),this.unregisterFromServer(),this.result}unregisterFromServer(){try{const t=B(this.targetDir,this.dbPath,this.hooksDir);t&&(this.result.server={outcome:"removed",name:t.name,purged:t.purged})}catch(t){this.result.server={outcome:"failed",error:t instanceof Error?t.message:String(t)}}}async sweepHarness(t,i){const e=s.join(this.targetDir,I[t].projectDir);if(!await p(e))return;const a=s.join(e,"helpers");for(const r of await E(a)){const l=await g(r);l!==null&&l.includes(J)?(await m(r),this.result.removedFiles.push(r)):this.result.keptUserFiles.push(r)}const o=[["skills",F.getSkillsSourceDir()],["commands",F.getCommandsSourceDir()],["agents",F.getAgentsSourceDir()]];for(const[r,l]of o)l&&await this.removeTemplateMirrors(s.join(e,r),l);for(const r of i){const l=r.sourcePath;if(r.category==="skill")await this.removeTemplateMirrors(s.join(e,"skills",s.basename(l)),l);else{const d=r.category==="command"?"commands":"agents",w=s.join(e,d,s.basename(l));await this.removeIfSame(w,l)}}const c=s.join(e,"settings.json"),u=await T(c);if(u){const r=C(u);Object.keys(r).length>0?(await v(c,JSON.stringify(r,null,2)+`
2
+ `,"utf-8"),this.result.modifiedFiles.push(c)):(await m(c),this.result.removedFiles.push(c))}const h=s.join(e,".gitignore");await g(h)===z&&(await m(h),this.result.removedFiles.push(h));for(const r of["helpers","skills","commands","agents"])await j(s.join(e,r),this.targetDir,this.result.removedDirs);await j(e,this.targetDir,this.result.removedDirs)}async removeTemplateMirrors(t,i){for(const e of await E(i)){const a=s.relative(i,e);await this.removeIfSame(s.join(t,a),e)}}async removeIfSame(t,i){await p(t)&&(await et(t,i)?(await m(t),this.result.removedFiles.push(t)):this.result.keptUserFiles.push(t))}async sweepMcp(){const t=s.join(this.targetDir,".mcp.json"),i=await T(t);if(!i)return;const e=U(i);Object.keys(e).length>0?(await v(t,JSON.stringify(e,null,2)+`
3
+ `,"utf-8"),this.result.modifiedFiles.push(t)):(await m(t),this.result.removedFiles.push(t))}async sweepInstructionFiles(t){for(const i of[...[...D].reverse(),...N]){const e=s.join(this.targetDir,i);let a;try{a=await A(e)}catch{continue}if(a.isSymbolicLink()){await m(e),this.result.removedFiles.push(e);continue}if(!a.isFile())continue;const o=await g(e);if(o===null)continue;if(o.includes(V)){await m(e),this.result.removedFiles.push(e);continue}const c=o.indexOf(K),u=o.indexOf(R);if(c!==-1&&u!==-1&&u>c){const h=(o.slice(0,c)+o.slice(u+R.length)).replace(/\s+$/,"");h===""?(await m(e),this.result.removedFiles.push(e)):(await v(e,h+`
4
+ `,"utf-8"),this.result.modifiedFiles.push(e))}}if(t&&!await p(s.join(this.targetDir,S))){const i=await g(t);i!==null&&(await v(s.join(this.targetDir,S),i,"utf-8"),this.result.restoredFromBackup=s.join(this.targetDir,S))}}async sweepPackFiles(t){for(const[e,a]of t){const o=s.resolve(this.targetDir,e);o!==this.targetDir&&!o.startsWith(this.targetDir+s.sep)||(await W(o)===a?(await m(o).catch(()=>{}),this.result.removedFiles.push(o)):await p(o)&&this.result.keptUserFiles.push(o))}const i=[...new Set([...t.keys()].map(e=>s.dirname(s.resolve(this.targetDir,e))))];for(const e of i)await j(e,this.targetDir,this.result.removedDirs)}async git(t){return this.execGit("git",t,{cwd:this.targetDir})}async runGit(){if(!await $(this.targetDir)){this.result.git="skipped-not-repo";return}try{if((await this.git(["diff","--cached","--quiet"])).code!==0){this.result.git="skipped-dirty-index";return}const t=await this.git(["log","-1","--format=%s %H %P"]);if(t.code===0){const[r,l,d]=t.stdout.trimEnd().split(" ");if(r===Y&&d){const w=await this.git(["diff-tree","--no-commit-id","--name-only","-r",l]),k=w.code===0?w.stdout.split(`
5
+ `).map(f=>f.trim()).filter(Boolean):[],b=f=>tt.some(y=>f===y||f===y+"/"||f.startsWith(y+"/"));if(k.length>0&&k.every(b)){const f=await this.git(["reset","--mixed","HEAD~1"]);if(f.code===0){this.result.git="reset",this.result.gitSha=d.slice(0,7);return}this.result.git="failed",this.result.gitError=f.stderr.trim()||"git reset failed";return}}}const i=[...this.result.removedFiles,...this.result.modifiedFiles,...this.result.restoredFromBackup?[this.result.restoredFromBackup]:[],s.join(this.targetDir,".weave")],e=[...new Set(i.map(r=>s.relative(this.targetDir,r).replace(/\\/g,"/")))],a=50,o=new Set;for(let r=0;r<e.length;r+=a){const l=await this.git(["ls-files","--",...e.slice(r,r+a)]);if(l.code!==0){this.result.git="failed",this.result.gitError=l.stderr.trim()||"git ls-files failed";return}for(const d of l.stdout.split(`
6
+ `))d.trim()&&o.add(d.trim().replace(/\\/g,"/"))}const c=[...o];if(c.length>0)for(let r=0;r<c.length;r+=a){const l=await this.git(["add","--",...c.slice(r,r+a)]);if(l.code!==0){this.result.git="failed",this.result.gitError=l.stderr.trim()||"git add failed";return}}if((await this.git(["diff","--cached","--quiet"])).code===0){this.result.git="no-changes";return}const u=await this.git(["commit","-m",Z]);if(u.code!==0){this.result.git="failed",this.result.gitError=u.stderr.trim()||"git commit failed";return}const h=await this.git(["rev-parse","--short","HEAD"]);this.result.git="committed",this.result.gitSha=h.code===0?h.stdout.trim():void 0}catch(t){this.result.git="failed",this.result.gitError=t instanceof Error?t.message:String(t)}}}async function st(n){const t=s.join(n,"backup");let i;try{i=await _(t)}catch{return null}const e=i.filter(a=>D.some(o=>a.startsWith(o+"."))).sort();return e.length>0?s.join(t,e[e.length-1]):null}export async function executeUninstall(n){return new it(n).run()}
@@ -1 +1 @@
1
- import{HARNESS_DRIVERS as o,createRuntimeRegistry as s}from"@weavecode/harness";import{ClaudeInitTemplate as c}from"./harnesses/claude.js";import{CodexInitTemplate as a}from"./harnesses/codex.js";const r={claude:c,codex:a};export function buildInitRegistry(){const t=s();for(const e of Object.keys(r)){const i=o[e],n={...i,capabilities:i.capabilities.includes("init")?i.capabilities:[...i.capabilities,"init"],init:r[e]};t.unregister(e),t.register(n)}return t}
1
+ import{HARNESS_DRIVERS as r,createRuntimeRegistry as n}from"@weavecode/harness";import{ClaudeInitTemplate as o}from"./harnesses/claude.js";import{CodexInitTemplate as c}from"./harnesses/codex.js";const s={claude:o,codex:c};export function buildInitRegistry(){const t=n();for(const e of Object.keys(s)){const i=r[e],a={...i,capabilities:i.capabilities.includes("init")?i.capabilities:[...i.capabilities,"init"],init:s[e]};t.unregister(e),t.register(a)}return t}