@doist/todoist-cli 3.0.4 → 3.0.5

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/CHANGELOG.md CHANGED
@@ -1,3 +1,5 @@
1
+ ## [3.0.5](https://github.com/Doist/todoist-cli/compare/v3.0.4...v3.0.5) (2026-07-28)
2
+
1
3
  ## [3.0.4](https://github.com/Doist/todoist-cli/compare/v3.0.3...v3.0.4) (2026-07-27)
2
4
 
3
5
  ## [3.0.3](https://github.com/Doist/todoist-cli/compare/v3.0.2...v3.0.3) (2026-07-27)
package/README.md CHANGED
@@ -28,6 +28,8 @@ td skill install universal
28
28
 
29
29
  Skills are installed to `~/<agent-dir>/skills/todoist-cli/SKILL.md` (e.g. `~/.claude/` for claude-code, `~/.agents/` for universal, etc.). When updating the CLI, installed skills are updated automatically. The `universal` agent is compatible with Amp, OpenCode, and other agents that read from `~/.agents/`.
30
30
 
31
+ The `gemini` agent installs to `~/.gemini/config/skills/todoist-cli/SKILL.md`, the global location read by Antigravity, Antigravity CLI and Antigravity IDE alike. For project-scoped Antigravity skills use `td skill install universal --local`, which writes to `.agents/skills/` — the workspace directory Antigravity reads.
32
+
31
33
  ```bash
32
34
  td skill list
33
35
  td skill uninstall <agent>
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/skill/install.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxF"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/skill/install.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxF"}
@@ -11,9 +11,14 @@ export async function installSkill(agent, options) {
11
11
  }
12
12
  const local = options.local ?? false;
13
13
  const force = options.force ?? false;
14
+ const legacyPath = installer.getLegacyInstallPath(local);
15
+ const hadLegacy = await installer.hasLegacyInstall(local);
14
16
  await installer.install(local, force);
15
17
  const filepath = installer.getInstallPath(local);
16
18
  console.log(chalk.green('✓'), `Installed ${installer.name} skill`);
17
19
  console.log(chalk.dim(filepath));
20
+ if (hadLegacy && legacyPath) {
21
+ console.log(chalk.dim(`Removed skill from previous location ${legacyPath}`));
22
+ }
18
23
  }
19
24
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/skill/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAOpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,OAAuB;IACrE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,kBAAkB,KAAK,EAAE,EAAE;YAC3D,qBAAqB,SAAS,EAAE;SACnC,CAAC,CAAA;IACN,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IAEpC,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAErC,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,aAAa,SAAS,CAAC,IAAI,QAAQ,CAAC,CAAA;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpC,CAAC"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/skill/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAOpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,OAAuB;IACrE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,kBAAkB,KAAK,EAAE,EAAE;YAC3D,qBAAqB,SAAS,EAAE;SACnC,CAAC,CAAA;IACN,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IAEpC,MAAM,UAAU,GAAG,SAAS,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAEzD,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAErC,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,aAAa,SAAS,CAAC,IAAI,QAAQ,CAAC,CAAA;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChC,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC,CAAA;IAChF,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/skill/update.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtF"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/skill/update.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BtF"}
@@ -27,7 +27,9 @@ export async function updateSkill(agent, options) {
27
27
  ]);
28
28
  }
29
29
  const local = options.local ?? false;
30
- const installed = await installer.isInstalled(local);
30
+ const legacyPath = installer.getLegacyInstallPath(local);
31
+ const hadLegacy = await installer.hasLegacyInstall(local);
32
+ const installed = (await installer.isInstalled(local)) || hadLegacy;
31
33
  if (!installed) {
32
34
  throw new CliError('NOT_INSTALLED', `Skill is not installed for ${agent}. Use \`td skill install ${agent}${local ? ' --local' : ''}\` first.`);
33
35
  }
