@mattheworiordan/remi 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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/cli/commands/add.d.ts +7 -0
  4. package/dist/cli/commands/add.js +36 -0
  5. package/dist/cli/commands/add.js.map +1 -0
  6. package/dist/cli/commands/authorize.d.ts +1 -0
  7. package/dist/cli/commands/authorize.js +75 -0
  8. package/dist/cli/commands/authorize.js.map +1 -0
  9. package/dist/cli/commands/complete.d.ts +3 -0
  10. package/dist/cli/commands/complete.js +9 -0
  11. package/dist/cli/commands/complete.js.map +1 -0
  12. package/dist/cli/commands/create-list.d.ts +1 -0
  13. package/dist/cli/commands/create-list.js +7 -0
  14. package/dist/cli/commands/create-list.js.map +1 -0
  15. package/dist/cli/commands/create-section.d.ts +1 -0
  16. package/dist/cli/commands/create-section.js +7 -0
  17. package/dist/cli/commands/create-section.js.map +1 -0
  18. package/dist/cli/commands/delete-list.d.ts +3 -0
  19. package/dist/cli/commands/delete-list.js +11 -0
  20. package/dist/cli/commands/delete-list.js.map +1 -0
  21. package/dist/cli/commands/delete-section.d.ts +1 -0
  22. package/dist/cli/commands/delete-section.js +7 -0
  23. package/dist/cli/commands/delete-section.js.map +1 -0
  24. package/dist/cli/commands/delete.d.ts +4 -0
  25. package/dist/cli/commands/delete.js +14 -0
  26. package/dist/cli/commands/delete.js.map +1 -0
  27. package/dist/cli/commands/doctor.d.ts +4 -0
  28. package/dist/cli/commands/doctor.js +180 -0
  29. package/dist/cli/commands/doctor.js.map +1 -0
  30. package/dist/cli/commands/list.d.ts +4 -0
  31. package/dist/cli/commands/list.js +11 -0
  32. package/dist/cli/commands/list.js.map +1 -0
  33. package/dist/cli/commands/lists.d.ts +1 -0
  34. package/dist/cli/commands/lists.js +7 -0
  35. package/dist/cli/commands/lists.js.map +1 -0
  36. package/dist/cli/commands/move.d.ts +3 -0
  37. package/dist/cli/commands/move.js +11 -0
  38. package/dist/cli/commands/move.js.map +1 -0
  39. package/dist/cli/commands/overdue.d.ts +1 -0
  40. package/dist/cli/commands/overdue.js +11 -0
  41. package/dist/cli/commands/overdue.js.map +1 -0
  42. package/dist/cli/commands/search.d.ts +1 -0
  43. package/dist/cli/commands/search.js +11 -0
  44. package/dist/cli/commands/search.js.map +1 -0
  45. package/dist/cli/commands/sections.d.ts +1 -0
  46. package/dist/cli/commands/sections.js +7 -0
  47. package/dist/cli/commands/sections.js.map +1 -0
  48. package/dist/cli/commands/today.d.ts +1 -0
  49. package/dist/cli/commands/today.js +11 -0
  50. package/dist/cli/commands/today.js.map +1 -0
  51. package/dist/cli/commands/upcoming.d.ts +3 -0
  52. package/dist/cli/commands/upcoming.js +12 -0
  53. package/dist/cli/commands/upcoming.js.map +1 -0
  54. package/dist/cli/commands/update.d.ts +7 -0
  55. package/dist/cli/commands/update.js +17 -0
  56. package/dist/cli/commands/update.js.map +1 -0
  57. package/dist/cli/index.d.ts +2 -0
  58. package/dist/cli/index.js +232 -0
  59. package/dist/cli/index.js.map +1 -0
  60. package/dist/cli/output.d.ts +26 -0
  61. package/dist/cli/output.js +234 -0
  62. package/dist/cli/output.js.map +1 -0
  63. package/dist/core/checksum.d.ts +9 -0
  64. package/dist/core/checksum.js +13 -0
  65. package/dist/core/checksum.js.map +1 -0
  66. package/dist/core/dateparse.d.ts +7 -0
  67. package/dist/core/dateparse.js +27 -0
  68. package/dist/core/dateparse.js.map +1 -0
  69. package/dist/core/errors.d.ts +26 -0
  70. package/dist/core/errors.js +34 -0
  71. package/dist/core/errors.js.map +1 -0
  72. package/dist/core/eventkit.d.ts +38 -0
  73. package/dist/core/eventkit.js +127 -0
  74. package/dist/core/eventkit.js.map +1 -0
  75. package/dist/core/lookup.d.ts +10 -0
  76. package/dist/core/lookup.js +32 -0
  77. package/dist/core/lookup.js.map +1 -0
  78. package/dist/core/membership.d.ts +30 -0
  79. package/dist/core/membership.js +92 -0
  80. package/dist/core/membership.js.map +1 -0
  81. package/dist/core/recurrence.d.ts +14 -0
  82. package/dist/core/recurrence.js +90 -0
  83. package/dist/core/recurrence.js.map +1 -0
  84. package/dist/core/reminderkit.d.ts +33 -0
  85. package/dist/core/reminderkit.js +154 -0
  86. package/dist/core/reminderkit.js.map +1 -0
  87. package/dist/core/sqlite.d.ts +65 -0
  88. package/dist/core/sqlite.js +175 -0
  89. package/dist/core/sqlite.js.map +1 -0
  90. package/dist/core/tokenmap.d.ts +29 -0
  91. package/dist/core/tokenmap.js +52 -0
  92. package/dist/core/tokenmap.js.map +1 -0
  93. package/dist/reminders-helper +0 -0
  94. package/dist/section-helper +0 -0
  95. package/dist/types.d.ts +81 -0
  96. package/dist/types.js +2 -0
  97. package/dist/types.js.map +1 -0
  98. package/package.json +63 -0
  99. package/src/swift/Info.plist +16 -0
  100. package/src/swift/build.sh +47 -0
  101. package/src/swift/reminders-helper.swift +697 -0
  102. package/src/swift/section-helper.swift +794 -0
