trajectories-sh 1.24.0 → 1.24.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/dist/cli.js
CHANGED
|
@@ -1,7 +1,273 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getApiUrl,
|
|
4
|
+
getAuthHeader
|
|
5
|
+
} from "./chunk-ERO5HP43.js";
|
|
2
6
|
|
|
3
7
|
// src/cli.ts
|
|
4
8
|
import { Command } from "commander";
|
|
9
|
+
|
|
10
|
+
// ../../apps/api/app/services/contracts/commonpaper.json
|
|
11
|
+
var commonpaper_default = {
|
|
12
|
+
id: "commonpaper-mutual-nda-1.0",
|
|
13
|
+
name: "Common Paper Mutual NDA",
|
|
14
|
+
version: "1.0",
|
|
15
|
+
source: "https://commonpaper.com/standards/mutual-nda/1.0",
|
|
16
|
+
license: "https://creativecommons.org/licenses/by/4.0/",
|
|
17
|
+
standard_terms: "1. Introduction\n\nThis Mutual Non-Disclosure Agreement (which incorporates these Standard Terms and the Cover Page (defined below)) (\u201CMNDA\u201D) allows each party (\u201CDisclosing Party\u201D) to disclose or make available information in connection with the Purpose which (1) the Disclosing Party identifies to the receiving party (\u201CReceiving Party\u201D) as \u201Cconfidential\u201D, \u201Cproprietary\u201D, or the like or (2) should be reasonably understood as confidential or proprietary due to its nature and the circumstances of its disclosure (\u201CConfidential Information\u201D). Each party\u2019s Confidential Information also includes the existence and status of the parties\u2019 discussions and information on the Cover Page. Confidential Information includes technical or business information, product designs or roadmaps, requirements, pricing, security and compliance documentation, technology, inventions and know-how. To use this MNDA, the parties must complete and sign a cover page incorporating these Standard Terms (\u201CCover Page\u201D). Each party is identified on the Cover Page and capitalized terms have the meanings given herein or on the Cover Page.\n\n2. Use and Protection of Confidential Information\n\nThe Receiving Party shall: (a) use Confidential Information solely for the Purpose; (b) not disclose Confidential Information to third parties without the Disclosing Party\u2019s prior written approval, except that the Receiving Party may disclose Confidential Information to its employees, agents, advisors, contractors and other representatives having a reasonable need to know for the Purpose, provided these representatives are bound by confidentiality obligations no less protective than the applicable terms in this MNDA and the Receiving Party remains responsible for their compliance with this MNDA; and (c) protect Confidential Information using at least the same protections the Receiving Party uses for its own similar information but no less than a reasonable standard of care.\n\n3. Exceptions\n\nThe Receiving Party\u2019s obligations in this MNDA do not apply to information that it can demonstrate: (a) is or becomes publicly available through no fault of the Receiving Party; (b) it rightfully knew or possessed prior to receipt from the Disclosing Party without confidentiality restrictions; (c) it rightfully obtained from a third party without confidentiality restrictions; or (d) it independently developed without using or referencing the Confidential Information.\n\n4. Disclosures Required by Law\n\nThe Receiving Party may disclose Confidential Information to the extent required by law, regulation or regulatory authority, subpoena or court order, provided (to the extent legally permitted) it provides the Disclosing Party reasonable advance notice of the required disclosure and reasonably cooperates, at the Disclosing Party\u2019s expense, with the Disclosing Party\u2019s efforts to obtain confidential treatment for the Confidential Information.\n\n5. Term and Termination\n\nThis MNDA commences on the Effective Date and expires at the end of the MNDA Term. Either party may terminate this MNDA for any or no reason upon written notice to the other party. The Receiving Party\u2019s obligations relating to Confidential Information will survive for the Term of Confidentiality, despite any expiration or termination of this MNDA.\n\n6. Return or Destruction of Confidential Information\n\nUpon expiration or termination of this MNDA or upon the Disclosing Party\u2019s earlier request, the Receiving Party will: (a) cease using Confidential Information; (b) promptly after the Disclosing Party\u2019s written request, destroy all Confidential Information in the Receiving Party\u2019s possession or control or return it to the Disclosing Party; and (c) if requested by the Disclosing Party, confirm its compliance with these obligations in writing. As an exception to subsection (b), the Receiving Party may retain Confidential Information in accordance with its standard backup or record retention policies or as required by law, but the terms of this MNDA will continue to apply to the retained Confidential Information.\n\n7. Proprietary Rights\n\nThe Disclosing Party retains all of its intellectual property and other rights in its Confidential Information and its disclosure to the Receiving Party grants no license under such rights.\n\n8. Disclaimer\n\nALL CONFIDENTIAL INFORMATION IS PROVIDED \u201CAS IS\u201D, WITH ALL FAULTS, AND WITHOUT WARRANTIES, INCLUDING THE IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\n9. Governing Law and Jurisdiction\n\nThis MNDA and all matters relating hereto are governed by, and construed in accordance with, the laws of the State of Governing Law, without regard to the conflict of laws provisions of such Governing Law. Any legal suit, action, or proceeding relating to this MNDA must be instituted in the federal or state courts located in Jurisdiction. Each party irrevocably submits to the exclusive jurisdiction of such Jurisdiction in any such suit, action, or proceeding.\n\n10. Equitable Relief\n\nA breach of this MNDA may cause irreparable harm for which monetary damages are an insufficient remedy. Upon a breach of this MNDA, the Disclosing Party is entitled to seek appropriate equitable relief, including an injunction, in addition to its other remedies.\n\n11. General\n\nNeither party has an obligation under this MNDA to disclose Confidential Information to the other or proceed with any proposed transaction.Neither party may assign this MNDA without the prior written consent of the other party, except that either party may assign this MNDA in connection with a merger, reorganization, acquisition or other transfer of all or substantially all its assets or voting securities. Any assignment in violation of this Section is null and void. This MNDA will bind and inure to the benefit of each party\u2019s permitted successors and assigns. Waivers must be signed by the waiving party\u2019s authorized representative and cannot be implied from conduct. If any provision of this MNDA is held unenforceable, it will be limited to the minimum extent necessary so the rest of this MNDA remains in effect.This MNDA (including the Cover Page) constitutes the entire agreement of the parties with respect to its subject matter, and supersedes all prior and contemporaneous understandings, agreements, representations, and warranties, whether written or oral, regarding such subject matter. This MNDA may only be amended, modified, waived, or supplemented by an agreement in writing signed by both parties. Notices, requests and approvals under this MNDA must be sent in writing to the email or postal addresses on the Cover Page and are deemed delivered on receipt. This MNDA may be executed in counterparts, including electronic copies, each of which is deemed an original and which together form the same agreement.",
|
|
18
|
+
sha256: "fc31a8b48aeea31b340de0ec37d13353f3ab60efc591ce244bfb92514b301f2d"
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// ../agreements/commonpaper.ts
|
|
22
|
+
var emptyNdaConfig = {
|
|
23
|
+
refresh_legal_name: "",
|
|
24
|
+
refresh_notice: "",
|
|
25
|
+
purpose: "",
|
|
26
|
+
mnda_years: "1",
|
|
27
|
+
confidentiality_years: "2",
|
|
28
|
+
governing_law: "",
|
|
29
|
+
jurisdiction: "",
|
|
30
|
+
modifications: ""
|
|
31
|
+
};
|
|
32
|
+
function generateCommonPaperNda(config, recipient) {
|
|
33
|
+
const pending = [];
|
|
34
|
+
const value = (key, text) => {
|
|
35
|
+
if (!text?.trim()) {
|
|
36
|
+
pending.push(key);
|
|
37
|
+
return `[To complete: ${key}]`;
|
|
38
|
+
}
|
|
39
|
+
return text.trim();
|
|
40
|
+
};
|
|
41
|
+
const terms = `COMMON PAPER MUTUAL NDA - COVER PAGE
|
|
42
|
+
|
|
43
|
+
This Mutual Non-Disclosure Agreement (the \u201CMNDA\u201D) consists of (1) this Cover Page and (2) the Common Paper Mutual NDA Standard Terms Version 1.0 posted at ${commonpaper_default.source}. A copy of the Standard Terms is included below. Any modifications to the Standard Terms are listed on this Cover Page, which controls over conflicts with the Standard Terms.
|
|
44
|
+
|
|
45
|
+
Party 1: ${value("Refresh legal name", config.refresh_legal_name)}
|
|
46
|
+
Notice address: ${value("Refresh notice address", config.refresh_notice)}
|
|
47
|
+
|
|
48
|
+
Party 2: ${value("Collaborator legal name", recipient.recipient_name)}
|
|
49
|
+
Notice address: ${value("Collaborator notice address", recipient.recipient_email)}
|
|
50
|
+
|
|
51
|
+
Purpose: ${value("Purpose", config.purpose)}
|
|
52
|
+
|
|
53
|
+
Effective Date: Date of the last party's NDA signature.
|
|
54
|
+
|
|
55
|
+
MNDA Term: Expires ${value("MNDA years", config.mnda_years)} year(s) from the Effective Date.
|
|
56
|
+
|
|
57
|
+
Term of Confidentiality: ${value("Confidentiality years", config.confidentiality_years)} year(s) from the date of last disclosure, but in the case of trade secrets, until Confidential Information is no longer considered a trade secret under applicable laws.
|
|
58
|
+
|
|
59
|
+
Governing Law: The laws of the State of ${value("Governing law", config.governing_law)}.
|
|
60
|
+
Jurisdiction: The state and federal courts located in ${value("Jurisdiction", config.jurisdiction)}.
|
|
61
|
+
|
|
62
|
+
Changes to Standard Terms: ${config.modifications.trim() || "None."}
|
|
63
|
+
|
|
64
|
+
By signing this Cover Page, each party agrees to enter into this MNDA as of the Effective Date. The parties' names and electronic signature dates are recorded with this agreement.
|
|
65
|
+
|
|
66
|
+
Common Paper Mutual Non-Disclosure Agreement, Version 1.0. Used under CC BY 4.0 (${commonpaper_default.license}). Cover Page adapted for Refresh's electronic agreement workflow; Standard Terms reproduced without substantive changes.
|
|
67
|
+
|
|
68
|
+
STANDARD TERMS
|
|
69
|
+
|
|
70
|
+
${commonpaper_default.standard_terms}`;
|
|
71
|
+
return { nda_terms: terms, nda_template: commonpaper_default.id, terms_approved: false, pending };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// src/contracts.ts
|
|
75
|
+
import { readFile, writeFile } from "fs/promises";
|
|
76
|
+
var ContractError = class extends Error {
|
|
77
|
+
constructor(status, detail) {
|
|
78
|
+
super(typeof detail === "string" ? detail : JSON.stringify(detail));
|
|
79
|
+
this.status = status;
|
|
80
|
+
this.detail = detail;
|
|
81
|
+
}
|
|
82
|
+
status;
|
|
83
|
+
detail;
|
|
84
|
+
};
|
|
85
|
+
async function contractRequest(path, init = {}) {
|
|
86
|
+
const auth2 = await getAuthHeader();
|
|
87
|
+
if (!auth2)
|
|
88
|
+
throw new ContractError(401, {
|
|
89
|
+
code: "unauthenticated",
|
|
90
|
+
message: "Run trajectories auth login with a named Refresh account."
|
|
91
|
+
});
|
|
92
|
+
const response = await fetch(getApiUrl() + "/api/contracts" + path, {
|
|
93
|
+
...init,
|
|
94
|
+
headers: {
|
|
95
|
+
Authorization: auth2,
|
|
96
|
+
"Content-Type": "application/json",
|
|
97
|
+
...init.headers
|
|
98
|
+
},
|
|
99
|
+
signal: AbortSignal.timeout(12e4)
|
|
100
|
+
});
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
const body = await response.json().catch(() => ({ detail: "Contract request failed" }));
|
|
103
|
+
throw new ContractError(response.status, body.detail);
|
|
104
|
+
}
|
|
105
|
+
if (response.headers.get("content-type")?.includes("application/pdf"))
|
|
106
|
+
return Buffer.from(await response.arrayBuffer());
|
|
107
|
+
return response.json();
|
|
108
|
+
}
|
|
109
|
+
function errorExit(status) {
|
|
110
|
+
return status === 401 ? 3 : status === 403 ? 4 : status === 409 ? 5 : status === 422 ? 2 : 1;
|
|
111
|
+
}
|
|
112
|
+
function registerContracts(program2) {
|
|
113
|
+
const group = program2.command("contracts").description(
|
|
114
|
+
"Draft, issue and manage private Refresh contracts. Never signs for a recipient."
|
|
115
|
+
);
|
|
116
|
+
const wrap = (fn) => async (...args) => {
|
|
117
|
+
try {
|
|
118
|
+
const data = await fn(...args);
|
|
119
|
+
process.stdout.write(
|
|
120
|
+
JSON.stringify({ schema_version: "1", data }) + "\n"
|
|
121
|
+
);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
const status = e instanceof ContractError ? e.status : 0;
|
|
124
|
+
process.stdout.write(
|
|
125
|
+
JSON.stringify({
|
|
126
|
+
schema_version: "1",
|
|
127
|
+
error: e instanceof ContractError ? e.detail : { code: "client_error", message: e.message }
|
|
128
|
+
}) + "\n"
|
|
129
|
+
);
|
|
130
|
+
process.exitCode = errorExit(status);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const json = (cmd) => cmd.option("--json", "Machine-readable JSON (also the default)");
|
|
134
|
+
json(
|
|
135
|
+
group.command("preview-file").description(
|
|
136
|
+
"Render a local HTML draft without logging in, issuing or sending. Does not create a server record."
|
|
137
|
+
).requiredOption("--file <path>").requiredOption("--output <path>")
|
|
138
|
+
).action(
|
|
139
|
+
wrap(async (opts) => {
|
|
140
|
+
const { previewContractFile } = await import("./contracts-preview-3J2PLT3U.js");
|
|
141
|
+
return previewContractFile(opts.file, opts.output);
|
|
142
|
+
})
|
|
143
|
+
);
|
|
144
|
+
for (const name of ["capabilities", "schema"])
|
|
145
|
+
json(group.command(name)).action(wrap(() => contractRequest("/" + name)));
|
|
146
|
+
const templates = group.command("templates").description("Discover and generate reviewable legal templates");
|
|
147
|
+
json(templates.command("list")).action(
|
|
148
|
+
wrap(() => contractRequest("/templates"))
|
|
149
|
+
);
|
|
150
|
+
json(templates.command("generate").description("Generate a Common Paper Mutual NDA into a new draft file; no network calls or issuance").requiredOption("--file <draft.json>").requiredOption("--config <nda-config.json>").requiredOption("--output <draft-with-nda.json>")).action(wrap(async (opts) => {
|
|
151
|
+
const draft = JSON.parse(await readFile(opts.file, "utf8"));
|
|
152
|
+
const config = JSON.parse(await readFile(opts.config, "utf8"));
|
|
153
|
+
for (const key of Object.keys(config)) {
|
|
154
|
+
if (!(key in emptyNdaConfig) || typeof config[key] !== "string") throw new Error(`Invalid NDA configuration: ${key}`);
|
|
155
|
+
}
|
|
156
|
+
const result = generateCommonPaperNda({ ...emptyNdaConfig, ...config }, draft);
|
|
157
|
+
const { pending, ...patch } = result;
|
|
158
|
+
await writeFile(opts.output, JSON.stringify({ ...draft, ...patch, nda_required: true }, null, 2) + "\n", { flag: "wx", mode: 384 });
|
|
159
|
+
return { output: opts.output, template: result.nda_template, terms_approved: false, pending, issued: false, sent: false };
|
|
160
|
+
}));
|
|
161
|
+
json(
|
|
162
|
+
group.command("list").option("--status <status>").option("--offset <number>", "Pagination offset", "0").option("--limit <number>", "Page size", "50").option("--archived")
|
|
163
|
+
).action(
|
|
164
|
+
wrap(
|
|
165
|
+
(opts) => contractRequest(
|
|
166
|
+
"?" + new URLSearchParams({
|
|
167
|
+
offset: opts.offset,
|
|
168
|
+
limit: opts.limit,
|
|
169
|
+
archived: String(!!opts.archived),
|
|
170
|
+
...opts.status ? { status: opts.status } : {}
|
|
171
|
+
})
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
);
|
|
175
|
+
const body = async (file) => JSON.stringify(JSON.parse(await readFile(file, "utf8")));
|
|
176
|
+
json(group.command("validate").requiredOption("--file <path>")).action(
|
|
177
|
+
wrap(
|
|
178
|
+
async (opts) => contractRequest("/validate", {
|
|
179
|
+
method: "POST",
|
|
180
|
+
body: await body(opts.file)
|
|
181
|
+
})
|
|
182
|
+
)
|
|
183
|
+
);
|
|
184
|
+
json(
|
|
185
|
+
group.command("create").requiredOption("--file <path>").requiredOption(
|
|
186
|
+
"--idempotency-key <key>",
|
|
187
|
+
"Reuse the same key on retries"
|
|
188
|
+
)
|
|
189
|
+
).action(
|
|
190
|
+
wrap(
|
|
191
|
+
async (opts) => contractRequest("", {
|
|
192
|
+
method: "POST",
|
|
193
|
+
headers: { "Idempotency-Key": opts.idempotencyKey },
|
|
194
|
+
body: await body(opts.file)
|
|
195
|
+
})
|
|
196
|
+
)
|
|
197
|
+
);
|
|
198
|
+
for (const name of ["get", "status", "preview"])
|
|
199
|
+
json(group.command(name + " <id>")).action(
|
|
200
|
+
wrap((id) => contractRequest("/" + encodeURIComponent(id)))
|
|
201
|
+
);
|
|
202
|
+
json(
|
|
203
|
+
group.command("update <id>").requiredOption("--file <path>").requiredOption("--if-match <revision>")
|
|
204
|
+
).action(
|
|
205
|
+
wrap(
|
|
206
|
+
async (id, opts) => contractRequest("/" + encodeURIComponent(id), {
|
|
207
|
+
method: "PUT",
|
|
208
|
+
headers: { "If-Match": opts.ifMatch },
|
|
209
|
+
body: await body(opts.file)
|
|
210
|
+
})
|
|
211
|
+
)
|
|
212
|
+
);
|
|
213
|
+
json(
|
|
214
|
+
group.command("publish <id>").description(
|
|
215
|
+
"Freeze this reviewed revision and activate signing; does not send email"
|
|
216
|
+
).requiredOption("--if-match <revision>")
|
|
217
|
+
).action(
|
|
218
|
+
wrap(
|
|
219
|
+
(id, opts) => contractRequest(`/${encodeURIComponent(id)}/publish`, {
|
|
220
|
+
method: "POST",
|
|
221
|
+
headers: { "If-Match": opts.ifMatch }
|
|
222
|
+
})
|
|
223
|
+
)
|
|
224
|
+
);
|
|
225
|
+
json(
|
|
226
|
+
group.command("send <id>").description(
|
|
227
|
+
"Email an issued invitation; invoke only when delivery was requested"
|
|
228
|
+
).requiredOption("--idempotency-key <key>")
|
|
229
|
+
).action(
|
|
230
|
+
wrap(
|
|
231
|
+
(id, opts) => contractRequest(`/${encodeURIComponent(id)}/send`, {
|
|
232
|
+
method: "POST",
|
|
233
|
+
headers: { "Idempotency-Key": opts.idempotencyKey }
|
|
234
|
+
})
|
|
235
|
+
)
|
|
236
|
+
);
|
|
237
|
+
for (const name of ["sync", "revoke"])
|
|
238
|
+
json(group.command(name + " <id>")).action(
|
|
239
|
+
wrap(
|
|
240
|
+
(id) => contractRequest(`/${encodeURIComponent(id)}/${name}`, {
|
|
241
|
+
method: "POST"
|
|
242
|
+
})
|
|
243
|
+
)
|
|
244
|
+
);
|
|
245
|
+
json(
|
|
246
|
+
group.command("archive <id>").option("--undo", "Restore to active list")
|
|
247
|
+
).action(
|
|
248
|
+
wrap(
|
|
249
|
+
(id, opts) => contractRequest(`/${encodeURIComponent(id)}/archive`, {
|
|
250
|
+
method: "POST",
|
|
251
|
+
body: JSON.stringify({ archived: !opts.undo })
|
|
252
|
+
})
|
|
253
|
+
)
|
|
254
|
+
);
|
|
255
|
+
json(
|
|
256
|
+
group.command("download <id>").requiredOption("--document <kind>", "agreement or nda").requiredOption("--output <path>")
|
|
257
|
+
).action(
|
|
258
|
+
wrap(async (id, opts) => {
|
|
259
|
+
if (!["agreement", "nda"].includes(opts.document))
|
|
260
|
+
throw new ContractError(422, "Document must be agreement or nda");
|
|
261
|
+
const bytes = await contractRequest(
|
|
262
|
+
`/${encodeURIComponent(id)}/documents/${opts.document}/download`
|
|
263
|
+
);
|
|
264
|
+
await writeFile(opts.output, bytes, { flag: "wx", mode: 384 });
|
|
265
|
+
return { path: opts.output };
|
|
266
|
+
})
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// src/cli.ts
|
|
5
271
|
import { readFileSync } from "fs";
|
|
6
272
|
import { fileURLToPath } from "url";
|
|
7
273
|
import { dirname, join } from "path";
|
|
@@ -193,7 +459,7 @@ async function uploadTaskAction(directory, opts) {
|
|
|
193
459
|
Uploading task ${directory} \u2192 ${chalk.cyan(name)}
|
|
194
460
|
`));
|
|
195
461
|
try {
|
|
196
|
-
const { pushTask } = await import("./push-task-
|
|
462
|
+
const { pushTask } = await import("./push-task-FN4XODRC.js");
|
|
197
463
|
const result = await pushTask(directory, {
|
|
198
464
|
name: opts.name,
|
|
199
465
|
visibility: opts.visibility
|
|
@@ -320,18 +586,18 @@ async function downloadProjectAction(url, opts) {
|
|
|
320
586
|
async function deleteTrajectoryAction(url, opts) {
|
|
321
587
|
const chalk = (await import("chalk")).default;
|
|
322
588
|
const { parseJobId } = await import("./download-BWJDAVMM.js");
|
|
323
|
-
const { getApiUrl, getAuthHeader } = await import("./config-QS2IT5DI.js");
|
|
589
|
+
const { getApiUrl: getApiUrl2, getAuthHeader: getAuthHeader2 } = await import("./config-QS2IT5DI.js");
|
|
324
590
|
let jobId = parseJobId(url);
|
|
325
591
|
if (jobId.startsWith("org:")) {
|
|
326
592
|
console.error(chalk.red("\n \u2717 Please use a direct job URL or UUID for deletion.\n"));
|
|
327
593
|
process.exit(1);
|
|
328
594
|
}
|
|
329
|
-
const authHeader = await
|
|
595
|
+
const authHeader = await getAuthHeader2();
|
|
330
596
|
if (!authHeader) {
|
|
331
597
|
console.error(chalk.red(" \u2717 Not authenticated. Run: trajectories auth login"));
|
|
332
598
|
process.exit(1);
|
|
333
599
|
}
|
|
334
|
-
const apiUrl =
|
|
600
|
+
const apiUrl = getApiUrl2();
|
|
335
601
|
const headers = { Authorization: authHeader };
|
|
336
602
|
try {
|
|
337
603
|
const previewResp = await fetch(`${apiUrl}/api/cli/delete/${jobId}/preview`, { headers });
|
|
@@ -708,12 +974,12 @@ project.command("remove <project|set> [sets...]").description("Remove trajectory
|
|
|
708
974
|
program.command("whoami").description("Show current authentication status").action(async () => {
|
|
709
975
|
const chalk = (await import("chalk")).default;
|
|
710
976
|
const { status } = await import("./auth-NNBHKNIF.js");
|
|
711
|
-
const { getApiUrl } = await import("./config-QS2IT5DI.js");
|
|
977
|
+
const { getApiUrl: getApiUrl2 } = await import("./config-QS2IT5DI.js");
|
|
712
978
|
const s = status();
|
|
713
979
|
if (s.loggedIn) {
|
|
714
980
|
console.log(chalk.green(" \u2713 Authenticated"));
|
|
715
981
|
if (s.email) console.log(` Email: ${s.email}`);
|
|
716
|
-
console.log(` API: ${
|
|
982
|
+
console.log(` API: ${getApiUrl2()}`);
|
|
717
983
|
} else {
|
|
718
984
|
console.log(chalk.dim(" Not logged in. Run: trajectories auth login"));
|
|
719
985
|
}
|
|
@@ -723,4 +989,5 @@ if (process.argv.length <= 2) {
|
|
|
723
989
|
program.outputHelp();
|
|
724
990
|
process.exit(1);
|
|
725
991
|
}
|
|
992
|
+
registerContracts(program);
|
|
726
993
|
await program.parseAsync();
|