@ozzylabs/feedradar 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.ja.md +51 -13
  2. package/README.md +51 -13
  3. package/dist/agents/_boundary.d.ts +21 -0
  4. package/dist/agents/_boundary.d.ts.map +1 -1
  5. package/dist/agents/_boundary.js +34 -0
  6. package/dist/agents/_boundary.js.map +1 -1
  7. package/dist/agents/claude-code.d.ts.map +1 -1
  8. package/dist/agents/claude-code.js +14 -6
  9. package/dist/agents/claude-code.js.map +1 -1
  10. package/dist/agents/codex-cli.d.ts.map +1 -1
  11. package/dist/agents/codex-cli.js +13 -7
  12. package/dist/agents/codex-cli.js.map +1 -1
  13. package/dist/agents/copilot.d.ts.map +1 -1
  14. package/dist/agents/copilot.js +13 -6
  15. package/dist/agents/copilot.js.map +1 -1
  16. package/dist/agents/gemini-cli.d.ts.map +1 -1
  17. package/dist/agents/gemini-cli.js +13 -6
  18. package/dist/agents/gemini-cli.js.map +1 -1
  19. package/dist/agents/types.d.ts +26 -0
  20. package/dist/agents/types.d.ts.map +1 -1
  21. package/dist/claude-skills/dismiss/SKILL.md +4 -4
  22. package/dist/claude-skills/research/SKILL.md +2 -3
  23. package/dist/claude-skills/review/SKILL.md +2 -2
  24. package/dist/claude-skills/update/SKILL.md +7 -7
  25. package/dist/cli/_locale.d.ts +96 -0
  26. package/dist/cli/_locale.d.ts.map +1 -0
  27. package/dist/cli/_locale.js +130 -0
  28. package/dist/cli/_locale.js.map +1 -0
  29. package/dist/cli/_progress.d.ts +30 -1
  30. package/dist/cli/_progress.d.ts.map +1 -1
  31. package/dist/cli/_progress.js +9 -1
  32. package/dist/cli/_progress.js.map +1 -1
  33. package/dist/cli/dismiss.d.ts.map +1 -1
  34. package/dist/cli/dismiss.js +61 -54
  35. package/dist/cli/dismiss.js.map +1 -1
  36. package/dist/cli/doctor.d.ts +8 -0
  37. package/dist/cli/doctor.d.ts.map +1 -1
  38. package/dist/cli/doctor.js +91 -60
  39. package/dist/cli/doctor.js.map +1 -1
  40. package/dist/cli/index.d.ts +36 -1
  41. package/dist/cli/index.d.ts.map +1 -1
  42. package/dist/cli/index.js +79 -18
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/cli/init.d.ts +15 -0
  45. package/dist/cli/init.d.ts.map +1 -1
  46. package/dist/cli/init.js +149 -51
  47. package/dist/cli/init.js.map +1 -1
  48. package/dist/cli/items.d.ts.map +1 -1
  49. package/dist/cli/items.js +51 -30
  50. package/dist/cli/items.js.map +1 -1
  51. package/dist/cli/research.d.ts.map +1 -1
  52. package/dist/cli/research.js +138 -109
  53. package/dist/cli/research.js.map +1 -1
  54. package/dist/cli/review.d.ts.map +1 -1
  55. package/dist/cli/review.js +114 -92
  56. package/dist/cli/review.js.map +1 -1
  57. package/dist/cli/routine/fire.d.ts +3 -2
  58. package/dist/cli/routine/fire.d.ts.map +1 -1
  59. package/dist/cli/routine/fire.js +30 -25
  60. package/dist/cli/routine/fire.js.map +1 -1
  61. package/dist/cli/routine/generate-pipeline.d.ts +11 -4
  62. package/dist/cli/routine/generate-pipeline.d.ts.map +1 -1
  63. package/dist/cli/routine/generate-pipeline.js +137 -77
  64. package/dist/cli/routine/generate-pipeline.js.map +1 -1
  65. package/dist/cli/routine/generate-watch.d.ts +10 -1
  66. package/dist/cli/routine/generate-watch.d.ts.map +1 -1
  67. package/dist/cli/routine/generate-watch.js +49 -42
  68. package/dist/cli/routine/generate-watch.js.map +1 -1
  69. package/dist/cli/routine.d.ts.map +1 -1
  70. package/dist/cli/routine.js +28 -24
  71. package/dist/cli/routine.js.map +1 -1
  72. package/dist/cli/source.d.ts.map +1 -1
  73. package/dist/cli/source.js +206 -182
  74. package/dist/cli/source.js.map +1 -1
  75. package/dist/cli/triage.d.ts.map +1 -1
  76. package/dist/cli/triage.js +146 -130
  77. package/dist/cli/triage.js.map +1 -1
  78. package/dist/cli/undismiss.d.ts.map +1 -1
  79. package/dist/cli/undismiss.js +32 -25
  80. package/dist/cli/undismiss.js.map +1 -1
  81. package/dist/cli/update.d.ts.map +1 -1
  82. package/dist/cli/update.js +77 -61
  83. package/dist/cli/update.js.map +1 -1
  84. package/dist/cli/watch.d.ts.map +1 -1
  85. package/dist/cli/watch.js +71 -31
  86. package/dist/cli/watch.js.map +1 -1
  87. package/dist/cli/workflow/generate-combined-with-triage.d.ts +9 -2
  88. package/dist/cli/workflow/generate-combined-with-triage.d.ts.map +1 -1
  89. package/dist/cli/workflow/generate-combined-with-triage.js +120 -71
  90. package/dist/cli/workflow/generate-combined-with-triage.js.map +1 -1
  91. package/dist/cli/workflow/generate-combined.d.ts +8 -1
  92. package/dist/cli/workflow/generate-combined.d.ts.map +1 -1
  93. package/dist/cli/workflow/generate-combined.js +39 -33
  94. package/dist/cli/workflow/generate-combined.js.map +1 -1
  95. package/dist/cli/workflow/generate-watch.d.ts +10 -1
  96. package/dist/cli/workflow/generate-watch.d.ts.map +1 -1
  97. package/dist/cli/workflow/generate-watch.js +37 -30
  98. package/dist/cli/workflow/generate-watch.js.map +1 -1
  99. package/dist/cli/workflow.d.ts.map +1 -1
  100. package/dist/cli/workflow.js +28 -23
  101. package/dist/cli/workflow.js.map +1 -1
  102. package/dist/core/config.d.ts +2 -1
  103. package/dist/core/config.d.ts.map +1 -1
  104. package/dist/core/config.js +14 -4
  105. package/dist/core/config.js.map +1 -1
  106. package/dist/core/feeds/html-js.d.ts.map +1 -1
  107. package/dist/core/feeds/html-js.js +16 -9
  108. package/dist/core/feeds/html-js.js.map +1 -1
  109. package/dist/core/feeds/types.d.ts +9 -0
  110. package/dist/core/feeds/types.d.ts.map +1 -1
  111. package/dist/core/locale.d.ts +69 -0
  112. package/dist/core/locale.d.ts.map +1 -0
  113. package/dist/core/locale.js +74 -0
  114. package/dist/core/locale.js.map +1 -0
  115. package/dist/core/watcher.d.ts +11 -0
  116. package/dist/core/watcher.d.ts.map +1 -1
  117. package/dist/core/watcher.js +21 -5
  118. package/dist/core/watcher.js.map +1 -1
  119. package/dist/i18n/index.d.ts +57 -0
  120. package/dist/i18n/index.d.ts.map +1 -0
  121. package/dist/i18n/index.js +49 -0
  122. package/dist/i18n/index.js.map +1 -0
  123. package/dist/i18n/messages/en.d.ts +993 -0
  124. package/dist/i18n/messages/en.d.ts.map +1 -0
  125. package/dist/i18n/messages/en.js +1096 -0
  126. package/dist/i18n/messages/en.js.map +1 -0
  127. package/dist/i18n/messages/ja.d.ts +13 -0
  128. package/dist/i18n/messages/ja.d.ts.map +1 -0
  129. package/dist/i18n/messages/ja.js +970 -0
  130. package/dist/i18n/messages/ja.js.map +1 -0
  131. package/dist/schemas/config.d.ts +7 -0
  132. package/dist/schemas/config.d.ts.map +1 -1
  133. package/dist/schemas/config.js +5 -0
  134. package/dist/schemas/config.js.map +1 -1
  135. package/dist/schemas/recipe.d.ts +1 -1
  136. package/dist/schemas/source.d.ts +3 -3
  137. package/dist/skills/research/SKILL.md +13 -12
  138. package/dist/skills/review/SKILL.md +13 -12
  139. package/dist/skills/update/SKILL.md +19 -19
  140. package/dist/templates/en/agents/AGENTS.md +284 -0
  141. package/dist/templates/en/claude/CLAUDE.md +5 -0
  142. package/dist/templates/en/default.md +16 -0
  143. package/dist/templates/en/digest.md +66 -0
  144. package/dist/templates/en/feedradar.md +235 -0
  145. package/dist/templates/{routines → en/routines}/pipeline.yaml.tmpl +18 -20
  146. package/dist/templates/{routines → en/routines}/watch-daily.yaml +12 -15
  147. package/dist/templates/{routines → en/routines}/watch.yaml.tmpl +11 -14
  148. package/dist/templates/{workflows → en/workflows}/combined-with-triage.template.yaml.tmpl +3 -3
  149. package/dist/templates/{workflows → en/workflows}/combined.template.yaml.tmpl +6 -6
  150. package/dist/templates/{workflows → en/workflows}/watch.template.yaml.tmpl +8 -8
  151. package/dist/templates/{workflows → en/workflows}/watch.yaml +3 -3
  152. package/dist/templates/{agents → ja/agents}/AGENTS.md +16 -16
  153. package/dist/templates/{digest.md → ja/digest.md} +5 -6
  154. package/dist/templates/{feedradar.md → ja/feedradar.md} +12 -12
  155. package/dist/templates/ja/routines/pipeline.yaml.tmpl +211 -0
  156. package/dist/templates/ja/routines/watch-daily.yaml +151 -0
  157. package/dist/templates/ja/routines/watch.yaml.tmpl +145 -0
  158. package/dist/templates/ja/workflows/combined-with-triage.template.yaml.tmpl +123 -0
  159. package/dist/templates/ja/workflows/combined.template.yaml.tmpl +109 -0
  160. package/dist/templates/ja/workflows/watch.template.yaml.tmpl +100 -0
  161. package/dist/templates/ja/workflows/watch.yaml +73 -0
  162. package/package.json +1 -1
  163. /package/dist/templates/{claude → ja/claude}/CLAUDE.md +0 -0
  164. /package/dist/templates/{default.md → ja/default.md} +0 -0
