Initial backup 2026-02-17
This commit is contained in:
109
skills/lark-calendar/scripts/create-task.mjs
Normal file
109
skills/lark-calendar/scripts/create-task.mjs
Normal file
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Create a task
|
||||
*
|
||||
* Usage:
|
||||
* node create-task.mjs --title "Review PR" --due "2026-02-05 18:00:00"
|
||||
*/
|
||||
|
||||
import { parseArgs } from 'util';
|
||||
import { createTask } from '../lib/task.mjs';
|
||||
import { DEFAULT_TIMEZONE } from '../lib/calendar.mjs';
|
||||
import { resolveNames, getDisplayNameSync } from '../lib/employees.mjs';
|
||||
|
||||
const { values } = parseArgs({
|
||||
options: {
|
||||
title: { type: 'string' },
|
||||
description: { type: 'string', default: '' },
|
||||
due: { type: 'string' },
|
||||
assignees: { type: 'string', default: '' },
|
||||
'assignee-ids': { type: 'string', default: '' },
|
||||
timezone: { type: 'string', default: DEFAULT_TIMEZONE },
|
||||
help: { type: 'boolean', short: 'h' }
|
||||
}
|
||||
});
|
||||
|
||||
if (values.help) {
|
||||
console.log(`
|
||||
Create a Lark task
|
||||
|
||||
Options:
|
||||
--title Task title (required)
|
||||
--description Task description
|
||||
--due Due time: YYYY-MM-DD HH:MM:SS (required)
|
||||
--assignees Comma-separated names (auto-resolved to user_ids)
|
||||
--assignee-ids Comma-separated user_ids directly
|
||||
--timezone IANA timezone (default: Asia/Singapore)
|
||||
-h, --help Show this help
|
||||
|
||||
Examples:
|
||||
node create-task.mjs --title "Review PR #123" --due "2026-02-05 18:00:00"
|
||||
node create-task.mjs --title "Finish report" --due "2026-02-03 17:00:00" --assignees "Boyang,jc"
|
||||
`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Validate required fields
|
||||
if (!values.title) {
|
||||
console.error('Error: --title is required');
|
||||
process.exit(1);
|
||||
}
|
||||
if (!values.due) {
|
||||
console.error('Error: --due is required');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Resolve assignees
|
||||
let assigneeIds = [];
|
||||
if (values['assignee-ids']) {
|
||||
assigneeIds = values['assignee-ids'].split(',').map(s => s.trim()).filter(Boolean);
|
||||
}
|
||||
if (values.assignees) {
|
||||
const names = values.assignees.split(',').map(s => s.trim()).filter(Boolean);
|
||||
const { resolved, unresolved } = resolveNames(names);
|
||||
assigneeIds = [...new Set([...assigneeIds, ...resolved])];
|
||||
if (unresolved.length > 0) {
|
||||
console.warn(`Warning: Could not resolve names: ${unresolved.join(', ')}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
console.log('Creating task...');
|
||||
console.log(` Title: ${values.title}`);
|
||||
console.log(` Due: ${values.due}`);
|
||||
console.log(` Timezone: ${values.timezone}`);
|
||||
console.log(` Assignees: ${assigneeIds.map(id => getDisplayNameSync(id)).join(', ') || '(none)'}`);
|
||||
console.log('');
|
||||
|
||||
const task = await createTask({
|
||||
title: values.title,
|
||||
description: values.description,
|
||||
dueTime: values.due,
|
||||
assigneeIds,
|
||||
timezone: values.timezone
|
||||
});
|
||||
|
||||
console.log('✅ Task created successfully!');
|
||||
console.log('');
|
||||
console.log('Task Details:');
|
||||
console.log(` Task ID: ${task.guid}`);
|
||||
console.log(` Title: ${task.summary}`);
|
||||
console.log(` URL: ${task.url || 'N/A'}`);
|
||||
|
||||
// Output JSON for programmatic use
|
||||
if (process.env.JSON_OUTPUT) {
|
||||
console.log('\nJSON:');
|
||||
console.log(JSON.stringify(task, null, 2));
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Failed to create task:', error.message);
|
||||
if (error.larkResponse) {
|
||||
console.error('Lark response:', JSON.stringify(error.larkResponse, null, 2));
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user