agent-oven 0.1.0 → 0.2.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 (89) hide show
  1. package/CLAUDE.md +63 -66
  2. package/README.md +59 -43
  3. package/dist/cli/commands/add.d.ts.map +1 -1
  4. package/dist/cli/commands/add.js +29 -7
  5. package/dist/cli/commands/add.js.map +1 -1
  6. package/dist/cli/commands/daemon.d.ts.map +1 -1
  7. package/dist/cli/commands/daemon.js +16 -22
  8. package/dist/cli/commands/daemon.js.map +1 -1
  9. package/dist/cli/commands/down.d.ts +1 -1
  10. package/dist/cli/commands/down.d.ts.map +1 -1
  11. package/dist/cli/commands/down.js +12 -12
  12. package/dist/cli/commands/down.js.map +1 -1
  13. package/dist/cli/commands/status.d.ts.map +1 -1
  14. package/dist/cli/commands/status.js +11 -9
  15. package/dist/cli/commands/status.js.map +1 -1
  16. package/dist/cli/commands/up.d.ts +1 -1
  17. package/dist/cli/commands/up.d.ts.map +1 -1
  18. package/dist/cli/commands/up.js +17 -17
  19. package/dist/cli/commands/up.js.map +1 -1
  20. package/dist/cli.js +14 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/core/auth.d.ts +4 -1
  23. package/dist/core/auth.d.ts.map +1 -1
  24. package/dist/core/auth.js +20 -2
  25. package/dist/core/auth.js.map +1 -1
  26. package/dist/core/config.d.ts +0 -4
  27. package/dist/core/config.d.ts.map +1 -1
  28. package/dist/core/config.js +0 -6
  29. package/dist/core/config.js.map +1 -1
  30. package/dist/core/docker.d.ts +1 -17
  31. package/dist/core/docker.d.ts.map +1 -1
  32. package/dist/core/docker.js +148 -119
  33. package/dist/core/docker.js.map +1 -1
  34. package/dist/core/index.d.ts +2 -0
  35. package/dist/core/index.d.ts.map +1 -1
  36. package/dist/core/index.js +2 -0
  37. package/dist/core/index.js.map +1 -1
  38. package/dist/core/jobs.d.ts +1 -0
  39. package/dist/core/jobs.d.ts.map +1 -1
  40. package/dist/core/jobs.js +13 -1
  41. package/dist/core/jobs.js.map +1 -1
  42. package/dist/core/platform-darwin.d.ts +37 -0
  43. package/dist/core/platform-darwin.d.ts.map +1 -0
  44. package/dist/core/platform-darwin.js +236 -0
  45. package/dist/core/platform-darwin.js.map +1 -0
  46. package/dist/core/platform-linux.d.ts +37 -0
  47. package/dist/core/platform-linux.d.ts.map +1 -0
  48. package/dist/core/platform-linux.js +198 -0
  49. package/dist/core/platform-linux.js.map +1 -0
  50. package/dist/core/platform.d.ts +63 -0
  51. package/dist/core/platform.d.ts.map +1 -0
  52. package/dist/core/platform.js +31 -0
  53. package/dist/core/platform.js.map +1 -0
  54. package/dist/core/scheduler-runner.d.ts.map +1 -1
  55. package/dist/core/scheduler-runner.js +17 -10
  56. package/dist/core/scheduler-runner.js.map +1 -1
  57. package/dist/core/scheduler.d.ts +28 -2
  58. package/dist/core/scheduler.d.ts.map +1 -1
  59. package/dist/core/scheduler.js +126 -11
  60. package/dist/core/scheduler.js.map +1 -1
  61. package/dist/core/setup.d.ts +7 -32
  62. package/dist/core/setup.d.ts.map +1 -1
  63. package/dist/core/setup.js +14 -149
  64. package/dist/core/setup.js.map +1 -1
  65. package/dist/core/types.d.ts +17 -4
  66. package/dist/core/types.d.ts.map +1 -1
  67. package/dist/core/types.js.map +1 -1
  68. package/dist/core/update-check.d.ts +22 -0
  69. package/dist/core/update-check.d.ts.map +1 -0
  70. package/dist/core/update-check.js +184 -0
  71. package/dist/core/update-check.js.map +1 -0
  72. package/dist/tui/components/Dashboard.d.ts.map +1 -1
  73. package/dist/tui/components/Dashboard.js +19 -2
  74. package/dist/tui/components/Dashboard.js.map +1 -1
  75. package/dist/tui/components/InitWizard.d.ts.map +1 -1
  76. package/dist/tui/components/InitWizard.js +68 -54
  77. package/dist/tui/components/InitWizard.js.map +1 -1
  78. package/dist/tui/components/JobDetail.d.ts.map +1 -1
  79. package/dist/tui/components/JobDetail.js +1 -1
  80. package/dist/tui/components/JobDetail.js.map +1 -1
  81. package/dist/tui/components/JobForm.d.ts.map +1 -1
  82. package/dist/tui/components/JobForm.js +40 -23
  83. package/dist/tui/components/JobForm.js.map +1 -1
  84. package/dist/tui/components/JobList.js +3 -1
  85. package/dist/tui/components/JobList.js.map +1 -1
  86. package/images/pipeline-runner/Dockerfile +5 -1
  87. package/images/pipeline-runner/entrypoint.sh +25 -2
  88. package/package.json +5 -3
  89. package/scheduler.sh +7 -2