@@ -1,9 +1,12 @@
1
1
  import { access, constants } from "node:fs/promises";
2
2
  import { delimiter, join } from "node:path";
3
3
  import { loadRadarConfig, RadarConfigError } from "../core/config.js";
4
+ import { applyZodLocale } from "../core/locale.js";
4
5
  import { CHROMIUM_MISSING_HINT, PLAYWRIGHT_MODULE_MISSING_HINT, probePlaywright, } from "../core/playwright-check.js";
5
6
  import { detectProxyUrl, maskProxyUrl } from "../core/proxy.js";
6
7
  import { loadSources } from "../core/watcher.js";
8
+ import { createTranslator } from "../i18n/index.js";
9
+ import { LangFlagError, parseLangFlag, resolveWorkspaceLocale } from "./_locale.js";
7
10
  /**
8
11
  * Agent CLIs the `doctor` command probes for. Order matches the AgentId enum
9
12
  * declaration so the output is deterministic across runs and easy to scan.
@@ -110,6 +113,11 @@ export async function runDoctorChecks(options = {}) {
110
113
  const cwd = options.cwd ?? process.cwd();
111
114
  const env = options.env ?? process.env;
112
115
  const whichImpl = options.whichImpl ?? defaultWhich;
116
+ // Resolve the UI locale so the diagnostic lines are localized. doctor is a
117
+ // user-facing health check (#312), so its check messages + summary go through
118
+ // the translator. A test seam (`options.t`) lets callers inject a translator
119
+ // directly; otherwise the locale is resolved from --lang / env / config.
120
+ const t = options.t ?? createTranslator(await resolveWorkspaceLocale({ flag: undefined, cwd }));
113
121
  const checks = [];
114
122
  // 1. Workspace directories. Each missing dir is a `warn` — the user may
115
123
  // not need every directory yet (e.g. `research/` is empty until after
@@ -121,14 +129,14 @@ export async function runDoctorChecks(options = {}) {
121
129
  checks.push({
122
130
  id: `workspace:${dir}`,
123
131
  status: "ok",
124
- message: `${dir}/ exists`,
132
+ message: t("cli.doctor.workspaceDirExists", { dir }),
125
133
  });
126
134
  }
127
135
  else {
128
136
  checks.push({
129
137
  id: `workspace:${dir}`,
130
138
  status: "warn",
131
- message: `${dir}/ missing — run \`radar init\` to scaffold the workspace`,
139
+ message: t("cli.doctor.workspaceDirMissing", { dir }),
132
140
  });
133
141
  }
134
142
  }
@@ -137,19 +145,19 @@ export async function runDoctorChecks(options = {}) {
137
145
  // because `radar` itself fails on every invocation when the config
138
146
  // parses but mismatches the schema — see `core/config.ts#loadRadarConfig`.
139
147
  try {
140
- await loadRadarConfig(cwd);
148
+ await loadRadarConfig(cwd, t);
141
149
  checks.push({
142
150
  id: "config",
143
151
  status: "ok",
144
- message: "radar.config.yaml valid (or absent — defaults apply)",
152
+ message: t("cli.doctor.configValid"),
145
153
  });
146
154
  }
147
155
  catch (e) {
148
- const message = e instanceof RadarConfigError ? e.message : String(e);
156
+ const reason = e instanceof RadarConfigError ? e.message : String(e);
149
157
  checks.push({
150
158
  id: "config",
151
159
  status: "error",
152
- message: `radar.config.yaml invalid: ${message}`,
160
+ message: t("cli.doctor.configInvalid", { reason }),
153
161
  });
154
162
  }
155
163
  // 3. Agent CLIs. Missing agents are `warn` only — a user who only runs
@@ -162,14 +170,14 @@ export async function runDoctorChecks(options = {}) {
162
170
  checks.push({
163
171
  id: `agent:${agent}`,
164
172
  status: "ok",
165
- message: `${agent}: ${binary} found at ${found}`,
173
+ message: t("cli.doctor.agentFound", { agent, binary, path: found }),
166
174
  });
167
175
  }
168
176
  else {
169
177
  checks.push({
170
178
  id: `agent:${agent}`,
171
179
  status: "warn",
172
- message: `${agent}: ${binary} not found in PATH (install it to use \`radar research --agent ${agent}\`)`,
180
+ message: t("cli.doctor.agentMissing", { agent, binary }),
173
181
  });
174
182
  }
175
183
  }
@@ -192,7 +200,7 @@ export async function runDoctorChecks(options = {}) {
192
200
  checks.push({
193
201
  id: "playwright",
194
202
  status: "ok",
195
- message: "playwright: not required (no html-js sources configured)",
203
+ message: t("cli.doctor.playwrightNotRequired"),
196
204
  });
197
205
  }
198
206
  else {
@@ -201,21 +209,28 @@ export async function runDoctorChecks(options = {}) {
201
209
  checks.push({
202
210
  id: "playwright",
203
211
  status: "ok",
204
- message: `playwright: ok chromium at ${probe.executablePath}`,
212
+ message: t("cli.doctor.playwrightOk", { path: probe.executablePath }),
205
213
  });
206
214
  }
207
215
  else if (probe.status === "module-missing") {
208
216
  checks.push({
209
217
  id: "playwright",
210
218
  status: "error",
211
- message: `playwright: module not installed (required by html-js sources: ${htmlJsSources.join(", ")})\n ${PLAYWRIGHT_MODULE_MISSING_HINT}`,
219
+ message: t("cli.doctor.playwrightModuleMissing", {
220
+ sources: htmlJsSources.join(", "),
221
+ hint: PLAYWRIGHT_MODULE_MISSING_HINT,
222
+ }),
212
223
  });
213
224
  }
214
225
  else {
215
226
  checks.push({
216
227
  id: "playwright",
217
228
  status: "error",
218
- message: `playwright: chromium missing at '${probe.executablePath}' (required by html-js sources: ${htmlJsSources.join(", ")})\n ${CHROMIUM_MISSING_HINT}`,
229
+ message: t("cli.doctor.playwrightChromiumMissing", {
230
+ path: probe.executablePath,
231
+ sources: htmlJsSources.join(", "),
232
+ hint: CHROMIUM_MISSING_HINT,
233
+ }),
219
234
  });
220
235
  }
221
236
  }
@@ -243,14 +258,14 @@ export async function runDoctorChecks(options = {}) {
243
258
  checks.push({
244
259
  id: "proxy:env",
245
260
  status: "warn",
246
- message: `proxy: detected via $${proxyDetection.source}=${masked} (Node --use-env-proxy ignores ALL_PROXY; set HTTPS_PROXY or HTTP_PROXY instead)`,
261
+ message: t("cli.doctor.proxyEnvAllProxyOnly", { source: proxyDetection.source, masked }),
247
262
  });
248
263
  }
249
264
  else {
250
265
  checks.push({
251
266
  id: "proxy:env",
252
267
  status: "ok",
253
- message: `proxy: detected via $${proxyDetection.source}=${masked}`,
268
+ message: t("cli.doctor.proxyEnvDetected", { source: proxyDetection.source, masked }),
254
269
  });
255
270
  }
256
271
  }
@@ -258,14 +273,14 @@ export async function runDoctorChecks(options = {}) {
258
273
  checks.push({
259
274
  id: "proxy:env",
260
275
  status: "ok",
261
- message: "proxy: no proxy env var set (HTTPS_PROXY / HTTP_PROXY / ALL_PROXY)",
276
+ message: t("cli.doctor.proxyEnvNone"),
262
277
  });
263
278
  }
264
279
  if (env.NODE_USE_ENV_PROXY === "1") {
265
280
  checks.push({
266
281
  id: "proxy:active",
267
282
  status: "ok",
268
- message: "proxy: NODE_USE_ENV_PROXY active (auto-applied by radar)",
283
+ message: t("cli.doctor.proxyActive"),
269
284
  });
270
285
  }
271
286
  else if (proxyDetection && !proxyDetection.allProxyOnly) {
@@ -277,14 +292,14 @@ export async function runDoctorChecks(options = {}) {
277
292
  checks.push({
278
293
  id: "proxy:active",
279
294
  status: "warn",
280
- message: "proxy: NODE_USE_ENV_PROXY not set; if fetch ignores HTTPS_PROXY, re-run radar via the bin (not direct import)",
295
+ message: t("cli.doctor.proxyActiveMissing"),
281
296
  });
282
297
  }
283
298
  else {
284
299
  checks.push({
285
300
  id: "proxy:active",
286
301
  status: "ok",
287
- message: "proxy: NODE_USE_ENV_PROXY not required (no proxy detected)",
302
+ message: t("cli.doctor.proxyActiveNotRequired"),
288
303
  });
289
304
  }
290
305
  const caBundle = env.NODE_EXTRA_CA_CERTS;
@@ -292,35 +307,35 @@ export async function runDoctorChecks(options = {}) {
292
307
  checks.push({
293
308
  id: "tls:ca",
294
309
  status: "ok",
295
- message: `tls: NODE_EXTRA_CA_CERTS=${caBundle}`,
310
+ message: t("cli.doctor.tlsCaSet", { path: caBundle }),
296
311
  });
297
312
  }
298
313
  else {
299
314
  checks.push({
300
315
  id: "tls:ca",
301
316
  status: "ok",
302
- message: "tls: NODE_EXTRA_CA_CERTS not set (TLS-intercepting proxies may fail)",
317
+ message: t("cli.doctor.tlsCaUnset"),
303
318
  });
304
319
  }
305
320
  if (options.noProxyCheck) {
306
321
  checks.push({
307
322
  id: "proxy:healthcheck",
308
323
  status: "ok",
309
- message: "proxy healthcheck: skipped (--no-proxy-check)",
324
+ message: t("cli.doctor.healthcheckSkippedFlag"),
310
325
  });
311
326
  }
312
327
  else if (!proxyDetection) {
313
328
  checks.push({
314
329
  id: "proxy:healthcheck",
315
330
  status: "ok",
316
- message: "proxy healthcheck: skipped (no proxy detected)",
331
+ message: t("cli.doctor.healthcheckSkippedNoProxy"),
317
332
  });
318
333
  }
319
334
  else {
320
335
  const result = await runProxyHealthcheck({
321
336
  fetchImpl: options.fetchImpl,
322
337
  nowImpl: options.nowImpl,
323
- });
338
+ }, t);
324
339
  checks.push(result);
325
340
  }
326
341
  const summary = checks.reduce((acc, c) => {
@@ -343,7 +358,7 @@ export async function runDoctorChecks(options = {}) {
343
358
  * - TLS-intercept errors → error (hint NODE_EXTRA_CA_CERTS)
344
359
  * - ECONNREFUSED / ENOTFOUND / abort timeout → error (proxy unreachable)
345
360
  */
