@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.
Files changed (144) hide show
  1. package/README.ja.md +31 -6
  2. package/README.md +31 -6
  3. package/dist/agents/claude-code.d.ts +12 -1
  4. package/dist/agents/claude-code.d.ts.map +1 -1
  5. package/dist/agents/claude-code.js +9 -5
  6. package/dist/agents/claude-code.js.map +1 -1
  7. package/dist/agents/codex-cli.d.ts +7 -1
  8. package/dist/agents/codex-cli.d.ts.map +1 -1
  9. package/dist/agents/codex-cli.js +9 -5
  10. package/dist/agents/codex-cli.js.map +1 -1
  11. package/dist/agents/copilot.d.ts +7 -1
  12. package/dist/agents/copilot.d.ts.map +1 -1
  13. package/dist/agents/copilot.js +9 -5
  14. package/dist/agents/copilot.js.map +1 -1
  15. package/dist/agents/gemini-cli.d.ts +7 -1
  16. package/dist/agents/gemini-cli.d.ts.map +1 -1
  17. package/dist/agents/gemini-cli.js +9 -5
  18. package/dist/agents/gemini-cli.js.map +1 -1
  19. package/dist/agents/index.d.ts +1 -1
  20. package/dist/agents/index.d.ts.map +1 -1
  21. package/dist/agents/types.d.ts +33 -0
  22. package/dist/agents/types.d.ts.map +1 -1
  23. package/dist/cli/_progress.d.ts +138 -0
  24. package/dist/cli/_progress.d.ts.map +1 -0
  25. package/dist/cli/_progress.js +176 -0
  26. package/dist/cli/_progress.js.map +1 -0
  27. package/dist/cli/doctor.d.ts +20 -0
  28. package/dist/cli/doctor.d.ts.map +1 -1
  29. package/dist/cli/doctor.js +291 -2
  30. package/dist/cli/doctor.js.map +1 -1
  31. package/dist/cli/index.d.ts.map +1 -1
  32. package/dist/cli/index.js +2 -0
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/research.d.ts +18 -20
  35. package/dist/cli/research.d.ts.map +1 -1
  36. package/dist/cli/research.js +318 -203
  37. package/dist/cli/research.js.map +1 -1
  38. package/dist/cli/respawn.d.ts +53 -0
  39. package/dist/cli/respawn.d.ts.map +1 -0
  40. package/dist/cli/respawn.js +120 -0
  41. package/dist/cli/respawn.js.map +1 -0
  42. package/dist/cli/review.d.ts +7 -0
  43. package/dist/cli/review.d.ts.map +1 -1
  44. package/dist/cli/review.js +46 -1
  45. package/dist/cli/review.js.map +1 -1
  46. package/dist/cli/source.d.ts +23 -2
  47. package/dist/cli/source.d.ts.map +1 -1
  48. package/dist/cli/source.js +425 -7
  49. package/dist/cli/source.js.map +1 -1
  50. package/dist/cli/update.d.ts +7 -0
  51. package/dist/cli/update.d.ts.map +1 -1
  52. package/dist/cli/update.js +41 -1
  53. package/dist/cli/update.js.map +1 -1
  54. package/dist/cli/watch.d.ts.map +1 -1
  55. package/dist/cli/watch.js +65 -3
  56. package/dist/cli/watch.js.map +1 -1
  57. package/dist/cli/workflow/generate-combined.d.ts +100 -0
  58. package/dist/cli/workflow/generate-combined.d.ts.map +1 -0
  59. package/dist/cli/workflow/generate-combined.js +387 -0
  60. package/dist/cli/workflow/generate-combined.js.map +1 -0
  61. package/dist/cli/workflow/generate-watch.d.ts +142 -0
  62. package/dist/cli/workflow/generate-watch.d.ts.map +1 -0
  63. package/dist/cli/workflow/generate-watch.js +338 -0
  64. package/dist/cli/workflow/generate-watch.js.map +1 -0
  65. package/dist/cli/workflow.d.ts +29 -0
  66. package/dist/cli/workflow.d.ts.map +1 -0
  67. package/dist/cli/workflow.js +66 -0
  68. package/dist/cli/workflow.js.map +1 -0
  69. package/dist/core/feeds/_fetch.d.ts +103 -0
  70. package/dist/core/feeds/_fetch.d.ts.map +1 -0
  71. package/dist/core/feeds/_fetch.js +364 -0
  72. package/dist/core/feeds/_fetch.js.map +1 -0
  73. package/dist/core/feeds/_jsonpath.d.ts +57 -0
  74. package/dist/core/feeds/_jsonpath.d.ts.map +1 -0
  75. package/dist/core/feeds/_jsonpath.js +207 -0
  76. package/dist/core/feeds/_jsonpath.js.map +1 -0
  77. package/dist/core/feeds/github-api.d.ts.map +1 -1
  78. package/dist/core/feeds/github-api.js +2 -1
  79. package/dist/core/feeds/github-api.js.map +1 -1
  80. package/dist/core/feeds/html-js.d.ts +29 -0
  81. package/dist/core/feeds/html-js.d.ts.map +1 -1
  82. package/dist/core/feeds/html-js.js +86 -2
  83. package/dist/core/feeds/html-js.js.map +1 -1
  84. package/dist/core/feeds/html.d.ts.map +1 -1
  85. package/dist/core/feeds/html.js +2 -1
  86. package/dist/core/feeds/html.js.map +1 -1
  87. package/dist/core/feeds/index.d.ts +1 -1
  88. package/dist/core/feeds/index.d.ts.map +1 -1
  89. package/dist/core/feeds/index.js +4 -0
  90. package/dist/core/feeds/index.js.map +1 -1
  91. package/dist/core/feeds/json-api.d.ts +3 -0
  92. package/dist/core/feeds/json-api.d.ts.map +1 -0
  93. package/dist/core/feeds/json-api.js +723 -0
  94. package/dist/core/feeds/json-api.js.map +1 -0
  95. package/dist/core/feeds/json-feed.d.ts +11 -0
  96. package/dist/core/feeds/json-feed.d.ts.map +1 -0
  97. package/dist/core/feeds/json-feed.js +242 -0
  98. package/dist/core/feeds/json-feed.js.map +1 -0
  99. package/dist/core/feeds/npm-registry.d.ts.map +1 -1
  100. package/dist/core/feeds/npm-registry.js +2 -1
  101. package/dist/core/feeds/npm-registry.js.map +1 -1
  102. package/dist/core/feeds/rss.d.ts.map +1 -1
  103. package/dist/core/feeds/rss.js +2 -1
  104. package/dist/core/feeds/rss.js.map +1 -1
  105. package/dist/core/feeds/types.d.ts +123 -0
  106. package/dist/core/feeds/types.d.ts.map +1 -1
  107. package/dist/core/progress.d.ts +101 -0
  108. package/dist/core/progress.d.ts.map +1 -0
  109. package/dist/core/progress.js +212 -0
  110. package/dist/core/progress.js.map +1 -0
  111. package/dist/core/proxy.d.ts +87 -0
  112. package/dist/core/proxy.d.ts.map +1 -0
  113. package/dist/core/proxy.js +146 -0
  114. package/dist/core/proxy.js.map +1 -0
  115. package/dist/core/recipes.d.ts +138 -0
  116. package/dist/core/recipes.d.ts.map +1 -0
  117. package/dist/core/recipes.js +238 -0
  118. package/dist/core/recipes.js.map +1 -0
  119. package/dist/core/watcher.d.ts +61 -1
  120. package/dist/core/watcher.d.ts.map +1 -1
  121. package/dist/core/watcher.js +99 -2
  122. package/dist/core/watcher.js.map +1 -1
  123. package/dist/index.js +17 -4
  124. package/dist/index.js.map +1 -1
  125. package/dist/recipes/aws-whats-new.yaml +61 -0
  126. package/dist/recipes/dev-to.yaml +40 -0
  127. package/dist/schemas/index.d.ts +1 -0
  128. package/dist/schemas/index.d.ts.map +1 -1
  129. package/dist/schemas/index.js +1 -0
  130. package/dist/schemas/index.js.map +1 -1
  131. package/dist/schemas/recipe.d.ts +115 -0
  132. package/dist/schemas/recipe.d.ts.map +1 -0
  133. package/dist/schemas/recipe.js +54 -0
  134. package/dist/schemas/recipe.js.map +1 -0
  135. package/dist/schemas/source.d.ts +130 -0
  136. package/dist/schemas/source.d.ts.map +1 -1
  137. package/dist/schemas/source.js +130 -0
  138. package/dist/schemas/source.js.map +1 -1
  139. package/dist/templates/agents/AGENTS.md +31 -3
  140. package/dist/templates/feedradar.md +23 -8
  141. package/dist/templates/workflows/combined.template.yaml.tmpl +110 -0
  142. package/dist/templates/workflows/watch.template.yaml.tmpl +103 -0
  143. package/dist/templates/workflows/watch.yaml +5 -1
  144. package/package.json +2 -3
