@taskcast/cli 0.3.0 → 1.0.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.
package/README.md CHANGED
@@ -5,7 +5,7 @@ Standalone [Taskcast](https://github.com/weightwave/taskcast) server. Run a full
5
5
  ## Quick Start
6
6
 
7
7
  ```bash
8
- npx taskcast
8
+ npx @taskcast/cli
9
9
  ```
10
10
 
11
11
  The server starts on port `3721` by default.
@@ -43,7 +43,7 @@ Options:
43
43
  ### Config File
44
44
 
45
45
  ```bash
46
- npx taskcast start -p 8080 -c taskcast.config.yaml
46
+ npx @taskcast/cli start -p 8080 -c taskcast.config.yaml
47
47
  ```
48
48
 
49
49
  Taskcast searches for config files in the current directory:
@@ -68,13 +68,13 @@ Taskcast searches for config files in the current directory:
68
68
  For zero-dependency local development with persistent storage:
69
69
 
70
70
  ```bash
71
- npx taskcast start --storage sqlite
71
+ npx @taskcast/cli start --storage sqlite
72
72
  ```
73
73
 
74
74
  Data is stored in `./taskcast.db` by default. Customize with `--db-path`:
75
75
 
76
76
  ```bash
77
- npx taskcast start --storage sqlite --db-path /tmp/my-taskcast.db
77
+ npx @taskcast/cli start --storage sqlite --db-path /tmp/my-taskcast.db
78
78
  ```
79
79
 
80
80
  ## Part of Taskcast
package/dist/index.js CHANGED
@@ -3,14 +3,17 @@ import { Command } from 'commander';
3
3
  import { Redis } from 'ioredis';
4
4
  import postgres from 'postgres';
5
5
  import { createInterface } from 'readline';
6
- import { mkdirSync, writeFileSync } from 'fs';
7
- import { join } from 'path';
6
+ import { mkdirSync, writeFileSync, existsSync } from 'fs';
7
+ import { join, dirname } from 'path';
8
+ import { fileURLToPath } from 'url';
8
9
  import { homedir } from 'os';
9
- import { TaskEngine, WorkerManager, loadConfigFile, MemoryBroadcastProvider, MemoryShortTermStore, } from '@taskcast/core';
10
+ import { createRequire } from 'module';
11
+ import { TaskEngine, WorkerManager, loadConfigFile, resolveAdminToken, MemoryBroadcastProvider, MemoryShortTermStore, } from '@taskcast/core';
10
12
  import { createTaskcastApp } from '@taskcast/server';
11
13
  import { createRedisAdapters } from '@taskcast/redis';
12
- import { PostgresLongTermStore } from '@taskcast/postgres';
14
+ import { PostgresLongTermStore, loadMigrationFiles, runMigrations } from '@taskcast/postgres';
13
15
  import { createSqliteAdapters } from '@taskcast/sqlite';
16
+ import { resolvePostgresUrl, formatDisplayUrl } from './migrate-helpers.js';
14
17
  const DEFAULT_CONFIG_YAML = `# Taskcast configuration
15
18
  # Docs: https://github.com/weightwave/taskcast
16
19
 
@@ -38,9 +41,22 @@ async function promptCreateGlobalConfig() {
38
41
  const rl = createInterface({ input: process.stdin, output: process.stdout });
39
42
  rl.on('close', () => resolve(false));
40
43
  rl.question(`[taskcast] No config file found.\n? Create a default config at ${globalConfigPath}? (Y/n) `, (answer) => {
44
+ const trimmed = answer.trim().toLowerCase();
45
+ resolve(trimmed === '' || trimmed === 'y' || trimmed === 'yes');
41
46
  rl.close();
47
+ });
48
+ });
49
+ }
50
+ async function promptConfirm(message) {
51
+ if (!process.stdin.isTTY)
52
+ return false;
53
+ return new Promise((resolve) => {
54
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
55
+ rl.on('close', () => resolve(false));
56
+ rl.question(message, (answer) => {
42
57
  const trimmed = answer.trim().toLowerCase();
43
58
  resolve(trimmed === '' || trimmed === 'y' || trimmed === 'yes');
59
+ rl.close();
44
60
  });
45
61
  });
46
62
  }
@@ -70,6 +86,7 @@ program
70
86
  .option('-p, --port <port>', 'port to listen on', '3721')
71
87
  .option('-s, --storage <type>', 'storage backend: memory | redis | sqlite', 'memory')
72
88
  .option('--db-path <path>', 'SQLite database file path (default: ./taskcast.db)')
89
+ .option('--playground', 'serve the interactive playground UI at /_playground/')
73
90
  .action(async (options) => {
74
91
  let { config: fileConfig, source } = await loadConfigFile(options.config);
75
92
  if (source === 'none') {
@@ -135,16 +152,177 @@ program
135
152
  wmOpts.defaults = fileConfig.workers.defaults;
136
153
  workerManager = new WorkerManager(wmOpts);
137
154
  }
155
+ // Resolve admin token (auto-generate + print if adminApi is enabled)
156
+ resolveAdminToken(fileConfig);
138
157
  const serverOpts = {
139
158
  engine,
159
+ shortTermStore,
140
160
  auth: { mode: authMode },
161
+ config: fileConfig,
141
162
  };
142
163
  if (workerManager !== undefined)
143
164
  serverOpts.workerManager = workerManager;
144
- const app = createTaskcastApp(serverOpts);
165
+ const { app, stop } = createTaskcastApp(serverOpts);
166
+ // Serve playground static files if --playground and dist exists
167
+ if (options.playground) {
168
+ try {
169
+ const require = createRequire(import.meta.url);
170
+ const pkgPath = require.resolve('@taskcast/playground/package.json');
171
+ const distDir = join(dirname(pkgPath), 'dist');
172
+ if (existsSync(distDir)) {
173
+ const { serveStatic } = await import('@hono/node-server/serve-static');
174
+ app.use('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: (p) => p.replace(/^\/_playground/, '') }));
175
+ // SPA fallback: serve index.html for non-asset paths
176
+ app.get('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: () => '/index.html' }));
177
+ }
178
+ else {
179
+ console.warn('[taskcast] Playground dist not found. Run `pnpm --filter @taskcast/playground build` first.');
180
+ }
181
+ }
182
+ catch {
183
+ console.warn('[taskcast] @taskcast/playground not available, skipping playground UI.');
184
+ }
185
+ }
145
186
  const { serve } = await import('@hono/node-server');
146
- serve({ fetch: app.fetch, port }, () => {
187
+ const server = serve({ fetch: app.fetch, port }, () => {
147
188
  console.log(`[taskcast] Server started on http://localhost:${port}`);
189
+ if (options.playground) {
190
+ console.log(`[taskcast] Playground UI at http://localhost:${port}/_playground/`);
191
+ }
192
+ });
193
+ // Clean up scheduler/heartbeat on shutdown
194
+ process.on('SIGTERM', () => { stop(); server.close?.(); });
195
+ process.on('SIGINT', () => { stop(); server.close?.(); });
196
+ });
197
+ program
198
+ .command('playground')
199
+ .description('Serve only the playground UI (no engine)')
200
+ .option('-p, --port <port>', 'port to listen on', '5173')
201
+ .action(async (options) => {
202
+ const port = Number(options.port);
203
+ try {
204
+ const require = createRequire(import.meta.url);
205
+ const pkgPath = require.resolve('@taskcast/playground/package.json');
206
+ const distDir = join(dirname(pkgPath), 'dist');
207
+ if (!existsSync(distDir)) {
208
+ console.error('[taskcast] Playground dist not found. Run `pnpm --filter @taskcast/playground build` first.');
209
+ process.exit(1);
210
+ }
211
+ const { OpenAPIHono } = await import('@hono/zod-openapi');
212
+ const app = new OpenAPIHono();
213
+ const { serveStatic } = await import('@hono/node-server/serve-static');
214
+ app.use('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: (p) => p.replace(/^\/_playground/, '') }));
215
+ app.get('/_playground/*', serveStatic({ root: distDir, rewriteRequestPath: () => '/index.html' }));
216
+ app.get('/', (c) => c.redirect('/_playground/'));
217
+ const { serve } = await import('@hono/node-server');
218
+ serve({ fetch: app.fetch, port }, () => {
219
+ console.log(`[taskcast] Playground UI at http://localhost:${port}/_playground/`);
220
+ console.log('[taskcast] Use "External" mode in the UI to connect to a remote server.');
221
+ });
222
+ }
223
+ catch {
224
+ console.error('[taskcast] @taskcast/playground not available.');
225
+ process.exit(1);
226
+ }
227
+ });
228
+ program
229
+ .command('ui')
230
+ .alias('dashboard')
231
+ .description('Start the Taskcast Dashboard web UI')
232
+ .option('-p, --port <port>', 'Dashboard port', '3722')
233
+ .option('-s, --server <url>', 'Taskcast server URL', 'http://localhost:3721')
234
+ .option('--admin-token <token>', 'Admin token for auto-connect')
235
+ .action(async (opts) => {
236
+ const { dashboardDistPath } = await import('@taskcast/dashboard-web/dist-path');
237
+ const { Hono } = await import('hono');
238
+ const { serve } = await import('@hono/node-server');
239
+ const { existsSync, readFileSync, statSync } = await import('fs');
240
+ const { join: joinPath, extname, resolve: resolvePath } = await import('path');
241
+ if (!existsSync(dashboardDistPath)) {
242
+ console.error('[taskcast] Dashboard not built. Run: pnpm --filter @taskcast/dashboard-web build');
243
+ process.exit(1);
244
+ }
245
+ // Exchange admin token for JWT at startup (never expose raw token to browser)
246
+ let dashboardJwt;
247
+ if (opts.adminToken) {
248
+ try {
249
+ const tokenRes = await fetch(`${opts.server}/admin/token`, {
250
+ method: 'POST',
251
+ headers: { 'Content-Type': 'application/json' },
252
+ body: JSON.stringify({ adminToken: opts.adminToken }),
253
+ });
254
+ if (tokenRes.ok) {
255
+ const { token } = await tokenRes.json();
256
+ dashboardJwt = token;
257
+ }
258
+ else if (tokenRes.status === 404) {
259
+ // Admin API not enabled — server may be in auth: none mode
260
+ console.log('[taskcast] Admin API not enabled, connecting without JWT');
261
+ }
262
+ else {
263
+ console.error(`[taskcast] Failed to exchange admin token: ${tokenRes.status}`);
264
+ process.exit(1);
265
+ }
266
+ }
267
+ catch (err) {
268
+ console.error(`[taskcast] Cannot reach server at ${opts.server}: ${err instanceof Error ? err.message : err}`);
269
+ process.exit(1);
270
+ }
271
+ }
272
+ const MIME_TYPES = {
273
+ '.html': 'text/html',
274
+ '.js': 'application/javascript',
275
+ '.css': 'text/css',
276
+ '.json': 'application/json',
277
+ '.png': 'image/png',
278
+ '.jpg': 'image/jpeg',
279
+ '.jpeg': 'image/jpeg',
280
+ '.gif': 'image/gif',
281
+ '.svg': 'image/svg+xml',
282
+ '.ico': 'image/x-icon',
283
+ '.woff': 'font/woff',
284
+ '.woff2': 'font/woff2',
285
+ '.ttf': 'font/ttf',
286
+ '.eot': 'application/vnd.ms-fontobject',
287
+ '.map': 'application/json',
288
+ };
289
+ const app = new Hono();
290
+ // Auto-connect config endpoint (never exposes admin token — only pre-exchanged JWT)
291
+ app.get('/api/config', (c) => {
292
+ return c.json({
293
+ baseUrl: opts.server,
294
+ token: dashboardJwt,
295
+ });
296
+ });
297
+ // Serve static dashboard files with SPA fallback
298
+ app.get('*', (c) => {
299
+ const urlPath = decodeURIComponent(new URL(c.req.url).pathname);
300
+ const resolved = resolvePath(joinPath(dashboardDistPath, urlPath));
301
+ // Path traversal protection: ensure resolved path stays within dashboard dist
302
+ if (!resolved.startsWith(dashboardDistPath)) {
303
+ return c.text('Not Found', 404);
304
+ }
305
+ let filePath = resolved;
306
+ // Try the exact file first, then fall back to index.html (SPA)
307
+ const isFile = existsSync(filePath) && statSync(filePath).isFile();
308
+ if (!isFile) {
309
+ filePath = joinPath(dashboardDistPath, 'index.html');
310
+ }
311
+ if (!existsSync(filePath)) {
312
+ return c.text('Not Found', 404);
313
+ }
314
+ const ext = extname(filePath);
315
+ const contentType = MIME_TYPES[ext] ?? 'application/octet-stream';
316
+ const body = readFileSync(filePath);
317
+ return c.body(body, 200, { 'Content-Type': contentType });
318
+ });
319
+ const port = Number(opts.port);
320
+ serve({ fetch: app.fetch, port }, () => {
321
+ console.log(`[taskcast] Dashboard running at http://localhost:${port}`);
322
+ console.log(`[taskcast] Connected to server: ${opts.server}`);
323
+ if (opts.adminToken) {
324
+ console.log(`[taskcast] Admin token provided for auto-connect`);
325
+ }
148
326
  });
149
327
  });
150
328
  program
@@ -168,5 +346,79 @@ program
168
346
  console.error('[taskcast] status is not yet implemented');
169
347
  process.exit(1);
170
348
  });