346
- async function runProxyHealthcheck(opts) {
361
+ async function runProxyHealthcheck(opts, t) {
347
362
  const fetchImpl = opts.fetchImpl ?? fetch;
348
363
  const nowImpl = opts.nowImpl ?? (() => performance.now());
349
364
  const controller = new AbortController();
@@ -361,25 +376,33 @@ async function runProxyHealthcheck(opts) {
361
376
  return {
362
377
  id: "proxy:healthcheck",
363
378
  status: "warn",
364
- message: `proxy healthcheck: 407 Proxy Authentication Required from ${PROXY_HEALTHCHECK_URL} (check userinfo in $HTTPS_PROXY)`,
379
+ message: t("cli.doctor.healthcheck407", { url: PROXY_HEALTHCHECK_URL }),
365
380
  };
366
381
  }
367
382
  if (res.status >= 200 && res.status < 300) {
368
383
  return {
369
384
  id: "proxy:healthcheck",
370
385
  status: "ok",
371
- message: `proxy healthcheck: ok (${res.status} ${res.statusText || "OK"} from api.github.com in ${elapsed}ms)`,
386
+ message: t("cli.doctor.healthcheckOk", {
387
+ status: res.status,
388
+ statusText: res.statusText || "OK",
389
+ elapsed,
390
+ }),
372
391
  };
373
392
  }
374
393
  return {
375
394
  id: "proxy:healthcheck",
376
395
  status: "warn",
377
- message: `proxy healthcheck: ${res.status} ${res.statusText || ""} from api.github.com in ${elapsed}ms`.trimEnd(),
396
+ message: t("cli.doctor.healthcheckOther", {
397
+ status: res.status,
398
+ statusText: res.statusText || "",
399
+ elapsed,
400
+ }),
378
401
  };
379
402
  }
380
403
  catch (err) {
381
404
  const elapsed = Math.round(nowImpl() - start);
382
- return classifyProxyError(err, elapsed);
405
+ return classifyProxyError(err, elapsed, t);
383
406
  }
384
407
  finally {
385
408
  clearTimeout(timeout);
@@ -392,12 +415,12 @@ async function runProxyHealthcheck(opts) {
392
415
  * text as a last-resort heuristic. Unknown errors fall through to a generic
393
416
  * "healthcheck failed" line.
394
417
  */
395
- function classifyProxyError(err, elapsedMs) {
418
+ function classifyProxyError(err, elapsedMs, t) {
396
419
  if (err instanceof Error && err.name === "AbortError") {
397
420
  return {
398
421
  id: "proxy:healthcheck",
399
422
  status: "error",
400
- message: `proxy healthcheck: timeout after ${elapsedMs}ms (proxy may be unreachable; verify $HTTPS_PROXY host:port)`,
423
+ message: t("cli.doctor.healthcheckTimeout", { elapsed: elapsedMs }),
401
424
  };
402
425
  }
403
426
  // Node's fetch wraps the underlying network error inside `cause`. We unwrap
@@ -409,28 +432,28 @@ function classifyProxyError(err, elapsedMs) {
409
432
  return {
410
433
  id: "proxy:healthcheck",
411
434
  status: "error",
412
- message: `proxy healthcheck: TLS error (${code}). Set NODE_EXTRA_CA_CERTS=/path/to/corp-ca.pem to trust your proxy's intercepting CA.`,
435
+ message: t("cli.doctor.healthcheckTls", { code }),
413
436
  };
414
437
  }
415
438
  if (code === "ECONNREFUSED") {
416
439
  return {
417
440
  id: "proxy:healthcheck",
418
441
  status: "error",
419
- message: `proxy healthcheck: connection refused. Verify the proxy host:port in $HTTPS_PROXY is reachable.`,
442
+ message: t("cli.doctor.healthcheckRefused"),
420
443
  };
421
444
  }
422
445
  if (code === "ENOTFOUND" || code === "EAI_AGAIN") {
423
446
  return {
424
447
  id: "proxy:healthcheck",
425
448
  status: "error",
426
- message: `proxy healthcheck: DNS lookup failed (${code}). The proxy host in $HTTPS_PROXY can't be resolved.`,
449
+ message: t("cli.doctor.healthcheckDns", { code }),
427
450
  };
428
451
  }
429
452
  if (code === "ECONNRESET" || code === "ETIMEDOUT") {
430
453
  return {
431
454
  id: "proxy:healthcheck",
432
455
  status: "error",
433
- message: `proxy healthcheck: connection ${code === "ETIMEDOUT" ? "timed out" : "reset"} (${code}).`,
456
+ message: t("cli.doctor.healthcheckResetTimeout", { code }),
434
457
  };
435
458
  }
436
459
  }
@@ -438,7 +461,7 @@ function classifyProxyError(err, elapsedMs) {
438
461
  return {
439
462
  id: "proxy:healthcheck",
440
463
  status: "error",
441
- message: `proxy healthcheck: failed — ${message}`,
464
+ message: t("cli.doctor.healthcheckFailed", { reason: message }),
442
465
  };
443
466
  }
444
467
  /**
@@ -482,27 +505,8 @@ function parseDoctorArgs(args) {
482
505
  }
483
506
  return out;
484
507
  }
485
- function printDoctorHelp(log) {
486
- log("Usage: radar doctor [--no-proxy-check]");
487
- log("");
488
- log("Diagnose the workspace and report dependency / configuration health.");
489
- log("");
490
- log("Checks performed:");
491
- log(" - Workspace directories (sources/, items/, state/, research/, templates/)");
492
- log(" - radar.config.yaml schema validity");
493
- log(" - Agent CLI availability (claude / codex / gemini / copilot)");
494
- log(" - Playwright + Chromium install (only if html-js sources configured)");
495
- log(" - Proxy env vars (HTTPS_PROXY / HTTP_PROXY / ALL_PROXY) with credential masking");
496
- log(" - NODE_USE_ENV_PROXY status (engaged when radar self-respawned for proxy)");
497
- log(" - NODE_EXTRA_CA_CERTS status (required for TLS-intercepting proxies)");
498
- log(" - Live proxy healthcheck (HTTPS request to api.github.com)");
499
- log("");
500
- log("Options:");
501
- log(" --no-proxy-check Skip the live proxy healthcheck (offline-friendly)");
502
- log("");
503
- log("Exit codes:");
504
- log(" 0 all ok (warnings may appear, but no errors)");
505
- log(" 1 one or more error-level checks failed");
508
+ function printDoctorHelp(t, log) {
509
+ log(t("cli.doctor.help"));
506
510
  }
507
511
  /**
508
512
  * Implementation of `radar doctor`.
@@ -512,25 +516,47 @@ function printDoctorHelp(log) {
512
516
  * any check is `error` so CI / scripts can gate on a clean doctor run.
513
517
  */
514
518
  export async function runDoctor(args, options = {}) {
519
+ const cwd = options.cwd ?? process.cwd();
515
520
  const log = options.io?.log ?? ((m) => console.log(m));
516
521
  const error = options.io?.error ?? ((m) => console.error(m));
522
+ // Strip `--lang <en|ja>` before `parseDoctorArgs` (which rejects unknown
523
+ // flags), then resolve the UI locale for the help text.
524
+ let langState;
525
+ try {
526
+ langState = parseLangFlag(args);
527
+ }
528
+ catch (e) {
529
+ if (e instanceof LangFlagError) {
530
+ error(`doctor: ${e.message}`);
531
+ return 2;
532
+ }
533
+ throw e;
534
+ }
535
+ const locale = await resolveWorkspaceLocale({ flag: langState.flag, cwd, warn: error });
536
+ // Localize zod's built-in messages so the `radar.config.yaml` schema-violation
537
+ // issue bodies (rendered inside `cli.doctor.configInvalid`) follow the UI
538
+ // locale alongside the wrapping preamble (#312).
539
+ applyZodLocale(locale);
540
+ const t = createTranslator(locale);
517
541
  let parsed;
518
542
  try {
519
- parsed = parseDoctorArgs(args);
543
+ parsed = parseDoctorArgs(langState.rest);
520
544
  }
521
545
  catch (e) {
522
546
  error(`doctor: ${e instanceof Error ? e.message : String(e)}`);
523
547
  return 2;
524
548
  }
525
549
  if (parsed.help) {
526
- printDoctorHelp(log);
550
+ printDoctorHelp(t, log);
527
551
  return 0;
528
552
  }
529
553
  // CLI flag wins over the option seam. Tests typically pass `noProxyCheck`
530
554
  // through `options`; users pass `--no-proxy-check`. OR semantics mean either
531
- // path can opt out without the other interfering.
555
+ // path can opt out without the other interfering. Pass the already-resolved
556
+ // translator so locale resolution happens exactly once (#312).
532
557
  const report = await runDoctorChecks({
533
558
  ...options,
559
+ t,
534
560
  noProxyCheck: options.noProxyCheck ?? parsed.noProxyCheck,
535
561
  });
536
562
  for (const check of report.checks) {
@@ -538,12 +564,17 @@ export async function runDoctor(args, options = {}) {
538
564
  log(`${tag} ${check.message}`);
539
565
  }
540
566
  log("");
541
- log(`doctor: ${report.summary.ok} ok, ${report.summary.warn} warn, ${report.summary.error} error`);
567
+ log(t("cli.doctor.summary", {
568
+ ok: report.summary.ok,
569
+ warn: report.summary.warn,
570
+ error: report.summary.error,
571
+ }));
542
572
  return report.summary.error > 0 ? 1 : 0;
543
573
  }
544
574
  export const doctorCommand = {
545
575
  name: "doctor",
546
576
  summary: "Diagnose workspace, agent CLIs, and html-js Playwright install",
577
+ summaryKey: "cli.summary.doctor",
547
578
  run: (args) => runDoctor(args),
548
579
  };
549
580
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,42 @@
1
+ import { type MessageKey, type Translator } from "../i18n/index.js";
1
2
  export interface Command {
2
3
  name: string;
4
+ /**
5
+ * Plain-English one-liner. Retained as the canonical source text and the
6
+ * fallback when no {@link summaryKey} is set; localized output goes through
7
+ * {@link summaryKey} instead (#311).
8
+ */
3
9
  summary: string;
10
+ /**
11
+ * i18n key resolving to the localized one-line summary shown in
12
+ * `radar --help`. When present the dispatcher renders `t(summaryKey)`;
13
+ * otherwise it falls back to the plain {@link summary} (#311).
14
+ */
15
+ summaryKey?: MessageKey;
4
16
  run: (args: string[]) => Promise<number>;
5
17
  }
6
- export declare function run(argv: string[]): Promise<void>;
18
+ /**
19
+ * Output sinks for the top-level CLI dispatcher. Mirrors the per-command
20
+ * `options.io` seam (e.g. {@link import("./watch.js").WatchIO}) so tests can
21
+ * capture global help / version / error output without spying on `console`.
22
+ */
23
+ export interface RunIO {
24
+ log?: (message: string) => void;
25
+ error?: (message: string) => void;
26
+ }
27
+ export interface RunOptions {
28
+ /** Output sinks; default to `console.log` / `console.error`. */
29
+ io?: RunIO;
30
+ /** Environment bag for `RADAR_LANG`; defaults to `process.env`. */
31
+ env?: NodeJS.ProcessEnv;
32
+ /**
33
+ * Test seam: inject a translator (and implied locale) directly, bypassing
34
+ * `--lang` / `RADAR_LANG` resolution. When omitted, `run` resolves the
35
+ * locale from the (config-independent) flag/env layers and builds its own
36
+ * translator — the dispatcher reads no config, so `config.locale` does not
37
+ * participate here.
38
+ */
39
+ t?: Translator;
40
+ }
41
+ export declare function run(argv: string[], options?: RunOptions): Promise<void>;
7
42
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAyCD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAgBnG,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;;OAMG;IACH,CAAC,CAAC,EAAE,UAAU,CAAC;CAChB;AA6FD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDjF"}
package/dist/cli/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
+ import { resolveLocale } from "../core/locale.js";
5
+ import { createTranslator } from "../i18n/index.js";
6
+ import { readLangEnv } from "./_locale.js";
4
7
  import { dismissCommand } from "./dismiss.js";
5
8
  import { doctorCommand } from "./doctor.js";
6
9
  import { initCommand } from "./init.js";
@@ -36,37 +39,95 @@ const commands = [
36
39
  // tsc preserves src/ → dist/ structure.
37
40
  const PKG_PATH = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
38
41
  const VERSION = JSON.parse(readFileSync(PKG_PATH, "utf8")).version;
39
- function printHelp() {
40
- console.log("FeedRadar Multi-agent CLI for blog/release feed research");
41
- console.log("");
42
- console.log("Usage: radar <command> [options]");
43
- console.log("");
44
- console.log("Commands:");
42
+ /**
43
+ * Walk the leading args, consuming only a global `--lang <value>` /
44
+ * `--lang=<value>` (the dispatcher's own flag). The first arg that is not such
45
+ * a leading `--lang` is the command token (or a leading `-h`/`-v`); everything
46
+ * after it is forwarded to the subcommand untouched — including any *later*
47
+ * `--lang`, which is the subcommand's to resolve.
48
+ *
49
+ * A dangling `--lang` with no value is a usage error (exit 2), matching
50
+ * {@link import("./_locale.js").LangFlagError}.
51
+ */
52
+ function splitAtCommand(argv) {
53
+ let flag;
54
+ let i = 0;
55
+ for (; i < argv.length; i++) {
56
+ const arg = argv[i];
57
+ if (arg === "--lang") {
58
+ const next = argv[i + 1];
59
+ if (next === undefined) {
60
+ return { kind: "error", message: "--lang requires a value (en|ja)" };
61
+ }
62
+ flag = next;
63
+ i++; // consume the value token
64
+ continue;
65
+ }
66
+ if (arg?.startsWith("--lang=")) {
67
+ flag = arg.slice("--lang=".length);
68
+ continue;
69
+ }
70
+ break; // first non-preamble token: the command (or -h/-v)
71
+ }
72
+ const command = argv[i];
73
+ return { kind: "ok", preamble: { flag }, command, commandArgs: argv.slice(i + 1) };
74
+ }
75
+ function printHelp(t, log) {
76
+ log(t("cli.help.tagline"));
77
+ log("");
78
+ log(t("cli.help.usage"));
79
+ log("");
80
+ log(t("cli.help.commandsHeading"));
45
81
  for (const c of commands) {
46
- console.log(` ${c.name.padEnd(12)} ${c.summary}`);
82
+ const summary = c.summaryKey ? t(c.summaryKey) : c.summary;
83
+ log(` ${c.name.padEnd(12)} ${summary}`);
47
84
  }
48
- console.log("");
49
- console.log("Options:");
50
- console.log(" -h, --help Show this help");
51
- console.log(" -v, --version Show version");
85
+ log("");
86
+ log(t("cli.help.optionsHeading"));
87
+ log(` -h, --help ${t("cli.help.optionHelp")}`);
88
+ log(` -v, --version ${t("cli.help.optionVersion")}`);
89
+ log(` --lang <en|ja> ${t("cli.help.optionLang")}`);
52
90
  }
53
- export async function run(argv) {
54
- const [first, ...rest] = argv;
91
+ export async function run(argv, options = {}) {
92
+ const log = options.io?.log ?? ((m) => console.log(m));
93
+ const error = options.io?.error ?? ((m) => console.error(m));
94
+ const env = options.env ?? process.env;
95
+ // Split argv at the command token: everything *before* it is the dispatcher's
96
+ // own preamble (where a global `--lang` / `-h` / `-v` may sit), everything
97
+ // from the command token onward is forwarded verbatim to the subcommand.
98
+ //
99
+ // The command token is the first arg that is not a `--lang` flag (or its
100
+ // value) and not a leading help/version flag. Splitting this way means a
101
+ // `--lang` placed *after* the command (`radar watch --lang ja run`) is left
102
+ // for the subcommand to resolve its own (config-aware) locale, while the
103
+ // dispatcher still honors a `--lang` placed before the command for its own
104
+ // global help / version / unknown-command output.
105
+ const split = splitAtCommand(argv);
106
+ if (split.kind === "error") {
107
+ error(`radar: ${split.message}`);
108
+ process.exit(2);
109
+ }
110
+ const { preamble, command: first, commandArgs } = split;
111
+ // Resolve the dispatcher's locale from the preamble's `--lang` (+ env). The
112
+ // dispatcher reads no config (config is cwd-dependent and resolved inside each
113
+ // command), so only the flag/env layers feed resolution here.
114
+ const locale = resolveLocale({ flag: preamble.flag, env: readLangEnv(env) }, { warn: error });
115
+ const t = options.t ?? createTranslator(locale);
55
116
  if (!first || first === "-h" || first === "--help" || first === "help") {
56
- printHelp();
117
+ printHelp(t, log);
57
118
  return;
58
119
  }
59
120
  if (first === "-v" || first === "--version" || first === "version") {
60
- console.log(VERSION);
121
+ log(VERSION);
61
122
  return;
62
123
  }
63
124
  const command = commands.find((c) => c.name === first);
64
125
  if (!command) {
65
- console.error(`radar: unknown command '${first}'`);
66
- console.error("Run 'radar --help' for available commands.");
126
+ error(t("cli.error.unknownCommand", { command: first }));
127
+ error(t("cli.error.unknownCommandHint"));
67
128
  process.exit(2);
68
129
  }
69
- const code = await command.run(rest);
130
+ const code = await command.run(commandArgs);
70
131
  if (code !== 0) {
71
132
  process.exit(code);
72
133
  }