@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.
@@ -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.30",
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 getConfigDir() {
44923
+ function getConfigBase() {
44924
44924
  const sys = platform2();
44925
- if (sys === "win32") {
44926
- const base = process.env.APPDATA || join2(homedir2(), "AppData", "Roaming");
44927
- return join2(base, "todoai-cli");
44928
- }
44929
- if (sys === "darwin") {
44930
- return join2(homedir2(), "Library", "Application Support", "todoai-cli");
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
- const xdg = process.env.XDG_CONFIG_HOME || join2(homedir2(), ".config");
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("Please enter your numeric choice: ");
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 hasProject = args.project || cfgScope.data.default_project_id;
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
  `);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@todoforai/cli",
3
- "version": "0.1.30",
3
+ "version": "0.1.31",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "todoforai-cli": "bin/todoforai-cli.js",