349
+ program
350
+ .command('migrate')
351
+ .description('Run pending PostgreSQL migrations')
352
+ .option('--url <url>', 'Postgres connection URL (highest priority)')
353
+ .option('-c, --config <path>', 'config file path')
354
+ .option('-y, --yes', 'skip confirmation prompt')
355
+ .action(async (options) => {
356
+ // URL resolution priority: --url flag > env var > config file
357
+ const { config: fileConfig } = await loadConfigFile(options.config);
358
+ const pgUrl = resolvePostgresUrl({
359
+ url: options.url,
360
+ envUrl: process.env['TASKCAST_POSTGRES_URL'],
361
+ configUrl: fileConfig.adapters?.longTermStore?.url,
362
+ });
363
+ if (!pgUrl) {
364
+ console.error('[taskcast] No Postgres URL found. Provide --url, set TASKCAST_POSTGRES_URL, or configure adapters.longTermStore.url in config.');
365
+ process.exit(1);
366
+ }
367
+ const target = formatDisplayUrl(pgUrl);
368
+ // TODO: This path works in the monorepo only. For npm publishing,
369
+ // migrations would need to be bundled with the package.
370
+ const migrationsDir = join(dirname(fileURLToPath(import.meta.url)), '../../../migrations/postgres');
371
+ const sql = postgres(pgUrl);
372
+ try {
373
+ // Load migration files and check what's pending
374
+ const allFiles = loadMigrationFiles(migrationsDir);
375
+ // Ensure the migrations table exists so we can query applied versions
376
+ await sql.unsafe(`
377
+ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
378
+ version BIGINT PRIMARY KEY,
379
+ description TEXT NOT NULL,
380
+ installed_on TIMESTAMPTZ NOT NULL DEFAULT now(),
381
+ success BOOLEAN NOT NULL,
382
+ checksum BYTEA NOT NULL,
383
+ execution_time BIGINT NOT NULL
384
+ )
385
+ `);
386
+ const appliedRows = await sql.unsafe('SELECT version FROM _sqlx_migrations WHERE success = true');
387
+ const appliedVersions = new Set(appliedRows.map((r) => Number(r['version'])));
388
+ const pending = allFiles.filter((f) => !appliedVersions.has(f.version));
389
+ if (pending.length === 0) {
390
+ console.log('[taskcast] Database is up to date.');
391
+ return;
392
+ }
393
+ console.log(`[taskcast] Target: ${target}`);
394
+ console.log(`[taskcast] Pending migrations:`);
395
+ for (const file of pending) {
396
+ console.log(` ${file.filename}`);
397
+ }
398
+ if (!options.yes) {
399
+ if (!process.stdin.isTTY) {
400
+ console.error('[taskcast] No TTY detected. Re-run with --yes (-y) to skip confirmation.');
401
+ process.exit(1);
402
+ }
403
+ const confirmed = await promptConfirm(`Apply ${pending.length} migration(s) to ${target}? (Y/n) `);
404
+ if (!confirmed) {
405
+ console.log('[taskcast] Migration cancelled.');
406
+ return;
407
+ }
408
+ }
409
+ const result = await runMigrations(sql, migrationsDir);
410
+ for (const filename of result.applied) {
411
+ console.log(` Applied ${filename}`);
412
+ }
413
+ console.log(`[taskcast] Applied ${result.applied.length} migration(s) successfully.`);
414
+ }
415
+ catch (err) {
416
+ console.error(`[taskcast] Migration failed: ${err.message}`);
417
+ process.exit(1);
418
+ }
419
+ finally {
420
+ await sql.end();
421
+ }
422
+ });
171
423
  program.parse();
