loreforge 0.1.0-alpha.1

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/dist/cli/args.js +287 -0
  4. package/dist/cli/args.js.map +1 -0
  5. package/dist/cli/detect.js +94 -0
  6. package/dist/cli/detect.js.map +1 -0
  7. package/dist/cli/home.js +36 -0
  8. package/dist/cli/home.js.map +1 -0
  9. package/dist/cli/init.js +309 -0
  10. package/dist/cli/init.js.map +1 -0
  11. package/dist/cli/input.js +72 -0
  12. package/dist/cli/input.js.map +1 -0
  13. package/dist/cli/instructions.js +83 -0
  14. package/dist/cli/instructions.js.map +1 -0
  15. package/dist/cli/main.js +250 -0
  16. package/dist/cli/main.js.map +1 -0
  17. package/dist/cli/output.js +108 -0
  18. package/dist/cli/output.js.map +1 -0
  19. package/dist/context/render.js +297 -0
  20. package/dist/context/render.js.map +1 -0
  21. package/dist/core/contracts.js +49 -0
  22. package/dist/core/contracts.js.map +1 -0
  23. package/dist/core/dispatch.js +109 -0
  24. package/dist/core/dispatch.js.map +1 -0
  25. package/dist/core/errors.js +36 -0
  26. package/dist/core/errors.js.map +1 -0
  27. package/dist/core/index.js +40 -0
  28. package/dist/core/index.js.map +1 -0
  29. package/dist/core/operations/claims.js +91 -0
  30. package/dist/core/operations/claims.js.map +1 -0
  31. package/dist/core/operations/common.js +108 -0
  32. package/dist/core/operations/common.js.map +1 -0
  33. package/dist/core/operations/context.js +130 -0
  34. package/dist/core/operations/context.js.map +1 -0
  35. package/dist/core/operations/decisions.js +44 -0
  36. package/dist/core/operations/decisions.js.map +1 -0
  37. package/dist/core/operations/handoffs.js +147 -0
  38. package/dist/core/operations/handoffs.js.map +1 -0
  39. package/dist/core/operations/messages.js +117 -0
  40. package/dist/core/operations/messages.js.map +1 -0
  41. package/dist/core/operations/register.js +51 -0
  42. package/dist/core/operations/register.js.map +1 -0
  43. package/dist/core/operations/tasks.js +54 -0
  44. package/dist/core/operations/tasks.js.map +1 -0
  45. package/dist/core/schemas/common.js +81 -0
  46. package/dist/core/schemas/common.js.map +1 -0
  47. package/dist/core/schemas/context.js +10 -0
  48. package/dist/core/schemas/context.js.map +1 -0
  49. package/dist/core/schemas/decisions.js +11 -0
  50. package/dist/core/schemas/decisions.js.map +1 -0
  51. package/dist/core/schemas/handoffs.js +38 -0
  52. package/dist/core/schemas/handoffs.js.map +1 -0
  53. package/dist/core/schemas/questions.js +22 -0
  54. package/dist/core/schemas/questions.js.map +1 -0
  55. package/dist/core/schemas/registration.js +16 -0
  56. package/dist/core/schemas/registration.js.map +1 -0
  57. package/dist/core/schemas/request.js +103 -0
  58. package/dist/core/schemas/request.js.map +1 -0
  59. package/dist/core/schemas/tasks.js +35 -0
  60. package/dist/core/schemas/tasks.js.map +1 -0
  61. package/dist/evidence/git.js +119 -0
  62. package/dist/evidence/git.js.map +1 -0
  63. package/dist/integrations/index.js +32 -0
  64. package/dist/integrations/index.js.map +1 -0
  65. package/dist/storage/db.js +239 -0
  66. package/dist/storage/db.js.map +1 -0
  67. package/dist/storage/faults.js +12 -0
  68. package/dist/storage/faults.js.map +1 -0
  69. package/dist/storage/receipts.js +82 -0
  70. package/dist/storage/receipts.js.map +1 -0
  71. package/dist/storage/schema.js +119 -0
  72. package/dist/storage/schema.js.map +1 -0
  73. package/docs/integrations.md +71 -0
  74. package/docs/usage.md +405 -0
  75. package/package.json +54 -0
  76. package/templates/instructions.template.md +42 -0
  77. package/templates/session-rule.md +34 -0
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from "node:url";
3
+ import { z } from "zod";
4
+ import { openCore, CoreOpenError, parseRequest, validationDetails } from "../core/index.js";
5
+ import { parseCliArgs, CliValidationError, READ_OPERATIONS } from "./args.js";
6
+ import { readBoundedInput, CliInputError } from "./input.js";
7
+ import { handleSuccessOutput, handleErrorOutput } from "./output.js";
8
+ import { generateInstructions } from "./instructions.js";
9
+ import { resolveHomeDir, doesStateExist } from "./home.js";
10
+ import { resolveInitOptions, runInit } from "./init.js";
11
+ import { detectCodingClis } from "./detect.js";
12
+ import { homedir } from "node:os";
13
+ export function printHelp(stdout = process.stdout, topic) {
14
+ const helpText = (`Loreforge — shared memory for independent agents.
15
+
16
+ Usage:
17
+ lore context --input <file|-> [--home <dir>] [--json]
18
+ lore handoff --input <file|-> [--home <dir>] [--json]
19
+ lore ask --input <file|-> [--home <dir>] [--json]
20
+ lore inbox --input <file|-> [--home <dir>] [--json]
21
+ lore <namespace> <verb> --input <file|-> [--home <dir>] [--json]
22
+ lore instructions show --project <uuid> --agent <agent-id> [--home <dir>]
23
+ lore init [--agent id[:role]]... [--root <git>] [--name <name>] [--write-rules] [--write-user-rules] [--demo] [--detect|--no-detect] [--home <dir>] [--json]
24
+ lore detect [--json]
25
+ lore --help
26
+
27
+ Everyday:
28
+ context Retrieve formatted context (work or review mode)
29
+ handoff Submit a completed or blocked handoff with git evidence
30
+ ask Ask a task-linked question
31
+ inbox List inbox events for an agent
32
+
33
+ Other operations:
34
+ project register Register a git repository as a project
35
+ agent register Register an agent identity
36
+ task create Create a task
37
+ task get Retrieve task details
38
+ task list List tasks
39
+ task claim Acquire a 2-hour claim lease on an open task
40
+ task renew Extend an active claim lease
41
+ task release Release a claim back to open
42
+ task reopen Reopen a blocked task after questions are answered
43
+ task cancel Cancel a task
44
+ question answer Answer a pending question
45
+ decision record Record an architectural decision
46
+ instructions show Print generic session instruction template
47
+ init Register a repo and agents, optional sample tasks and session rules
48
+ detect List local coding CLIs (PATH + config dirs; does not read keys)
49
+
50
+ Options:
51
+ --input <file|-> Path to JSON envelope input file or '-' for stdin (max 64 KiB)
52
+ --home <dir> State directory (default: LOREFORGE_HOME or ~/.loreforge/context-v1)
53
+ --json Output exactly one JSON response line on stdout
54
+ --project <uuid> Project UUID (for instructions show)
55
+ --agent <id[:role]> Agent id, optional :implement|:review|:both (repeatable on init)
56
+ --root <dir> Git repository root (init)
57
+ --name <name> Project display name (init)
58
+ --write-rules Init: write repo AGENTS.md / .grok/rules (not ~/.grok)
59
+ --write-user-rules Init: also overwrite ~/.grok/rules and ~/.claude/rules
60
+ --demo Init: create two sample tasks
61
+ --detect / --no-detect Init: auto-fill agents from local CLIs (default: detect)
62
+ --help, -h Show this help message
63
+ `);
64
+ stdout.write(helpText);
65
+ }
66
+ /**
67
+ * Main programmatic CLI runner.
68
+ * Returns the process exit code.
69
+ */
70
+ export async function runCli(rawArgs, deps = {}) {
71
+ const stdout = deps.stdout ?? process.stdout;
72
+ const stderr = deps.stderr ?? process.stderr;
73
+ const stdin = deps.stdin ?? process.stdin;
74
+ const env = deps.env ?? process.env;
75
+ const openCoreImpl = deps.openCoreFn ?? openCore;
76
+ // 1. Parse CLI arguments
77
+ let parsed;
78
+ try {
79
+ parsed = parseCliArgs(rawArgs);
80
+ }
81
+ catch (err) {
82
+ if (err instanceof CliValidationError) {
83
+ return handleErrorOutput({ code: "VALIDATION", message: err.message }, rawArgs.includes("--json"), stdout, stderr);
84
+ }
85
+ return handleErrorOutput({ code: "INTERNAL", message: err instanceof Error ? err.message : "Argument parsing error" }, rawArgs.includes("--json"), stdout, stderr);
86
+ }
87
+ // 2. Handle Help
88
+ if (parsed.kind === "help") {
89
+ printHelp(stdout, parsed.topic);
90
+ return 0;
91
+ }
92
+ if (parsed.kind === "detect") {
93
+ const found = detectCodingClis({
94
+ path: env.PATH ?? "",
95
+ home: env.HOME || homedir(),
96
+ pathext: env.PATHEXT,
97
+ });
98
+ if (parsed.json) {
99
+ stdout.write(`${JSON.stringify({ schemaVersion: 1, ok: true, data: { clis: found } })}\n`);
100
+ }
101
+ else if (found.length === 0) {
102
+ stdout.write("No known coding CLIs found on PATH or in home config dirs.\n");
103
+ }
104
+ else {
105
+ stdout.write("Local CLIs (not a billing check; auth-file means a login file exists):\n");
106
+ for (const row of found) {
107
+ stdout.write(` ${row.id.padEnd(8)} ${row.evidence.join(", ")}\n`);
108
+ }
109
+ }
110
+ return 0;
111
+ }
112
+ if (parsed.kind === "init") {
113
+ try {
114
+ const resolved = await resolveInitOptions(parsed, stdin, stdout, env.PWD || process.cwd(), env);
115
+ const result = await runInit(resolved, env);
116
+ if (parsed.json) {
117
+ stdout.write(`${JSON.stringify({ schemaVersion: 1, ok: true, data: result })}\n`);
118
+ }
119
+ else {
120
+ stdout.write(`Project ${result.projectId}\nHome ${result.home}\n`);
121
+ stdout.write(`Agents ${result.agents.map((a) => `${a.id}:${a.role}`).join(", ")}\n`);
122
+ if (result.taskIds.length > 0)
123
+ stdout.write(`Demo tasks ${result.taskIds.join(", ")}\n`);
124
+ if (result.filesWritten.length > 0) {
125
+ stdout.write("Wrote:\n");
126
+ for (const file of result.filesWritten)
127
+ stdout.write(` ${file}\n`);
128
+ }
129
+ stdout.write("Open each CLI in the git repo and ask what's next. Do not paste a plan.\n");
130
+ }
131
+ return 0;
132
+ }
133
+ catch (err) {
134
+ if (err instanceof CliValidationError) {
135
+ return handleErrorOutput({ code: "VALIDATION", message: err.message }, parsed.json, stdout, stderr);
136
+ }
137
+ return handleErrorOutput({ code: "INTERNAL", message: err instanceof Error ? err.message : "Init failed" }, parsed.json, stdout, stderr);
138
+ }
139
+ }
140
+ // 3. Handle Instructions Show
141
+ if (parsed.kind === "instructions") {
142
+ try {
143
+ const homeDir = resolveHomeDir(parsed.home, env);
144
+ const text = generateInstructions({
145
+ projectId: parsed.projectId,
146
+ agentId: parsed.agentId,
147
+ homeDir
148
+ });
149
+ stdout.write(text + "\n");
150
+ return 0;
151
+ }
152
+ catch (err) {
153
+ if (err instanceof CliValidationError) {
154
+ return handleErrorOutput({ code: "VALIDATION", message: err.message }, false, stdout, stderr);
155
+ }
156
+ return handleErrorOutput({ code: "INTERNAL", message: err instanceof Error ? err.message : "Instructions error" }, false, stdout, stderr);
157
+ }
158
+ }
159
+ // 4. Handle Operation Command
160
+ const { operation, inputPath, home: explicitHome, json } = parsed;
161
+ const home = resolveHomeDir(explicitHome, env);
162
+ // 4a. Read bounded input (enforcing 64 KiB byte limit, UTF-8, JSON shape)
163
+ let rawPayload;
164
+ try {
165
+ rawPayload = await readBoundedInput(inputPath, stdin);
166
+ }
167
+ catch (err) {
168
+ if (err instanceof CliInputError) {
169
+ return handleErrorOutput({ code: err.code, message: err.message }, json, stdout, stderr);
170
+ }
171
+ return handleErrorOutput({ code: "IO", message: err instanceof Error ? err.message : "Input error" }, json, stdout, stderr);
172
+ }
173
+ // 4b. Pure validation via parseRequest before opening state
174
+ const candidateRequest = {
175
+ ...rawPayload,
176
+ operation
177
+ };
178
+ let request;
179
+ try {
180
+ request = parseRequest(candidateRequest);
181
+ }
182
+ catch (err) {
183
+ const details = err instanceof z.ZodError ? validationDetails(err) : undefined;
184
+ return handleErrorOutput({
185
+ code: "VALIDATION",
186
+ message: "Request validation failed: envelope or payload does not conform to schema",
187
+ details
188
+ }, json, stdout, stderr);
189
+ }
190
+ // 4c. Missing-state guard for read operations:
191
+ // Missing state on a read returns NOT_FOUND and must NOT create an empty DB.
192
+ if (READ_OPERATIONS.has(operation) && !doesStateExist(home)) {
193
+ return handleErrorOutput({
194
+ code: "NOT_FOUND",
195
+ message: `Database state does not exist at ${home}`
196
+ }, json, stdout, stderr);
197
+ }
198
+ // 4d. Open core
199
+ let core;
200
+ try {
201
+ core = openCoreImpl({ home });
202
+ }
203
+ catch (err) {
204
+ if (err instanceof CoreOpenError) {
205
+ return handleErrorOutput({ code: err.code, message: err.message }, json, stdout, stderr);
206
+ }
207
+ return handleErrorOutput({
208
+ code: "IO",
209
+ message: err instanceof Error ? err.message : "Failed to open state database"
210
+ }, json, stdout, stderr);
211
+ }
212
+ // 4e. Execute request
213
+ try {
214
+ const response = await core.execute(request);
215
+ if (response.ok) {
216
+ handleSuccessOutput(operation, response, json, stdout);
217
+ return 0;
218
+ }
219
+ else {
220
+ return handleErrorOutput(response.error, json, stdout, stderr);
221
+ }
222
+ }
223
+ catch (err) {
224
+ return handleErrorOutput({
225
+ code: "INTERNAL",
226
+ message: err instanceof Error ? err.message : "Unexpected internal execution failure"
227
+ }, json, stdout, stderr);
228
+ }
229
+ finally {
230
+ try {
231
+ core.close();
232
+ }
233
+ catch {
234
+ // Ignore errors on closing
235
+ }
236
+ }
237
+ }
238
+ // Invoke when executed directly as script
239
+ const isDirectExecution = process.argv[1] &&
240
+ (process.argv[1] === fileURLToPath(import.meta.url) ||
241
+ process.argv[1].endsWith("/lore") ||
242
+ process.argv[1].endsWith("/company") ||
243
+ process.argv[1].endsWith("/main.ts") ||
244
+ process.argv[1].endsWith("/main.js"));
245
+ if (isDirectExecution) {
246
+ runCli(process.argv.slice(2)).then((code) => {
247
+ process.exit(code);
248
+ });
249
+ }
250
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { renderContext } from "../context/render.js";
2
+ export const ERROR_EXIT_CODES = {
3
+ VALIDATION: 2,
4
+ NOT_FOUND: 3,
5
+ CONFLICT: 4,
6
+ STALE_CLAIM: 5,
7
+ BUSY: 6,
8
+ IO: 7,
9
+ INTERNAL: 1
10
+ };
11
+ /**
12
+ * Emits output for a successful operation.
13
+ */
14
+ export function handleSuccessOutput(operation, response, isJson, stdout = process.stdout) {
15
+ if (isJson) {
16
+ stdout.write(JSON.stringify(response) + "\n");
17
+ return;
18
+ }
19
+ const data = response.data;
20
+ if (operation === "context.get" && data.snapshot) {
21
+ stdout.write(renderContext(data.snapshot) + "\n");
22
+ return;
23
+ }
24
+ if (operation === "task.claim" && data.task && data.claimToken) {
25
+ stdout.write(`Task claimed successfully.\n` +
26
+ `Task ID: ${data.task.id}\n` +
27
+ `Status: ${data.task.status}\n` +
28
+ `Attempt: ${data.task.attempt}\n` +
29
+ `Claim Token: ${data.claimToken}\n` +
30
+ `Lease Until: ${data.task.leaseUntil ?? "none"}\n`);
31
+ return;
32
+ }
33
+ // Concise human-readable formatting for other operations
34
+ if (operation === "project.register" && data.project) {
35
+ stdout.write(`Project registered: ${data.project.name} (${data.project.id})\nRoot: ${data.project.root}\n`);
36
+ return;
37
+ }
38
+ if (operation === "agent.register" && data.agent) {
39
+ stdout.write(`Agent registered: ${data.agent.displayName} (${data.agent.id})\n`);
40
+ return;
41
+ }
42
+ if (operation === "task.create" && data.task) {
43
+ stdout.write(`Task created: [${data.task.id}] ${data.task.title} (status: ${data.task.status})\n`);
44
+ return;
45
+ }
46
+ if (operation === "task.get" && data.task) {
47
+ stdout.write(`Task [${data.task.id}] ${data.task.title}\nStatus: ${data.task.status} | Owner: ${data.task.ownerId ?? "none"}\n`);
48
+ return;
49
+ }
50
+ if (operation === "task.list" && Array.isArray(data.tasks)) {
51
+ stdout.write(`Tasks (${data.tasks.length} returned, ${data.omittedCount ?? 0} omitted):\n`);
52
+ for (const t of data.tasks) {
53
+ stdout.write(`- [${t.id}] ${t.title} (${t.status}, attempt ${t.attempt})\n`);
54
+ }
55
+ return;
56
+ }
57
+ if (operation === "handoff.submit" && data.task && data.handoff) {
58
+ stdout.write(`Handoff submitted: Task [${data.task.id}] is now ${data.task.status}.\nOutcome: ${data.handoff.outcome}\n`);
59
+ return;
60
+ }
61
+ if (operation === "question.ask" && data.question) {
62
+ stdout.write(`Question asked [${data.question.id}] to ${data.question.toAgentId}\n`);
63
+ return;
64
+ }
65
+ if (operation === "question.answer" && data.question) {
66
+ stdout.write(`Question [${data.question.id}] answered by ${data.question.answer?.actorId ?? "unknown"}\n`);
67
+ return;
68
+ }
69
+ if (operation === "inbox.list" && Array.isArray(data.events)) {
70
+ stdout.write(`Inbox events (${data.events.length} returned, nextCursor: ${data.nextCursor}, hasMore: ${data.hasMore}):\n`);
71
+ for (const ev of data.events) {
72
+ stdout.write(`- [Event ${ev.id}] ${ev.kind} (Task ${ev.taskId}, Question ${ev.questionId})\n`);
73
+ }
74
+ return;
75
+ }
76
+ if (operation === "decision.record" && data.decision) {
77
+ stdout.write(`Decision recorded [${data.decision.id}] by ${data.decision.actorId}\n`);
78
+ return;
79
+ }
80
+ // Fallback for renew, release, reopen, cancel
81
+ if (data.task) {
82
+ stdout.write(`Task [${data.task.id}] updated to status ${data.task.status}.\n`);
83
+ return;
84
+ }
85
+ stdout.write(`Operation ${operation} succeeded.\n`);
86
+ }
87
+ /**
88
+ * Emits output for an error response and returns the appropriate process exit code.
89
+ */
90
+ export function handleErrorOutput(error, isJson, stdout = process.stdout, stderr = process.stderr) {
91
+ const exitCode = ERROR_EXIT_CODES[error.code] ?? 1;
92
+ if (isJson) {
93
+ const jsonEnvelope = {
94
+ schemaVersion: 1,
95
+ ok: false,
96
+ error: {
97
+ code: error.code || "INTERNAL",
98
+ message: error.message || "Internal error",
99
+ details: error.details
100
+ }
101
+ };
102
+ stdout.write(JSON.stringify(jsonEnvelope) + "\n");
103
+ return exitCode;
104
+ }
105
+ stderr.write(`Error [${error.code}]: ${error.message}\n`);
106
+ return exitCode;
107
+ }
108
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}