@4ort/cli 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -7
- package/dist/api-client.d.ts +9 -1
- package/dist/api-client.js +9 -2
- package/dist/api-client.js.map +1 -1
- package/dist/commands/docs.d.ts +17 -0
- package/dist/commands/docs.js +90 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/domain.d.ts +20 -0
- package/dist/commands/domain.js +179 -0
- package/dist/commands/domain.js.map +1 -0
- package/dist/commands/domains.d.ts +6 -0
- package/dist/commands/domains.js +91 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/login-link.d.ts +1 -0
- package/dist/commands/login-link.js +18 -0
- package/dist/commands/login-link.js.map +1 -0
- package/dist/commands/mov-render.test.d.ts +1 -0
- package/dist/commands/mov-render.test.js +17 -0
- package/dist/commands/mov-render.test.js.map +1 -0
- package/dist/commands/mov.d.ts +31 -0
- package/dist/commands/mov.js +95 -1
- package/dist/commands/mov.js.map +1 -1
- package/dist/commands/register.d.ts +1 -0
- package/dist/commands/register.js +1 -1
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/repo.d.ts +9 -0
- package/dist/commands/repo.js +73 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/sheets.d.ts +17 -0
- package/dist/commands/sheets.js +90 -0
- package/dist/commands/sheets.js.map +1 -0
- package/dist/gitea-client.d.ts +41 -0
- package/dist/gitea-client.js +79 -0
- package/dist/gitea-client.js.map +1 -0
- package/dist/gitea-client.test.d.ts +1 -0
- package/dist/gitea-client.test.js +40 -0
- package/dist/gitea-client.test.js.map +1 -0
- package/dist/index.js +156 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +204 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/namesilo-client.d.ts +31 -0
- package/dist/namesilo-client.js +85 -0
- package/dist/namesilo-client.js.map +1 -0
- package/dist/namesilo-client.test.d.ts +1 -0
- package/dist/namesilo-client.test.js +58 -0
- package/dist/namesilo-client.test.js.map +1 -0
- package/dist/office-client.d.ts +76 -0
- package/dist/office-client.js +110 -0
- package/dist/office-client.js.map +1 -0
- package/dist/office-client.test.d.ts +1 -0
- package/dist/office-client.test.js +53 -0
- package/dist/office-client.test.js.map +1 -0
- package/package.json +1 -1
package/dist/commands/mov.js
CHANGED
|
@@ -13,10 +13,26 @@ import { saveMovConfig, optionalMovConfig } from "../config.js";
|
|
|
13
13
|
import { getOAuthClient, getToken, uploadVideo, listMyChannels, createChannel, listMyVideos, deleteVideo, resolveChannelId, privacyToEnum, buildWatchUrl, } from "../peertube-client.js";
|
|
14
14
|
const DEFAULT_SERVER = "https://4ort.mov";
|
|
15
15
|
export async function movLogin(options) {
|
|
16
|
-
|
|
16
|
+
let server = options.server || DEFAULT_SERVER;
|
|
17
17
|
// Non-interactive (agents/CI): flags or env. Falls back to prompts for humans.
|
|
18
18
|
let username = options.username || process.env.FORT_MOV_USERNAME;
|
|
19
19
|
let password = options.password || process.env.FORT_MOV_PASSWORD;
|
|
20
|
+
// --provisioned: pull the account minted by `4ort provision run video`.
|
|
21
|
+
if (options.provisioned && (!username || !password)) {
|
|
22
|
+
const { requireConfig } = await import("../config.js");
|
|
23
|
+
const { apiRequest } = await import("../api-client.js");
|
|
24
|
+
const data = await apiRequest(requireConfig(), "GET", "/api/provision/credentials/video").catch((e) => {
|
|
25
|
+
console.error(`No provisioned video account: ${e.message}`);
|
|
26
|
+
console.error("Run: 4ort provision run video");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
});
|
|
29
|
+
const byType = Object.fromEntries(data.credentials.map((c) => [c.type, c]));
|
|
30
|
+
username = username || byType.peertube_username?.value;
|
|
31
|
+
password = password || byType.peertube_password?.value;
|
|
32
|
+
if (!options.server && byType.peertube_username?.metadata?.server) {
|
|
33
|
+
server = byType.peertube_username.metadata.server;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
20
36
|
let rl;
|
|
21
37
|
try {
|
|
22
38
|
if (!username || !password) {
|
|
@@ -121,4 +137,82 @@ export async function movDelete(id) {
|
|
|
121
137
|
process.exit(1);
|
|
122
138
|
}
|
|
123
139
|
}
|
|
140
|
+
// ── render: drive video-factory (compose HTML → MP4, optional publish) ──────
|
|
141
|
+
export function buildRenderManifest(composition, opts) {
|
|
142
|
+
return {
|
|
143
|
+
composition,
|
|
144
|
+
assets: {},
|
|
145
|
+
render: { quality: opts.quality ?? "draft", fps: 30, format: "mp4" },
|
|
146
|
+
publish: { enabled: !!opts.publish, title: opts.title ?? "Untitled" },
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Single .html → inline; a directory → base64 tarball of its contents (type: tar).
|
|
150
|
+
async function loadComposition(p) {
|
|
151
|
+
const fs = await import("node:fs");
|
|
152
|
+
const os = await import("node:os");
|
|
153
|
+
const path = await import("node:path");
|
|
154
|
+
const tar = await import("tar");
|
|
155
|
+
const stat = fs.statSync(p);
|
|
156
|
+
if (stat.isFile())
|
|
157
|
+
return { type: "inline", data: fs.readFileSync(p, "utf-8") };
|
|
158
|
+
const tmp = path.join(os.tmpdir(), `mov-render-${Date.now()}.tar`);
|
|
159
|
+
await tar.create({ file: tmp, cwd: p }, fs.readdirSync(p));
|
|
160
|
+
const data = fs.readFileSync(tmp).toString("base64");
|
|
161
|
+
fs.rmSync(tmp, { force: true });
|
|
162
|
+
return { type: "tar", data };
|
|
163
|
+
}
|
|
164
|
+
export async function movRender(file, options) {
|
|
165
|
+
let server = options.server || process.env.FORT_FACTORY_URL || "https://factory.4ort.mov";
|
|
166
|
+
let key = options.key || process.env.FORT_FACTORY_KEY;
|
|
167
|
+
if (!key) {
|
|
168
|
+
// Fall back to the factory token minted by `4ort provision run video`.
|
|
169
|
+
try {
|
|
170
|
+
const { loadConfig } = await import("../config.js");
|
|
171
|
+
const { apiRequest } = await import("../api-client.js");
|
|
172
|
+
const config = loadConfig();
|
|
173
|
+
if (config?.apiKey) {
|
|
174
|
+
const data = await apiRequest(config, "GET", "/api/provision/credentials/video");
|
|
175
|
+
const cred = data.credentials.find((c) => c.type === "factory_key");
|
|
176
|
+
if (cred) {
|
|
177
|
+
key = cred.value;
|
|
178
|
+
if (!options.server && !process.env.FORT_FACTORY_URL && cred.metadata?.server)
|
|
179
|
+
server = cred.metadata.server;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// fall through to the error below
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!key) {
|
|
188
|
+
console.error("No factory token. Set --key / FORT_FACTORY_KEY, or run: 4ort provision run video");
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
const composition = await loadComposition(file);
|
|
192
|
+
const manifest = buildRenderManifest(composition, options);
|
|
193
|
+
const post = await fetch(`${server}/jobs`, {
|
|
194
|
+
method: "POST",
|
|
195
|
+
headers: { "content-type": "application/json", authorization: `Bearer ${key}` },
|
|
196
|
+
body: JSON.stringify(manifest),
|
|
197
|
+
});
|
|
198
|
+
if (!post.ok) {
|
|
199
|
+
console.error(`✗ ${post.status} ${await post.text()}`);
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
const { job_id } = (await post.json());
|
|
203
|
+
console.log(`job ${job_id} — rendering…`);
|
|
204
|
+
for (;;) {
|
|
205
|
+
await new Promise((r) => setTimeout(r, 3000));
|
|
206
|
+
const s = (await (await fetch(`${server}/jobs/${job_id}`, { headers: { authorization: `Bearer ${key}` } })).json());
|
|
207
|
+
process.stdout.write(`\r${s.stage ?? s.status} ${Math.round((s.progress ?? 0) * 100)}% `);
|
|
208
|
+
if (s.status === "done") {
|
|
209
|
+
console.log(`\n✓ ${s.watch_url ?? `${server}${s.mp4_url}`}`);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (s.status === "error") {
|
|
213
|
+
console.error(`\n✗ ${s.error}`);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
124
218
|
//# sourceMappingURL=mov.js.map
|
package/dist/commands/mov.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mov.js","sourceRoot":"","sources":["../../src/commands/mov.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"mov.js","sourceRoot":"","sources":["../../src/commands/mov.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,cAAc,EACd,QAAQ,EACR,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAK9B;IACC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAC9C,+EAA+E;IAC/E,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACjE,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAEjE,wEAAwE;IACxE,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,kCAAkC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;YACzG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC;QACvD,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YAClE,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpD,CAAC;IACH,CAAC;IACD,IAAI,EAAkC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ;gBAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxF,IAAI,CAAC,QAAQ;gBAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,uGAAuG,CAAC,CAAC;YACvH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,aAAa,CAAC;YACZ,MAAM;YACN,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,OAAyG;IAEzG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE;YAC/B,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,KAAK;YACnB,SAAS;YACT,OAAO;YACP,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,SAAS,EAAE,GAAG,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,mBAAmB,CACjC,WAAqD,EACrD,IAA6D;IAE7D,OAAO;QACL,WAAW;QACX,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QACpE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU,EAAE;KACtE,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,eAAe,CAAC,CAAS;IACtC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAA+F;IAE/F,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAC1F,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,uEAAuE;QACvE,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,kCAAkC,CAAC,CAAC;gBACjF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;gBACzE,IAAI,IAAI,EAAE,CAAC;oBACT,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;oBACjB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM;wBAAE,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC/G,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE;QACzC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE;QAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAQ,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,eAAe,CAAC,CAAC;IAC1C,SAAS,CAAC;QACR,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,MAAM,SAAS,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC3H,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5F,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -15,7 +15,7 @@ export async function register(name, options) {
|
|
|
15
15
|
}
|
|
16
16
|
console.log(`Registering agent "${name}" on ${server}...`);
|
|
17
17
|
try {
|
|
18
|
-
const result = await registerAgent(server, name, metadata);
|
|
18
|
+
const result = await registerAgent(server, name, metadata, options.backupEmail);
|
|
19
19
|
saveConfig({
|
|
20
20
|
apiKey: result.apiKey,
|
|
21
21
|
recoveryCode: result.recoveryCode,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,QAAQ,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,OAAqE;IAErE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAEhD,IAAI,QAAyC,CAAC;IAC9C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,QAAQ,MAAM,KAAK,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAEhF,UAAU,CAAC;YACT,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,IAAI;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,uCAAuC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function repoList(options: {
|
|
2
|
+
json?: boolean;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function repoCreate(name: string, options: {
|
|
5
|
+
description?: string;
|
|
6
|
+
private?: boolean;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
export declare function repoDelete(name: string): Promise<void>;
|
|
9
|
+
export declare function repoUrl(name: string): Promise<void>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `4ort repo` — code repos on 4ort.dev (the Launchpad, self-hosted Gitea).
|
|
3
|
+
* Identity comes from `4ort provision run gitea` credentials, or
|
|
4
|
+
* FORT_GITEA_USER + FORT_GITEA_TOKEN env vars.
|
|
5
|
+
*/
|
|
6
|
+
import { loadConfig } from "../config.js";
|
|
7
|
+
import { GiteaClient, resolveGiteaIdentity } from "../gitea-client.js";
|
|
8
|
+
const NO_IDENTITY_HELP = [
|
|
9
|
+
"No 4ort.dev identity found. Either:",
|
|
10
|
+
" 4ort provision run gitea # auto-create your Launchpad account",
|
|
11
|
+
" FORT_GITEA_USER=... FORT_GITEA_TOKEN=... # or bring your own token",
|
|
12
|
+
].join("\n");
|
|
13
|
+
async function requireClient() {
|
|
14
|
+
const identity = await resolveGiteaIdentity(loadConfig());
|
|
15
|
+
if (!identity) {
|
|
16
|
+
console.error(NO_IDENTITY_HELP);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
return new GiteaClient(identity);
|
|
20
|
+
}
|
|
21
|
+
export async function repoList(options) {
|
|
22
|
+
const client = await requireClient();
|
|
23
|
+
try {
|
|
24
|
+
const repos = await client.listRepos();
|
|
25
|
+
if (options.json) {
|
|
26
|
+
console.log(JSON.stringify(repos, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (repos.length === 0) {
|
|
30
|
+
console.log("No repos yet. Create one: 4ort repo create my-project");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
for (const r of repos) {
|
|
34
|
+
console.log(`${r.private ? "🔒" : " "} ${r.full_name} ${r.description || ""}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(`Failed: ${err.message}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function repoCreate(name, options) {
|
|
43
|
+
const client = await requireClient();
|
|
44
|
+
try {
|
|
45
|
+
const repo = await client.createRepo(name, options);
|
|
46
|
+
console.log(`Created ${repo.full_name} on ${client.server}`);
|
|
47
|
+
console.log(`\nPush your code:`);
|
|
48
|
+
console.log(` git init && git add -A && git commit -m "initial"`);
|
|
49
|
+
console.log(` git remote add 4ort ${client.pushUrl(repo.name)}`);
|
|
50
|
+
console.log(` git push -u 4ort main`);
|
|
51
|
+
console.log(`\n(The remote URL embeds your token — it lives in .git/config, keep the repo dir private.)`);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error(`Failed: ${err.message}`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function repoDelete(name) {
|
|
59
|
+
const client = await requireClient();
|
|
60
|
+
try {
|
|
61
|
+
await client.deleteRepo(name);
|
|
62
|
+
console.log(`Deleted ${client.username}/${name}`);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error(`Failed: ${err.message}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function repoUrl(name) {
|
|
70
|
+
const client = await requireClient();
|
|
71
|
+
console.log(client.pushUrl(name));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,gBAAgB,GAAG;IACvB,qCAAqC;IACrC,kFAAkF;IAClF,uEAAuE;CACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,KAAK,UAAU,aAAa;IAC1B,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAA2B;IACxD,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAoD;IACjG,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,SAAS,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,4FAA4F,CAAC,CAAC;IAC5G,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function sheetsList(options: {
|
|
2
|
+
json?: boolean;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function sheetsRead(id: string, options: {
|
|
5
|
+
json?: boolean;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function sheetsCreate(options: {
|
|
8
|
+
title?: string;
|
|
9
|
+
file?: string;
|
|
10
|
+
content?: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function sheetsUpdate(id: string, options: {
|
|
13
|
+
title?: string;
|
|
14
|
+
file?: string;
|
|
15
|
+
content?: string;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
export declare function sheetsDelete(id: string): Promise<void>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `4ort sheets` — manage spreadsheets on sheets.4ort.net.
|
|
3
|
+
* Content is CSV, from --file, --content, or piped stdin (in that order).
|
|
4
|
+
* `read` prints raw CSV so output pipes cleanly into other tools.
|
|
5
|
+
*/
|
|
6
|
+
import { requireConfig } from "../config.js";
|
|
7
|
+
import { sheetsClient, resolveContentInput } from "../office-client.js";
|
|
8
|
+
export async function sheetsList(options) {
|
|
9
|
+
const client = sheetsClient(requireConfig());
|
|
10
|
+
try {
|
|
11
|
+
const { sheets } = await client.list();
|
|
12
|
+
if (options.json) {
|
|
13
|
+
console.log(JSON.stringify(sheets, null, 2));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (sheets.length === 0) {
|
|
17
|
+
console.log("No sheets yet. Create one: 4ort sheets create --title 'Data' --file data.csv");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const s of sheets) {
|
|
21
|
+
console.log(`[${s.id}] ${s.title} (updated ${s.updatedAt})`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
console.error(`Failed: ${err.message}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function sheetsRead(id, options) {
|
|
30
|
+
const client = sheetsClient(requireConfig());
|
|
31
|
+
try {
|
|
32
|
+
const sheet = await client.read(id);
|
|
33
|
+
if (options.json) {
|
|
34
|
+
console.log(JSON.stringify(sheet, null, 2));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log(sheet.csv);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error(`Failed: ${err.message}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function sheetsCreate(options) {
|
|
45
|
+
const client = sheetsClient(requireConfig());
|
|
46
|
+
const csv = resolveContentInput(options);
|
|
47
|
+
if (csv === null) {
|
|
48
|
+
console.error("No content. Use --file <path>, --content <text>, or pipe CSV on stdin.");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const sheet = await client.create(csv, options.title);
|
|
53
|
+
console.log(`Created [${sheet.id}] ${sheet.title}`);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(`Failed: ${err.message}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export async function sheetsUpdate(id, options) {
|
|
61
|
+
const client = sheetsClient(requireConfig());
|
|
62
|
+
const csv = resolveContentInput(options);
|
|
63
|
+
if (csv === null && !options.title) {
|
|
64
|
+
console.error("Nothing to update. Pass --title and/or content (--file, --content, or stdin).");
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const sheet = await client.update(id, {
|
|
69
|
+
...(csv !== null ? { csv } : {}),
|
|
70
|
+
...(options.title ? { title: options.title } : {}),
|
|
71
|
+
});
|
|
72
|
+
console.log(`Updated [${sheet.id}] ${sheet.title} (${sheet.updatedAt})`);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(`Failed: ${err.message}`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function sheetsDelete(id) {
|
|
80
|
+
const client = sheetsClient(requireConfig());
|
|
81
|
+
try {
|
|
82
|
+
await client.remove(id);
|
|
83
|
+
console.log(`Deleted ${id}`);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error(`Failed: ${err.message}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=sheets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../src/commands/sheets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client for 4ort.dev (the Launchpad — self-hosted Gitea).
|
|
3
|
+
* Auth: the agent's own access token (`Authorization: token <sha1>`),
|
|
4
|
+
* minted by `4ort provision run gitea` (or FORT_GITEA_TOKEN env).
|
|
5
|
+
*/
|
|
6
|
+
import { Config } from "./config.js";
|
|
7
|
+
export declare const GITEA_DEFAULT_URL = "https://4ort.dev";
|
|
8
|
+
export interface GiteaRepo {
|
|
9
|
+
name: string;
|
|
10
|
+
full_name: string;
|
|
11
|
+
private: boolean;
|
|
12
|
+
description: string;
|
|
13
|
+
clone_url: string;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface GiteaIdentity {
|
|
17
|
+
server: string;
|
|
18
|
+
username: string;
|
|
19
|
+
token: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class GiteaClient {
|
|
22
|
+
private identity;
|
|
23
|
+
private fetchFn;
|
|
24
|
+
constructor(identity: GiteaIdentity, fetchFn?: typeof fetch);
|
|
25
|
+
get username(): string;
|
|
26
|
+
get server(): string;
|
|
27
|
+
private req;
|
|
28
|
+
listRepos(): Promise<GiteaRepo[]>;
|
|
29
|
+
createRepo(name: string, opts?: {
|
|
30
|
+
description?: string;
|
|
31
|
+
private?: boolean;
|
|
32
|
+
}): Promise<GiteaRepo>;
|
|
33
|
+
deleteRepo(name: string): Promise<null>;
|
|
34
|
+
/** HTTPS push URL with embedded credentials — for `git remote add` / `git push`. */
|
|
35
|
+
pushUrl(repoName: string): string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the agent's Gitea identity: FORT_GITEA_USER/FORT_GITEA_TOKEN env
|
|
39
|
+
* first, then the credentials stored by `4ort provision run gitea`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveGiteaIdentity(config: Config | null): Promise<GiteaIdentity | null>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { apiRequest } from "./api-client.js";
|
|
2
|
+
export const GITEA_DEFAULT_URL = "https://4ort.dev";
|
|
3
|
+
export class GiteaClient {
|
|
4
|
+
identity;
|
|
5
|
+
fetchFn;
|
|
6
|
+
constructor(identity, fetchFn = fetch) {
|
|
7
|
+
this.identity = identity;
|
|
8
|
+
this.fetchFn = fetchFn;
|
|
9
|
+
}
|
|
10
|
+
get username() {
|
|
11
|
+
return this.identity.username;
|
|
12
|
+
}
|
|
13
|
+
get server() {
|
|
14
|
+
return this.identity.server;
|
|
15
|
+
}
|
|
16
|
+
async req(path, init) {
|
|
17
|
+
const res = await this.fetchFn(`${this.identity.server}${path}`, {
|
|
18
|
+
...init,
|
|
19
|
+
headers: {
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
Authorization: `token ${this.identity.token}`,
|
|
22
|
+
...(init?.headers || {}),
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
const body = await res.text().catch(() => "");
|
|
27
|
+
throw new Error(`${res.status} ${res.statusText}${body ? `: ${body.slice(0, 200)}` : ""}`);
|
|
28
|
+
}
|
|
29
|
+
return res.status === 204 ? null : res.json();
|
|
30
|
+
}
|
|
31
|
+
listRepos() {
|
|
32
|
+
return this.req("/api/v1/user/repos?limit=50");
|
|
33
|
+
}
|
|
34
|
+
createRepo(name, opts = {}) {
|
|
35
|
+
return this.req("/api/v1/user/repos", {
|
|
36
|
+
method: "POST",
|
|
37
|
+
body: JSON.stringify({
|
|
38
|
+
name,
|
|
39
|
+
description: opts.description ?? "",
|
|
40
|
+
private: opts.private ?? false,
|
|
41
|
+
auto_init: false,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
deleteRepo(name) {
|
|
46
|
+
return this.req(`/api/v1/repos/${encodeURIComponent(this.identity.username)}/${encodeURIComponent(name)}`, { method: "DELETE" });
|
|
47
|
+
}
|
|
48
|
+
/** HTTPS push URL with embedded credentials — for `git remote add` / `git push`. */
|
|
49
|
+
pushUrl(repoName) {
|
|
50
|
+
const host = this.identity.server.replace(/^https?:\/\//, "");
|
|
51
|
+
return `https://${this.identity.username}:${this.identity.token}@${host}/${this.identity.username}/${repoName}.git`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the agent's Gitea identity: FORT_GITEA_USER/FORT_GITEA_TOKEN env
|
|
56
|
+
* first, then the credentials stored by `4ort provision run gitea`.
|
|
57
|
+
*/
|
|
58
|
+
export async function resolveGiteaIdentity(config) {
|
|
59
|
+
const envUser = process.env.FORT_GITEA_USER?.trim();
|
|
60
|
+
const envToken = process.env.FORT_GITEA_TOKEN?.trim();
|
|
61
|
+
if (envUser && envToken) {
|
|
62
|
+
return { server: process.env.FORT_GITEA_URL || GITEA_DEFAULT_URL, username: envUser, token: envToken };
|
|
63
|
+
}
|
|
64
|
+
if (!config?.apiKey)
|
|
65
|
+
return null;
|
|
66
|
+
try {
|
|
67
|
+
const data = await apiRequest(config, "GET", "/api/provision/credentials/gitea");
|
|
68
|
+
const byType = Object.fromEntries(data.credentials.map((c) => [c.type, c]));
|
|
69
|
+
const username = byType.gitea_username?.value;
|
|
70
|
+
const token = byType.gitea_token?.value;
|
|
71
|
+
if (!username || !token)
|
|
72
|
+
return null;
|
|
73
|
+
return { server: byType.gitea_token?.metadata?.server || GITEA_DEFAULT_URL, username, token };
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=gitea-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitea-client.js","sourceRoot":"","sources":["../src/gitea-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { GiteaClient } from "./gitea-client.js";
|
|
4
|
+
function stubFetch(status, payload) {
|
|
5
|
+
const calls = [];
|
|
6
|
+
const fetchFn = (async (url, init) => {
|
|
7
|
+
calls.push({ url: String(url), method: init?.method || "GET", headers: init?.headers || {}, body: init?.body });
|
|
8
|
+
return {
|
|
9
|
+
ok: status >= 200 && status < 300,
|
|
10
|
+
status,
|
|
11
|
+
statusText: "X",
|
|
12
|
+
json: async () => payload,
|
|
13
|
+
text: async () => JSON.stringify(payload),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
return { fetchFn, calls };
|
|
17
|
+
}
|
|
18
|
+
const id = { server: "https://4ort.dev", username: "pioneer", token: "sha1token" };
|
|
19
|
+
test("createRepo posts to /user/repos with token auth", async () => {
|
|
20
|
+
const { fetchFn, calls } = stubFetch(201, { name: "site", full_name: "pioneer/site" });
|
|
21
|
+
const repo = await new GiteaClient(id, fetchFn).createRepo("site", { private: true, description: "d" });
|
|
22
|
+
assert.equal(calls[0].url, "https://4ort.dev/api/v1/user/repos");
|
|
23
|
+
assert.equal(calls[0].headers.Authorization, "token sha1token");
|
|
24
|
+
assert.deepEqual(JSON.parse(calls[0].body), { name: "site", description: "d", private: true, auto_init: false });
|
|
25
|
+
assert.equal(repo.full_name, "pioneer/site");
|
|
26
|
+
});
|
|
27
|
+
test("deleteRepo targets the owner's repo", async () => {
|
|
28
|
+
const { fetchFn, calls } = stubFetch(204, null);
|
|
29
|
+
await new GiteaClient(id, fetchFn).deleteRepo("site");
|
|
30
|
+
assert.equal(calls[0].url, "https://4ort.dev/api/v1/repos/pioneer/site");
|
|
31
|
+
assert.equal(calls[0].method, "DELETE");
|
|
32
|
+
});
|
|
33
|
+
test("pushUrl embeds user:token credentials", () => {
|
|
34
|
+
assert.equal(new GiteaClient(id).pushUrl("site"), "https://pioneer:sha1token@4ort.dev/pioneer/site.git");
|
|
35
|
+
});
|
|
36
|
+
test("errors carry status and body", async () => {
|
|
37
|
+
const { fetchFn } = stubFetch(409, { message: "repo exists" });
|
|
38
|
+
await assert.rejects(new GiteaClient(id, fetchFn).createRepo("site"), /409.*repo exists/);
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=gitea-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitea-client.test.js","sourceRoot":"","sources":["../src/gitea-client.test.ts"],"names":[],"mappings":"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"}
|