172
424
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Resolve a Postgres connection URL from multiple sources.
3
+ *
4
+ * Priority: --url flag > environment variable > config file value.
5
+ */
6
+ export declare function resolvePostgresUrl(options: {
7
+ url?: string | undefined;
8
+ envUrl?: string | undefined;
9
+ configUrl?: string | undefined;
10
+ }): string | undefined;
11
+ /**
12
+ * Format a Postgres URL for display, stripping credentials.
13
+ *
14
+ * Returns `host:port/dbname`. Falls back to the raw string on parse failure.
15
+ */
16
+ export declare function formatDisplayUrl(pgUrl: string): string;
17
+ //# sourceMappingURL=migrate-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-helpers.d.ts","sourceRoot":"","sources":["../src/migrate-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B,GAAG,MAAM,GAAG,SAAS,CAErB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQtD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Resolve a Postgres connection URL from multiple sources.
3
+ *
4
+ * Priority: --url flag > environment variable > config file value.
5
+ */
6
+ export function resolvePostgresUrl(options) {
7
+ return options.url ?? options.envUrl ?? options.configUrl;
8
+ }
9
+ /**
10
+ * Format a Postgres URL for display, stripping credentials.
11
+ *
12
+ * Returns `host:port/dbname`. Falls back to the raw string on parse failure.
13
+ */
14
+ export function formatDisplayUrl(pgUrl) {
15
+ try {
16
+ const parsed = new URL(pgUrl);
17
+ const dbname = parsed.pathname.replace(/^\//, '') || 'postgres';
18
+ return `${parsed.hostname}:${parsed.port || '5432'}/${dbname}`;
19
+ }
20
+ catch {
21
+ return pgUrl;
22
+ }
23
+ }
24
+ //# sourceMappingURL=migrate-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-helpers.js","sourceRoot":"","sources":["../src/migrate-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAIlC;IACC,OAAO,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAA;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAA;QAC/D,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,EAAE,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taskcast/cli",
3
- "version": "0.3.0",
3
+ "version": "1.0.0",
4
4
  "description": "Standalone Taskcast server CLI — run with npx taskcast.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,20 +32,27 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@hono/node-server": "^1.19.9",
35
+ "@hono/zod-openapi": "^0.19.10",
36
+ "hono": "^4.6.0",
35
37
  "commander": "^12.1.0",
36
38
  "ioredis": "^5.4.0",
37
39
  "postgres": "^3.4.5",
38
- "@taskcast/core": "0.3.0",
39
- "@taskcast/redis": "0.3.0",
40
- "@taskcast/server": "0.3.0",
41
- "@taskcast/sqlite": "0.3.0",
42
- "@taskcast/postgres": "0.3.0"
40
+ "@taskcast/core": "1.0.0",
41
+ "@taskcast/playground": "0.3.1",
42
+ "@taskcast/postgres": "1.0.0",
43
+ "@taskcast/redis": "1.0.0",
44
+ "@taskcast/dashboard-web": "0.3.1",
45
+ "@taskcast/server": "1.0.0",
46
+ "@taskcast/sqlite": "1.0.0"
43
47
  },
44
48
  "devDependencies": {
45
- "typescript": "^5.7.0"
49
+ "typescript": "^5.7.0",
50
+ "vitest": "^2.1.0"
46
51
  },
47
52
  "scripts": {
48
53
  "build": "tsc",
49
- "start": "node dist/index.js"
54
+ "start": "node dist/index.js",
55
+ "test": "vitest run",
56
+ "test:watch": "vitest"
50
57
  }
51
58
  }