@ozzylabs/feedradar 0.1.8 → 0.2.0

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 (65) hide show
  1. package/README.ja.md +6 -3
  2. package/README.md +6 -3
  3. package/dist/agents/_boundary.d.ts +61 -4
  4. package/dist/agents/_boundary.d.ts.map +1 -1
  5. package/dist/agents/_boundary.js +143 -18
  6. package/dist/agents/_boundary.js.map +1 -1
  7. package/dist/agents/claude-code.d.ts.map +1 -1
  8. package/dist/agents/claude-code.js +33 -93
  9. package/dist/agents/claude-code.js.map +1 -1
  10. package/dist/agents/codex-cli.d.ts.map +1 -1
  11. package/dist/agents/codex-cli.js +34 -93
  12. package/dist/agents/codex-cli.js.map +1 -1
  13. package/dist/agents/copilot.d.ts.map +1 -1
  14. package/dist/agents/copilot.js +33 -93
  15. package/dist/agents/copilot.js.map +1 -1
  16. package/dist/agents/gemini-cli.d.ts.map +1 -1
  17. package/dist/agents/gemini-cli.js +33 -93
  18. package/dist/agents/gemini-cli.js.map +1 -1
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +2 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/init.d.ts +1 -1
  23. package/dist/cli/init.d.ts.map +1 -1
  24. package/dist/cli/init.js +10 -3
  25. package/dist/cli/init.js.map +1 -1
  26. package/dist/cli/routine/fire.d.ts +100 -0
  27. package/dist/cli/routine/fire.d.ts.map +1 -0
  28. package/dist/cli/routine/fire.js +196 -0
  29. package/dist/cli/routine/fire.js.map +1 -0
  30. package/dist/cli/routine/generate-pipeline.d.ts +100 -0
  31. package/dist/cli/routine/generate-pipeline.d.ts.map +1 -0
  32. package/dist/cli/routine/generate-pipeline.js +311 -0
  33. package/dist/cli/routine/generate-pipeline.js.map +1 -0
  34. package/dist/cli/routine/generate-watch.d.ts +174 -0
  35. package/dist/cli/routine/generate-watch.d.ts.map +1 -0
  36. package/dist/cli/routine/generate-watch.js +445 -0
  37. package/dist/cli/routine/generate-watch.js.map +1 -0
  38. package/dist/cli/routine.d.ts +32 -0
  39. package/dist/cli/routine.d.ts.map +1 -0
  40. package/dist/cli/routine.js +74 -0
  41. package/dist/cli/routine.js.map +1 -0
  42. package/dist/cli/triage.d.ts.map +1 -1
  43. package/dist/cli/triage.js +383 -78
  44. package/dist/cli/triage.js.map +1 -1
  45. package/dist/core/feeds/json-api.d.ts.map +1 -1
  46. package/dist/core/feeds/json-api.js +14 -0
  47. package/dist/core/feeds/json-api.js.map +1 -1
  48. package/dist/core/feeds/types.d.ts +14 -0
  49. package/dist/core/feeds/types.d.ts.map +1 -1
  50. package/dist/core/triage/adapter.d.ts +45 -0
  51. package/dist/core/triage/adapter.d.ts.map +1 -1
  52. package/dist/core/triage/adapter.js +50 -11
  53. package/dist/core/triage/adapter.js.map +1 -1
  54. package/dist/core/watcher.d.ts.map +1 -1
  55. package/dist/core/watcher.js +12 -2
  56. package/dist/core/watcher.js.map +1 -1
  57. package/dist/skills/research/SKILL.md +17 -6
  58. package/dist/skills/review/SKILL.md +13 -5
  59. package/dist/skills/update/SKILL.md +13 -5
  60. package/dist/templates/agents/AGENTS.md +1 -1
  61. package/dist/templates/routines/pipeline.yaml.tmpl +231 -0
  62. package/dist/templates/routines/watch-daily.yaml +157 -0
  63. package/dist/templates/routines/watch.yaml.tmpl +151 -0
  64. package/package.json +1 -1
  65. package/dist/templates/routines/watch-daily.md +0 -42