package/CLAUDE.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # CLAUDE.md
2
2
 
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
-
5
3
  ## Project Overview
6
4
 
7
- Agent Oven is a macOS-native job scheduler that runs Docker containers on a schedule using Colima as the container runtime. It features an interactive terminal UI (TUI) built with React/Ink for job management, and a launchd daemon that executes scheduled jobs.
5
+ Agent Oven is a job scheduler that runs Docker containers on a schedule. It features an interactive terminal UI (TUI) built with React/Ink for job management, and a platform-native daemon that executes scheduled jobs.
6
+
7
+ Supports **macOS** (launchd + Colima) and **Linux** (systemd + native Docker).
8
8
 
9
9
  **Status:** In Development
10
10
 
@@ -14,7 +14,7 @@ Agent Oven is a macOS-native job scheduler that runs Docker containers on a sche
14
14
 
15
15
  ```
16
16
  ┌─────────────────────────────────────────────────────────┐
17
- │ TUI (npm start) │
17
+ │ TUI (agent-oven) │
18
18
  │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
19
19
  │ │Dashboard│ │Job List │ │Job Form │ │ Log Viewer │ │
20
20
  │ └─────────┘ └─────────┘ └─────────┘ └─────────────┘ │
@@ -25,19 +25,17 @@ Agent Oven is a macOS-native job scheduler that runs Docker containers on a sche
25
25
  │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
26
26
  │ │ jobs.ts │ │scheduler │ │docker.ts │ │ config.ts │ │
27
27
  │ └──────────┘ └──────────┘ └──────────┘ └───────────┘ │
28
+ │ ┌──────────────┐ │
29
+ │ │ platform.ts │ (adapter interface) │
30
+ │ └──────┬───────┘ │
31
+ │ ┌──────────┴──────────┐ │
32
+ │ ┌─────────────┐ ┌──────────────┐ │
33
+ │ │platform- │ │platform- │ │
34
+ │ │darwin.ts │ │linux.ts │ │
35
+ │ │(launchd/ │ │(systemd/ │ │
36
+ │ │ Colima/brew)│ │ native docker)│ │
37
+ │ └─────────────┘ └──────────────┘ │
28
38
  └─────────────────────────────────────────────────────────┘
29
-
30
- ┌─────────────┴─────────────┐
31
- │ │
32
- ┌─────────┐ ┌───────────┐
33
- │jobs.json│ │ Docker │
34
- └─────────┘ │ (Colima) │
35
- └───────────┘
36
-
37
- ┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
38
- │ launchd │────▶│ scheduler.sh │────▶│ Docker │
39
- │ (60s interval) │ │ (daemon) │ │ (via Colima)│
40
- └─────────────────┘ └──────────────┘ └─────────────┘
41
39
  ```
42
40
 
43
41
  ## Project Structure