@@ -1,4 +1,21 @@
1
1
  import type { AgentId, Item, ResearchFrontmatter } from "../schemas/index.js";
2
+ /**
3
+ * Low-level stream pass-through callback (ADR-0015 D3).
4
+ *
5
+ * Adapters wire this to each `child.stdout` / `child.stderr` `"data"` chunk
6
+ * so the caller (`research` / `review` / `update` CLI in #197) can keep a
7
+ * `ProgressReporter` ticking — e.g. update `stdout: 4.2 KB` on the spinner
8
+ * row, or stream the chunk verbatim under `--verbose`.
9
+ *
10
+ * Stays at the lowest level (raw chunk text) so the adapter contract does
11
+ * not have to know about the `ProgressReporter` shape; callers translate
12
+ * chunks into reporter calls. `kind` distinguishes streams because some
13
+ * callers render stderr differently (warning colour, separate buffer).
14
+ *
15
+ * Optional everywhere: leaving `onProgress` unset is byte-equivalent to the
16
+ * pre-#196 adapter behaviour.
17
+ */
18
+ export type AgentProgressCallback = (kind: "stdout" | "stderr", text: string) => void;
2
19
  export interface ResearchRequest {
3
20
  agent: AgentId;
4
21
  templateId: string;
@@ -13,6 +30,12 @@ export interface ResearchRequest {
13
30
  * `research/`, and resolve relative paths the same way the CLI does.
14
31
  */
15
32
  cwd: string;
33
+ /**
34
+ * Optional progress callback. Invoked once per `stdout` / `stderr` chunk
35
+ * from the spawned agent CLI. Unset means "no progress reporting"
36
+ * (#196 forward-compat: existing call sites work unchanged).
37
+ */
38
+ onProgress?: AgentProgressCallback;
16
39
  }
17
40
  /**
18
41
  * Inputs for the `review` adapter method.
@@ -48,6 +71,11 @@ export interface ReviewRequest {
48
71
  * `items/`, `sources/`, etc. with relative paths.
49
72
  */
50
73
  cwd: string;
74
+ /**
75
+ * Optional progress callback. See {@link AgentProgressCallback} /
76
+ * {@link ResearchRequest.onProgress}.
77
+ */
78
+ onProgress?: AgentProgressCallback;
51
79
  }
