@doist/todoist-cli 1.49.0 → 1.51.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/CHANGELOG.md +12 -0
- package/dist/commands/folder/create.d.ts +11 -0
- package/dist/commands/folder/create.d.ts.map +1 -0
- package/dist/commands/folder/create.js +35 -0
- package/dist/commands/folder/create.js.map +1 -0
- package/dist/commands/folder/delete.d.ts +6 -0
- package/dist/commands/folder/delete.d.ts.map +1 -0
- package/dist/commands/folder/delete.js +21 -0
- package/dist/commands/folder/delete.js.map +1 -0
- package/dist/commands/folder/helpers.d.ts +9 -0
- package/dist/commands/folder/helpers.d.ts.map +1 -0
- package/dist/commands/folder/helpers.js +34 -0
- package/dist/commands/folder/helpers.js.map +1 -0
- package/dist/commands/folder/index.d.ts +3 -0
- package/dist/commands/folder/index.d.ts.map +1 -0
- package/dist/commands/folder/index.js +109 -0
- package/dist/commands/folder/index.js.map +1 -0
- package/dist/commands/folder/list.d.ts +3 -0
- package/dist/commands/folder/list.d.ts.map +1 -0
- package/dist/commands/folder/list.js +42 -0
- package/dist/commands/folder/list.js.map +1 -0
- package/dist/commands/folder/update.d.ts +10 -0
- package/dist/commands/folder/update.d.ts.map +1 -0
- package/dist/commands/folder/update.js +33 -0
- package/dist/commands/folder/update.js.map +1 -0
- package/dist/commands/folder/view.d.ts +8 -0
- package/dist/commands/folder/view.d.ts.map +1 -0
- package/dist/commands/folder/view.js +52 -0
- package/dist/commands/folder/view.js.map +1 -0
- package/dist/commands/hc/index.d.ts +3 -0
- package/dist/commands/hc/index.d.ts.map +1 -0
- package/dist/commands/hc/index.js +54 -0
- package/dist/commands/hc/index.js.map +1 -0
- package/dist/commands/hc/locales.d.ts +5 -0
- package/dist/commands/hc/locales.d.ts.map +1 -0
- package/dist/commands/hc/locales.js +18 -0
- package/dist/commands/hc/locales.js.map +1 -0
- package/dist/commands/hc/search.d.ts +7 -0
- package/dist/commands/hc/search.d.ts.map +1 -0
- package/dist/commands/hc/search.js +28 -0
- package/dist/commands/hc/search.js.map +1 -0
- package/dist/commands/hc/view.d.ts +8 -0
- package/dist/commands/hc/view.d.ts.map +1 -0
- package/dist/commands/hc/view.js +31 -0
- package/dist/commands/hc/view.js.map +1 -0
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +2 -0
- package/dist/commands/project/index.js.map +1 -1
- package/dist/commands/project/update.d.ts +2 -1
- package/dist/commands/project/update.d.ts.map +1 -1
- package/dist/commands/project/update.js +21 -0
- package/dist/commands/project/update.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api/core.d.ts.map +1 -1
- package/dist/lib/api/core.js +6 -0
- package/dist/lib/api/core.js.map +1 -1
- package/dist/lib/help-center.d.ts +61 -0
- package/dist/lib/help-center.d.ts.map +1 -0
- package/dist/lib/help-center.js +411 -0
- package/dist/lib/help-center.js.map +1 -0
- package/dist/lib/output.d.ts +1 -1
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +6 -0
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/permissions.d.ts.map +1 -1
- package/dist/lib/permissions.js +3 -0
- package/dist/lib/permissions.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +17 -1
- package/dist/lib/skills/content.js.map +1 -1
- package/package.json +4 -4
- package/dist/__mocks__/chalk.d.ts +0 -3
- package/dist/__mocks__/chalk.d.ts.map +0 -1
- package/dist/__mocks__/chalk.js +0 -8
- package/dist/__mocks__/chalk.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.51.0](https://github.com/Doist/todoist-cli/compare/v1.50.0...v1.51.0) (2026-04-20)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* add folder command group ([#248](https://github.com/Doist/todoist-cli/issues/248)) ([4a17765](https://github.com/Doist/todoist-cli/commit/4a17765e15a45c370fac00810b1a6a7ebabfceb0))
|
|
6
|
+
|
|
7
|
+
## [1.50.0](https://github.com/Doist/todoist-cli/compare/v1.49.0...v1.50.0) (2026-04-20)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* Add Help Center CLI commands ([#279](https://github.com/Doist/todoist-cli/issues/279)) ([10d836f](https://github.com/Doist/todoist-cli/commit/10d836fa955e89e1c711338af3cce96cd71c67e5))
|
|
12
|
+
|
|
1
13
|
## [1.49.0](https://github.com/Doist/todoist-cli/compare/v1.48.0...v1.49.0) (2026-04-19)
|
|
2
14
|
|
|
3
15
|
### Features
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface CreateFolderOptions {
|
|
2
|
+
name: string;
|
|
3
|
+
workspace?: string;
|
|
4
|
+
defaultOrder?: number;
|
|
5
|
+
childOrder?: number;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
dryRun?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function createFolder(workspaceRef: string, options: CreateFolderOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/create.ts"],"names":[],"mappings":"AAMA,UAAU,mBAAmB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,YAAY,CAC9B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getApi } from '../../lib/api/core.js';
|
|
3
|
+
import { isQuiet } from '../../lib/global-args.js';
|
|
4
|
+
import { formatJson, printDryRun } from '../../lib/output.js';
|
|
5
|
+
import { resolveWorkspaceRef } from '../../lib/refs.js';
|
|
6
|
+
export async function createFolder(workspaceRef, options) {
|
|
7
|
+
if (options.dryRun) {
|
|
8
|
+
printDryRun('create folder', {
|
|
9
|
+
Name: options.name,
|
|
10
|
+
Workspace: workspaceRef,
|
|
11
|
+
'Default order': options.defaultOrder !== undefined ? String(options.defaultOrder) : undefined,
|
|
12
|
+
'Child order': options.childOrder !== undefined ? String(options.childOrder) : undefined,
|
|
13
|
+
});
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const workspace = await resolveWorkspaceRef(workspaceRef);
|
|
17
|
+
const api = await getApi();
|
|
18
|
+
const folder = await api.addFolder({
|
|
19
|
+
name: options.name,
|
|
20
|
+
workspaceId: workspace.id,
|
|
21
|
+
defaultOrder: options.defaultOrder,
|
|
22
|
+
childOrder: options.childOrder,
|
|
23
|
+
});
|
|
24
|
+
if (options.json) {
|
|
25
|
+
console.log(formatJson(folder, 'folder'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (isQuiet()) {
|
|
29
|
+
console.log(folder.id);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log(`Created: ${folder.name}`);
|
|
33
|
+
console.log(chalk.dim(`ID: ${folder.id}`));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/folder/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAWvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,YAAoB,EACpB,OAA4B;IAE5B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,eAAe,EAAE;YACzB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,YAAY;YACvB,eAAe,EACX,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;YACjF,aAAa,EACT,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;SAChF,CAAC,CAAA;QACF,OAAM;IACV,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAA;IACzD,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAE1B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,SAAS,CAAC,EAAE;QACzB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;KACjC,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;QACzC,OAAM;IACV,CAAC;IAED,IAAI,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACtB,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/delete.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACjE,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getApi } from '../../lib/api/core.js';
|
|
2
|
+
import { isQuiet } from '../../lib/global-args.js';
|
|
3
|
+
import { printDryRun } from '../../lib/output.js';
|
|
4
|
+
import { resolveFolderByRef } from './helpers.js';
|
|
5
|
+
export async function deleteFolder(ref, options) {
|
|
6
|
+
const folder = await resolveFolderByRef(ref, options);
|
|
7
|
+
if (options.dryRun) {
|
|
8
|
+
printDryRun('delete folder', { Folder: folder.name });
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!options.yes) {
|
|
12
|
+
console.log(`Would delete folder: ${folder.name}`);
|
|
13
|
+
console.log('Use --yes to confirm.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const api = await getApi();
|
|
17
|
+
await api.deleteFolder(folder.id);
|
|
18
|
+
if (!isQuiet())
|
|
19
|
+
console.log(`Deleted: ${folder.name} (id:${folder.id})`);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/folder/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,GAAW,EACX,OAAgE;IAEhE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAErD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QACrD,OAAM;IACV,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QACpC,OAAM;IACV,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAC1B,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACjC,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Folder } from '@doist/todoist-sdk';
|
|
2
|
+
import { type Workspace } from '../../lib/api/workspaces.js';
|
|
3
|
+
export declare function resolveWorkspaceForFolder(options: {
|
|
4
|
+
workspace?: string;
|
|
5
|
+
}): Promise<Workspace>;
|
|
6
|
+
export declare function resolveFolderByRef(ref: string, options: {
|
|
7
|
+
workspace?: string;
|
|
8
|
+
}): Promise<Folder>;
|
|
9
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAI7E,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC,SAAS,CAAC,CAkBrB;AAED,wBAAsB,kBAAkB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { getApi } from '../../lib/api/core.js';
|
|
2
|
+
import { fetchWorkspaces } from '../../lib/api/workspaces.js';
|
|
3
|
+
import { CliError } from '../../lib/errors.js';
|
|
4
|
+
import { resolveFolderRef, resolveWorkspaceRef } from '../../lib/refs.js';
|
|
5
|
+
export async function resolveWorkspaceForFolder(options) {
|
|
6
|
+
if (options.workspace) {
|
|
7
|
+
return resolveWorkspaceRef(options.workspace);
|
|
8
|
+
}
|
|
9
|
+
const workspaces = await fetchWorkspaces();
|
|
10
|
+
if (workspaces.length === 0) {
|
|
11
|
+
throw new CliError('WORKSPACE_NOT_FOUND', 'No workspaces found. Folders require a workspace.');
|
|
12
|
+
}
|
|
13
|
+
if (workspaces.length === 1) {
|
|
14
|
+
return workspaces[0];
|
|
15
|
+
}
|
|
16
|
+
throw new CliError('WORKSPACE_NOT_FOUND', 'Multiple workspaces found. Specify --workspace.', [
|
|
17
|
+
'Available workspaces:',
|
|
18
|
+
...workspaces.map((w) => ` "${w.name}" (id:${w.id})`),
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
export async function resolveFolderByRef(ref, options) {
|
|
22
|
+
const api = await getApi();
|
|
23
|
+
// id:xxx reference — fetch directly, no workspace needed
|
|
24
|
+
if (ref.startsWith('id:')) {
|
|
25
|
+
const id = ref.slice(3);
|
|
26
|
+
return api.getFolder(id);
|
|
27
|
+
}
|
|
28
|
+
// Otherwise resolve via workspace-scoped folder list
|
|
29
|
+
const workspace = await resolveWorkspaceForFolder(options);
|
|
30
|
+
const folder = await resolveFolderRef(ref, workspace.id);
|
|
31
|
+
// Fetch the full Folder object from the REST API
|
|
32
|
+
return api.getFolder(folder.id);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/folder/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAkB,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAE/C;IACG,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACjD,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,eAAe,EAAE,CAAA;IAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CACd,qBAAqB,EACrB,mDAAmD,CACtD,CAAA;IACL,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,CAAC,CAAC,CAAA;IACxB,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,iDAAiD,EAAE;QACzF,uBAAuB;QACvB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;KACzD,CAAC,CAAA;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,GAAW,EACX,OAA+B;IAE/B,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAE1B,yDAAyD;IACzD,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACvB,OAAO,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,qDAAqD;IACrD,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;IAExD,iDAAiD;IACjD,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0H5D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { CURSOR_DESCRIPTION } from '../../lib/constants.js';
|
|
2
|
+
import { CliError } from '../../lib/errors.js';
|
|
3
|
+
import { createFolder } from './create.js';
|
|
4
|
+
import { deleteFolder } from './delete.js';
|
|
5
|
+
import { listFolders } from './list.js';
|
|
6
|
+
import { updateFolder } from './update.js';
|
|
7
|
+
import { viewFolder } from './view.js';
|
|
8
|
+
function parseOrderArg(val) {
|
|
9
|
+
const n = Number(val);
|
|
10
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
11
|
+
throw new CliError('INVALID_ORDER', `Invalid order value: "${val}"`, [
|
|
12
|
+
'Order must be a non-negative integer (e.g., 0 for top of list)',
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
return n;
|
|
16
|
+
}
|
|
17
|
+
export function registerFolderCommand(program) {
|
|
18
|
+
const folder = program
|
|
19
|
+
.command('folder')
|
|
20
|
+
.description('Manage workspace folders')
|
|
21
|
+
.addHelpText('after', `
|
|
22
|
+
Examples:
|
|
23
|
+
td folder list "Acme"
|
|
24
|
+
td folder view "Engineering"
|
|
25
|
+
td folder create "Acme" --name "Engineering"
|
|
26
|
+
td folder delete "Engineering" --workspace "Acme" --yes`);
|
|
27
|
+
const listCmd = folder
|
|
28
|
+
.command('list [workspace]')
|
|
29
|
+
.description('List folders in a workspace')
|
|
30
|
+
.option('--workspace <ref>', 'Workspace name or id:xxx')
|
|
31
|
+
.option('--limit <n>', 'Limit number of results')
|
|
32
|
+
.option('--cursor <cursor>', CURSOR_DESCRIPTION)
|
|
33
|
+
.option('--all', 'Fetch all results (no limit)')
|
|
34
|
+
.option('--json', 'Output as JSON')
|
|
35
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
36
|
+
.action((refArg, options) => {
|
|
37
|
+
if (refArg && options.workspace) {
|
|
38
|
+
throw new CliError('CONFLICTING_OPTIONS', 'Cannot specify workspace both as argument and --workspace flag');
|
|
39
|
+
}
|
|
40
|
+
const ref = refArg || options.workspace;
|
|
41
|
+
if (!ref) {
|
|
42
|
+
listCmd.help();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
return listFolders(ref, options);
|
|
46
|
+
});
|
|
47
|
+
folder
|
|
48
|
+
.command('view [ref]', { isDefault: true })
|
|
49
|
+
.description('View folder details and contained projects')
|
|
50
|
+
.option('--workspace <ref>', 'Workspace name or id:xxx (for name-based lookup)')
|
|
51
|
+
.option('--json', 'Output as JSON')
|
|
52
|
+
.option('--full', 'Include all fields in JSON output')
|
|
53
|
+
.action((ref, options) => {
|
|
54
|
+
if (!ref) {
|
|
55
|
+
folder.help();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
return viewFolder(ref, options);
|
|
59
|
+
});
|
|
60
|
+
const createCmd = folder
|
|
61
|
+
.command('create [workspace]')
|
|
62
|
+
.description('Create a folder')
|
|
63
|
+
.option('--workspace <ref>', 'Workspace name or id:xxx')
|
|
64
|
+
.option('--name <name>', 'Folder name (required)')
|
|
65
|
+
.option('--default-order <n>', 'Default order for projects in the folder', parseOrderArg)
|
|
66
|
+
.option('--child-order <n>', 'Order position of the folder', parseOrderArg)
|
|
67
|
+
.option('--json', 'Output the created folder as JSON')
|
|
68
|
+
.option('--dry-run', 'Preview what would happen without executing')
|
|
69
|
+
.action((refArg, options) => {
|
|
70
|
+
if (refArg && options.workspace) {
|
|
71
|
+
throw new CliError('CONFLICTING_OPTIONS', 'Cannot specify workspace both as argument and --workspace flag');
|
|
72
|
+
}
|
|
73
|
+
const ref = refArg || options.workspace;
|
|
74
|
+
if (!ref || !options.name) {
|
|
75
|
+
createCmd.help();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
return createFolder(ref, options);
|
|
79
|
+
});
|
|
80
|
+
const updateCmd = folder
|
|
81
|
+
.command('update [ref]')
|
|
82
|
+
.description('Update a folder')
|
|
83
|
+
.option('--workspace <ref>', 'Workspace name or id:xxx (for name-based lookup)')
|
|
84
|
+
.option('--name <name>', 'New folder name')
|
|
85
|
+
.option('--default-order <n>', 'New default order for projects', parseOrderArg)
|
|
86
|
+
.option('--json', 'Output the updated folder as JSON')
|
|
87
|
+
.option('--dry-run', 'Preview what would happen without executing')
|
|
88
|
+
.action((ref, options) => {
|
|
89
|
+
if (!ref) {
|
|
90
|
+
updateCmd.help();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
return updateFolder(ref, options);
|
|
94
|
+
});
|
|
95
|
+
const deleteCmd = folder
|
|
96
|
+
.command('delete [ref]')
|
|
97
|
+
.description('Delete a folder')
|
|
98
|
+
.option('--workspace <ref>', 'Workspace name or id:xxx (for name-based lookup)')
|
|
99
|
+
.option('--yes', 'Confirm deletion')
|
|
100
|
+
.option('--dry-run', 'Preview what would happen without executing')
|
|
101
|
+
.action((ref, options) => {
|
|
102
|
+
if (!ref) {
|
|
103
|
+
deleteCmd.help();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
return deleteFolder(ref, options);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/folder/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAKhE,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C3F"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getApi } from '../../lib/api/core.js';
|
|
3
|
+
import { formatNextCursorFooter } from '../../lib/output.js';
|
|
4
|
+
import { paginate } from '../../lib/pagination.js';
|
|
5
|
+
import { resolveWorkspaceRef } from '../../lib/refs.js';
|
|
6
|
+
export async function listFolders(ref, options) {
|
|
7
|
+
const workspace = await resolveWorkspaceRef(ref);
|
|
8
|
+
const api = await getApi();
|
|
9
|
+
const targetLimit = options.all
|
|
10
|
+
? Number.MAX_SAFE_INTEGER
|
|
11
|
+
: options.limit
|
|
12
|
+
? parseInt(options.limit, 10)
|
|
13
|
+
: 300;
|
|
14
|
+
const { results: folders, nextCursor } = await paginate((cursor, limit) => api.getFolders({
|
|
15
|
+
workspaceId: workspace.id,
|
|
16
|
+
cursor: cursor ?? undefined,
|
|
17
|
+
limit,
|
|
18
|
+
}), { limit: targetLimit, startCursor: options.cursor });
|
|
19
|
+
if (options.json) {
|
|
20
|
+
console.log(JSON.stringify({ results: folders, nextCursor }, null, 2));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (options.ndjson) {
|
|
24
|
+
for (const folder of folders) {
|
|
25
|
+
console.log(JSON.stringify(folder));
|
|
26
|
+
}
|
|
27
|
+
if (nextCursor) {
|
|
28
|
+
console.log(JSON.stringify({ _meta: true, nextCursor }));
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (folders.length === 0) {
|
|
33
|
+
console.log('No folders found.');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const folder of folders) {
|
|
37
|
+
const id = chalk.dim(folder.id);
|
|
38
|
+
console.log(`${id} ${folder.name}`);
|
|
39
|
+
}
|
|
40
|
+
console.log(formatNextCursorFooter(nextCursor));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/folder/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,OAA6B;IACxE,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG;QAC3B,CAAC,CAAC,MAAM,CAAC,gBAAgB;QACzB,CAAC,CAAC,OAAO,CAAC,KAAK;YACb,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAA;IAEX,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CACnD,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACd,GAAG,CAAC,UAAU,CAAC;QACX,WAAW,EAAE,SAAS,CAAC,EAAE;QACzB,MAAM,EAAE,MAAM,IAAI,SAAS;QAC3B,KAAK;KACR,CAAC,EACN,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CACtD,CAAA;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACtE,OAAM;IACV,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QACvC,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAC5D,CAAC;QACD,OAAM;IACV,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QAChC,OAAM;IACV,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface UpdateFolderOptions {
|
|
2
|
+
name?: string;
|
|
3
|
+
defaultOrder?: number;
|
|
4
|
+
workspace?: string;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function updateFolder(ref: string, options: UpdateFolderOptions): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/update.ts"],"names":[],"mappings":"AAMA,UAAU,mBAAmB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC3F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getApi } from '../../lib/api/core.js';
|
|
2
|
+
import { CliError } from '../../lib/errors.js';
|
|
3
|
+
import { isQuiet } from '../../lib/global-args.js';
|
|
4
|
+
import { formatJson, printDryRun } from '../../lib/output.js';
|
|
5
|
+
import { resolveFolderByRef } from './helpers.js';
|
|
6
|
+
export async function updateFolder(ref, options) {
|
|
7
|
+
const folder = await resolveFolderByRef(ref, options);
|
|
8
|
+
const args = {};
|
|
9
|
+
if (options.name)
|
|
10
|
+
args.name = options.name;
|
|
11
|
+
if (options.defaultOrder !== undefined)
|
|
12
|
+
args.defaultOrder = options.defaultOrder;
|
|
13
|
+
if (Object.keys(args).length === 0) {
|
|
14
|
+
throw new CliError('NO_CHANGES', 'No changes specified.');
|
|
15
|
+
}
|
|
16
|
+
if (options.dryRun) {
|
|
17
|
+
printDryRun('update folder', {
|
|
18
|
+
Folder: folder.name,
|
|
19
|
+
Name: args.name,
|
|
20
|
+
'Default order': args.defaultOrder !== undefined ? String(args.defaultOrder) : undefined,
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const api = await getApi();
|
|
25
|
+
const updated = await api.updateFolder(folder.id, args);
|
|
26
|
+
if (options.json) {
|
|
27
|
+
console.log(formatJson(updated, 'folder'));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!isQuiet())
|
|
31
|
+
console.log(`Updated: ${folder.name}${options.name ? ` → ${updated.name}` : ''} (id:${folder.id})`);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/folder/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAUjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,OAA4B;IACxE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAErD,MAAM,IAAI,GAGN,EAAE,CAAA;IACN,IAAI,OAAO,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IAC1C,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;IAEhF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,eAAe,EAAE;YACzB,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EACX,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9E,CAAC,CAAA;QACF,OAAM;IACV,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAEvD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC1C,OAAM;IACV,CAAC;IAED,IAAI,CAAC,OAAO,EAAE;QACV,OAAO,CAAC,GAAG,CACP,YAAY,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,EAAE,GAAG,CACzF,CAAA;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/commands/folder/view.ts"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDvF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getApi } from '../../lib/api/core.js';
|
|
3
|
+
import { paginate } from '../../lib/pagination.js';
|
|
4
|
+
import { resolveWorkspaceRef } from '../../lib/refs.js';
|
|
5
|
+
import { resolveFolderByRef } from './helpers.js';
|
|
6
|
+
export async function viewFolder(ref, options) {
|
|
7
|
+
const folder = await resolveFolderByRef(ref, options);
|
|
8
|
+
const api = await getApi();
|
|
9
|
+
const { results: projects } = await paginate((cursor, limit) => api.getProjects({ folderId: folder.id, cursor: cursor ?? undefined, limit }), { limit: Number.MAX_SAFE_INTEGER });
|
|
10
|
+
if (options.json) {
|
|
11
|
+
const output = options.full
|
|
12
|
+
? { folder, projects }
|
|
13
|
+
: {
|
|
14
|
+
folder: {
|
|
15
|
+
id: folder.id,
|
|
16
|
+
name: folder.name,
|
|
17
|
+
workspaceId: folder.workspaceId,
|
|
18
|
+
},
|
|
19
|
+
projects: projects.map((p) => ({
|
|
20
|
+
id: p.id,
|
|
21
|
+
name: p.name,
|
|
22
|
+
})),
|
|
23
|
+
};
|
|
24
|
+
console.log(JSON.stringify(output, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Resolve workspace name for display
|
|
28
|
+
let workspaceName;
|
|
29
|
+
try {
|
|
30
|
+
const workspace = await resolveWorkspaceRef(`id:${folder.workspaceId}`);
|
|
31
|
+
workspaceName = workspace.name;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// workspace lookup is best-effort for display
|
|
35
|
+
}
|
|
36
|
+
console.log(chalk.bold(folder.name));
|
|
37
|
+
console.log(chalk.dim(`ID: ${folder.id}`));
|
|
38
|
+
if (workspaceName) {
|
|
39
|
+
console.log(chalk.dim(`Workspace: ${workspaceName}`));
|
|
40
|
+
}
|
|
41
|
+
console.log('');
|
|
42
|
+
if (projects.length === 0) {
|
|
43
|
+
console.log('No projects in this folder.');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
console.log(chalk.dim(`Projects (${projects.length}):`));
|
|
47
|
+
for (const project of projects) {
|
|
48
|
+
const id = chalk.dim(project.id);
|
|
49
|
+
console.log(` ${id} ${project.name}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/commands/folder/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/hc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDhE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { listHelpCenterLocales } from './locales.js';
|
|
2
|
+
import { searchHelpCenterArticles } from './search.js';
|
|
3
|
+
import { viewHelpCenterArticle } from './view.js';
|
|
4
|
+
const LOCALE_OPTION_DESCRIPTION = 'Help Center locale (default: en-us)';
|
|
5
|
+
export function registerHelpCenterCommand(program) {
|
|
6
|
+
const hc = program
|
|
7
|
+
.command('hc')
|
|
8
|
+
.description('Search Todoist Help Center articles')
|
|
9
|
+
.addHelpText('after', `
|
|
10
|
+
Examples:
|
|
11
|
+
td hc locales
|
|
12
|
+
td hc locales --json
|
|
13
|
+
td hc search "notifications"
|
|
14
|
+
td hc search "reminders" --locale pt-br --json
|
|
15
|
+
td hc view id:360000269065
|
|
16
|
+
td hc view 360000269065
|
|
17
|
+
td hc view https://get.todoist.help/hc/en-us/articles/360000269065
|
|
18
|
+
|
|
19
|
+
Notes:
|
|
20
|
+
search prints real Help Center article IDs
|
|
21
|
+
view accepts id:N, raw article IDs, and Help Center URLs`);
|
|
22
|
+
hc.command('locales')
|
|
23
|
+
.description('List supported Help Center locales')
|
|
24
|
+
.option('--json', 'Output as JSON')
|
|
25
|
+
.action(listHelpCenterLocales);
|
|
26
|
+
const searchCmd = hc
|
|
27
|
+
.command('search [query]')
|
|
28
|
+
.description('Search Todoist Help Center articles')
|
|
29
|
+
.option('--locale <locale>', LOCALE_OPTION_DESCRIPTION)
|
|
30
|
+
.option('--limit <n>', 'Number of results to return (default: 10, max: 25)')
|
|
31
|
+
.option('--json', 'Output as JSON')
|
|
32
|
+
.action((query, options) => {
|
|
33
|
+
if (!query) {
|
|
34
|
+
searchCmd.help();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
return searchHelpCenterArticles(query, options);
|
|
38
|
+
});
|
|
39
|
+
const viewCmd = hc
|
|
40
|
+
.command('view [ref]', { isDefault: true })
|
|
41
|
+
.description('View a Help Center article by id:N, raw article ID, or URL')
|
|
42
|
+
.option('--locale <locale>', LOCALE_OPTION_DESCRIPTION)
|
|
43
|
+
.option('--browser', 'Open the article in your browser')
|
|
44
|
+
.option('--json', 'Output as JSON')
|
|
45
|
+
.option('--html', 'Output the raw HTML article body')
|
|
46
|
+
.action((ref, options) => {
|
|
47
|
+
if (!ref) {
|
|
48
|
+
viewCmd.help();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
return viewHelpCenterArticle(ref, options);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/hc/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,MAAM,yBAAyB,GAAG,qCAAqC,CAAA;AAEvE,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACtD,MAAM,EAAE,GAAG,OAAO;SACb,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,qCAAqC,CAAC;SAClD,WAAW,CACR,OAAO,EACP;;;;;;;;;;;;2DAY+C,CAClD,CAAA;IAEL,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;SAChB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,qBAAqB,CAAC,CAAA;IAElC,MAAM,SAAS,GAAG,EAAE;SACf,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;SAC3E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,EAAE,CAAA;YAChB,OAAM;QACV,CAAC;QACD,OAAO,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEN,MAAM,OAAO,GAAG,EAAE;SACb,OAAO,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC1C,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;SACpD,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,EAAE,CAAA;YACd,OAAM;QACV,CAAC;QACD,OAAO,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/commands/hc/locales.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IACzC,IAAI,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,qBAAqB,CACvC,OAAO,GAAE,4BAAiC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getHelpCenterLocales } from '../../lib/help-center.js';
|
|
3
|
+
import { withSpinner } from '../../lib/spinner.js';
|
|
4
|
+
export async function listHelpCenterLocales(options = {}) {
|
|
5
|
+
const result = await withSpinner({ text: 'Loading Help Center locales...', color: 'blue' }, () => getHelpCenterLocales());
|
|
6
|
+
if (options.json) {
|
|
7
|
+
console.log(JSON.stringify(result, null, 2));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
console.log(`Default locale: ${result.defaultLocale}`);
|
|
11
|
+
console.log('');
|
|
12
|
+
console.log('Supported locales:');
|
|
13
|
+
for (const locale of result.locales) {
|
|
14
|
+
const defaultTag = locale.isDefault ? ` ${chalk.dim('[default]')}` : '';
|
|
15
|
+
console.log(` ${locale.locale} ${locale.name}${defaultTag}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=locales.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../src/commands/hc/locales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMlD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,UAAwC,EAAE;IAE1C,MAAM,MAAM,GAAG,MAAM,WAAW,CAC5B,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,MAAM,EAAE,EACzD,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAC/B,CAAA;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5C,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAEjC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,UAAU,EAAE,CAAC,CAAA;IAClE,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/hc/search.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACpC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,wBAAwB,CAC1C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { normalizeHelpCenterLocale, searchHelpCenter } from '../../lib/help-center.js';
|
|
3
|
+
import { withSpinner } from '../../lib/spinner.js';
|
|
4
|
+
export async function searchHelpCenterArticles(query, options = {}) {
|
|
5
|
+
const trimmedQuery = query.trim();
|
|
6
|
+
const locale = normalizeHelpCenterLocale(options.locale);
|
|
7
|
+
const results = await withSpinner({ text: 'Searching Help Center...', color: 'blue' }, () => searchHelpCenter(trimmedQuery, { locale, limit: options.limit }));
|
|
8
|
+
if (options.json) {
|
|
9
|
+
console.log(JSON.stringify(results, null, 2));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (results.length === 0) {
|
|
13
|
+
console.log(`No Help Center articles found for "${trimmedQuery}".`);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
for (const [index, result] of results.entries()) {
|
|
17
|
+
console.log(result.title);
|
|
18
|
+
console.log(` ${chalk.dim(`id:${result.id}`)}`);
|
|
19
|
+
console.log(` ${chalk.dim(result.htmlUrl)}`);
|
|
20
|
+
if (result.snippet) {
|
|
21
|
+
console.log(` ${result.snippet}`);
|
|
22
|
+
}
|
|
23
|
+
if (index < results.length - 1) {
|
|
24
|
+
console.log('');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=search.js.map
|