@@ -45,23 +43,26 @@ Agent Oven is a macOS-native job scheduler that runs Docker containers on a sche
45
43
  ```
46
44
  agent-oven/
47
45
  ├── src/
46
+ │ ├── cli/
47
+ │ │ ├── commands/ # CLI subcommands (status, list, add, run, etc.)
48
+ │ │ └── utils/ # CLI helpers (errors, output, prompts)
48
49
  │ ├── core/ # Core library (no UI dependencies)
50
+ │ │ ├── __tests__/ # Unit tests
49
51
  │ │ ├── types.ts # TypeScript interfaces
50
52
  │ │ ├── config.ts # Configuration management
51
53
  │ │ ├── jobs.ts # Job CRUD operations
52
- │ │ ├── docker.ts # Docker/Colima execution
53
- │ │ └── scheduler.ts # Cron parsing, schedule matching
54
- │ │
54
+ │ │ ├── docker.ts # Docker execution
55
+ │ │ ├── scheduler.ts # Cron parsing, schedule matching
56
+ │ │ ├── scheduler-runner.ts # Daemon tick orchestration
57
+ │ │ ├── platform.ts # Platform adapter interface + factory
58
+ │ │ ├── platform-darwin.ts # macOS: launchd, Colima, Homebrew
59
+ │ │ ├── platform-linux.ts # Linux: systemd, native Docker
60
+ │ │ └── setup.ts # Setup wizard logic
55
61
  │ ├── tui/ # Ink TUI components
56
62
  │ │ ├── App.tsx # Main app with navigation
57
- │ │ └── components/ # Dashboard, JobList, JobForm, etc.
58
-
59
- │ └── cli.tsx # Entry point
60
-
61
- ├── dist/ # Compiled JavaScript
63
+ │ │ └── components/ # Dashboard, JobList, JobForm, LogViewer, InitWizard
64
+ └── cli.tsx # Entry point (routes to commander or TUI)
62
65
  ├── images/ # Dockerfiles for pre-built images
63
- ├── scheduler.sh # Daemon (called by launchd)
64
- ├── setup.sh # Initial setup script
65
66
  ├── jobs.json # Job definitions
66
67
  ├── package.json
67
68
  └── tsconfig.json
@@ -70,48 +71,42 @@ agent-oven/
70
71
  ## Commands
71
72
 
72
73
  ```bash
73
- # Initial setup (installs Colima, Docker, builds images, creates launchd agent)
74
- ./setup.sh
75
-
76
- # Run the interactive TUI
77
- npm start
78
-
79
- # Run the interactive setup
80
- npm run init
81
-
82
- # Development mode with hot reload
83
- npm run dev
74
+ # Launch the interactive TUI (default when no args)
75
+ npm start # or: agent-oven / agent-oven tui
76
+
77
+ # Interactive setup wizard
78
+ npm run init # or: agent-oven init
79
+
80
+ # CLI subcommands
81
+ agent-oven status # System status overview (--json for machine-readable)
82
+ agent-oven list # List all jobs
83
+ agent-oven add # Add a new job
84
+ agent-oven show <id> # Show job details
85
+ agent-oven run <id> # Run a job immediately
86
+ agent-oven delete <id> # Delete a job
87
+ agent-oven toggle <id> # Toggle job enabled/disabled
88
+ agent-oven logs [id] # View job logs
89
+ agent-oven daemon status|start|stop|restart # Manage scheduler daemon
90
+ agent-oven up # Start container runtime + daemon
91
+ agent-oven down # Stop runtime + daemon
92
+
93
+ # Development
94
+ npm run dev # Hot reload
95
+ npm run build # Build TypeScript
96
+ npm run typecheck # Type check only
97
+ npm test # Run tests (vitest)
98
+ ```
84
99
 
85
- # Build TypeScript
86
- npm run build
100
+ ## Platform Support
87
101
 
88
- # Type check without building
89
- npm run typecheck
90
- ```
102
+ | | macOS | Linux |
103
+ |---|---|---|
104
+ | **Daemon** | launchd plist | systemd user service + timer |
105
+ | **Runtime** | Colima (Docker VM) | Native Docker |
106
+ | **Packages** | Homebrew | Manual install |
107
+ | **Scheduler** | `agent-oven scheduler-tick` via launchd | `agent-oven scheduler-tick` via systemd timer |
91
108
 