52
80
  /**
53
81
  * Inputs for the `update` adapter method.
@@ -93,6 +121,11 @@ export interface UpdateRequest {
93
121
  * `items/`, `sources/`, etc. with relative paths.
94
122
  */
95
123
  cwd: string;
124
+ /**
125
+ * Optional progress callback. See {@link AgentProgressCallback} /
126
+ * {@link ResearchRequest.onProgress}.
127
+ */
128
+ onProgress?: AgentProgressCallback;
96
129
  }
97
130
  export interface AgentAdapter {
98
131
  id: AgentId;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,EAAE;QACZ,WAAW,EAAE,mBAAmB,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,EAAE;QACZ,WAAW,EAAE,mBAAmB,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C"}
@@ -0,0 +1,138 @@
1
+ import type { AgentProgressCallback } from "../agents/types.js";
2
+ import { noopProgressReporter, type ProgressLevel, type ProgressReporter } from "../core/progress.js";
3
+ /**
4
+ * Shared progress helpers for `radar research` / `review` / `update`.
5
+ *
6
+ * #197 wires `ProgressReporter` (ADR-0015) into the three agent-driven CLIs.
7
+ * The CLIs each follow the same phase-marker sequence (Loaded item / Loaded
8
+ * template / Spawning / Agent running / Agent completed / Frontmatter
9
+ * validated / Status transition), so the boilerplate lives here:
10
+ *
11
+ * - {@link parseProgressFlags} normalises `--verbose` / `--quiet` parsing
12
+ * (extracting them from `argv` so the per-command `parseArgs` sees a clean
13
+ * array)
14
+ * - {@link buildReporter} centralises the priority chain `RADAR_NO_PROGRESS=1`
15
+ * > `--quiet` > `--verbose` > default. The reporter writes to `stderr` so it
16
+ * never collides with the existing `io.log()` / `io.warn()` / `io.error()`
17
+ * sinks that tests inject (those still drive stdout-like channels).
18
+ * - {@link buildAgentProgressCallback} adapts the adapter's
19
+ * {@link AgentProgressCallback} (which receives raw stdout/stderr chunks)
20
+ * into reporter calls. It tracks cumulative stdout bytes so the spinner row
21
+ * shows `stdout: 4.2 KB`, and forwards chunks verbatim via `reporter.raw()`
22
+ * when the reporter is in verbose mode.
23
+ * - {@link pollOutputFileSize} starts a 500ms `fs.stat` poll so the spinner
24
+ * row can show how big the agent's output file is growing. The agent CLIs
25
+ * write the report to disk as they go (or atomically at the end); polling
26
+ * the file size is the only stream-agnostic way to surface "something is
27
+ * actually happening" because most agent runners only emit chatty stdout
28
+ * for tool calls, not for the report body itself.
29
+ *
30
+ * Naming convention follows ADR-0015 D4: every phase marker uses the verb-
31
+ * forms documented there (`Loaded …`, `Spawning …`, `Agent running…`,
32
+ * `Agent completed (…)`, `Status: … → …`).
33
+ */
34
+ export interface ProgressFlagState {
35
+ /** Argv with `--verbose` / `--quiet` stripped. */
36
+ rest: string[];
37
+ /** Resolved verbosity level. */
38
+ level: ProgressLevel;
39
+ /** Saw `--verbose` flag explicitly. */
40
+ verbose: boolean;
41
+ /** Saw `--quiet` flag explicitly. */
42
+ quiet: boolean;
43
+ }
44
+ export declare class ProgressFlagError extends Error {
45
+ constructor(message: string);
46
+ }
47
+ /**
48
+ * Strip `--verbose` / `--quiet` from `argv` and return the resolved
49
+ * {@link ProgressLevel} plus the remaining argv for the command's own parser.
50
+ *
51
+ * Mutually exclusive: passing both raises {@link ProgressFlagError} so the
52
+ * caller can convert it into an exit-code-2 usage error consistent with the
53
+ * existing `parseArgs` style. `RADAR_NO_PROGRESS=1` is honoured at reporter
54
+ * construction time (see {@link buildReporter}); we do not mix env handling
55
+ * into argv parsing because env is global and argv is per-invocation.
56
+ */
57
+ export declare function parseProgressFlags(argv: string[]): ProgressFlagState;
58
+ export interface BuildReporterOptions {
59
+ level: ProgressLevel;
60
+ /** Test-only TTY override. Falls back to `process.stderr.isTTY` at runtime. */
61
+ tty?: boolean;
62
+ /** Test-only output stream override. Defaults to `process.stderr`. */
63
+ stream?: NodeJS.WritableStream;
64
+ }
65
+ /**
66
+ * Construct a {@link ProgressReporter} for a CLI invocation. Thin wrapper
67
+ * around {@link createProgressReporter} that records the helper's existence
68
+ * for grep-discoverability — production callers route through here so the
69
+ * defaulting logic stays in one place.
70
+ *
71
+ * `level: "quiet"` and `RADAR_NO_PROGRESS=1` both produce a no-op reporter
72
+ * (the env check happens inside `createProgressReporter`); the CLI keeps its
73
+ * pre-existing 1-line `io.log("research: wrote …")` summary as the only
74
+ * surviving signal, satisfying the issue's acceptance criterion 8.
75
+ */
76
+ export declare function buildReporter(opts: BuildReporterOptions): ProgressReporter;
77
+ /**
78
+ * Render a byte count for the spinner row. Uses binary prefixes (KiB / MiB)
79
+ * but renders them as `KB` / `MB` for readability — the spinner is a UX
80
+ * affordance, not a precise meter, and the ADR-0015 D4 examples show `4.2 KB`
81
+ * without binary-suffix pedantry.
82
+ */
83
+ export declare function formatBytes(n: number): string;
84
+ /**
85
+ * Bridge {@link AgentProgressCallback} (raw stdout / stderr chunks) to a
86
+ * {@link ProgressReporter}.
87
+ *
88
+ * On every chunk:
89
+ * - cumulative stdout byte count is folded into the spinner row via
90
+ * `reporter.update({ stdout: "<formatted>" })`
91
+ * - `reporter.raw(text)` forwards the chunk verbatim. The reporter swallows
92
+ * the call unless verbosity is `verbose`, so non-verbose callers pay only
93
+ * the cost of the bridge function itself (no extra stderr writes).
94
+ *
95
+ * stderr chunks are also passed to `reporter.raw()` so `--verbose` users see
96
+ * agent CLI warnings inline. They don't update the `stdout:` metric (that
97
+ * key is intentionally tied to actual stdout volume so the spinner row stays
98
+ * comparable across runs).
99
+ */
100
+ export declare function buildAgentProgressCallback(reporter: ProgressReporter): AgentProgressCallback;
101
+ export interface OutputSizePollHandle {
102
+ /** Stop the poll loop. Safe to call multiple times. */
103
+ stop: () => void;
104
+ }
105
+ export interface OutputSizePollOptions {
106
+ /** Path to `fs.stat`. The agent should be writing here. */
107
+ path: string;
108
+ reporter: ProgressReporter;
109
+ /** Poll interval in milliseconds (default 500ms per ADR-0015 D5 / #197). */
110
+ intervalMs?: number;
111
+ /**
112
+ * Metric key on the spinner row. Defaults to `output` so the row reads
113
+ * `output: 4.2 KB`. Tests override for deterministic assertions.
114
+ */
115
+ metricKey?: string;
116
+ }
117
+ /**
118
+ * Poll the agent's output file with `fs.stat` every 500ms (configurable) and
119
+ * push the latest size onto the spinner row.
120
+ *
121
+ * Why polling instead of `fs.watch`: `fs.watch` is platform-flaky (Linux
122
+ * needs inotify, macOS uses FSEvents, WSL has its own quirks) and the agent
123
+ * may write atomically at the end with no intermediate `change` events. A
124
+ * 500ms `fs.stat` poll is reliable everywhere and the cost (one syscall per
125
+ * tick) is negligible next to the agent CLI spawn.
126
+ *
127
+ * The poll silently ignores `ENOENT` because the agent writes the file part-
128
+ * way through the run; we only start showing sizes once the file exists. Any
129
+ * other stat error is also swallowed (best-effort UX, the reporter must
130
+ * never abort the actual research operation).
131
+ */
132
+ export declare function pollOutputFileSize(opts: OutputSizePollOptions): OutputSizePollHandle;
133
+ /**
134
+ * Convenience: return a no-op reporter typed as a {@link ProgressReporter}.
135
+ * Re-exported here so CLI modules don't have to import from two places.
136
+ */
137
+ export { noopProgressReporter };
138
+ //# sourceMappingURL=_progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_progress.d.ts","sourceRoot":"","sources":["../../src/cli/_progress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAEL,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gCAAgC;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAuBpE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CAM1E;AAKD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,qBAAqB,CAS5F;AAED,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,CAgDpF;AAED;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,176 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { createProgressReporter, noopProgressReporter, } from "../core/progress.js";
3
+ export class ProgressFlagError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "ProgressFlagError";
7
+ }
8
+ }
9
+ /**
10
+ * Strip `--verbose` / `--quiet` from `argv` and return the resolved
11
+ * {@link ProgressLevel} plus the remaining argv for the command's own parser.
12
+ *
13
+ * Mutually exclusive: passing both raises {@link ProgressFlagError} so the
14
+ * caller can convert it into an exit-code-2 usage error consistent with the
15
+ * existing `parseArgs` style. `RADAR_NO_PROGRESS=1` is honoured at reporter
16
+ * construction time (see {@link buildReporter}); we do not mix env handling
17
+ * into argv parsing because env is global and argv is per-invocation.
18
+ */
19
+ export function parseProgressFlags(argv) {
20
+ const rest = [];
21
+ let verbose = false;
22
+ let quiet = false;
23
+ for (const arg of argv) {
24
+ if (arg === "--verbose") {
25
+ verbose = true;
26
+ continue;
27
+ }
28
+ if (arg === "--quiet") {
29
+ quiet = true;
30
+ continue;
31
+ }
32
+ rest.push(arg);
33
+ }
34
+ if (verbose && quiet) {
35
+ throw new ProgressFlagError("--verbose and --quiet are mutually exclusive");
36
+ }
37
+ let level;
38
+ if (quiet)
39
+ level = "quiet";
40
+ else if (verbose)
41
+ level = "verbose";
42
+ else
43
+ level = "normal";
44
+ return { rest, level, verbose, quiet };
45
+ }
46
+ /**
47
+ * Construct a {@link ProgressReporter} for a CLI invocation. Thin wrapper
48
+ * around {@link createProgressReporter} that records the helper's existence
49
+ * for grep-discoverability — production callers route through here so the
50
+ * defaulting logic stays in one place.
51
+ *
52
+ * `level: "quiet"` and `RADAR_NO_PROGRESS=1` both produce a no-op reporter
53
+ * (the env check happens inside `createProgressReporter`); the CLI keeps its
54
+ * pre-existing 1-line `io.log("research: wrote …")` summary as the only
55
+ * surviving signal, satisfying the issue's acceptance criterion 8.
56
+ */
57
+ export function buildReporter(opts) {
58
+ return createProgressReporter({
59
+ level: opts.level,
60
+ tty: opts.tty,
61
+ stream: opts.stream,
62
+ });
63
+ }
64
+ const KIB = 1024;
65
+ const MIB = KIB * 1024;
66
+ /**
67
+ * Render a byte count for the spinner row. Uses binary prefixes (KiB / MiB)
68
+ * but renders them as `KB` / `MB` for readability — the spinner is a UX
69
+ * affordance, not a precise meter, and the ADR-0015 D4 examples show `4.2 KB`
70
+ * without binary-suffix pedantry.
71
+ */
72
+ export function formatBytes(n) {
73
+ if (n < KIB)
74
+ return `${n} B`;
75
+ if (n < MIB)
76
+ return `${(n / KIB).toFixed(1)} KB`;
77
+ return `${(n / MIB).toFixed(1)} MB`;
78
+ }
79
+ /**
80
+ * Bridge {@link AgentProgressCallback} (raw stdout / stderr chunks) to a
81
+ * {@link ProgressReporter}.
82
+ *
83
+ * On every chunk:
84
+ * - cumulative stdout byte count is folded into the spinner row via
85
+ * `reporter.update({ stdout: "<formatted>" })`
86
+ * - `reporter.raw(text)` forwards the chunk verbatim. The reporter swallows
87
+ * the call unless verbosity is `verbose`, so non-verbose callers pay only
88
+ * the cost of the bridge function itself (no extra stderr writes).
89
+ *
90
+ * stderr chunks are also passed to `reporter.raw()` so `--verbose` users see
91
+ * agent CLI warnings inline. They don't update the `stdout:` metric (that
92
+ * key is intentionally tied to actual stdout volume so the spinner row stays
93
+ * comparable across runs).
94
+ */
95
+ export function buildAgentProgressCallback(reporter) {
96
+ let stdoutBytes = 0;
97
+ return (kind, text) => {
98
+ if (kind === "stdout") {
99
+ stdoutBytes += Buffer.byteLength(text, "utf8");
100
+ reporter.update({ stdout: formatBytes(stdoutBytes) });
101
+ }
102
+ reporter.raw(text);
103
+ };
104
+ }
105
+ /**
106
+ * Poll the agent's output file with `fs.stat` every 500ms (configurable) and
107
+ * push the latest size onto the spinner row.
108
+ *
109
+ * Why polling instead of `fs.watch`: `fs.watch` is platform-flaky (Linux
110
+ * needs inotify, macOS uses FSEvents, WSL has its own quirks) and the agent
111
+ * may write atomically at the end with no intermediate `change` events. A
112
+ * 500ms `fs.stat` poll is reliable everywhere and the cost (one syscall per
113
+ * tick) is negligible next to the agent CLI spawn.
114
+ *
115
+ * The poll silently ignores `ENOENT` because the agent writes the file part-
116
+ * way through the run; we only start showing sizes once the file exists. Any
117
+ * other stat error is also swallowed (best-effort UX, the reporter must
118
+ * never abort the actual research operation).
119
+ */
120
+ export function pollOutputFileSize(opts) {
121
+ const intervalMs = opts.intervalMs ?? 500;
122
+ const metricKey = opts.metricKey ?? "output";
123
+ let stopped = false;
124
+ let timer = null;
125
+ let lastReportedSize = -1;
126
+ const tick = async () => {
127
+ if (stopped)
128
+ return;
129
+ try {
130
+ const s = await stat(opts.path);
131
+ if (s.size !== lastReportedSize) {
132
+ lastReportedSize = s.size;
133
+ opts.reporter.update({ [metricKey]: formatBytes(s.size) });
134
+ }
135
+ }
136
+ catch {
137
+ // ENOENT during the early phase of the agent run, or transient stat
138
+ // failure — silently ignore so the spinner UX never crashes the real
139
+ // operation.
140
+ }
141
+ };
142
+ // First tick on next macrotask so callers can return the handle before the
143
+ // poll begins. setInterval also schedules; we add the immediate call so the
144
+ // spinner picks up an existing file without waiting a full interval.
145
+ const startup = setTimeout(() => {
146
+ if (!stopped) {
147
+ void tick();
148
+ timer = setInterval(() => {
149
+ void tick();
150
+ }, intervalMs);
151
+ // Don't keep the event loop alive just for the poll.
152
+ if (typeof timer.unref === "function") {
153
+ timer.unref();
154
+ }
155
+ }
156
+ }, 0);
157
+ if (typeof startup.unref === "function") {
158
+ startup.unref();
159
+ }
160
+ return {
161
+ stop() {
162
+ stopped = true;
163
+ clearTimeout(startup);
164
+ if (timer) {
165
+ clearInterval(timer);
166
+ timer = null;
167
+ }
168
+ },
169
+ };
170
+ }
171
+ /**
172
+ * Convenience: return a no-op reporter typed as a {@link ProgressReporter}.
173
+ * Re-exported here so CLI modules don't have to import from two places.
174
+ */
175
+ export { noopProgressReporter };
176
+ //# sourceMappingURL=_progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_progress.js","sourceRoot":"","sources":["../../src/cli/_progress.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,26 @@ export interface DoctorCommandOptions {
30
30
  * what is actually installed on the host machine).
