tabstax-cli 0.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/README.md +110 -0
- package/bin/hey.js +2 -0
- package/dist/__tests__/api.test.d.ts +6 -0
- package/dist/__tests__/api.test.d.ts.map +1 -0
- package/dist/__tests__/api.test.js +146 -0
- package/dist/__tests__/api.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +6 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +78 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/output.test.d.ts +6 -0
- package/dist/__tests__/output.test.d.ts.map +1 -0
- package/dist/__tests__/output.test.js +104 -0
- package/dist/__tests__/output.test.js.map +1 -0
- package/dist/commands/add.d.ts +12 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +76 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/auth.d.ts +11 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +135 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/context.d.ts +15 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +75 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/done.d.ts +13 -0
- package/dist/commands/done.d.ts.map +1 -0
- package/dist/commands/done.js +76 -0
- package/dist/commands/done.js.map +1 -0
- package/dist/commands/edit.d.ts +27 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +170 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/list.d.ts +11 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +112 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +9 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +69 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +69 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +303 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +51 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +131 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +37 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +209 -0
- package/dist/lib/output.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication commands for Hey CLI
|
|
3
|
+
* hey login, hey logout, hey whoami
|
|
4
|
+
*/
|
|
5
|
+
import { createInterface } from 'readline';
|
|
6
|
+
import { config } from '../lib/config.js';
|
|
7
|
+
import { api } from '../lib/api.js';
|
|
8
|
+
import { printSuccess, printError, printInfo } from '../lib/output.js';
|
|
9
|
+
async function prompt(question, hidden = false) {
|
|
10
|
+
const rl = createInterface({
|
|
11
|
+
input: process.stdin,
|
|
12
|
+
output: process.stdout,
|
|
13
|
+
});
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
if (hidden && process.stdin.isTTY) {
|
|
16
|
+
// Hide password input
|
|
17
|
+
process.stdout.write(question);
|
|
18
|
+
let password = '';
|
|
19
|
+
process.stdin.setRawMode(true);
|
|
20
|
+
process.stdin.resume();
|
|
21
|
+
process.stdin.setEncoding('utf8');
|
|
22
|
+
const onData = (char) => {
|
|
23
|
+
if (char === '\n' || char === '\r' || char === '\u0004') {
|
|
24
|
+
process.stdin.setRawMode(false);
|
|
25
|
+
process.stdin.pause();
|
|
26
|
+
process.stdin.removeListener('data', onData);
|
|
27
|
+
rl.close();
|
|
28
|
+
console.log();
|
|
29
|
+
resolve(password);
|
|
30
|
+
}
|
|
31
|
+
else if (char === '\u0003') {
|
|
32
|
+
// Ctrl+C
|
|
33
|
+
process.exit();
|
|
34
|
+
}
|
|
35
|
+
else if (char === '\u007F' || char === '\b') {
|
|
36
|
+
// Backspace
|
|
37
|
+
password = password.slice(0, -1);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
password += char;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
process.stdin.on('data', onData);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
rl.question(question, (answer) => {
|
|
47
|
+
rl.close();
|
|
48
|
+
resolve(answer);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export async function login(options) {
|
|
54
|
+
try {
|
|
55
|
+
if (options.token) {
|
|
56
|
+
// Direct token login
|
|
57
|
+
config.setAuth({
|
|
58
|
+
accessToken: options.token,
|
|
59
|
+
expiresAt: null,
|
|
60
|
+
userEmail: 'unknown',
|
|
61
|
+
userId: 'unknown',
|
|
62
|
+
});
|
|
63
|
+
api.resetClient();
|
|
64
|
+
printSuccess('Logged in with token');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Interactive login
|
|
68
|
+
console.log('Login to TabStax');
|
|
69
|
+
console.log();
|
|
70
|
+
const email = await prompt('Email: ');
|
|
71
|
+
const password = await prompt('Password: ', true);
|
|
72
|
+
if (!email || !password) {
|
|
73
|
+
printError('Email and password required');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const result = await api.signIn(email, password);
|
|
77
|
+
printSuccess(`Logged in as ${result.email}`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const message = error instanceof Error ? error.message : 'Login failed';
|
|
81
|
+
printError(message);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function logout() {
|
|
86
|
+
await api.signOut();
|
|
87
|
+
printSuccess('Logged out');
|
|
88
|
+
}
|
|
89
|
+
export async function whoami() {
|
|
90
|
+
const auth = config.getAuth();
|
|
91
|
+
if (!config.isAuthenticated()) {
|
|
92
|
+
printError('Not logged in. Run: hey login');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
console.log(`Email: ${auth.userEmail}`);
|
|
96
|
+
console.log(`User ID: ${auth.userId}`);
|
|
97
|
+
console.log(`Config: ${config.path}`);
|
|
98
|
+
if (auth.expiresAt) {
|
|
99
|
+
const expiry = new Date(auth.expiresAt);
|
|
100
|
+
const isExpired = expiry.getTime() < Date.now();
|
|
101
|
+
if (isExpired) {
|
|
102
|
+
printInfo('Token expired. Run: hey login');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.log(`Expires: ${expiry.toLocaleString()}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export async function status() {
|
|
110
|
+
const auth = config.getAuth();
|
|
111
|
+
const context = config.getContext();
|
|
112
|
+
const limits = config.getLimits();
|
|
113
|
+
console.log('Hey CLI Status');
|
|
114
|
+
console.log();
|
|
115
|
+
// Auth status
|
|
116
|
+
if (config.isAuthenticated()) {
|
|
117
|
+
printSuccess(`Logged in as ${auth.userEmail}`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
printError('Not logged in');
|
|
121
|
+
}
|
|
122
|
+
// Context
|
|
123
|
+
if (context.lastProject) {
|
|
124
|
+
console.log(`Default project: ${context.lastProject}`);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log('Default project: (none)');
|
|
128
|
+
}
|
|
129
|
+
// Limits
|
|
130
|
+
console.log(`Action limit: ${limits.maxActionsPerStax} per stax`);
|
|
131
|
+
// Config path
|
|
132
|
+
console.log();
|
|
133
|
+
console.log(`Config: ${config.path}`);
|
|
134
|
+
}
|
|
135
|
+
//# 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,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context commands for Hey CLI
|
|
3
|
+
* hey use <project> - sets default project
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Set default project context
|
|
7
|
+
* hey use <project>
|
|
8
|
+
*/
|
|
9
|
+
export declare function use(projectName: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Show current context
|
|
12
|
+
* hey which
|
|
13
|
+
*/
|
|
14
|
+
export declare function which(): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH;;;GAGG;AACH,wBAAsB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC5D;AAED;;;GAGG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB3C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context commands for Hey CLI
|
|
3
|
+
* hey use <project> - sets default project
|
|
4
|
+
*/
|
|
5
|
+
import { config } from '../lib/config.js';
|
|
6
|
+
import { api } from '../lib/api.js';
|
|
7
|
+
import { printSuccess, printError, printWarning, printInfo, } from '../lib/output.js';
|
|
8
|
+
function requireAuth() {
|
|
9
|
+
if (!config.isAuthenticated()) {
|
|
10
|
+
printError('Not logged in. Run: hey login');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Set default project context
|
|
16
|
+
* hey use <project>
|
|
17
|
+
*/
|
|
18
|
+
export async function use(projectName) {
|
|
19
|
+
requireAuth();
|
|
20
|
+
try {
|
|
21
|
+
// Find the stax
|
|
22
|
+
const matches = await api.fuzzyFindStax(projectName);
|
|
23
|
+
if (matches.length === 0) {
|
|
24
|
+
printError(`Project "${projectName}" not found`);
|
|
25
|
+
const allStax = await api.getAllStax();
|
|
26
|
+
if (allStax.length > 0) {
|
|
27
|
+
console.log();
|
|
28
|
+
console.log('Available projects:');
|
|
29
|
+
allStax.slice(0, 10).forEach(s => console.log(` - ${s.name}`));
|
|
30
|
+
}
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
if (matches.length > 1) {
|
|
34
|
+
printWarning(`Multiple matches for "${projectName}":`);
|
|
35
|
+
matches.forEach(s => console.log(` - ${s.name}`));
|
|
36
|
+
console.log();
|
|
37
|
+
console.log('Be more specific.');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const stax = matches[0];
|
|
41
|
+
// Update context
|
|
42
|
+
config.setLastProject(stax.name, stax.id);
|
|
43
|
+
printSuccess(`Default project set to: ${stax.name}`);
|
|
44
|
+
printInfo('Future commands will use this project unless specified otherwise.');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : 'Failed to set project';
|
|
48
|
+
printError(message);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Show current context
|
|
54
|
+
* hey which
|
|
55
|
+
*/
|
|
56
|
+
export async function which() {
|
|
57
|
+
const context = config.getContext();
|
|
58
|
+
const auth = config.getAuth();
|
|
59
|
+
if (!config.isAuthenticated()) {
|
|
60
|
+
printError('Not logged in. Run: hey login');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
console.log('Current context:');
|
|
64
|
+
console.log();
|
|
65
|
+
if (context.lastProject) {
|
|
66
|
+
console.log(` Project: ${context.lastProject}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(' Project: (none set)');
|
|
70
|
+
printInfo('Use: hey use <project> to set default project');
|
|
71
|
+
}
|
|
72
|
+
console.log(` User: ${auth.userEmail}`);
|
|
73
|
+
console.log(` Config: ${config.path}`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Done command for Hey CLI
|
|
3
|
+
* hey done <n> - marks action #n as completed (becomes breadcrumb)
|
|
4
|
+
*/
|
|
5
|
+
export interface DoneOptions {
|
|
6
|
+
project?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function done(index: string, options?: DoneOptions): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Quick done: hey done (completes first action)
|
|
11
|
+
*/
|
|
12
|
+
export declare function doneFirst(options?: DoneOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=done.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.d.ts","sourceRoot":"","sources":["../../src/commands/done.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AASD,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoElF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Done command for Hey CLI
|
|
3
|
+
* hey done <n> - marks action #n as completed (becomes breadcrumb)
|
|
4
|
+
*/
|
|
5
|
+
import { config } from '../lib/config.js';
|
|
6
|
+
import { api } from '../lib/api.js';
|
|
7
|
+
import { printSuccess, printError, printWarning, formatBreadcrumb, } from '../lib/output.js';
|
|
8
|
+
function requireAuth() {
|
|
9
|
+
if (!config.isAuthenticated()) {
|
|
10
|
+
printError('Not logged in. Run: hey login');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function done(index, options = {}) {
|
|
15
|
+
requireAuth();
|
|
16
|
+
try {
|
|
17
|
+
const context = config.getContext();
|
|
18
|
+
const projectName = options.project ?? context.lastProject;
|
|
19
|
+
if (!projectName) {
|
|
20
|
+
printError('No project specified. Use: hey done -p <project> <n> or hey use <project>');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
// Parse index (1-based for user, 0-based internally)
|
|
24
|
+
const num = parseInt(index, 10);
|
|
25
|
+
if (isNaN(num) || num < 1) {
|
|
26
|
+
printError('Invalid action number. Use: hey done <n> where n is 1, 2, 3...');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// Find the stax
|
|
30
|
+
const matches = await api.fuzzyFindStax(projectName);
|
|
31
|
+
if (matches.length === 0) {
|
|
32
|
+
printError(`Project "${projectName}" not found`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (matches.length > 1) {
|
|
36
|
+
printWarning(`Multiple matches for "${projectName}":`);
|
|
37
|
+
matches.forEach(s => console.log(` - ${s.name}`));
|
|
38
|
+
console.log();
|
|
39
|
+
console.log('Be more specific or use: hey use <project>');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const stax = matches[0];
|
|
43
|
+
// Get current actions
|
|
44
|
+
const actions = await api.getActions(stax.id, false);
|
|
45
|
+
if (actions.length === 0) {
|
|
46
|
+
printWarning(`${stax.name} has no pending actions`);
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
if (num > actions.length) {
|
|
50
|
+
printError(`Action #${num} not found. ${stax.name} has ${actions.length} actions.`);
|
|
51
|
+
console.log();
|
|
52
|
+
console.log('Current actions:');
|
|
53
|
+
actions.forEach((a, i) => console.log(` ${i + 1}. ${a.content}`));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Complete the action
|
|
57
|
+
const actionToComplete = actions[num - 1];
|
|
58
|
+
const completed = await api.completeAction(actionToComplete.id);
|
|
59
|
+
// Update context
|
|
60
|
+
config.setLastProject(stax.name, stax.id);
|
|
61
|
+
printSuccess(`Completed action #${num}`);
|
|
62
|
+
console.log(formatBreadcrumb(completed));
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Failed to complete action';
|
|
66
|
+
printError(message);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Quick done: hey done (completes first action)
|
|
72
|
+
*/
|
|
73
|
+
export async function doneFirst(options = {}) {
|
|
74
|
+
await done('1', options);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=done.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.js","sourceRoot":"","sources":["../../src/commands/done.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edit commands for Hey CLI
|
|
3
|
+
* hey edit <n> "new text" - edits action content
|
|
4
|
+
* hey pri <project> <priority> - sets project priority
|
|
5
|
+
* hey mv <n> <m> - moves action from position n to m
|
|
6
|
+
*/
|
|
7
|
+
export interface EditOptions {
|
|
8
|
+
project?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PriorityOptions {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Edit action content
|
|
14
|
+
* hey edit <n> "new content"
|
|
15
|
+
*/
|
|
16
|
+
export declare function edit(index: string, content: string, options?: EditOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Set project priority
|
|
19
|
+
* hey pri <project> <must|should|good|meh>
|
|
20
|
+
*/
|
|
21
|
+
export declare function priority(projectName: string, level: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Move action position
|
|
24
|
+
* hey mv <from> <to>
|
|
25
|
+
*/
|
|
26
|
+
export declare function move(fromIndex: string, toIndex: string, options?: EditOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;CAE/B;AASD;;;GAGG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDnG;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChF;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEvG"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edit commands for Hey CLI
|
|
3
|
+
* hey edit <n> "new text" - edits action content
|
|
4
|
+
* hey pri <project> <priority> - sets project priority
|
|
5
|
+
* hey mv <n> <m> - moves action from position n to m
|
|
6
|
+
*/
|
|
7
|
+
import { config } from '../lib/config.js';
|
|
8
|
+
import { api } from '../lib/api.js';
|
|
9
|
+
import { printSuccess, printError, printWarning, formatAction, formatPriorityWithLabel, } from '../lib/output.js';
|
|
10
|
+
function requireAuth() {
|
|
11
|
+
if (!config.isAuthenticated()) {
|
|
12
|
+
printError('Not logged in. Run: hey login');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Edit action content
|
|
18
|
+
* hey edit <n> "new content"
|
|
19
|
+
*/
|
|
20
|
+
export async function edit(index, content, options = {}) {
|
|
21
|
+
requireAuth();
|
|
22
|
+
try {
|
|
23
|
+
const context = config.getContext();
|
|
24
|
+
const projectName = options.project ?? context.lastProject;
|
|
25
|
+
if (!projectName) {
|
|
26
|
+
printError('No project specified. Use: hey edit -p <project> <n> "text"');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const num = parseInt(index, 10);
|
|
30
|
+
if (isNaN(num) || num < 1) {
|
|
31
|
+
printError('Invalid action number. Use: hey edit <n> "new text"');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
// Find the stax
|
|
35
|
+
const matches = await api.fuzzyFindStax(projectName);
|
|
36
|
+
if (matches.length === 0) {
|
|
37
|
+
printError(`Project "${projectName}" not found`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
if (matches.length > 1) {
|
|
41
|
+
printWarning(`Multiple matches for "${projectName}":`);
|
|
42
|
+
matches.forEach(s => console.log(` - ${s.name}`));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
const stax = matches[0];
|
|
46
|
+
// Get current actions
|
|
47
|
+
const actions = await api.getActions(stax.id, false);
|
|
48
|
+
if (num > actions.length) {
|
|
49
|
+
printError(`Action #${num} not found. ${stax.name} has ${actions.length} actions.`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
// Edit the action
|
|
53
|
+
const actionToEdit = actions[num - 1];
|
|
54
|
+
const updated = await api.editAction(actionToEdit.id, content);
|
|
55
|
+
// Update context
|
|
56
|
+
config.setLastProject(stax.name, stax.id);
|
|
57
|
+
printSuccess(`Updated action #${num}`);
|
|
58
|
+
console.log(formatAction(updated, num - 1));
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : 'Failed to edit action';
|
|
62
|
+
printError(message);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Set project priority
|
|
68
|
+
* hey pri <project> <must|should|good|meh>
|
|
69
|
+
*/
|
|
70
|
+
export async function priority(projectName, level) {
|
|
71
|
+
requireAuth();
|
|
72
|
+
const validPriorities = ['must', 'should', 'good', 'meh'];
|
|
73
|
+
if (!validPriorities.includes(level.toLowerCase())) {
|
|
74
|
+
printError(`Invalid priority. Use: must, should, good, or meh`);
|
|
75
|
+
console.log();
|
|
76
|
+
console.log('Priorities:');
|
|
77
|
+
console.log(' must - Critical, do today');
|
|
78
|
+
console.log(' should - Important, do this week');
|
|
79
|
+
console.log(' good - Nice to have');
|
|
80
|
+
console.log(' meh - Low priority');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
// Find the stax
|
|
85
|
+
const matches = await api.fuzzyFindStax(projectName);
|
|
86
|
+
if (matches.length === 0) {
|
|
87
|
+
printError(`Project "${projectName}" not found`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
if (matches.length > 1) {
|
|
91
|
+
printWarning(`Multiple matches for "${projectName}":`);
|
|
92
|
+
matches.forEach(s => console.log(` - ${s.name}`));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const stax = matches[0];
|
|
96
|
+
// Set priority
|
|
97
|
+
const priorityValue = level.toLowerCase();
|
|
98
|
+
await api.setAttentionBlock(stax.id, priorityValue);
|
|
99
|
+
// Update context
|
|
100
|
+
config.setLastProject(stax.name, stax.id);
|
|
101
|
+
printSuccess(`Set ${stax.name} priority to ${formatPriorityWithLabel(priorityValue)}`);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const message = error instanceof Error ? error.message : 'Failed to set priority';
|
|
105
|
+
printError(message);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Move action position
|
|
111
|
+
* hey mv <from> <to>
|
|
112
|
+
*/
|
|
113
|
+
export async function move(fromIndex, toIndex, options = {}) {
|
|
114
|
+
requireAuth();
|
|
115
|
+
try {
|
|
116
|
+
const context = config.getContext();
|
|
117
|
+
const projectName = options.project ?? context.lastProject;
|
|
118
|
+
if (!projectName) {
|
|
119
|
+
printError('No project specified. Use: hey mv -p <project> <from> <to>');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
const from = parseInt(fromIndex, 10);
|
|
123
|
+
const to = parseInt(toIndex, 10);
|
|
124
|
+
if (isNaN(from) || isNaN(to) || from < 1 || to < 1) {
|
|
125
|
+
printError('Invalid positions. Use: hey mv <from> <to> where both are 1, 2, 3...');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
// Find the stax
|
|
129
|
+
const matches = await api.fuzzyFindStax(projectName);
|
|
130
|
+
if (matches.length === 0) {
|
|
131
|
+
printError(`Project "${projectName}" not found`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
if (matches.length > 1) {
|
|
135
|
+
printWarning(`Multiple matches for "${projectName}":`);
|
|
136
|
+
matches.forEach(s => console.log(` - ${s.name}`));
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
const stax = matches[0];
|
|
140
|
+
// Get current actions
|
|
141
|
+
const actions = await api.getActions(stax.id, false);
|
|
142
|
+
if (from > actions.length || to > actions.length) {
|
|
143
|
+
printError(`Invalid positions. ${stax.name} has ${actions.length} actions.`);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
// Reorder locally and update positions
|
|
147
|
+
const reordered = [...actions];
|
|
148
|
+
const [moved] = reordered.splice(from - 1, 1);
|
|
149
|
+
reordered.splice(to - 1, 0, moved);
|
|
150
|
+
// Update positions in DB
|
|
151
|
+
for (let i = 0; i < reordered.length; i++) {
|
|
152
|
+
if (reordered[i].position !== i) {
|
|
153
|
+
await api.updateActionPosition(reordered[i].id, i);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Update context
|
|
157
|
+
config.setLastProject(stax.name, stax.id);
|
|
158
|
+
printSuccess(`Moved action #${from} to position #${to}`);
|
|
159
|
+
// Show new order
|
|
160
|
+
console.log();
|
|
161
|
+
console.log('New order:');
|
|
162
|
+
reordered.forEach((a, i) => console.log(formatAction(a, i)));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
const message = error instanceof Error ? error.message : 'Failed to move action';
|
|
166
|
+
printError(message);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List commands for Hey CLI
|
|
3
|
+
* hey ls, hey ls stax, hey ls <project>
|
|
4
|
+
*/
|
|
5
|
+
export interface ListOptions {
|
|
6
|
+
all?: boolean;
|
|
7
|
+
done?: boolean;
|
|
8
|
+
count?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function list(target?: string, options?: ListOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AASD,wBAAsB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpF"}
|