@ozzylabs/feedradar 0.1.4 → 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 +12 -6
- package/README.md +10 -5
- 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/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/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 +10 -0
- package/dist/core/feeds/_fetch.d.ts.map +1 -1
- package/dist/core/feeds/_fetch.js +182 -0
- package/dist/core/feeds/_fetch.js.map +1 -1
- 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/html-js.d.ts +8 -0
- package/dist/core/feeds/html-js.d.ts.map +1 -1
- package/dist/core/feeds/html-js.js +47 -1
- package/dist/core/feeds/html-js.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/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/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/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/package.json +1 -2
|
@@ -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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"}
|
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":"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"}
|
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"}
|