@ozzylabs/feedradar 0.1.3 → 0.1.5
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.
- package/README.ja.md +31 -6
- package/README.md +31 -6
- package/dist/agents/claude-code.d.ts +12 -1
- package/dist/agents/claude-code.d.ts.map +1 -1
- package/dist/agents/claude-code.js +9 -5
- package/dist/agents/claude-code.js.map +1 -1
- package/dist/agents/codex-cli.d.ts +7 -1
- package/dist/agents/codex-cli.d.ts.map +1 -1
- package/dist/agents/codex-cli.js +9 -5
- package/dist/agents/codex-cli.js.map +1 -1
- package/dist/agents/copilot.d.ts +7 -1
- package/dist/agents/copilot.d.ts.map +1 -1
- package/dist/agents/copilot.js +9 -5
- package/dist/agents/copilot.js.map +1 -1
- package/dist/agents/gemini-cli.d.ts +7 -1
- package/dist/agents/gemini-cli.d.ts.map +1 -1
- package/dist/agents/gemini-cli.js +9 -5
- package/dist/agents/gemini-cli.js.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/types.d.ts +33 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/cli/_progress.d.ts +138 -0
- package/dist/cli/_progress.d.ts.map +1 -0
- package/dist/cli/_progress.js +176 -0
- package/dist/cli/_progress.js.map +1 -0
- package/dist/cli/doctor.d.ts +20 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +291 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/research.d.ts +18 -20
- package/dist/cli/research.d.ts.map +1 -1
- package/dist/cli/research.js +318 -203
- package/dist/cli/research.js.map +1 -1
- package/dist/cli/respawn.d.ts +53 -0
- package/dist/cli/respawn.d.ts.map +1 -0
- package/dist/cli/respawn.js +120 -0
- package/dist/cli/respawn.js.map +1 -0
- package/dist/cli/review.d.ts +7 -0
- package/dist/cli/review.d.ts.map +1 -1
- package/dist/cli/review.js +46 -1
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/source.d.ts +23 -2
- package/dist/cli/source.d.ts.map +1 -1
- package/dist/cli/source.js +425 -7
- package/dist/cli/source.js.map +1 -1
- package/dist/cli/update.d.ts +7 -0
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +41 -1
- package/dist/cli/update.js.map +1 -1
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +65 -3
- package/dist/cli/watch.js.map +1 -1
- package/dist/cli/workflow/generate-combined.d.ts +100 -0
- package/dist/cli/workflow/generate-combined.d.ts.map +1 -0
- package/dist/cli/workflow/generate-combined.js +387 -0
- package/dist/cli/workflow/generate-combined.js.map +1 -0
- package/dist/cli/workflow/generate-watch.d.ts +142 -0
- package/dist/cli/workflow/generate-watch.d.ts.map +1 -0
- package/dist/cli/workflow/generate-watch.js +338 -0
- package/dist/cli/workflow/generate-watch.js.map +1 -0
- package/dist/cli/workflow.d.ts +29 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +66 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/core/feeds/_fetch.d.ts +103 -0
- package/dist/core/feeds/_fetch.d.ts.map +1 -0
- package/dist/core/feeds/_fetch.js +364 -0
- package/dist/core/feeds/_fetch.js.map +1 -0
- package/dist/core/feeds/_jsonpath.d.ts +57 -0
- package/dist/core/feeds/_jsonpath.d.ts.map +1 -0
- package/dist/core/feeds/_jsonpath.js +207 -0
- package/dist/core/feeds/_jsonpath.js.map +1 -0
- package/dist/core/feeds/github-api.d.ts.map +1 -1
- package/dist/core/feeds/github-api.js +2 -1
- package/dist/core/feeds/github-api.js.map +1 -1
- package/dist/core/feeds/html-js.d.ts +29 -0
- package/dist/core/feeds/html-js.d.ts.map +1 -1
- package/dist/core/feeds/html-js.js +86 -2
- package/dist/core/feeds/html-js.js.map +1 -1
- package/dist/core/feeds/html.d.ts.map +1 -1
- package/dist/core/feeds/html.js +2 -1
- package/dist/core/feeds/html.js.map +1 -1
- package/dist/core/feeds/index.d.ts +1 -1
- package/dist/core/feeds/index.d.ts.map +1 -1
- package/dist/core/feeds/index.js +4 -0
- package/dist/core/feeds/index.js.map +1 -1
- package/dist/core/feeds/json-api.d.ts +3 -0
- package/dist/core/feeds/json-api.d.ts.map +1 -0
- package/dist/core/feeds/json-api.js +723 -0
- package/dist/core/feeds/json-api.js.map +1 -0
- package/dist/core/feeds/json-feed.d.ts +11 -0
- package/dist/core/feeds/json-feed.d.ts.map +1 -0
- package/dist/core/feeds/json-feed.js +242 -0
- package/dist/core/feeds/json-feed.js.map +1 -0
- package/dist/core/feeds/npm-registry.d.ts.map +1 -1
- package/dist/core/feeds/npm-registry.js +2 -1
- package/dist/core/feeds/npm-registry.js.map +1 -1
- package/dist/core/feeds/rss.d.ts.map +1 -1
- package/dist/core/feeds/rss.js +2 -1
- package/dist/core/feeds/rss.js.map +1 -1
- package/dist/core/feeds/types.d.ts +123 -0
- package/dist/core/feeds/types.d.ts.map +1 -1
- package/dist/core/progress.d.ts +101 -0
- package/dist/core/progress.d.ts.map +1 -0
- package/dist/core/progress.js +212 -0
- package/dist/core/progress.js.map +1 -0
- package/dist/core/proxy.d.ts +87 -0
- package/dist/core/proxy.d.ts.map +1 -0
- package/dist/core/proxy.js +146 -0
- package/dist/core/proxy.js.map +1 -0
- package/dist/core/recipes.d.ts +138 -0
- package/dist/core/recipes.d.ts.map +1 -0
- package/dist/core/recipes.js +238 -0
- package/dist/core/recipes.js.map +1 -0
- package/dist/core/watcher.d.ts +61 -1
- package/dist/core/watcher.d.ts.map +1 -1
- package/dist/core/watcher.js +99 -2
- package/dist/core/watcher.js.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/dist/recipes/aws-whats-new.yaml +61 -0
- package/dist/recipes/dev-to.yaml +40 -0
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +1 -0
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/recipe.d.ts +115 -0
- package/dist/schemas/recipe.d.ts.map +1 -0
- package/dist/schemas/recipe.js +54 -0
- package/dist/schemas/recipe.js.map +1 -0
- package/dist/schemas/source.d.ts +130 -0
- package/dist/schemas/source.d.ts.map +1 -1
- package/dist/schemas/source.js +130 -0
- package/dist/schemas/source.js.map +1 -1
- package/dist/templates/agents/AGENTS.md +31 -3
- package/dist/templates/feedradar.md +23 -8
- package/dist/templates/workflows/combined.template.yaml.tmpl +110 -0
- package/dist/templates/workflows/watch.template.yaml.tmpl +103 -0
- package/dist/templates/workflows/watch.yaml +5 -1
- package/package.json +2 -3
package/dist/cli/doctor.js
CHANGED
|
@@ -2,6 +2,7 @@ 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
4
|
import { CHROMIUM_MISSING_HINT, PLAYWRIGHT_MODULE_MISSING_HINT, probePlaywright, } from "../core/playwright-check.js";
|
|
5
|
+
import { detectProxyUrl, maskProxyUrl } from "../core/proxy.js";
|
|
5
6
|
import { loadSources } from "../core/watcher.js";
|
|
6
7
|
/**
|
|
7
8
|
* Agent CLIs the `doctor` command probes for. Order matches the AgentId enum
|
|
@@ -24,6 +25,38 @@ const AGENT_BINARIES = [
|
|
|
24
25
|
* back to `radar init` rather than a cryptic ENOENT later.
|
|
25
26
|
*/
|
|
26
27
|
const WORKSPACE_DIRS = ["sources", "items", "state", "research", "templates"];
|
|
28
|
+
/**
|
|
29
|
+
* Public probe URL for the proxy healthcheck. api.github.com is reachable
|
|
30
|
+
* from virtually every corporate proxy allowlist (since `gh` / `git` / npm
|
|
31
|
+
* all depend on it), so a failure here is a strong signal that the proxy
|
|
32
|
+
* config itself is broken rather than just missing this particular host.
|
|
33
|
+
*
|
|
34
|
+
* The check is informational only; doctor never escalates a failed
|
|
35
|
+
* healthcheck to `error` because (a) the user might be running doctor
|
|
36
|
+
* specifically because the network is down, and (b) a 407 from the proxy is
|
|
37
|
+
* still a meaningful "proxy reachable, auth missing" state we want to
|
|
38
|
+
* surface as a hint rather than block on.
|
|
39
|
+
*/
|
|
40
|
+
const PROXY_HEALTHCHECK_URL = "https://api.github.com/zen";
|
|
41
|
+
/**
|
|
42
|
+
* Total upper bound on the healthcheck round-trip. Short enough that
|
|
43
|
+
* `radar doctor` stays responsive on a broken proxy, long enough that a
|
|
44
|
+
* slow corporate proxy still gets a chance to respond.
|
|
45
|
+
*/
|
|
46
|
+
const PROXY_HEALTHCHECK_TIMEOUT_MS = 5000;
|
|
47
|
+
/**
|
|
48
|
+
* Node error codes that signal a TLS-intercepting proxy (e.g. Zscaler,
|
|
49
|
+
* Netskope) replaced the leaf cert with its own CA. The fix is always
|
|
50
|
+
* `NODE_EXTRA_CA_CERTS=/path/to/corp-ca.pem`, so we hint at that variable
|
|
51
|
+
* in the doctor output.
|
|
52
|
+
*/
|
|
53
|
+
const TLS_INTERCEPT_CODES = new Set([
|
|
54
|
+
"UNABLE_TO_VERIFY_LEAF_SIGNATURE",
|
|
55
|
+
"SELF_SIGNED_CERT_IN_CHAIN",
|
|
56
|
+
"DEPTH_ZERO_SELF_SIGNED_CERT",
|
|
57
|
+
"CERT_HAS_EXPIRED",
|
|
58
|
+
"ERR_TLS_CERT_ALTNAME_INVALID",
|
|
59
|
+
]);
|
|
27
60
|
async function pathExists(p) {
|
|
28
61
|
try {
|
|
29
62
|
await access(p);
|
|
@@ -186,12 +219,251 @@ export async function runDoctorChecks(options = {}) {
|
|
|
186
219
|
});
|
|
187
220
|
}
|
|
188
221
|
}
|
|
222
|
+
// 5. Proxy + TLS environment. Surfaces three signals so users can debug
|
|
223
|
+
// "fetch works on my laptop but not behind the corp proxy" style issues:
|
|
224
|
+
//
|
|
225
|
+
// - `proxy:env` — which env var is providing the proxy URL (and
|
|
226
|
+
// confirms credentials are masked in our output).
|
|
227
|
+
// - `proxy:active` — whether `NODE_USE_ENV_PROXY` is engaged (the
|
|
228
|
+
// self-respawn path sets it; an external invoker
|
|
229
|
+
// that bypassed our entry-point won't).
|
|
230
|
+
// - `tls:ca` — `NODE_EXTRA_CA_CERTS` status. TLS-intercepting
|
|
231
|
+
// proxies require a custom CA bundle, and the
|
|
232
|
+
// symptom (UNABLE_TO_VERIFY_LEAF_SIGNATURE) is
|
|
233
|
+
// opaque enough to justify a dedicated check.
|
|
234
|
+
// - `proxy:healthcheck` — a real HTTPS round-trip via the configured
|
|
235
|
+
// proxy. Skipped when no proxy is detected (no
|
|
236
|
+
// point) or when `--no-proxy-check` is set.
|
|
237
|
+
const proxyDetection = detectProxyUrl(env);
|
|
238
|
+
if (proxyDetection) {
|
|
239
|
+
const masked = maskProxyUrl(proxyDetection.url);
|
|
240
|
+
if (proxyDetection.allProxyOnly) {
|
|
241
|
+
// ALL_PROXY alone won't engage `--use-env-proxy`; downgrade to warn so
|
|
242
|
+
// the user notices and sets HTTPS_PROXY / HTTP_PROXY explicitly.
|
|
243
|
+
checks.push({
|
|
244
|
+
id: "proxy:env",
|
|
245
|
+
status: "warn",
|
|
246
|
+
message: `proxy: detected via $${proxyDetection.source}=${masked} (Node --use-env-proxy ignores ALL_PROXY; set HTTPS_PROXY or HTTP_PROXY instead)`,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
checks.push({
|
|
251
|
+
id: "proxy:env",
|
|
252
|
+
status: "ok",
|
|
253
|
+
message: `proxy: detected via $${proxyDetection.source}=${masked}`,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
checks.push({
|
|
259
|
+
id: "proxy:env",
|
|
260
|
+
status: "ok",
|
|
261
|
+
message: "proxy: no proxy env var set (HTTPS_PROXY / HTTP_PROXY / ALL_PROXY)",
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
if (env.NODE_USE_ENV_PROXY === "1") {
|
|
265
|
+
checks.push({
|
|
266
|
+
id: "proxy:active",
|
|
267
|
+
status: "ok",
|
|
268
|
+
message: "proxy: NODE_USE_ENV_PROXY active (auto-applied by radar)",
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else if (proxyDetection && !proxyDetection.allProxyOnly) {
|
|
272
|
+
// Proxy is set but the respawn sentinel is missing — usually means the
|
|
273
|
+
// user invoked radar via a path that bypasses bin/index.js (e.g. a script
|
|
274
|
+
// that imports the modules directly). Warn rather than error because
|
|
275
|
+
// fetch may still work via other paths (e.g. user set `--use-env-proxy`
|
|
276
|
+
// in NODE_OPTIONS themselves).
|
|
277
|
+
checks.push({
|
|
278
|
+
id: "proxy:active",
|
|
279
|
+
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)",
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
checks.push({
|
|
285
|
+
id: "proxy:active",
|
|
286
|
+
status: "ok",
|
|
287
|
+
message: "proxy: NODE_USE_ENV_PROXY not required (no proxy detected)",
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const caBundle = env.NODE_EXTRA_CA_CERTS;
|
|
291
|
+
if (caBundle && caBundle.length > 0) {
|
|
292
|
+
checks.push({
|
|
293
|
+
id: "tls:ca",
|
|
294
|
+
status: "ok",
|
|
295
|
+
message: `tls: NODE_EXTRA_CA_CERTS=${caBundle}`,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
checks.push({
|
|
300
|
+
id: "tls:ca",
|
|
301
|
+
status: "ok",
|
|
302
|
+
message: "tls: NODE_EXTRA_CA_CERTS not set (TLS-intercepting proxies may fail)",
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (options.noProxyCheck) {
|
|
306
|
+
checks.push({
|
|
307
|
+
id: "proxy:healthcheck",
|
|
308
|
+
status: "ok",
|
|
309
|
+
message: "proxy healthcheck: skipped (--no-proxy-check)",
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
else if (!proxyDetection) {
|
|
313
|
+
checks.push({
|
|
314
|
+
id: "proxy:healthcheck",
|
|
315
|
+
status: "ok",
|
|
316
|
+
message: "proxy healthcheck: skipped (no proxy detected)",
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
const result = await runProxyHealthcheck({
|
|
321
|
+
fetchImpl: options.fetchImpl,
|
|
322
|
+
nowImpl: options.nowImpl,
|
|
323
|
+
});
|
|
324
|
+
checks.push(result);
|
|
325
|
+
}
|
|
189
326
|
const summary = checks.reduce((acc, c) => {
|
|
190
327
|
acc[c.status]++;
|
|
191
328
|
return acc;
|
|
192
329
|
}, { ok: 0, warn: 0, error: 0 });
|
|
193
330
|
return { checks, summary };
|
|
194
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* Single live HTTPS request through whatever proxy `fetch` picks up. We
|
|
334
|
+
* deliberately do **not** thread a custom `dispatcher` through fetch here —
|
|
335
|
+
* the goal is to mirror exactly what the rest of radar (and any of the
|
|
336
|
+
* spawned agent CLIs) will experience. If the user's proxy is broken,
|
|
337
|
+
* doctor's report should match.
|
|
338
|
+
*
|
|
339
|
+
* Branches:
|
|
340
|
+
* - 2xx response → ok (records status code + latency)
|
|
341
|
+
* - 407 Proxy Auth Req → warn (credentials missing/wrong; not radar's fault)
|
|
342
|
+
* - other 4xx/5xx → warn (proxy reachable but endpoint rejected)
|
|
343
|
+
* - TLS-intercept errors → error (hint NODE_EXTRA_CA_CERTS)
|
|
344
|
+
* - ECONNREFUSED / ENOTFOUND / abort timeout → error (proxy unreachable)
|
|
345
|
+
*/
|
|
346
|
+
async function runProxyHealthcheck(opts) {
|
|
347
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
348
|
+
const nowImpl = opts.nowImpl ?? (() => performance.now());
|
|
349
|
+
const controller = new AbortController();
|
|
350
|
+
const timeout = setTimeout(() => controller.abort(), PROXY_HEALTHCHECK_TIMEOUT_MS);
|
|
351
|
+
const start = nowImpl();
|
|
352
|
+
try {
|
|
353
|
+
const res = await fetchImpl(PROXY_HEALTHCHECK_URL, {
|
|
354
|
+
method: "GET",
|
|
355
|
+
signal: controller.signal,
|
|
356
|
+
});
|
|
357
|
+
const elapsed = Math.round(nowImpl() - start);
|
|
358
|
+
if (res.status === 407) {
|
|
359
|
+
// 407 from the proxy itself; auth missing or wrong. We don't escalate to
|
|
360
|
+
// error because radar can't tell the user's intended credential strategy.
|
|
361
|
+
return {
|
|
362
|
+
id: "proxy:healthcheck",
|
|
363
|
+
status: "warn",
|
|
364
|
+
message: `proxy healthcheck: 407 Proxy Authentication Required from ${PROXY_HEALTHCHECK_URL} (check userinfo in $HTTPS_PROXY)`,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
if (res.status >= 200 && res.status < 300) {
|
|
368
|
+
return {
|
|
369
|
+
id: "proxy:healthcheck",
|
|
370
|
+
status: "ok",
|
|
371
|
+
message: `proxy healthcheck: ok (${res.status} ${res.statusText || "OK"} from api.github.com in ${elapsed}ms)`,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
return {
|
|
375
|
+
id: "proxy:healthcheck",
|
|
376
|
+
status: "warn",
|
|
377
|
+
message: `proxy healthcheck: ${res.status} ${res.statusText || ""} from api.github.com in ${elapsed}ms`.trimEnd(),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
const elapsed = Math.round(nowImpl() - start);
|
|
382
|
+
return classifyProxyError(err, elapsed);
|
|
383
|
+
}
|
|
384
|
+
finally {
|
|
385
|
+
clearTimeout(timeout);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Map a thrown fetch error onto a DoctorCheck with an actionable hint. We
|
|
390
|
+
* inspect (a) the abort flag (timeout we control), (b) `error.code` /
|
|
391
|
+
* `error.cause.code` (Node's network error pathway), and (c) the message
|
|
392
|
+
* text as a last-resort heuristic. Unknown errors fall through to a generic
|
|
393
|
+
* "healthcheck failed" line.
|
|
394
|
+
*/
|
|
395
|
+
function classifyProxyError(err, elapsedMs) {
|
|
396
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
397
|
+
return {
|
|
398
|
+
id: "proxy:healthcheck",
|
|
399
|
+
status: "error",
|
|
400
|
+
message: `proxy healthcheck: timeout after ${elapsedMs}ms (proxy may be unreachable; verify $HTTPS_PROXY host:port)`,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
// Node's fetch wraps the underlying network error inside `cause`. We unwrap
|
|
404
|
+
// up to two levels so undici-style nested errors (TLS errors typically sit
|
|
405
|
+
// at `cause.cause`) are still classified.
|
|
406
|
+
const codes = collectErrorCodes(err);
|
|
407
|
+
for (const code of codes) {
|
|
408
|
+
if (TLS_INTERCEPT_CODES.has(code)) {
|
|
409
|
+
return {
|
|
410
|
+
id: "proxy:healthcheck",
|
|
411
|
+
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.`,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
if (code === "ECONNREFUSED") {
|
|
416
|
+
return {
|
|
417
|
+
id: "proxy:healthcheck",
|
|
418
|
+
status: "error",
|
|
419
|
+
message: `proxy healthcheck: connection refused. Verify the proxy host:port in $HTTPS_PROXY is reachable.`,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
if (code === "ENOTFOUND" || code === "EAI_AGAIN") {
|
|
423
|
+
return {
|
|
424
|
+
id: "proxy:healthcheck",
|
|
425
|
+
status: "error",
|
|
426
|
+
message: `proxy healthcheck: DNS lookup failed (${code}). The proxy host in $HTTPS_PROXY can't be resolved.`,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
if (code === "ECONNRESET" || code === "ETIMEDOUT") {
|
|
430
|
+
return {
|
|
431
|
+
id: "proxy:healthcheck",
|
|
432
|
+
status: "error",
|
|
433
|
+
message: `proxy healthcheck: connection ${code === "ETIMEDOUT" ? "timed out" : "reset"} (${code}).`,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
438
|
+
return {
|
|
439
|
+
id: "proxy:healthcheck",
|
|
440
|
+
status: "error",
|
|
441
|
+
message: `proxy healthcheck: failed — ${message}`,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Walk an Error chain (`err.cause` → `err.cause.cause`) and collect any
|
|
446
|
+
* `code` properties along the way. Node's fetch error structure varies by
|
|
447
|
+
* release; treating it as an opaque chain avoids brittle version-pinning.
|
|
448
|
+
*/
|
|
449
|
+
function collectErrorCodes(err) {
|
|
450
|
+
const codes = [];
|
|
451
|
+
let current = err;
|
|
452
|
+
for (let depth = 0; depth < 5 && current; depth++) {
|
|
453
|
+
if (current && typeof current === "object" && "code" in current) {
|
|
454
|
+
const code = current.code;
|
|
455
|
+
if (typeof code === "string")
|
|
456
|
+
codes.push(code);
|
|
457
|
+
}
|
|
458
|
+
if (current && typeof current === "object" && "cause" in current) {
|
|
459
|
+
current = current.cause;
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return codes;
|
|
466
|
+
}
|
|
195
467
|
function parseDoctorArgs(args) {
|
|
196
468
|
const out = {};
|
|
197
469
|
for (const arg of args) {
|
|
@@ -199,6 +471,10 @@ function parseDoctorArgs(args) {
|
|
|
199
471
|
out.help = true;
|
|
200
472
|
continue;
|
|
201
473
|
}
|
|
474
|
+
if (arg === "--no-proxy-check") {
|
|
475
|
+
out.noProxyCheck = true;
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
202
478
|
if (arg.startsWith("--")) {
|
|
203
479
|
throw new Error(`unknown option: ${arg}`);
|
|
204
480
|
}
|
|
@@ -207,7 +483,7 @@ function parseDoctorArgs(args) {
|
|
|
207
483
|
return out;
|
|
208
484
|
}
|
|
209
485
|
function printDoctorHelp(log) {
|
|
210
|
-
log("Usage: radar doctor");
|
|
486
|
+
log("Usage: radar doctor [--no-proxy-check]");
|
|
211
487
|
log("");
|
|
212
488
|
log("Diagnose the workspace and report dependency / configuration health.");
|
|
213
489
|
log("");
|
|
@@ -216,6 +492,13 @@ function printDoctorHelp(log) {
|
|
|
216
492
|
log(" - radar.config.yaml schema validity");
|
|
217
493
|
log(" - Agent CLI availability (claude / codex / gemini / copilot)");
|
|
218
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)");
|
|
219
502
|
log("");
|
|
220
503
|
log("Exit codes:");
|
|
221
504
|
log(" 0 all ok (warnings may appear, but no errors)");
|
|
@@ -243,7 +526,13 @@ export async function runDoctor(args, options = {}) {
|
|
|
243
526
|
printDoctorHelp(log);
|
|
244
527
|
return 0;
|
|
245
528
|
}
|
|
246
|
-
|
|
529
|
+
// CLI flag wins over the option seam. Tests typically pass `noProxyCheck`
|
|
530
|
+
// through `options`; users pass `--no-proxy-check`. OR semantics mean either
|
|
531
|
+
// path can opt out without the other interfering.
|
|
532
|
+
const report = await runDoctorChecks({
|
|
533
|
+
...options,
|
|
534
|
+
noProxyCheck: options.noProxyCheck ?? parsed.noProxyCheck,
|
|
535
|
+
});
|
|
247
536
|
for (const check of report.checks) {
|
|
248
537
|
const tag = check.status === "ok" ? "[ok] " : check.status === "warn" ? "[warn] " : "[error]";
|
|
249
538
|
log(`${tag} ${check.message}`);
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -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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"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAaA,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;AAqCD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvD"}
|
package/dist/cli/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { reviewCommand } from "./review.js";
|
|
|
9
9
|
import { sourceCommand } from "./source.js";
|
|
10
10
|
import { updateCommand } from "./update.js";
|
|
11
11
|
import { watchCommand } from "./watch.js";
|
|
12
|
+
import { workflowCommand } from "./workflow.js";
|
|
12
13
|
const commands = [
|
|
13
14
|
initCommand,
|
|
14
15
|
sourceCommand,
|
|
@@ -18,6 +19,7 @@ const commands = [
|
|
|
18
19
|
reviewCommand,
|
|
19
20
|
updateCommand,
|
|
20
21
|
doctorCommand,
|
|
22
|
+
workflowCommand,
|
|
21
23
|
];
|
|
22
24
|
// Read the installed package's version at runtime so `radar --version`
|
|
23
25
|
// tracks release-please bumps without a parallel source edit. The bin
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQhD,MAAM,QAAQ,GAAc;IAC1B,WAAW;IACX,aAAa;IACb,YAAY;IACZ,eAAe;IACf,cAAc;IACd,aAAa;IACb,aAAa;IACb,aAAa;IACb,eAAe;CAChB,CAAC;AAEF,uEAAuE;AACvE,sEAAsE;AACtE,uEAAuE;AACvE,qEAAqE;AACrE,wCAAwC;AACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC9F,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAyB,CAAC,OAAO,CAAC;AAE5F,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACvE,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
package/dist/cli/research.d.ts
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
import type { ProgressReporter } from "../core/progress.js";
|
|
1
2
|
import type { Command } from "./index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Default hard-cap for `radar research --batch`.
|
|
5
|
+
*
|
|
6
|
+
* ADR-0014 D3a pins the default to 10: 2-10x the empirical detection rate
|
|
7
|
+
* (1-5 items per cron tick) while keeping LLM cost-per-tick bounded
|
|
8
|
+
* (~$0.01/item * 10 ~= $0.1). Generated workflow YAML embeds this same
|
|
9
|
+
* literal via `combined.template.yaml`, but the CLI re-enforces it so the
|
|
10
|
+
* cap also applies when the YAML is hand-edited.
|
|
11
|
+
*/
|
|
12
|
+
export declare const RESEARCH_BATCH_DEFAULT_MAX_ITEMS = 10;
|
|
2
13
|
/** Sinks for the research command's user-facing output. Tests inject capturing sinks. */
|
|
3
14
|
export interface ResearchIO {
|
|
4
15
|
log?: (message: string) => void;
|
|
@@ -8,27 +19,14 @@ export interface ResearchIO {
|
|
|
8
19
|
export interface ResearchCommandOptions {
|
|
9
20
|
cwd?: string;
|
|
10
21
|
io?: ResearchIO;
|
|
22
|
+
/**
|
|
23
|
+
* Test-only override for the {@link ProgressReporter}. When omitted, the
|
|
24
|
+
* CLI constructs one from `--verbose` / `--quiet` / `RADAR_NO_PROGRESS`
|
|
25
|
+
* and the TTY auto-detection table (ADR-0015 D2). Tests pin a no-op or a
|
|
26
|
+
* capturing reporter so assertions are deterministic.
|
|
27
|
+
*/
|
|
28
|
+
progress?: ProgressReporter;
|
|
11
29
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Implementation of `radar research <item-id>` (single-item) and
|
|
14
|
-
* `radar research --digest <id1> <id2> ...` (multi-item digest, ADR-0011).
|
|
15
|
-
*
|
|
16
|
-
* High-level flow (Phase 1):
|
|
17
|
-
* 1. Parse + validate args (agent defaults to `claude-code`, template to
|
|
18
|
-
* `default` for single-item or `digest` for `--digest`).
|
|
19
|
-
* 2. Locate `items/<sourceId>/<item-id>.yaml` for each id and parse it.
|
|
20
|
-
* 3. Load `templates/<template-id>.md` (empty body when default is absent).
|
|
21
|
-
* 4. Compute the output path:
|
|
22
|
-
* - single-item: `research/<YYYYMMDD>_<slug>_v1.md` (ADR-0003)
|
|
23
|
-
* - digest: `research/<YYYYMMDD>_digest_<slug>_v1.md` (ADR-0011)
|
|
24
|
-
* Refuse to overwrite an existing file — re-runs go through `update`.
|
|
25
|
-
* 5. Invoke the registered agent adapter; the agent writes the report.
|
|
26
|
-
* 6. Validate the report's frontmatter against `ResearchFrontmatterSchema`.
|
|
27
|
-
* 7. Transition every included item: `status` → `researched` and persist.
|
|
28
|
-
*
|
|
29
|
-
* Any step from 4 onward that fails surfaces a non-zero exit code with a
|
|
30
|
-
* targeted message so the user can debug without re-reading the source.
|
|
31
|
-
*/
|
|
32
30
|
export declare function runResearch(args: string[], options?: ResearchCommandOptions): Promise<number>;
|
|
33
31
|
export declare const researchCommand: Command;
|
|
34
32
|
//# sourceMappingURL=research.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/cli/research.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/cli/research.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAY5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AA4hBD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CAyHjB;AAED,eAAO,MAAM,eAAe,EAAE,OAI7B,CAAC"}
|