@todoforai/cli 0.1.30 → 0.1.31
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/todoforai-cli.js +43 -24
- package/package.json +1 -1
package/dist/todoforai-cli.js
CHANGED
|
@@ -44221,7 +44221,7 @@ import { parseArgs } from "util";
|
|
|
44221
44221
|
// package.json
|
|
44222
44222
|
var package_default = {
|
|
44223
44223
|
name: "@todoforai/cli",
|
|
44224
|
-
version: "0.1.
|
|
44224
|
+
version: "0.1.31",
|
|
44225
44225
|
type: "module",
|
|
44226
44226
|
bin: {
|
|
44227
44227
|
"todoforai-cli": "bin/todoforai-cli.js",
|
|
@@ -44254,7 +44254,7 @@ var package_default = {
|
|
|
44254
44254
|
var DEFAULT_API_URL = "https://api.todofor.ai";
|
|
44255
44255
|
var VERSION = package_default.version;
|
|
44256
44256
|
function getEnv(name) {
|
|
44257
|
-
return process.env[`TODOFORAI_${name}`] || process.env[`TODO4AI_${name}`] || "";
|
|
44257
|
+
return (process.env[`TODOFORAI_${name}`] || process.env[`TODO4AI_${name}`] || "").trim();
|
|
44258
44258
|
}
|
|
44259
44259
|
function printUsage() {
|
|
44260
44260
|
process.stderr.write(`
|
|
@@ -44917,20 +44917,29 @@ async function autoCreateAgent(api, resolvedPath) {
|
|
|
44917
44917
|
}
|
|
44918
44918
|
|
|
44919
44919
|
// src/config.ts
|
|
44920
|
-
import { existsSync, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
|
|
44920
|
+
import { existsSync, mkdirSync as mkdirSync2, readFileSync as readFileSync2, renameSync, writeFileSync as writeFileSync2 } from "fs";
|
|
44921
44921
|
import { dirname as dirname2, join as join2, resolve as resolve2 } from "path";
|
|
44922
44922
|
import { homedir as homedir2, platform as platform2 } from "os";
|
|
44923
|
-
function
|
|
44923
|
+
function getConfigBase() {
|
|
44924
44924
|
const sys = platform2();
|
|
44925
|
-
if (sys === "win32")
|
|
44926
|
-
|
|
44927
|
-
|
|
44928
|
-
|
|
44929
|
-
|
|
44930
|
-
|
|
44925
|
+
if (sys === "win32")
|
|
44926
|
+
return process.env.APPDATA || join2(homedir2(), "AppData", "Roaming");
|
|
44927
|
+
if (sys === "darwin")
|
|
44928
|
+
return join2(homedir2(), "Library", "Application Support");
|
|
44929
|
+
return process.env.XDG_CONFIG_HOME || join2(homedir2(), ".config");
|
|
44930
|
+
}
|
|
44931
|
+
function getConfigDir() {
|
|
44932
|
+
const base = getConfigBase();
|
|
44933
|
+
const dir = join2(base, "todoforai-cli");
|
|
44934
|
+
const legacy = join2(base, "todoai-cli");
|
|
44935
|
+
if (!existsSync(dir) && existsSync(legacy)) {
|
|
44936
|
+
try {
|
|
44937
|
+
renameSync(legacy, dir);
|
|
44938
|
+
} catch {
|
|
44939
|
+
return legacy;
|
|
44940
|
+
}
|
|
44931
44941
|
}
|
|
44932
|
-
|
|
44933
|
-
return join2(xdg, "todoai-cli");
|
|
44942
|
+
return dir;
|
|
44934
44943
|
}
|
|
44935
44944
|
function defaultScope() {
|
|
44936
44945
|
return {
|
|
@@ -45573,7 +45582,16 @@ function selectProject(projects, defaultId, setDefault) {
|
|
|
45573
45582
|
return Promise.resolve({ id: defaultId, name });
|
|
45574
45583
|
}
|
|
45575
45584
|
}
|
|
45585
|
+
const accountDefault = projects.find((p) => p?.project?.isDefault) || projects[0];
|
|
45586
|
+
if (!process.stdin.isTTY) {
|
|
45587
|
+
const id = getItemId(accountDefault);
|
|
45588
|
+
const name = getDisplayName(accountDefault);
|
|
45589
|
+
process.stderr.write(`Using account default project: ${name}
|
|
45590
|
+
`);
|
|
45591
|
+
return Promise.resolve({ id, name });
|
|
45592
|
+
}
|
|
45576
45593
|
return (async () => {
|
|
45594
|
+
const defIdx = projects.indexOf(accountDefault);
|
|
45577
45595
|
process.stderr.write(`
|
|
45578
45596
|
Please choose a project:
|
|
45579
45597
|
|
|
@@ -45581,7 +45599,7 @@ Please choose a project:
|
|
|
45581
45599
|
for (let i = 0;i < projects.length; i++) {
|
|
45582
45600
|
const name = getDisplayName(projects[i]);
|
|
45583
45601
|
const id = getItemId(projects[i]);
|
|
45584
|
-
process.stderr.write(` [${i + 1}] ${name}
|
|
45602
|
+
process.stderr.write(` [${i + 1}] ${name}${i === defIdx ? " (default)" : ""}
|
|
45585
45603
|
`);
|
|
45586
45604
|
if (id && id !== name)
|
|
45587
45605
|
process.stderr.write(` ${id}
|
|
@@ -45590,8 +45608,8 @@ Please choose a project:
|
|
|
45590
45608
|
process.stderr.write(`
|
|
45591
45609
|
`);
|
|
45592
45610
|
while (true) {
|
|
45593
|
-
const choice = await terminalLine(
|
|
45594
|
-
const idx = parseInt(choice, 10) - 1;
|
|
45611
|
+
const choice = await terminalLine(`Please enter your numeric choice [${defIdx + 1}]: `);
|
|
45612
|
+
const idx = choice === "" ? defIdx : parseInt(choice, 10) - 1;
|
|
45595
45613
|
if (idx >= 0 && idx < projects.length) {
|
|
45596
45614
|
const id = getItemId(projects[idx]);
|
|
45597
45615
|
const name = getDisplayName(projects[idx]);
|
|
@@ -46924,7 +46942,7 @@ Cancelled by user (Ctrl+C)
|
|
|
46924
46942
|
`);
|
|
46925
46943
|
process.exit(2);
|
|
46926
46944
|
}
|
|
46927
|
-
let projectId2 = args.project || cfgScope.data.default_project_id;
|
|
46945
|
+
let projectId2 = args.project || getEnv("PROJECT_ID") || cfgScope.data.default_project_id;
|
|
46928
46946
|
if (!projectId2) {
|
|
46929
46947
|
const projects2 = await api.listProjects();
|
|
46930
46948
|
projectId2 = projects2.find((p) => p.project?.isDefault)?.project?.id || projects2[0]?.project?.id;
|
|
@@ -46959,7 +46977,7 @@ Cancelled by user (Ctrl+C)
|
|
|
46959
46977
|
return;
|
|
46960
46978
|
}
|
|
46961
46979
|
if (positionals[0] === "claim" && positionals[1] === "mint") {
|
|
46962
|
-
let seedProjectId = args.seed || args.project || cfgScope.data.default_project_id;
|
|
46980
|
+
let seedProjectId = args.seed || args.project || getEnv("PROJECT_ID") || cfgScope.data.default_project_id;
|
|
46963
46981
|
if (!seedProjectId) {
|
|
46964
46982
|
const projects2 = await api.listProjects();
|
|
46965
46983
|
seedProjectId = projects2.find((p) => p.project?.isDefault)?.project?.id || projects2[0]?.project?.id;
|
|
@@ -47001,7 +47019,7 @@ Cancelled by user (Ctrl+C)
|
|
|
47001
47019
|
return;
|
|
47002
47020
|
}
|
|
47003
47021
|
if (positionals[0] === "next") {
|
|
47004
|
-
let projectId2 = args.project || cfgScope.data.default_project_id;
|
|
47022
|
+
let projectId2 = args.project || getEnv("PROJECT_ID") || cfgScope.data.default_project_id;
|
|
47005
47023
|
if (!projectId2) {
|
|
47006
47024
|
const projects2 = await api.listProjects();
|
|
47007
47025
|
projectId2 = projects2.find((p) => p.project?.isDefault)?.project?.id || projects2[0]?.project?.id;
|
|
@@ -47051,7 +47069,7 @@ Cancelled by user (Ctrl+C)
|
|
|
47051
47069
|
return;
|
|
47052
47070
|
}
|
|
47053
47071
|
if (positionals[0] === "list" || positionals[0] === "ls") {
|
|
47054
|
-
let defaultProjectId = args.project || cfgScope.data.default_project_id;
|
|
47072
|
+
let defaultProjectId = args.project || getEnv("PROJECT_ID") || cfgScope.data.default_project_id;
|
|
47055
47073
|
if (!defaultProjectId) {
|
|
47056
47074
|
const projects2 = await api.listProjects();
|
|
47057
47075
|
defaultProjectId = projects2.find((p) => p.project?.isDefault)?.project?.id || projects2[0]?.project?.id;
|
|
@@ -47106,7 +47124,7 @@ Cancelled by user (Ctrl+C)
|
|
|
47106
47124
|
process.stderr.write(`${DIM}${spec.description}${RESET}
|
|
47107
47125
|
`);
|
|
47108
47126
|
const projects2 = await api.listProjects();
|
|
47109
|
-
let projectId2 = args.project;
|
|
47127
|
+
let projectId2 = args.project || getEnv("PROJECT_ID");
|
|
47110
47128
|
if (!projectId2) {
|
|
47111
47129
|
const cached = cfgScope.data.default_project_id;
|
|
47112
47130
|
projectId2 = (cached && projects2.some((p) => getItemId(p) === cached) ? cached : null) || projects2.find((p) => p.project?.isDefault)?.project?.id || projects2[0]?.project?.id;
|
|
@@ -47266,7 +47284,8 @@ Resumed: ${CYAN}${getFrontendUrl(apiUrl, todoId)}${RESET}
|
|
|
47266
47284
|
} else {
|
|
47267
47285
|
content = await readStdin();
|
|
47268
47286
|
}
|
|
47269
|
-
const
|
|
47287
|
+
const envProjectId = getEnv("PROJECT_ID");
|
|
47288
|
+
const hasProject = args.project || envProjectId || cfgScope.data.default_project_id;
|
|
47270
47289
|
const storedAgent = cfgScope.data.default_agent_settings;
|
|
47271
47290
|
const hasAgent = preMatchedAgent || storedAgent?.id && !args.agent;
|
|
47272
47291
|
let projects = null;
|
|
@@ -47277,8 +47296,8 @@ Resumed: ${CYAN}${getFrontendUrl(apiUrl, todoId)}${RESET}
|
|
|
47277
47296
|
}
|
|
47278
47297
|
let projectId;
|
|
47279
47298
|
let projectName;
|
|
47280
|
-
if (args.project) {
|
|
47281
|
-
projectId = args.project;
|
|
47299
|
+
if (args.project || envProjectId) {
|
|
47300
|
+
projectId = args.project || envProjectId;
|
|
47282
47301
|
projectName = projectId;
|
|
47283
47302
|
if (projects) {
|
|
47284
47303
|
const match = projects.find((p) => getItemId(p) === projectId);
|
|
@@ -47320,7 +47339,7 @@ Resumed: ${CYAN}${getFrontendUrl(apiUrl, todoId)}${RESET}
|
|
|
47320
47339
|
try {
|
|
47321
47340
|
todo = await api.addMessage(projectId, content, agent, undefined, undefined, undefined, groupTag || undefined, groupName);
|
|
47322
47341
|
} catch (e) {
|
|
47323
|
-
if (!args.project && cfgScope.data.default_project_id === projectId && /failed: 403/.test(e.message || "")) {
|
|
47342
|
+
if (!args.project && !envProjectId && cfgScope.data.default_project_id === projectId && /failed: 403/.test(e.message || "")) {
|
|
47324
47343
|
cfgScope.clearDefaultProject();
|
|
47325
47344
|
process.stderr.write(`${RED}Not authorized for cached default project ${projectName} (${projectId}) \u2014 cleared it. Re-run to pick a project.${RESET}
|
|
47326
47345
|
`);
|