92
- ## TUI Keyboard Shortcuts
93
-
94
- **Dashboard:**
95
- - `j` - Go to Jobs list
96
- - `a` - Add new job
97
- - `l` - View logs
98
- - `q` - Quit
99
-
100
- **Job List:**
101
- - `↑/↓` or `j/k` - Navigate
102
- - `Enter` - View job details
103
- - `r` - Run job now
104
- - `Space` - Toggle enabled/disabled
105
- - `d` - Delete job
106
- - `/` - Filter jobs
107
- - `Esc` - Back
108
-
109
- **Log Viewer:**
110
- - `↑/↓` - Scroll
111
- - `f` - Toggle follow mode
112
- - `g/G` - Go to top/bottom
113
- - `o` - View older runs
114
- - `Esc` - Back
109
+ Platform detection is automatic via `getPlatformAdapter()` in `src/core/platform.ts`.
115
110
 
116
111
  ## Job JSON Structure
117
112
 
@@ -131,7 +126,7 @@ npm run typecheck
131
126
 
132
127
  ## Pre-built Docker Images
133
128
 
134
- Built during `./setup.sh` from `images/` directory:
129
+ Built during `agent-oven init` from `images/` directory:
135
130
 
136
131
  - **agent-oven/base-tasks**: Alpine with CLI tools (curl, jq, git, rsync, etc.)
137
132
  - **agent-oven/python-tasks**: Python 3.12 with AI/data libs (openai, anthropic, langchain, pandas)
@@ -160,5 +155,7 @@ User config stored at `~/.config/agent-oven/config.json` (XDG compliant):
160
155
  The codebase uses:
161
156
  - **TypeScript** with strict mode
162
157
  - **React 18** + **Ink 5** for the TUI
158
+ - **Commander** for CLI subcommands
163
159
  - **execa** for shell command execution
