paean 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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +296 -0
  3. package/dist/api/auth.d.ts +71 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +257 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/client.d.ts +37 -0
  8. package/dist/api/client.d.ts.map +1 -0
  9. package/dist/api/client.js +101 -0
  10. package/dist/api/client.js.map +1 -0
  11. package/dist/api/todo.d.ts +167 -0
  12. package/dist/api/todo.d.ts.map +1 -0
  13. package/dist/api/todo.js +137 -0
  14. package/dist/api/todo.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +36 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/commands/context.d.ts +7 -0
  20. package/dist/commands/context.d.ts.map +1 -0
  21. package/dist/commands/context.js +155 -0
  22. package/dist/commands/context.js.map +1 -0
  23. package/dist/commands/login.d.ts +7 -0
  24. package/dist/commands/login.d.ts.map +1 -0
  25. package/dist/commands/login.js +108 -0
  26. package/dist/commands/login.js.map +1 -0
  27. package/dist/commands/logout.d.ts +7 -0
  28. package/dist/commands/logout.d.ts.map +1 -0
  29. package/dist/commands/logout.js +27 -0
  30. package/dist/commands/logout.js.map +1 -0
  31. package/dist/commands/serve.d.ts +7 -0
  32. package/dist/commands/serve.d.ts.map +1 -0
  33. package/dist/commands/serve.js +29 -0
  34. package/dist/commands/serve.js.map +1 -0
  35. package/dist/commands/tasks.d.ts +7 -0
  36. package/dist/commands/tasks.d.ts.map +1 -0
  37. package/dist/commands/tasks.js +276 -0
  38. package/dist/commands/tasks.js.map +1 -0
  39. package/dist/commands/validate.d.ts +7 -0
  40. package/dist/commands/validate.d.ts.map +1 -0
  41. package/dist/commands/validate.js +123 -0
  42. package/dist/commands/validate.js.map +1 -0
  43. package/dist/index.d.ts +13 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +19 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mcp/resources.d.ts +14 -0
  48. package/dist/mcp/resources.d.ts.map +1 -0
  49. package/dist/mcp/resources.js +166 -0
  50. package/dist/mcp/resources.js.map +1 -0
  51. package/dist/mcp/server.d.ts +12 -0
  52. package/dist/mcp/server.d.ts.map +1 -0
  53. package/dist/mcp/server.js +82 -0
  54. package/dist/mcp/server.js.map +1 -0
  55. package/dist/mcp/tools.d.ts +14 -0
  56. package/dist/mcp/tools.d.ts.map +1 -0
  57. package/dist/mcp/tools.js +341 -0
  58. package/dist/mcp/tools.js.map +1 -0
  59. package/dist/utils/config.d.ts +69 -0
  60. package/dist/utils/config.d.ts.map +1 -0
  61. package/dist/utils/config.js +129 -0
  62. package/dist/utils/config.js.map +1 -0
  63. package/dist/utils/output.d.ts +79 -0
  64. package/dist/utils/output.d.ts.map +1 -0
  65. package/dist/utils/output.js +157 -0
  66. package/dist/utils/output.js.map +1 -0
  67. package/dist/utils/project.d.ts +29 -0
  68. package/dist/utils/project.d.ts.map +1 -0
  69. package/dist/utils/project.js +135 -0
  70. package/dist/utils/project.js.map +1 -0
  71. package/package.json +72 -0
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Context Command
3
+ * Generate context file for AI agents
4
+ */
5
+ import { Command } from 'commander';
6
+ import { writeFileSync, mkdirSync, existsSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { getTodoList, getPendingChanges } from '../api/todo.js';
9
+ import { isAuthenticated, getConfigValue } from '../utils/config.js';
10
+ import { detectProject, getProjectId } from '../utils/project.js';
11
+ import * as output from '../utils/output.js';
12
+ export const contextCommand = new Command('context')
13
+ .description('Generate context file for AI agents')
14
+ .option('-o, --output <path>', 'Output file path', '.paean/context.md')
15
+ .option('--json', 'Output JSON instead of Markdown')
16
+ .option('--stdout', 'Print to stdout instead of file')
17
+ .action(async (options) => {
18
+ if (!isAuthenticated()) {
19
+ output.error('Not authenticated. Please run "paean login" first.');
20
+ process.exit(1);
21
+ }
22
+ const spin = output.spinner('Generating context...').start();
23
+ try {
24
+ // Gather context data
25
+ const project = detectProject();
26
+ const projectId = getProjectId(project);
27
+ const todoResponse = await getTodoList();
28
+ const pendingResponse = await getPendingChanges();
29
+ spin.stop();
30
+ const pendingTasks = todoResponse.data.items.filter((t) => t.status === 'pending' || t.status === 'in_progress');
31
+ const recentCompleted = todoResponse.data.items
32
+ .filter((t) => t.status === 'completed')
33
+ .slice(0, 5);
34
+ const contextData = {
35
+ project: {
36
+ name: project.name,
37
+ type: project.type,
38
+ path: project.path,
39
+ id: projectId,
40
+ },
41
+ user: {
42
+ email: getConfigValue('email'),
43
+ },
44
+ tasks: {
45
+ pending: pendingTasks,
46
+ recentlyCompleted: recentCompleted,
47
+ stats: todoResponse.data.stats,
48
+ },
49
+ pendingChanges: pendingResponse.data,
50
+ generatedAt: new Date().toISOString(),
51
+ };
52
+ // Generate output
53
+ let content;
54
+ if (options.json) {
55
+ content = JSON.stringify(contextData, null, 2);
56
+ }
57
+ else {
58
+ content = generateMarkdown(contextData, pendingTasks, recentCompleted);
59
+ }
60
+ // Output
61
+ if (options.stdout) {
62
+ console.log(content);
63
+ }
64
+ else {
65
+ const outputPath = options.output;
66
+ const dir = join(process.cwd(), outputPath.split('/').slice(0, -1).join('/'));
67
+ if (!existsSync(dir)) {
68
+ mkdirSync(dir, { recursive: true });
69
+ }
70
+ const fullPath = join(process.cwd(), outputPath);
71
+ writeFileSync(fullPath, content, 'utf-8');
72
+ output.success(`Context written to ${outputPath}`);
73
+ output.dim(`Contains ${pendingTasks.length} pending tasks`);
74
+ }
75
+ }
76
+ catch (error) {
77
+ spin.stop();
78
+ const message = error instanceof Error ? error.message : 'Unknown error';
79
+ output.error(`Failed to generate context: ${message}`);
80
+ process.exit(1);
81
+ }
82
+ });
83
+ function generateMarkdown(data, pendingTasks, recentCompleted) {
84
+ const lines = [];
85
+ lines.push('# Paean AI Context');
86
+ lines.push('');
87
+ lines.push(`> Generated: ${new Date().toLocaleString()}`);
88
+ lines.push(`> Project: ${data.project.name}`);
89
+ if (data.user.email) {
90
+ lines.push(`> User: ${data.user.email}`);
91
+ }
92
+ lines.push('');
93
+ // Pending Tasks Section
94
+ lines.push('## Pending Tasks');
95
+ lines.push('');
96
+ if (pendingTasks.length === 0) {
97
+ lines.push('No pending tasks.');
98
+ }
99
+ else {
100
+ lines.push('The following tasks need to be completed:');
101
+ lines.push('');
102
+ for (const task of pendingTasks) {
103
+ const priority = task.priority === 'high' ? '🔴' : task.priority === 'medium' ? '🟡' : '🟢';
104
+ const status = task.status === 'in_progress' ? '⏳' : '○';
105
+ lines.push(`### ${status} ${task.content}`);
106
+ lines.push('');
107
+ lines.push(`- **ID**: \`${task.id}\``);
108
+ lines.push(`- **Priority**: ${priority} ${task.priority}`);
109
+ lines.push(`- **Status**: ${task.status}`);
110
+ if (task.tags && task.tags.length > 0) {
111
+ lines.push(`- **Tags**: ${task.tags.join(', ')}`);
112
+ }
113
+ if (task.dueDate) {
114
+ lines.push(`- **Due**: ${task.dueDate}`);
115
+ }
116
+ if (task.sourceContext) {
117
+ lines.push(`- **Context**: ${task.sourceContext}`);
118
+ }
119
+ lines.push('');
120
+ }
121
+ }
122
+ // Acceptance Criteria
123
+ lines.push('## Acceptance Criteria');
124
+ lines.push('');
125
+ lines.push('When completing tasks, ensure:');
126
+ lines.push('');
127
+ lines.push('1. All code changes pass linting (`npm run lint` or equivalent)');
128
+ lines.push('2. All tests pass (`npm test` or equivalent)');
129
+ lines.push('3. Changes are documented if necessary');
130
+ lines.push('4. Mark task as complete using `paean tasks complete <task_id>`');
131
+ lines.push('');
132
+ // Recently Completed Section
133
+ if (recentCompleted.length > 0) {
134
+ lines.push('## Recently Completed');
135
+ lines.push('');
136
+ lines.push('For context, these tasks were recently completed:');
137
+ lines.push('');
138
+ for (const task of recentCompleted) {
139
+ lines.push(`- ✅ ${task.content} (\`${task.id.slice(0, 8)}\`)`);
140
+ }
141
+ lines.push('');
142
+ }
143
+ // Instructions for AI
144
+ lines.push('## Instructions for AI Agents');
145
+ lines.push('');
146
+ lines.push('When working on these tasks:');
147
+ lines.push('');
148
+ lines.push('1. Focus on one task at a time, starting with the highest priority');
149
+ lines.push('2. After completing a task, run: `paean tasks complete <task_id> --summary "Brief description"`');
150
+ lines.push('3. If a task cannot be completed, update its status: `paean tasks update <task_id> --status in_progress`');
151
+ lines.push('4. Create new tasks if you discover additional work: `paean tasks add "Task description"`');
152
+ lines.push('');
153
+ return lines.join('\n');
154
+ }
155
+ //# 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,7 @@
1
+ /**
2
+ * Login Command
3
+ * Authenticate with Paean AI using QR code or browser OAuth
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const loginCommand: Command;
7
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SA0ErB,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Login Command
3
+ * Authenticate with Paean AI using QR code or browser OAuth
4
+ */
5
+ import { Command } from 'commander';
6
+ import { qrLogin, browserLogin, getCurrentUser, validateToken } from '../api/auth.js';
7
+ import { isAuthenticated, getConfigValue } from '../utils/config.js';
8
+ import * as output from '../utils/output.js';
9
+ export const loginCommand = new Command('login')
10
+ .description('Authenticate with Paean AI')
11
+ .option('--qr', 'Use QR code login (scan with mobile app)')
12
+ .option('--browser', 'Use browser-based login')
13
+ .option('--check', 'Check current authentication status')
14
+ .action(async (options) => {
15
+ // Check current status
16
+ if (options.check) {
17
+ await checkAuthStatus();
18
+ return;
19
+ }
20
+ // If already logged in, show status
21
+ if (isAuthenticated()) {
22
+ const email = getConfigValue('email');
23
+ output.success(`Already logged in${email ? ` as ${email}` : ''}`);
24
+ output.dim('Use "paean logout" to sign out, or "paean login --check" to verify.');
25
+ return;
26
+ }
27
+ // Determine login method
28
+ const useQr = options.qr;
29
+ const useBrowser = options.browser;
30
+ // Default to browser if neither specified
31
+ const method = useQr ? 'qr' : useBrowser ? 'browser' : 'browser';
32
+ output.header('Paean AI Login');
33
+ const spin = output.spinner(method === 'qr' ? 'Creating QR session...' : 'Preparing login...').start();
34
+ try {
35
+ let result;
36
+ if (method === 'qr') {
37
+ spin.stop();
38
+ result = await qrLogin((status) => {
39
+ if (status === 'scanned') {
40
+ output.info('QR code scanned! Confirming...');
41
+ }
42
+ });
43
+ }
44
+ else {
45
+ spin.stop();
46
+ result = await browserLogin();
47
+ }
48
+ if (result.success) {
49
+ output.newline();
50
+ output.success('Login successful!');
51
+ // Show user info
52
+ const user = await getCurrentUser();
53
+ if (user) {
54
+ output.tableRow('Email', user.email);
55
+ if (user.name) {
56
+ output.tableRow('Name', user.name);
57
+ }
58
+ }
59
+ output.newline();
60
+ output.dim('You can now use "paean tasks" to view your tasks.');
61
+ }
62
+ else {
63
+ output.newline();
64
+ output.error(result.error || 'Login failed');
65
+ process.exit(1);
66
+ }
67
+ }
68
+ catch (error) {
69
+ spin.stop();
70
+ const message = error instanceof Error ? error.message : 'Unknown error';
71
+ output.error(`Login failed: ${message}`);
72
+ process.exit(1);
73
+ }
74
+ });
75
+ async function checkAuthStatus() {
76
+ output.header('Authentication Status');
77
+ if (!isAuthenticated()) {
78
+ output.warning('Not logged in');
79
+ output.dim('Use "paean login" to authenticate.');
80
+ return;
81
+ }
82
+ const spin = output.spinner('Validating token...').start();
83
+ try {
84
+ const isValid = await validateToken();
85
+ spin.stop();
86
+ if (isValid) {
87
+ const user = await getCurrentUser();
88
+ output.success('Authenticated');
89
+ if (user) {
90
+ output.tableRow('Email', user.email);
91
+ if (user.name) {
92
+ output.tableRow('Name', user.name);
93
+ }
94
+ output.tableRow('User ID', String(user.id));
95
+ }
96
+ }
97
+ else {
98
+ output.warning('Token expired or invalid');
99
+ output.dim('Use "paean login" to re-authenticate.');
100
+ }
101
+ }
102
+ catch (error) {
103
+ spin.stop();
104
+ output.warning('Could not validate token');
105
+ output.dim('Use "paean login" to re-authenticate.');
106
+ }
107
+ }
108
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,MAAM,EAAE,0CAA0C,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,SAAS,EAAE,qCAAqC,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,uBAAuB;IACvB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,eAAe,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,oCAAoC;IACpC,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAEnC,0CAA0C;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CACzB,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,oBAAoB,CAClE,CAAC,KAAK,EAAE,CAAC;IAEV,IAAI,CAAC;QACH,IAAI,MAA4C,CAAC;QAEjD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAChC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAEpC,iBAAiB;YACjB,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;YACpC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,eAAe;IAC5B,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAEvC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAEhC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;gBACD,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Logout Command
3
+ * Clear stored authentication credentials
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const logoutCommand: Command;
7
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAoBtB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Logout Command
3
+ * Clear stored authentication credentials
4
+ */
5
+ import { Command } from 'commander';
6
+ import { logout } from '../api/auth.js';
7
+ import { isAuthenticated, getConfigValue } from '../utils/config.js';
8
+ import * as output from '../utils/output.js';
9
+ export const logoutCommand = new Command('logout')
10
+ .description('Sign out of Paean AI')
11
+ .option('--force', 'Force logout without confirmation')
12
+ .action(async (options) => {
13
+ if (!isAuthenticated()) {
14
+ output.info('Not currently logged in.');
15
+ return;
16
+ }
17
+ const email = getConfigValue('email');
18
+ if (!options.force) {
19
+ output.warning(`You are about to sign out${email ? ` from ${email}` : ''}.`);
20
+ output.dim('This will clear your stored credentials.');
21
+ output.newline();
22
+ }
23
+ logout();
24
+ output.success('Successfully logged out.');
25
+ output.dim('Use "paean login" to sign in again.');
26
+ });
27
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,OAAO,CAAC,4BAA4B,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7E,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,CAAC;IACT,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Serve Command
3
+ * Start the MCP server for AI agent integration
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const serveCommand: Command;
7
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,YAAY,SAoBrB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Serve Command
3
+ * Start the MCP server for AI agent integration
4
+ */
5
+ import { Command } from 'commander';
6
+ import { isAuthenticated } from '../utils/config.js';
7
+ import { startMcpServer } from '../mcp/server.js';
8
+ export const serveCommand = new Command('serve')
9
+ .description('Start MCP server for AI agent integration')
10
+ .option('--stdio', 'Use stdio transport (default)', true)
11
+ .option('--debug', 'Enable debug logging')
12
+ .action(async (options) => {
13
+ if (!isAuthenticated()) {
14
+ // Write to stderr so it doesn't interfere with MCP protocol
15
+ console.error('Error: Not authenticated. Please run "paean login" first.');
16
+ process.exit(1);
17
+ }
18
+ try {
19
+ await startMcpServer({
20
+ debug: options.debug,
21
+ });
22
+ }
23
+ catch (error) {
24
+ const message = error instanceof Error ? error.message : 'Unknown error';
25
+ console.error(`MCP server error: ${message}`);
26
+ process.exit(1);
27
+ }
28
+ });
29
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,IAAI,CAAC;KACxD,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,4DAA4D;QAC5D,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,cAAc,CAAC;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tasks Command
3
+ * View and manage todo tasks
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const tasksCommand: Command;
7
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,YAAY,SAmErB,CAAC"}