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.
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/dist/cli/args.js +287 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/detect.js +94 -0
- package/dist/cli/detect.js.map +1 -0
- package/dist/cli/home.js +36 -0
- package/dist/cli/home.js.map +1 -0
- package/dist/cli/init.js +309 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/input.js +72 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/instructions.js +83 -0
- package/dist/cli/instructions.js.map +1 -0
- package/dist/cli/main.js +250 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.js +108 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/context/render.js +297 -0
- package/dist/context/render.js.map +1 -0
- package/dist/core/contracts.js +49 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/dispatch.js +109 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/errors.js +36 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/operations/claims.js +91 -0
- package/dist/core/operations/claims.js.map +1 -0
- package/dist/core/operations/common.js +108 -0
- package/dist/core/operations/common.js.map +1 -0
- package/dist/core/operations/context.js +130 -0
- package/dist/core/operations/context.js.map +1 -0
- package/dist/core/operations/decisions.js +44 -0
- package/dist/core/operations/decisions.js.map +1 -0
- package/dist/core/operations/handoffs.js +147 -0
- package/dist/core/operations/handoffs.js.map +1 -0
- package/dist/core/operations/messages.js +117 -0
- package/dist/core/operations/messages.js.map +1 -0
- package/dist/core/operations/register.js +51 -0
- package/dist/core/operations/register.js.map +1 -0
- package/dist/core/operations/tasks.js +54 -0
- package/dist/core/operations/tasks.js.map +1 -0
- package/dist/core/schemas/common.js +81 -0
- package/dist/core/schemas/common.js.map +1 -0
- package/dist/core/schemas/context.js +10 -0
- package/dist/core/schemas/context.js.map +1 -0
- package/dist/core/schemas/decisions.js +11 -0
- package/dist/core/schemas/decisions.js.map +1 -0
- package/dist/core/schemas/handoffs.js +38 -0
- package/dist/core/schemas/handoffs.js.map +1 -0
- package/dist/core/schemas/questions.js +22 -0
- package/dist/core/schemas/questions.js.map +1 -0
- package/dist/core/schemas/registration.js +16 -0
- package/dist/core/schemas/registration.js.map +1 -0
- package/dist/core/schemas/request.js +103 -0
- package/dist/core/schemas/request.js.map +1 -0
- package/dist/core/schemas/tasks.js +35 -0
- package/dist/core/schemas/tasks.js.map +1 -0
- package/dist/evidence/git.js +119 -0
- package/dist/evidence/git.js.map +1 -0
- package/dist/integrations/index.js +32 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/storage/db.js +239 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/faults.js +12 -0
- package/dist/storage/faults.js.map +1 -0
- package/dist/storage/receipts.js +82 -0
- package/dist/storage/receipts.js.map +1 -0
- package/dist/storage/schema.js +119 -0
- package/dist/storage/schema.js.map +1 -0
- package/docs/integrations.md +71 -0
- package/docs/usage.md +405 -0
- package/package.json +54 -0
- package/templates/instructions.template.md +42 -0
- package/templates/session-rule.md +34 -0
package/dist/cli/main.js
ADDED
|
@@ -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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"}
|