@lore-co/cli 0.1.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 (55) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +218 -0
  3. package/dist/cli.d.ts +28 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +792 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/devin-client.d.ts +63 -0
  8. package/dist/devin-client.d.ts.map +1 -0
  9. package/dist/devin-client.js +231 -0
  10. package/dist/devin-client.js.map +1 -0
  11. package/dist/devin.d.ts +2 -0
  12. package/dist/devin.d.ts.map +1 -0
  13. package/dist/devin.js +479 -0
  14. package/dist/devin.js.map +1 -0
  15. package/dist/generated-assets.d.ts +7 -0
  16. package/dist/generated-assets.d.ts.map +1 -0
  17. package/dist/generated-assets.js +8 -0
  18. package/dist/generated-assets.js.map +1 -0
  19. package/dist/github.d.ts +13 -0
  20. package/dist/github.d.ts.map +1 -0
  21. package/dist/github.js +559 -0
  22. package/dist/github.js.map +1 -0
  23. package/dist/host.d.ts +24 -0
  24. package/dist/host.d.ts.map +1 -0
  25. package/dist/host.js +337 -0
  26. package/dist/host.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/main.d.ts +2 -0
  32. package/dist/main.d.ts.map +1 -0
  33. package/dist/main.js +10 -0
  34. package/dist/main.js.map +1 -0
  35. package/dist/repository.d.ts +3 -0
  36. package/dist/repository.d.ts.map +1 -0
  37. package/dist/repository.js +60 -0
  38. package/dist/repository.js.map +1 -0
  39. package/dist/review-output.d.ts +59 -0
  40. package/dist/review-output.d.ts.map +1 -0
  41. package/dist/review-output.js +112 -0
  42. package/dist/review-output.js.map +1 -0
  43. package/dist/runtime.d.ts +63 -0
  44. package/dist/runtime.d.ts.map +1 -0
  45. package/dist/runtime.js +612 -0
  46. package/dist/runtime.js.map +1 -0
  47. package/dist/update.d.ts +2 -0
  48. package/dist/update.d.ts.map +1 -0
  49. package/dist/update.js +97 -0
  50. package/dist/update.js.map +1 -0
  51. package/dist/version.d.ts +3 -0
  52. package/dist/version.d.ts.map +1 -0
  53. package/dist/version.js +6 -0
  54. package/dist/version.js.map +1 -0
  55. package/package.json +47 -0
