@doist/todoist-cli 1.1.2
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 +76 -0
- package/dist/commands/activity.d.ts +3 -0
- package/dist/commands/activity.d.ts.map +1 -0
- package/dist/commands/activity.js +193 -0
- package/dist/commands/activity.js.map +1 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +28 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +62 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +251 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/completed.d.ts +3 -0
- package/dist/commands/completed.d.ts.map +1 -0
- package/dist/commands/completed.js +74 -0
- package/dist/commands/completed.js.map +1 -0
- package/dist/commands/filter.d.ts +3 -0
- package/dist/commands/filter.d.ts.map +1 -0
- package/dist/commands/filter.js +249 -0
- package/dist/commands/filter.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +23 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/label.d.ts +3 -0
- package/dist/commands/label.d.ts.map +1 -0
- package/dist/commands/label.js +196 -0
- package/dist/commands/label.js.map +1 -0
- package/dist/commands/notification.d.ts +3 -0
- package/dist/commands/notification.d.ts.map +1 -0
- package/dist/commands/notification.js +274 -0
- package/dist/commands/notification.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +364 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reminder.d.ts +3 -0
- package/dist/commands/reminder.d.ts.map +1 -0
- package/dist/commands/reminder.js +225 -0
- package/dist/commands/reminder.js.map +1 -0
- package/dist/commands/section.d.ts +3 -0
- package/dist/commands/section.d.ts.map +1 -0
- package/dist/commands/section.js +138 -0
- package/dist/commands/section.js.map +1 -0
- package/dist/commands/settings.d.ts +3 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +250 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +151 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/task.d.ts +3 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +363 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/today.d.ts +3 -0
- package/dist/commands/today.d.ts.map +1 -0
- package/dist/commands/today.js +97 -0
- package/dist/commands/today.js.map +1 -0
- package/dist/commands/upcoming.d.ts +3 -0
- package/dist/commands/upcoming.d.ts.map +1 -0
- package/dist/commands/upcoming.js +121 -0
- package/dist/commands/upcoming.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +289 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api/core.d.ts +40 -0
- package/dist/lib/api/core.d.ts.map +1 -0
- package/dist/lib/api/core.js +142 -0
- package/dist/lib/api/core.js.map +1 -0
- package/dist/lib/api/filters.d.ts +26 -0
- package/dist/lib/api/filters.d.ts.map +1 -0
- package/dist/lib/api/filters.js +86 -0
- package/dist/lib/api/filters.js.map +1 -0
- package/dist/lib/api/notifications.d.ts +33 -0
- package/dist/lib/api/notifications.d.ts.map +1 -0
- package/dist/lib/api/notifications.js +112 -0
- package/dist/lib/api/notifications.js.map +1 -0
- package/dist/lib/api/reminders.d.ts +30 -0
- package/dist/lib/api/reminders.d.ts.map +1 -0
- package/dist/lib/api/reminders.js +79 -0
- package/dist/lib/api/reminders.js.map +1 -0
- package/dist/lib/api/stats.d.ts +41 -0
- package/dist/lib/api/stats.d.ts.map +1 -0
- package/dist/lib/api/stats.js +79 -0
- package/dist/lib/api/stats.js.map +1 -0
- package/dist/lib/api/uploads.d.ts +10 -0
- package/dist/lib/api/uploads.d.ts.map +1 -0
- package/dist/lib/api/uploads.js +31 -0
- package/dist/lib/api/uploads.js.map +1 -0
- package/dist/lib/api/user-settings.d.ts +33 -0
- package/dist/lib/api/user-settings.d.ts.map +1 -0
- package/dist/lib/api/user-settings.js +90 -0
- package/dist/lib/api/user-settings.js.map +1 -0
- package/dist/lib/api/workspaces.d.ts +23 -0
- package/dist/lib/api/workspaces.d.ts.map +1 -0
- package/dist/lib/api/workspaces.js +67 -0
- package/dist/lib/api/workspaces.js.map +1 -0
- package/dist/lib/auth.d.ts +4 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +66 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/browser.d.ts +2 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +6 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/collaborators.d.ts +29 -0
- package/dist/lib/collaborators.d.ts.map +1 -0
- package/dist/lib/collaborators.js +184 -0
- package/dist/lib/collaborators.js.map +1 -0
- package/dist/lib/dates.d.ts +3 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +20 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/duration.d.ts +14 -0
- package/dist/lib/duration.d.ts.map +1 -0
- package/dist/lib/duration.js +58 -0
- package/dist/lib/duration.js.map +1 -0
- package/dist/lib/markdown.d.ts +2 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +14 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +6 -0
- package/dist/lib/oauth-server.d.ts.map +1 -0
- package/dist/lib/oauth-server.js +141 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +3 -0
- package/dist/lib/oauth.d.ts.map +1 -0
- package/dist/lib/oauth.js +38 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/output.d.ts +36 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +293 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/pagination.d.ts +23 -0
- package/dist/lib/pagination.d.ts.map +1 -0
- package/dist/lib/pagination.js +26 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/pkce.d.ts +4 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +19 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/refs.d.ts +13 -0
- package/dist/lib/refs.d.ts.map +1 -0
- package/dist/lib/refs.js +117 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/spinner.d.ts +20 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +70 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/task-list.d.ts +28 -0
- package/dist/lib/task-list.d.ts.map +1 -0
- package/dist/lib/task-list.js +234 -0
- package/dist/lib/task-list.js.map +1 -0
- package/dist/lib/urls.d.ts +8 -0
- package/dist/lib/urls.d.ts.map +1 -0
- package/dist/lib/urls.js +26 -0
- package/dist/lib/urls.js.map +1 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Todoist CLI
|
|
2
|
+
|
|
3
|
+
A command-line interface for Todoist.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
> **Note**: This package is not yet published to npm. Once published, install with:
|
|
8
|
+
>
|
|
9
|
+
> ```bash
|
|
10
|
+
> npm install -g @doist/todoist-cli
|
|
11
|
+
> ```
|
|
12
|
+
|
|
13
|
+
### Local Setup (for now)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/Doist/todoist-cli.git
|
|
17
|
+
cd todoist-cli
|
|
18
|
+
npm install
|
|
19
|
+
npm run build
|
|
20
|
+
npm link
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This makes the `td` command available globally.
|
|
24
|
+
|
|
25
|
+
## Setup
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
td auth login
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This opens your browser to authenticate with Todoist. Once approved, the token is saved automatically.
|
|
32
|
+
|
|
33
|
+
### Alternative methods
|
|
34
|
+
|
|
35
|
+
**Manual token:** Get your API token from [Todoist Settings > Integrations > Developer](https://todoist.com/app/settings/integrations/developer):
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
td auth token "your-token"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Environment variable:**
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
export TODOIST_API_TOKEN="your-token"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Auth commands
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
td auth status # check if authenticated
|
|
51
|
+
td auth logout # remove saved token
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Usage
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
td add "Buy milk tomorrow #Shopping" # quick add with natural language
|
|
58
|
+
td today # tasks due today + overdue
|
|
59
|
+
td inbox # inbox tasks
|
|
60
|
+
td task list # all tasks
|
|
61
|
+
td task list --project "Work" # tasks in project
|
|
62
|
+
td project list # all projects
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Run `td --help` or `td <command> --help` for more options.
|
|
66
|
+
|
|
67
|
+
## Development
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm install
|
|
71
|
+
npm run build # compile
|
|
72
|
+
npm run dev # watch mode
|
|
73
|
+
npm run type-check # type check
|
|
74
|
+
npm run format # format code
|
|
75
|
+
npm test # run tests
|
|
76
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/commands/activity.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuHnC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsI9D"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getApi, getCurrentUserId, isWorkspaceProject } from '../lib/api/core.js';
|
|
3
|
+
import { formatUserShortName } from '../lib/collaborators.js';
|
|
4
|
+
import { formatNextCursorFooter, formatPaginatedJson, formatPaginatedNdjson, } from '../lib/output.js';
|
|
5
|
+
import { paginate } from '../lib/pagination.js';
|
|
6
|
+
import { extractId, isIdRef, resolveProjectId } from '../lib/refs.js';
|
|
7
|
+
const ACTIVITY_LIMIT = 100;
|
|
8
|
+
const EVENT_COLORS = {
|
|
9
|
+
added: chalk.green,
|
|
10
|
+
completed: chalk.green,
|
|
11
|
+
updated: chalk.yellow,
|
|
12
|
+
deleted: chalk.red,
|
|
13
|
+
uncompleted: chalk.yellow,
|
|
14
|
+
archived: chalk.gray,
|
|
15
|
+
unarchived: chalk.cyan,
|
|
16
|
+
shared: chalk.magenta,
|
|
17
|
+
left: chalk.gray,
|
|
18
|
+
};
|
|
19
|
+
const OBJECT_TYPE_LABELS = {
|
|
20
|
+
task: 'task',
|
|
21
|
+
item: 'task',
|
|
22
|
+
comment: 'comment',
|
|
23
|
+
note: 'comment',
|
|
24
|
+
project: 'project',
|
|
25
|
+
};
|
|
26
|
+
function formatEventType(eventType) {
|
|
27
|
+
const colorFn = EVENT_COLORS[eventType] || chalk.white;
|
|
28
|
+
return colorFn(eventType.padEnd(11));
|
|
29
|
+
}
|
|
30
|
+
function formatObjectType(objectType) {
|
|
31
|
+
const label = OBJECT_TYPE_LABELS[objectType] || objectType;
|
|
32
|
+
return chalk.dim(label.padEnd(8));
|
|
33
|
+
}
|
|
34
|
+
function formatEventDate(eventDate) {
|
|
35
|
+
const date = new Date(eventDate);
|
|
36
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
37
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
38
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
39
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
40
|
+
return chalk.dim(`${month}-${day} ${hours}:${minutes}`);
|
|
41
|
+
}
|
|
42
|
+
function getEventContent(event) {
|
|
43
|
+
const extra = event.extraData;
|
|
44
|
+
if (extra?.content) {
|
|
45
|
+
return String(extra.content);
|
|
46
|
+
}
|
|
47
|
+
if (extra?.name) {
|
|
48
|
+
return String(extra.name);
|
|
49
|
+
}
|
|
50
|
+
if (extra?.last_content) {
|
|
51
|
+
return String(extra.last_content);
|
|
52
|
+
}
|
|
53
|
+
if (extra?.last_name) {
|
|
54
|
+
return String(extra.last_name);
|
|
55
|
+
}
|
|
56
|
+
return `id:${event.objectId}`;
|
|
57
|
+
}
|
|
58
|
+
function truncateContent(content, maxLength = 100) {
|
|
59
|
+
const firstLine = content.split('\n')[0];
|
|
60
|
+
if (firstLine.length <= maxLength) {
|
|
61
|
+
return firstLine;
|
|
62
|
+
}
|
|
63
|
+
return `${firstLine.slice(0, maxLength - 3)}...`;
|
|
64
|
+
}
|
|
65
|
+
function formatActivityRow(event, projectName, initiatorName, showInitiator = false) {
|
|
66
|
+
const date = formatEventDate(event.eventDate);
|
|
67
|
+
const eventType = formatEventType(event.eventType);
|
|
68
|
+
const objectType = formatObjectType(event.objectType);
|
|
69
|
+
const content = getEventContent(event);
|
|
70
|
+
const metaParts = [date, eventType, objectType];
|
|
71
|
+
if (projectName) {
|
|
72
|
+
metaParts.push(chalk.cyan(projectName));
|
|
73
|
+
}
|
|
74
|
+
if (showInitiator && initiatorName) {
|
|
75
|
+
metaParts.push(chalk.magenta(`by ${initiatorName}`));
|
|
76
|
+
}
|
|
77
|
+
const line1 = ` ${metaParts.join(' ')}`;
|
|
78
|
+
const line2 = ` ${truncateContent(content)}`;
|
|
79
|
+
return `${line1}\n${line2}`;
|
|
80
|
+
}
|
|
81
|
+
export function registerActivityCommand(program) {
|
|
82
|
+
program
|
|
83
|
+
.command('activity')
|
|
84
|
+
.description('View activity logs')
|
|
85
|
+
.option('--since <date>', 'Start date (YYYY-MM-DD)')
|
|
86
|
+
.option('--until <date>', 'End date (YYYY-MM-DD)')
|
|
87
|
+
.option('--type <type>', 'Filter by object type (task, comment, project)')
|
|
88
|
+
.option('--event <type>', 'Filter by event type (added, updated, deleted, completed, uncompleted, archived, unarchived, shared, left)')
|
|
89
|
+
.option('--project <name>', 'Filter by project')
|
|
90
|
+
.option('--by <user>', 'Filter by initiator (use "me" for yourself)')
|
|
91
|
+
.option('--limit <n>', `Limit results (default: ${ACTIVITY_LIMIT})`)
|
|
92
|
+
.option('--cursor <cursor>', 'Continue from cursor')
|
|
93
|
+
.option('--all', 'Fetch all results (no limit)')
|
|
94
|
+
.option('--json', 'Output as JSON')
|
|
95
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
96
|
+
.option('--full', 'Include all fields in JSON output')
|
|
97
|
+
.action(async (options) => {
|
|
98
|
+
const api = await getApi();
|
|
99
|
+
let projectId;
|
|
100
|
+
if (options.project) {
|
|
101
|
+
projectId = await resolveProjectId(api, options.project);
|
|
102
|
+
}
|
|
103
|
+
let initiatorId;
|
|
104
|
+
if (options.by) {
|
|
105
|
+
if (options.by.toLowerCase() === 'me') {
|
|
106
|
+
initiatorId = await getCurrentUserId();
|
|
107
|
+
}
|
|
108
|
+
else if (isIdRef(options.by)) {
|
|
109
|
+
initiatorId = extractId(options.by);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
initiatorId = options.by;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const targetLimit = options.all
|
|
116
|
+
? Number.MAX_SAFE_INTEGER
|
|
117
|
+
: options.limit
|
|
118
|
+
? parseInt(options.limit, 10)
|
|
119
|
+
: ACTIVITY_LIMIT;
|
|
120
|
+
const { results: events, nextCursor } = await paginate(async (cursor, limit) => {
|
|
121
|
+
const resp = await api.getActivityLogs({
|
|
122
|
+
since: options.since ? new Date(options.since) : undefined,
|
|
123
|
+
until: options.until ? new Date(options.until) : undefined,
|
|
124
|
+
objectType: options.type,
|
|
125
|
+
eventType: options.event,
|
|
126
|
+
parentProjectId: projectId,
|
|
127
|
+
initiatorId,
|
|
128
|
+
cursor: cursor ?? undefined,
|
|
129
|
+
limit,
|
|
130
|
+
});
|
|
131
|
+
return { results: resp.results, nextCursor: resp.nextCursor };
|
|
132
|
+
}, { limit: targetLimit, startCursor: options.cursor });
|
|
133
|
+
if (options.json) {
|
|
134
|
+
console.log(formatPaginatedJson({ results: events, nextCursor }, undefined, options.full));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (options.ndjson) {
|
|
138
|
+
console.log(formatPaginatedNdjson({ results: events, nextCursor }, undefined, options.full));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (events.length === 0) {
|
|
142
|
+
console.log('No activity found.');
|
|
143
|
+
console.log(formatNextCursorFooter(nextCursor));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { results: allProjects } = await api.getProjects();
|
|
147
|
+
const projects = new Map(allProjects.map((p) => [p.id, p]));
|
|
148
|
+
const workspaceIds = new Set();
|
|
149
|
+
for (const event of events) {
|
|
150
|
+
if (!event.parentProjectId)
|
|
151
|
+
continue;
|
|
152
|
+
const proj = projects.get(event.parentProjectId);
|
|
153
|
+
if (proj && isWorkspaceProject(proj)) {
|
|
154
|
+
workspaceIds.add(proj.workspaceId);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const userNames = new Map();
|
|
158
|
+
for (const wsId of workspaceIds) {
|
|
159
|
+
let cursor;
|
|
160
|
+
while (true) {
|
|
161
|
+
const response = await api.getWorkspaceUsers({
|
|
162
|
+
workspaceId: parseInt(wsId, 10),
|
|
163
|
+
cursor,
|
|
164
|
+
limit: 200,
|
|
165
|
+
});
|
|
166
|
+
for (const user of response.workspaceUsers) {
|
|
167
|
+
userNames.set(user.userId, user.fullName);
|
|
168
|
+
}
|
|
169
|
+
if (!response.hasMore || !response.nextCursor)
|
|
170
|
+
break;
|
|
171
|
+
cursor = response.nextCursor;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
console.log(chalk.bold(`Activity (${events.length})`));
|
|
175
|
+
console.log('');
|
|
176
|
+
for (const event of events) {
|
|
177
|
+
const projectName = event.parentProjectId
|
|
178
|
+
? projects.get(event.parentProjectId)?.name
|
|
179
|
+
: undefined;
|
|
180
|
+
let initiatorName = null;
|
|
181
|
+
if (event.initiatorId && userNames.size > 0) {
|
|
182
|
+
const fullName = userNames.get(event.initiatorId);
|
|
183
|
+
if (fullName) {
|
|
184
|
+
initiatorName = formatUserShortName(fullName);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
console.log(formatActivityRow(event, projectName, initiatorName, userNames.size > 0));
|
|
188
|
+
console.log('');
|
|
189
|
+
}
|
|
190
|
+
console.log(formatNextCursorFooter(nextCursor));
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/commands/activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0BzD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getApi } from '../lib/api/core.js';
|
|
3
|
+
import { resolveAssigneeId } from '../lib/collaborators.js';
|
|
4
|
+
import { formatDue } from '../lib/output.js';
|
|
5
|
+
export function registerAddCommand(program) {
|
|
6
|
+
const addCmd = program
|
|
7
|
+
.command('add [text]')
|
|
8
|
+
.description('Quick add task with natural language (e.g., "Buy milk tomorrow p1 #Shopping")')
|
|
9
|
+
.option('--assignee <ref>', 'Assign to user (name, email, id:xxx, or "me")')
|
|
10
|
+
.action(async (text, options) => {
|
|
11
|
+
if (!text) {
|
|
12
|
+
addCmd.help();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const api = await getApi();
|
|
16
|
+
let task = await api.quickAddTask({ text });
|
|
17
|
+
if (options.assignee) {
|
|
18
|
+
const project = await api.getProject(task.projectId);
|
|
19
|
+
const assigneeId = await resolveAssigneeId(api, options.assignee, project);
|
|
20
|
+
task = await api.updateTask(task.id, { assigneeId });
|
|
21
|
+
}
|
|
22
|
+
console.log(`Created: ${task.content}`);
|
|
23
|
+
if (task.due)
|
|
24
|
+
console.log(`Due: ${formatDue(task.due)}`);
|
|
25
|
+
console.log(chalk.dim(`ID: ${task.id}`));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAM5C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAC/C,MAAM,MAAM,GAAG,OAAO;SACjB,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CACR,+EAA+E,CAClF;SACA,MAAM,CAAC,kBAAkB,EAAE,+CAA+C,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAAmB,EAAE,EAAE;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,EAAE,CAAA;YACb,OAAM;QACV,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;QAC1B,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QAE3C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACpD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC1E,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;QACxD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QACvC,IAAI,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6DnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAY1D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import open from 'open';
|
|
3
|
+
import { getApi } from '../lib/api/core.js';
|
|
4
|
+
import { clearApiToken, saveApiToken } from '../lib/auth.js';
|
|
5
|
+
import { buildAuthorizationUrl, exchangeCodeForToken } from '../lib/oauth.js';
|
|
6
|
+
import { startCallbackServer } from '../lib/oauth-server.js';
|
|
7
|
+
import { generateCodeChallenge, generateCodeVerifier, generateState } from '../lib/pkce.js';
|
|
8
|
+
async function loginWithToken(token) {
|
|
9
|
+
await saveApiToken(token.trim());
|
|
10
|
+
console.log(chalk.green('✓'), 'API token saved successfully!');
|
|
11
|
+
console.log(chalk.dim('Token saved to ~/.config/todoist-cli/config.json'));
|
|
12
|
+
}
|
|
13
|
+
async function loginWithOAuth() {
|
|
14
|
+
const codeVerifier = generateCodeVerifier();
|
|
15
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
16
|
+
const state = generateState();
|
|
17
|
+
console.log('Opening browser for Todoist authorization...');
|
|
18
|
+
const authUrl = buildAuthorizationUrl(codeChallenge, state);
|
|
19
|
+
const { promise: callbackPromise, cleanup } = startCallbackServer(state);
|
|
20
|
+
try {
|
|
21
|
+
await open(authUrl);
|
|
22
|
+
console.log(chalk.dim('Waiting for authorization...'));
|
|
23
|
+
const code = await callbackPromise;
|
|
24
|
+
console.log(chalk.dim('Exchanging code for token...'));
|
|
25
|
+
const accessToken = await exchangeCodeForToken(code, codeVerifier);
|
|
26
|
+
await saveApiToken(accessToken);
|
|
27
|
+
console.log(chalk.green('✓'), 'Successfully logged in!');
|
|
28
|
+
console.log(chalk.dim('Token saved to ~/.config/todoist-cli/config.json'));
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
cleanup();
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function showStatus() {
|
|
36
|
+
try {
|
|
37
|
+
const api = await getApi();
|
|
38
|
+
const user = await api.getUser();
|
|
39
|
+
console.log(chalk.green('✓'), 'Authenticated');
|
|
40
|
+
console.log(` Email: ${user.email}`);
|
|
41
|
+
console.log(` Name: ${user.fullName}`);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
console.log(chalk.yellow('Not authenticated'));
|
|
45
|
+
console.log(chalk.dim('Run `td auth login` or `td auth token <token>` to authenticate'));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function logout() {
|
|
49
|
+
await clearApiToken();
|
|
50
|
+
console.log(chalk.green('✓'), 'Logged out');
|
|
51
|
+
console.log(chalk.dim('Token removed from ~/.config/todoist-cli/config.json'));
|
|
52
|
+
}
|
|
53
|
+
export function registerAuthCommand(program) {
|
|
54
|
+
const auth = program.command('auth').description('Manage authentication');
|
|
55
|
+
auth.command('login').description('Authenticate with Todoist via OAuth').action(loginWithOAuth);
|
|
56
|
+
auth.command('token <token>')
|
|
57
|
+
.description('Save API token to config file (manual authentication)')
|
|
58
|
+
.action(loginWithToken);
|
|
59
|
+
auth.command('status').description('Show current authentication status').action(showStatus);
|
|
60
|
+
auth.command('logout').description('Remove saved authentication token').action(logout);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAyPnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF7D"}
|