@@ -35,5 +37,8 @@ export async function updateSkill(agent, options) {
35
37
  const filepath = installer.getInstallPath(local);
36
38
  console.log(chalk.green('✓'), `Updated ${installer.name} skill`);
37
39
  console.log(chalk.dim(filepath));
40
+ if (hadLegacy && legacyPath) {
41
+ console.log(chalk.dim(`Removed skill from previous location ${legacyPath}`));
42
+ }
38
43
  }
39
44
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/skill/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AAM/E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAsB;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAA;IAEpD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,kBAAkB,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAA;IAClE,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,OAAsB;IACnE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,kBAAkB,KAAK,EAAE,EAAE;YAC3D,qBAAqB,SAAS,EAAE;SACnC,CAAC,CAAA;IACN,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACpC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CACd,eAAe,EACf,8BAA8B,KAAK,4BAA4B,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,CAC5G,CAAA;IACL,CAAC;IAED,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAE7B,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,WAAW,SAAS,CAAC,IAAI,QAAQ,CAAC,CAAA;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;AACpC,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/skill/update.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import type { SkillInstaller } from './types.js';
2
- interface InstallerConfig {
2
+ type InstallerConfig = {
3
3
  name: string;
4
4
  description: string;
5
5
  dirName: string;
6
6
  globalDirName?: string;
7
- }
7
+ /** Directory an earlier version of the CLI installed the global skill to, cleaned up on install and update. */
8
+ legacyGlobalDirName?: string;
9
+ };
8
10
  export declare function generateSkillFile(): string;
9
11
  export declare function createInstaller(config: InstallerConfig): SkillInstaller;
10
12
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"create-installer.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/create-installer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAa1C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CAyEvE"}
1
+ {"version":3,"file":"create-installer.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/create-installer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+GAA+G;IAC/G,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAa1C;AAmBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CAoHvE"}
@@ -1,4 +1,4 @@
1
- import { access, mkdir, readdir, rmdir, unlink, writeFile } from 'node:fs/promises';
1
+ import { access, mkdir, rmdir, unlink, writeFile } from 'node:fs/promises';
2
2
  import { homedir } from 'node:os';
3
3
  import { dirname, join } from 'node:path';
4
4
  import packageJson from '../../../package.json' with { type: 'json' };
