@workdynamite/cli 1.0.0 → 1.1.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/dist/commands/config.js +32 -38
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +45 -46
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +11 -17
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/pick.js +33 -39
- package/dist/commands/pick.js.map +1 -1
- package/dist/commands/projects.js +44 -50
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/status.js +35 -41
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tasks.js +33 -39
- package/dist/commands/tasks.js.map +1 -1
- package/dist/index.js +18 -20
- package/dist/index.js.map +1 -1
- package/dist/lib/api.js +9 -17
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -23
- package/dist/lib/config.js.map +1 -1
- package/package.json +3 -3
- package/src/commands/login.ts +14 -10
- package/src/lib/api.ts +1 -1
- package/src/lib/config.ts +1 -1
package/dist/commands/config.js
CHANGED
|
@@ -1,62 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const commander_1 = require("commander");
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const ora_1 = __importDefault(require("ora"));
|
|
10
|
-
const config_js_1 = require("../lib/config.js");
|
|
11
|
-
const api_js_1 = require("../lib/api.js");
|
|
12
|
-
exports.configCommand = new commander_1.Command('config')
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { setToken, setUser, getConfig, clearConfig, isAuthenticated } from '../lib/config.js';
|
|
5
|
+
import { getMe } from '../lib/api.js';
|
|
6
|
+
export const configCommand = new Command('config')
|
|
13
7
|
.description('Manage CLI configuration');
|
|
14
|
-
|
|
8
|
+
configCommand
|
|
15
9
|
.command('set-token <token>')
|
|
16
10
|
.description('Set the API token manually')
|
|
17
11
|
.action(async (token) => {
|
|
18
12
|
if (!token.startsWith('wk_')) {
|
|
19
|
-
console.log(
|
|
13
|
+
console.log(chalk.yellow('Warning: Token should start with "wk_"'));
|
|
20
14
|
}
|
|
21
|
-
const spinner = (
|
|
15
|
+
const spinner = ora('Validating token...').start();
|
|
22
16
|
// Temporarily set the token to validate it
|
|
23
|
-
|
|
24
|
-
const { data, error } = await
|
|
17
|
+
setToken(token);
|
|
18
|
+
const { data, error } = await getMe();
|
|
25
19
|
if (error) {
|
|
26
20
|
// Clear invalid token
|
|
27
|
-
|
|
28
|
-
spinner.fail(
|
|
21
|
+
clearConfig();
|
|
22
|
+
spinner.fail(chalk.red(`Invalid token: ${error}`));
|
|
29
23
|
return;
|
|
30
24
|
}
|
|
31
|
-
|
|
32
|
-
spinner.succeed(
|
|
33
|
-
console.log(
|
|
34
|
-
console.log(
|
|
25
|
+
setUser(data.user);
|
|
26
|
+
spinner.succeed(chalk.green(`Authenticated as ${data.user.email}`));
|
|
27
|
+
console.log(chalk.dim('\nYou can now use WorkDynamite CLI commands.'));
|
|
28
|
+
console.log(chalk.dim('Try "workdynamite status" or "workdynamite tasks".\n'));
|
|
35
29
|
});
|
|
36
|
-
|
|
30
|
+
configCommand
|
|
37
31
|
.command('show')
|
|
38
32
|
.description('Show current configuration')
|
|
39
33
|
.action(() => {
|
|
40
|
-
const config =
|
|
41
|
-
console.log(
|
|
42
|
-
console.log(
|
|
43
|
-
console.log(` ${
|
|
44
|
-
console.log(` ${
|
|
45
|
-
console.log(` ${
|
|
46
|
-
console.log(` ${
|
|
47
|
-
console.log(
|
|
34
|
+
const config = getConfig();
|
|
35
|
+
console.log(chalk.bold('\n⚙️ Configuration\n'));
|
|
36
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
37
|
+
console.log(` ${chalk.dim('API URL:')} ${config.api_url}`);
|
|
38
|
+
console.log(` ${chalk.dim('Token:')} ${config.token ? `${config.token.substring(0, 12)}...` : chalk.yellow('(not set)')}`);
|
|
39
|
+
console.log(` ${chalk.dim('User:')} ${config.user?.email || chalk.yellow('(not logged in)')}`);
|
|
40
|
+
console.log(` ${chalk.dim('Project:')} ${config.default_project || chalk.dim('(all projects)')}`);
|
|
41
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
48
42
|
console.log('');
|
|
49
43
|
});
|
|
50
|
-
|
|
44
|
+
configCommand
|
|
51
45
|
.command('clear')
|
|
52
46
|
.description('Clear all stored configuration')
|
|
53
47
|
.action(() => {
|
|
54
|
-
if (!
|
|
55
|
-
console.log(
|
|
48
|
+
if (!isAuthenticated()) {
|
|
49
|
+
console.log(chalk.yellow('No configuration to clear.'));
|
|
56
50
|
return;
|
|
57
51
|
}
|
|
58
|
-
|
|
59
|
-
console.log(
|
|
60
|
-
console.log(
|
|
52
|
+
clearConfig();
|
|
53
|
+
console.log(chalk.green('✓ Configuration cleared.'));
|
|
54
|
+
console.log(chalk.dim('Run "workdynamite login" to authenticate again.'));
|
|
61
55
|
});
|
|
62
56
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SA4GrB,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,97 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const ora_1 = __importDefault(require("ora"));
|
|
10
|
-
const open_1 = __importDefault(require("open"));
|
|
11
|
-
const api_js_1 = require("../lib/api.js");
|
|
12
|
-
const config_js_1 = require("../lib/config.js");
|
|
13
|
-
exports.loginCommand = new commander_1.Command('login')
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import open from 'open';
|
|
5
|
+
import { initLogin, pollLogin, getMe } from '../lib/api.js';
|
|
6
|
+
import { setToken, setUser, isAuthenticated, getConfig } from '../lib/config.js';
|
|
7
|
+
export const loginCommand = new Command('login')
|
|
14
8
|
.description('Authenticate with WorkDynamite')
|
|
15
9
|
.option('--token <token>', 'Use an existing API token instead of browser auth')
|
|
16
10
|
.action(async (options) => {
|
|
17
11
|
// Check if already authenticated
|
|
18
|
-
if (
|
|
19
|
-
const config =
|
|
20
|
-
console.log(
|
|
21
|
-
console.log(
|
|
12
|
+
if (isAuthenticated()) {
|
|
13
|
+
const config = getConfig();
|
|
14
|
+
console.log(chalk.yellow(`Already logged in as ${config.user?.email}`));
|
|
15
|
+
console.log(chalk.dim('Run "workdynamite logout" to sign out first.'));
|
|
22
16
|
return;
|
|
23
17
|
}
|
|
24
18
|
// If token provided directly, use it
|
|
25
19
|
if (options.token) {
|
|
26
|
-
const spinner = (
|
|
27
|
-
|
|
28
|
-
const { data, error } = await
|
|
20
|
+
const spinner = ora('Validating token...').start();
|
|
21
|
+
setToken(options.token);
|
|
22
|
+
const { data, error } = await getMe();
|
|
29
23
|
if (error) {
|
|
30
|
-
|
|
31
|
-
spinner.fail(
|
|
24
|
+
setToken(null);
|
|
25
|
+
spinner.fail(chalk.red(`Invalid token: ${error}`));
|
|
32
26
|
return;
|
|
33
27
|
}
|
|
34
|
-
|
|
35
|
-
spinner.succeed(
|
|
28
|
+
setUser(data.user);
|
|
29
|
+
spinner.succeed(chalk.green(`Authenticated as ${data.user.email}`));
|
|
36
30
|
return;
|
|
37
31
|
}
|
|
38
32
|
// Start device authorization flow
|
|
39
|
-
console.log(
|
|
40
|
-
const initSpinner = (
|
|
41
|
-
const { data: initData, error: initError } = await
|
|
33
|
+
console.log(chalk.bold('\n🚀 WorkDynamite CLI Login\n'));
|
|
34
|
+
const initSpinner = ora('Initializing login...').start();
|
|
35
|
+
const { data: initData, error: initError } = await initLogin();
|
|
42
36
|
if (initError) {
|
|
43
|
-
initSpinner.fail(
|
|
37
|
+
initSpinner.fail(chalk.red(`Failed to start login: ${initError}`));
|
|
44
38
|
return;
|
|
45
39
|
}
|
|
46
40
|
initSpinner.succeed('Login initialized');
|
|
47
41
|
const { device_code, user_code, verification_uri_complete } = initData;
|
|
48
|
-
console.log('\n' +
|
|
49
|
-
console.log(
|
|
42
|
+
console.log('\n' + chalk.bold('To complete login:'));
|
|
43
|
+
console.log(chalk.dim('─────────────────────────────────────'));
|
|
50
44
|
console.log(`\n 1. Open this URL in your browser:\n`);
|
|
51
|
-
console.log(` ${
|
|
45
|
+
console.log(` ${chalk.cyan.underline(verification_uri_complete)}\n`);
|
|
52
46
|
console.log(` 2. Enter this code if prompted:\n`);
|
|
53
|
-
console.log(` ${
|
|
54
|
-
console.log(
|
|
47
|
+
console.log(` ${chalk.bold.yellow(user_code)}\n`);
|
|
48
|
+
console.log(chalk.dim('─────────────────────────────────────\n'));
|
|
55
49
|
// Try to open browser automatically
|
|
56
50
|
try {
|
|
57
|
-
await (
|
|
58
|
-
console.log(
|
|
51
|
+
await open(verification_uri_complete);
|
|
52
|
+
console.log(chalk.dim('(Browser opened automatically)\n'));
|
|
59
53
|
}
|
|
60
54
|
catch {
|
|
61
|
-
console.log(
|
|
55
|
+
console.log(chalk.dim('(Open the URL manually)\n'));
|
|
62
56
|
}
|
|
63
57
|
// Poll for authorization
|
|
64
|
-
const pollSpinner = (
|
|
58
|
+
const pollSpinner = ora('Waiting for authorization...').start();
|
|
65
59
|
const maxAttempts = 60; // 5 minutes with 5-second intervals
|
|
66
60
|
let attempts = 0;
|
|
67
61
|
while (attempts < maxAttempts) {
|
|
68
62
|
await sleep(5000); // Wait 5 seconds between polls
|
|
69
63
|
attempts++;
|
|
70
|
-
const { data: pollData, error: pollError } = await
|
|
64
|
+
const { data: pollData, error: pollError } = await pollLogin(device_code);
|
|
71
65
|
if (pollError === 'authorization_pending') {
|
|
72
66
|
pollSpinner.text = `Waiting for authorization... (${Math.floor((maxAttempts - attempts) * 5 / 60)}m remaining)`;
|
|
73
67
|
continue;
|
|
74
68
|
}
|
|
75
69
|
if (pollError === 'expired_token') {
|
|
76
|
-
pollSpinner.fail(
|
|
70
|
+
pollSpinner.fail(chalk.red('Authorization expired. Please run login again.'));
|
|
77
71
|
return;
|
|
78
72
|
}
|
|
79
73
|
if (pollError) {
|
|
80
|
-
pollSpinner.fail(
|
|
74
|
+
pollSpinner.fail(chalk.red(`Authorization failed: ${pollError}`));
|
|
81
75
|
return;
|
|
82
76
|
}
|
|
83
77
|
if (pollData) {
|
|
84
|
-
// Authorization successful
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
78
|
+
// Authorization successful — store token + user locally
|
|
79
|
+
if (pollData.access_token) {
|
|
80
|
+
setToken(pollData.access_token);
|
|
81
|
+
}
|
|
88
82
|
if (pollData.user) {
|
|
89
|
-
|
|
83
|
+
setUser(pollData.user);
|
|
84
|
+
}
|
|
85
|
+
pollSpinner.succeed(chalk.green('Logged in!'));
|
|
86
|
+
if (pollData.user?.email) {
|
|
87
|
+
console.log(chalk.dim(`Authenticated as: ${pollData.user.email}`));
|
|
90
88
|
}
|
|
89
|
+
console.log(chalk.dim('You can now run: workdynamite tasks'));
|
|
91
90
|
return;
|
|
92
91
|
}
|
|
93
92
|
}
|
|
94
|
-
pollSpinner.fail(
|
|
93
|
+
pollSpinner.fail(chalk.red('Authorization timed out. Please try again.'));
|
|
95
94
|
});
|
|
96
95
|
function sleep(ms) {
|
|
97
96
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logoutCommand = void 0;
|
|
7
|
-
const commander_1 = require("commander");
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const config_js_1 = require("../lib/config.js");
|
|
10
|
-
exports.logoutCommand = new commander_1.Command('logout')
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { clearConfig, isAuthenticated, getConfig } from '../lib/config.js';
|
|
4
|
+
export const logoutCommand = new Command('logout')
|
|
11
5
|
.description('Sign out of WorkDynamite')
|
|
12
6
|
.action(async () => {
|
|
13
|
-
if (!
|
|
14
|
-
console.log(
|
|
7
|
+
if (!isAuthenticated()) {
|
|
8
|
+
console.log(chalk.yellow('Not currently logged in.'));
|
|
15
9
|
return;
|
|
16
10
|
}
|
|
17
|
-
const config =
|
|
11
|
+
const config = getConfig();
|
|
18
12
|
const email = config.user?.email || 'unknown';
|
|
19
|
-
|
|
20
|
-
console.log(
|
|
21
|
-
console.log(
|
|
22
|
-
console.log(
|
|
13
|
+
clearConfig();
|
|
14
|
+
console.log(chalk.green(`✓ Logged out from ${email}`));
|
|
15
|
+
console.log(chalk.dim('Your API token has been removed from local storage.'));
|
|
16
|
+
console.log(chalk.dim('To revoke the token entirely, visit Workspace Settings in the web app.'));
|
|
23
17
|
});
|
|
24
18
|
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC;IAE9C,WAAW,EAAE,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC,CAAC;AACnG,CAAC,CAAC,CAAC"}
|
package/dist/commands/pick.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const ora_1 = __importDefault(require("ora"));
|
|
10
|
-
const clipboardy_1 = __importDefault(require("clipboardy"));
|
|
11
|
-
const api_js_1 = require("../lib/api.js");
|
|
12
|
-
const config_js_1 = require("../lib/config.js");
|
|
13
|
-
exports.pickCommand = new commander_1.Command('pick')
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import clipboard from 'clipboardy';
|
|
5
|
+
import { getTasks } from '../lib/api.js';
|
|
6
|
+
import { isAuthenticated, getConfig } from '../lib/config.js';
|
|
7
|
+
export const pickCommand = new Command('pick')
|
|
14
8
|
.description('Copy a task reference to clipboard for commit messages')
|
|
15
9
|
.argument('<number>', 'Task number to pick')
|
|
16
10
|
.option('-w, --wip', 'Use WIP prefix')
|
|
@@ -18,26 +12,26 @@ exports.pickCommand = new commander_1.Command('pick')
|
|
|
18
12
|
.option('-c, --closes', 'Use Closes prefix')
|
|
19
13
|
.option('-r, --refs', 'Use Refs prefix')
|
|
20
14
|
.action(async (taskNumber, options) => {
|
|
21
|
-
if (!
|
|
22
|
-
console.log(
|
|
15
|
+
if (!isAuthenticated()) {
|
|
16
|
+
console.log(chalk.red('Not logged in. Run "workdynamite login" first.'));
|
|
23
17
|
return;
|
|
24
18
|
}
|
|
25
|
-
const spinner = (
|
|
26
|
-
const config =
|
|
19
|
+
const spinner = ora('Finding task...').start();
|
|
20
|
+
const config = getConfig();
|
|
27
21
|
// Fetch tasks to find the one matching the number
|
|
28
|
-
const { data, error } = await
|
|
22
|
+
const { data, error } = await getTasks({
|
|
29
23
|
project: config.default_project || undefined,
|
|
30
24
|
limit: 100,
|
|
31
25
|
});
|
|
32
26
|
if (error) {
|
|
33
|
-
spinner.fail(
|
|
27
|
+
spinner.fail(chalk.red(`Failed to fetch tasks: ${error}`));
|
|
34
28
|
return;
|
|
35
29
|
}
|
|
36
30
|
const task = data.tasks.find(t => t.number === parseInt(taskNumber, 10));
|
|
37
31
|
if (!task) {
|
|
38
|
-
spinner.fail(
|
|
39
|
-
console.log(
|
|
40
|
-
console.log(
|
|
32
|
+
spinner.fail(chalk.red(`Task #${taskNumber} not found in your assigned tasks.`));
|
|
33
|
+
console.log(chalk.dim('Make sure you\'re looking at the right project.'));
|
|
34
|
+
console.log(chalk.dim('Run "workdynamite tasks" to see available tasks.'));
|
|
41
35
|
return;
|
|
42
36
|
}
|
|
43
37
|
// Determine which prefix to use
|
|
@@ -51,31 +45,31 @@ exports.pickCommand = new commander_1.Command('pick')
|
|
|
51
45
|
// else default to fixes
|
|
52
46
|
const reference = task.refs[refType];
|
|
53
47
|
try {
|
|
54
|
-
await
|
|
55
|
-
spinner.succeed(
|
|
56
|
-
console.log('\n' +
|
|
57
|
-
console.log('\n ' +
|
|
58
|
-
console.log('\n' +
|
|
59
|
-
console.log(
|
|
60
|
-
console.log(
|
|
48
|
+
await clipboard.write(reference);
|
|
49
|
+
spinner.succeed(chalk.green('Copied to clipboard!'));
|
|
50
|
+
console.log('\n' + chalk.dim('─'.repeat(50)));
|
|
51
|
+
console.log('\n ' + chalk.bold(reference));
|
|
52
|
+
console.log('\n' + chalk.dim('─'.repeat(50)));
|
|
53
|
+
console.log(chalk.dim('\nPaste this in your commit message or PR title.'));
|
|
54
|
+
console.log(chalk.dim('The webhook will automatically update the task.\n'));
|
|
61
55
|
// Show other options
|
|
62
|
-
console.log(
|
|
56
|
+
console.log(chalk.dim('Other formats:'));
|
|
63
57
|
if (refType !== 'wip')
|
|
64
|
-
console.log(
|
|
58
|
+
console.log(chalk.dim(` -w, --wip → ${task.refs.wip}`));
|
|
65
59
|
if (refType !== 'fixes')
|
|
66
|
-
console.log(
|
|
60
|
+
console.log(chalk.dim(` -f, --fixes → ${task.refs.fixes}`));
|
|
67
61
|
if (refType !== 'closes')
|
|
68
|
-
console.log(
|
|
62
|
+
console.log(chalk.dim(` -c, --closes → ${task.refs.closes}`));
|
|
69
63
|
if (refType !== 'refs')
|
|
70
|
-
console.log(
|
|
64
|
+
console.log(chalk.dim(` -r, --refs → ${task.refs.refs}`));
|
|
71
65
|
console.log('');
|
|
72
66
|
}
|
|
73
67
|
catch (clipboardError) {
|
|
74
|
-
spinner.warn(
|
|
75
|
-
console.log('\n' +
|
|
76
|
-
console.log('\n ' +
|
|
77
|
-
console.log('\n' +
|
|
78
|
-
console.log(
|
|
68
|
+
spinner.warn(chalk.yellow('Could not copy to clipboard.'));
|
|
69
|
+
console.log('\n' + chalk.dim('─'.repeat(50)));
|
|
70
|
+
console.log('\n ' + chalk.bold(reference));
|
|
71
|
+
console.log('\n' + chalk.dim('─'.repeat(50)));
|
|
72
|
+
console.log(chalk.dim('\nCopy the text above manually.\n'));
|
|
79
73
|
}
|
|
80
74
|
});
|
|
81
75
|
//# sourceMappingURL=pick.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/commands/pick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/commands/pick.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
-
const ora_1 = __importDefault(require("ora"));
|
|
10
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
-
const api_js_1 = require("../lib/api.js");
|
|
12
|
-
const config_js_1 = require("../lib/config.js");
|
|
13
|
-
exports.projectsCommand = new commander_1.Command('projects')
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import { getProjects } from '../lib/api.js';
|
|
6
|
+
import { isAuthenticated, getConfig, setDefaultProject } from '../lib/config.js';
|
|
7
|
+
export const projectsCommand = new Command('projects')
|
|
14
8
|
.description('List and manage projects')
|
|
15
9
|
.option('--set', 'Interactively set the default project')
|
|
16
10
|
.action(async (options) => {
|
|
17
|
-
if (!
|
|
18
|
-
console.log(
|
|
11
|
+
if (!isAuthenticated()) {
|
|
12
|
+
console.log(chalk.red('Not logged in. Run "workdynamite login" first.'));
|
|
19
13
|
return;
|
|
20
14
|
}
|
|
21
|
-
const spinner = (
|
|
22
|
-
const { data, error } = await
|
|
15
|
+
const spinner = ora('Fetching projects...').start();
|
|
16
|
+
const { data, error } = await getProjects();
|
|
23
17
|
if (error) {
|
|
24
|
-
spinner.fail(
|
|
18
|
+
spinner.fail(chalk.red(`Failed to fetch projects: ${error}`));
|
|
25
19
|
return;
|
|
26
20
|
}
|
|
27
21
|
spinner.stop();
|
|
28
22
|
const projects = data.projects;
|
|
29
|
-
const config =
|
|
23
|
+
const config = getConfig();
|
|
30
24
|
if (projects.length === 0) {
|
|
31
|
-
console.log(
|
|
32
|
-
console.log(
|
|
25
|
+
console.log(chalk.yellow('\nNo projects found.'));
|
|
26
|
+
console.log(chalk.dim('Create a project in the web app to see it here.'));
|
|
33
27
|
return;
|
|
34
28
|
}
|
|
35
29
|
if (options.set) {
|
|
36
30
|
// Interactive project selection
|
|
37
|
-
const { selectedProject } = await
|
|
31
|
+
const { selectedProject } = await inquirer.prompt([
|
|
38
32
|
{
|
|
39
33
|
type: 'list',
|
|
40
34
|
name: 'selectedProject',
|
|
@@ -48,72 +42,72 @@ exports.projectsCommand = new commander_1.Command('projects')
|
|
|
48
42
|
],
|
|
49
43
|
},
|
|
50
44
|
]);
|
|
51
|
-
|
|
45
|
+
setDefaultProject(selectedProject);
|
|
52
46
|
if (selectedProject) {
|
|
53
47
|
const project = projects.find(p => p.id === selectedProject);
|
|
54
|
-
console.log(
|
|
48
|
+
console.log(chalk.green(`\n✓ Default project set to: ${project?.name}`));
|
|
55
49
|
}
|
|
56
50
|
else {
|
|
57
|
-
console.log(
|
|
51
|
+
console.log(chalk.green('\n✓ Default project cleared. Tasks from all projects will be shown.'));
|
|
58
52
|
}
|
|
59
53
|
return;
|
|
60
54
|
}
|
|
61
55
|
// List projects
|
|
62
|
-
console.log(
|
|
63
|
-
console.log(
|
|
56
|
+
console.log(chalk.bold('\n📁 Your Projects\n'));
|
|
57
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
64
58
|
for (const project of projects) {
|
|
65
59
|
const isDefault = project.id === config.default_project;
|
|
66
60
|
const statusColor = getStatusColor(project.status);
|
|
67
|
-
console.log(` ${isDefault ?
|
|
68
|
-
`${
|
|
61
|
+
console.log(` ${isDefault ? chalk.green('→') : ' '} ` +
|
|
62
|
+
`${chalk.bold(project.name.padEnd(30))} ` +
|
|
69
63
|
`${statusColor(project.status.padEnd(12))} ` +
|
|
70
|
-
`${
|
|
71
|
-
`${
|
|
64
|
+
`${chalk.dim(`${project.progress}%`)} ` +
|
|
65
|
+
`${chalk.dim(`[${project.role}]`)}`);
|
|
72
66
|
}
|
|
73
|
-
console.log(
|
|
74
|
-
console.log(
|
|
67
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
68
|
+
console.log(chalk.dim(`\n${projects.length} project(s)`));
|
|
75
69
|
if (config.default_project) {
|
|
76
70
|
const defaultProject = projects.find(p => p.id === config.default_project);
|
|
77
|
-
console.log(
|
|
71
|
+
console.log(chalk.dim(`Default: ${defaultProject?.name || 'Unknown'}`));
|
|
78
72
|
}
|
|
79
|
-
console.log(
|
|
73
|
+
console.log(chalk.dim('\nRun "workdynamite projects --set" to change the default project.\n'));
|
|
80
74
|
});
|
|
81
|
-
|
|
75
|
+
projectsCommand
|
|
82
76
|
.command('set <name>')
|
|
83
77
|
.description('Set default project by name')
|
|
84
78
|
.action(async (name) => {
|
|
85
|
-
if (!
|
|
86
|
-
console.log(
|
|
79
|
+
if (!isAuthenticated()) {
|
|
80
|
+
console.log(chalk.red('Not logged in. Run "workdynamite login" first.'));
|
|
87
81
|
return;
|
|
88
82
|
}
|
|
89
|
-
const spinner = (
|
|
90
|
-
const { data, error } = await
|
|
83
|
+
const spinner = ora('Fetching projects...').start();
|
|
84
|
+
const { data, error } = await getProjects();
|
|
91
85
|
if (error) {
|
|
92
|
-
spinner.fail(
|
|
86
|
+
spinner.fail(chalk.red(`Failed to fetch projects: ${error}`));
|
|
93
87
|
return;
|
|
94
88
|
}
|
|
95
89
|
const project = data.projects.find(p => p.name.toLowerCase() === name.toLowerCase() || p.id === name);
|
|
96
90
|
if (!project) {
|
|
97
|
-
spinner.fail(
|
|
98
|
-
console.log(
|
|
91
|
+
spinner.fail(chalk.red(`Project "${name}" not found.`));
|
|
92
|
+
console.log(chalk.dim('Run "workdynamite projects" to see available projects.'));
|
|
99
93
|
return;
|
|
100
94
|
}
|
|
101
|
-
|
|
102
|
-
spinner.succeed(
|
|
95
|
+
setDefaultProject(project.id);
|
|
96
|
+
spinner.succeed(chalk.green(`Default project set to: ${project.name}`));
|
|
103
97
|
});
|
|
104
98
|
function getStatusColor(status) {
|
|
105
99
|
switch (status.toLowerCase()) {
|
|
106
100
|
case 'active':
|
|
107
101
|
case 'in_progress':
|
|
108
|
-
return
|
|
102
|
+
return chalk.green;
|
|
109
103
|
case 'planning':
|
|
110
|
-
return
|
|
104
|
+
return chalk.blue;
|
|
111
105
|
case 'on_hold':
|
|
112
|
-
return
|
|
106
|
+
return chalk.yellow;
|
|
113
107
|
case 'completed':
|
|
114
|
-
return
|
|
108
|
+
return chalk.gray;
|
|
115
109
|
default:
|
|
116
|
-
return
|
|
110
|
+
return chalk.white;
|
|
117
111
|
}
|
|
118
112
|
}
|
|
119
113
|
//# sourceMappingURL=projects.js.map
|