@ozzylabs/feedradar 0.1.6 → 0.1.8

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 (106) hide show
  1. package/README.md +2 -1
  2. package/dist/agents/_boundary.d.ts +74 -1
  3. package/dist/agents/_boundary.d.ts.map +1 -1
  4. package/dist/agents/_boundary.js +152 -0
  5. package/dist/agents/_boundary.js.map +1 -1
  6. package/dist/claude-skills/dismiss/SKILL.md +18 -12
  7. package/dist/claude-skills/research/SKILL.md +21 -1
  8. package/dist/claude-skills/review/SKILL.md +23 -1
  9. package/dist/claude-skills/update/SKILL.md +24 -2
  10. package/dist/cli/_commit-path.d.ts +33 -0
  11. package/dist/cli/_commit-path.d.ts.map +1 -0
  12. package/dist/cli/_commit-path.js +43 -0
  13. package/dist/cli/_commit-path.js.map +1 -0
  14. package/dist/cli/dismiss.d.ts +38 -7
  15. package/dist/cli/dismiss.d.ts.map +1 -1
  16. package/dist/cli/dismiss.js +239 -54
  17. package/dist/cli/dismiss.js.map +1 -1
  18. package/dist/cli/index.d.ts.map +1 -1
  19. package/dist/cli/index.js +7 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/items.d.ts +44 -0
  22. package/dist/cli/items.d.ts.map +1 -0
  23. package/dist/cli/items.js +288 -0
  24. package/dist/cli/items.js.map +1 -0
  25. package/dist/cli/research.d.ts +21 -0
  26. package/dist/cli/research.d.ts.map +1 -1
  27. package/dist/cli/research.js +360 -54
  28. package/dist/cli/research.js.map +1 -1
  29. package/dist/cli/review.d.ts +23 -0
  30. package/dist/cli/review.d.ts.map +1 -1
  31. package/dist/cli/review.js +462 -2
  32. package/dist/cli/review.js.map +1 -1
  33. package/dist/cli/source.d.ts.map +1 -1
  34. package/dist/cli/source.js +18 -0
  35. package/dist/cli/source.js.map +1 -1
  36. package/dist/cli/triage.d.ts +136 -0
  37. package/dist/cli/triage.d.ts.map +1 -0
  38. package/dist/cli/triage.js +1110 -0
  39. package/dist/cli/triage.js.map +1 -0
  40. package/dist/cli/undismiss.d.ts +30 -0
  41. package/dist/cli/undismiss.d.ts.map +1 -0
  42. package/dist/cli/undismiss.js +133 -0
  43. package/dist/cli/undismiss.js.map +1 -0
  44. package/dist/cli/update.d.ts.map +1 -1
  45. package/dist/cli/update.js +429 -141
  46. package/dist/cli/update.js.map +1 -1
  47. package/dist/cli/workflow/generate-combined-with-triage.d.ts +163 -0
  48. package/dist/cli/workflow/generate-combined-with-triage.d.ts.map +1 -0
  49. package/dist/cli/workflow/generate-combined-with-triage.js +582 -0
  50. package/dist/cli/workflow/generate-combined-with-triage.js.map +1 -0
  51. package/dist/cli/workflow.d.ts +6 -5
  52. package/dist/cli/workflow.d.ts.map +1 -1
  53. package/dist/cli/workflow.js +13 -8
  54. package/dist/cli/workflow.js.map +1 -1
  55. package/dist/core/feeds/json-api.d.ts +5 -2
  56. package/dist/core/feeds/json-api.d.ts.map +1 -1
  57. package/dist/core/feeds/json-api.js +99 -13
  58. package/dist/core/feeds/json-api.js.map +1 -1
  59. package/dist/core/feeds/types.d.ts +26 -0
  60. package/dist/core/feeds/types.d.ts.map +1 -1
  61. package/dist/core/recipes.d.ts.map +1 -1
  62. package/dist/core/recipes.js +6 -0
  63. package/dist/core/recipes.js.map +1 -1
  64. package/dist/core/transitions.d.ts +30 -0
  65. package/dist/core/transitions.d.ts.map +1 -0
  66. package/dist/core/transitions.js +103 -0
  67. package/dist/core/transitions.js.map +1 -0
  68. package/dist/core/triage/adapter.d.ts +80 -0
  69. package/dist/core/triage/adapter.d.ts.map +1 -0
  70. package/dist/core/triage/adapter.js +128 -0
  71. package/dist/core/triage/adapter.js.map +1 -0
  72. package/dist/core/triage/index.d.ts +105 -0
  73. package/dist/core/triage/index.d.ts.map +1 -0
  74. package/dist/core/triage/index.js +246 -0
  75. package/dist/core/triage/index.js.map +1 -0
  76. package/dist/core/triage/prompt.d.ts +30 -0
  77. package/dist/core/triage/prompt.d.ts.map +1 -0
  78. package/dist/core/triage/prompt.js +157 -0
  79. package/dist/core/triage/prompt.js.map +1 -0
  80. package/dist/core/triage/response.d.ts +114 -0
  81. package/dist/core/triage/response.d.ts.map +1 -0
  82. package/dist/core/triage/response.js +188 -0
  83. package/dist/core/triage/response.js.map +1 -0
  84. package/dist/gemini-commands/research.toml +1 -1
  85. package/dist/gemini-commands/review.toml +1 -1
  86. package/dist/gemini-commands/update.toml +1 -1
  87. package/dist/recipes/aws-whats-new.yaml +36 -1
  88. package/dist/recipes/dev-to.yaml +24 -0
  89. package/dist/schemas/item.d.ts +151 -5
  90. package/dist/schemas/item.d.ts.map +1 -1
  91. package/dist/schemas/item.js +164 -4
  92. package/dist/schemas/item.js.map +1 -1
  93. package/dist/schemas/recipe.d.ts +11 -1
  94. package/dist/schemas/recipe.d.ts.map +1 -1
  95. package/dist/schemas/recipe.js +10 -1
  96. package/dist/schemas/recipe.js.map +1 -1
  97. package/dist/schemas/source.d.ts +65 -4
  98. package/dist/schemas/source.d.ts.map +1 -1
  99. package/dist/schemas/source.js +65 -3
  100. package/dist/schemas/source.js.map +1 -1
  101. package/dist/skills/research/SKILL.md +57 -1
  102. package/dist/skills/review/SKILL.md +65 -1
  103. package/dist/skills/update/SKILL.md +54 -1
  104. package/dist/templates/agents/AGENTS.md +30 -0
  105. package/dist/templates/workflows/combined-with-triage.template.yaml.tmpl +132 -0
  106. package/package.json +1 -1
