@ozzylabs/feedradar 0.1.1 → 0.1.3
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 +16 -5
- package/README.md +16 -5
- package/dist/agents/_boundary.d.ts +48 -1
- package/dist/agents/_boundary.d.ts.map +1 -1
- package/dist/agents/_boundary.js +65 -0
- package/dist/agents/_boundary.js.map +1 -1
- package/dist/agents/claude-code.js +3 -3
- package/dist/agents/claude-code.js.map +1 -1
- package/dist/agents/codex-cli.js +3 -3
- package/dist/agents/codex-cli.js.map +1 -1
- package/dist/agents/copilot.js +3 -3
- package/dist/agents/copilot.js.map +1 -1
- package/dist/agents/gemini-cli.js +3 -3
- package/dist/agents/gemini-cli.js.map +1 -1
- package/dist/cli/doctor.d.ts +83 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +260 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +14 -7
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +44 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/research.d.ts +10 -6
- package/dist/cli/research.d.ts.map +1 -1
- package/dist/cli/research.js +201 -35
- package/dist/cli/research.js.map +1 -1
- package/dist/cli/source.d.ts +25 -3
- package/dist/cli/source.d.ts.map +1 -1
- package/dist/cli/source.js +185 -8
- package/dist/cli/source.js.map +1 -1
- package/dist/cli/watch.d.ts +16 -0
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +3 -0
- package/dist/cli/watch.js.map +1 -1
- package/dist/core/feeds/_html-common.d.ts +30 -0
- package/dist/core/feeds/_html-common.d.ts.map +1 -0
- package/dist/core/feeds/_html-common.js +192 -0
- package/dist/core/feeds/_html-common.js.map +1 -0
- package/dist/core/feeds/html-js.d.ts +50 -0
- package/dist/core/feeds/html-js.d.ts.map +1 -0
- package/dist/core/feeds/html-js.js +135 -0
- package/dist/core/feeds/html-js.js.map +1 -0
- package/dist/core/feeds/html.d.ts +1 -7
- package/dist/core/feeds/html.d.ts.map +1 -1
- package/dist/core/feeds/html.js +25 -183
- package/dist/core/feeds/html.js.map +1 -1
- package/dist/core/feeds/index.d.ts.map +1 -1
- package/dist/core/feeds/index.js +2 -0
- package/dist/core/feeds/index.js.map +1 -1
- package/dist/core/feeds/rss.js +3 -3
- package/dist/core/feeds/rss.js.map +1 -1
- package/dist/core/playwright-check.d.ts +134 -0
- package/dist/core/playwright-check.d.ts.map +1 -0
- package/dist/core/playwright-check.js +98 -0
- package/dist/core/playwright-check.js.map +1 -0
- package/dist/core/templates.d.ts +10 -9
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +27 -12
- package/dist/core/templates.js.map +1 -1
- package/dist/core/watcher.d.ts +43 -0
- package/dist/core/watcher.d.ts.map +1 -1
- package/dist/core/watcher.js +84 -4
- package/dist/core/watcher.js.map +1 -1
- package/dist/schemas/source.d.ts +42 -0
- package/dist/schemas/source.d.ts.map +1 -1
- package/dist/schemas/source.js +42 -7
- package/dist/schemas/source.js.map +1 -1
- package/dist/schemas/state.d.ts +2 -0
- package/dist/schemas/state.d.ts.map +1 -1
- package/dist/schemas/state.js +4 -0
- package/dist/schemas/state.js.map +1 -1
- package/dist/templates/agents/AGENTS.md +4 -2
- package/dist/templates/digest.md +59 -0
- package/dist/templates/feedradar.md +4 -2
- package/package.json +11 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detection / install helpers for the optional `playwright` peer dependency
|
|
3
|
+
* used by the `html-js` feed adapter (ADR-0010).
|
|
4
|
+
*
|
|
5
|
+
* The `html-js` adapter resolves Playwright at fetch time via
|
|
6
|
+
* `await import("playwright")`, so the package is intentionally optional in
|
|
7
|
+
* `package.json#peerDependenciesMeta`. Two CLI surfaces need to inspect that
|
|
8
|
+
* resolution outside of the adapter itself:
|
|
9
|
+
*
|
|
10
|
+
* 1. `radar doctor` — proactively reports whether Playwright + Chromium are
|
|
11
|
+
* installed so users can fix the environment before scheduling a watch.
|
|
12
|
+
* 2. `radar watch run` — lazily probes Playwright on the first `html-js`
|
|
13
|
+
* source so a missing install does not abort the whole run; the affected
|
|
14
|
+
* source is skipped with an actionable error, other kinds continue.
|
|
15
|
+
*
|
|
16
|
+
* Both paths share the same probe / install helpers here to keep the install
|
|
17
|
+
* hint and `RADAR_AUTO_INSTALL_CHROMIUM` escape hatch in one place. The escape
|
|
18
|
+
* hatch exists for CI scenarios where a fresh runner has `playwright` itself
|
|
19
|
+
* (e.g. via `npm i`) but no browser binary on disk yet.
|
|
20
|
+
*
|
|
21
|
+
* Policy choices (intentional, not for adapter to second-guess):
|
|
22
|
+
*
|
|
23
|
+
* - We do NOT auto-install the `playwright` npm package. Global npm installs
|
|
24
|
+
* fail in non-obvious ways (permissions, version mismatches with the
|
|
25
|
+
* workspace's lockfile), so the user must run `npm i -g playwright`
|
|
26
|
+
* themselves and get a clear error from `npm` if it fails.
|
|
27
|
+
* - We DO auto-install Chromium when `RADAR_AUTO_INSTALL_CHROMIUM=1` is set
|
|
28
|
+
* and Playwright is present. `npx playwright install chromium` is the
|
|
29
|
+
* official path, idempotent, and well-supported in CI runners.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Minimal Playwright surface this module reasons about. We only need
|
|
33
|
+
* `chromium.executablePath()` (sync function returning a fs path) — the
|
|
34
|
+
* fetcher in `feeds/html-js.ts` keeps its own structural type for the launch
|
|
35
|
+
* subset it actually uses.
|
|
36
|
+
*/
|
|
37
|
+
export interface PlaywrightModuleLike {
|
|
38
|
+
chromium: {
|
|
39
|
+
executablePath: () => string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Outcome of a Playwright probe. Discriminated union so callers branch
|
|
44
|
+
* cleanly on the failure mode without parsing error messages.
|
|
45
|
+
*
|
|
46
|
+
* - `ok`: module loaded AND `chromium.executablePath()` points at an
|
|
47
|
+
* existing file on disk.
|
|
48
|
+
* - `module-missing`: `import("playwright")` threw (package not installed).
|
|
49
|
+
* - `chromium-missing`: module loaded but the executable path is absent.
|
|
50
|
+
* The path is included so callers can show it to the user.
|
|
51
|
+
*/
|
|
52
|
+
export type PlaywrightProbeResult = {
|
|
53
|
+
status: "ok";
|
|
54
|
+
executablePath: string;
|
|
55
|
+
} | {
|
|
56
|
+
status: "module-missing";
|
|
57
|
+
message: string;
|
|
58
|
+
} | {
|
|
59
|
+
status: "chromium-missing";
|
|
60
|
+
executablePath: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Test seam: lets unit tests inject a fake importer / `pathExists` so we can
|
|
64
|
+
* exercise every branch (module missing, chromium missing, ok) without
|
|
65
|
+
* touching the real Playwright install.
|
|
66
|
+
*
|
|
67
|
+
* The real CLI never passes these; defaults are dynamic import + `fs.access`.
|
|
68
|
+
*/
|
|
69
|
+
export interface ProbeOptions {
|
|
70
|
+
/** Replace dynamic `import("playwright")` (tests only). */
|
|
71
|
+
importPlaywright?: () => Promise<unknown>;
|
|
72
|
+
/** Replace fs existence check (tests only). */
|
|
73
|
+
pathExists?: (p: string) => Promise<boolean>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Probe whether Playwright + Chromium are usable from this process.
|
|
77
|
+
*
|
|
78
|
+
* Order matters: we MUST surface "module missing" before attempting any
|
|
79
|
+
* property access — `chromium.executablePath()` would throw with a less
|
|
80
|
+
* actionable message ("Cannot read properties of undefined").
|
|
81
|
+
*/
|
|
82
|
+
export declare function probePlaywright(options?: ProbeOptions): Promise<PlaywrightProbeResult>;
|
|
83
|
+
/**
|
|
84
|
+
* User-facing install hint emitted when Playwright (the npm package) is
|
|
85
|
+
* missing. The text matches the wording in `feeds/html-js.ts#loadPlaywright`
|
|
86
|
+
* so users see consistent guidance across `doctor` and `watch run`.
|
|
87
|
+
*
|
|
88
|
+
* `RADAR_AUTO_INSTALL_CHROMIUM` is mentioned only in the Chromium-missing
|
|
89
|
+
* branch — auto-installing the npm package itself is intentionally out of
|
|
90
|
+
* scope (see module header).
|
|
91
|
+
*/
|
|
92
|
+
export declare const PLAYWRIGHT_MODULE_MISSING_HINT: string;
|
|
93
|
+
/**
|
|
94
|
+
* User-facing install hint emitted when the npm package is present but the
|
|
95
|
+
* Chromium binary on disk is not. Mentions the auto-install escape hatch
|
|
96
|
+
* since this is the branch it actually applies to.
|
|
97
|
+
*/
|
|
98
|
+
export declare const CHROMIUM_MISSING_HINT: string;
|
|
99
|
+
/**
|
|
100
|
+
* Test seam for the spawn used by `installChromium`. Production passes
|
|
101
|
+
* the real `child_process.spawn`; tests inject a fake that returns a
|
|
102
|
+
* predetermined exit code without actually launching a subprocess.
|
|
103
|
+
*/
|
|
104
|
+
export type InstallSpawnLike = (command: string, args: readonly string[], options: {
|
|
105
|
+
cwd?: string;
|
|
106
|
+
stdio?: "inherit" | "pipe" | "ignore";
|
|
107
|
+
}) => {
|
|
108
|
+
on(event: "close", listener: (code: number | null) => void): void;
|
|
109
|
+
on(event: "error", listener: (err: Error) => void): void;
|
|
110
|
+
};
|
|
111
|
+
export interface InstallChromiumOptions {
|
|
112
|
+
/** Working directory for the spawned `npx`. Defaults to the caller's cwd. */
|
|
113
|
+
cwd?: string;
|
|
114
|
+
/** Test seam: swap out `child_process.spawn`. */
|
|
115
|
+
spawnImpl?: InstallSpawnLike;
|
|
116
|
+
/** Sink for progress messages (defaults to console.log). */
|
|
117
|
+
log?: (message: string) => void;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Spawn `npx playwright install chromium` and resolve when it exits.
|
|
121
|
+
*
|
|
122
|
+
* Used by the `RADAR_AUTO_INSTALL_CHROMIUM=1` escape hatch. We pipe output
|
|
123
|
+
* through `stdio: "inherit"` so the user (or CI logs) sees Playwright's
|
|
124
|
+
* progress in real time — `npx playwright install` already prints
|
|
125
|
+
* download URLs and percentages that are helpful debugging signal when the
|
|
126
|
+
* install fails. Resolves to the child's exit code so callers can decide
|
|
127
|
+
* whether to retry the original operation.
|
|
128
|
+
*
|
|
129
|
+
* Note we explicitly use `npx` (not direct binary lookup) because Playwright
|
|
130
|
+
* does not expose a JS API for browser install; the CLI is the supported
|
|
131
|
+
* entrypoint per Playwright docs.
|
|
132
|
+
*/
|
|
133
|
+
export declare function installChromium(options?: InstallChromiumOptions): Promise<number>;
|
|
134
|
+
//# sourceMappingURL=playwright-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-check.d.ts","sourceRoot":"","sources":["../../src/core/playwright-check.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,MAAM,CAAC;KAC9B,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAWD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgChG;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,QAE0B,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAEmC,CAAC;AAEtE;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;CAAE,KAC7D;IACH,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAClE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC1D,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
async function defaultPathExists(p) {
|
|
4
|
+
try {
|
|
5
|
+
await access(p);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Probe whether Playwright + Chromium are usable from this process.
|
|
14
|
+
*
|
|
15
|
+
* Order matters: we MUST surface "module missing" before attempting any
|
|
16
|
+
* property access — `chromium.executablePath()` would throw with a less
|
|
17
|
+
* actionable message ("Cannot read properties of undefined").
|
|
18
|
+
*/
|
|
19
|
+
export async function probePlaywright(options = {}) {
|
|
20
|
+
const importPlaywright = options.importPlaywright ?? (() => import("playwright"));
|
|
21
|
+
const pathExists = options.pathExists ?? defaultPathExists;
|
|
22
|
+
let mod;
|
|
23
|
+
try {
|
|
24
|
+
mod = (await importPlaywright());
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return {
|
|
28
|
+
status: "module-missing",
|
|
29
|
+
message: e instanceof Error ? e.message : String(e),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
let execPath;
|
|
33
|
+
try {
|
|
34
|
+
execPath = mod.chromium.executablePath();
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
// `executablePath()` raises when no browsers were ever installed via
|
|
38
|
+
// `npx playwright install`. Treat as the same user-actionable failure as a
|
|
39
|
+
// missing file on disk; surface an empty path so callers know the message
|
|
40
|
+
// came from this branch.
|
|
41
|
+
return {
|
|
42
|
+
status: "chromium-missing",
|
|
43
|
+
executablePath: e instanceof Error ? `(${e.message})` : "(unknown)",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (!(await pathExists(execPath))) {
|
|
47
|
+
return { status: "chromium-missing", executablePath: execPath };
|
|
48
|
+
}
|
|
49
|
+
return { status: "ok", executablePath: execPath };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* User-facing install hint emitted when Playwright (the npm package) is
|
|
53
|
+
* missing. The text matches the wording in `feeds/html-js.ts#loadPlaywright`
|
|
54
|
+
* so users see consistent guidance across `doctor` and `watch run`.
|
|
55
|
+
*
|
|
56
|
+
* `RADAR_AUTO_INSTALL_CHROMIUM` is mentioned only in the Chromium-missing
|
|
57
|
+
* branch — auto-installing the npm package itself is intentionally out of
|
|
58
|
+
* scope (see module header).
|
|
59
|
+
*/
|
|
60
|
+
export const PLAYWRIGHT_MODULE_MISSING_HINT = "Playwright is required for kind: html-js. Run: npm i -g playwright && npx playwright install chromium\n" +
|
|
61
|
+
"Or set RADAR_AUTO_INSTALL_CHROMIUM=1 to auto-install on next run.";
|
|
62
|
+
/**
|
|
63
|
+
* User-facing install hint emitted when the npm package is present but the
|
|
64
|
+
* Chromium binary on disk is not. Mentions the auto-install escape hatch
|
|
65
|
+
* since this is the branch it actually applies to.
|
|
66
|
+
*/
|
|
67
|
+
export const CHROMIUM_MISSING_HINT = "Chromium binary not found. Run: npx playwright install chromium\n" +
|
|
68
|
+
"Or set RADAR_AUTO_INSTALL_CHROMIUM=1 to auto-install on next run.";
|
|
69
|
+
/**
|
|
70
|
+
* Spawn `npx playwright install chromium` and resolve when it exits.
|
|
71
|
+
*
|
|
72
|
+
* Used by the `RADAR_AUTO_INSTALL_CHROMIUM=1` escape hatch. We pipe output
|
|
73
|
+
* through `stdio: "inherit"` so the user (or CI logs) sees Playwright's
|
|
74
|
+
* progress in real time — `npx playwright install` already prints
|
|
75
|
+
* download URLs and percentages that are helpful debugging signal when the
|
|
76
|
+
* install fails. Resolves to the child's exit code so callers can decide
|
|
77
|
+
* whether to retry the original operation.
|
|
78
|
+
*
|
|
79
|
+
* Note we explicitly use `npx` (not direct binary lookup) because Playwright
|
|
80
|
+
* does not expose a JS API for browser install; the CLI is the supported
|
|
81
|
+
* entrypoint per Playwright docs.
|
|
82
|
+
*/
|
|
83
|
+
export async function installChromium(options = {}) {
|
|
84
|
+
const spawnImpl = options.spawnImpl ?? spawn;
|
|
85
|
+
const log = options.log ?? ((m) => console.log(m));
|
|
86
|
+
log("Installing Chromium via `npx playwright install chromium`...");
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const child = spawnImpl("npx", ["playwright", "install", "chromium"], {
|
|
89
|
+
cwd: options.cwd,
|
|
90
|
+
stdio: "inherit",
|
|
91
|
+
});
|
|
92
|
+
child.on("error", reject);
|
|
93
|
+
child.on("close", (code) => {
|
|
94
|
+
resolve(code ?? 1);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=playwright-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-check.js","sourceRoot":"","sources":["../../src/core/playwright-check.ts"],"names":[],"mappings":"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"}
|
package/dist/core/templates.d.ts
CHANGED
|
@@ -6,16 +6,17 @@ export interface ResearchTemplate {
|
|
|
6
6
|
/**
|
|
7
7
|
* Load `templates/<id>.md` from the workspace.
|
|
8
8
|
*
|
|
9
|
-
* The CLI defaults `--template default
|
|
10
|
-
*
|
|
11
|
-
* than silently falling back to an empty
|
|
12
|
-
* from the template, and a silently-empty
|
|
13
|
-
* agent output that's hard to diagnose.
|
|
9
|
+
* The CLI defaults `--template default` (or `digest` for `--digest`), so
|
|
10
|
+
* callers will typically pass one of those ids here. If the file is missing
|
|
11
|
+
* we surface a clear error rather than silently falling back to an empty
|
|
12
|
+
* body — the agent prompt is built from the template, and a silently-empty
|
|
13
|
+
* template would produce confusing agent output that's hard to diagnose.
|
|
14
14
|
*
|
|
15
|
-
* `default`
|
|
16
|
-
* agent's research SKILL has its own built-in
|
|
17
|
-
*
|
|
18
|
-
* an empty body and the SKILL falls
|
|
15
|
+
* `default` and `digest` are accepted when their workspace files do not
|
|
16
|
+
* exist: the agent's research SKILL has its own built-in structures for
|
|
17
|
+
* both modes (ADR-0011 §6), so callers may legitimately skip provisioning
|
|
18
|
+
* a template file. In that case we return an empty body and the SKILL falls
|
|
19
|
+
* back to its bundled structure.
|
|
19
20
|
*/
|
|
20
21
|
export declare function loadTemplate(id: string, dir: string): Promise<ResearchTemplate>;
|
|
21
22
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAqCD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBrF"}
|
package/dist/core/templates.js
CHANGED
|
@@ -19,19 +19,34 @@ async function pathExists(p) {
|
|
|
19
19
|
function isSafeTemplateId(id) {
|
|
20
20
|
return /^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id) && !id.includes("..");
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Template ids that the CLI may legitimately invoke when the workspace file
|
|
24
|
+
* has not been provisioned (e.g. the user has not run `radar init`, or has
|
|
25
|
+
* deleted the file). The research SKILL ships built-in fallback structures
|
|
26
|
+
* for each of these, so a missing workspace file is recoverable.
|
|
27
|
+
*
|
|
28
|
+
* - `default`: single-item research (the original `radar research <item>`
|
|
29
|
+
* default)
|
|
30
|
+
* - `digest`: multi-item digest (ADR-0011 §6 — `radar research --digest`
|
|
31
|
+
* resolves to `templateId: "digest"`; the bundled template ships via
|
|
32
|
+
* `init`, but the research SKILL has its own digest structure as a
|
|
33
|
+
* fallback when the workspace file is absent).
|
|
34
|
+
*/
|
|
35
|
+
const IMPLICIT_FALLBACK_IDS = new Set(["default", "digest"]);
|
|
22
36
|
/**
|
|
23
37
|
* Load `templates/<id>.md` from the workspace.
|
|
24
38
|
*
|
|
25
|
-
* The CLI defaults `--template default
|
|
26
|
-
*
|
|
27
|
-
* than silently falling back to an empty
|
|
28
|
-
* from the template, and a silently-empty
|
|
29
|
-
* agent output that's hard to diagnose.
|
|
39
|
+
* The CLI defaults `--template default` (or `digest` for `--digest`), so
|
|
40
|
+
* callers will typically pass one of those ids here. If the file is missing
|
|
41
|
+
* we surface a clear error rather than silently falling back to an empty
|
|
42
|
+
* body — the agent prompt is built from the template, and a silently-empty
|
|
43
|
+
* template would produce confusing agent output that's hard to diagnose.
|
|
30
44
|
*
|
|
31
|
-
* `default`
|
|
32
|
-
* agent's research SKILL has its own built-in
|
|
33
|
-
*
|
|
34
|
-
* an empty body and the SKILL falls
|
|
45
|
+
* `default` and `digest` are accepted when their workspace files do not
|
|
46
|
+
* exist: the agent's research SKILL has its own built-in structures for
|
|
47
|
+
* both modes (ADR-0011 §6), so callers may legitimately skip provisioning
|
|
48
|
+
* a template file. In that case we return an empty body and the SKILL falls
|
|
49
|
+
* back to its bundled structure.
|
|
35
50
|
*/
|
|
36
51
|
export async function loadTemplate(id, dir) {
|
|
37
52
|
if (!isSafeTemplateId(id)) {
|
|
@@ -39,9 +54,9 @@ export async function loadTemplate(id, dir) {
|
|
|
39
54
|
}
|
|
40
55
|
const path = join(dir, `${id}.md`);
|
|
41
56
|
if (!(await pathExists(path))) {
|
|
42
|
-
if (id
|
|
43
|
-
//
|
|
44
|
-
//
|
|
57
|
+
if (IMPLICIT_FALLBACK_IDS.has(id)) {
|
|
58
|
+
// The bundled research SKILL ships a structure for these ids.
|
|
59
|
+
// Returning an empty body signals "use built-in".
|
|
45
60
|
return { id, path, body: "" };
|
|
46
61
|
}
|
|
47
62
|
throw new Error(`loadTemplate: template not found: ${path}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,EAAU;IAClC,OAAO,8BAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,EAAU;IAClC,OAAO,8BAA8B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU,EAAE,GAAW;IACxD,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,sCAAsC,EAAE,2CAA2C,CACpF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,8DAA8D;YAC9D,kDAAkD;YAClD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
|
package/dist/core/watcher.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Item, Source, SourceState } from "../schemas/index.js";
|
|
2
2
|
import type { FeedAdapter, FetchLike } from "./feeds/index.js";
|
|
3
|
+
import { installChromium, type ProbeOptions } from "./playwright-check.js";
|
|
3
4
|
export interface WorkspacePaths {
|
|
4
5
|
/** Workspace root; defaults to process.cwd() at the CLI layer. */
|
|
5
6
|
cwd: string;
|
|
@@ -16,6 +17,17 @@ export interface WatchRunOptions extends WorkspacePaths {
|
|
|
16
17
|
* backlogs (ADR-0008 §運用: 初回ノイズ抑制).
|
|
17
18
|
*/
|
|
18
19
|
bootstrap?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Dry-run mode: run the full fetch + filter pipeline but do not persist
|
|
22
|
+
* anything to disk — neither item YAMLs under `items/` nor the updated
|
|
23
|
+
* `state/<sourceId>.yaml`. `WatchRunResult.detected` is still populated
|
|
24
|
+
* with matched items so callers (e.g. `radar source test`) can preview
|
|
25
|
+
* what would be ingested without mutating workspace state.
|
|
26
|
+
*
|
|
27
|
+
* Mutually independent from `bootstrap`: 304 and adapter / fetch error
|
|
28
|
+
* paths are unchanged (no writes happen on those paths anyway).
|
|
29
|
+
*/
|
|
30
|
+
dryRun?: boolean;
|
|
19
31
|
/** Override the adapter registry (tests). */
|
|
20
32
|
getAdapter?: (kind: Source["kind"]) => FeedAdapter;
|
|
21
33
|
/** Override the HTTP fetcher (tests). */
|
|
@@ -24,6 +36,22 @@ export interface WatchRunOptions extends WorkspacePaths {
|
|
|
24
36
|
log?: (message: string) => void;
|
|
25
37
|
warn?: (message: string) => void;
|
|
26
38
|
error?: (message: string) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Override `process.env` lookup. Tests use this to toggle
|
|
41
|
+
* `RADAR_AUTO_INSTALL_CHROMIUM=1` without poking at the real environment.
|
|
42
|
+
*/
|
|
43
|
+
env?: NodeJS.ProcessEnv;
|
|
44
|
+
/**
|
|
45
|
+
* Test seam: replace the Playwright probe used by the lazy `html-js`
|
|
46
|
+
* pre-check. Production callers leave this unset and the real
|
|
47
|
+
* `import("playwright")` path runs.
|
|
48
|
+
*/
|
|
49
|
+
playwrightProbeOptions?: ProbeOptions;
|
|
50
|
+
/**
|
|
51
|
+
* Test seam: replace the auto-install function. Tests inject a stub that
|
|
52
|
+
* records invocation without actually spawning `npx playwright install`.
|
|
53
|
+
*/
|
|
54
|
+
installChromiumImpl?: typeof installChromium;
|
|
27
55
|
}
|
|
28
56
|
export interface WatchRunResult {
|
|
29
57
|
/** Map of sourceId → detected (filter-passing, not previously seen) items. */
|
|
@@ -35,6 +63,21 @@ export interface WatchRunResult {
|
|
|
35
63
|
sourceId: string;
|
|
36
64
|
message: string;
|
|
37
65
|
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Per-source pipeline counts. `fetched` is the raw item count returned by
|
|
68
|
+
* the adapter (before filter / dedup), `filtered` is how many passed the
|
|
69
|
+
* keyword filter. Populated for every source the run touched, including
|
|
70
|
+
* `bootstrap` and `304 not modified` paths (where `filtered` is 0).
|
|
71
|
+
*
|
|
72
|
+
* Used primarily by `radar source test` (#133) to print a fetched / filtered
|
|
73
|
+
* / matched summary; `radar watch run` does not need it for its current
|
|
74
|
+
* stdout format but the field exists unconditionally to keep the result
|
|
75
|
+
* shape stable across `dryRun` / non-`dryRun` callers.
|
|
76
|
+
*/
|
|
77
|
+
stats: Record<string, {
|
|
78
|
+
fetched: number;
|
|
79
|
+
filtered: number;
|
|
80
|
+
}>;
|
|
38
81
|
}
|
|
39
82
|
/**
|
|
40
83
|
* Load all enabled sources from `sources/*.yaml`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK/D,OAAO,EAEL,eAAe,EAGf,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AA2C/B,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,WAAW,CAAC;IACnD,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2DAA2D;IAC3D,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;IAClC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,YAAY,CAAC;IACtC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,eAAe,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACjC,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,6EAA6E;IAC7E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD;;;;;;;;;;OAUG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AAWD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoMhF;AAED;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAQ9D"}
|
package/dist/core/watcher.js
CHANGED
|
@@ -6,6 +6,7 @@ import { getFeedAdapter } from "./feeds/index.js";
|
|
|
6
6
|
import { filterItems } from "./filter.js";
|
|
7
7
|
import { detectInjection } from "./injection-detector.js";
|
|
8
8
|
import { saveItems } from "./items.js";
|
|
9
|
+
import { CHROMIUM_MISSING_HINT, installChromium, PLAYWRIGHT_MODULE_MISSING_HINT, probePlaywright, } from "./playwright-check.js";
|
|
9
10
|
import { loadSourceState, saveSourceState } from "./state.js";
|
|
10
11
|
async function pathExists(p) {
|
|
11
12
|
try {
|
|
@@ -118,6 +119,8 @@ export async function watchRun(options) {
|
|
|
118
119
|
const warn = options.warn ?? ((m) => console.warn(m));
|
|
119
120
|
const error = options.error ?? ((m) => console.error(m));
|
|
120
121
|
const getAdapter = options.getAdapter ?? getFeedAdapter;
|
|
122
|
+
const env = options.env ?? process.env;
|
|
123
|
+
const installImpl = options.installChromiumImpl ?? installChromium;
|
|
121
124
|
const sources = await loadSources(paths.sourcesDir, (m) => warn(`watch run: ${m}`));
|
|
122
125
|
const filtered = options.sourceId ? sources.filter((s) => s.id === options.sourceId) : sources;
|
|
123
126
|
if (filtered.length === 0) {
|
|
@@ -127,9 +130,44 @@ export async function watchRun(options) {
|
|
|
127
130
|
else {
|
|
128
131
|
log("watch run: no sources defined (use `radar source add ...`)");
|
|
129
132
|
}
|
|
130
|
-
return { detected: {}, states: {}, errors: [] };
|
|
133
|
+
return { detected: {}, states: {}, errors: [], stats: {} };
|
|
131
134
|
}
|
|
132
|
-
const result = { detected: {}, states: {}, errors: [] };
|
|
135
|
+
const result = { detected: {}, states: {}, errors: [], stats: {} };
|
|
136
|
+
// Lazy Playwright probe cache. We only run the probe when the first
|
|
137
|
+
// `html-js` source comes up so RSS / GitHub / npm-only workspaces never pay
|
|
138
|
+
// for the dynamic import. The result is reused across every subsequent
|
|
139
|
+
// `html-js` source in the same run — both because the install state cannot
|
|
140
|
+
// realistically change mid-run and because re-probing per source would be
|
|
141
|
+
// wasteful (and would spawn `npx playwright install` repeatedly when the
|
|
142
|
+
// auto-install hatch is on but fails for some reason).
|
|
143
|
+
let playwrightProbe = null;
|
|
144
|
+
const ensurePlaywrightReady = async () => {
|
|
145
|
+
if (playwrightProbe !== null)
|
|
146
|
+
return playwrightProbe;
|
|
147
|
+
playwrightProbe = await probePlaywright(options.playwrightProbeOptions);
|
|
148
|
+
// Auto-install escape hatch (CI-friendly, see playwright-check.ts policy).
|
|
149
|
+
// Triggered only when (a) Playwright itself is present, (b) Chromium is
|
|
150
|
+
// missing, and (c) the user opted in via env. We re-probe after install
|
|
151
|
+
// so the cached result reflects post-install reality; if the install
|
|
152
|
+
// failed the result stays at `chromium-missing` and the source is skipped
|
|
153
|
+
// with the usual hint.
|
|
154
|
+
if (playwrightProbe.status === "chromium-missing" && env.RADAR_AUTO_INSTALL_CHROMIUM === "1") {
|
|
155
|
+
log("watch run: RADAR_AUTO_INSTALL_CHROMIUM=1 detected — attempting to install Chromium...");
|
|
156
|
+
try {
|
|
157
|
+
const code = await installImpl({ cwd: paths.cwd, log });
|
|
158
|
+
if (code === 0) {
|
|
159
|
+
playwrightProbe = await probePlaywright(options.playwrightProbeOptions);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
warn(`watch run: chromium auto-install exited with code ${code}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
warn(`watch run: chromium auto-install failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return playwrightProbe;
|
|
170
|
+
};
|
|
133
171
|
for (const source of filtered) {
|
|
134
172
|
const previousState = await loadSourceState(paths.stateDir, source.id);
|
|
135
173
|
let adapter;
|
|
@@ -142,6 +180,27 @@ export async function watchRun(options) {
|
|
|
142
180
|
result.errors.push({ sourceId: source.id, message });
|
|
143
181
|
continue;
|
|
144
182
|
}
|
|
183
|
+
// Lazy Playwright pre-check for `html-js` sources. Skipping the source
|
|
184
|
+
// (rather than aborting the whole run) preserves the contract that one
|
|
185
|
+
// misbehaving source must not block the others — the same shape used for
|
|
186
|
+
// adapter errors / fetch failures above. The error message embeds the
|
|
187
|
+
// canonical install hint so the user sees the same wording here as in
|
|
188
|
+
// `radar doctor`.
|
|
189
|
+
if (source.kind === "html-js") {
|
|
190
|
+
const probe = await ensurePlaywrightReady();
|
|
191
|
+
if (probe.status !== "ok") {
|
|
192
|
+
const hint = probe.status === "module-missing"
|
|
193
|
+
? PLAYWRIGHT_MODULE_MISSING_HINT
|
|
194
|
+
: CHROMIUM_MISSING_HINT;
|
|
195
|
+
const detail = probe.status === "module-missing"
|
|
196
|
+
? "playwright module not installed"
|
|
197
|
+
: `chromium binary missing at '${probe.executablePath}'`;
|
|
198
|
+
const message = `${detail}\n${hint}`;
|
|
199
|
+
error(`watch run: '${source.id}' skipped: ${message}`);
|
|
200
|
+
result.errors.push({ sourceId: source.id, message });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
145
204
|
let fetched;
|
|
146
205
|
let nextStatePatch;
|
|
147
206
|
let notModified = false;
|
|
@@ -162,6 +221,12 @@ export async function watchRun(options) {
|
|
|
162
221
|
}
|
|
163
222
|
const seenIds = new Set(previousState.lastSeenIds);
|
|
164
223
|
let detectedItems = [];
|
|
224
|
+
// `filteredCount` is the number of items that passed the keyword filter
|
|
225
|
+
// *before* lastSeenIds dedup. Surfaced through `result.stats` so callers
|
|
226
|
+
// like `radar source test` can show users a fetched / filtered / matched
|
|
227
|
+
// breakdown without re-running the pipeline. Bootstrap / 304 paths leave
|
|
228
|
+
// it at 0 because no filter ran.
|
|
229
|
+
let filteredCount = 0;
|
|
165
230
|
if (options.bootstrap) {
|
|
166
231
|
// Bootstrap: seed the state with every id we saw so the *next* run can
|
|
167
232
|
// diff against it. We intentionally skip filter + emit so the user does
|
|
@@ -175,11 +240,19 @@ export async function watchRun(options) {
|
|
|
175
240
|
}
|
|
176
241
|
else {
|
|
177
242
|
const passed = filterItems(fetched, source);
|
|
243
|
+
filteredCount = passed.length;
|
|
178
244
|
const fresh = passed
|
|
179
245
|
.filter((item) => !seenIds.has(item.id))
|
|
180
246
|
.map((item) => annotateInjectionFlags(item));
|
|
181
247
|
if (fresh.length > 0) {
|
|
182
|
-
|
|
248
|
+
// Dry-run mode (e.g. `radar source test`): preview matches without
|
|
249
|
+
// writing item YAMLs. We still record the ids in the working
|
|
250
|
+
// `seenIds` set below so the in-memory `nextState` is consistent,
|
|
251
|
+
// but `saveSourceState` is skipped further down so nothing leaks
|
|
252
|
+
// to disk.
|
|
253
|
+
if (!options.dryRun) {
|
|
254
|
+
await saveItems(paths.itemsDir, fresh);
|
|
255
|
+
}
|
|
183
256
|
for (const item of fresh)
|
|
184
257
|
seenIds.add(item.id);
|
|
185
258
|
}
|
|
@@ -213,11 +286,18 @@ export async function watchRun(options) {
|
|
|
213
286
|
sourceId: source.id,
|
|
214
287
|
lastFetchedAt: nextStatePatch.lastFetchedAt ?? previousState.lastFetchedAt,
|
|
215
288
|
lastEtag: nextStatePatch.lastEtag ?? previousState.lastEtag,
|
|
289
|
+
lastModified: nextStatePatch.lastModified ?? previousState.lastModified,
|
|
216
290
|
lastSeenIds: Array.from(seenIds),
|
|
217
291
|
};
|
|
218
|
-
|
|
292
|
+
// In dry-run mode we still surface the would-be state through
|
|
293
|
+
// `result.states` so callers can introspect the projected delta, but we
|
|
294
|
+
// never persist it.
|
|
295
|
+
if (!options.dryRun) {
|
|
296
|
+
await saveSourceState(paths.stateDir, nextState);
|
|
297
|
+
}
|
|
219
298
|
result.detected[source.id] = detectedItems;
|
|
220
299
|
result.states[source.id] = nextState;
|
|
300
|
+
result.stats[source.id] = { fetched: fetched.length, filtered: filteredCount };
|
|
221
301
|
}
|
|
222
302
|
return result;
|
|
223
303
|
}
|
package/dist/core/watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,sBAAsB,CAAC,IAAU;IACxC,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,6DAA6D;YAC7D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAsCD,SAAS,YAAY,CAAC,IAAoB;IACxC,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;QAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;KACnD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,OAAkC;IAElC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,kBAAkB,QAAQ,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,mBAAmB,QAAQ,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,sBAAsB,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;YAC3F,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IAExD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE/F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,iCAAiC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,4DAA4D,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAmB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAExE,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,KAAK,CAAC,eAAe,MAAM,CAAC,EAAE,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QACD,IAAI,OAAe,CAAC;QACpB,IAAI,cAAoC,CAAC;QACzC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;gBAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,aAAa;aACrB,CAAC,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC;YACnC,WAAW,GAAG,WAAW,CAAC,WAAW,IAAI,KAAK,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,KAAK,CAAC,eAAe,MAAM,CAAC,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,aAAa,GAAW,EAAE,CAAC;QAE/B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,uEAAuE;YACvE,wEAAwE;YACxE,kEAAkE;YAClE,KAAK,MAAM,IAAI,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,GAAG,CAAC,yBAAyB,MAAM,CAAC,EAAE,OAAO,OAAO,CAAC,MAAM,iCAAiC,CAAC,CAAC;QAChG,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACvB,GAAG,CAAC,eAAe,MAAM,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM;iBACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACvC,KAAK,MAAM,IAAI,IAAI,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,mEAAmE;YACnE,sEAAsE;YACtE,qEAAqE;YACrE,2CAA2C;YAC3C,KAAK,MAAM,IAAI,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,aAAa,GAAG,KAAK,CAAC;YACtB,oEAAoE;YACpE,mEAAmE;YACnE,qEAAqE;YACrE,iEAAiE;YACjE,gEAAgE;YAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrF,IAAI,CACF,eAAe,MAAM,CAAC,EAAE,sCAAsC,OAAO,CAAC,MAAM,+DAA+D,MAAM,CAAC,EAAE,2BAA2B,CAChL,CAAC;YACJ,CAAC;YACD,GAAG,CACD,eAAe,MAAM,CAAC,EAAE,aAAa,OAAO,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,mBAAmB,CAC9F,CAAC;YACF,gEAAgE;YAChE,qEAAqE;YACrE,uEAAuE;YACvE,8DAA8D;YAC9D,8DAA8D;YAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CACF,eAAe,MAAM,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,yHAAyH,CACrK,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAgB;YAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,aAAa,EAAE,cAAc,CAAC,aAAa,IAAI,aAAa,CAAC,aAAa;YAC1E,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ;YAC3D,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;SACjC,CAAC;QACF,MAAM,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAiB;IAC3C,MAAM,OAAO,GAAW,EAAE,CAAC;IAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"}
|