agent-office 0.5.0 → 0.6.1

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 (189) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +259 -228
  3. package/dist/commands/cron-requests.d.ts +7 -0
  4. package/dist/commands/cron-requests.d.ts.map +1 -0
  5. package/dist/commands/cron-requests.js +31 -0
  6. package/dist/commands/cron-requests.js.map +1 -0
  7. package/dist/commands/crons.d.ts +10 -0
  8. package/dist/commands/crons.d.ts.map +1 -0
  9. package/dist/commands/crons.js +45 -0
  10. package/dist/commands/crons.js.map +1 -0
  11. package/dist/commands/hello.d.ts +5 -0
  12. package/dist/commands/hello.d.ts.map +1 -0
  13. package/dist/commands/hello.js +4 -0
  14. package/dist/commands/hello.js.map +1 -0
  15. package/dist/commands/messages.d.ts +5 -0
  16. package/dist/commands/messages.d.ts.map +1 -0
  17. package/dist/commands/messages.js +18 -0
  18. package/dist/commands/messages.js.map +1 -0
  19. package/dist/commands/sessions.d.ts +13 -0
  20. package/dist/commands/sessions.d.ts.map +1 -0
  21. package/dist/commands/sessions.js +58 -0
  22. package/dist/commands/sessions.js.map +1 -0
  23. package/dist/commands/task-columns.d.ts +2 -0
  24. package/dist/commands/task-columns.d.ts.map +1 -0
  25. package/dist/commands/task-columns.js +13 -0
  26. package/dist/commands/task-columns.js.map +1 -0
  27. package/dist/commands/tasks.d.ts +11 -0
  28. package/dist/commands/tasks.d.ts.map +1 -0
  29. package/dist/commands/tasks.js +75 -0
  30. package/dist/commands/tasks.js.map +1 -0
  31. package/dist/config.test.d.ts +2 -0
  32. package/dist/config.test.d.ts.map +1 -0
  33. package/dist/config.test.js +50 -0
  34. package/dist/config.test.js.map +1 -0
  35. package/dist/db/index.d.ts +6 -70
  36. package/dist/db/index.d.ts.map +1 -0
  37. package/dist/db/index.js +4 -11
  38. package/dist/db/index.js.map +1 -0
  39. package/dist/db/mock-storage.d.ts +79 -0
  40. package/dist/db/mock-storage.d.ts.map +1 -0
  41. package/dist/db/mock-storage.js +381 -0
  42. package/dist/db/mock-storage.js.map +1 -0
  43. package/dist/db/mock-storage.test.d.ts +2 -0
  44. package/dist/db/mock-storage.test.d.ts.map +1 -0
  45. package/dist/db/mock-storage.test.js +234 -0
  46. package/dist/db/mock-storage.test.js.map +1 -0
  47. package/dist/db/postgresql-storage.d.ts +10 -8
  48. package/dist/db/postgresql-storage.d.ts.map +1 -0
  49. package/dist/db/postgresql-storage.js +76 -42
  50. package/dist/db/postgresql-storage.js.map +1 -0
  51. package/dist/db/sqlite-storage.d.ts +9 -8
  52. package/dist/db/sqlite-storage.d.ts.map +1 -0
  53. package/dist/db/sqlite-storage.js +75 -41
  54. package/dist/db/sqlite-storage.js.map +1 -0
  55. package/dist/db/storage-base.d.ts +7 -8
  56. package/dist/db/storage-base.d.ts.map +1 -0
  57. package/dist/db/storage-base.js +3 -2
  58. package/dist/db/storage-base.js.map +1 -0
  59. package/dist/db/storage.d.ts +12 -12
  60. package/dist/db/storage.d.ts.map +1 -0
  61. package/dist/db/storage.js +1 -0
  62. package/dist/db/storage.js.map +1 -0
  63. package/dist/db/types.d.ts +67 -0
  64. package/dist/db/types.d.ts.map +1 -0
  65. package/dist/db/types.js +2 -0
  66. package/dist/db/types.js.map +1 -0
  67. package/dist/index.d.ts +2 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +397 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/index.test.d.ts +2 -0
  72. package/dist/index.test.d.ts.map +1 -0
  73. package/dist/index.test.js +49 -0
  74. package/dist/index.test.js.map +1 -0
  75. package/dist/lib/output.d.ts +2 -0
  76. package/dist/lib/output.d.ts.map +1 -0
  77. package/dist/lib/output.js +8 -0
  78. package/dist/lib/output.js.map +1 -0
  79. package/dist/services/cron-service.constraints.test.d.ts +2 -0
  80. package/dist/services/cron-service.constraints.test.d.ts.map +1 -0
  81. package/dist/services/cron-service.constraints.test.js +90 -0
  82. package/dist/services/cron-service.constraints.test.js.map +1 -0
  83. package/dist/services/cron-service.d.ts +45 -0
  84. package/dist/services/cron-service.d.ts.map +1 -0
  85. package/dist/services/cron-service.js +157 -0
  86. package/dist/services/cron-service.js.map +1 -0
  87. package/dist/services/cron-service.test.d.ts +2 -0
  88. package/dist/services/cron-service.test.d.ts.map +1 -0
  89. package/dist/services/cron-service.test.js +280 -0
  90. package/dist/services/cron-service.test.js.map +1 -0
  91. package/dist/services/index.d.ts +5 -0
  92. package/dist/services/index.d.ts.map +1 -0
  93. package/dist/services/index.js +5 -0
  94. package/dist/services/index.js.map +1 -0
  95. package/dist/services/message-service.d.ts +16 -0
  96. package/dist/services/message-service.d.ts.map +1 -0
  97. package/dist/services/message-service.js +39 -0
  98. package/dist/services/message-service.js.map +1 -0
  99. package/dist/services/message-service.test.d.ts +2 -0
  100. package/dist/services/message-service.test.d.ts.map +1 -0
  101. package/dist/services/message-service.test.js +145 -0
  102. package/dist/services/message-service.test.js.map +1 -0
  103. package/dist/services/session-service.constraints.test.d.ts +2 -0
  104. package/dist/services/session-service.constraints.test.d.ts.map +1 -0
  105. package/dist/services/session-service.constraints.test.js +34 -0
  106. package/dist/services/session-service.constraints.test.js.map +1 -0
  107. package/dist/services/session-service.d.ts +27 -0
  108. package/dist/services/session-service.d.ts.map +1 -0
  109. package/dist/services/session-service.js +55 -0
  110. package/dist/services/session-service.js.map +1 -0
  111. package/dist/services/session-service.test.d.ts +2 -0
  112. package/dist/services/session-service.test.d.ts.map +1 -0
  113. package/dist/services/session-service.test.js +87 -0
  114. package/dist/services/session-service.test.js.map +1 -0
  115. package/dist/services/task-service.d.ts +25 -0
  116. package/dist/services/task-service.d.ts.map +1 -0
  117. package/dist/services/task-service.js +87 -0
  118. package/dist/services/task-service.js.map +1 -0
  119. package/dist/services/task-service.test.d.ts +2 -0
  120. package/dist/services/task-service.test.d.ts.map +1 -0
  121. package/dist/services/task-service.test.js +180 -0
  122. package/dist/services/task-service.test.js.map +1 -0
  123. package/package.json +41 -42
  124. package/dist/cli.d.ts +0 -2
  125. package/dist/cli.js +0 -317
  126. package/dist/commands/communicator.d.ts +0 -9
  127. package/dist/commands/communicator.js +0 -2232
  128. package/dist/commands/manage.d.ts +0 -5
  129. package/dist/commands/manage.js +0 -20
  130. package/dist/commands/notifier.d.ts +0 -11
  131. package/dist/commands/notifier.js +0 -100
  132. package/dist/commands/screensaver.d.ts +0 -8
  133. package/dist/commands/screensaver.js +0 -1280
  134. package/dist/commands/serve.d.ts +0 -13
  135. package/dist/commands/serve.js +0 -95
  136. package/dist/commands/task-board.d.ts +0 -29
  137. package/dist/commands/task-board.js +0 -251
  138. package/dist/commands/worker.d.ts +0 -16
  139. package/dist/commands/worker.js +0 -145
  140. package/dist/db/migrate.d.ts +0 -2
  141. package/dist/db/migrate.js +0 -3
  142. package/dist/lib/agentic-coding-server.d.ts +0 -66
  143. package/dist/lib/agentic-coding-server.js +0 -7
  144. package/dist/lib/notifier.d.ts +0 -18
  145. package/dist/lib/notifier.js +0 -15
  146. package/dist/lib/opencode-coding-server.d.ts +0 -11
  147. package/dist/lib/opencode-coding-server.js +0 -66
  148. package/dist/lib/pi-coding-server.d.ts +0 -20
  149. package/dist/lib/pi-coding-server.js +0 -162
  150. package/dist/manage/app.d.ts +0 -6
  151. package/dist/manage/app.js +0 -128
  152. package/dist/manage/components/AgentCode.d.ts +0 -8
  153. package/dist/manage/components/AgentCode.js +0 -73
  154. package/dist/manage/components/CreateSession.d.ts +0 -8
  155. package/dist/manage/components/CreateSession.js +0 -37
  156. package/dist/manage/components/CronList.d.ts +0 -9
  157. package/dist/manage/components/CronList.js +0 -321
  158. package/dist/manage/components/CronRequests.d.ts +0 -8
  159. package/dist/manage/components/CronRequests.js +0 -181
  160. package/dist/manage/components/DeleteSession.d.ts +0 -7
  161. package/dist/manage/components/DeleteSession.js +0 -55
  162. package/dist/manage/components/InjectText.d.ts +0 -8
  163. package/dist/manage/components/InjectText.js +0 -51
  164. package/dist/manage/components/ItemSelector.d.ts +0 -7
  165. package/dist/manage/components/ItemSelector.js +0 -20
  166. package/dist/manage/components/MenuSelect.d.ts +0 -13
  167. package/dist/manage/components/MenuSelect.js +0 -22
  168. package/dist/manage/components/MyMail.d.ts +0 -9
  169. package/dist/manage/components/MyMail.js +0 -143
  170. package/dist/manage/components/Profile.d.ts +0 -8
  171. package/dist/manage/components/Profile.js +0 -60
  172. package/dist/manage/components/ReadMail.d.ts +0 -8
  173. package/dist/manage/components/ReadMail.js +0 -110
  174. package/dist/manage/components/SendMessage.d.ts +0 -9
  175. package/dist/manage/components/SendMessage.js +0 -79
  176. package/dist/manage/components/SessionList.d.ts +0 -9
  177. package/dist/manage/components/SessionList.js +0 -608
  178. package/dist/manage/components/SessionSidebar.d.ts +0 -6
  179. package/dist/manage/components/SessionSidebar.js +0 -24
  180. package/dist/manage/components/TailMessages.d.ts +0 -8
  181. package/dist/manage/components/TailMessages.js +0 -126
  182. package/dist/manage/hooks/useApi.d.ts +0 -147
  183. package/dist/manage/hooks/useApi.js +0 -181
  184. package/dist/server/cron.d.ts +0 -25
  185. package/dist/server/cron.js +0 -107
  186. package/dist/server/index.d.ts +0 -4
  187. package/dist/server/index.js +0 -22
  188. package/dist/server/routes.d.ts +0 -13
  189. package/dist/server/routes.js +0 -1396
