overleaf-codex 0.1.0-rc.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.
Potentially problematic release.
This version of overleaf-codex might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/NOTICE.md +25 -0
- package/README.md +217 -0
- package/assets/olcx-mark.svg +22 -0
- package/dist/auth/projectAuth.d.ts +19 -0
- package/dist/auth/projectAuth.js +163 -0
- package/dist/auth/projectAuth.js.map +1 -0
- package/dist/auth/redact.d.ts +3 -0
- package/dist/auth/redact.js +7 -0
- package/dist/auth/redact.js.map +1 -0
- package/dist/auth/types.d.ts +10 -0
- package/dist/auth/types.js +4 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/backend/index.d.ts +6 -0
- package/dist/backend/index.js +2 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/olcli/client.d.ts +329 -0
- package/dist/backend/olcli/client.js +1757 -0
- package/dist/backend/olcli/client.js.map +1 -0
- package/dist/backend/olcli/index.d.ts +2 -0
- package/dist/backend/olcli/index.js +2 -0
- package/dist/backend/olcli/index.js.map +1 -0
- package/dist/backend/overleafBackend.d.ts +41 -0
- package/dist/backend/overleafBackend.js +200 -0
- package/dist/backend/overleafBackend.js.map +1 -0
- package/dist/backend/types.d.ts +73 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/cli-behavior.d.ts +14 -0
- package/dist/cli-behavior.js +59 -0
- package/dist/cli-behavior.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.js +441 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +21 -0
- package/dist/commands/auth.js +104 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/compile.d.ts +7 -0
- package/dist/commands/compile.js +73 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.js +9 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/endpoint.d.ts +23 -0
- package/dist/commands/endpoint.js +69 -0
- package/dist/commands/endpoint.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.js +48 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.js +5 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +26 -0
- package/dist/commands/sync.js +139 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/watch.d.ts +28 -0
- package/dist/commands/watch.js +124 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/compile/compileFlow.d.ts +32 -0
- package/dist/compile/compileFlow.js +290 -0
- package/dist/compile/compileFlow.js.map +1 -0
- package/dist/compile/pdfOutput.d.ts +12 -0
- package/dist/compile/pdfOutput.js +64 -0
- package/dist/compile/pdfOutput.js.map +1 -0
- package/dist/config/ignoreRules.d.ts +5 -0
- package/dist/config/ignoreRules.js +53 -0
- package/dist/config/ignoreRules.js.map +1 -0
- package/dist/config/overleafProject.d.ts +9 -0
- package/dist/config/overleafProject.js +61 -0
- package/dist/config/overleafProject.js.map +1 -0
- package/dist/config/projectConfig.d.ts +6 -0
- package/dist/config/projectConfig.js +180 -0
- package/dist/config/projectConfig.js.map +1 -0
- package/dist/config/projectRoot.d.ts +1 -0
- package/dist/config/projectRoot.js +36 -0
- package/dist/config/projectRoot.js.map +1 -0
- package/dist/config/types.d.ts +50 -0
- package/dist/config/types.js +34 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/vscode.d.ts +10 -0
- package/dist/config/vscode.js +134 -0
- package/dist/config/vscode.js.map +1 -0
- package/dist/diagnostics/doctor.d.ts +8 -0
- package/dist/diagnostics/doctor.js +209 -0
- package/dist/diagnostics/doctor.js.map +1 -0
- package/dist/diagnostics/status.d.ts +6 -0
- package/dist/diagnostics/status.js +110 -0
- package/dist/diagnostics/status.js.map +1 -0
- package/dist/diagnostics/types.d.ts +33 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/endpoint/overleafEndpoint.d.ts +36 -0
- package/dist/endpoint/overleafEndpoint.js +105 -0
- package/dist/endpoint/overleafEndpoint.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/sync/apply.d.ts +14 -0
- package/dist/sync/apply.js +92 -0
- package/dist/sync/apply.js.map +1 -0
- package/dist/sync/conflicts.d.ts +7 -0
- package/dist/sync/conflicts.js +59 -0
- package/dist/sync/conflicts.js.map +1 -0
- package/dist/sync/ignore.d.ts +5 -0
- package/dist/sync/ignore.js +74 -0
- package/dist/sync/ignore.js.map +1 -0
- package/dist/sync/plan.d.ts +3 -0
- package/dist/sync/plan.js +197 -0
- package/dist/sync/plan.js.map +1 -0
- package/dist/sync/snapshot.d.ts +13 -0
- package/dist/sync/snapshot.js +82 -0
- package/dist/sync/snapshot.js.map +1 -0
- package/dist/sync/state.d.ts +16 -0
- package/dist/sync/state.js +214 -0
- package/dist/sync/state.js.map +1 -0
- package/dist/sync/types.d.ts +113 -0
- package/dist/sync/types.js +4 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/testing/fakeBackend.d.ts +27 -0
- package/dist/testing/fakeBackend.js +213 -0
- package/dist/testing/fakeBackend.js.map +1 -0
- package/dist/watch/queue.d.ts +2 -0
- package/dist/watch/queue.js +91 -0
- package/dist/watch/queue.js.map +1 -0
- package/dist/watch/types.d.ts +52 -0
- package/dist/watch/types.js +2 -0
- package/dist/watch/types.js.map +1 -0
- package/dist/watch/watcher.d.ts +6 -0
- package/dist/watch/watcher.js +58 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/watch/workflow.d.ts +30 -0
- package/dist/watch/workflow.js +62 -0
- package/dist/watch/workflow.js.map +1 -0
- package/docs/architecture.md +603 -0
- package/docs/auth.md +65 -0
- package/docs/cli-behavior.md +95 -0
- package/docs/compile.md +51 -0
- package/docs/design.md +82 -0
- package/docs/endpoint.md +84 -0
- package/docs/npm-packaging.md +148 -0
- package/docs/quickdev-queue-audit.md +193 -0
- package/docs/release-gates.md +119 -0
- package/docs/release-notes-v1.md +97 -0
- package/docs/security.md +61 -0
- package/docs/sync-state.md +305 -0
- package/docs/sync.md +50 -0
- package/docs/troubleshooting.md +124 -0
- package/docs/usage.md +184 -0
- package/examples/minimal-paper/.olcx/auth.local.example.json +7 -0
- package/examples/minimal-paper/.olcx/config.json +23 -0
- package/examples/minimal-paper/README.md +88 -0
- package/examples/minimal-paper/main.tex +23 -0
- package/package.json +66 -0
- package/src/backend/olcli/LICENSE +21 -0
- package/src/backend/olcli/README.md +26 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { Command, CommanderError, InvalidArgumentError, Option } from "commander";
|
|
4
|
+
import { EXIT_CODES, formatCliFailure, isOlcxError, redactSensitive, } from "./cli-behavior.js";
|
|
5
|
+
import { authenticateProject, createSessionCookiePrompt, formatAuthSuccess, } from "./commands/auth.js";
|
|
6
|
+
import { formatCompileFailure, formatCompileSuccess, runCompileCommand } from "./commands/compile.js";
|
|
7
|
+
import { getDoctorOutput } from "./commands/doctor.js";
|
|
8
|
+
import { getEndpointStatusOutput, setEndpoint, testEndpoint, } from "./commands/endpoint.js";
|
|
9
|
+
import { initProject } from "./commands/init.js";
|
|
10
|
+
import { getStatusOutput } from "./commands/status.js";
|
|
11
|
+
import { formatSyncConflictFailure, syncProject } from "./commands/sync.js";
|
|
12
|
+
import { formatWatchFailure, runWatchCommand } from "./commands/watch.js";
|
|
13
|
+
import { MAX_FAST_FALLBACK_ATTEMPTS } from "./config/types.js";
|
|
14
|
+
export const VERSION = "0.1.0";
|
|
15
|
+
const defaultIo = {
|
|
16
|
+
writeOut: (value) => process.stdout.write(value),
|
|
17
|
+
writeErr: (value) => process.stderr.write(value),
|
|
18
|
+
setExitCode: (value) => {
|
|
19
|
+
process.exitCode = value;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
function initAction(io, runtime) {
|
|
23
|
+
return async (options) => {
|
|
24
|
+
try {
|
|
25
|
+
const result = await initProject({
|
|
26
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
27
|
+
project: options.project,
|
|
28
|
+
vscode: Boolean(options.vscode),
|
|
29
|
+
});
|
|
30
|
+
io.writeOut([
|
|
31
|
+
"Initialized olcx project binding.",
|
|
32
|
+
`Project root: ${result.projectRoot}`,
|
|
33
|
+
"Config: .olcx/config.json",
|
|
34
|
+
`PDF path: ${result.pdfPath}`,
|
|
35
|
+
`VS Code: ${result.vscodeChanged ? "updated" : "unchanged"}`,
|
|
36
|
+
].join("\n") + "\n");
|
|
37
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!isOlcxError(error)) {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
io.writeErr(formatCliFailure({
|
|
44
|
+
code: error.code,
|
|
45
|
+
exitCode: error.exitCode,
|
|
46
|
+
message: error.message,
|
|
47
|
+
hint: error.hint ?? "Fix the command input and try again.",
|
|
48
|
+
details: error.details,
|
|
49
|
+
}));
|
|
50
|
+
io.setExitCode(error.exitCode);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function authAction(io, runtime) {
|
|
55
|
+
return async (options) => {
|
|
56
|
+
try {
|
|
57
|
+
const result = await authenticateProject({
|
|
58
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
59
|
+
cookie: options.cookie,
|
|
60
|
+
fromEnv: options.fromEnv,
|
|
61
|
+
account: options.account,
|
|
62
|
+
env: runtime.env ?? process.env,
|
|
63
|
+
stdinIsTTY: runtime.stdinIsTTY ?? Boolean(process.stdin.isTTY),
|
|
64
|
+
now: runtime.now,
|
|
65
|
+
promptCookie: runtime.promptCookie ?? createSessionCookiePrompt(),
|
|
66
|
+
});
|
|
67
|
+
io.writeOut(formatAuthSuccess(result));
|
|
68
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (!isOlcxError(error)) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
io.writeErr(formatCliFailure({
|
|
75
|
+
code: error.code,
|
|
76
|
+
exitCode: error.exitCode,
|
|
77
|
+
message: error.message,
|
|
78
|
+
hint: error.hint ?? "Fix the command input and try again.",
|
|
79
|
+
details: error.details,
|
|
80
|
+
}));
|
|
81
|
+
io.setExitCode(error.exitCode);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function statusAction(io, runtime) {
|
|
86
|
+
return async () => {
|
|
87
|
+
const output = await getStatusOutput({ cwd: runtime.cwd?.() ?? process.cwd() });
|
|
88
|
+
io.writeOut(output);
|
|
89
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function syncAction(io, runtime) {
|
|
93
|
+
return async (options) => {
|
|
94
|
+
try {
|
|
95
|
+
const result = await syncProject({
|
|
96
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
97
|
+
dryRun: Boolean(options.dryRun),
|
|
98
|
+
backend: runtime.backend,
|
|
99
|
+
createBackend: runtime.createBackend,
|
|
100
|
+
env: runtime.env ?? process.env,
|
|
101
|
+
now: runtime.now,
|
|
102
|
+
});
|
|
103
|
+
io.writeOut(result.output);
|
|
104
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (!isOlcxError(error)) {
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
if (error.code === "SYNC_CONFLICT") {
|
|
111
|
+
io.writeErr(formatSyncConflictFailure({
|
|
112
|
+
conflicts: readConflictDetails(error.details),
|
|
113
|
+
dryRun: Boolean(options.dryRun),
|
|
114
|
+
reportWritten: typeof error.details === "object" &&
|
|
115
|
+
error.details !== null &&
|
|
116
|
+
"reportPath" in error.details,
|
|
117
|
+
}));
|
|
118
|
+
io.setExitCode(error.exitCode);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
io.writeErr(formatCliFailure({
|
|
122
|
+
code: error.code,
|
|
123
|
+
exitCode: error.exitCode,
|
|
124
|
+
message: error.message,
|
|
125
|
+
hint: error.hint ?? "Fix the sync issue and try again.",
|
|
126
|
+
details: error.details,
|
|
127
|
+
}));
|
|
128
|
+
io.setExitCode(error.exitCode);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function endpointStatusAction(io, runtime) {
|
|
133
|
+
return async () => {
|
|
134
|
+
try {
|
|
135
|
+
const output = await getEndpointStatusOutput({ cwd: runtime.cwd?.() ?? process.cwd() });
|
|
136
|
+
io.writeOut(output);
|
|
137
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (!isOlcxError(error)) {
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
io.writeErr(formatCliFailure({
|
|
144
|
+
code: error.code,
|
|
145
|
+
exitCode: error.exitCode,
|
|
146
|
+
message: error.message,
|
|
147
|
+
hint: error.hint ?? "Run olcx init before managing endpoints.",
|
|
148
|
+
details: error.details,
|
|
149
|
+
}));
|
|
150
|
+
io.setExitCode(error.exitCode);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function endpointSetAction(io, runtime) {
|
|
155
|
+
return async (endpoint) => {
|
|
156
|
+
try {
|
|
157
|
+
const output = await setEndpoint({
|
|
158
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
159
|
+
endpoint,
|
|
160
|
+
});
|
|
161
|
+
io.writeOut(output);
|
|
162
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (!isOlcxError(error)) {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
io.writeErr(formatCliFailure({
|
|
169
|
+
code: error.code,
|
|
170
|
+
exitCode: error.exitCode,
|
|
171
|
+
message: error.message,
|
|
172
|
+
hint: error.hint ?? "Use endpoint alias www or cn.",
|
|
173
|
+
details: error.details,
|
|
174
|
+
}));
|
|
175
|
+
io.setExitCode(error.exitCode);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function endpointTestAction(io, runtime) {
|
|
180
|
+
return async (options) => {
|
|
181
|
+
try {
|
|
182
|
+
const result = await testEndpoint({
|
|
183
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
184
|
+
timeoutMs: options.timeout,
|
|
185
|
+
apply: Boolean(options.apply),
|
|
186
|
+
fetchImpl: runtime.endpointFetch,
|
|
187
|
+
nowMs: runtime.endpointNowMs,
|
|
188
|
+
});
|
|
189
|
+
if (result.exitCode === EXIT_CODES.SUCCESS) {
|
|
190
|
+
io.writeOut(result.output);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
io.writeErr(result.output);
|
|
194
|
+
}
|
|
195
|
+
io.setExitCode(result.exitCode);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (!isOlcxError(error)) {
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
io.writeErr(formatCliFailure({
|
|
202
|
+
code: error.code,
|
|
203
|
+
exitCode: error.exitCode,
|
|
204
|
+
message: error.message,
|
|
205
|
+
hint: error.hint ?? "Fix the endpoint command input and try again.",
|
|
206
|
+
details: error.details,
|
|
207
|
+
}));
|
|
208
|
+
io.setExitCode(error.exitCode);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function parseFastFallbackAttempts(value) {
|
|
213
|
+
const parsed = Number(value);
|
|
214
|
+
if (!Number.isInteger(parsed) || parsed < 0 || parsed > MAX_FAST_FALLBACK_ATTEMPTS) {
|
|
215
|
+
throw new InvalidArgumentError(`fast fallback attempts must be an integer from 0 to ${MAX_FAST_FALLBACK_ATTEMPTS}`);
|
|
216
|
+
}
|
|
217
|
+
return parsed;
|
|
218
|
+
}
|
|
219
|
+
function parsePositiveMilliseconds(value) {
|
|
220
|
+
const parsed = Number(value);
|
|
221
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
222
|
+
throw new InvalidArgumentError("fast fallback timeout must be a positive integer in milliseconds");
|
|
223
|
+
}
|
|
224
|
+
return parsed;
|
|
225
|
+
}
|
|
226
|
+
function parsePositiveDebounce(value) {
|
|
227
|
+
const parsed = Number(value);
|
|
228
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
229
|
+
throw new InvalidArgumentError("debounce must be a positive integer in milliseconds");
|
|
230
|
+
}
|
|
231
|
+
return parsed;
|
|
232
|
+
}
|
|
233
|
+
function parseEndpointTimeout(value) {
|
|
234
|
+
const parsed = Number(value);
|
|
235
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
236
|
+
throw new InvalidArgumentError("endpoint timeout must be a positive integer in milliseconds");
|
|
237
|
+
}
|
|
238
|
+
return parsed;
|
|
239
|
+
}
|
|
240
|
+
function compileAction(io, runtime) {
|
|
241
|
+
return async (options) => {
|
|
242
|
+
try {
|
|
243
|
+
const result = await runCompileCommand({
|
|
244
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
245
|
+
pdfPath: options.pdf,
|
|
246
|
+
backend: runtime.backend,
|
|
247
|
+
createBackend: runtime.createBackend,
|
|
248
|
+
env: runtime.env ?? process.env,
|
|
249
|
+
now: runtime.now,
|
|
250
|
+
fastFallback: {
|
|
251
|
+
enabled: options.disableFastFallback ? false : undefined,
|
|
252
|
+
attempts: options.fastFallbackAttempts,
|
|
253
|
+
timeoutMs: options.fastFallbackTimeout,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
io.writeOut(formatCompileSuccess(result));
|
|
257
|
+
io.setExitCode(EXIT_CODES.SUCCESS);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (!isOlcxError(error)) {
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
io.writeErr(formatCompileFailure(error));
|
|
264
|
+
io.setExitCode(error.exitCode);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function doctorAction(io, runtime) {
|
|
269
|
+
return async () => {
|
|
270
|
+
const result = await getDoctorOutput({
|
|
271
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
272
|
+
nodeVersion: runtime.nodeVersion,
|
|
273
|
+
backendAvailable: runtime.backendAvailable,
|
|
274
|
+
});
|
|
275
|
+
if (result.exitCode === EXIT_CODES.SUCCESS) {
|
|
276
|
+
io.writeOut(result.output);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
io.writeErr(result.output);
|
|
280
|
+
}
|
|
281
|
+
io.setExitCode(result.exitCode);
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function watchAction(io, runtime) {
|
|
285
|
+
return async (options) => {
|
|
286
|
+
try {
|
|
287
|
+
const result = await runWatchCommand({
|
|
288
|
+
cwd: runtime.cwd?.() ?? process.cwd(),
|
|
289
|
+
debounceMs: options.debounce ?? 2500,
|
|
290
|
+
backend: runtime.backend,
|
|
291
|
+
createBackend: runtime.createBackend,
|
|
292
|
+
env: runtime.env ?? process.env,
|
|
293
|
+
now: runtime.now,
|
|
294
|
+
watchAdapter: runtime.watchAdapter,
|
|
295
|
+
signals: runtime.watchSignals,
|
|
296
|
+
writeOut: io.writeOut,
|
|
297
|
+
writeErr: io.writeErr,
|
|
298
|
+
});
|
|
299
|
+
io.setExitCode(result.exitCode);
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
io.writeErr(formatWatchFailure(error));
|
|
303
|
+
io.setExitCode(isOlcxError(error) ? error.exitCode : EXIT_CODES.INTERNAL_ERROR);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
function isCommanderError(error) {
|
|
308
|
+
return (error instanceof CommanderError ||
|
|
309
|
+
(typeof error === "object" &&
|
|
310
|
+
error !== null &&
|
|
311
|
+
"exitCode" in error &&
|
|
312
|
+
typeof error.exitCode === "number"));
|
|
313
|
+
}
|
|
314
|
+
function enableExitOverride(command) {
|
|
315
|
+
command.exitOverride();
|
|
316
|
+
command.commands.forEach((child) => enableExitOverride(child));
|
|
317
|
+
}
|
|
318
|
+
export function buildCli(io = defaultIo, runtime = {}) {
|
|
319
|
+
const program = new Command();
|
|
320
|
+
program
|
|
321
|
+
.name("olcx")
|
|
322
|
+
.description("Bridge local Git, VS Code, and Codex workflows with Overleaf compilation.")
|
|
323
|
+
.version(VERSION)
|
|
324
|
+
.configureOutput({
|
|
325
|
+
writeOut: io.writeOut,
|
|
326
|
+
writeErr: io.writeErr,
|
|
327
|
+
outputError: (message, write) => write(redactSensitive(message)),
|
|
328
|
+
})
|
|
329
|
+
.showHelpAfterError("Next: run the command with --help for usage.");
|
|
330
|
+
program
|
|
331
|
+
.command("auth")
|
|
332
|
+
.description("Store project-local Overleaf authorization for the current paper repository.")
|
|
333
|
+
.option("--cookie <value>", "Overleaf session cookie value")
|
|
334
|
+
.option("--from-env <name>", "Read the session cookie from an environment variable")
|
|
335
|
+
.option("--account <label>", "Optional account label shown in redacted local status")
|
|
336
|
+
.action(authAction(io, runtime));
|
|
337
|
+
program
|
|
338
|
+
.command("init")
|
|
339
|
+
.description("Bind the current paper repository to one Overleaf project.")
|
|
340
|
+
.requiredOption("--project <url-or-id>", "Overleaf project URL or project id")
|
|
341
|
+
.addOption(new Option("--vscode", "Deprecated compatibility flag; VS Code settings and tasks are generated by default.").hideHelp())
|
|
342
|
+
.action(initAction(io, runtime));
|
|
343
|
+
const endpoint = program
|
|
344
|
+
.command("endpoint")
|
|
345
|
+
.description("Manage the Overleaf endpoint for this paper repository.");
|
|
346
|
+
endpoint
|
|
347
|
+
.command("status")
|
|
348
|
+
.description("Show the configured Overleaf endpoint.")
|
|
349
|
+
.action(endpointStatusAction(io, runtime));
|
|
350
|
+
endpoint
|
|
351
|
+
.command("test")
|
|
352
|
+
.description("Probe www and cn Overleaf endpoints without changing remote projects.")
|
|
353
|
+
.option("--timeout <ms>", "Probe timeout in milliseconds", parseEndpointTimeout, 5000)
|
|
354
|
+
.option("--apply", "Write the fastest available endpoint to .olcx/config.json")
|
|
355
|
+
.action(endpointTestAction(io, runtime));
|
|
356
|
+
endpoint
|
|
357
|
+
.command("set")
|
|
358
|
+
.description("Set the Overleaf endpoint manually.")
|
|
359
|
+
.argument("<endpoint>", "Endpoint alias: www or cn")
|
|
360
|
+
.action(endpointSetAction(io, runtime));
|
|
361
|
+
program
|
|
362
|
+
.command("sync")
|
|
363
|
+
.description("Synchronize local files and the bound Overleaf project without silent overwrites.")
|
|
364
|
+
.option("--dry-run", "Show planned sync operations without changing files")
|
|
365
|
+
.action(syncAction(io, runtime));
|
|
366
|
+
program
|
|
367
|
+
.command("compile")
|
|
368
|
+
.description("Compile the bound Overleaf project and download the PDF artifact.")
|
|
369
|
+
.option("--pdf <path>", "PDF output path")
|
|
370
|
+
.option("--disable-fast-fallback", "Disable fast/draft fallback for this compile")
|
|
371
|
+
.option("--fast-fallback-attempts <count>", "Fast/draft fallback attempt count, 0-3", parseFastFallbackAttempts)
|
|
372
|
+
.option("--fast-fallback-timeout <ms>", "Timeout for each fast/draft fallback attempt in milliseconds", parsePositiveMilliseconds)
|
|
373
|
+
.action(compileAction(io, runtime));
|
|
374
|
+
program
|
|
375
|
+
.command("watch")
|
|
376
|
+
.description("Watch local source changes, debounce them, then sync and compile.")
|
|
377
|
+
.option("--debounce <ms>", "Debounce window in milliseconds", parsePositiveDebounce, 2500)
|
|
378
|
+
.action(watchAction(io, runtime));
|
|
379
|
+
program
|
|
380
|
+
.command("status")
|
|
381
|
+
.description("Show binding, authorization, and sync state for the current paper repository.")
|
|
382
|
+
.action(statusAction(io, runtime));
|
|
383
|
+
program
|
|
384
|
+
.command("doctor")
|
|
385
|
+
.description("Check the local olcx environment and project configuration.")
|
|
386
|
+
.action(doctorAction(io, runtime));
|
|
387
|
+
return program;
|
|
388
|
+
}
|
|
389
|
+
export async function run(argv = process.argv, io = defaultIo, runtime = {}) {
|
|
390
|
+
let exitCode = EXIT_CODES.SUCCESS;
|
|
391
|
+
const trackingIo = {
|
|
392
|
+
...io,
|
|
393
|
+
setExitCode: (value) => {
|
|
394
|
+
exitCode = value;
|
|
395
|
+
io.setExitCode(value);
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
const program = buildCli(trackingIo, runtime);
|
|
399
|
+
enableExitOverride(program);
|
|
400
|
+
try {
|
|
401
|
+
await program.parseAsync(argv);
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
if (isCommanderError(error)) {
|
|
405
|
+
const commanderExitCode = error.exitCode === EXIT_CODES.SUCCESS ? EXIT_CODES.SUCCESS : EXIT_CODES.USER_INPUT_ERROR;
|
|
406
|
+
trackingIo.setExitCode(commanderExitCode);
|
|
407
|
+
return commanderExitCode;
|
|
408
|
+
}
|
|
409
|
+
trackingIo.writeErr(formatCliFailure({
|
|
410
|
+
code: "INTERNAL_ERROR",
|
|
411
|
+
exitCode: EXIT_CODES.INTERNAL_ERROR,
|
|
412
|
+
message: error instanceof Error ? error.message : "Unexpected internal error.",
|
|
413
|
+
hint: "Run the command again with --help or report this olcx error with the command you ran.",
|
|
414
|
+
}));
|
|
415
|
+
trackingIo.setExitCode(EXIT_CODES.INTERNAL_ERROR);
|
|
416
|
+
return EXIT_CODES.INTERNAL_ERROR;
|
|
417
|
+
}
|
|
418
|
+
return exitCode;
|
|
419
|
+
}
|
|
420
|
+
function readConflictDetails(details) {
|
|
421
|
+
if (!details || typeof details !== "object" || !("conflicts" in details)) {
|
|
422
|
+
return [];
|
|
423
|
+
}
|
|
424
|
+
const conflicts = details.conflicts;
|
|
425
|
+
if (!Array.isArray(conflicts)) {
|
|
426
|
+
return [];
|
|
427
|
+
}
|
|
428
|
+
return conflicts
|
|
429
|
+
.filter((conflict) => typeof conflict === "object" &&
|
|
430
|
+
conflict !== null &&
|
|
431
|
+
typeof conflict.path === "string" &&
|
|
432
|
+
typeof conflict.reason === "string")
|
|
433
|
+
.map((conflict) => ({
|
|
434
|
+
path: conflict.path,
|
|
435
|
+
reason: conflict.reason,
|
|
436
|
+
}));
|
|
437
|
+
}
|
|
438
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
439
|
+
void run();
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ProjectAuth } from "../auth/types.js";
|
|
2
|
+
import { PROJECT_AUTH_PATH } from "../auth/types.js";
|
|
3
|
+
export type AuthCookiePrompt = () => Promise<string>;
|
|
4
|
+
export interface AuthenticateProjectOptions {
|
|
5
|
+
cwd: string;
|
|
6
|
+
cookie?: string;
|
|
7
|
+
fromEnv?: string;
|
|
8
|
+
account?: string;
|
|
9
|
+
env?: Record<string, string | undefined>;
|
|
10
|
+
stdinIsTTY?: boolean;
|
|
11
|
+
now?: () => Date;
|
|
12
|
+
promptCookie?: AuthCookiePrompt;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthenticateProjectResult {
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
authPath: typeof PROJECT_AUTH_PATH;
|
|
17
|
+
auth: ProjectAuth;
|
|
18
|
+
}
|
|
19
|
+
export declare function createSessionCookiePrompt(input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream): AuthCookiePrompt;
|
|
20
|
+
export declare function authenticateProject(options: AuthenticateProjectOptions): Promise<AuthenticateProjectResult>;
|
|
21
|
+
export declare function formatAuthSuccess(result: AuthenticateProjectResult): string;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { isNonInteractive } from "../cli-behavior.js";
|
|
3
|
+
import { summarizeProjectAuth, writeProjectAuth } from "../auth/projectAuth.js";
|
|
4
|
+
import { PROJECT_AUTH_PATH } from "../auth/types.js";
|
|
5
|
+
import { findProjectRoot } from "../config/projectRoot.js";
|
|
6
|
+
import { createOlcxError } from "../errors.js";
|
|
7
|
+
const ENV_VAR_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
8
|
+
export function createSessionCookiePrompt(input = process.stdin, output = process.stderr) {
|
|
9
|
+
return async () => {
|
|
10
|
+
const readline = createInterface({ input, output });
|
|
11
|
+
try {
|
|
12
|
+
return await readline.question("Paste Overleaf session cookie: ");
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
readline.close();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function authenticateProject(options) {
|
|
20
|
+
const projectRoot = await findProjectRoot(options.cwd);
|
|
21
|
+
const selected = await selectCookieSource(options);
|
|
22
|
+
const accountLabel = options.account?.trim();
|
|
23
|
+
const auth = {
|
|
24
|
+
schemaVersion: 1,
|
|
25
|
+
sessionCookie: selected.value,
|
|
26
|
+
updatedAt: (options.now ?? (() => new Date()))().toISOString(),
|
|
27
|
+
source: selected.source,
|
|
28
|
+
};
|
|
29
|
+
if (accountLabel !== undefined && accountLabel.length > 0) {
|
|
30
|
+
auth.accountLabel = accountLabel;
|
|
31
|
+
}
|
|
32
|
+
await writeProjectAuth(projectRoot, auth);
|
|
33
|
+
return {
|
|
34
|
+
projectRoot,
|
|
35
|
+
authPath: PROJECT_AUTH_PATH,
|
|
36
|
+
auth,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function formatAuthSuccess(result) {
|
|
40
|
+
const summary = summarizeProjectAuth(result.auth);
|
|
41
|
+
return [
|
|
42
|
+
"Stored project-local Overleaf auth.",
|
|
43
|
+
`Auth file: ${result.authPath}`,
|
|
44
|
+
`Account: ${summary.accountLabel}`,
|
|
45
|
+
`Source: ${summary.source}`,
|
|
46
|
+
"Next: olcx status",
|
|
47
|
+
].join("\n") + "\n";
|
|
48
|
+
}
|
|
49
|
+
async function selectCookieSource(options) {
|
|
50
|
+
const hasCookieOption = options.cookie !== undefined;
|
|
51
|
+
const hasFromEnvOption = options.fromEnv !== undefined;
|
|
52
|
+
const hasCookie = hasNonBlankValue(options.cookie);
|
|
53
|
+
const hasFromEnv = hasNonBlankValue(options.fromEnv);
|
|
54
|
+
if (hasCookieOption && hasFromEnvOption) {
|
|
55
|
+
throw createOlcxError({
|
|
56
|
+
code: "USER_INPUT_ERROR",
|
|
57
|
+
message: "Choose exactly one auth source.",
|
|
58
|
+
hint: "Run olcx auth --cookie <session-cookie> or olcx auth --from-env OLCX_OVERLEAF_SESSION.",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (hasCookie) {
|
|
62
|
+
return { value: options.cookie.trim(), source: "cli-option" };
|
|
63
|
+
}
|
|
64
|
+
if (hasFromEnv) {
|
|
65
|
+
const envVarName = options.fromEnv.trim();
|
|
66
|
+
if (!ENV_VAR_NAME_PATTERN.test(envVarName)) {
|
|
67
|
+
throw createOlcxError({
|
|
68
|
+
code: "USER_INPUT_ERROR",
|
|
69
|
+
message: `Environment variable name ${envVarName} is invalid.`,
|
|
70
|
+
hint: "Use a shell environment variable name such as OLCX_OVERLEAF_SESSION.",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const envValue = options.env?.[envVarName];
|
|
74
|
+
if (!hasNonBlankValue(envValue)) {
|
|
75
|
+
throw createOlcxError({
|
|
76
|
+
code: "USER_INPUT_ERROR",
|
|
77
|
+
message: `Environment variable ${envVarName} is not set or is empty.`,
|
|
78
|
+
hint: `export ${envVarName}=<session-cookie> && olcx auth --from-env ${envVarName}`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return { value: envValue.trim(), source: "env" };
|
|
82
|
+
}
|
|
83
|
+
if (isNonInteractive(options.env, options.stdinIsTTY ?? false)) {
|
|
84
|
+
throw createOlcxError({
|
|
85
|
+
code: "USER_INPUT_ERROR",
|
|
86
|
+
message: "No auth source was provided.",
|
|
87
|
+
hint: "run olcx auth --from-env OLCX_OVERLEAF_SESSION or olcx auth --cookie <session-cookie>",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const promptCookie = options.promptCookie ?? createSessionCookiePrompt();
|
|
91
|
+
const promptedCookie = (await promptCookie()).trim();
|
|
92
|
+
if (promptedCookie.length === 0) {
|
|
93
|
+
throw createOlcxError({
|
|
94
|
+
code: "USER_INPUT_ERROR",
|
|
95
|
+
message: "No auth source was provided.",
|
|
96
|
+
hint: "run olcx auth --from-env OLCX_OVERLEAF_SESSION or olcx auth --cookie <session-cookie>",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return { value: promptedCookie, source: "interactive" };
|
|
100
|
+
}
|
|
101
|
+
function hasNonBlankValue(value) {
|
|
102
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CompileProjectInput, type CompileProjectResult } from "../compile/compileFlow.js";
|
|
2
|
+
import type { OlcxError } from "../errors.js";
|
|
3
|
+
export interface RunCompileCommandInput extends CompileProjectInput {
|
|
4
|
+
}
|
|
5
|
+
export declare function runCompileCommand(input: RunCompileCommandInput): Promise<CompileProjectResult>;
|
|
6
|
+
export declare function formatCompileSuccess(result: CompileProjectResult): string;
|
|
7
|
+
export declare function formatCompileFailure(error: OlcxError): string;
|