package/dist/devin.js ADDED
@@ -0,0 +1,479 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { z } from "zod";
5
+ import { getLorePaths } from "./cli.js";
6
+ import { DevinApiClient, } from "./devin-client.js";
7
+ import { REVIEW_OUTPUT_SCHEMA, validateReviewOutput, } from "./review-output.js";
8
+ const RegistrationResponseSchema = z.object({
9
+ registered: z.literal(true),
10
+ sessionId: z.string().min(1),
11
+ status: z.literal("active"),
12
+ });
13
+ const ContextDeliveryResponseSchema = z
14
+ .object({
15
+ context: z.string(),
16
+ event: z
17
+ .object({
18
+ id: z.string().min(1),
19
+ externalEventId: z.string().min(1),
20
+ })
21
+ .passthrough(),
22
+ receipt: z
23
+ .object({
24
+ id: z.string().min(1),
25
+ eventId: z.string().min(1),
26
+ })
27
+ .passthrough(),
28
+ })
29
+ .passthrough();
30
+ const DEVIN_CONTEXT_DELIMITERS = {
31
+ start: "<<< RELEVANT ENGINEERING KNOWLEDGE >>>",
32
+ end: "<<< END RELEVANT ENGINEERING KNOWLEDGE >>>",
33
+ };
34
+ const MAX_PROMPT_BYTES = 1024 * 1024;
35
+ const DEVIN_FLAG_VALUES = {
36
+ start: new Set([
37
+ "--repo",
38
+ "--prompt",
39
+ "--prompt-file",
40
+ "--task",
41
+ "--title",
42
+ "--project",
43
+ "--user-id",
44
+ "--max-acu",
45
+ ]),
46
+ prompt: new Set([
47
+ "--session",
48
+ "--repo",
49
+ "--prompt",
50
+ "--prompt-file",
51
+ "--project",
52
+ "--message-as-user-id",
53
+ ]),
54
+ status: new Set(["--session"]),
55
+ terminate: new Set(["--session"]),
56
+ "run-review": new Set(["--prompt", "--metadata", "--output"]),
57
+ };
58
+ const DEVIN_HELP = `lore devin
59
+ Start and manage Lore-enabled Devin sessions.
60
+
61
+ Usage:
62
+ lore devin setup
63
+ lore devin start --repo <owner/repo> --prompt <text> [options]
64
+ lore devin prompt --session <devin-id> --repo <owner/repo> --prompt <text> [options]
65
+ lore devin status --session <devin-id>
66
+ lore devin terminate --session <devin-id>
67
+
68
+ Discover:
69
+ lore devin start --help
70
+ lore devin prompt --help
71
+
72
+ Examples:
73
+ lore devin setup
74
+ lore devin start --repo owner/repo --prompt "Fix the failing tests" --max-acu 2
75
+ lore devin prompt --session devin-id --repo owner/repo --prompt "Apply the review correction"
76
+ `;
77
+ const START_HELP = `lore devin start
78
+ Create a Devin session with audited Lore context and transcript polling.
79
+
80
+ Usage:
81
+ lore devin start --repo <owner/repo> (--prompt <text> | --prompt-file <path> | --stdin) [options]
82
+
83
+ Options:
84
+ --repo <owner/repo> Repository available to the Devin session
85
+ --prompt <text> Task prompt
86
+ --prompt-file <path> Read the task prompt from a file
87
+ --stdin Read the task prompt from standard input
88
+ --task <summary> Retrieval summary (defaults to the prompt)
89
+ --title <title> Devin session title
90
+ --project <name> Optional Lore project scope
91
+ --user-id <id> Create the session as this Devin user
92
+ --max-acu <count> Hard session budget (default: 2)
93
+ --help Show this command's help
94
+
95
+ Credentials:
96
+ DEVIN_API_KEY and DEVIN_ORG_ID are required. Lore uses LORE_API_URL and
97
+ LORE_WORKSPACE_TOKEN (or the stored ~/.lore configuration).
98
+
99
+ Examples:
100
+ lore devin start --repo owner/repo --prompt "Fix the failing tests" --max-acu 2
101
+ lore devin start --repo owner/repo --prompt-file ./task.md --project payments
102
+ printf '%s\\n' "Fix the failing tests" | lore devin start --repo owner/repo --stdin
103
+ `;
104
+ const PROMPT_HELP = `lore devin prompt
105
+ Send a later prompt through audited Lore enrichment and re-register polling.
106
+
107
+ Usage:
108
+ lore devin prompt --session <devin-id> --repo <owner/repo> (--prompt <text> | --prompt-file <path> | --stdin) [options]
109
+
110
+ Options:
111
+ --session <devin-id> Existing Devin session ID
112
+ --repo <owner/repo> Repository used for Lore retrieval and polling
113
+ --prompt <text> User prompt to send
114
+ --prompt-file <path> Read the prompt from a file
115
+ --stdin Read the prompt from standard input
116
+ --project <name> Optional Lore project scope
117
+ --message-as-user-id <id> Send as this Devin user
118
+ --help Show this command's help
119
+
120
+ Credentials:
121
+ DEVIN_API_KEY and DEVIN_ORG_ID are required. Lore uses LORE_API_URL and
122
+ LORE_WORKSPACE_TOKEN (or the stored ~/.lore configuration). Credentials are
123
+ never accepted as command arguments.
124
+
125
+ Examples:
126
+ lore devin prompt --session devin-id --repo owner/repo --prompt "Apply the review correction"
127
+ lore devin prompt --session devin-id --repo owner/repo --prompt-file ./correction.md --project payments
128
+ printf '%s\\n' "Apply the correction" | lore devin prompt --session devin-id --repo owner/repo --stdin
129
+ `;
130
+ function required(value, name) {
131
+ if (value === undefined || value.trim() === "") {
132
+ throw new Error(`${name} is required`);
133
+ }
134
+ return value.trim();
135
+ }
136
+ function integerFlag(value, fallback, minimum, maximum, name) {
137
+ const resolved = value === undefined ? fallback : Number(value);
138
+ if (!Number.isInteger(resolved) ||
139
+ resolved < minimum ||
140
+ resolved > maximum) {
141
+ throw new Error(`${name} must be an integer from ${minimum} to ${maximum}`);
142
+ }
143
+ return resolved;
144
+ }
145
+ function parseFlags(args, command, booleanFlags = new Set()) {
146
+ const flags = new Map();
147
+ for (let index = 0; index < args.length; index += 1) {
148
+ const name = args[index];
149
+ if (name === undefined || !name.startsWith("--")) {
150
+ throw new Error(`Invalid lore devin ${command} option near ${name ?? ""}`);
151
+ }
152
+ if (flags.has(name)) {
153
+ throw new Error(`Duplicate Devin option: ${name}`);
154
+ }
155
+ if (booleanFlags.has(name)) {
156
+ flags.set(name, "true");
157
+ continue;
158
+ }
159
+ if (!DEVIN_FLAG_VALUES[command].has(name)) {
160
+ throw new Error(`Unknown lore devin ${command} option: ${name}`);
161
+ }
162
+ const value = args[index + 1];
163
+ if (value === undefined || value.startsWith("--")) {
164
+ throw new Error(`Missing value for ${name}`);
165
+ }
166
+ flags.set(name, value);
167
+ index += 1;
168
+ }
169
+ return flags;
170
+ }
171
+ function wantsHelp(args, help) {
172
+ if (!args.includes("--help") && !args.includes("-h")) {
173
+ return false;
174
+ }
175
+ process.stdout.write(help);
176
+ return true;
177
+ }
178
+ function devinClient() {
179
+ return new DevinApiClient({
180
+ apiKey: required(process.env.DEVIN_API_KEY, "DEVIN_API_KEY"),
181
+ organizationId: required(process.env.DEVIN_ORG_ID, "DEVIN_ORG_ID"),
182
+ timeoutMs: integerFlag(process.env.DEVIN_REQUEST_TIMEOUT_MS, 30_000, 1_000, 60_000, "DEVIN_REQUEST_TIMEOUT_MS"),
183
+ });
184
+ }
185
+ async function loreConnection() {
186
+ const environmentUrl = process.env.LORE_API_URL?.trim();
187
+ const environmentToken = (process.env.LORE_WORKSPACE_TOKEN ?? process.env.LORE_TOKEN)?.trim();
188
+ if (environmentUrl !== undefined && environmentUrl !== "") {
189
+ return {
190
+ apiUrl: environmentUrl.replace(/\/+$/u, ""),
191
+ token: required(environmentToken, "LORE_WORKSPACE_TOKEN"),
192
+ };
193
+ }
194
+ const parsed = JSON.parse(await readFile(getLorePaths().config, "utf8"));
195
+ return {
196
+ apiUrl: required(parsed.apiUrl, "Lore API URL").replace(/\/+$/u, ""),
197
+ token: required(parsed.token, "Lore workspace token"),
198
+ };
199
+ }
200
+ async function loreRequest(connection, path, body, schema) {
201
+ const response = await fetch(`${connection.apiUrl}${path}`, {
202
+ method: "POST",
203
+ headers: {
204
+ accept: "application/json",
205
+ authorization: `Bearer ${connection.token}`,
206
+ "content-type": "application/json",
207
+ },
208
+ body: JSON.stringify(body),
209
+ signal: AbortSignal.timeout(10_000),
210
+ });
211
+ if (!response.ok) {
212
+ const detail = (await response.text()).slice(0, 500);
213
+ throw new Error(`Lore API ${path} failed with HTTP ${response.status}: ${detail}`);
214
+ }
215
+ return schema.parse((await response.json()));
216
+ }
217
+ async function readPromptFromStdin() {
218
+ const chunks = [];
219
+ let totalBytes = 0;
220
+ for await (const chunk of process.stdin) {
221
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : Buffer.from(chunk);
222
+ totalBytes += buffer.byteLength;
223
+ if (totalBytes > MAX_PROMPT_BYTES) {
224
+ throw new Error(`Standard input exceeds ${MAX_PROMPT_BYTES} bytes`);
225
+ }
226
+ chunks.push(buffer);
227
+ }
228
+ return Buffer.concat(chunks, totalBytes).toString("utf8");
229
+ }
230
+ async function loadPrompt(flags, command) {
231
+ const direct = flags.get("--prompt");
232
+ const file = flags.get("--prompt-file");
233
+ const stdin = flags.has("--stdin");
234
+ const sourceCount = Number(direct !== undefined) +
235
+ Number(file !== undefined) +
236
+ Number(stdin);
237
+ if (sourceCount !== 1) {
238
+ throw new Error(`Provide exactly one of --prompt, --prompt-file, or --stdin.\nExample: lore devin ${command} ${command === "prompt" ? "--session <devin-id> " : ""}--repo owner/repo --prompt "Describe the task"`);
239
+ }
240
+ if (file !== undefined) {
241
+ return required(await readFile(resolve(file), "utf8"), "--prompt-file");
242
+ }
243
+ if (stdin) {
244
+ return required(await readPromptFromStdin(), "--stdin");
245
+ }
246
+ return required(direct, "--prompt");
247
+ }
248
+ function sha256(value) {
249
+ return createHash("sha256").update(value).digest("hex");
250
+ }
251
+ function deterministicUuid(value) {
252
+ const hex = sha256(value).split("");
253
+ hex[12] = "5";
254
+ hex[16] = ((Number.parseInt(hex[16] ?? "0", 16) & 0x3) | 0x8).toString(16);
255
+ const joined = hex.join("");
256
+ return [
257
+ joined.slice(0, 8),
258
+ joined.slice(8, 12),
259
+ joined.slice(12, 16),
260
+ joined.slice(16, 20),
261
+ joined.slice(20, 32),
262
+ ].join("-");
263
+ }
264
+ async function deliverLoreContext(connection, command, sessionId, repository, task, project) {
265
+ const retrievalTask = task.slice(0, 500);
266
+ const identity = [
267
+ "lore-devin-context",
268
+ command,
269
+ sessionId ?? "",
270
+ repository,
271
+ project ?? "",
272
+ retrievalTask,
273
+ ].join("\0");
274
+ const eventId = deterministicUuid(identity);
275
+ const deliverySessionId = sessionId ?? `lore-devin-start:${sha256(identity).slice(0, 32)}`;
276
+ const response = await loreRequest(connection, "/v1/context/deliveries", {
277
+ connector: "lore-devin-cli",
278
+ eventId,
279
+ sessionId: deliverySessionId,
280
+ task: {
281
+ agent: "devin",
282
+ task: retrievalTask,
283
+ scope: {
284
+ ...(project === undefined ? {} : { project }),
285
+ repo: repository,
286
+ },
287
+ },
288
+ }, ContextDeliveryResponseSchema);
289
+ if (response.event.externalEventId !== eventId) {
290
+ throw new Error("Lore context delivery returned a mismatched event identity");
291
+ }
292
+ if (response.receipt.eventId !== response.event.id) {
293
+ throw new Error("Lore context delivery returned a mismatched receipt");
294
+ }
295
+ return {
296
+ context: response.context.trim(),
297
+ receiptId: response.receipt.id,
298
+ };
299
+ }
300
+ function enrichDevinPrompt(prompt, context) {
301
+ const formatted = context.trim();
302
+ if (formatted === "") {
303
+ return prompt;
304
+ }
305
+ return [
306
+ DEVIN_CONTEXT_DELIMITERS.start,
307
+ formatted,
308
+ DEVIN_CONTEXT_DELIMITERS.end,
309
+ "",
310
+ prompt,
311
+ ].join("\n");
312
+ }
313
+ async function registerSession(connection, sessionId, repository, project) {
314
+ await loreRequest(connection, "/v1/connectors/devin/sessions", {
315
+ organizationId: required(process.env.DEVIN_ORG_ID, "DEVIN_ORG_ID"),
316
+ sessionId,
317
+ repo: repository,
318
+ ...(project === undefined ? {} : { project }),
319
+ }, RegistrationResponseSchema);
320
+ }
321
+ async function start(args) {
322
+ if (wantsHelp(args, START_HELP)) {
323
+ return;
324
+ }
325
+ const flags = parseFlags(args, "start", new Set(["--stdin"]));
326
+ const repository = required(flags.get("--repo"), "--repo");
327
+ const prompt = await loadPrompt(flags, "start");
328
+ const task = flags.get("--task")?.trim() || prompt;
329
+ const project = flags.get("--project")?.trim() || undefined;
330
+ const createAsUserId = flags.get("--user-id")?.trim() ||
331
+ process.env.DEVIN_CREATE_AS_USER_ID?.trim() ||
332
+ undefined;
333
+ const maxAcuLimit = integerFlag(flags.get("--max-acu") ?? process.env.DEVIN_MAX_ACU_LIMIT, 2, 1, 100, "--max-acu");
334
+ const client = devinClient();
335
+ const connection = await loreConnection();
336
+ const delivery = await deliverLoreContext(connection, "start", undefined, repository, task, project);
337
+ const enrichedPrompt = enrichDevinPrompt(prompt, delivery.context);
338
+ const createInput = {
339
+ prompt: enrichedPrompt,
340
+ repos: [repository],
341
+ title: flags.get("--title") ?? `Lore: ${task.slice(0, 80)}`,
342
+ tags: ["lore", "ambient-learning"],
343
+ maxAcuLimit,
344
+ ...(createAsUserId === undefined ? {} : { createAsUserId }),
345
+ resumable: true,
346
+ };
347
+ const session = await client.createSession(createInput);
348
+ try {
349
+ await registerSession(connection, session.session_id, repository, project);
350
+ }
351
+ catch (error) {
352
+ await client.archiveSession(session.session_id).catch(() => undefined);
353
+ throw error;
354
+ }
355
+ process.stdout.write(`${JSON.stringify({
356
+ sessionId: session.session_id,
357
+ url: session.url,
358
+ repository,
359
+ maxAcuLimit,
360
+ loreContextInjected: delivery.context !== "",
361
+ lorePollingRegistered: true,
362
+ loreDeliveryReceiptId: delivery.receiptId,
363
+ }, null, 2)}\n`);
364
+ }
365
+ async function prompt(args) {
366
+ if (wantsHelp(args, PROMPT_HELP)) {
367
+ return;
368
+ }
369
+ const flags = parseFlags(args, "prompt", new Set(["--stdin"]));
370
+ const sessionId = required(flags.get("--session"), "--session");
371
+ const repository = required(flags.get("--repo"), "--repo");
372
+ const userPrompt = await loadPrompt(flags, "prompt");
373
+ const project = flags.get("--project")?.trim() || undefined;
374
+ const messageAsUserId = flags.get("--message-as-user-id")?.trim() ||
375
+ process.env.DEVIN_MESSAGE_AS_USER_ID?.trim() ||
376
+ process.env.DEVIN_CREATE_AS_USER_ID?.trim() ||
377
+ undefined;
378
+ const client = devinClient();
379
+ const connection = await loreConnection();
380
+ const delivery = await deliverLoreContext(connection, "prompt", sessionId, repository, userPrompt, project);
381
+ await registerSession(connection, sessionId, repository, project);
382
+ await client.sendMessage(sessionId, enrichDevinPrompt(userPrompt, delivery.context), messageAsUserId);
383
+ process.stdout.write(`${JSON.stringify({
384
+ sessionId,
385
+ loreContextInjected: delivery.context !== "",
386
+ lorePollingRegistered: true,
387
+ sent: true,
388
+ loreDeliveryReceiptId: delivery.receiptId,
389
+ }, null, 2)}\n`);
390
+ }
391
+ async function setup() {
392
+ const client = devinClient();
393
+ await client.checkAccess();
394
+ const connection = await loreConnection();
395
+ const health = await fetch(`${connection.apiUrl}/health`, {
396
+ signal: AbortSignal.timeout(10_000),
397
+ });
398
+ if (!health.ok) {
399
+ throw new Error(`Lore health check failed with HTTP ${health.status}`);
400
+ }
401
+ process.stdout.write(`${JSON.stringify({
402
+ devin: "connected",
403
+ lore: "connected",
404
+ organizationId: client.organizationId,
405
+ }, null, 2)}\n`);
406
+ }
407
+ async function status(args) {
408
+ const flags = parseFlags(args, "status");
409
+ const session = await devinClient().getSession(required(flags.get("--session"), "--session"));
410
+ process.stdout.write(`${JSON.stringify(session, null, 2)}\n`);
411
+ }
412
+ async function runReview(args) {
413
+ const flags = parseFlags(args, "run-review");
414
+ const promptPath = resolve(required(flags.get("--prompt"), "--prompt"));
415
+ const metadataPath = resolve(required(flags.get("--metadata"), "--metadata"));
416
+ const outputPath = resolve(required(flags.get("--output"), "--output"));
417
+ const prompt = await readFile(promptPath, "utf8");
418
+ const metadata = JSON.parse(await readFile(metadataPath, "utf8"));
419
+ const client = devinClient();
420
+ const created = await client.createSession({
421
+ prompt,
422
+ title: `Lore review ${metadata.repository}#${metadata.prNumber}`,
423
+ tags: [
424
+ "lore",
425
+ "github-review",
426
+ `pr:${metadata.prNumber}`,
427
+ `sha:${metadata.headSha.slice(0, 12)}`,
428
+ ],
429
+ repos: [metadata.repository],
430
+ maxAcuLimit: integerFlag(process.env.DEVIN_REVIEW_MAX_ACU_LIMIT, 2, 1, 100, "DEVIN_REVIEW_MAX_ACU_LIMIT"),
431
+ resumable: false,
432
+ structuredOutputRequired: true,
433
+ structuredOutputSchema: REVIEW_OUTPUT_SCHEMA,
434
+ });
435
+ metadata.sessionId = created.session_id;
436
+ await writeFile(metadataPath, `${JSON.stringify(metadata, null, 2)}\n`, "utf8");
437
+ try {
438
+ const completed = await client.waitForCompletion(created.session_id, integerFlag(process.env.LORE_DEVIN_TIMEOUT_MS, 30 * 60_000, 1_000, 60 * 60_000, "LORE_DEVIN_TIMEOUT_MS"));
439
+ const output = validateReviewOutput(completed.structured_output);
440
+ await writeFile(outputPath, `${JSON.stringify(output, null, 2)}\n`, "utf8");
441
+ }
442
+ finally {
443
+ await client.archiveSession(created.session_id).catch(() => undefined);
444
+ }
445
+ }
446
+ async function terminate(args) {
447
+ const flags = parseFlags(args, "terminate");
448
+ await devinClient().archiveSession(required(flags.get("--session"), "--session"));
449
+ }
450
+ export async function runDevinCommand(args) {
451
+ switch (args[0]) {
452
+ case "--help":
453
+ case "-h":
454
+ case undefined:
455
+ process.stdout.write(DEVIN_HELP);
456
+ return;
457
+ case "setup":
458
+ await setup();
459
+ return;
460
+ case "start":
461
+ await start(args.slice(1));
462
+ return;
463
+ case "prompt":
464
+ await prompt(args.slice(1));
465
+ return;
466
+ case "status":
467
+ await status(args.slice(1));
468
+ return;
469
+ case "run-review":
470
+ await runReview(args.slice(1));
471
+ return;
472
+ case "terminate":
473
+ await terminate(args.slice(1));
474
+ return;
475
+ default:
476
+ throw new Error(`Unknown devin command: ${args[0] ?? ""}. Use setup, start, prompt, status, run-review, or terminate.`);
477
+ }
478
+ }
479
+ //# sourceMappingURL=devin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin.js","sourceRoot":"","sources":["../src/devin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const GITHUB_TEMPLATE_ASSETS: {
2
+ readonly "lore-codex-review.yml": "name: Lore Codex review\nrun-name: 'Lore Codex review [${{ github.event.action }}] PR #${{ github.event.pull_request.number }} @ ${{ github.event.pull_request.head.sha }}'\n\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review, labeled]\n\njobs:\n review:\n if: >-\n !github.event.pull_request.draft &&\n github.event.pull_request.head.repo.full_name == github.repository &&\n contains(github.event.pull_request.labels.*.name, 'lore:codex-review')\n runs-on: ubuntu-latest\n permissions:\n contents: read\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n outputs:\n final-message: ${{ steps.codex.outputs.final-message }}\n steps:\n - uses: actions/checkout@v5\n with:\n fetch-depth: 0\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - name: Prepare Lore review context\n env:\n LORE_API_URL: ${{ vars.LORE_API_URL }}\n LORE_WORKSPACE_TOKEN: ${{ secrets.LORE_WORKSPACE_TOKEN }}\n run: >-\n lore github prepare-review\n --provider codex\n --event \"$GITHUB_EVENT_PATH\"\n --checkout \"$GITHUB_WORKSPACE/review\"\n --prompt-out \"$GITHUB_WORKSPACE/.lore/codex-prompt.md\"\n --metadata-out \"$GITHUB_WORKSPACE/.lore/codex-metadata.json\"\n --schema-out \"$GITHUB_WORKSPACE/.lore/review-output.schema.json\"\n\n - uses: actions/upload-artifact@v4\n with:\n name: lore-codex-metadata\n path: .lore/codex-metadata.json\n retention-days: 1\n\n - name: Run Codex\n id: codex\n uses: openai/codex-action@52fe01ec70a42f454c9d2ebd47598f9fd6893d56 # v1\n with:\n openai-api-key: ${{ secrets.OPENAI_API_KEY }}\n prompt-file: .lore/codex-prompt.md\n output-schema-file: .lore/review-output.schema.json\n working-directory: review\n permission-profile: \":read-only\"\n safety-strategy: drop-sudo\n\n post:\n needs: review\n if: needs.review.outputs.final-message != ''\n runs-on: ubuntu-latest\n permissions:\n contents: read\n pull-requests: write\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n steps:\n - uses: actions/checkout@v5\n with:\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - uses: actions/download-artifact@v4\n with:\n name: lore-codex-metadata\n path: .lore\n\n - name: Save review output\n env:\n CODEX_REVIEW: ${{ needs.review.outputs.final-message }}\n run: |\n mkdir -p .lore\n printf '%s' \"$CODEX_REVIEW\" > .lore/codex-output.json\n\n - name: Post or update Lore review\n env:\n GH_TOKEN: ${{ github.token }}\n run: >-\n lore github post-review\n --metadata .lore/codex-metadata.json\n --output .lore/codex-output.json\n";
3
+ readonly "lore-devin-review.yml": "name: Lore Devin review\nrun-name: 'Lore Devin review [${{ github.event.action }}] PR #${{ github.event.pull_request.number }} @ ${{ github.event.pull_request.head.sha }}'\n\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review, labeled]\n\nconcurrency:\n group: lore-devin-review-${{ github.repository }}-${{ github.event.pull_request.number }}\n cancel-in-progress: true\n\njobs:\n review:\n if: >-\n !github.event.pull_request.draft &&\n github.event.pull_request.head.repo.full_name == github.repository &&\n contains(github.event.pull_request.labels.*.name, 'lore:devin-review')\n runs-on: ubuntu-latest\n permissions:\n contents: read\n pull-requests: write\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n steps:\n - uses: actions/checkout@v5\n with:\n fetch-depth: 0\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - name: Prepare Lore review context\n env:\n LORE_API_URL: ${{ vars.LORE_API_URL }}\n LORE_WORKSPACE_TOKEN: ${{ secrets.LORE_WORKSPACE_TOKEN }}\n run: >-\n lore github prepare-review\n --provider devin\n --event \"$GITHUB_EVENT_PATH\"\n --checkout \"$GITHUB_WORKSPACE/review\"\n --prompt-out \"$GITHUB_WORKSPACE/.lore/devin-prompt.md\"\n --metadata-out \"$GITHUB_WORKSPACE/.lore/devin-metadata.json\"\n\n - name: Run Lore-enriched Devin review\n env:\n DEVIN_API_KEY: ${{ secrets.DEVIN_API_KEY }}\n DEVIN_ORG_ID: ${{ vars.DEVIN_ORG_ID }}\n run: >-\n lore devin run-review\n --prompt .lore/devin-prompt.md\n --metadata .lore/devin-metadata.json\n --output .lore/devin-output.json\n\n - name: Post or update Lore review\n env:\n GH_TOKEN: ${{ github.token }}\n run: >-\n lore github post-review\n --metadata .lore/devin-metadata.json\n --output .lore/devin-output.json\n\n - name: Clean up Devin session\n if: always()\n continue-on-error: true\n env:\n DEVIN_API_KEY: ${{ secrets.DEVIN_API_KEY }}\n DEVIN_ORG_ID: ${{ vars.DEVIN_ORG_ID }}\n run: |\n SESSION_ID=\"$(jq -r '.sessionId // empty' .lore/devin-metadata.json 2>/dev/null || true)\"\n if [ -n \"$SESSION_ID\" ]; then\n lore devin terminate --session \"$SESSION_ID\"\n fi\n";
4
+ readonly "lore-observe-correction.yml": "name: Lore review correction\nrun-name: 'Lore review correction comment #${{ github.event.comment.id }}'\n\non:\n issue_comment:\n types: [created]\n\njobs:\n observe:\n if: >-\n github.event.issue.pull_request &&\n startsWith(github.event.comment.body, '/lore correct ')\n runs-on: ubuntu-latest\n permissions:\n contents: read\n issues: read\n pull-requests: read\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n steps:\n - uses: actions/checkout@v5\n with:\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - name: Teach Lore from an authorized correction\n env:\n GH_TOKEN: ${{ github.token }}\n LORE_API_URL: ${{ vars.LORE_API_URL }}\n LORE_WORKSPACE_TOKEN: ${{ secrets.LORE_WORKSPACE_TOKEN }}\n run: >-\n lore github observe-correction\n --event \"$GITHUB_EVENT_PATH\"\n";
5
+ readonly "review-output.schema.json": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"summary\", \"findings\"],\n \"properties\": {\n \"summary\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"findings\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"severity\", \"title\", \"body\", \"path\", \"line\"],\n \"properties\": {\n \"severity\": {\n \"enum\": [\"critical\", \"high\", \"medium\", \"low\"]\n },\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"body\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"path\": {\n \"type\": [\"string\", \"null\"],\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"line\": {\n \"type\": [\"integer\", \"null\"],\n \"minimum\": 1\n }\n }\n }\n }\n }\n}\n";
6
+ };
7
+ //# sourceMappingURL=generated-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-assets.d.ts","sourceRoot":"","sources":["../src/generated-assets.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB;;;;;CAKzB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Generated by scripts/generate-cli-assets.mjs. Do not edit directly.
2
+ export const GITHUB_TEMPLATE_ASSETS = {
3
+ "lore-codex-review.yml": "name: Lore Codex review\nrun-name: 'Lore Codex review [${{ github.event.action }}] PR #${{ github.event.pull_request.number }} @ ${{ github.event.pull_request.head.sha }}'\n\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review, labeled]\n\njobs:\n review:\n if: >-\n !github.event.pull_request.draft &&\n github.event.pull_request.head.repo.full_name == github.repository &&\n contains(github.event.pull_request.labels.*.name, 'lore:codex-review')\n runs-on: ubuntu-latest\n permissions:\n contents: read\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n outputs:\n final-message: ${{ steps.codex.outputs.final-message }}\n steps:\n - uses: actions/checkout@v5\n with:\n fetch-depth: 0\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - name: Prepare Lore review context\n env:\n LORE_API_URL: ${{ vars.LORE_API_URL }}\n LORE_WORKSPACE_TOKEN: ${{ secrets.LORE_WORKSPACE_TOKEN }}\n run: >-\n lore github prepare-review\n --provider codex\n --event \"$GITHUB_EVENT_PATH\"\n --checkout \"$GITHUB_WORKSPACE/review\"\n --prompt-out \"$GITHUB_WORKSPACE/.lore/codex-prompt.md\"\n --metadata-out \"$GITHUB_WORKSPACE/.lore/codex-metadata.json\"\n --schema-out \"$GITHUB_WORKSPACE/.lore/review-output.schema.json\"\n\n - uses: actions/upload-artifact@v4\n with:\n name: lore-codex-metadata\n path: .lore/codex-metadata.json\n retention-days: 1\n\n - name: Run Codex\n id: codex\n uses: openai/codex-action@52fe01ec70a42f454c9d2ebd47598f9fd6893d56 # v1\n with:\n openai-api-key: ${{ secrets.OPENAI_API_KEY }}\n prompt-file: .lore/codex-prompt.md\n output-schema-file: .lore/review-output.schema.json\n working-directory: review\n permission-profile: \":read-only\"\n safety-strategy: drop-sudo\n\n post:\n needs: review\n if: needs.review.outputs.final-message != ''\n runs-on: ubuntu-latest\n permissions:\n contents: read\n pull-requests: write\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n steps:\n - uses: actions/checkout@v5\n with:\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - uses: actions/download-artifact@v4\n with:\n name: lore-codex-metadata\n path: .lore\n\n - name: Save review output\n env:\n CODEX_REVIEW: ${{ needs.review.outputs.final-message }}\n run: |\n mkdir -p .lore\n printf '%s' \"$CODEX_REVIEW\" > .lore/codex-output.json\n\n - name: Post or update Lore review\n env:\n GH_TOKEN: ${{ github.token }}\n run: >-\n lore github post-review\n --metadata .lore/codex-metadata.json\n --output .lore/codex-output.json\n",
4
+ "lore-devin-review.yml": "name: Lore Devin review\nrun-name: 'Lore Devin review [${{ github.event.action }}] PR #${{ github.event.pull_request.number }} @ ${{ github.event.pull_request.head.sha }}'\n\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review, labeled]\n\nconcurrency:\n group: lore-devin-review-${{ github.repository }}-${{ github.event.pull_request.number }}\n cancel-in-progress: true\n\njobs:\n review:\n if: >-\n !github.event.pull_request.draft &&\n github.event.pull_request.head.repo.full_name == github.repository &&\n contains(github.event.pull_request.labels.*.name, 'lore:devin-review')\n runs-on: ubuntu-latest\n permissions:\n contents: read\n pull-requests: write\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n steps:\n - uses: actions/checkout@v5\n with:\n fetch-depth: 0\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - name: Prepare Lore review context\n env:\n LORE_API_URL: ${{ vars.LORE_API_URL }}\n LORE_WORKSPACE_TOKEN: ${{ secrets.LORE_WORKSPACE_TOKEN }}\n run: >-\n lore github prepare-review\n --provider devin\n --event \"$GITHUB_EVENT_PATH\"\n --checkout \"$GITHUB_WORKSPACE/review\"\n --prompt-out \"$GITHUB_WORKSPACE/.lore/devin-prompt.md\"\n --metadata-out \"$GITHUB_WORKSPACE/.lore/devin-metadata.json\"\n\n - name: Run Lore-enriched Devin review\n env:\n DEVIN_API_KEY: ${{ secrets.DEVIN_API_KEY }}\n DEVIN_ORG_ID: ${{ vars.DEVIN_ORG_ID }}\n run: >-\n lore devin run-review\n --prompt .lore/devin-prompt.md\n --metadata .lore/devin-metadata.json\n --output .lore/devin-output.json\n\n - name: Post or update Lore review\n env:\n GH_TOKEN: ${{ github.token }}\n run: >-\n lore github post-review\n --metadata .lore/devin-metadata.json\n --output .lore/devin-output.json\n\n - name: Clean up Devin session\n if: always()\n continue-on-error: true\n env:\n DEVIN_API_KEY: ${{ secrets.DEVIN_API_KEY }}\n DEVIN_ORG_ID: ${{ vars.DEVIN_ORG_ID }}\n run: |\n SESSION_ID=\"$(jq -r '.sessionId // empty' .lore/devin-metadata.json 2>/dev/null || true)\"\n if [ -n \"$SESSION_ID\" ]; then\n lore devin terminate --session \"$SESSION_ID\"\n fi\n",
5
+ "lore-observe-correction.yml": "name: Lore review correction\nrun-name: 'Lore review correction comment #${{ github.event.comment.id }}'\n\non:\n issue_comment:\n types: [created]\n\njobs:\n observe:\n if: >-\n github.event.issue.pull_request &&\n startsWith(github.event.comment.body, '/lore correct ')\n runs-on: ubuntu-latest\n permissions:\n contents: read\n issues: read\n pull-requests: read\n env:\n LORE_CLI_REPOSITORY: ${{ vars.LORE_CLI_REPOSITORY || 'treadiehq/lore' }}\n LORE_CLI_VERSION: ${{ vars.LORE_CLI_VERSION || 'v0.1.0' }}\n steps:\n - uses: actions/checkout@v5\n with:\n persist-credentials: false\n path: review\n\n - name: Install Lore CLI\n run: |\n export LORE_REPO=\"$LORE_CLI_REPOSITORY\"\n export LORE_VERSION=\"$LORE_CLI_VERSION\"\n export LORE_BIN_DIR=\"$RUNNER_TEMP/lore/bin\"\n curl -fsSL \"https://raw.githubusercontent.com/$LORE_CLI_REPOSITORY/$LORE_CLI_VERSION/scripts/install.sh\" | bash\n\n - name: Teach Lore from an authorized correction\n env:\n GH_TOKEN: ${{ github.token }}\n LORE_API_URL: ${{ vars.LORE_API_URL }}\n LORE_WORKSPACE_TOKEN: ${{ secrets.LORE_WORKSPACE_TOKEN }}\n run: >-\n lore github observe-correction\n --event \"$GITHUB_EVENT_PATH\"\n",
6
+ "review-output.schema.json": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"summary\", \"findings\"],\n \"properties\": {\n \"summary\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"findings\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"severity\", \"title\", \"body\", \"path\", \"line\"],\n \"properties\": {\n \"severity\": {\n \"enum\": [\"critical\", \"high\", \"medium\", \"low\"]\n },\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"body\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"path\": {\n \"type\": [\"string\", \"null\"],\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"line\": {\n \"type\": [\"integer\", \"null\"],\n \"minimum\": 1\n }\n }\n }\n }\n }\n}\n"
7
+ };
8
+ //# sourceMappingURL=generated-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-assets.js","sourceRoot":"","sources":["../src/generated-assets.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,uBAAuB,EAAE,owHAAowH;IAC7xH,uBAAuB,EAAE,q2FAAq2F;IAC93F,6BAA6B,EAAE,+0CAA+0C;IAC92C,2BAA2B,EAAE,+tCAA+tC;CACpvC,CAAC"}
@@ -0,0 +1,13 @@
1
+ type ReviewProvider = "codex" | "devin";
2
+ export interface ReviewIdentity {
3
+ provider: ReviewProvider;
4
+ repository: string;
5
+ prNumber: number;
6
+ headSha: string;
7
+ }
8
+ export declare function connectGithub(args: readonly string[]): Promise<void>;
9
+ export declare function runGithubCommand(args: readonly string[]): Promise<void>;
10
+ export declare function reviewEventKey(metadata: ReviewIdentity): string;
11
+ export declare function reviewMarker(metadata: ReviewIdentity): string;
12
+ export {};
13
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAeA,KAAK,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC;AA2BxC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAoqBD,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C1E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAM/D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAE7D"}