@@ -18,16 +18,73 @@ metadata:
18
18
  `;
19
19
  return frontmatter + SKILL_CONTENT;
20
20
  }
21
+ function isEnoent(error) {
22
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
23
+ }
24
+ /** Removes up to `levels` directories, walking upwards, stopping at the first one that is not empty. */
25
+ async function removeEmptyDirs(startDir, levels) {
26
+ let dir = startDir;
27
+ for (let level = 0; level < levels; level++) {
28
+ try {
29
+ await rmdir(dir);
30
+ }
31
+ catch {
32
+ return;
33
+ }
34
+ dir = dirname(dir);
35
+ }
36
+ }
21
37
  export function createInstaller(config) {
22
38
  function getInstallPath(local) {
23
39
  const base = local ? process.cwd() : homedir();
24
40
  const dirName = local ? config.dirName : (config.globalDirName ?? config.dirName);
25
41
  return join(base, dirName, 'skills', SKILL_NAME, 'SKILL.md');
26
42
  }
43
+ function getLegacyInstallPath(local) {
44
+ if (local || !config.legacyGlobalDirName) {
45
+ return undefined;
46
+ }
47
+ return join(homedir(), config.legacyGlobalDirName, 'skills', SKILL_NAME, 'SKILL.md');
48
+ }
49
+ async function hasLegacyInstall(local) {
50
+ const filepath = getLegacyInstallPath(local);
51
+ if (!filepath) {
52
+ return false;
53
+ }
54
+ try {
55
+ await access(filepath);
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ async function removeLegacyInstall(local) {
63
+ const filepath = getLegacyInstallPath(local);
64
+ if (!filepath) {
65
+ return;
66
+ }
67
+ try {
68
+ await unlink(filepath);
69
+ }
70
+ catch (error) {
71
+ // Anything other than the file already being gone leaves the old skill
72
+ // active for clients that still read it, so it must not pass silently.
73
+ if (isEnoent(error)) {
74
+ return;
75
+ }
76
+ throw error;
77
+ }
78
+ // Prune the now-empty todoist-cli/ directory and, if nothing else lives
79
+ // there, the skills/ directory that contained it.
80
+ await removeEmptyDirs(dirname(filepath), 2);
81
+ }
27
82
  return {
28
83
  name: config.name,
29
84
  description: config.description,
30
85
  getInstallPath,
86
+ getLegacyInstallPath,
87
+ hasLegacyInstall,
31
88
  generateContent() {
32
89
  return generateSkillFile();
33
90
  },
@@ -57,28 +114,26 @@ export function createInstaller(config) {
57
114
  }
58
115
  await mkdir(dirname(filepath), { recursive: true });
59
116
  await writeFile(filepath, this.generateContent(), 'utf-8');
117
+ await removeLegacyInstall(local);
60
118
  },
61
119
  async update(local) {
62
120
  const filepath = getInstallPath(local);
121
+ await mkdir(dirname(filepath), { recursive: true });
63
122
  await writeFile(filepath, this.generateContent(), 'utf-8');
123
+ await removeLegacyInstall(local);
64
124
  },
65
125
  async uninstall(local) {
66
126
  const filepath = getInstallPath(local);
67
127
  const exists = await this.isInstalled(local);
68
- if (!exists) {
128
+ const legacyExists = await hasLegacyInstall(local);
129
+ if (!exists && !legacyExists) {
69
130
  throw new CliError('NOT_FOUND', `Skill file not found at ${filepath}`);
70
131
  }
71
- await unlink(filepath);
72
- const dir = dirname(filepath);
73
- try {
74
- const files = await readdir(dir);
75
- if (files.length === 0) {
76
- await rmdir(dir);
77
- }
78
- }
79
- catch {
80
- // Ignore errors when cleaning up empty directory
132
+ if (exists) {
133
+ await unlink(filepath);
134
+ await removeEmptyDirs(dirname(filepath), 1);
81
135
  }
136
+ await removeLegacyInstall(local);
82
137
  },
83
138
  };
84
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-installer.js","sourceRoot":"","sources":["../../../src/lib/skills/create-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-installer.js","sourceRoot":"","sources":["../../../src/lib/skills/create-installer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAqC1D,CAAA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAyC1D,CAAA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA"}
@@ -22,8 +22,12 @@ export const skillInstallers = {
22
22
  }),
23
23
  gemini: createInstaller({
24
24
  name: 'gemini',
25
- description: 'Gemini CLI skill for Todoist CLI',
25
+ // Antigravity reads global skills from ~/.gemini/config/skills — the only
26
+ // global location the Antigravity CLI, IDE and agent all pick up.
27
+ description: 'Antigravity (Gemini) skill for Todoist CLI',
26
28
  dirName: '.gemini',
29
+ globalDirName: '.gemini/config',
30
+ legacyGlobalDirName: '.gemini',
27
31
  }),
28
32
  pi: createInstaller({
29
33
  name: 'pi',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC3D,aAAa,EAAE,eAAe,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,SAAS;KACrB,CAAC;IACF,KAAK,EAAE,eAAe,CAAC;QACnB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,QAAQ;KACpB,CAAC;IACF,OAAO,EAAE,eAAe,CAAC;QACrB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,UAAU;KACtB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,SAAS;KACrB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,SAAS;KACrB,CAAC;IACF,EAAE,EAAE,eAAe,CAAC;QAChB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,WAAW;KAC7B,CAAC;IACF,SAAS,EAAE,eAAe,CAAC;QACvB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,SAAS;KACrB,CAAC;CACL,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;AACvC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC3D,aAAa,EAAE,eAAe,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,SAAS;KACrB,CAAC;IACF,KAAK,EAAE,eAAe,CAAC;QACnB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,QAAQ;KACpB,CAAC;IACF,OAAO,EAAE,eAAe,CAAC;QACrB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,UAAU;KACtB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,SAAS;KACrB,CAAC;IACF,MAAM,EAAE,eAAe,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,0EAA0E;QAC1E,kEAAkE;QAClE,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,gBAAgB;QAC/B,mBAAmB,EAAE,SAAS;KACjC,CAAC;IACF,EAAE,EAAE,eAAe,CAAC;QAChB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,WAAW;KAC7B,CAAC;IACF,SAAS,EAAE,eAAe,CAAC;QACvB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,SAAS;KACrB,CAAC;CACL,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;AACvC,CAAC"}
@@ -1,11 +1,14 @@
1
- export interface SkillInstaller {
1
+ export type SkillInstaller = {
2
2
  name: string;
3
3
  description: string;
4
4
  getInstallPath(local: boolean): string;
5
+ /** Path a previous CLI version installed to, or undefined when the agent never had one. */
6
+ getLegacyInstallPath(local: boolean): string | undefined;
7
+ hasLegacyInstall(local: boolean): Promise<boolean>;
5
8
  generateContent(): string;
6
9
  isInstalled(local: boolean): Promise<boolean>;
7
10
  install(local: boolean, force: boolean): Promise<void>;
8
11
  update(local: boolean): Promise<void>;
9
12
  uninstall(local: boolean): Promise<void>;
10
- }
13
+ };
11
14
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IACtC,eAAe,IAAI,MAAM,CAAA;IACzB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IACtC,2FAA2F;IAC3F,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACxD,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,eAAe,IAAI,MAAM,CAAA;IACzB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-installed.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/update-installed.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAoBvF"}
1
+ {"version":3,"file":"update-installed.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/update-installed.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBvF"}
@@ -5,7 +5,7 @@ export async function updateAllInstalledSkills(local) {
5
5
  const errors = [];
6
6
  for (const [name, installer] of Object.entries(skillInstallers)) {
7
7
  try {
8
- const isInstalled = await installer.isInstalled(local);
8
+ const isInstalled = (await installer.isInstalled(local)) || (await installer.hasLegacyInstall(local));
9
9
  if (isInstalled) {
10
10
  await installer.update(local);
11
11
  updated.push(name);
@@ -1 +1 @@
1
- {"version":3,"file":"update-installed.js","sourceRoot":"","sources":["../../../src/lib/skills/update-installed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAQ5C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAAc;IACzD,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACtD,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AACvC,CAAC"}
1
+ {"version":3,"file":"update-installed.js","sourceRoot":"","sources":["../../../src/lib/skills/update-installed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAQ5C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAAc;IACzD,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC;YACD,MAAM,WAAW,GACb,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;YACrF,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AACvC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doist/todoist-cli",
3
- "version": "3.0.4",
3
+ "version": "3.0.5",
4
4
  "description": "TypeScript CLI for Todoist",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -65,14 +65,14 @@
65
65
  "open": "11.0.0"
66
66
  },
67
67
  "devDependencies": {
68
- "@semantic-release/changelog": "6.0.3",
68
+ "@semantic-release/changelog": "7.0.0",
69
69
  "@semantic-release/exec": "7.1.0",
70
- "@semantic-release/git": "10.0.1",
70
+ "@semantic-release/git": "11.0.0",
71
71
  "@types/node": "25.9.5",
72
72
  "conventional-changelog-conventionalcommits": "10.2.1",
73
73
  "lefthook": "2.1.10",
74
- "oxfmt": "0.59.0",
75
- "oxlint": "1.74.0",
74
+ "oxfmt": "0.60.0",
75
+ "oxlint": "1.75.0",
76
76
  "semantic-release": "25.0.8",
77
77
  "typescript": "7.0.2",
78
78
  "vitest": "4.1.10"