31
31
  */
32
32
  whichImpl?: (binary: string, env: NodeJS.ProcessEnv) => Promise<string | undefined>;
33
+ /**
34
+ * Skip the live proxy healthcheck (default: run the check when a proxy is
35
+ * detected). Off-line developer machines and CI jobs that intentionally
36
+ * isolate the network want a deterministic doctor run without paying for
37
+ * a network round-trip that is guaranteed to fail.
38
+ */
39
+ noProxyCheck?: boolean;
40
+ /**
41
+ * Test seam: override `fetch` used by the proxy healthcheck so the test can
42
+ * drive the 200 / 407 / TLS / ECONNREFUSED branches deterministically
43
+ * without hitting api.github.com.
44
+ */
45
+ fetchImpl?: typeof fetch;
46
+ /**
47
+ * Test seam: override the wall-clock used to measure the healthcheck
48
+ * latency. Returns an elapsed-milliseconds reading; we don't accept a raw
49
+ * clock function because vitest's `vi.useFakeTimers()` interferes with
50
+ * `performance.now()` in surprising ways.
51
+ */
52
+ nowImpl?: () => number;
33
53
  }
34
54
  /**
35
55
  * Possible statuses for a single doctor check.
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,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,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACrF;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,oCAAoC;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AA4DD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4H/F;AAqCD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,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,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpF;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,oCAAoC;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AA+FD;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkO/F;AAkMD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED,eAAO,MAAM,aAAa,EAAE,OAI3B,CAAC"}