@jvittechs/j 1.0.11 → 1.0.12

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.
@@ -1,12 +1,13 @@
1
1
  // src/commands/tasks/summary.ts
2
2
  import { Command } from "commander";
3
- import chalk from "chalk";
3
+ import chalk2 from "chalk";
4
4
  import boxen from "boxen";
5
5
 
6
6
  // src/services/task.service.ts
7
- import { promises as fs } from "fs";
7
+ import { promises as fs, existsSync } from "fs";
8
8
  import { join } from "path";
9
9
  import { execSync } from "child_process";
10
+ import chalk from "chalk";
10
11
 
11
12
  // src/types/task.types.ts
12
13
  import { z } from "zod";
@@ -52,6 +53,24 @@ var TaskService = class {
52
53
  constructor(cwd) {
53
54
  this.tasksPath = join(cwd || process.cwd(), TASKS_FILE);
54
55
  }
56
+ /**
57
+ * Check if .jai1 directory exists in CWD.
58
+ * If not, print a helpful message and exit.
59
+ */
60
+ static ensureJai1Dir(cwd) {
61
+ const dir = join(cwd || process.cwd(), ".jai1");
62
+ if (!existsSync(dir)) {
63
+ console.error(chalk.red("\u274C Th\u01B0 m\u1EE5c .jai1 kh\xF4ng t\u1ED3n t\u1EA1i trong project n\xE0y."));
64
+ console.error("");
65
+ console.error(chalk.dim(" B\u1EA1n c\u1EA7n kh\u1EDFi t\u1EA1o Jai1 framework tr\u01B0\u1EDBc khi s\u1EED d\u1EE5ng task management."));
66
+ console.error("");
67
+ console.error(` ${chalk.bold("H\u01B0\u1EDBng d\u1EABn:")}`);
68
+ console.error(` ${chalk.cyan("jai1 doctor")} Ki\u1EC3m tra tr\u1EA1ng th\xE1i c\xE0i \u0111\u1EB7t`);
69
+ console.error(` ${chalk.cyan("jai1 guide")} H\u01B0\u1EDBng d\u1EABn s\u1EED d\u1EE5ng \u0111\u1EA7y \u0111\u1EE7`);
70
+ console.error("");
71
+ process.exit(1);
72
+ }
73
+ }
55
74
  // ============================================
56
75
  // READ
57
76
  // ============================================
@@ -353,31 +372,31 @@ async function handleTaskSummary(options) {
353
372
  return;
354
373
  }
355
374
  console.log(
356
- boxen(chalk.cyan.bold("\u{1F4CA} Task Summary"), {
375
+ boxen(chalk2.cyan.bold("\u{1F4CA} Task Summary"), {
357
376
  padding: { left: 1, right: 1, top: 0, bottom: 0 },
358
377
  borderStyle: "round",
359
378
  borderColor: "cyan"
360
379
  })
361
380
  );
362
381
  console.log();
363
- console.log(` \u{1F535} In Progress: ${chalk.bold(String(stats.in_progress))}`);
364
- console.log(` \u{1F4CB} Todo: ${chalk.bold(String(stats.todo))}`);
365
- console.log(` \u{1F534} Blocked: ${chalk.bold(String(stats.blocked))}`);
366
- console.log(` \u2705 Done: ${chalk.bold(String(stats.done))}`);
367
- console.log(` \u26AB Cancelled: ${chalk.bold(String(stats.cancelled))}`);
368
- console.log(chalk.dim(` \u2500\u2500 Total: ${stats.total}`));
382
+ console.log(` \u{1F535} In Progress: ${chalk2.bold(String(stats.in_progress))}`);
383
+ console.log(` \u{1F4CB} Todo: ${chalk2.bold(String(stats.todo))}`);
384
+ console.log(` \u{1F534} Blocked: ${chalk2.bold(String(stats.blocked))}`);
385
+ console.log(` \u2705 Done: ${chalk2.bold(String(stats.done))}`);
386
+ console.log(` \u26AB Cancelled: ${chalk2.bold(String(stats.cancelled))}`);
387
+ console.log(chalk2.dim(` \u2500\u2500 Total: ${stats.total}`));
369
388
  const inProgress = tasks.filter((t) => t.status === "in_progress");
370
389
  if (inProgress.length > 0) {
371
- console.log(chalk.bold("\n \u{1F535} Currently working:"));
390
+ console.log(chalk2.bold("\n \u{1F535} Currently working:"));
372
391
  for (const t of inProgress) {
373
- let line = ` ${chalk.dim(t.id)} ${t.title}`;
374
- if (t.assigned_to) line += chalk.cyan(` @${t.assigned_to}`);
392
+ let line = ` ${chalk2.dim(t.id)} ${t.title}`;
393
+ if (t.assigned_to) line += chalk2.cyan(` @${t.assigned_to}`);
375
394
  console.log(line);
376
395
  }
377
396
  }
378
397
  const ready = await service.getReady();
379
398
  if (ready.length > 0) {
380
- console.log(chalk.dim(`
399
+ console.log(chalk2.dim(`
381
400
  \u{1F4A1} ${ready.length} tasks ready to pick: jai1 t pick`));
382
401
  }
383
402
  console.log();
@@ -397,4 +416,4 @@ export {
397
416
  handleTaskSummary,
398
417
  createTaskSummaryCommand
399
418
  };
400
- //# sourceMappingURL=chunk-6XCY6MPX.js.map
419
+ //# sourceMappingURL=chunk-R7RCXGAD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/tasks/summary.ts","../src/services/task.service.ts","../src/types/task.types.ts"],"sourcesContent":["/**\n * jai1 tasks summary [-j]\n */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { TaskService } from '../../services/task.service.js';\nimport type { TaskSummaryOptions } from '../../types/task.types.js';\n\nexport async function handleTaskSummary(options: TaskSummaryOptions): Promise<void> {\n const service = new TaskService();\n const stats = await service.getStats();\n const tasks = await service.readAll();\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n console.log(\n boxen(chalk.cyan.bold('📊 Task Summary'), {\n padding: { left: 1, right: 1, top: 0, bottom: 0 },\n borderStyle: 'round',\n borderColor: 'cyan',\n })\n );\n\n console.log();\n console.log(` 🔵 In Progress: ${chalk.bold(String(stats.in_progress))}`);\n console.log(` 📋 Todo: ${chalk.bold(String(stats.todo))}`);\n console.log(` 🔴 Blocked: ${chalk.bold(String(stats.blocked))}`);\n console.log(` ✅ Done: ${chalk.bold(String(stats.done))}`);\n console.log(` ⚫ Cancelled: ${chalk.bold(String(stats.cancelled))}`);\n console.log(chalk.dim(` ── Total: ${stats.total}`));\n\n // Show in-progress tasks\n const inProgress = tasks.filter((t) => t.status === 'in_progress');\n if (inProgress.length > 0) {\n console.log(chalk.bold('\\n 🔵 Currently working:'));\n for (const t of inProgress) {\n let line = ` ${chalk.dim(t.id)} ${t.title}`;\n if (t.assigned_to) line += chalk.cyan(` @${t.assigned_to}`);\n console.log(line);\n }\n }\n\n // Show ready count\n const ready = await service.getReady();\n if (ready.length > 0) {\n console.log(chalk.dim(`\\n 💡 ${ready.length} tasks ready to pick: jai1 t pick`));\n }\n\n console.log();\n}\n\nexport function createTaskSummaryCommand(): Command {\n return new Command('summary')\n .description('Show task dashboard')\n .option('-j, --json', 'Output JSON')\n .action(async (options: TaskSummaryOptions) => {\n await handleTaskSummary(options);\n });\n}\n","/**\n * Task Service\n * CRUD operations on .jai1/tasks.jsonl\n */\nimport { promises as fs, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { TaskSchema, type Task, type TaskStatusType } from '../types/task.types.js';\n\nconst TASKS_FILE = '.jai1/tasks.jsonl';\n\nexport class TaskService {\n private readonly tasksPath: string;\n\n constructor(cwd?: string) {\n this.tasksPath = join(cwd || process.cwd(), TASKS_FILE);\n }\n\n /**\n * Check if .jai1 directory exists in CWD.\n * If not, print a helpful message and exit.\n */\n static ensureJai1Dir(cwd?: string): void {\n const dir = join(cwd || process.cwd(), '.jai1');\n if (!existsSync(dir)) {\n console.error(chalk.red('❌ Thư mục .jai1 không tồn tại trong project này.'));\n console.error('');\n console.error(chalk.dim(' Bạn cần khởi tạo Jai1 framework trước khi sử dụng task management.'));\n console.error('');\n console.error(` ${chalk.bold('Hướng dẫn:')}`);\n console.error(` ${chalk.cyan('jai1 doctor')} Kiểm tra trạng thái cài đặt`);\n console.error(` ${chalk.cyan('jai1 guide')} Hướng dẫn sử dụng đầy đủ`);\n console.error('');\n process.exit(1);\n }\n }\n\n // ============================================\n // READ\n // ============================================\n\n /**\n * Read all tasks from JSONL file\n */\n async readAll(): Promise<Task[]> {\n try {\n const content = await fs.readFile(this.tasksPath, 'utf-8');\n const lines = content.trim().split('\\n').filter(Boolean);\n return lines.map((line) => TaskSchema.parse(JSON.parse(line)));\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && (error as { code: string }).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n }\n\n /**\n * Find task by ID\n */\n async findById(id: string): Promise<Task | null> {\n const tasks = await this.readAll();\n return tasks.find((t) => t.id === id) || null;\n }\n\n /**\n * Filter tasks by criteria\n */\n async filter(criteria: {\n status?: TaskStatusType;\n parent?: string;\n assignee?: string;\n }): Promise<Task[]> {\n const tasks = await this.readAll();\n return tasks.filter((t) => {\n if (criteria.status && t.status !== criteria.status) return false;\n if (criteria.parent && t.parent !== criteria.parent) return false;\n if (criteria.assignee && t.assigned_to !== criteria.assignee) return false;\n return true;\n });\n }\n\n /**\n * Get tasks that are ready to pick:\n * status=todo, all depends_on done, assigned_to empty\n */\n async getReady(parent?: string): Promise<Task[]> {\n const tasks = await this.readAll();\n const doneIds = new Set(\n tasks.filter((t) => t.status === 'done').map((t) => t.id)\n );\n\n return tasks\n .filter((t) => {\n if (t.status !== 'todo') return false;\n if (t.assigned_to) return false;\n if (parent && t.parent !== parent) return false;\n // All dependencies must be done\n if (t.depends_on.length > 0 && !t.depends_on.every((depId) => doneIds.has(depId))) {\n return false;\n }\n return true;\n })\n .sort((a, b) => a.priority - b.priority || a.created.localeCompare(b.created));\n }\n\n /**\n * Check if a task is blocked (has unfinished dependencies)\n */\n async isBlocked(task: Task): Promise<{ blocked: boolean; blockedBy: string[] }> {\n if (task.depends_on.length === 0) {\n return { blocked: false, blockedBy: [] };\n }\n const tasks = await this.readAll();\n const doneIds = new Set(\n tasks.filter((t) => t.status === 'done').map((t) => t.id)\n );\n const blockedBy = task.depends_on.filter((id) => !doneIds.has(id));\n return { blocked: blockedBy.length > 0, blockedBy };\n }\n\n /**\n * Get stats by status\n */\n async getStats(): Promise<{\n total: number;\n todo: number;\n in_progress: number;\n done: number;\n cancelled: number;\n blocked: number;\n }> {\n const tasks = await this.readAll();\n const doneIds = new Set(\n tasks.filter((t) => t.status === 'done').map((t) => t.id)\n );\n\n let blocked = 0;\n for (const t of tasks) {\n if (\n t.status === 'todo' &&\n t.depends_on.length > 0 &&\n !t.depends_on.every((id) => doneIds.has(id))\n ) {\n blocked++;\n }\n }\n\n return {\n total: tasks.length,\n todo: tasks.filter((t) => t.status === 'todo').length,\n in_progress: tasks.filter((t) => t.status === 'in_progress').length,\n done: tasks.filter((t) => t.status === 'done').length,\n cancelled: tasks.filter((t) => t.status === 'cancelled').length,\n blocked,\n };\n }\n\n // ============================================\n // WRITE\n // ============================================\n\n /**\n * Generate next task ID\n */\n async nextId(): Promise<string> {\n const tasks = await this.readAll();\n if (tasks.length === 0) return 'T-001';\n\n const maxNum = Math.max(\n ...tasks.map((t) => parseInt(t.id.replace('T-', ''), 10))\n );\n return `T-${String(maxNum + 1).padStart(3, '0')}`;\n }\n\n /**\n * Add a new task\n */\n async add(data: {\n title: string;\n parent?: string;\n priority?: number;\n tags?: string[];\n }): Promise<Task> {\n const id = await this.nextId();\n const now = new Date().toISOString().split('T')[0]!;\n\n const task = TaskSchema.parse({\n id,\n parent: data.parent || '',\n title: data.title,\n status: 'todo',\n assigned_to: '',\n claimed_at: '',\n priority: data.priority ?? 2,\n depends_on: [],\n created: now,\n updated: now,\n tags: data.tags || [],\n branch: '',\n notes: '',\n });\n\n await this.appendTask(task);\n return task;\n }\n\n /**\n * Update a task by ID\n */\n async update(\n id: string,\n changes: Partial<Pick<Task, 'status' | 'assigned_to' | 'claimed_at' | 'notes' | 'branch'>>\n ): Promise<Task> {\n const tasks = await this.readAll();\n const index = tasks.findIndex((t) => t.id === id);\n\n if (index === -1) {\n throw new Error(`Task ${id} not found`);\n }\n\n const now = new Date().toISOString().split('T')[0]!;\n const existing = tasks[index]!;\n tasks[index] = { ...existing, ...changes, updated: now };\n\n await this.writeAll(tasks);\n return tasks[index]!;\n }\n\n /**\n * Add dependency: child depends on parent\n */\n async addDependency(childId: string, parentId: string): Promise<Task> {\n const tasks = await this.readAll();\n const child = tasks.find((t) => t.id === childId);\n const parent = tasks.find((t) => t.id === parentId);\n\n if (!child) throw new Error(`Task ${childId} not found`);\n if (!parent) throw new Error(`Task ${parentId} not found`);\n\n if (child.depends_on.includes(parentId)) {\n throw new Error(`${childId} already depends on ${parentId}`);\n }\n\n // Circular dependency check\n if (await this.wouldCreateCycle(childId, parentId)) {\n throw new Error(`Adding dependency would create a cycle: ${parentId} → ... → ${childId}`);\n }\n\n child.depends_on.push(parentId);\n child.updated = new Date().toISOString().split('T')[0]!;\n\n await this.writeAll(tasks);\n return child;\n }\n\n /**\n * Mark task as done\n */\n async markDone(id: string): Promise<Task> {\n return this.update(id, { status: 'done' });\n }\n\n /**\n * Pick next task: claim for current user\n */\n async pick(taskId: string): Promise<Task> {\n const username = this.getCurrentUser();\n const now = new Date().toISOString();\n\n return this.update(taskId, {\n status: 'in_progress',\n assigned_to: username,\n claimed_at: now,\n });\n }\n\n // ============================================\n // GIT SYNC\n // ============================================\n\n /**\n * Commit and push only the tasks file\n */\n async syncPush(): Promise<void> {\n const cwd = process.cwd();\n execSync(`git add ${TASKS_FILE}`, { cwd, stdio: 'pipe' });\n\n try {\n execSync('git diff --cached --quiet', { cwd, stdio: 'pipe' });\n // No changes staged\n return;\n } catch {\n // Changes exist, commit\n }\n\n execSync(`git commit -m \"chore(tasks): sync task status\"`, {\n cwd,\n stdio: 'pipe',\n });\n execSync('git push', { cwd, stdio: 'pipe' });\n }\n\n /**\n * Pull tasks from main branch and merge\n */\n async syncPull(): Promise<{ merged: number; conflicts: number }> {\n const cwd = process.cwd();\n let merged = 0;\n let conflicts = 0;\n\n try {\n // Fetch latest\n execSync('git fetch origin main', { cwd, stdio: 'pipe' });\n\n // Read main's tasks\n let mainContent: string;\n try {\n mainContent = execSync(`git show origin/main:${TASKS_FILE}`, {\n cwd,\n encoding: 'utf-8',\n });\n } catch {\n // File doesn't exist on main\n return { merged: 0, conflicts: 0 };\n }\n\n const mainTasksRaw = mainContent\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map((line: string) => TaskSchema.parse(JSON.parse(line)));\n\n const localTasks = await this.readAll();\n const localMap = new Map(localTasks.map((t) => [t.id, t]));\n\n for (const mainTask of mainTasksRaw) {\n const local = localMap.get(mainTask.id);\n if (!local) {\n // New task from main → add\n localTasks.push(mainTask);\n merged++;\n } else if (mainTask.updated > local.updated) {\n // Main is newer → replace\n const idx = localTasks.findIndex((t) => t.id === mainTask.id);\n localTasks[idx] = mainTask;\n merged++;\n }\n // If local is newer or same → keep local\n }\n\n await this.writeAll(localTasks);\n return { merged, conflicts };\n } catch (error) {\n throw new Error(\n `Sync pull failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // ============================================\n // INTERNAL HELPERS\n // ============================================\n\n private async appendTask(task: Task): Promise<void> {\n const dir = this.tasksPath.replace(/\\/[^/]+$/, '');\n await fs.mkdir(dir, { recursive: true });\n\n const line = JSON.stringify(task) + '\\n';\n await fs.appendFile(this.tasksPath, line, 'utf-8');\n }\n\n private async writeAll(tasks: Task[]): Promise<void> {\n const dir = this.tasksPath.replace(/\\/[^/]+$/, '');\n await fs.mkdir(dir, { recursive: true });\n\n const content = tasks.map((t) => JSON.stringify(t)).join('\\n') + '\\n';\n await fs.writeFile(this.tasksPath, content, 'utf-8');\n }\n\n private getCurrentUser(): string {\n try {\n return execSync('git config user.name', { encoding: 'utf-8' }).trim();\n } catch {\n return 'unknown';\n }\n }\n\n private async wouldCreateCycle(childId: string, newDepId: string): Promise<boolean> {\n const tasks = await this.readAll();\n const taskMap = new Map(tasks.map((t) => [t.id, t]));\n\n // BFS from newDepId's dependencies to see if we reach childId\n const visited = new Set<string>();\n const queue = [newDepId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (current === childId) return true;\n if (visited.has(current)) continue;\n visited.add(current);\n\n const task = taskMap.get(current);\n if (task) {\n queue.push(...task.depends_on);\n }\n }\n return false;\n }\n\n /**\n * Get tasks file path\n */\n getTasksPath(): string {\n return this.tasksPath;\n }\n}\n","/**\n * Task Management Types\n * Schema for .jai1/tasks.jsonl\n */\nimport { z } from 'zod';\n\n// ============================================\n// ENUMS\n// ============================================\n\nexport const TaskStatus = {\n TODO: 'todo',\n IN_PROGRESS: 'in_progress',\n DONE: 'done',\n CANCELLED: 'cancelled',\n} as const;\n\nexport type TaskStatusType = (typeof TaskStatus)[keyof typeof TaskStatus];\n\nexport const TaskPriority = {\n CRITICAL: 0,\n HIGH: 1,\n MEDIUM: 2,\n LOW: 3,\n} as const;\n\nexport type TaskPriorityType = (typeof TaskPriority)[keyof typeof TaskPriority];\n\n// ============================================\n// ZOD SCHEMAS\n// ============================================\n\nexport const TaskSchema = z.object({\n id: z.string().regex(/^T-\\d+$/),\n parent: z.string().default(''),\n title: z.string().min(1).max(500),\n status: z.enum(['todo', 'in_progress', 'done', 'cancelled']),\n assigned_to: z.string().default(''),\n claimed_at: z.string().default(''),\n priority: z.number().int().min(0).max(3).default(2),\n depends_on: z.array(z.string()).default([]),\n created: z.string(),\n updated: z.string(),\n tags: z.array(z.string()).default([]),\n branch: z.string().default(''),\n notes: z.string().default(''),\n});\n\nexport type Task = z.infer<typeof TaskSchema>;\n\n// ============================================\n// DISPLAY HELPERS\n// ============================================\n\nexport const STATUS_ICONS: Record<TaskStatusType, string> = {\n todo: '📋',\n in_progress: '🔵',\n done: '✅',\n cancelled: '⚫',\n};\n\nexport const BLOCKED_ICON = '🔴';\n\nexport const PRIORITY_ICONS: Record<number, string> = {\n 0: '🔥',\n 1: '🔴',\n 2: '🟡',\n 3: '🟢',\n};\n\nexport const PRIORITY_LABELS: Record<number, string> = {\n 0: 'Critical',\n 1: 'High',\n 2: 'Medium',\n 3: 'Low',\n};\n\n// ============================================\n// COMMAND OPTION TYPES\n// ============================================\n\nexport interface TaskListOptions {\n status?: TaskStatusType;\n parent?: string;\n json?: boolean;\n}\n\nexport interface TaskAddOptions {\n priority?: number;\n parent?: string;\n tags?: string;\n json?: boolean;\n}\n\nexport interface TaskUpdateOptions {\n status: TaskStatusType;\n json?: boolean;\n}\n\nexport interface TaskShowOptions {\n json?: boolean;\n}\n\nexport interface TaskPickOptions {\n json?: boolean;\n}\n\nexport interface TaskDoneOptions {\n json?: boolean;\n}\n\nexport interface TaskDepOptions {\n json?: boolean;\n}\n\nexport interface TaskReadyOptions {\n parent?: string;\n json?: boolean;\n}\n\nexport interface TaskSyncOptions {\n pull?: boolean;\n push?: boolean;\n}\n\nexport interface TaskSummaryOptions {\n json?: boolean;\n}\n"],"mappings":";AAGA,SAAS,eAAe;AACxB,OAAOA,YAAW;AAClB,OAAO,WAAW;;;ACDlB,SAAS,YAAY,IAAI,kBAAkB;AAC3C,SAAS,YAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAO,WAAW;;;ACHlB,SAAS,SAAS;AA4BX,IAAM,aAAa,EAAE,OAAO;AAAA,EAC/B,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS;AAAA,EAC9B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,eAAe,QAAQ,WAAW,CAAC;AAAA,EAC3D,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAClC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACjC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAClD,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC1C,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;AAChC,CAAC;AAQM,IAAM,eAA+C;AAAA,EACxD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AACf;AAEO,IAAM,eAAe;AAErB,IAAM,iBAAyC;AAAA,EAClD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACP;AAEO,IAAM,kBAA0C;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACP;;;ADjEA,IAAM,aAAa;AAEZ,IAAM,cAAN,MAAkB;AAAA,EACJ;AAAA,EAEjB,YAAY,KAAc;AACtB,SAAK,YAAY,KAAK,OAAO,QAAQ,IAAI,GAAG,UAAU;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cAAc,KAAoB;AACrC,UAAM,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG,OAAO;AAC9C,QAAI,CAAC,WAAW,GAAG,GAAG;AAClB,cAAQ,MAAM,MAAM,IAAI,iFAAkD,CAAC;AAC3E,cAAQ,MAAM,EAAE;AAChB,cAAQ,MAAM,MAAM,IAAI,8GAAsE,CAAC;AAC/F,cAAQ,MAAM,EAAE;AAChB,cAAQ,MAAM,KAAK,MAAM,KAAK,2BAAY,CAAC,EAAE;AAC7C,cAAQ,MAAM,OAAO,MAAM,KAAK,aAAa,CAAC,2DAAiC;AAC/E,cAAQ,MAAM,OAAO,MAAM,KAAK,YAAY,CAAC,4EAA+B;AAC5E,cAAQ,MAAM,EAAE;AAChB,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAA2B;AAC7B,QAAI;AACA,YAAM,UAAU,MAAM,GAAG,SAAS,KAAK,WAAW,OAAO;AACzD,YAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACvD,aAAO,MAAM,IAAI,CAAC,SAAS,WAAW,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,IACjE,SAAS,OAAgB;AACrB,UAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAU,MAA2B,SAAS,UAAU;AACxG,eAAO,CAAC;AAAA,MACZ;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAkC;AAC7C,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,WAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,UAIO;AAChB,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,WAAO,MAAM,OAAO,CAAC,MAAM;AACvB,UAAI,SAAS,UAAU,EAAE,WAAW,SAAS,OAAQ,QAAO;AAC5D,UAAI,SAAS,UAAU,EAAE,WAAW,SAAS,OAAQ,QAAO;AAC5D,UAAI,SAAS,YAAY,EAAE,gBAAgB,SAAS,SAAU,QAAO;AACrE,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,QAAkC;AAC7C,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,UAAM,UAAU,IAAI;AAAA,MAChB,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC5D;AAEA,WAAO,MACF,OAAO,CAAC,MAAM;AACX,UAAI,EAAE,WAAW,OAAQ,QAAO;AAChC,UAAI,EAAE,YAAa,QAAO;AAC1B,UAAI,UAAU,EAAE,WAAW,OAAQ,QAAO;AAE1C,UAAI,EAAE,WAAW,SAAS,KAAK,CAAC,EAAE,WAAW,MAAM,CAAC,UAAU,QAAQ,IAAI,KAAK,CAAC,GAAG;AAC/E,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAgE;AAC5E,QAAI,KAAK,WAAW,WAAW,GAAG;AAC9B,aAAO,EAAE,SAAS,OAAO,WAAW,CAAC,EAAE;AAAA,IAC3C;AACA,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,UAAM,UAAU,IAAI;AAAA,MAChB,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC5D;AACA,UAAM,YAAY,KAAK,WAAW,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AACjE,WAAO,EAAE,SAAS,UAAU,SAAS,GAAG,UAAU;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAOH;AACC,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,UAAM,UAAU,IAAI;AAAA,MAChB,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC5D;AAEA,QAAI,UAAU;AACd,eAAW,KAAK,OAAO;AACnB,UACI,EAAE,WAAW,UACb,EAAE,WAAW,SAAS,KACtB,CAAC,EAAE,WAAW,MAAM,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC,GAC7C;AACE;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,OAAO,MAAM;AAAA,MACb,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,MAC/C,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE;AAAA,MAC7D,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,MAC/C,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAAA,MACzD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAA0B;AAC5B,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,UAAM,SAAS,KAAK;AAAA,MAChB,GAAG,MAAM,IAAI,CAAC,MAAM,SAAS,EAAE,GAAG,QAAQ,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,IAC5D;AACA,WAAO,KAAK,OAAO,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAKQ;AACd,UAAM,KAAK,MAAM,KAAK,OAAO;AAC7B,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAEjD,UAAM,OAAO,WAAW,MAAM;AAAA,MAC1B;AAAA,MACA,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU,KAAK,YAAY;AAAA,MAC3B,YAAY,CAAC;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM,KAAK,QAAQ,CAAC;AAAA,MACpB,QAAQ;AAAA,MACR,OAAO;AAAA,IACX,CAAC;AAED,UAAM,KAAK,WAAW,IAAI;AAC1B,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACF,IACA,SACa;AACb,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,UAAM,QAAQ,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAEhD,QAAI,UAAU,IAAI;AACd,YAAM,IAAI,MAAM,QAAQ,EAAE,YAAY;AAAA,IAC1C;AAEA,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACjD,UAAM,WAAW,MAAM,KAAK;AAC5B,UAAM,KAAK,IAAI,EAAE,GAAG,UAAU,GAAG,SAAS,SAAS,IAAI;AAEvD,UAAM,KAAK,SAAS,KAAK;AACzB,WAAO,MAAM,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAiB,UAAiC;AAClE,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,UAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAChD,UAAM,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAElD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,QAAQ,OAAO,YAAY;AACvD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,QAAQ,QAAQ,YAAY;AAEzD,QAAI,MAAM,WAAW,SAAS,QAAQ,GAAG;AACrC,YAAM,IAAI,MAAM,GAAG,OAAO,uBAAuB,QAAQ,EAAE;AAAA,IAC/D;AAGA,QAAI,MAAM,KAAK,iBAAiB,SAAS,QAAQ,GAAG;AAChD,YAAM,IAAI,MAAM,2CAA2C,QAAQ,sBAAY,OAAO,EAAE;AAAA,IAC5F;AAEA,UAAM,WAAW,KAAK,QAAQ;AAC9B,UAAM,WAAU,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAErD,UAAM,KAAK,SAAS,KAAK;AACzB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAA2B;AACtC,WAAO,KAAK,OAAO,IAAI,EAAE,QAAQ,OAAO,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAA+B;AACtC,UAAM,WAAW,KAAK,eAAe;AACrC,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,WAAO,KAAK,OAAO,QAAQ;AAAA,MACvB,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,YAAY;AAAA,IAChB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAA0B;AAC5B,UAAM,MAAM,QAAQ,IAAI;AACxB,aAAS,WAAW,UAAU,IAAI,EAAE,KAAK,OAAO,OAAO,CAAC;AAExD,QAAI;AACA,eAAS,6BAA6B,EAAE,KAAK,OAAO,OAAO,CAAC;AAE5D;AAAA,IACJ,QAAQ;AAAA,IAER;AAEA,aAAS,kDAAkD;AAAA,MACvD;AAAA,MACA,OAAO;AAAA,IACX,CAAC;AACD,aAAS,YAAY,EAAE,KAAK,OAAO,OAAO,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA2D;AAC7D,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,SAAS;AACb,QAAI,YAAY;AAEhB,QAAI;AAEA,eAAS,yBAAyB,EAAE,KAAK,OAAO,OAAO,CAAC;AAGxD,UAAI;AACJ,UAAI;AACA,sBAAc,SAAS,wBAAwB,UAAU,IAAI;AAAA,UACzD;AAAA,UACA,UAAU;AAAA,QACd,CAAC;AAAA,MACL,QAAQ;AAEJ,eAAO,EAAE,QAAQ,GAAG,WAAW,EAAE;AAAA,MACrC;AAEA,YAAM,eAAe,YAChB,KAAK,EACL,MAAM,IAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,SAAiB,WAAW,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;AAE7D,YAAM,aAAa,MAAM,KAAK,QAAQ;AACtC,YAAM,WAAW,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEzD,iBAAW,YAAY,cAAc;AACjC,cAAM,QAAQ,SAAS,IAAI,SAAS,EAAE;AACtC,YAAI,CAAC,OAAO;AAER,qBAAW,KAAK,QAAQ;AACxB;AAAA,QACJ,WAAW,SAAS,UAAU,MAAM,SAAS;AAEzC,gBAAM,MAAM,WAAW,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE;AAC5D,qBAAW,GAAG,IAAI;AAClB;AAAA,QACJ;AAAA,MAEJ;AAEA,YAAM,KAAK,SAAS,UAAU;AAC9B,aAAO,EAAE,QAAQ,UAAU;AAAA,IAC/B,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC/E;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAW,MAA2B;AAChD,UAAM,MAAM,KAAK,UAAU,QAAQ,YAAY,EAAE;AACjD,UAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEvC,UAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AACpC,UAAM,GAAG,WAAW,KAAK,WAAW,MAAM,OAAO;AAAA,EACrD;AAAA,EAEA,MAAc,SAAS,OAA8B;AACjD,UAAM,MAAM,KAAK,UAAU,QAAQ,YAAY,EAAE;AACjD,UAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEvC,UAAM,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AACjE,UAAM,GAAG,UAAU,KAAK,WAAW,SAAS,OAAO;AAAA,EACvD;AAAA,EAEQ,iBAAyB;AAC7B,QAAI;AACA,aAAO,SAAS,wBAAwB,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,IACxE,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAc,iBAAiB,SAAiB,UAAoC;AAChF,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,UAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAGnD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,QAAQ,CAAC,QAAQ;AAEvB,WAAO,MAAM,SAAS,GAAG;AACrB,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,YAAY,QAAS,QAAO;AAChC,UAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,cAAQ,IAAI,OAAO;AAEnB,YAAM,OAAO,QAAQ,IAAI,OAAO;AAChC,UAAI,MAAM;AACN,cAAM,KAAK,GAAG,KAAK,UAAU;AAAA,MACjC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACnB,WAAO,KAAK;AAAA,EAChB;AACJ;;;ADxZA,eAAsB,kBAAkB,SAA4C;AAChF,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,QAAM,QAAQ,MAAM,QAAQ,QAAQ;AAEpC,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,EACJ;AAEA,UAAQ;AAAA,IACJ,MAAMC,OAAM,KAAK,KAAK,wBAAiB,GAAG;AAAA,MACtC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,EAAE;AAAA,MAChD,aAAa;AAAA,MACb,aAAa;AAAA,IACjB,CAAC;AAAA,EACL;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,4BAAqBA,OAAM,KAAK,OAAO,MAAM,WAAW,CAAC,CAAC,EAAE;AACxE,UAAQ,IAAI,4BAAqBA,OAAM,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC,EAAE;AACjE,UAAQ,IAAI,4BAAqBA,OAAM,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,EAAE;AACpE,UAAQ,IAAI,yBAAoBA,OAAM,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC,EAAE;AAChE,UAAQ,IAAI,yBAAoBA,OAAM,KAAK,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AACrE,UAAQ,IAAIA,OAAM,IAAI,+BAAqB,MAAM,KAAK,EAAE,CAAC;AAGzD,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa;AACjE,MAAI,WAAW,SAAS,GAAG;AACvB,YAAQ,IAAIA,OAAM,KAAK,kCAA2B,CAAC;AACnD,eAAW,KAAK,YAAY;AACxB,UAAI,OAAO,QAAQA,OAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK;AAC7C,UAAI,EAAE,YAAa,SAAQA,OAAM,KAAK,KAAK,EAAE,WAAW,EAAE;AAC1D,cAAQ,IAAI,IAAI;AAAA,IACpB;AAAA,EACJ;AAGA,QAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,MAAI,MAAM,SAAS,GAAG;AAClB,YAAQ,IAAIA,OAAM,IAAI;AAAA,cAAU,MAAM,MAAM,mCAAmC,CAAC;AAAA,EACpF;AAEA,UAAQ,IAAI;AAChB;AAEO,SAAS,2BAAoC;AAChD,SAAO,IAAI,QAAQ,SAAS,EACvB,YAAY,qBAAqB,EACjC,OAAO,cAAc,aAAa,EAClC,OAAO,OAAO,YAAgC;AAC3C,UAAM,kBAAkB,OAAO;AAAA,EACnC,CAAC;AACT;","names":["chalk","chalk"]}