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.
- package/LICENSE +21 -0
- package/README.md +296 -0
- package/dist/api/auth.d.ts +71 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +257 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +101 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/todo.d.ts +167 -0
- package/dist/api/todo.d.ts.map +1 -0
- package/dist/api/todo.js +137 -0
- package/dist/api/todo.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/context.d.ts +7 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +155 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +108 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +27 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +29 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/tasks.d.ts +7 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +276 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +123 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/resources.d.ts +14 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +166 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +82 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +341 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/utils/config.d.ts +69 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +129 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/output.d.ts +79 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +157 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/project.d.ts +29 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +135 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tasks Command
|
|
3
|
+
* View and manage todo tasks
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { getTodoList, createTodoItem, completeTodoItem, updateTodoItem, deleteTodoItem, getPendingChanges, acceptPendingChange, rejectPendingChange, } from '../api/todo.js';
|
|
7
|
+
import { isAuthenticated } from '../utils/config.js';
|
|
8
|
+
import * as output from '../utils/output.js';
|
|
9
|
+
export const tasksCommand = new Command('tasks')
|
|
10
|
+
.description('View and manage tasks')
|
|
11
|
+
.option('--json', 'Output in JSON format')
|
|
12
|
+
.option('--status <status>', 'Filter by status (pending, completed, in_progress, cancelled, all)')
|
|
13
|
+
.option('--priority <priority>', 'Filter by priority (high, medium, low)')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
requireAuth();
|
|
16
|
+
const spin = output.spinner('Fetching tasks...').start();
|
|
17
|
+
try {
|
|
18
|
+
const response = await getTodoList({
|
|
19
|
+
status: options.status,
|
|
20
|
+
priority: options.priority,
|
|
21
|
+
});
|
|
22
|
+
spin.stop();
|
|
23
|
+
if (options.json) {
|
|
24
|
+
output.json(response.data);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const { items, stats } = response.data;
|
|
28
|
+
output.header('Tasks');
|
|
29
|
+
// Show stats
|
|
30
|
+
output.tableRow('Total', String(stats.total), 15);
|
|
31
|
+
output.tableRow('Pending', String(stats.pending), 15);
|
|
32
|
+
output.tableRow('Completed', String(stats.completed), 15);
|
|
33
|
+
if (stats.overdue) {
|
|
34
|
+
output.tableRow('Overdue', output.colors.error(String(stats.overdue)), 15);
|
|
35
|
+
}
|
|
36
|
+
if (stats.dueToday) {
|
|
37
|
+
output.tableRow('Due Today', output.colors.warning(String(stats.dueToday)), 15);
|
|
38
|
+
}
|
|
39
|
+
output.newline();
|
|
40
|
+
if (items.length === 0) {
|
|
41
|
+
output.dim('No tasks found.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Group by status
|
|
45
|
+
const pending = items.filter((t) => t.status === 'pending' || t.status === 'in_progress');
|
|
46
|
+
const completed = items.filter((t) => t.status === 'completed');
|
|
47
|
+
if (pending.length > 0) {
|
|
48
|
+
output.info(`Pending (${pending.length}):`);
|
|
49
|
+
for (const task of pending) {
|
|
50
|
+
printTask(task);
|
|
51
|
+
}
|
|
52
|
+
output.newline();
|
|
53
|
+
}
|
|
54
|
+
if (completed.length > 0 && (!options.status || options.status === 'all')) {
|
|
55
|
+
output.dim(`Recently Completed (${Math.min(completed.length, 5)}):`);
|
|
56
|
+
for (const task of completed.slice(0, 5)) {
|
|
57
|
+
printTask(task);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
spin.stop();
|
|
63
|
+
handleError(error);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
// Subcommand: tasks add
|
|
67
|
+
tasksCommand
|
|
68
|
+
.command('add <content>')
|
|
69
|
+
.description('Create a new task')
|
|
70
|
+
.option('-p, --priority <priority>', 'Priority (high, medium, low)', 'medium')
|
|
71
|
+
.option('-t, --tags <tags>', 'Comma-separated tags')
|
|
72
|
+
.option('--json', 'Output in JSON format')
|
|
73
|
+
.action(async (content, options) => {
|
|
74
|
+
requireAuth();
|
|
75
|
+
const spin = output.spinner('Creating task...').start();
|
|
76
|
+
try {
|
|
77
|
+
const response = await createTodoItem({
|
|
78
|
+
content,
|
|
79
|
+
priority: options.priority,
|
|
80
|
+
tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : undefined,
|
|
81
|
+
});
|
|
82
|
+
spin.stop();
|
|
83
|
+
if (options.json) {
|
|
84
|
+
output.json(response.data);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
output.success('Task created');
|
|
88
|
+
printTask(response.data);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
spin.stop();
|
|
92
|
+
handleError(error);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Subcommand: tasks complete
|
|
96
|
+
tasksCommand
|
|
97
|
+
.command('complete <id>')
|
|
98
|
+
.description('Mark a task as completed')
|
|
99
|
+
.option('-s, --summary <summary>', 'Completion summary')
|
|
100
|
+
.option('--json', 'Output in JSON format')
|
|
101
|
+
.action(async (id, options) => {
|
|
102
|
+
requireAuth();
|
|
103
|
+
const spin = output.spinner('Completing task...').start();
|
|
104
|
+
try {
|
|
105
|
+
const response = await completeTodoItem(id, options.summary);
|
|
106
|
+
spin.stop();
|
|
107
|
+
if (options.json) {
|
|
108
|
+
output.json(response.data);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
output.success('Task completed');
|
|
112
|
+
printTask(response.data);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
spin.stop();
|
|
116
|
+
handleError(error);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// Subcommand: tasks update
|
|
120
|
+
tasksCommand
|
|
121
|
+
.command('update <id>')
|
|
122
|
+
.description('Update a task')
|
|
123
|
+
.option('-c, --content <content>', 'New content')
|
|
124
|
+
.option('-p, --priority <priority>', 'Priority (high, medium, low)')
|
|
125
|
+
.option('-s, --status <status>', 'Status (pending, in_progress)')
|
|
126
|
+
.option('--json', 'Output in JSON format')
|
|
127
|
+
.action(async (id, options) => {
|
|
128
|
+
requireAuth();
|
|
129
|
+
const updates = {};
|
|
130
|
+
if (options.content)
|
|
131
|
+
updates.content = options.content;
|
|
132
|
+
if (options.priority)
|
|
133
|
+
updates.priority = options.priority;
|
|
134
|
+
if (options.status)
|
|
135
|
+
updates.status = options.status;
|
|
136
|
+
if (Object.keys(updates).length === 0) {
|
|
137
|
+
output.error('No updates specified. Use --content, --priority, or --status.');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
const spin = output.spinner('Updating task...').start();
|
|
141
|
+
try {
|
|
142
|
+
const response = await updateTodoItem(id, updates);
|
|
143
|
+
spin.stop();
|
|
144
|
+
if (options.json) {
|
|
145
|
+
output.json(response.data);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
output.success('Task updated');
|
|
149
|
+
printTask(response.data);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
spin.stop();
|
|
153
|
+
handleError(error);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Subcommand: tasks delete
|
|
157
|
+
tasksCommand
|
|
158
|
+
.command('delete <id>')
|
|
159
|
+
.description('Delete a task')
|
|
160
|
+
.action(async (id) => {
|
|
161
|
+
requireAuth();
|
|
162
|
+
const spin = output.spinner('Deleting task...').start();
|
|
163
|
+
try {
|
|
164
|
+
await deleteTodoItem(id);
|
|
165
|
+
spin.stop();
|
|
166
|
+
output.success('Task deleted');
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
spin.stop();
|
|
170
|
+
handleError(error);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// Subcommand: tasks pending
|
|
174
|
+
tasksCommand
|
|
175
|
+
.command('pending')
|
|
176
|
+
.description('View pending AI-suggested changes')
|
|
177
|
+
.option('--json', 'Output in JSON format')
|
|
178
|
+
.option('--all', 'Show all changes including processed ones')
|
|
179
|
+
.action(async (options) => {
|
|
180
|
+
requireAuth();
|
|
181
|
+
const spin = output.spinner('Fetching pending changes...').start();
|
|
182
|
+
try {
|
|
183
|
+
const response = await getPendingChanges(options.all ? 'all' : 'pending');
|
|
184
|
+
spin.stop();
|
|
185
|
+
if (options.json) {
|
|
186
|
+
output.json(response.data);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (response.data.length === 0) {
|
|
190
|
+
output.info('No pending changes.');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
output.header('Pending Changes');
|
|
194
|
+
for (const change of response.data) {
|
|
195
|
+
output.newline();
|
|
196
|
+
output.info(`#${change.id} - ${change.summary}`);
|
|
197
|
+
output.tableRow('Status', change.status, 15);
|
|
198
|
+
output.tableRow('Changes', String(change.changeCount), 15);
|
|
199
|
+
output.tableRow('Operations', `+${change.operationCounts.add} ~${change.operationCounts.update} ✓${change.operationCounts.complete}`, 15);
|
|
200
|
+
if (change.sourceNoteTitle) {
|
|
201
|
+
output.tableRow('Source', output.truncate(change.sourceNoteTitle, 40), 15);
|
|
202
|
+
}
|
|
203
|
+
output.tableRow('Created', output.formatDate(change.createdAt), 15);
|
|
204
|
+
if (change.isExpired) {
|
|
205
|
+
output.dim(' (expired)');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
output.newline();
|
|
209
|
+
output.dim('Use "paean tasks accept <id>" or "paean tasks reject <id>" to process.');
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
spin.stop();
|
|
213
|
+
handleError(error);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
// Subcommand: tasks accept
|
|
217
|
+
tasksCommand
|
|
218
|
+
.command('accept <changeId>')
|
|
219
|
+
.description('Accept a pending change')
|
|
220
|
+
.action(async (changeId) => {
|
|
221
|
+
requireAuth();
|
|
222
|
+
const spin = output.spinner('Accepting change...').start();
|
|
223
|
+
try {
|
|
224
|
+
await acceptPendingChange(parseInt(changeId, 10));
|
|
225
|
+
spin.stop();
|
|
226
|
+
output.success('Change accepted');
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
spin.stop();
|
|
230
|
+
handleError(error);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
// Subcommand: tasks reject
|
|
234
|
+
tasksCommand
|
|
235
|
+
.command('reject <changeId>')
|
|
236
|
+
.description('Reject a pending change')
|
|
237
|
+
.option('-n, --notes <notes>', 'Rejection notes')
|
|
238
|
+
.action(async (changeId, options) => {
|
|
239
|
+
requireAuth();
|
|
240
|
+
const spin = output.spinner('Rejecting change...').start();
|
|
241
|
+
try {
|
|
242
|
+
await rejectPendingChange(parseInt(changeId, 10), options.notes);
|
|
243
|
+
spin.stop();
|
|
244
|
+
output.success('Change rejected');
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
spin.stop();
|
|
248
|
+
handleError(error);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
// Helper functions
|
|
252
|
+
function requireAuth() {
|
|
253
|
+
if (!isAuthenticated()) {
|
|
254
|
+
output.error('Not authenticated. Please run "paean login" first.');
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function printTask(task) {
|
|
259
|
+
const status = output.formatStatus(task.status);
|
|
260
|
+
const priority = output.formatPriority(task.priority);
|
|
261
|
+
const content = output.truncate(task.content, 60);
|
|
262
|
+
output.listItem(`${output.colors.dim(`[${task.id.slice(0, 8)}]`)} ${content}`);
|
|
263
|
+
output.dim(` ${status} | ${priority}`);
|
|
264
|
+
if (task.tags && task.tags.length > 0) {
|
|
265
|
+
output.dim(` Tags: ${task.tags.join(', ')}`);
|
|
266
|
+
}
|
|
267
|
+
if (task.dueDate) {
|
|
268
|
+
output.dim(` Due: ${output.formatDate(task.dueDate)}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function handleError(error) {
|
|
272
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
273
|
+
output.error(message);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,eAAe,SAiFxB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Command
|
|
3
|
+
* Check if current changes satisfy pending tasks
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { getTodoList, completeTodoItem } from '../api/todo.js';
|
|
7
|
+
import { isAuthenticated } from '../utils/config.js';
|
|
8
|
+
import { detectProject } from '../utils/project.js';
|
|
9
|
+
import * as output from '../utils/output.js';
|
|
10
|
+
export const validateCommand = new Command('validate')
|
|
11
|
+
.description('Check if current changes satisfy pending tasks')
|
|
12
|
+
.option('--auto-complete', 'Automatically mark validated tasks as complete')
|
|
13
|
+
.option('--json', 'Output validation results as JSON')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
if (!isAuthenticated()) {
|
|
16
|
+
output.error('Not authenticated. Please run "paean login" first.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const spin = output.spinner('Validating tasks...').start();
|
|
20
|
+
try {
|
|
21
|
+
const project = detectProject();
|
|
22
|
+
const todoResponse = await getTodoList({ status: 'pending' });
|
|
23
|
+
spin.stop();
|
|
24
|
+
const pendingTasks = todoResponse.data.items.filter((t) => t.status === 'pending' || t.status === 'in_progress');
|
|
25
|
+
if (pendingTasks.length === 0) {
|
|
26
|
+
output.success('No pending tasks to validate.');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
output.header('Task Validation');
|
|
30
|
+
output.dim(`Project: ${project.name}`);
|
|
31
|
+
output.newline();
|
|
32
|
+
const validationResults = [];
|
|
33
|
+
// For each pending task, check if it might be complete
|
|
34
|
+
// This is a basic check - more sophisticated validation could be added
|
|
35
|
+
for (const task of pendingTasks) {
|
|
36
|
+
const result = await validateTask(task, project);
|
|
37
|
+
validationResults.push(result);
|
|
38
|
+
const icon = result.validated ? output.colors.success('✓') : output.colors.dim('○');
|
|
39
|
+
output.listItem(`${icon} ${output.truncate(task.content, 50)}`);
|
|
40
|
+
output.dim(` ${result.reason}`);
|
|
41
|
+
if (result.validated && options.autoComplete) {
|
|
42
|
+
try {
|
|
43
|
+
await completeTodoItem(task.id, result.reason);
|
|
44
|
+
output.success(` → Marked as complete`);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
output.error(` → Failed to mark complete`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
output.newline();
|
|
51
|
+
}
|
|
52
|
+
if (options.json) {
|
|
53
|
+
output.json(validationResults);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Summary
|
|
57
|
+
const validatedCount = validationResults.filter((r) => r.validated).length;
|
|
58
|
+
output.newline();
|
|
59
|
+
output.tableRow('Total Tasks', String(pendingTasks.length), 20);
|
|
60
|
+
output.tableRow('Validated', String(validatedCount), 20);
|
|
61
|
+
output.tableRow('Remaining', String(pendingTasks.length - validatedCount), 20);
|
|
62
|
+
if (validatedCount > 0 && !options.autoComplete) {
|
|
63
|
+
output.newline();
|
|
64
|
+
output.dim('Use --auto-complete to automatically mark validated tasks as complete.');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
spin.stop();
|
|
69
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
70
|
+
output.error(`Validation failed: ${message}`);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
async function validateTask(task, _project) {
|
|
75
|
+
// Basic validation logic
|
|
76
|
+
// In a more sophisticated implementation, this could:
|
|
77
|
+
// 1. Check git diff for related changes
|
|
78
|
+
// 2. Run tests
|
|
79
|
+
// 3. Check for specific file patterns
|
|
80
|
+
// 4. Use AI to analyze changes
|
|
81
|
+
// For now, we do basic keyword matching and status checks
|
|
82
|
+
const content = task.content.toLowerCase();
|
|
83
|
+
// Check if task appears to be documentation-related
|
|
84
|
+
if (content.includes('document') || content.includes('readme') || content.includes('doc')) {
|
|
85
|
+
// Could check if README was modified
|
|
86
|
+
return {
|
|
87
|
+
task,
|
|
88
|
+
validated: false,
|
|
89
|
+
reason: 'Documentation tasks require manual verification',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Check if task is a bug fix
|
|
93
|
+
if (content.includes('fix') || content.includes('bug') || content.includes('error')) {
|
|
94
|
+
return {
|
|
95
|
+
task,
|
|
96
|
+
validated: false,
|
|
97
|
+
reason: 'Bug fixes require testing to validate',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Check if task is about adding a feature
|
|
101
|
+
if (content.includes('add') || content.includes('implement') || content.includes('create')) {
|
|
102
|
+
return {
|
|
103
|
+
task,
|
|
104
|
+
validated: false,
|
|
105
|
+
reason: 'Feature additions require code review',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// If task is in_progress, it might be partially done
|
|
109
|
+
if (task.status === 'in_progress') {
|
|
110
|
+
return {
|
|
111
|
+
task,
|
|
112
|
+
validated: false,
|
|
113
|
+
reason: 'Task is still in progress',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Default: cannot automatically validate
|
|
117
|
+
return {
|
|
118
|
+
task,
|
|
119
|
+
validated: false,
|
|
120
|
+
reason: 'Requires manual verification',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paean CLI - Public API
|
|
3
|
+
* Export functions for programmatic usage
|
|
4
|
+
*/
|
|
5
|
+
export { createApiClient, getApiClient, getPublicApiClient } from './api/client.js';
|
|
6
|
+
export { qrLogin, browserLogin, getCurrentUser, validateToken, logout, type LoginResponse, type UserInfo, } from './api/auth.js';
|
|
7
|
+
export { getTodoList, getTodoItem, createTodoItem, updateTodoItem, completeTodoItem, reopenTodoItem, deleteTodoItem, getPendingChanges, acceptPendingChange, rejectPendingChange, getTodoPreferences, updateTodoPreferences, analyzeTodos, type TodoItem, type TodoListResponse, type PendingChange, type TodoPreferences, } from './api/todo.js';
|
|
8
|
+
export { getConfig, getConfigValue, setConfigValue, setConfig, isAuthenticated, getToken, getApiUrl, getWebUrl, storeAuth, clearAuth, getConfigPath, type PaeanConfig, } from './utils/config.js';
|
|
9
|
+
export { detectProject, getProjectId, isInProject, type ProjectContext, } from './utils/project.js';
|
|
10
|
+
export { startMcpServer, type McpServerOptions } from './mcp/server.js';
|
|
11
|
+
export { getMcpResources, readMcpResource } from './mcp/resources.js';
|
|
12
|
+
export { getMcpTools, executeMcpTool } from './mcp/tools.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGpF,OAAO,EACL,OAAO,EACP,YAAY,EACZ,cAAc,EACd,aAAa,EACb,MAAM,EACN,KAAK,aAAa,EAClB,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,SAAS,EACT,eAAe,EACf,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paean CLI - Public API
|
|
3
|
+
* Export functions for programmatic usage
|
|
4
|
+
*/
|
|
5
|
+
// API Client
|
|
6
|
+
export { createApiClient, getApiClient, getPublicApiClient } from './api/client.js';
|
|
7
|
+
// Authentication
|
|
8
|
+
export { qrLogin, browserLogin, getCurrentUser, validateToken, logout, } from './api/auth.js';
|
|
9
|
+
// Todo API
|
|
10
|
+
export { getTodoList, getTodoItem, createTodoItem, updateTodoItem, completeTodoItem, reopenTodoItem, deleteTodoItem, getPendingChanges, acceptPendingChange, rejectPendingChange, getTodoPreferences, updateTodoPreferences, analyzeTodos, } from './api/todo.js';
|
|
11
|
+
// Configuration
|
|
12
|
+
export { getConfig, getConfigValue, setConfigValue, setConfig, isAuthenticated, getToken, getApiUrl, getWebUrl, storeAuth, clearAuth, getConfigPath, } from './utils/config.js';
|
|
13
|
+
// Project detection
|
|
14
|
+
export { detectProject, getProjectId, isInProject, } from './utils/project.js';
|
|
15
|
+
// MCP Server
|
|
16
|
+
export { startMcpServer } from './mcp/server.js';
|
|
17
|
+
export { getMcpResources, readMcpResource } from './mcp/resources.js';
|
|
18
|
+
export { getMcpTools, executeMcpTool } from './mcp/tools.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEpF,iBAAiB;AACjB,OAAO,EACL,OAAO,EACP,YAAY,EACZ,cAAc,EACd,aAAa,EACb,MAAM,GAGP,MAAM,eAAe,CAAC;AAEvB,WAAW;AACX,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,GAKb,MAAM,eAAe,CAAC;AAEvB,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,SAAS,EACT,eAAe,EACf,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,GAEd,MAAM,mBAAmB,CAAC;AAE3B,oBAAoB;AACpB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAE5B,aAAa;AACb,OAAO,EAAE,cAAc,EAAyB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Resources
|
|
3
|
+
* Define resources that AI agents can read
|
|
4
|
+
*/
|
|
5
|
+
import { type Resource } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Get available MCP resources
|
|
8
|
+
*/
|
|
9
|
+
export declare function getMcpResources(): Promise<Resource[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Read a specific MCP resource
|
|
12
|
+
*/
|
|
13
|
+
export declare function readMcpResource(uri: string): Promise<unknown>;
|
|
14
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAKnE;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmC3D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmInE"}
|