160
+ - **vitest** for testing
164
161
  - ES modules throughout (`"type": "module"`)
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/agent-oven.svg)](https://www.npmjs.com/package/agent-oven)
4
4
  [![license](https://img.shields.io/npm/l/agent-oven.svg)](https://github.com/FRE-Studios/Agent-Oven/blob/main/LICENSE)
5
5
 
6
- macOS-native job scheduler that runs Docker containers on a schedule using Colima, with an interactive terminal UI for job management.
6
+ Job scheduler that runs Docker containers on a schedule, with an interactive terminal UI for job management. Supports **macOS** (launchd + Colima) and **Linux** (systemd + native Docker).
7
7
 
8
8
  ## Install
9
9
 
@@ -14,7 +14,7 @@ npm install -g agent-oven
14
14
  Then run the interactive setup wizard and launch the TUI:
15
15
 
16
16
  ```bash
17
- agent-oven init # one-time setup (installs Colima, Docker, builds images, configures launchd)
17
+ agent-oven init # one-time setup (installs dependencies, builds images, configures daemon)
18
18
  agent-oven # launch the TUI
19
19
  ```
20
20
 
@@ -29,11 +29,13 @@ agent-oven run <id> # run a job immediately
29
29
  agent-oven toggle <id> # enable/disable a job
30
30
  agent-oven delete <id> # delete a job
31
31
  agent-oven logs [id] # view logs (scheduler or job-specific)
32
- agent-oven status # system status (Colima, Docker, daemon)
33
- agent-oven up # start Colima VM
34
- agent-oven down # stop Colima VM
35
- agent-oven daemon install # install/reinstall launchd daemon
36
- agent-oven daemon remove # remove launchd daemon
32
+ agent-oven status # system status (runtime, Docker, daemon)
33
+ agent-oven up # start container runtime + daemon
34
+ agent-oven down # stop runtime + daemon
35
+ agent-oven daemon status # check daemon status
36
+ agent-oven daemon start # start scheduler daemon
37
+ agent-oven daemon stop # stop scheduler daemon
38
+ agent-oven daemon restart # restart scheduler daemon
37
39
  ```
38
40
 
39
41
  ### From Source
@@ -50,7 +52,7 @@ npm start # launch the TUI
50
52
 
51
53
  ```
52
54
  ┌─────────────────────────────────────────────────────────┐
53
- │ TUI (npm start) │
55
+ │ TUI (agent-oven) │
54
56
  │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
55
57
  │ │Dashboard│ │Job List │ │Job Form │ │ Log Viewer │ │
56
58
  │ └─────────┘ └─────────┘ └─────────┘ └─────────────┘ │
@@ -61,41 +63,48 @@ npm start # launch the TUI
61
63
  │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
62
64
  │ │ jobs.ts │ │scheduler │ │docker.ts │ │ config.ts │ │
63
65
  │ └──────────┘ └──────────┘ └──────────┘ └───────────┘ │
66
+ │ ┌──────────────┐ │
67
+ │ │ platform.ts │ (adapter interface) │
68
+ │ └──────┬───────┘ │
69
+ │ ┌──────────┴──────────┐ │
70
+ │ ┌───────────┐ ┌────────────┐ │
71
+ │ │ darwin │ │ linux │ │
72
+ │ │ (launchd/ │ │ (systemd/ │ │
73
+ │ │ Colima) │ │ native) │ │
74
+ │ └───────────┘ └────────────┘ │
64
75
  └─────────────────────────────────────────────────────────┘
65
76
 
66
77
  ┌─────────────┴─────────────┐
67
78
  │ │
68
79
  ┌─────────┐ ┌───────────┐
69
80
  │jobs.json│ │ Docker │
70
- └─────────┘ │ (Colima) │
71
- └───────────┘
72
-
73
- ┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
74
- │ launchd │────▶│ scheduler.sh │────▶│ Docker │
75
- │ (60s interval) │ │ (daemon) │ │ (via Colima)│
76
- └─────────────────┘ └──────────────┘ └─────────────┘
81
+ └─────────┘ └───────────┘
77
82
  ```
78
83
 
79
84
  ## Prerequisites
80
85
 
81
- - macOS
86
+ **macOS:**
82
87
  - [Homebrew](https://brew.sh)
83
88
  - Node.js >= 18
84
89
 
90
+ **Linux:**
91
+ - Docker (installed and running)
92
+ - Node.js >= 18
93
+
85
94
  ## Setup (Init Wizard)
86
95
 
87
- `npm run init` launches an interactive wizard that walks through the full setup:
96
+ `agent-oven init` launches an interactive wizard that walks through the full setup. The wizard adapts to your platform automatically:
88
97
 
89
- 1. **Prerequisites check** — verifies Homebrew, Colima, Docker, and jq are installed
90
- 2. **Dependency installation** — installs any missing dependencies via Homebrew
91
- 3. **Colima VM configuration** — configure CPU, memory, and disk allocation for the VM
92
- 4. **Colima start** — starts the Colima VM with the chosen settings
93
- 5. **Docker verification** — confirms Docker is reachable through Colima
94
- 6. **File setup** — creates `logs/`, `logs/jobs/`, and `jobs.json`
95
- 7. **Image selection** — choose which pre-built Docker images to build
96
- 8. **Image building** — builds the selected Docker images
97
- 9. **Timezone configuration** — detects system timezone with option to override
98
- 10. **Launchd daemon installation** installs the scheduler as a launchd agent (runs every 60 seconds)
98
+ **Common steps:**
99
+ 1. **Prerequisites check** — verifies Docker and required tools are available
100
+ 2. **Dependency installation** — installs missing dependencies (Homebrew on macOS; manual guidance on Linux)
101
+ 3. **Docker verification** — confirms Docker is reachable
102
+ 4. **File setup** — creates `logs/`, `logs/jobs/`, and `jobs.json`
103
+ 5. **Image selection & building** — choose and build pre-built Docker images
104
+ 6. **Timezone configuration** — detects system timezone with option to override
105
+ 7. **Daemon installation** — installs the scheduler daemon (launchd on macOS, systemd user timer on Linux)
106
+
107
+ **macOS-specific:** Colima VM configuration (CPU, memory, disk) and startup.
99
108
 
100
109
  Configuration is saved to `~/.config/agent-oven/config.json`.
101
110
 
@@ -103,13 +112,13 @@ If any step fails, you can **r**etry, **s**kip, or **q**uit.
103
112
 
104
113
  ## Usage — The TUI
105
114
 
106
- `npm start` launches the interactive terminal UI. Navigate between screens using keyboard shortcuts.
115
+ `agent-oven` (or `agent-oven tui`) launches the interactive terminal UI. Navigate between screens using keyboard shortcuts.
107
116
 
108
117
  ### Dashboard
109
118
 
110
119
  The landing screen. Displays:
111
120
 
112
- - Colima and scheduler daemon status (running/stopped)
121
+ - Runtime and scheduler daemon status (running/stopped)
113
122
  - Job summary: total jobs, cron jobs, pending one-time jobs
114
123
  - Running containers
115
124
  - Last 5 job executions with status
@@ -331,7 +340,7 @@ Supported syntax: wildcards (`*`), intervals (`*/5`), ranges (`9-17`), comma-sep
331
340
 
332
341
  ## Pre-built Docker Images
333
342
 
334
- Built during `npm run init` from the `images/` directory:
343
+ Built during `agent-oven init` from the `images/` directory:
335
344
 
336
345
  | Image | Base | Contents |
337
346
  |-------|------|----------|
@@ -344,10 +353,15 @@ All images set `TZ=America/Los_Angeles` and use `/workspace` as the working dire
344
353
 
345
354
  ## How Scheduling Works
346
355
 
347
- The scheduler runs as a macOS launchd daemon that fires every 60 seconds:
356
+ The scheduler daemon fires every 60 seconds via `agent-oven scheduler-tick`:
357
+
358
+ | | macOS | Linux |
359
+ |---|---|---|
360
+ | **Daemon** | launchd plist | systemd user service + timer |
361
+ | **Runtime** | Colima (Docker VM) | Native Docker |
348
362
 
349
- 1. **launchd** triggers `scheduler.sh`
350
- 2. The script reads `jobs.json` and checks if Colima is running (starts it if needed)
363
+ 1. The daemon triggers `agent-oven scheduler-tick`
364
+ 2. It reads `jobs.json` and ensures Docker is reachable (on macOS, starts Colima if needed)
351
365
  3. For each enabled job, it evaluates the schedule against the current time
352
366
  4. Matching jobs are executed as Docker containers:
353
367
  - **Docker jobs**: run with configured image, command, volumes, env, and resource limits (default: 1 CPU, 512m memory)
@@ -384,9 +398,9 @@ Stored at `~/.config/agent-oven/config.json`:
384
398
  | Field | Description |
385
399
  |-------|-------------|
386
400
  | `projectDir` | Path to the agent-oven project directory |
387
- | `colima.cpu` | Number of CPUs for the Colima VM |
388
- | `colima.memory` | Memory in GB for the Colima VM |
389
- | `colima.disk` | Disk size in GB for the Colima VM |
401
+ | `colima.cpu` | Number of CPUs for the Colima VM (macOS only) |
402
+ | `colima.memory` | Memory in GB for the Colima VM (macOS only) |
403
+ | `colima.disk` | Disk size in GB for the Colima VM (macOS only) |
390
404
  | `docker.defaultCpus` | Default CPU limit for Docker jobs |
391
405
  | `docker.defaultMemory` | Default memory limit for Docker jobs |
392
406
  | `timezone` | Timezone for schedule evaluation |
@@ -417,22 +431,24 @@ The codebase uses TypeScript with strict mode, React 18 + Ink 5 for the TUI, exe
417
431
  ```
418
432
  agent-oven/
419
433
  ├── src/
434
+ │ ├── cli/
435
+ │ │ ├── commands/ # CLI subcommands (status, list, add, run, etc.)
436
+ │ │ └── utils/ # CLI helpers (errors, output, prompts)
420
437
  │ ├── core/ # Core library (no UI dependencies)
421
438
  │ │ ├── types.ts # TypeScript interfaces
422
439
  │ │ ├── config.ts # Configuration management
423
440
  │ │ ├── jobs.ts # Job CRUD operations
424
- │ │ ├── docker.ts # Docker/Colima execution
425
- │ │ └── scheduler.ts # Cron parsing, schedule matching
441
+ │ │ ├── docker.ts # Docker execution
442
+ │ │ ├── scheduler.ts # Cron parsing, schedule matching
443
+ │ │ ├── scheduler-runner.ts # Daemon tick orchestration
444
+ │ │ ├── platform.ts # Platform adapter interface + factory
445
+ │ │ ├── platform-darwin.ts # macOS: launchd, Colima, Homebrew
446
+ │ │ └── platform-linux.ts # Linux: systemd, native Docker
426
447
  │ ├── tui/ # Ink TUI components
427
448
  │ │ ├── App.tsx # Main app with navigation
428
449
  │ │ └── components/ # Dashboard, JobList, JobForm, etc.
429
450
  │ └── cli.tsx # Entry point
430
451
  ├── images/ # Dockerfiles for pre-built images
431
- │ ├── base-tasks/
432
- │ ├── python-tasks/
433
- │ ├── node-tasks/
434
- │ └── pipeline-runner/
435
- ├── scheduler.sh # Daemon script (called by launchd)
436
452
  ├── jobs.json # Job definitions
437
453
  ├── package.json
438
454
  └── tsconfig.json
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+J/C"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsL/C"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { requireConfig, handleError } from '../utils/errors.js';
5
5
  import { addJob, validateJob } from '../../core/jobs.js';
6
- import { validateCron } from '../../core/scheduler.js';
6
+ import { validateCron, validateRandomWindow } from '../../core/scheduler.js';
7
7
  import { success, error } from '../utils/output.js';
8
8
  function collectRepeatable(value, previous) {
9
9
  return [...previous, value];
@@ -19,8 +19,10 @@ export function register(program) {
19
19
  .option('--repo <url>', 'Git repo URL (required for pipeline type)')
20
20
  .option('--pipeline <name>', 'Pipeline name (required for pipeline type)')
21
21
  .option('--branch <branch>', 'Git branch (default: main)')
22
- .option('--schedule <cron>', 'Cron expression (mutually exclusive with --once)')
22
+ .option('--schedule <cron>', 'Cron expression (mutually exclusive with --once, --random-window)')
23
23
  .option('--once <datetime>', 'ISO 8601 datetime for one-time run')
24
+ .option('--random-window <start-end>', 'Random window in HH:MM-HH:MM format (e.g. 09:30-10:00)')
25
+ .option('--random-window-days <days>', 'Days for random-window (cron weekday syntax, default: *)')
24
26
  .option('-v, --volume <vol>', 'Volume mount (repeatable)', collectRepeatable, [])
25
27
  .option('-e, --env <kv>', 'Environment variable KEY=VALUE (repeatable)', collectRepeatable, [])
26
28
  .option('--timeout <seconds>', 'Timeout in seconds', parseInt)
@@ -30,13 +32,14 @@ export function register(program) {
30
32
  .action(async (id, opts) => {
31
33
  try {
32
34
  const config = requireConfig();
33
- // Build schedule
34
- if (!opts.schedule && !opts.once) {
35
- error('Either --schedule or --once is required');
35
+ // Build schedule — exactly one of --schedule, --once, --random-window required
36
+ const schedCount = [opts.schedule, opts.once, opts.randomWindow].filter(Boolean).length;
37
+ if (schedCount === 0) {
38
+ error('One of --schedule, --once, or --random-window is required');
36
39
  process.exit(1);
37
40
  }
38
- if (opts.schedule && opts.once) {
39
- error('--schedule and --once are mutually exclusive');
41
+ if (schedCount > 1) {
42
+ error('--schedule, --once, and --random-window are mutually exclusive');
40
43
  process.exit(1);
41
44
  }
42
45
  let schedule;
@@ -48,6 +51,25 @@ export function register(program) {
48
51
  }
49
52
  schedule = { type: 'cron', cron: opts.schedule };
50
53
  }
54
+ else if (opts.randomWindow) {
55
+ const rwMatch = opts.randomWindow.match(/^(\d{2}:\d{2})-(\d{2}:\d{2})$/);
56
+ if (!rwMatch) {
57
+ error('Invalid --random-window format (expected HH:MM-HH:MM)');
58
+ process.exit(1);
59
+ }
60
+ const rwSchedule = {
61
+ type: 'random-window',
62
+ start: rwMatch[1],
63
+ end: rwMatch[2],
64
+ ...(opts.randomWindowDays ? { days: opts.randomWindowDays } : {}),
65
+ };
66
+ const rwErr = validateRandomWindow(rwSchedule);
67
+ if (rwErr) {
68
+ error(`Invalid random-window: ${rwErr}`);
69
+ process.exit(1);
70
+ }
71
+ schedule = rwSchedule;
72
+ }
51
73
  else {
52
74
  const d = new Date(opts.once);
53
75
  if (isNaN(d.getTime())) {
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6F/C"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0F/C"}
@@ -1,11 +1,8 @@
1
1
  /**
2
2
  * `agent-oven daemon <action>` — Manage the scheduler daemon
3
3
  */
4
- import * as fs from 'node:fs';
5
- import { execa } from 'execa';
6
4
  import { handleError } from '../utils/errors.js';
7
- import { getLaunchdPlistPath } from '../../core/config.js';
8
- import { getSchedulerStatus } from '../../core/docker.js';
5
+ import { platform } from '../../core/platform.js';
9
6
  import { success, error, info, statusIcon } from '../utils/output.js';
10
7
  export function register(program) {
11
8
  const cmd = program
@@ -16,11 +13,11 @@ export function register(program) {
16
13
  .description('Show daemon status')
17
14
  .action(async () => {
18
15
  try {
19
- const plistPath = getLaunchdPlistPath();
20
- const plistExists = fs.existsSync(plistPath);
21
- const status = await getSchedulerStatus();
16
+ const configPath = platform.getDaemonConfigPath();
17
+ const configExists = platform.daemonConfigExists();
18
+ const status = await platform.getSchedulerStatus();
22
19
  console.log('\nScheduler Daemon');
23
- console.log(` Plist: ${plistExists ? statusIcon(true) + ' ' + plistPath : statusIcon(false) + ' Not found'}`);
20
+ console.log(` Config: ${configExists ? statusIcon(true) + ' ' + configPath : statusIcon(false) + ' Not found'}`);
24
21
  console.log(` Loaded: ${statusIcon(status.loaded)} ${status.loaded ? 'Yes' : 'No'}`);
25
22
  if (status.lastExitStatus !== undefined) {
26
23
  console.log(` Last exit: ${status.lastExitStatus}`);
@@ -36,17 +33,16 @@ export function register(program) {
36
33
  .description('Start the scheduler daemon')
37
34
  .action(async () => {
38
35
  try {
39
- const plistPath = getLaunchdPlistPath();
40
- if (!fs.existsSync(plistPath)) {
41
- error(`Plist not found at ${plistPath}. Run \`agent-oven init\` first.`);
36
+ if (!platform.daemonConfigExists()) {
37
+ error(`Daemon config not found at ${platform.getDaemonConfigPath()}. Run \`agent-oven init\` first.`);
42
38
  process.exit(1);
43
39
  }
44
- const status = await getSchedulerStatus();
40
+ const status = await platform.getSchedulerStatus();
45
41
  if (status.loaded) {
46
42
  info('Daemon is already loaded');
47
43
  return;
48
44
  }
49
- await execa('launchctl', ['load', plistPath]);
45
+ await platform.startDaemon();
50
46
  success('Daemon started');
51
47
  }
52
48
  catch (err) {
@@ -58,13 +54,12 @@ export function register(program) {
58
54
  .description('Stop the scheduler daemon')
59
55
  .action(async () => {
60
56
  try {
61
- const plistPath = getLaunchdPlistPath();
62
- const status = await getSchedulerStatus();
57
+ const status = await platform.getSchedulerStatus();
63
58
  if (!status.loaded) {
64
59
  info('Daemon is not loaded');
65
60
  return;
66
61
  }
67
- await execa('launchctl', ['unload', plistPath]);
62
+ await platform.stopDaemon();
68
63
  success('Daemon stopped');
69
64
  }
70
65
  catch (err) {
@@ -76,17 +71,16 @@ export function register(program) {
76
71
  .description('Restart the scheduler daemon')
77
72
  .action(async () => {
78
73
  try {
79
- const plistPath = getLaunchdPlistPath();
80
- if (!fs.existsSync(plistPath)) {
81
- error(`Plist not found at ${plistPath}. Run \`agent-oven init\` first.`);
74
+ if (!platform.daemonConfigExists()) {
75
+ error(`Daemon config not found at ${platform.getDaemonConfigPath()}. Run \`agent-oven init\` first.`);
82
76
  process.exit(1);
83
77
  }
84
- const status = await getSchedulerStatus();
78
+ const status = await platform.getSchedulerStatus();
85
79
  if (status.loaded) {
86
- await execa('launchctl', ['unload', plistPath]);
80
+ await platform.stopDaemon();
87
81
  info('Daemon stopped');
88
82
  }
89
- await execa('launchctl', ['load', plistPath]);
83
+ await platform.startDaemon();
90
84
  success('Daemon started');
91
85
  }
92
86
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `agent-oven down` — Stop daemon + Colima
2
+ * `agent-oven down` — Stop daemon + runtime
3
3
  */
4
4
  import type { Command } from 'commander';
5
5
  export declare function register(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/down.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C/C"}
1
+ {"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/down.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C/C"}