@latentsearch/timemachine-cli
Version:
CLI tool for TimeMachine API. Generates time entries, lists users/projects, and features an enhanced dry-run output for generation.
91 lines (90 loc) • 3.88 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const commander_1 = require("commander");
const dotenv_1 = __importDefault(require("dotenv"));
const luxon_1 = require("luxon");
// Load environment variables
dotenv_1.default.config();
// Import command implementations
const list_users_1 = require("./commands/list-users");
const list_projects_1 = require("./commands/list-projects");
const create_entry_1 = require("./commands/create-entry");
const generate_entries_1 = require("./commands/generate-entries");
const list_entries_1 = require("./commands/list-entries");
const program = new commander_1.Command();
// Main program definition
program
.name("codeclock")
.description("Code Clock Time Entry Management CLI")
.version("1.0.0")
.option("-b, --base-url <url>", "API base URL", process.env.CODECLOCK_API_URL || "https://codeclock.yourdomain.workers.dev")
.option("-k, --api-key <key>", "API key", process.env.CODECLOCK_API_KEY)
.option("-v, --verbose", "Show detailed output", false);
// List users command
program
.command("list-users")
.description("List all users")
.action(async (options) => {
const opts = { ...program.opts(), ...options };
await (0, list_users_1.listUsers)(opts);
});
// List projects command
program
.command("list-projects")
.description("List all projects")
.action(async (options) => {
const opts = { ...program.opts(), ...options };
await (0, list_projects_1.listProjects)(opts);
});
// Create a single time entry interactively
program
.command("create")
.description("Create a time entry interactively")
.action(async (options) => {
const opts = { ...program.opts(), ...options };
await (0, create_entry_1.createEntry)(opts);
});
// Get default dates for the last 30 days
const today = new Date();
const thirtyDaysAgo = new Date(today);
thirtyDaysAgo.setDate(today.getDate() - 30);
// Use empty string as fallback if toISODate returns null
const defaultStartDate = luxon_1.DateTime.fromJSDate(thirtyDaysAgo).toISODate() || '';
const defaultEndDate = luxon_1.DateTime.fromJSDate(today).toISODate() || '';
// Generate multiple time entries based on pattern
program
.command("generate")
.description("Generate time entries based on weekday patterns")
.option("-u, --user <id|name>", "User ID or name")
.option("-p, --project <id|name>", "Project ID or name")
.option("-s, --start-date <date>", "Start date (YYYY-MM-DD)", defaultStartDate)
.option("-e, --end-date <date>", "End date (YYYY-MM-DD)", defaultEndDate)
.option("-d, --days <days>", "Days to log time (comma-separated: 1=Monday through 7=Sunday)", "1,2,3,4,5")
.option("-h, --hours <hours>", "Hours per day", "8")
.option("--dry-run", "Perform a dry run without making actual API calls", false)
.action(async (options) => {
const opts = { ...program.opts(), ...options };
await (0, generate_entries_1.generateEntries)(opts);
});
// Display time entries command
program
.command("list-entries")
.description("List time entries")
.option("-u, --user <id|name>", "Filter by user ID or name")
.option("-p, --project <id|name>", "Filter by project ID or name")
.option("-s, --start-date <date>", "Start date (YYYY-MM-DD)", defaultStartDate)
.option("-e, --end-date <date>", "End date (YYYY-MM-DD)", defaultEndDate)
.option("-l, --limit <number>", "Limit number of entries", "50")
.action(async (options) => {
const opts = { ...program.opts(), ...options };
await (0, list_entries_1.listEntries)(opts);
});
program.parse(process.argv);
// If no command provided, show help
if (!process.argv.slice(2).length) {
program.outputHelp();
}