package/dist/index.js ADDED
@@ -0,0 +1,397 @@
1
+ import { Command, Option } from 'commander';
2
+ import { readFileSync } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname, join } from 'path';
5
+ import { listCoworkers, getCoworkerInfo, updateCoworker, createSession, deleteCoworker } from './commands/sessions.js';
6
+ import { sendMessage, checkUnreadMail, getUnreadMail } from './commands/messages.js';
7
+ import { listCrons, deleteCron, enableCron, disableCron, cronHistory, requestCron, createCron, checkCronJob, } from './commands/crons.js';
8
+ import { listCronRequests, getCronRequest, approveCronRequest, rejectCronRequest, deleteCronRequest, } from './commands/cron-requests.js';
9
+ import { addTask, listTasks, getTask, updateTask, deleteTask, assignTask, unassignTask, moveTask, taskStats, } from './commands/tasks.js';
10
+ import { listTaskColumns } from './commands/task-columns.js';
11
+ import { createSqliteStorage, createPostgresqlStorage } from './db/index.js';
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = dirname(__filename);
14
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
15
+ // Global storage instance
16
+ let storage = null;
17
+ async function getStorage() {
18
+ if (!storage) {
19
+ throw new Error('Storage not initialized. Use --sqlite <path> or --postgresql <url> option.');
20
+ }
21
+ return storage;
22
+ }
23
+ const program = new Command();
24
+ program
25
+ .name('agent-office')
26
+ .description('A multi-agent office management system CLI')
27
+ .version(packageJson.version)
28
+ .addOption(new Option('--sqlite <path>', 'SQLite database file path').env('AGENT_OFFICE_SQLITE'))
29
+ .addOption(new Option('--postgresql <url>', 'PostgreSQL connection URL').env('AGENT_OFFICE_POSTGRESQL'))
30
+ .addOption(new Option('--json', 'Output in JSON format instead of TOON').default(false))
31
+ .hook('preAction', async (thisCommand) => {
32
+ const opts = thisCommand.opts();
33
+ if (opts.sqlite && opts.postgresql) {
34
+ throw new Error('Cannot use both --sqlite and --postgresql options. Please specify only one.');
35
+ }
36
+ if (opts.sqlite) {
37
+ storage = createSqliteStorage(opts.sqlite);
38
+ await storage.runMigrations();
39
+ }
40
+ else if (opts.postgresql) {
41
+ storage = createPostgresqlStorage(opts.postgresql);
42
+ await storage.runMigrations();
43
+ }
44
+ });
45
+ // Session/Coworker commands
46
+ program
47
+ .command('list-coworkers')
48
+ .description('List all coworkers (sessions)')
49
+ .action(async (_args, command) => {
50
+ const useJson = command.optsWithGlobals().json;
51
+ const storage = await getStorage();
52
+ await listCoworkers(storage, useJson);
53
+ await storage.close();
54
+ });
55
+ program
56
+ .command('create-coworker')
57
+ .description('Create a new coworker (session)')
58
+ .requiredOption('-n, --name <name>', 'Coworker name')
59
+ .requiredOption('-i, --id <id>', 'Coworker ID')
60
+ .requiredOption('-a, --agent <agent>', 'Agent name')
61
+ .action(async (options, command) => {
62
+ const useJson = command.optsWithGlobals().json;
63
+ const storage = await getStorage();
64
+ await createSession(storage, options.name, options.id, options.agent, useJson);
65
+ await storage.close();
66
+ });
67
+ program
68
+ .command('delete-coworker')
69
+ .description('Delete a coworker (session)')
70
+ .requiredOption('-n, --name <name>', 'Coworker name')
71
+ .action(async (options, command) => {
72
+ const useJson = command.optsWithGlobals().json;
73
+ const storage = await getStorage();
74
+ await deleteCoworker(storage, options.name, useJson);
75
+ await storage.close();
76
+ });
77
+ program
78
+ .command('update-coworker')
79
+ .description("Update a coworker's information (status, description, philosophy, visual description)")
80
+ .requiredOption('-n, --name <name>', 'Coworker name')
81
+ .option('-a, --agent <agent>', 'Set the agent name')
82
+ .option('-s, --status <status>', 'Set the status (omit to clear)')
83
+ .option('-d, --description <description>', 'Set the description (omit to clear)')
84
+ .option('-p, --philosophy <philosophy>', 'Set the philosophy (omit to clear)')
85
+ .option('-v, --visual-description <visual>', 'Set the visual description (omit to clear)')
86
+ .action(async (options, command) => {
87
+ const useJson = command.optsWithGlobals().json;
88
+ const storage = await getStorage();
89
+ await updateCoworker(storage, options.name, {
90
+ agent: options.agent ?? null,
91
+ status: options.status ?? null,
92
+ description: options.description ?? null,
93
+ philosophy: options.philosophy ?? null,
94
+ visualDescription: options.visualDescription ?? null,
95
+ }, useJson);
96
+ await storage.close();
97
+ });
98
+ program
99
+ .command('get-coworker-info')
100
+ .description('Get coworker information (name, description, philosophy)')
101
+ .requiredOption('-n, --name <name>', 'Coworker name')
102
+ .action(async (options, command) => {
103
+ const useJson = command.optsWithGlobals().json;
104
+ const storage = await getStorage();
105
+ await getCoworkerInfo(storage, options.name, useJson);
106
+ await storage.close();
107
+ });
108
+ // Message commands
109
+ program
110
+ .command('send-message')
111
+ .description('Send a message to one or more recipients')
112
+ .requiredOption('-f, --from <from>', 'Sender name')
113
+ .requiredOption('-t, --to <recipients...>', 'Recipient names')
114
+ .requiredOption('-b, --body <body>', 'Message body')
115
+ .action(async (options, command) => {
116
+ const useJson = command.optsWithGlobals().json;
117
+ const storage = await getStorage();
118
+ await sendMessage(storage, options.from, options.to, options.body, useJson);
119
+ await storage.close();
120
+ });
121
+ program
122
+ .command('check-unread-mail')
123
+ .description('Check if there is unread mail for a coworker')
124
+ .requiredOption('-c, --coworker <name>', 'Coworker name to check')
125
+ .action(async (options, command) => {
126
+ const useJson = command.optsWithGlobals().json;
127
+ const storage = await getStorage();
128
+ await checkUnreadMail(storage, options.coworker, useJson);
129
+ await storage.close();
130
+ });
131
+ program
132
+ .command('get-unread-mail')
133
+ .description('Get all unread mail for a coworker and mark as read')
134
+ .requiredOption('-c, --coworker <name>', 'Coworker name')
135
+ .action(async (options, command) => {
136
+ const useJson = command.optsWithGlobals().json;
137
+ const storage = await getStorage();
138
+ await getUnreadMail(storage, options.coworker, useJson);
139
+ await storage.close();
140
+ });
141
+ // Cron commands
142
+ program
143
+ .command('list-crons')
144
+ .description('List all cron jobs')
145
+ .action(async (_args, command) => {
146
+ const useJson = command.optsWithGlobals().json;
147
+ const storage = await getStorage();
148
+ await listCrons(storage, useJson);
149
+ await storage.close();
150
+ });
151
+ program
152
+ .command('delete-cron')
153
+ .description('Delete a cron job')
154
+ .requiredOption('-i, --id <id>', 'Cron job ID', parseInt)
155
+ .action(async (options, command) => {
156
+ const useJson = command.optsWithGlobals().json;
157
+ const storage = await getStorage();
158
+ await deleteCron(storage, options.id, useJson);
159
+ await storage.close();
160
+ });
161
+ program
162
+ .command('enable-cron')
163
+ .description('Enable a cron job')
164
+ .requiredOption('-i, --id <id>', 'Cron job ID', parseInt)
165
+ .action(async (options, command) => {
166
+ const useJson = command.optsWithGlobals().json;
167
+ const storage = await getStorage();
168
+ await enableCron(storage, options.id, useJson);
169
+ await storage.close();
170
+ });
171
+ program
172
+ .command('disable-cron')
173
+ .description('Disable a cron job')
174
+ .requiredOption('-i, --id <id>', 'Cron job ID', parseInt)
175
+ .action(async (options, command) => {
176
+ const useJson = command.optsWithGlobals().json;
177
+ const storage = await getStorage();
178
+ await disableCron(storage, options.id, useJson);
179
+ await storage.close();
180
+ });
181
+ program
182
+ .command('cron-history')
183
+ .description('Get cron job execution history')
184
+ .requiredOption('-i, --id <id>', 'Cron job ID', parseInt)
185
+ .option('-l, --limit <limit>', 'Number of history entries to show', '10')
186
+ .action(async (options, command) => {
187
+ const useJson = command.optsWithGlobals().json;
188
+ const storage = await getStorage();
189
+ await cronHistory(storage, options.id, parseInt(options.limit), useJson);
190
+ await storage.close();
191
+ });
192
+ program
193
+ .command('check-cron-job')
194
+ .description('Check if a cron job should be activated this minute')
195
+ .requiredOption('-i, --id <id>', 'Cron job ID', parseInt)
196
+ .action(async (options, command) => {
197
+ const useJson = command.optsWithGlobals().json;
198
+ const storage = await getStorage();
199
+ await checkCronJob(storage, options.id, useJson);
200
+ await storage.close();
201
+ });
202
+ program
203
+ .command('create-cron')
204
+ .description('Create a new cron job directly')
205
+ .requiredOption('-n, --name <name>', 'Cron job name')
206
+ .requiredOption('-c, --coworker <coworker>', 'Coworker name')
207
+ .requiredOption('-S, --schedule <schedule>', 'Cron schedule expression')
208
+ .requiredOption('-m, --message <message>', 'Message to send')
209
+ .option('-z, --timezone <timezone>', 'Timezone (optional)')
210
+ .action(async (options, command) => {
211
+ const useJson = command.optsWithGlobals().json;
212
+ const storage = await getStorage();
213
+ await createCron(storage, options.name, options.coworker, options.schedule, options.message, options.timezone, useJson);
214
+ await storage.close();
215
+ });
216
+ // Cron request management commands (top-level)
217
+ program
218
+ .command('list-cron-requests')
219
+ .description('List all cron job requests')
220
+ .action(async (_args, command) => {
221
+ const useJson = command.optsWithGlobals().json;
222
+ const storage = await getStorage();
223
+ await listCronRequests(storage, useJson);
224
+ await storage.close();
225
+ });
226
+ program
227
+ .command('request-cron')
228
+ .description('Create a new cron job request (requires approval)')
229
+ .requiredOption('-n, --name <name>', 'Cron job name')
230
+ .requiredOption('-c, --coworker <coworker>', 'Coworker name')
231
+ .requiredOption('-S, --schedule <schedule>', 'Cron schedule expression')
232
+ .requiredOption('-m, --message <message>', 'Message to send')
233
+ .option('-z, --timezone <timezone>', 'Timezone (optional)')
234
+ .action(async (options, command) => {
235
+ const useJson = command.optsWithGlobals().json;
236
+ const storage = await getStorage();
237
+ await requestCron(storage, options.name, options.coworker, options.schedule, options.message, options.timezone, useJson);
238
+ await storage.close();
239
+ });
240
+ program
241
+ .command('get-cron-request')
242
+ .description('Get details of a cron job request')
243
+ .requiredOption('-i, --id <id>', 'Cron request ID', parseInt)
244
+ .action(async (options, command) => {
245
+ const useJson = command.optsWithGlobals().json;
246
+ const storage = await getStorage();
247
+ await getCronRequest(storage, options.id, useJson);
248
+ await storage.close();
249
+ });
250
+ program
251
+ .command('approve-cron-request')
252
+ .description('Approve a pending cron job request')
253
+ .requiredOption('-i, --id <id>', 'Cron request ID', parseInt)
254
+ .requiredOption('-r, --reviewer <name>', 'Name of the reviewer')
255
+ .option('-n, --notes <notes>', 'Optional reviewer notes')
256
+ .action(async (options, command) => {
257
+ const useJson = command.optsWithGlobals().json;
258
+ const storage = await getStorage();
259
+ await approveCronRequest(storage, options.id, options.reviewer, options.notes, useJson);
260
+ await storage.close();
261
+ });
262
+ program
263
+ .command('reject-cron-request')
264
+ .description('Reject a pending cron job request')
265
+ .requiredOption('-i, --id <id>', 'Cron request ID', parseInt)
266
+ .requiredOption('-r, --reviewer <name>', 'Name of the reviewer')
267
+ .option('-n, --notes <notes>', 'Optional reviewer notes')
268
+ .action(async (options, command) => {
269
+ const useJson = command.optsWithGlobals().json;
270
+ const storage = await getStorage();
271
+ await rejectCronRequest(storage, options.id, options.reviewer, options.notes, useJson);
272
+ await storage.close();
273
+ });
274
+ program
275
+ .command('delete-cron-request')
276
+ .description('Delete a cron job request')
277
+ .requiredOption('-i, --id <id>', 'Cron request ID', parseInt)
278
+ .action(async (options, command) => {
279
+ const useJson = command.optsWithGlobals().json;
280
+ const storage = await getStorage();
281
+ await deleteCronRequest(storage, options.id, useJson);
282
+ await storage.close();
283
+ });
284
+ // Task board commands
285
+ program
286
+ .command('add-task')
287
+ .description('Create a new task')
288
+ .requiredOption('-t, --title <title>', 'Task title')
289
+ .option('-d, --description <desc>', 'Task description', '')
290
+ .option('-a, --assignee <assignee>', 'Task assignee')
291
+ .requiredOption('-c, --column <column>', 'Initial column (idea, approved idea, working on, blocked, ready for review, done)')
292
+ .option('--dependencies <deps...>', 'Task dependency IDs', [])
293
+ .action(async (options, command) => {
294
+ const useJson = command.optsWithGlobals().json;
295
+ const storage = await getStorage();
296
+ const deps = options.dependencies?.map((id) => parseInt(id)) || [];
297
+ await addTask(storage, options.title, options.description, options.assignee || null, options.column, deps, useJson);
298
+ await storage.close();
299
+ });
300
+ program
301
+ .command('list-tasks')
302
+ .description('List all tasks')
303
+ .option('-a, --assignee <assignee>', 'Filter by assignee')
304
+ .option('-c, --column <column>', 'Filter by column')
305
+ .option('-s, --search <query>', 'Search in title and description')
306
+ .action(async (options, command) => {
307
+ const useJson = command.optsWithGlobals().json;
308
+ const storage = await getStorage();
309
+ await listTasks(storage, options.assignee, options.column, options.search, useJson);
310
+ await storage.close();
311
+ });
312
+ program
313
+ .command('get-task')
314
+ .description('Get a task by ID')
315
+ .requiredOption('-i, --id <id>', 'Task ID', parseInt)
316
+ .action(async (options, command) => {
317
+ const useJson = command.optsWithGlobals().json;
318
+ const storage = await getStorage();
319
+ await getTask(storage, options.id, useJson);
320
+ await storage.close();
321
+ });
322
+ program
323
+ .command('update-task')
324
+ .description('Update a task')
325
+ .requiredOption('-i, --id <id>', 'Task ID', parseInt)
326
+ .option('-t, --title <title>', 'New title')
327
+ .option('-d, --description <desc>', 'New description')
328
+ .option('-a, --assignee <assignee>', 'New assignee')
329
+ .option('-c, --column <column>', 'New column')
330
+ .option('--dependencies <deps...>', 'New dependency IDs')
331
+ .action(async (options, command) => {
332
+ const useJson = command.optsWithGlobals().json;
333
+ const storage = await getStorage();
334
+ const deps = options.dependencies?.map((id) => parseInt(id));
335
+ await updateTask(storage, options.id, options.title, options.description, options.assignee, options.column, deps, useJson);
336
+ await storage.close();
337
+ });
338
+ program
339
+ .command('delete-task')
340
+ .description('Delete a task')
341
+ .requiredOption('-i, --id <id>', 'Task ID', parseInt)
342
+ .action(async (options, command) => {
343
+ const useJson = command.optsWithGlobals().json;
344
+ const storage = await getStorage();
345
+ await deleteTask(storage, options.id, useJson);
346
+ await storage.close();
347
+ });
348
+ program
349
+ .command('assign-task')
350
+ .description('Assign a task to someone')
351
+ .requiredOption('-i, --id <id>', 'Task ID', parseInt)
352
+ .requiredOption('-a, --assignee <assignee>', 'Assignee name')
353
+ .action(async (options, command) => {
354
+ const useJson = command.optsWithGlobals().json;
355
+ const storage = await getStorage();
356
+ await assignTask(storage, options.id, options.assignee, useJson);
357
+ await storage.close();
358
+ });
359
+ program
360
+ .command('unassign-task')
361
+ .description('Remove assignment from a task')
362
+ .requiredOption('-i, --id <id>', 'Task ID', parseInt)
363
+ .action(async (options, command) => {
364
+ const useJson = command.optsWithGlobals().json;
365
+ const storage = await getStorage();
366
+ await unassignTask(storage, options.id, useJson);
367
+ await storage.close();
368
+ });
369
+ program
370
+ .command('move-task')
371
+ .description('Move a task to a different column')
372
+ .requiredOption('-i, --id <id>', 'Task ID', parseInt)
373
+ .requiredOption('-c, --column <column>', 'Target column')
374
+ .action(async (options, command) => {
375
+ const useJson = command.optsWithGlobals().json;
376
+ const storage = await getStorage();
377
+ await moveTask(storage, options.id, options.column, useJson);
378
+ await storage.close();
379
+ });
380
+ program
381
+ .command('task-stats')
382
+ .description('Show task statistics by column')
383
+ .action(async (_args, command) => {
384
+ const useJson = command.optsWithGlobals().json;
385
+ const storage = await getStorage();
386
+ await taskStats(storage, useJson);
387
+ await storage.close();
388
+ });
389
+ program
390
+ .command('list-task-columns')
391
+ .description('List all valid task board columns')
392
+ .action(async (_args, command) => {
393
+ const useJson = command.optsWithGlobals().json;
394
+ await listTaskColumns(useJson);
395
+ });
396
+ program.parse();
397
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACtH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACpF,OAAO,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,OAAO,EACP,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,GACV,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAsB,MAAM,eAAe,CAAA;AAEhG,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAEzF,0BAA0B;AAC1B,IAAI,OAAO,GAA8B,IAAI,CAAA;AAE7C,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAA;IAC/F,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,4CAA4C,CAAC;KACzD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,SAAS,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;KAChG,SAAS,CAAC,IAAI,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;KACvG,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KACvF,IAAI,CAAC,WAAW,EAAE,KAAK,EAAC,WAAW,EAAC,EAAE;IACrC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;IAC/B,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;IAChG,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC1C,MAAM,OAAO,CAAC,aAAa,EAAE,CAAA;IAC/B,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClD,MAAM,OAAO,CAAC,aAAa,EAAE,CAAA;IAC/B,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,4BAA4B;AAC5B,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACrC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,iCAAiC,CAAC;KAC9C,cAAc,CAAC,mBAAmB,EAAE,eAAe,CAAC;KACpD,cAAc,CAAC,eAAe,EAAE,aAAa,CAAC;KAC9C,cAAc,CAAC,qBAAqB,EAAE,YAAY,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC9E,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,cAAc,CAAC,mBAAmB,EAAE,eAAe,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,uFAAuF,CAAC;KACpG,cAAc,CAAC,mBAAmB,EAAE,eAAe,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;KACnD,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,CAAC;KACjE,MAAM,CAAC,iCAAiC,EAAE,qCAAqC,CAAC;KAChF,MAAM,CAAC,+BAA+B,EAAE,oCAAoC,CAAC;KAC7E,MAAM,CAAC,mCAAmC,EAAE,4CAA4C,CAAC;KACzF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,cAAc,CAClB,OAAO,EACP,OAAO,CAAC,IAAI,EACZ;QACE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;KACrD,EACD,OAAO,CACR,CAAA;IACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,0DAA0D,CAAC;KACvE,cAAc,CAAC,mBAAmB,EAAE,eAAe,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACrD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,0CAA0C,CAAC;KACvD,cAAc,CAAC,mBAAmB,EAAE,aAAa,CAAC;KAClD,cAAc,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;KAC7D,cAAc,CAAC,mBAAmB,EAAE,cAAc,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3E,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,8CAA8C,CAAC;KAC3D,cAAc,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACjE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,qDAAqD,CAAC;KAClE,cAAc,CAAC,uBAAuB,EAAE,eAAe,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACvD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,mBAAmB,CAAC;KAChC,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,mBAAmB,CAAC;KAChC,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,oBAAoB,CAAC;KACjC,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,EAAE,IAAI,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;IACxE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,qDAAqD,CAAC;KAClE,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,cAAc,CAAC,mBAAmB,EAAE,eAAe,CAAC;KACpD,cAAc,CAAC,2BAA2B,EAAE,eAAe,CAAC;KAC5D,cAAc,CAAC,2BAA2B,EAAE,0BAA0B,CAAC;KACvE,cAAc,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;KAC5D,MAAM,CAAC,2BAA2B,EAAE,qBAAqB,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,UAAU,CACd,OAAO,EACP,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,QAAQ,EAChB,OAAO,CACR,CAAA;IACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,+CAA+C;AAC/C,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACxC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,mDAAmD,CAAC;KAChE,cAAc,CAAC,mBAAmB,EAAE,eAAe,CAAC;KACpD,cAAc,CAAC,2BAA2B,EAAE,eAAe,CAAC;KAC5D,cAAc,CAAC,2BAA2B,EAAE,0BAA0B,CAAC;KACvE,cAAc,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;KAC5D,MAAM,CAAC,2BAA2B,EAAE,qBAAqB,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,WAAW,CACf,OAAO,EACP,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,QAAQ,EAChB,OAAO,CACR,CAAA;IACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,mCAAmC,CAAC;KAChD,cAAc,CAAC,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAClD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,sBAAsB,CAAC;KAC/B,WAAW,CAAC,oCAAoC,CAAC;KACjD,cAAc,CAAC,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;KAC5D,cAAc,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,mCAAmC,CAAC;KAChD,cAAc,CAAC,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;KAC5D,cAAc,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACtF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,2BAA2B,CAAC;KACxC,cAAc,CAAC,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACrD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,mBAAmB,CAAC;KAChC,cAAc,CAAC,qBAAqB,EAAE,YAAY,CAAC;KACnD,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,EAAE,EAAE,CAAC;KAC1D,MAAM,CAAC,2BAA2B,EAAE,eAAe,CAAC;KACpD,cAAc,CACb,uBAAuB,EACvB,mFAAmF,CACpF;KACA,MAAM,CAAC,0BAA0B,EAAE,qBAAqB,EAAE,EAAE,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1E,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACnH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,2BAA2B,EAAE,oBAAoB,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;KACnD,MAAM,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;KACjE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,kBAAkB,CAAC;KAC/B,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,eAAe,CAAC;KAC5B,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,WAAW,CAAC;KAC1C,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;KACrD,MAAM,CAAC,2BAA2B,EAAE,cAAc,CAAC;KACnD,MAAM,CAAC,uBAAuB,EAAE,YAAY,CAAC;KAC7C,MAAM,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,UAAU,CACd,OAAO,EACP,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,EACd,IAAI,EACJ,OAAO,CACR,CAAA;IACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,eAAe,CAAC;KAC5B,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,0BAA0B,CAAC;KACvC,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;KACpD,cAAc,CAAC,2BAA2B,EAAE,eAAe,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAChE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,mCAAmC,CAAC;KAChD,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;KACpD,cAAc,CAAC,uBAAuB,EAAE,eAAe,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAClC,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAA;IAC9C,MAAM,eAAe,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname, join } from 'path';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ const rootDir = join(__dirname, '..');
8
+ describe('CLI Integration Tests', () => {
9
+ const runCLI = (args) => {
10
+ try {
11
+ return execSync(`npx tsx src/index.ts ${args}`, {
12
+ encoding: 'utf-8',
13
+ cwd: rootDir,
14
+ }).trim();
15
+ }
16
+ catch (error) {
17
+ return error.stdout?.trim() || error.message;
18
+ }
19
+ };
20
+ describe('version command', () => {
21
+ it('should display version with --version flag', () => {
22
+ const output = runCLI('--version');
23
+ expect(output).toMatch(/^\d+\.\d+\.\d+/);
24
+ });
25
+ it('should display version with -V flag', () => {
26
+ const output = runCLI('-V');
27
+ expect(output).toMatch(/^\d+\.\d+\.\d+/);
28
+ });
29
+ });
30
+ describe('help command', () => {
31
+ it('should display help with --help flag', () => {
32
+ const output = runCLI('--help');
33
+ expect(output).toContain('Usage: agent-office');
34
+ expect(output).toContain('Commands:');
35
+ });
36
+ it('should display help with -h flag', () => {
37
+ const output = runCLI('-h');
38
+ expect(output).toContain('Usage: agent-office');
39
+ });
40
+ });
41
+ describe('database options', () => {
42
+ it('should show --sqlite option in help', () => {
43
+ const output = runCLI('--help');
44
+ expect(output).toContain('--sqlite');
45
+ expect(output).toContain('--postgresql');
46
+ });
47
+ });
48
+ });
49
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAErC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE;QACtC,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,wBAAwB,IAAI,EAAE,EAAE;gBAC9C,QAAQ,EAAE,OAAO;gBACjB,GAAG,EAAE,OAAO;aACb,CAAC,CAAC,IAAI,EAAE,CAAA;QACX,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,CAAA;QAC9C,CAAC;IACH,CAAC,CAAA;IAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function formatOutput(data: unknown, useJson: boolean): string;
2
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAKpE"}
@@ -0,0 +1,8 @@
1
+ import { encode } from '@toon-format/toon';
2
+ export function formatOutput(data, useJson) {
3
+ if (useJson) {
4
+ return JSON.stringify(data, null, 2);
5
+ }
6
+ return encode(data);
7
+ }
8
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,OAAgB;IAC1D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cron-service.constraints.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-service.constraints.test.d.ts","sourceRoot":"","sources":["../../src/services/cron-service.constraints.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockStorage } from '../db/mock-storage.js';
3
+ import { CronService } from './cron-service.js';
4
+ describe('CronService - Constraint Handling', () => {
5
+ let storage;
6
+ let service;
7
+ beforeEach(async () => {
8
+ storage = createMockStorage();
9
+ service = new CronService(storage);
10
+ // Create a session for testing
11
+ await storage.createSession('test-session', 'id1', 'agent1');
12
+ });
13
+ describe('FOREIGN KEY constraint: cron_jobs.session_name references coworkers', () => {
14
+ it('should throw error when creating cron job for non-existent coworker', async () => {
15
+ await expect(service.createCronJob('job1', 'nonexistent-session', '0 0 * * *', null, 'Hello')).rejects.toThrow('Coworker nonexistent-session not found');
16
+ });
17
+ it('should allow creating cron job for existing coworker', async () => {
18
+ const job = await service.createCronJob('job1', 'test-session', '0 0 * * *', null, 'Hello');
19
+ expect(job.session_name).toBe('test-session');
20
+ });
21
+ it('should verify cron jobs are associated with coworkers', async () => {
22
+ const job = await service.createCronJob('job1', 'test-session', '0 0 * * *', null, 'Hello');
23
+ // Verify the job references the correct coworker
24
+ expect(job.session_name).toBe('test-session');
25
+ // Verify we can retrieve it
26
+ const retrieved = await storage.getCronJobById(job.id);
27
+ expect(retrieved).not.toBeNull();
28
+ expect(retrieved?.session_name).toBe('test-session');
29
+ });
30
+ });
31
+ describe('UNIQUE constraint: cron job names must be unique per coworker', () => {
32
+ it('should throw error when creating duplicate cron job name for same coworker', async () => {
33
+ await service.createCronJob('duplicate-job', 'test-session', '0 0 * * *', null, 'Hello');
34
+ await expect(service.createCronJob('duplicate-job', 'test-session', '0 12 * * *', null, 'Different')).rejects.toThrow('Cron job duplicate-job already exists for coworker test-session');
35
+ });
36
+ it('should allow same cron job name for different coworkers', async () => {
37
+ await storage.createSession('another-session', 'id2', 'agent2');
38
+ const job1 = await service.createCronJob('same-name', 'test-session', '0 0 * * *', null, 'Hello');
39
+ const job2 = await service.createCronJob('same-name', 'another-session', '0 0 * * *', null, 'Hello');
40
+ expect(job1.name).toBe('same-name');
41
+ expect(job2.name).toBe('same-name');
42
+ expect(job1.session_name).not.toBe(job2.session_name);
43
+ });
44
+ });
45
+ describe('FOREIGN KEY constraint: cron_requests.session_name -> sessions(name)', () => {
46
+ it('should throw error when creating cron request for non-existent session', async () => {
47
+ await expect(service.createCronRequest('req1', 'nonexistent-session', '0 0 * * *', null, 'Hello')).rejects.toThrow('Coworker nonexistent-session not found');
48
+ });
49
+ it('should allow creating cron request for existing session', async () => {
50
+ const request = await service.createCronRequest('req1', 'test-session', '0 0 * * *', null, 'Hello');
51
+ expect(request.session_name).toBe('test-session');
52
+ });
53
+ });
54
+ describe('FOREIGN KEY constraint: cron_history.cron_job_id -> cron_jobs(id)', () => {
55
+ it('should verify cron history references valid jobs', async () => {
56
+ const job = await service.createCronJob('job1', 'test-session', '0 0 * * *', null, 'Hello');
57
+ await storage.createCronHistory(job.id, new Date(), true);
58
+ // Verify history exists and references the job
59
+ const history = await storage.listCronHistory(job.id, 10);
60
+ expect(history).toHaveLength(1);
61
+ expect(history[0].cron_job_id).toBe(job.id);
62
+ });
63
+ });
64
+ describe('NOT NULL constraints', () => {
65
+ it('should require coworker name for cron jobs', async () => {
66
+ // Empty coworker name should be rejected
67
+ await expect(service.createCronJob('job1', '', '0 0 * * *', null, 'Hello')).rejects.toThrow('Coworker not found');
68
+ });
69
+ });
70
+ describe('Cron request status transitions', () => {
71
+ it('should only allow approving pending requests', async () => {
72
+ const request = await service.createCronRequest('req1', 'test-session', '0 0 * * *', null, 'Hello');
73
+ await service.approveCronRequest(request.id, 'reviewer1');
74
+ // Should not allow re-approving
75
+ await expect(service.approveCronRequest(request.id, 'reviewer2')).rejects.toThrow('Cannot approve cron request');
76
+ });
77
+ it('should only allow rejecting pending requests', async () => {
78
+ const request = await service.createCronRequest('req1', 'test-session', '0 0 * * *', null, 'Hello');
79
+ await service.rejectCronRequest(request.id, 'reviewer1');
80
+ // Should not allow rejecting again
81
+ await expect(service.rejectCronRequest(request.id, 'reviewer2')).rejects.toThrow('Cannot reject cron request');
82
+ });
83
+ it('should not allow approving rejected requests', async () => {
84
+ const request = await service.createCronRequest('req1', 'test-session', '0 0 * * *', null, 'Hello');
85
+ await service.rejectCronRequest(request.id, 'reviewer1');
86
+ await expect(service.approveCronRequest(request.id, 'reviewer2')).rejects.toThrow('Cannot approve cron request');
87
+ });
88
+ });
89
+ });
90
+ //# sourceMappingURL=cron-service.constraints.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-service.constraints.test.js","sourceRoot":"","sources":["../../src/services/cron-service.constraints.test.ts"],"names":[],"mappings":"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"}