todoscan 0.1.3
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 +35 -0
- package/dist/env.d.ts +9 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +32 -0
- package/dist/env.js.map +1 -0
- package/dist/findTodos.d.ts +7 -0
- package/dist/findTodos.d.ts.map +1 -0
- package/dist/findTodos.js +32 -0
- package/dist/findTodos.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/scan.d.ts +2 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +42 -0
- package/dist/scan.js.map +1 -0
- package/dist/tasks.d.ts +43 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +26 -0
- package/dist/tasks.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# todocli
|
|
2
|
+
|
|
3
|
+
A simple CLI tool that scans your codebase for TODO-style comments and optionally adds them as tasks to **Todoist**.
|
|
4
|
+
|
|
5
|
+
Stop forgetting TODOs buried in your code. Turn them into real, actionable tasks.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- Scans your project for:
|
|
10
|
+
- `TODO`
|
|
11
|
+
- `FIXME`
|
|
12
|
+
- `HACK`
|
|
13
|
+
- `BUG`
|
|
14
|
+
- `NOTE`
|
|
15
|
+
- `XXX`
|
|
16
|
+
- Shows found TODOs with file and line context
|
|
17
|
+
- Optionally pushes them directly to **Todoist**
|
|
18
|
+
- Ignores unreadable files safely
|
|
19
|
+
- Fast, lightweight, zero config to start
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
### Run with npx (recommended)
|
|
24
|
+
```bash
|
|
25
|
+
npx todo
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### or install globaly
|
|
30
|
+
```bash
|
|
31
|
+
npm install -g todo
|
|
32
|
+
```
|
|
33
|
+
### Run
|
|
34
|
+
```bash
|
|
35
|
+
todo
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DotenvConfigOptions } from 'dotenv';
|
|
2
|
+
export declare class Environment {
|
|
3
|
+
private static instance;
|
|
4
|
+
readonly API_TOKEN_TASKIST: string;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(options?: DotenvConfigOptions): Environment;
|
|
7
|
+
static destroyInstance(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAErD,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IAEjD,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C,OAAO;WAYO,WAAW,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,WAAW;WAavD,eAAe;CAGhC"}
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Environment = void 0;
|
|
4
|
+
const dotenv_1 = require("dotenv");
|
|
5
|
+
class Environment {
|
|
6
|
+
static instance;
|
|
7
|
+
API_TOKEN_TASKIST;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
(0, dotenv_1.config)(options);
|
|
10
|
+
const apiTokenTaskist = process.env.API_TOKEN_TASKIST;
|
|
11
|
+
if (!apiTokenTaskist) {
|
|
12
|
+
throw new Error("API_TOKEN_TASKIST is not set in environment variables");
|
|
13
|
+
}
|
|
14
|
+
this.API_TOKEN_TASKIST = apiTokenTaskist;
|
|
15
|
+
}
|
|
16
|
+
static getInstance(options) {
|
|
17
|
+
if (!Environment.instance) {
|
|
18
|
+
try {
|
|
19
|
+
Environment.instance = new Environment(options);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
throw new Error(e.message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return Environment.instance;
|
|
26
|
+
}
|
|
27
|
+
static destroyInstance() {
|
|
28
|
+
Environment.instance = undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.Environment = Environment;
|
|
32
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":";;;AAAA,mCAAqD;AAErD,MAAa,WAAW;IACZ,MAAM,CAAC,QAAQ,CAA0B;IAEjC,iBAAiB,CAAS;IAE1C,YAAoB,OAA6B;QAC7C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;QAEhB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAEtD,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;IAC7C,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,OAA6B;QACnD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC;gBACD,WAAW,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QAGD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,WAAW,CAAC,QAAQ,GAAG,SAAS,CAAC;IACrC,CAAC;CACJ;AAjCD,kCAiCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findTodos.d.ts","sourceRoot":"","sources":["../src/findTodos.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS;UAEA,MAAM;UAAQ,MAAM;UAAQ,MAAM;UAAQ,MAAM;KA0B9E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findTodos = findTodos;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
const scan_1 = require("./scan");
|
|
6
|
+
async function findTodos() {
|
|
7
|
+
const files = await (0, scan_1.getFilteredFiles)(process.cwd());
|
|
8
|
+
const todos = [];
|
|
9
|
+
const todoRegex = /(TODO|FIXME|HACK|XXX|NOTE|BUG):\s*(.+)/;
|
|
10
|
+
for (const file of files) {
|
|
11
|
+
try {
|
|
12
|
+
const content = await (0, promises_1.readFile)(file, 'utf-8');
|
|
13
|
+
const lines = content.split('\n');
|
|
14
|
+
lines.forEach((line, index) => {
|
|
15
|
+
const match = line.match(todoRegex);
|
|
16
|
+
if (match) {
|
|
17
|
+
todos.push({
|
|
18
|
+
file: file,
|
|
19
|
+
line: index + 1,
|
|
20
|
+
type: match[1].toUpperCase(),
|
|
21
|
+
text: match[2].trim()
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// skip files that can not be read.
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return todos;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=findTodos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findTodos.js","sourceRoot":"","sources":["../src/findTodos.ts"],"names":[],"mappings":";;AAIA,8BA4BC;AAhCD,0CAAuC;AACvC,iCAA0C;AAGnC,KAAK,UAAU,SAAS;IAC3B,MAAM,KAAK,GAAG,MAAM,IAAA,uBAAgB,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAsE,EAAE,CAAC;IAEpF,MAAM,SAAS,GAAG,wCAAwC,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACpC,IAAI,KAAK,EAAE,CAAC;oBACR,KAAK,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,KAAK,GAAG,CAAC;wBACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;wBAC5B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;qBACxB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,mCAAmC;QACvC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
9
|
+
const tasks_1 = require("./tasks");
|
|
10
|
+
const findTodos_1 = require("./findTodos");
|
|
11
|
+
const asciiArt = `
|
|
12
|
+
________ __
|
|
13
|
+
/ | / |
|
|
14
|
+
$$$$$$$$/______ ____$$ | ______
|
|
15
|
+
$$ | / \\ / $$ | / \\
|
|
16
|
+
$$ |/$$$$$$ |/$$$$$$$ |/$$$$$$ |
|
|
17
|
+
$$ |$$ | $$ |$$ | $$ |$$ | $$ |
|
|
18
|
+
$$ |$$ \\__$$ |$$ \\__$$ |$$ \\__$$ |
|
|
19
|
+
$$ |$$ $$/ $$ $$ |$$ $$/
|
|
20
|
+
$$/ $$$$$$/ $$$$$$$/ $$$$$$/
|
|
21
|
+
|
|
22
|
+
`;
|
|
23
|
+
console.clear();
|
|
24
|
+
console.log(chalk_1.default.blue(asciiArt));
|
|
25
|
+
async function mainMenu() {
|
|
26
|
+
const option = await (0, prompts_1.default)({
|
|
27
|
+
type: 'select',
|
|
28
|
+
name: 'choice',
|
|
29
|
+
message: 'Select Options (use arrowkeys to change, enter to confirm)',
|
|
30
|
+
choices: [
|
|
31
|
+
{ title: 'Scan Todos', value: '1' },
|
|
32
|
+
{ title: 'Clear', value: '2' },
|
|
33
|
+
{ title: 'Exit', value: '3' },
|
|
34
|
+
],
|
|
35
|
+
hint: '- Arrow keys to change. Return to submit',
|
|
36
|
+
instructions: false
|
|
37
|
+
});
|
|
38
|
+
switch (option.choice) {
|
|
39
|
+
case '1': {
|
|
40
|
+
const todos = await (0, findTodos_1.findTodos)();
|
|
41
|
+
todos.forEach(todo => {
|
|
42
|
+
console.log(`→ ${todo.text}`);
|
|
43
|
+
});
|
|
44
|
+
const option = await (0, prompts_1.default)({
|
|
45
|
+
type: 'select',
|
|
46
|
+
name: 'addToTaskist',
|
|
47
|
+
message: 'Want to add these to Taskist? ',
|
|
48
|
+
choices: [
|
|
49
|
+
{ title: 'True', value: true },
|
|
50
|
+
{ title: 'False', value: false },
|
|
51
|
+
],
|
|
52
|
+
instructions: false
|
|
53
|
+
});
|
|
54
|
+
if (option.addToTaskist) {
|
|
55
|
+
todos.forEach(todo => {
|
|
56
|
+
(0, tasks_1.addTask)("6frwfj63jpR3v4gR", todo.text, [todo.type]);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case '2': {
|
|
62
|
+
console.clear();
|
|
63
|
+
console.log(chalk_1.default.blue(asciiArt));
|
|
64
|
+
await mainMenu();
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case '3':
|
|
68
|
+
console.log(chalk_1.default.yellow('Goodbye!'));
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
await mainMenu();
|
|
72
|
+
}
|
|
73
|
+
mainMenu();
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAC1B,sDAA8B;AAC9B,mCAAkC;AAClC,2CAAwC;AAExC,MAAM,QAAQ,GAAG;;;;;;;;;;;CAWhB,CAAC;AAEF,OAAO,CAAC,KAAK,EAAE,CAAC;AAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAElC,KAAK,UAAU,QAAQ;IACnB,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAO,EAAC;QACzB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,4DAA4D;QACrE,OAAO,EAAE;YACL,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;YACnC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;YAC9B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;SAChC;QACD,IAAI,EAAE,0CAA0C;QAChD,YAAY,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,GAAG,CAAC,CAAC,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAS,GAAE,CAAC;YAEhC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAO,EAAC;gBACzB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,gCAAgC;gBACzC,OAAO,EAAE;oBACL,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC9B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;iBACnC;gBACD,YAAY,EAAE,KAAK;aACtB,CAAC,CAAA;YAEF,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACjB,IAAA,eAAO,EAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;gBACvD,CAAC,CAAC,CAAC;YACP,CAAC;YAED,MAAM;QACV,CAAC;QAED,KAAK,GAAG,CAAC,CAAC,CAAC;YACP,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClC,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QACV,CAAC;QAED,KAAK,GAAG;YACJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED,QAAQ,EAAE,CAAC"}
|
package/dist/scan.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAwBA,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,qBAmBtD"}
|
package/dist/scan.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getFilteredFiles = getFilteredFiles;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
10
|
+
async function getAllFiles(currentPath) {
|
|
11
|
+
const entries = await (0, promises_1.readdir)(currentPath, { withFileTypes: true });
|
|
12
|
+
const files = [];
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
const fullPath = path_1.default.join(currentPath, entry.name);
|
|
15
|
+
if (entry.isDirectory()) {
|
|
16
|
+
const subfiles = await getAllFiles(fullPath);
|
|
17
|
+
files.push(...subfiles);
|
|
18
|
+
}
|
|
19
|
+
else if (entry.isFile()) {
|
|
20
|
+
files.push(fullPath);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return files;
|
|
24
|
+
}
|
|
25
|
+
async function getFilteredFiles(rootPath) {
|
|
26
|
+
const gitignorePath = path_1.default.join(rootPath, '.gitignore');
|
|
27
|
+
let ig = (0, ignore_1.default)();
|
|
28
|
+
try {
|
|
29
|
+
const gitignoreContent = await (0, promises_1.readFile)(gitignorePath, 'utf-8');
|
|
30
|
+
ig = (0, ignore_1.default)().add(gitignoreContent);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.log('No .gitignore found');
|
|
34
|
+
}
|
|
35
|
+
const allFiles = await getAllFiles(rootPath);
|
|
36
|
+
const filteredFiles = allFiles.filter(file => {
|
|
37
|
+
const relativePath = path_1.default.relative(rootPath, file);
|
|
38
|
+
return !ig.ignores(relativePath);
|
|
39
|
+
});
|
|
40
|
+
return filteredFiles;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=scan.js.map
|
package/dist/scan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":";;;;;AAwBA,4CAmBC;AA3CD,0CAAgD;AAChD,gDAAwB;AACxB,oDAA4B;AAG5B,KAAK,UAAU,WAAW,CAAC,WAAmB;IAC1C,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAGM,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACnD,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,EAAE,GAAG,IAAA,gBAAM,GAAE,CAAC;IAElB,IAAI,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,IAAA,mBAAQ,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAChE,EAAE,GAAG,IAAA,gBAAM,GAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACzC,MAAM,YAAY,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACzB,CAAC"}
|
package/dist/tasks.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare function getTasks(projectId: string): void;
|
|
2
|
+
export declare function addTask(projectId: string, content: string, labels: string[], debug?: boolean): Promise<{
|
|
3
|
+
isUncompletable: boolean;
|
|
4
|
+
url: string;
|
|
5
|
+
id: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
projectId: string;
|
|
8
|
+
sectionId: string | null;
|
|
9
|
+
parentId: string | null;
|
|
10
|
+
addedByUid: string | null;
|
|
11
|
+
assignedByUid: string | null;
|
|
12
|
+
responsibleUid: string | null;
|
|
13
|
+
labels: string[];
|
|
14
|
+
deadline: {
|
|
15
|
+
date: string;
|
|
16
|
+
lang: string;
|
|
17
|
+
} | null;
|
|
18
|
+
duration: {
|
|
19
|
+
amount: number;
|
|
20
|
+
unit: "minute" | "day";
|
|
21
|
+
} | null;
|
|
22
|
+
checked: boolean;
|
|
23
|
+
isDeleted: boolean;
|
|
24
|
+
addedAt: string | null;
|
|
25
|
+
completedAt: string | null;
|
|
26
|
+
updatedAt: string | null;
|
|
27
|
+
due: {
|
|
28
|
+
isRecurring: boolean;
|
|
29
|
+
string: string;
|
|
30
|
+
date: string;
|
|
31
|
+
datetime?: string | null | undefined;
|
|
32
|
+
timezone?: string | null | undefined;
|
|
33
|
+
lang?: string | null | undefined;
|
|
34
|
+
} | null;
|
|
35
|
+
priority: number;
|
|
36
|
+
childOrder: number;
|
|
37
|
+
content: string;
|
|
38
|
+
description: string;
|
|
39
|
+
noteCount: number;
|
|
40
|
+
dayOrder: number;
|
|
41
|
+
isCollapsed: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAQA,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,QAIzC;AAED,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,OAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBASkwE,CAAC;gBAA6C,CAAC;YAAyC,CAAC;;;;;;;;;GAAp8E"}
|
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTasks = getTasks;
|
|
4
|
+
exports.addTask = addTask;
|
|
5
|
+
const todoist_api_typescript_1 = require("@doist/todoist-api-typescript");
|
|
6
|
+
const env_1 = require("./env");
|
|
7
|
+
const env = env_1.Environment.getInstance({ quiet: true });
|
|
8
|
+
const token = env.API_TOKEN_TASKIST;
|
|
9
|
+
const api = new todoist_api_typescript_1.TodoistApi(token);
|
|
10
|
+
function getTasks(projectId) {
|
|
11
|
+
api.getTasks({ projectId })
|
|
12
|
+
.then((task) => task.results.map((t, _) => console.log(_, t.content, t.labels)))
|
|
13
|
+
.catch((error) => console.log(error));
|
|
14
|
+
}
|
|
15
|
+
async function addTask(projectId, content, labels, debug = false) {
|
|
16
|
+
try {
|
|
17
|
+
const task = await api.addTask({ projectId, content, labels });
|
|
18
|
+
debug && console.log('Task added:', task.content, 'Labels:', task.labels);
|
|
19
|
+
return task;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error('Error adding task:', error);
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":";;AAQA,4BAIC;AAED,0BASC;AAvBD,0EAA0D;AAC1D,+BAAoC;AACpC,MAAM,GAAG,GAAG,iBAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAErD,MAAM,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC;AAEpC,MAAM,GAAG,GAAG,IAAI,mCAAU,CAAC,KAAK,CAAC,CAAA;AAEjC,SAAgB,QAAQ,CAAC,SAAiB;IACtC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;SACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SAC/E,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AAC7C,CAAC;AAEM,KAAK,UAAU,OAAO,CAAC,SAAiB,EAAE,OAAe,EAAE,MAAgB,EAAE,QAAiB,KAAK;IACtG,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "todoscan",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Scan TODO comments in your code and push them to Todoist",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"todoscan": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "jest",
|
|
12
|
+
"start": "ts-node src/index.ts",
|
|
13
|
+
"build": "tsc -p tsconfig.build.json"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"todo",
|
|
20
|
+
"todoist",
|
|
21
|
+
"cli",
|
|
22
|
+
"developer-tools"
|
|
23
|
+
],
|
|
24
|
+
"author": "",
|
|
25
|
+
"license": "ISC",
|
|
26
|
+
"type": "commonjs",
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@babel/preset-typescript": "^7.28.5",
|
|
29
|
+
"@jest/globals": "^29.7.0",
|
|
30
|
+
"@types/jest": "^30.0.0",
|
|
31
|
+
"@types/node": "^25.1.0",
|
|
32
|
+
"@types/prompt": "^1.1.9",
|
|
33
|
+
"@types/prompts": "^2.4.9",
|
|
34
|
+
"jest": "^29.7.0",
|
|
35
|
+
"memfs": "^4.56.10",
|
|
36
|
+
"ts-jest": "^29.4.6",
|
|
37
|
+
"ts-node": "^10.9.2",
|
|
38
|
+
"tsconfig-paths": "^4.2.0",
|
|
39
|
+
"typescript": "^5.9.3"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@doist/todoist-api-typescript": "^6.3.0",
|
|
43
|
+
"chalk": "^5.6.2",
|
|
44
|
+
"dotenv": "^17.2.3",
|
|
45
|
+
"ignore": "^7.0.5",
|
|
46
|
+
"inquirer": "^13.2.2",
|
|
47
|
+
"prompt": "^1.3.0"
|
|
48
|
+
}
|
|
49
|
+
}
|