@@ -0,0 +1,288 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { loadItems } from "../core/items.js";
4
+ import { ItemStatusSchema } from "../schemas/index.js";
5
+ function parseIntFlag(flag, raw, min) {
6
+ if (raw === undefined)
7
+ throw new Error(`option ${flag} requires a value`);
8
+ const n = Number(raw);
9
+ if (!Number.isInteger(n) || n < min) {
10
+ throw new Error(`option ${flag} expects an integer >= ${min}, got '${raw}'`);
11
+ }
12
+ return n;
13
+ }
14
+ function parseListArgs(args) {
15
+ const out = {};
16
+ for (let i = 0; i < args.length; i++) {
17
+ const a = args[i];
18
+ if (a === "-h" || a === "--help") {
19
+ out.help = true;
20
+ continue;
21
+ }
22
+ if (a === "--status") {
23
+ const value = args[++i];
24
+ if (value === undefined)
25
+ throw new Error(`option ${a} requires a value`);
26
+ out.status = value;
27
+ continue;
28
+ }
29
+ if (a === "--source") {
30
+ const value = args[++i];
31
+ if (value === undefined)
32
+ throw new Error(`option ${a} requires a value`);
33
+ out.source = value;
34
+ continue;
35
+ }
36
+ if (a === "--triage-group") {
37
+ const value = args[++i];
38
+ if (value === undefined)
39
+ throw new Error(`option ${a} requires a value`);
40
+ out.triageGroup = value;
41
+ continue;
42
+ }
43
+ if (a === "--since") {
44
+ const value = args[++i];
45
+ if (value === undefined)
46
+ throw new Error(`option ${a} requires a value`);
47
+ out.since = value;
48
+ continue;
49
+ }
50
+ if (a === "--limit") {
51
+ out.limit = parseIntFlag(a, args[++i], 1);
52
+ continue;
53
+ }
54
+ if (a === "--json") {
55
+ out.json = true;
56
+ continue;
57
+ }
58
+ if (a === "--field") {
59
+ const value = args[++i];
60
+ if (value === undefined)
61
+ throw new Error(`option ${a} requires a value`);
62
+ out.field = value;
63
+ continue;
64
+ }
65
+ if (a?.startsWith("--")) {
66
+ throw new Error(`unknown option: ${a}`);
67
+ }
68
+ throw new Error(`unexpected positional argument: ${a}`);
69
+ }
70
+ return out;
71
+ }
72
+ function printListHelp(log) {
73
+ log("Usage: radar items list [filters] [output options]");
74
+ log("");
75
+ log("Filters:");
76
+ log(" --status <status> detected | triaged_research | triaged_digest |");
77
+ log(" triaged_unsure | researched | reviewed | dismissed");
78
+ log(" --source <id> limit to one source");
79
+ log(" --triage-group <name> items whose triage.group == <name>");
80
+ log(" (used by digest workflow)");
81
+ log(" --since <duration> drop items older than the cutoff (e.g. 7d, 24h)");
82
+ log(" --limit N cap result count");
83
+ log("");
84
+ log("Output options:");
85
+ log(" --json emit JSON array (one object per item)");
86
+ log(" --field <expr> emit one item field per row (e.g. id, sourceId,");
87
+ log(" triage.decision). Supports nested dot paths.");
88
+ }
89
+ function printItemsHelp(log) {
90
+ log("Usage: radar items <list> [...]");
91
+ log("");
92
+ log("Subcommands:");
93
+ log(" list [filters] List items matching the supplied filters");
94
+ }
95
+ async function pathExists(p) {
96
+ try {
97
+ await access(p);
98
+ return true;
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ /**
105
+ * Parse `Nd` / `Nh` / `Nm` / `Ns` cutoff strings to a `Date` representing
106
+ * the threshold (= now - duration). Returns `null` on unparsable input so
107
+ * the caller can surface a clear error.
108
+ */
109
+ function parseSinceCutoff(value, now = new Date()) {
110
+ const match = value.match(/^(\d+)([smhd])$/);
111
+ if (!match)
112
+ return null;
113
+ const n = Number(match[1]);
114
+ const unit = match[2];
115
+ const ms = unit === "s"
116
+ ? n * 1000
117
+ : unit === "m"
118
+ ? n * 60_000
119
+ : unit === "h"
120
+ ? n * 3_600_000
121
+ : n * 86_400_000;
122
+ return new Date(now.getTime() - ms);
123
+ }
124
+ /**
125
+ * Resolve a dot-path expression like `triage.decision` against an item.
126
+ * Used by `--field <expr>`. Missing intermediate fields return `undefined`
127
+ * (silently — the caller renders `-` for missing values).
128
+ */
129
+ function resolveField(item, expr) {
130
+ let current = item;
131
+ for (const part of expr.split(".")) {
132
+ if (current === undefined || current === null)
133
+ return undefined;
134
+ if (typeof current !== "object")
135
+ return undefined;
136
+ current = current[part];
137
+ }
138
+ return current;
139
+ }
140
+ function pad(value, width) {
141
+ if (value.length >= width)
142
+ return value.slice(0, width);
143
+ return value + " ".repeat(width - value.length);
144
+ }
145
+ function renderJsonValue(value) {
146
+ if (value === undefined || value === null)
147
+ return "-";
148
+ if (typeof value === "string")
149
+ return value;
150
+ return JSON.stringify(value);
151
+ }
152
+ /**
153
+ * Top-level dispatcher for `radar items <subcommand>`.
154
+ */
155
+ export async function runItems(args, options = {}) {
156
+ const log = options.io?.log ?? ((m) => console.log(m));
157
+ const error = options.io?.error ?? ((m) => console.error(m));
158
+ const [sub, ...rest] = args;
159
+ if (!sub || sub === "-h" || sub === "--help" || sub === "help") {
160
+ printItemsHelp(log);
161
+ return sub ? 0 : 2;
162
+ }
163
+ switch (sub) {
164
+ case "list":
165
+ return runItemsList(rest, options);
166
+ default:
167
+ error(`items: unknown subcommand '${sub}'`);
168
+ printItemsHelp(error);
169
+ return 2;
170
+ }
171
+ }
172
+ /**
173
+ * Implementation of `radar items list`.
174
+ */
175
+ export async function runItemsList(args, options = {}) {
176
+ const cwd = options.cwd ?? process.cwd();
177
+ const log = options.io?.log ?? ((m) => console.log(m));
178
+ const error = options.io?.error ?? ((m) => console.error(m));
179
+ let parsed;
180
+ try {
181
+ parsed = parseListArgs(args);
182
+ }
183
+ catch (e) {
184
+ error(`items list: ${e instanceof Error ? e.message : String(e)}`);
185
+ return 2;
186
+ }
187
+ if (parsed.help) {
188
+ printListHelp(log);
189
+ return 0;
190
+ }
191
+ // Validate --status against the schema enum early so typos like
192
+ // "triaged_reasearch" fail fast with a list of valid values.
193
+ let statusFilter;
194
+ if (parsed.status !== undefined) {
195
+ const v = ItemStatusSchema.safeParse(parsed.status);
196
+ if (!v.success) {
197
+ error(`items list: invalid --status '${parsed.status}' (expected: ${ItemStatusSchema.options.join(" | ")})`);
198
+ return 2;
199
+ }
200
+ statusFilter = v.data;
201
+ }
202
+ const itemsDir = join(cwd, "items");
203
+ if (!(await pathExists(itemsDir))) {
204
+ if (parsed.json) {
205
+ log("[]");
206
+ return 0;
207
+ }
208
+ log("items list: no items/ directory (run `radar init` first)");
209
+ return 0;
210
+ }
211
+ let items;
212
+ try {
213
+ items = await loadItems(itemsDir, parsed.source);
214
+ }
215
+ catch (e) {
216
+ error(`items list: ${e instanceof Error ? e.message : String(e)}`);
217
+ return 1;
218
+ }
219
+ // Apply filters in cheap-first order.
220
+ if (statusFilter) {
221
+ items = items.filter((i) => i.status === statusFilter);
222
+ }
223
+ if (parsed.triageGroup) {
224
+ items = items.filter((i) => i.triage?.group === parsed.triageGroup);
225
+ }
226
+ if (parsed.since) {
227
+ const cutoff = parseSinceCutoff(parsed.since);
228
+ if (!cutoff) {
229
+ error(`items list: invalid --since '${parsed.since}' (expected Ns | Nm | Nh | Nd)`);
230
+ return 2;
231
+ }
232
+ items = items.filter((i) => {
233
+ const ts = i.publishedAt ?? i.fetchedAt;
234
+ return new Date(ts) >= cutoff;
235
+ });
236
+ }
237
+ // Deterministic order: publishedAt desc (newest first), with fetchedAt as
238
+ // fallback and id as the final tie-breaker. Stable order matters for
239
+ // pipelines that diff the output across runs.
240
+ items.sort((a, b) => {
241
+ const aTs = a.publishedAt ?? a.fetchedAt;
242
+ const bTs = b.publishedAt ?? b.fetchedAt;
243
+ if (aTs !== bTs)
244
+ return bTs.localeCompare(aTs);
245
+ return a.id.localeCompare(b.id);
246
+ });
247
+ if (parsed.limit !== undefined && items.length > parsed.limit) {
248
+ items = items.slice(0, parsed.limit);
249
+ }
250
+ // Output dispatch.
251
+ if (parsed.field) {
252
+ for (const item of items) {
253
+ const v = resolveField(item, parsed.field);
254
+ log(renderJsonValue(v));
255
+ }
256
+ return 0;
257
+ }
258
+ if (parsed.json) {
259
+ log(JSON.stringify(items, null, 2));
260
+ return 0;
261
+ }
262
+ if (items.length === 0) {
263
+ log("items list: no items match the filter");
264
+ return 0;
265
+ }
266
+ // Default tabular output.
267
+ const headers = ["ID", "STATUS", "SOURCE", "PUBLISHED", "MATCHED", "TRIAGE"];
268
+ const rows = items.map((i) => [
269
+ i.id,
270
+ i.status,
271
+ i.sourceId,
272
+ i.publishedAt ?? i.fetchedAt,
273
+ i.matchedKeywords.join(",") || "-",
274
+ i.triage?.decision ?? "-",
275
+ ]);
276
+ const widths = headers.map((h, idx) => Math.max(h.length, ...rows.map((r) => (r[idx] ?? "").length)));
277
+ log(headers.map((h, idx) => pad(h, widths[idx] ?? 0)).join(" "));
278
+ for (const row of rows) {
279
+ log(row.map((c, idx) => pad(c, widths[idx] ?? 0)).join(" "));
280
+ }
281
+ return 0;
282
+ }
283
+ export const itemsCommand = {
284
+ name: "items",
285
+ summary: "Inspect items in the workspace (list | ...)",
286
+ run: (args) => runItems(args),
287
+ };
288
+ //# sourceMappingURL=items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../src/cli/items.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,27 @@ import type { Command } from "./index.js";
10
10
  * cap also applies when the YAML is hand-edited.
11
11
  */
12
12
  export declare const RESEARCH_BATCH_DEFAULT_MAX_ITEMS = 10;
13
+ /**
14
+ * Whitelist of `Item.status` values accepted by `radar research --batch
15
+ * --status <status>`.
16
+ *
17
+ * Constrained to the two "ready-to-research" statuses defined by the
18
+ * ADR-0008 / ADR-0018 state machine:
19
+ *
20
+ * - `detected` — legacy pre-triage path (`radar research` directly)
21
+ * - `triaged_research` — triage adapter promoted the item for research
22
+ * (ADR-0018 §W-B); workflow YAML generated by
23
+ * `radar workflow generate combined-with-triage`
24
+ * drives this branch (PR #249).
25
+ *
26
+ * Other statuses (`researched`, `reviewed`, `dismissed`, `triaged_digest`,
27
+ * `triaged_unsure`) are rejected with an explicit error rather than silently
28
+ * matching zero items, so a typo in scheduled YAML fails loud instead of
29
+ * decaying into a silent no-op (issue #250). `triaged_digest` requires
30
+ * `--digest` aggregation per group and is intentionally not a `--batch`
31
+ * single-item input; the workflow YAML walks groups explicitly.
32
+ */
33
+ export declare const RESEARCH_BATCH_ALLOWED_STATUSES: readonly ["detected", "triaged_research"];
13
34
  /** Sinks for the research command's user-facing output. Tests inject capturing sinks. */
14
35
  export interface ResearchIO {
15
36
  log?: (message: string) => void;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/cli/research.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAc5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,+BAA+B,2CAA4C,CAAC;AAGzF,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;AA01BD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CAmLjB;AAED,eAAO,MAAM,eAAe,EAAE,OAI7B,CAAC"}