@@ -0,0 +1,445 @@
1
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, isAbsolute, join, normalize, relative, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { loadSources } from "../../core/watcher.js";
5
+ /**
6
+ * Models supported by `--model`. Claude Routines run on the subscription
7
+ * Claude session (ADR-0020 D2), so the only valid models are Claude family
8
+ * identifiers. The literal list keeps the help text and validation in sync.
9
+ */
10
+ export const SUPPORTED_MODELS = [
11
+ "claude-sonnet-4-6",
12
+ "claude-opus-4-7",
13
+ "claude-haiku-4-5",
14
+ ];
15
+ /**
16
+ * Collect the distinct outbound hosts a routine must reach to fetch the
17
+ * workspace's subscribed feeds.
18
+ *
19
+ * Reads `sources/*.yaml` from `cwd` and extracts the URL hostname of every
20
+ * source (skipping `npm-registry`, which has a fixed `registry.npmjs.org`
21
+ * host injected separately, and bare-package URLs that do not parse). The
22
+ * result drives the `network_access` block (`renderNetworkAccessBlock`):
23
+ * Claude Routines' Default **Trusted** mode returns `403`
24
+ * (`x-deny-reason: host_not_allowed`) for any host outside its built-in
25
+ * allowlist, so a watch/pipeline routine that fetches arbitrary RSS / HTTP
26
+ * feeds needs **Custom** access scoped to exactly these hosts (ADR-0020 D3c /
27
+ * ADR-0009 D5b — outbound limited to `sources/*.yaml` hosts; we do NOT open
28
+ * `Full`).
29
+ *
30
+ * Malformed source files are skipped (reported via `onError`) rather than
31
+ * aborting — mirrors `loadSources`. Returns a sorted, de-duplicated list.
32
+ */
33
+ export async function collectSourceHosts(cwd, onError = () => { }) {
34
+ const sources = await loadSources(join(cwd, "sources"), onError);
35
+ const hosts = new Set();
36
+ for (const source of sources) {
37
+ // npm-registry accepts a bare-package form (`@scope/pkg`) that is not a
38
+ // URL; its real outbound host is the npm registry, added below.
39
+ if (source.kind === "npm-registry") {
40
+ hosts.add("registry.npmjs.org");
41
+ continue;
42
+ }
43
+ try {
44
+ hosts.add(new URL(source.url).hostname.toLowerCase());
45
+ }
46
+ catch {
47
+ // Non-URL source.url (should not happen for non-npm kinds after schema
48
+ // validation) — skip rather than emit a broken allowlist entry.
49
+ }
50
+ }
51
+ return [...hosts].sort();
52
+ }
53
+ /**
54
+ * Render the `environment.network_access` YAML block for a routine template.
55
+ *
56
+ * Claude Routines network modes are **Trusted / Custom / Full** (NOT the
57
+ * `trusted / none / open` an earlier template comment claimed). The Default
58
+ * **Trusted** mode allowlists only a curated set of hosts and returns `403`
59
+ * (`x-deny-reason: host_not_allowed`) for anything else, so it CANNOT reach
60
+ * arbitrary subscribed feeds. We therefore emit **Custom** scoped to the
61
+ * subscribed-feed hosts (ADR-0020 D3c / ADR-0009 D5b) and never `Full`, which
62
+ * would defeat the limited-egress intent.
63
+ *
64
+ * `network_access` mirrors the Web UI "Network access" field; the routine
65
+ * YAML is pasted into that form by hand (Routines has no declarative apply
66
+ * API), so the host allowlist itself is registered in the Web UI's Custom
67
+ * editor. The emitted block records `custom` plus, as a comment, the exact
68
+ * host list to paste (or, when none can be enumerated, an explicit
69
+ * instruction to add the subscribed-feed hosts there).
70
+ */
71
+ export function renderNetworkAccessBlock(hosts) {
72
+ const lines = [
73
+ " # Network access mode: Trusted / Custom / Full (Web UI: Environment > Network access).",
74
+ " # Trusted (Default): only a curated host allowlist; ANY other host gets",
75
+ " # 403 (x-deny-reason: host_not_allowed) — so it CANNOT fetch arbitrary feeds.",
76
+ " # Custom: you supply the allowlist — use this, scoped to your subscribed feeds.",
77
+ " # Full: unrestricted egress — NOT used (ADR-0020 D3c / ADR-0009 D5b limit",
78
+ " # outbound to sources/*.yaml hosts; never open the routine to any host).",
79
+ ];
80
+ if (hosts.length > 0) {
81
+ lines.push(" # Register these subscribed-feed hosts (from sources/*.yaml) in the Web UI", " # Custom network access allowlist:");
82
+ for (const host of hosts) {
83
+ lines.push(` # - ${host}`);
84
+ }
85
+ }
86
+ else {
87
+ lines.push(" # No sources/*.yaml hosts could be enumerated at generate time. In the Web UI", " # Custom network access allowlist, add each subscribed-feed host this routine", " # must fetch (the hostnames from your sources/*.yaml `url:` fields).");
88
+ }
89
+ lines.push(" network_access: custom");
90
+ return lines.join("\n");
91
+ }
92
+ /**
93
+ * Resolve the directory holding the bundled routine templates.
94
+ *
95
+ * Mirrors `resolveTemplatesRoot` in `src/cli/workflow/generate-watch.ts`:
96
+ * the compiled CLI lives at `dist/cli/routine/generate-watch.js`, so the
97
+ * bundled templates sit at `../../templates` relative to this module.
98
+ * During tests we may run from source (`src/cli/routine/generate-watch.ts`),
99
+ * where the same relative path lands at `src/templates/`.
100
+ */
101
+ async function resolveTemplatesRoot() {
102
+ const here = dirname(fileURLToPath(import.meta.url));
103
+ return resolve(here, "..", "..", "templates");
104
+ }
105
+ async function pathExists(p) {
106
+ try {
107
+ await access(p);
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * Validate a 5-field POSIX cron expression for a Claude Routine schedule.
116
+ *
117
+ * DRY note (ADR-0020 / #280): the structural 5-field grammar deliberately
118
+ * mirrors `isValidCron` in `src/cli/workflow/generate-watch.ts`, but the two
119
+ * are kept SEPARATE on purpose. GitHub Actions accepts arbitrary sub-hourly
120
+ * cron (e.g. `*\/5 * * * *`); Claude Routines enforce a **1-hour minimum
121
+ * interval**. Sharing one validator would force the workflow side to either
122
+ * over-reject (breaking existing 5-minute GHA crons) or this side to
123
+ * under-reject (generating a routine that the Web UI rejects on apply). So
124
+ * this validator layers a sub-hourly rejection (`isSubHourlyCron`) on top of
125
+ * the same structural check.
126
+ *
127
+ * Range bounds are NOT enforced (the Web UI rejects out-of-range on apply);
128
+ * keeping the check structural avoids a cron-parser dependency.
129
+ */
130
+ export function isValidCron(expr) {
131
+ const trimmed = expr.trim();
132
+ if (trimmed.length === 0)
133
+ return false;
134
+ const fields = trimmed.split(/\s+/);
135
+ if (fields.length !== 5)
136
+ return false;
137
+ const tokenPattern = /^(?:\*|\d+(?:-\d+)?)(?:\/\d+)?$/;
138
+ for (const field of fields) {
139
+ if (field.length === 0)
140
+ return false;
141
+ for (const token of field.split(",")) {
142
+ if (token.length === 0)
143
+ return false;
144
+ if (!tokenPattern.test(token))
145
+ return false;
146
+ }
147
+ }
148
+ return true;
149
+ }
150
+ /**
151
+ * Detect a cron expression that would fire more often than once per hour.
152
+ *
153
+ * Claude Routines reject sub-hourly schedules (ADR-0020: minimum interval is
154
+ * 1 hour). We catch the common sub-hourly shapes in the MINUTE field (field
155
+ * 0) before the file is written so the user gets a clear error instead of a
156
+ * Web UI rejection at apply time:
157
+ *
158
+ * - `*` in the minute field => fires every minute.
159
+ * - `*\/N` step in the minute field => fires N times within the hour.
160
+ * - a comma list with 2+ distinct minutes (e.g. `0,30 * * * *`) => fires
161
+ * multiple times per hour.
162
+ * - a range with `-` (e.g. `0-30 * * * *`) => fires every minute in range.
163
+ *
164
+ * A single fixed minute (`0`, `30`, `15`) is hourly-or-coarser and accepted.
165
+ * Assumes `isValidCron(expr)` already passed (5 well-formed fields).
166
+ */
167
+ export function isSubHourlyCron(expr) {
168
+ const fields = expr.trim().split(/\s+/);
169
+ const minute = fields[0];
170
+ if (minute === undefined)
171
+ return true;
172
+ if (minute === "*")
173
+ return true;
174
+ if (minute.includes("/"))
175
+ return true; // step => multiple firings/hour
176
+ if (minute.includes("-"))
177
+ return true; // range => every minute in range
178
+ // Comma list: more than one distinct minute => multiple firings/hour.
179
+ const minutes = new Set(minute.split(","));
180
+ if (minutes.size > 1)
181
+ return true;
182
+ return false;
183
+ }
184
+ /**
185
+ * Validate that the requested `--output` path lands under `.claude/routines/`
186
+ * relative to the workspace root and ends in `.yaml`.
187
+ *
188
+ * DRY note (ADR-0020 / #280): the traversal + absolute-path rejection mirrors
189
+ * `isSafeWorkflowPath` in `src/cli/workflow/generate-watch.ts`, but the
190
+ * allowed directory (`.claude/routines/` vs `.github/workflows/`) and
191
+ * extension policy (`.yaml` only — the Web UI form is YAML, `.yml` would not
192
+ * match the README convention) differ, so the two are kept separate.
193
+ */
194
+ export function isSafeRoutinePath(outputPath, cwd) {
195
+ if (isAbsolute(outputPath)) {
196
+ const allowedDir = resolve(cwd, ".claude", "routines");
197
+ const resolved = resolve(outputPath);
198
+ const rel = relative(allowedDir, resolved);
199
+ if (rel.startsWith("..") || isAbsolute(rel))
200
+ return false;
201
+ return /\.yaml$/i.test(resolved);
202
+ }
203
+ const normalized = normalize(outputPath);
204
+ if (normalized.split(/[\\/]/).includes(".."))
205
+ return false;
206
+ const required = `${join(".claude", "routines")}/`;
207
+ const unixified = normalized.replace(/\\/g, "/");
208
+ if (!unixified.startsWith(required.replace(/\\/g, "/")))
209
+ return false;
210
+ return /\.yaml$/i.test(unixified);
211
+ }
212
+ /**
213
+ * Render the bundled routine template by substituting `{{name}}` /
214
+ * `{{repository}}` / `{{cron}}` / `{{timezone}}` / `{{model}}` placeholders.
215
+ *
216
+ * Literal `replace` (not a templating engine): the placeholders are simple
217
+ * tokens and we must not expand any other `{{...}}`-looking text in the body.
218
+ * Exported for unit testing in isolation.
219
+ */
220
+ export function renderWatchRoutineTemplate(template, values) {
221
+ return template
222
+ .replace(/\{\{name\}\}/g, values.name)
223
+ .replace(/\{\{repository\}\}/g, values.repository)
224
+ .replace(/\{\{cron\}\}/g, values.cron)
225
+ .replace(/\{\{timezone\}\}/g, values.timezone)
226
+ .replace(/\{\{model\}\}/g, values.model)
227
+ .replace(/\{\{networkAccessBlock\}\}/g, values.networkAccessBlock);
228
+ }
229
+ /**
230
+ * Core implementation of `radar routine generate watch` (ADR-0020 D5 `watch`).
231
+ *
232
+ * Validates the cron (5-field + 1-hour-minimum), output path, and repository,
233
+ * renders the bundled `watch.yaml.tmpl`, and writes it under
234
+ * `.claude/routines/`. The completion stdout tells the user how to paste the
235
+ * multi-line fields into the Web UI (yq extraction) and how to apply the
236
+ * schedule via `/schedule`, since Routines has no declarative apply API
237
+ * (ADR-0020 D1).
238
+ */
239
+ export async function generateWatchRoutine(options) {
240
+ const { cwd, name, repository, cron, timezone, model, output, force } = options;
241
+ const log = options.io?.log ?? ((m) => console.log(m));
242
+ const warn = options.io?.warn ?? ((m) => console.warn(m));
243
+ if (!isValidCron(cron)) {
244
+ throw new Error(`invalid --cron expression '${cron}' (expected 5-field POSIX cron, e.g. "0 * * * *")`);
245
+ }
246
+ if (isSubHourlyCron(cron)) {
247
+ throw new Error(`invalid --cron '${cron}': Claude Routines require a minimum interval of 1 hour ` +
248
+ `(use a fixed minute, e.g. "0 * * * *" hourly or "0 0 * * *" daily; ` +
249
+ `sub-hourly forms like "*/5 * * * *" or "0,30 * * * *" are rejected)`);
250
+ }
251
+ if (!isSafeRoutinePath(output, cwd)) {
252
+ throw new Error(`invalid --output '${output}' (must be a relative path under .claude/routines/ ending in .yaml)`);
253
+ }
254
+ if (!/^[^/\s]+\/[^/\s]+$/.test(repository)) {
255
+ throw new Error(`invalid --repo '${repository}' (expected owner/repo)`);
256
+ }
257
+ const templatesRoot = options.templatesRoot ?? (await resolveTemplatesRoot());
258
+ const templatePath = join(templatesRoot, "routines", "watch.yaml.tmpl");
259
+ if (!(await pathExists(templatePath))) {
260
+ throw new Error(`bundled template not found: ${templatePath}`);
261
+ }
262
+ const template = await readFile(templatePath, "utf8");
263
+ const hosts = await collectSourceHosts(cwd, (m) => warn(`routine generate watch: ${m}`));
264
+ const rendered = renderWatchRoutineTemplate(template, {
265
+ name,
266
+ repository,
267
+ cron,
268
+ timezone,
269
+ model,
270
+ networkAccessBlock: renderNetworkAccessBlock(hosts),
271
+ });
272
+ const destAbs = isAbsolute(output) ? output : join(cwd, output);
273
+ const destRel = isAbsolute(output) ? relative(cwd, output) : output;
274
+ if ((await pathExists(destAbs)) && !force) {
275
+ throw new Error(`output file already exists: ${destRel} (use --force to overwrite)`);
276
+ }
277
+ if ((await pathExists(destAbs)) && force) {
278
+ warn(`routine generate watch: overwriting existing file ${destRel}`);
279
+ }
280
+ await mkdir(dirname(destAbs), { recursive: true });
281
+ await writeFile(destAbs, rendered, "utf8");
282
+ log(`routine generate watch: wrote ${destRel}`);
283
+ log(`routine generate watch: name='${name}', repo='${repository}', cron='${cron}', model='${model}'`);
284
+ log("");
285
+ log("Routines has no declarative apply API — paste this routine into the Web UI by hand:");
286
+ log(" 1. Open https://claude.ai/code/routines and click New routine.");
287
+ log(" 2. Fill the form fields from the YAML (Name / Model / Repositories / Trigger / Permissions).");
288
+ log(" 3. For the multi-line Instructions and Setup script fields, extract them with yq:");
289
+ log(` yq -r '.instructions' ${destRel}`);
290
+ log(` yq -r '.environment.setup_script' ${destRel}`);
291
+ log(" 4. After registering, copy the issued routine_id (trig_xxxx) back into the YAML and set status: active.");
292
+ log("");
293
+ log("Or apply the schedule from the CLI with /schedule, e.g.:");
294
+ log(` /schedule create --name '${name}' --cron '${cron}' --repo '${repository}'`);
295
+ log("");
296
+ log("Output gate (ADR-0020 D3a): this routine writes to a claude/* branch / PR only — never main directly.");
297
+ return { outputPath: destRel };
298
+ }
299
+ /**
300
+ * Parse `routine generate watch` flags.
301
+ *
302
+ * `--output` defaults to `.claude/routines/<name>.yaml`, so it is resolved
303
+ * AFTER the loop once `--name` is known (a `--output` flag, if given, wins).
304
+ */
305
+ export function parseGenerateWatchRoutineArgs(args) {
306
+ let name = "feedradar-watch";
307
+ let repository = "<owner>/<repo>";
308
+ let cron = "0 * * * *"; // hourly — the Routines minimum interval.
309
+ let timezone = "UTC";
310
+ let model = "claude-sonnet-4-6";
311
+ let output;
312
+ let force = false;
313
+ let help = false;
314
+ for (let i = 0; i < args.length; i++) {
315
+ const a = args[i];
316
+ if (a === "-h" || a === "--help") {
317
+ help = true;
318
+ continue;
319
+ }
320
+ if (a === "--name") {
321
+ const value = args[++i];
322
+ if (value === undefined)
323
+ throw new Error(`option ${a} requires a value`);
324
+ name = value;
325
+ continue;
326
+ }
327
+ if (a === "--repo" || a === "--repository") {
328
+ const value = args[++i];
329
+ if (value === undefined)
330
+ throw new Error(`option ${a} requires a value`);
331
+ repository = value;
332
+ continue;
333
+ }
334
+ if (a === "--cron") {
335
+ const value = args[++i];
336
+ if (value === undefined)
337
+ throw new Error(`option ${a} requires a value`);
338
+ cron = value;
339
+ continue;
340
+ }
341
+ if (a === "--timezone" || a === "--tz") {
342
+ const value = args[++i];
343
+ if (value === undefined)
344
+ throw new Error(`option ${a} requires a value`);
345
+ timezone = value;
346
+ continue;
347
+ }
348
+ if (a === "--model") {
349
+ const value = args[++i];
350
+ if (value === undefined)
351
+ throw new Error(`option ${a} requires a value`);
352
+ if (!SUPPORTED_MODELS.includes(value)) {
353
+ throw new Error(`option --model expects one of: ${SUPPORTED_MODELS.join(" | ")}, got '${value}'`);
354
+ }
355
+ model = value;
356
+ continue;
357
+ }
358
+ if (a === "--output") {
359
+ const value = args[++i];
360
+ if (value === undefined)
361
+ throw new Error(`option ${a} requires a value`);
362
+ output = value;
363
+ continue;
364
+ }
365
+ if (a === "--force" || a === "-f") {
366
+ force = true;
367
+ continue;
368
+ }
369
+ if (a?.startsWith("--") || a?.startsWith("-")) {
370
+ throw new Error(`unknown option: ${a}`);
371
+ }
372
+ throw new Error(`unexpected positional argument: ${a}`);
373
+ }
374
+ return {
375
+ name,
376
+ repository,
377
+ cron,
378
+ timezone,
379
+ model,
380
+ output: output ?? join(".claude", "routines", `${name}.yaml`),
381
+ force,
382
+ help,
383
+ };
384
+ }
385
+ export function printGenerateWatchRoutineHelp(log) {
386
+ log("Usage: radar routine generate watch [options]");
387
+ log("");
388
+ log("Generates a Claude Code Routine YAML that runs `radar watch run` on a schedule");
389
+ log("and commits detected items/state to a claude/* branch (ADR-0020 D5 `watch`).");
390
+ log("The routine completes in one Claude session — it does NOT spawn other agents.");
391
+ log("");
392
+ log("Options:");
393
+ log(' --name <name> Routine name (default: "feedradar-watch")');
394
+ log(" Also the default output filename.");
395
+ log(" --repo <owner/repo> Target repository (default: <owner>/<repo>)");
396
+ log(' --cron <expression> 5-field cron, min interval 1 HOUR (default: "0 * * * *")');
397
+ log(' Sub-hourly (e.g. "*/5 * * * *") is rejected.');
398
+ log(' --timezone <tz> Schedule timezone (default: "UTC")');
399
+ log(` --model <name> ${SUPPORTED_MODELS.join(" | ")}`);
400
+ log(" (default: claude-sonnet-4-6)");
401
+ log(" --output <path> Output file under .claude/routines/");
402
+ log(" (default: .claude/routines/<name>.yaml)");
403
+ log(" --force, -f Overwrite existing output file");
404
+ }
405
+ /**
406
+ * Entry point invoked by `runRoutine` (in `src/cli/routine.ts`) when the user
407
+ * types `radar routine generate watch`. Translates parsed flags into
408
+ * `generateWatchRoutine` arguments and surfaces validation errors with the
409
+ * `routine generate watch:` prefix to match the rest of the CLI.
410
+ */
411
+ export async function runGenerateWatchRoutine(args, io = {}, cwd = process.cwd()) {
412
+ const log = io.log ?? ((m) => console.log(m));
413
+ const error = io.error ?? ((m) => console.error(m));
414
+ let parsed;
415
+ try {
416
+ parsed = parseGenerateWatchRoutineArgs(args);
417
+ }
418
+ catch (e) {
419
+ error(`routine generate watch: ${e instanceof Error ? e.message : String(e)}`);
420
+ return 2;
421
+ }
422
+ if (parsed.help) {
423
+ printGenerateWatchRoutineHelp(log);
424
+ return 0;
425
+ }
426
+ try {
427
+ await generateWatchRoutine({
428
+ cwd,
429
+ name: parsed.name,
430
+ repository: parsed.repository,
431
+ cron: parsed.cron,
432
+ timezone: parsed.timezone,
433
+ model: parsed.model,
434
+ output: parsed.output,
435
+ force: parsed.force,
436
+ io,
437
+ });
438
+ return 0;
439
+ }
440
+ catch (e) {
441
+ error(`routine generate watch: ${e instanceof Error ? e.message : String(e)}`);
442
+ return 1;
443
+ }
444
+ }
445
+ //# sourceMappingURL=generate-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-watch.js","sourceRoot":"","sources":["../../../src/cli/routine/generate-watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Command } from "./index.js";
2
+ /**
3
+ * Sinks for the `routine` command family's user-facing output. Each `<type>`
4
+ * subcommand receives an `IO` object so tests can capture lines without
5
+ * spawning the full CLI; the real CLI binds these to `console.*`.
6
+ */
7
+ export interface RoutineIO {
8
+ log?: (message: string) => void;
9
+ warn?: (message: string) => void;
10
+ error?: (message: string) => void;
11
+ }
12
+ export interface RoutineCommandOptions {
13
+ /** Workspace root (defaults to `process.cwd()` for the real CLI). */
14
+ cwd?: string;
15
+ io?: RoutineIO;
16
+ }
17
+ /**
18
+ * Dispatcher for `radar routine <subcommand>`.
19
+ *
20
+ * Parallels `runWorkflow` in `src/cli/workflow.ts` (GitHub Actions side): the
21
+ * `workflow` namespace targets GHA (spawn + API key), while `routine` targets
22
+ * Claude Routines (self-session, no spawn). See ADR-0020 D1 for the namespace
23
+ * split and D5 for the `<type>` roster (`watch` for detection only; `pipeline`
24
+ * for the full watch -> triage -> research -> review self-session chain).
25
+ *
26
+ * Subcommands: `generate <type>` emits the source-of-truth YAML; `fire
27
+ * <trig_id>` triggers an already-registered routine from the outside via the
28
+ * `/fire` API (ADR-0020 §「外部からの起動」).
29
+ */
30
+ export declare function runRoutine(args: string[], options?: RoutineCommandOptions): Promise<number>;
31
+ export declare const routineCommand: Command;
32
+ //# sourceMappingURL=routine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routine.d.ts","sourceRoot":"","sources":["../../src/cli/routine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAK1C;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,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,qBAAqB;IACpC,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AA2BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED,eAAO,MAAM,cAAc,EAAE,OAI5B,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { runFireRoutine } from "./routine/fire.js";
2
+ import { runGeneratePipelineRoutine } from "./routine/generate-pipeline.js";
3
+ import { runGenerateWatchRoutine } from "./routine/generate-watch.js";
4
+ function printRoutineHelp(log) {
5
+ log("Usage: radar routine <subcommand> [...]");
6
+ log("");
7
+ log("Subcommands:");
8
+ log(" generate <type> Generate a Claude Code Routine YAML (.claude/routines/)");
9
+ log(" Types: watch | pipeline");
10
+ log(" fire <trig_id> Trigger a registered routine from the outside (/fire API)");
11
+ log("");
12
+ log("Run `radar routine <subcommand> --help` for subcommand-specific options.");
13
+ }
14
+ function printGenerateHelp(log) {
15
+ log("Usage: radar routine generate <type> [options]");
16
+ log("");
17
+ log("Types:");
18
+ log(" watch Periodic `radar watch run` self-session routine; commits items/state to a claude/* branch (ADR-0020 D5)");
19
+ log(" pipeline Full watch -> triage -> research -> review self-session routine, one item at a time (ADR-0020 D5)");
20
+ log("");
21
+ log("Run `radar routine generate <type> --help` for type-specific options.");
22
+ }
23
+ /**
24
+ * Dispatcher for `radar routine <subcommand>`.
25
+ *
26
+ * Parallels `runWorkflow` in `src/cli/workflow.ts` (GitHub Actions side): the
27
+ * `workflow` namespace targets GHA (spawn + API key), while `routine` targets
28
+ * Claude Routines (self-session, no spawn). See ADR-0020 D1 for the namespace
29
+ * split and D5 for the `<type>` roster (`watch` for detection only; `pipeline`
30
+ * for the full watch -> triage -> research -> review self-session chain).
31
+ *
32
+ * Subcommands: `generate <type>` emits the source-of-truth YAML; `fire
33
+ * <trig_id>` triggers an already-registered routine from the outside via the
34
+ * `/fire` API (ADR-0020 §「外部からの起動」).
35
+ */
36
+ export async function runRoutine(args, options = {}) {
37
+ const cwd = options.cwd ?? process.cwd();
38
+ const log = options.io?.log ?? ((m) => console.log(m));
39
+ const error = options.io?.error ?? ((m) => console.error(m));
40
+ const [sub, ...rest] = args;
41
+ if (!sub || sub === "-h" || sub === "--help" || sub === "help") {
42
+ printRoutineHelp(log);
43
+ return sub ? 0 : 2;
44
+ }
45
+ if (sub === "fire") {
46
+ return runFireRoutine(rest, options.io ?? {});
47
+ }
48
+ if (sub !== "generate") {
49
+ error(`routine: unknown subcommand '${sub}'`);
50
+ printRoutineHelp(error);
51
+ return 2;
52
+ }
53
+ const [type, ...typeArgs] = rest;
54
+ if (!type || type === "-h" || type === "--help" || type === "help") {
55
+ printGenerateHelp(log);
56
+ return type ? 0 : 2;
57
+ }
58
+ switch (type) {
59
+ case "watch":
60
+ return runGenerateWatchRoutine(typeArgs, options.io ?? {}, cwd);
61
+ case "pipeline":
62
+ return runGeneratePipelineRoutine(typeArgs, options.io ?? {}, cwd);
63
+ default:
64
+ error(`routine generate: unknown type '${type}'`);
65
+ printGenerateHelp(error);
66
+ return 2;
67
+ }
68
+ }
69
+ export const routineCommand = {
70
+ name: "routine",
71
+ summary: "Manage Claude Code Routines (generate <type> / fire <trig_id>)",
72
+ run: (args) => runRoutine(args),
73
+ };
74
+ //# sourceMappingURL=routine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routine.js","sourceRoot":"","sources":["../../src/cli/routine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/cli/triage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/cli/triage.ts"],"names":[],"mappings":"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"}