@@ -0,0 +1,180 @@
1
+ import { execFile } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import chalk from "chalk";
7
+ import { dbFindDb, dbStats } from "../../core/reminderkit.js";
8
+ import { isJsonMode, outputSuccess } from "../output.js";
9
+ const execFileAsync = promisify(execFile);
10
+ export async function doctorCommand(opts) {
11
+ const checks = [];
12
+ // Check macOS version
13
+ try {
14
+ const { stdout } = await execFileAsync("sw_vers", ["-productVersion"]);
15
+ const version = stdout.trim();
16
+ const major = Number.parseInt(version.split(".")[0], 10);
17
+ if (major >= 13) {
18
+ checks.push({ name: "macOS version", status: "ok", message: `macOS ${version}` });
19
+ }
20
+ else {
21
+ checks.push({
22
+ name: "macOS version",
23
+ status: "fail",
24
+ message: `macOS ${version} (requires 13+)`,
25
+ });
26
+ }
27
+ }
28
+ catch {
29
+ checks.push({
30
+ name: "macOS version",
31
+ status: "fail",
32
+ message: "Could not determine macOS version",
33
+ });
34
+ }
35
+ // Check Swift
36
+ try {
37
+ const { stdout } = await execFileAsync("/usr/bin/swift", ["--version"]);
38
+ const match = stdout.match(/Swift version ([\d.]+)/);
39
+ checks.push({
40
+ name: "Swift",
41
+ status: "ok",
42
+ message: match ? `Swift ${match[1]}` : "Available",
43
+ });
44
+ }
45
+ catch {
46
+ checks.push({
47
+ name: "Swift",
48
+ status: "fail",
49
+ message: "Not found",
50
+ detail: "Install Xcode Command Line Tools: xcode-select --install",
51
+ });
52
+ }
53
+ // Check compiled Swift helpers
54
+ const { dirname: dirnameFn } = await import("node:path");
55
+ const { fileURLToPath } = await import("node:url");
56
+ const currentDir = dirnameFn(fileURLToPath(import.meta.url));
57
+ const helperDir = [join(currentDir, "../.."), join(currentDir, "../../../dist")];
58
+ const remindersHelperExists = helperDir.some((d) => existsSync(join(d, "reminders-helper")));
59
+ if (remindersHelperExists) {
60
+ checks.push({
61
+ name: "reminders-helper",
62
+ status: "ok",
63
+ message: "Compiled binary with permissions",
64
+ });
65
+ }
66
+ else {
67
+ checks.push({
68
+ name: "reminders-helper",
69
+ status: "warn",
70
+ message: "Not compiled — using interpreted Swift (permissions may be attributed to terminal)",
71
+ detail: "Run: npm run build:swift",
72
+ });
73
+ }
74
+ const sectionHelperExists = helperDir.some((d) => existsSync(join(d, "section-helper")));
75
+ if (sectionHelperExists) {
76
+ checks.push({ name: "section-helper", status: "ok", message: "Compiled binary found" });
77
+ }
78
+ else {
79
+ checks.push({
80
+ name: "section-helper",
81
+ status: "warn",
82
+ message: "Not compiled (section operations unavailable)",
83
+ detail: "Run: npm run build:swift",
84
+ });
85
+ }
86
+ // Check Reminders database (via compiled binary — uses its own permissions)
87
+ try {
88
+ const dbPath = await dbFindDb();
89
+ checks.push({ name: "Reminders database", status: "ok", message: "Found", detail: dbPath });
90
+ if (opts.db) {
91
+ const stats = await dbStats();
92
+ checks.push({
93
+ name: "Database stats",
94
+ status: "ok",
95
+ message: `${stats.lists} lists, ${stats.sections} sections, ${stats.reminders} reminders`,
96
+ detail: stats.dbPath,
97
+ });
98
+ }
99
+ }
100
+ catch (err) {
101
+ const errMsg = err instanceof Error ? err.message : "Not found";
102
+ checks.push({
103
+ name: "Reminders database",
104
+ status: "warn",
105
+ message: `Not accessible (${errMsg})`,
106
+ detail: "Run: remi authorize (section features need Full Disk Access for your terminal app)",
107
+ });
108
+ }
109
+ // Check EventKit permissions (via compiled reminders-helper, same binary used by all commands)
110
+ try {
111
+ const { listLists } = await import("../../core/eventkit.js");
112
+ const lists = await listLists();
113
+ const count = Array.isArray(lists) ? lists.length : 0;
114
+ if (count > 0) {
115
+ checks.push({
116
+ name: "Reminders access",
117
+ status: "ok",
118
+ message: `Granted (${count} lists)`,
119
+ });
120
+ }
121
+ else {
122
+ // 0 lists usually means access was denied — EventKit returns empty rather than erroring
123
+ checks.push({
124
+ name: "Reminders access",
125
+ status: "fail",
126
+ message: "Not granted (0 lists returned)",
127
+ detail: "Run: remi authorize",
128
+ });
129
+ }
130
+ }
131
+ catch (err) {
132
+ const errMsg = err instanceof Error ? err.message : "";
133
+ checks.push({
134
+ name: "Reminders access",
135
+ status: "fail",
136
+ message: errMsg.includes("denied") ? "Not granted" : `Error: ${errMsg}`,
137
+ detail: "Run: remi authorize",
138
+ });
139
+ }
140
+ // Check Reminders stores dir
141
+ const storesDir = join(homedir(), "Library/Group Containers/group.com.apple.reminders/Container_v1/Stores");
142
+ if (existsSync(storesDir)) {
143
+ checks.push({ name: "Reminders data dir", status: "ok", message: "Exists" });
144
+ }
145
+ else {
146
+ checks.push({
147
+ name: "Reminders data dir",
148
+ status: "fail",
149
+ message: "Not found",
150
+ detail: storesDir,
151
+ });
152
+ }
153
+ // Output
154
+ if (isJsonMode()) {
155
+ outputSuccess(checks);
156
+ return;
157
+ }
158
+ process.stdout.write(chalk.bold("\nremi doctor\n"));
159
+ process.stdout.write(`${"─".repeat(40)}\n`);
160
+ for (const check of checks) {
161
+ const icon = check.status === "ok"
162
+ ? chalk.green("✓")
163
+ : check.status === "warn"
164
+ ? chalk.yellow("⚠")
165
+ : chalk.red("✗");
166
+ process.stdout.write(`${icon} ${chalk.bold(check.name)}: ${check.message}\n`);
167
+ if (check.detail) {
168
+ process.stdout.write(chalk.dim(` ${check.detail}\n`));
169
+ }
170
+ }
171
+ const failures = checks.filter((c) => c.status === "fail");
172
+ if (failures.length > 0) {
173
+ process.stdout.write(chalk.red(`\n${failures.length} issue(s) found.\n`));
174
+ process.exit(1);
175
+ }
176
+ else {
177
+ process.stdout.write(chalk.green("\nAll checks passed.\n"));
178
+ }
179
+ }
180
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function listCommand(name: string, opts: {
2
+ section?: string;
3
+ includeCompleted?: boolean;
4
+ }): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { getReminders } from "../../core/eventkit.js";
2
+ import { outputReminders } from "../output.js";
3
+ export async function listCommand(name, opts) {
4
+ const filter = opts.includeCompleted ? "all" : "incomplete";
5
+ const reminders = await getReminders({ list: name, filter });
6
+ outputReminders(reminders, name, {
7
+ context: "list",
8
+ sortByDate: true,
9
+ });
10
+ }
11
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAAY,EACZ,IAAsD;IAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE;QAChC,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function listsCommand(): Promise<void>;
@@ -0,0 +1,7 @@
1
+ import { listLists } from "../../core/eventkit.js";
2
+ import { outputLists } from "../output.js";
3
+ export async function listsCommand() {
4
+ const lists = await listLists();
5
+ outputLists(lists);
6
+ }
7
+ //# sourceMappingURL=lists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../../src/cli/commands/lists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,WAAW,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function moveCommand(list: string, title: string, opts: {
2
+ toSection: string;
3
+ }): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { assignToSection } from "../../core/membership.js";
2
+ import { outputMessage } from "../output.js";
3
+ export async function moveCommand(list, title, opts) {
4
+ const { warning } = await assignToSection(list, title, opts.toSection);
5
+ let msg = `Moved "${title}" to section "${opts.toSection}" in "${list}"`;
6
+ if (warning) {
7
+ msg += ` (note: ${warning})`;
8
+ }
9
+ outputMessage(msg);
10
+ }
11
+ //# sourceMappingURL=move.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.js","sourceRoot":"","sources":["../../../src/cli/commands/move.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAAY,EACZ,KAAa,EACb,IAA2B;IAE3B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,IAAI,GAAG,GAAG,UAAU,KAAK,iBAAiB,IAAI,CAAC,SAAS,SAAS,IAAI,GAAG,CAAC;IACzE,IAAI,OAAO,EAAE,CAAC;QACb,GAAG,IAAI,WAAW,OAAO,GAAG,CAAC;IAC9B,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function overdueCommand(): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { getReminders } from "../../core/eventkit.js";
2
+ import { outputReminders } from "../output.js";
3
+ export async function overdueCommand() {
4
+ const reminders = await getReminders({ filter: "overdue" });
5
+ outputReminders(reminders, "Overdue", {
6
+ context: "overdue",
7
+ showList: true,
8
+ sortByDate: true,
9
+ });
10
+ }
11
+ //# sourceMappingURL=overdue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overdue.js","sourceRoot":"","sources":["../../../src/cli/commands/overdue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,cAAc;IACnC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5D,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE;QACrC,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function searchCommand(query: string): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { searchReminders } from "../../core/eventkit.js";
2
+ import { outputReminders } from "../output.js";
3
+ export async function searchCommand(query) {
4
+ const reminders = await searchReminders(query);
5
+ outputReminders(reminders, `Search: "${query}"`, {
6
+ context: "search",
7
+ showList: true,
8
+ sortByDate: true,
9
+ });
10
+ }
11
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAChD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,eAAe,CAAC,SAAS,EAAE,YAAY,KAAK,GAAG,EAAE;QAChD,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function sectionsCommand(list: string): Promise<void>;
@@ -0,0 +1,7 @@
1
+ import { listSections } from "../../core/reminderkit.js";
2
+ import { outputSections } from "../output.js";
3
+ export async function sectionsCommand(list) {
4
+ const sections = await listSections(list);
5
+ outputSections(sections, list);
6
+ }
7
+ //# sourceMappingURL=sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../src/cli/commands/sections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IACjD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function todayCommand(): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { getReminders } from "../../core/eventkit.js";
2
+ import { outputReminders } from "../output.js";
3
+ export async function todayCommand() {
4
+ const reminders = await getReminders({ filter: "today" });
5
+ outputReminders(reminders, "Due Today", {
6
+ context: "today",
7
+ showList: true,
8
+ sortByDate: true,
9
+ });
10
+ }
11
+ //# sourceMappingURL=today.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"today.js","sourceRoot":"","sources":["../../../src/cli/commands/today.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE;QACvC,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function upcomingCommand(opts: {
2
+ days?: string;
3
+ }): Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { getReminders } from "../../core/eventkit.js";
2
+ import { outputReminders } from "../output.js";
3
+ export async function upcomingCommand(opts) {
4
+ const days = opts.days ? Number.parseInt(opts.days, 10) : 7;
5
+ const reminders = await getReminders({ filter: "upcoming", days });
6
+ outputReminders(reminders, `Due in next ${days} days`, {
7
+ context: "upcoming",
8
+ showList: true,
9
+ sortByDate: true,
10
+ });
11
+ }
12
+ //# sourceMappingURL=upcoming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upcoming.js","sourceRoot":"","sources":["../../../src/cli/commands/upcoming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuB;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,eAAe,CAAC,SAAS,EAAE,eAAe,IAAI,OAAO,EAAE;QACtD,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function updateCommand(list: string, title: string, opts: {
2
+ title?: string;
3
+ due?: string;
4
+ clearDue?: boolean;
5
+ priority?: string;
6
+ notes?: string;
7
+ }): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import { parseDate } from "../../core/dateparse.js";
2
+ import * as eventkit from "../../core/eventkit.js";
3
+ import { findReminderByTitle } from "../../core/lookup.js";
4
+ import { outputMessage } from "../output.js";
5
+ export async function updateCommand(list, title, opts) {
6
+ const reminder = await findReminderByTitle(list, title);
7
+ await eventkit.editReminder({
8
+ id: reminder.id,
9
+ title: opts.title,
10
+ due: opts.due ? parseDate(opts.due) : undefined,
11
+ clearDue: opts.clearDue,
12
+ notes: opts.notes,
13
+ priority: opts.priority,
14
+ });
15
+ outputMessage(`Updated "${reminder.title}" in "${list}"`);
16
+ }
17
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,IAAY,EACZ,KAAa,EACb,IAA6F;IAE7F,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,QAAQ,CAAC,YAAY,CAAC;QAC3B,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACvB,CAAC,CAAC;IACH,aAAa,CAAC,YAAY,QAAQ,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,232 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { RemiCommandError } from "../core/errors.js";
4
+ import { outputError, setJsonMode, setVerboseMode } from "./output.js";
5
+ const program = new Command();
6
+ program
7
+ .name("remi")
8
+ .description("Fast, reliable CLI for Apple Reminders with section support and iCloud sync")
9
+ .version("0.1.0")
10
+ .option("--json", "Output in JSON format for machine consumption")
11
+ .option("-v, --verbose", "Show additional details (notes preview, full dates)")
12
+ .hook("preAction", (thisCommand) => {
13
+ const opts = thisCommand.opts();
14
+ if (opts.json) {
15
+ setJsonMode(true);
16
+ }
17
+ if (opts.verbose) {
18
+ setVerboseMode(true);
19
+ }
20
+ });
21
+ // -- Daily drivers: queries --
22
+ program
23
+ .command("today")
24
+ .description("Show reminders due today")
25
+ .action(async () => {
26
+ const { todayCommand } = await import("./commands/today.js");
27
+ await todayCommand();
28
+ });
29
+ program
30
+ .command("upcoming")
31
+ .description("Show upcoming reminders")
32
+ .option("--days <n>", "Number of days to look ahead", "7")
33
+ .action(async (opts) => {
34
+ const { upcomingCommand } = await import("./commands/upcoming.js");
35
+ await upcomingCommand(opts);
36
+ });
37
+ program
38
+ .command("overdue")
39
+ .description("Show overdue reminders")
40
+ .action(async () => {
41
+ const { overdueCommand } = await import("./commands/overdue.js");
42
+ await overdueCommand();
43
+ });
44
+ // -- Browse --
45
+ program
46
+ .command("list <name>")
47
+ .description("Show contents of a reminder list")
48
+ .option("--section <section>", "Filter by section")
49
+ .option("--include-completed", "Include completed reminders")
50
+ .action(async (name, opts) => {
51
+ const { listCommand } = await import("./commands/list.js");
52
+ await listCommand(name, opts);
53
+ });
54
+ program
55
+ .command("lists")
56
+ .alias("ls")
57
+ .description("List all reminder lists")
58
+ .action(async () => {
59
+ const { listsCommand } = await import("./commands/lists.js");
60
+ await listsCommand();
61
+ });
62
+ program
63
+ .command("search <query>")
64
+ .description("Search reminders across all lists")
65
+ .action(async (query) => {
66
+ const { searchCommand } = await import("./commands/search.js");
67
+ await searchCommand(query);
68
+ });
69
+ // -- Task actions --
70
+ program
71
+ .command("add <list> <title>")
72
+ .description("Add a reminder to a list")
73
+ .option("--section <section>", "Add to a specific section")
74
+ .option("--due <date>", 'Due date: YYYY-MM-DD or natural language ("tomorrow", "next friday")')
75
+ .option("--priority <level>", "Priority: none, low, medium, high", "none")
76
+ .option("--notes <text>", "Reminder notes")
77
+ .option("--repeat <rule>", 'Recurrence: "daily", "weekly", "every 2 weeks", "every 3 months"')
78
+ .action(async (list, title, opts) => {
79
+ const { addCommand } = await import("./commands/add.js");
80
+ await addCommand(list, title, opts);
81
+ });
82
+ program
83
+ .command("complete <list> <title>")
84
+ .alias("done")
85
+ .description("Mark a reminder as complete")
86
+ .option("--id <id>", "Match by reminder ID instead of title")
87
+ .action(async (list, title, opts) => {
88
+ const { completeCommand } = await import("./commands/complete.js");
89
+ await completeCommand(list, title, opts);
90
+ });
91
+ program
92
+ .command("update <list> <title>")
93
+ .description("Update a reminder")
94
+ .option("--title <newTitle>", "New title")
95
+ .option("--due <date>", "New due date: YYYY-MM-DD or natural language")
96
+ .option("--clear-due", "Remove due date")
97
+ .option("--priority <level>", "New priority: none, low, medium, high")
98
+ .option("--notes <text>", "New notes")
99
+ .action(async (list, title, opts) => {
100
+ const { updateCommand } = await import("./commands/update.js");
101
+ await updateCommand(list, title, opts);
102
+ });
103
+ program
104
+ .command("delete <list> <title>")
105
+ .alias("rm")
106
+ .description("Delete a reminder")
107
+ .option("--id <id>", "Match by reminder ID instead of title")
108
+ .option("--confirm", "Confirm deletion (required in interactive mode)")
109
+ .action(async (list, title, opts) => {
110
+ const { deleteCommand } = await import("./commands/delete.js");
111
+ await deleteCommand(list, title, opts);
112
+ });
113
+ // -- Organization: sections and lists --
114
+ program
115
+ .command("sections <list>")
116
+ .description("List sections in a reminder list")
117
+ .action(async (list) => {
118
+ const { sectionsCommand } = await import("./commands/sections.js");
119
+ await sectionsCommand(list);
120
+ });
121
+ program
122
+ .command("move <list> <title>")
123
+ .description("Move a reminder to a different section")
124
+ .requiredOption("--to-section <section>", "Target section name")
125
+ .action(async (list, title, opts) => {
126
+ const { moveCommand } = await import("./commands/move.js");
127
+ await moveCommand(list, title, opts);
128
+ });
129
+ program
130
+ .command("create-section <list> <name>")
131
+ .description("Create a section in a reminder list")
132
+ .action(async (list, name) => {
133
+ const { createSectionCommand } = await import("./commands/create-section.js");
134
+ await createSectionCommand(list, name);
135
+ });
136
+ program
137
+ .command("delete-section <list> <name>")
138
+ .description("Delete a section from a reminder list")
139
+ .action(async (list, name) => {
140
+ const { deleteSectionCommand } = await import("./commands/delete-section.js");
141
+ await deleteSectionCommand(list, name);
142
+ });
143
+ program
144
+ .command("create-list <name>")
145
+ .description("Create a new reminder list")
146
+ .action(async (name) => {
147
+ const { createListCommand } = await import("./commands/create-list.js");
148
+ await createListCommand(name);
149
+ });
150
+ program
151
+ .command("delete-list <name>")
152
+ .description("Delete a reminder list")
153
+ .option("--confirm", "Confirm deletion (required in interactive mode)")
154
+ .action(async (name, opts) => {
155
+ const { deleteListCommand } = await import("./commands/delete-list.js");
156
+ await deleteListCommand(name, opts);
157
+ });
158
+ // -- System --
159
+ program
160
+ .command("authorize")
161
+ .description("Request Reminders access permission")
162
+ .action(async () => {
163
+ const { authorizeCommand } = await import("./commands/authorize.js");
164
+ await authorizeCommand();
165
+ });
166
+ program
167
+ .command("doctor")
168
+ .description("Check system health and diagnostics")
169
+ .option("--sync", "Verify sync status")
170
+ .option("--db", "Show database location and stats")
171
+ .action(async (opts) => {
172
+ const { doctorCommand } = await import("./commands/doctor.js");
173
+ await doctorCommand(opts);
174
+ });
175
+ program
176
+ .command("completions")
177
+ .description("Generate shell completions (bash, zsh, fish)")
178
+ .argument("<shell>", "Shell type: bash, zsh, or fish")
179
+ .action(async (shell) => {
180
+ const commands = program.commands.map((c) => c.name()).filter((n) => n !== "completions");
181
+ if (shell === "zsh") {
182
+ const completions = `#compdef remi
183
+ _remi() {
184
+ local -a commands
185
+ commands=(
186
+ ${commands.map((c) => ` '${c}:${program.commands.find((cmd) => cmd.name() === c)?.description() || ""}'`).join("\n")}
187
+ )
188
+ _describe 'command' commands
189
+ }
190
+ compdef _remi remi`;
191
+ process.stdout.write(`${completions}\n`);
192
+ }
193
+ else if (shell === "bash") {
194
+ const completions = `_remi() {
195
+ local commands="${commands.join(" ")}"
196
+ COMPREPLY=($(compgen -W "$commands" -- "\${COMP_WORDS[COMP_CWORD]}"))
197
+ }
198
+ complete -F _remi remi`;
199
+ process.stdout.write(`${completions}\n`);
200
+ }
201
+ else if (shell === "fish") {
202
+ const lines = commands
203
+ .map((c) => {
204
+ const desc = program.commands.find((cmd) => cmd.name() === c)?.description() || "";
205
+ return `complete -c remi -n '__fish_use_subcommand' -a '${c}' -d '${desc}'`;
206
+ })
207
+ .join("\n");
208
+ process.stdout.write(`${lines}\n`);
209
+ }
210
+ else {
211
+ process.stderr.write(`Unknown shell: ${shell}. Use: bash, zsh, or fish\n`);
212
+ process.exit(1);
213
+ }
214
+ });
215
+ // -- Error handling --
216
+ async function main() {
217
+ try {
218
+ await program.parseAsync(process.argv);
219
+ }
220
+ catch (err) {
221
+ if (err instanceof RemiCommandError) {
222
+ outputError(err.toRemiError());
223
+ process.exit(1);
224
+ }
225
+ // Unknown error
226
+ const message = err instanceof Error ? err.message : String(err);
227
+ outputError({ code: "UNKNOWN", message });
228
+ process.exit(1);
229
+ }
230
+ }
231
+ main();
232
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACL,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,6EAA6E,CAAC;KAC1F,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,+CAA+C,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,qDAAqD,CAAC;KAC9E,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,cAAc,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACF,CAAC,CAAC,CAAC;AAEJ,+BAA+B;AAE/B,OAAO;KACL,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,YAAY,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,YAAY,EAAE,8BAA8B,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACtB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACjE,MAAM,cAAc,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEJ,eAAe;AAEf,OAAO;KACL,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;IACpC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,YAAY,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC/B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEJ,qBAAqB;AAErB,OAAO;KACL,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,sEAAsE,CAAC;KAC9F,MAAM,CAAC,oBAAoB,EAAE,mCAAmC,EAAE,MAAM,CAAC;KACzE,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,kEAAkE,CAAC;KAC7F,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,yBAAyB,CAAC;KAClC,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,oBAAoB,EAAE,WAAW,CAAC;KACzC,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;KACtE,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC;KACxC,MAAM,CAAC,oBAAoB,EAAE,uCAAuC,CAAC;KACrE,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC;KACrC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,uBAAuB,CAAC;KAChC,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC5D,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEJ,yCAAyC;AAEzC,OAAO;KACL,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC9B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,wCAAwC,CAAC;KACrD,cAAc,CAAC,wBAAwB,EAAE,qBAAqB,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,8BAA8B,CAAC;KACvC,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;IAC5C,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC9E,MAAM,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,8BAA8B,CAAC;KACvC,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;IAC5C,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC9E,MAAM,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC9B,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;IACpC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEJ,eAAe;AAEf,OAAO;KACL,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACrE,MAAM,gBAAgB,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC;KACtC,MAAM,CAAC,MAAM,EAAE,kCAAkC,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACtB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEJ,OAAO;KACL,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,SAAS,EAAE,gCAAgC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC;IAE1F,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG;;;;EAIrB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;mBAIpG,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG;oBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;;uBAGf,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACnF,OAAO,mDAAmD,CAAC,SAAS,IAAI,GAAG,CAAC;QAC7E,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,6BAA6B,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC,CAAC;AAEJ,uBAAuB;AAEvB,KAAK,UAAU,IAAI;IAClB,IAAI,CAAC;QACJ,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;YACrC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,gBAAgB;QAChB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC"}