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.
- package/CLAUDE.md +63 -66
- package/README.md +59 -43
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +29 -7
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +16 -22
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/down.d.ts +1 -1
- package/dist/cli/commands/down.d.ts.map +1 -1
- package/dist/cli/commands/down.js +12 -12
- package/dist/cli/commands/down.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +11 -9
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/up.d.ts +1 -1
- package/dist/cli/commands/up.d.ts.map +1 -1
- package/dist/cli/commands/up.js +17 -17
- package/dist/cli/commands/up.js.map +1 -1
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/auth.d.ts +4 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +20 -2
- package/dist/core/auth.js.map +1 -1
- package/dist/core/config.d.ts +0 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/docker.d.ts +1 -17
- package/dist/core/docker.d.ts.map +1 -1
- package/dist/core/docker.js +148 -119
- package/dist/core/docker.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/jobs.d.ts +1 -0
- package/dist/core/jobs.d.ts.map +1 -1
- package/dist/core/jobs.js +13 -1
- package/dist/core/jobs.js.map +1 -1
- package/dist/core/platform-darwin.d.ts +37 -0
- package/dist/core/platform-darwin.d.ts.map +1 -0
- package/dist/core/platform-darwin.js +236 -0
- package/dist/core/platform-darwin.js.map +1 -0
- package/dist/core/platform-linux.d.ts +37 -0
- package/dist/core/platform-linux.d.ts.map +1 -0
- package/dist/core/platform-linux.js +198 -0
- package/dist/core/platform-linux.js.map +1 -0
- package/dist/core/platform.d.ts +63 -0
- package/dist/core/platform.d.ts.map +1 -0
- package/dist/core/platform.js +31 -0
- package/dist/core/platform.js.map +1 -0
- package/dist/core/scheduler-runner.d.ts.map +1 -1
- package/dist/core/scheduler-runner.js +17 -10
- package/dist/core/scheduler-runner.js.map +1 -1
- package/dist/core/scheduler.d.ts +28 -2
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +126 -11
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/setup.d.ts +7 -32
- package/dist/core/setup.d.ts.map +1 -1
- package/dist/core/setup.js +14 -149
- package/dist/core/setup.js.map +1 -1
- package/dist/core/types.d.ts +17 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/update-check.d.ts +22 -0
- package/dist/core/update-check.d.ts.map +1 -0
- package/dist/core/update-check.js +184 -0
- package/dist/core/update-check.js.map +1 -0
- package/dist/tui/components/Dashboard.d.ts.map +1 -1
- package/dist/tui/components/Dashboard.js +19 -2
- package/dist/tui/components/Dashboard.js.map +1 -1
- package/dist/tui/components/InitWizard.d.ts.map +1 -1
- package/dist/tui/components/InitWizard.js +68 -54
- package/dist/tui/components/InitWizard.js.map +1 -1
- package/dist/tui/components/JobDetail.d.ts.map +1 -1
- package/dist/tui/components/JobDetail.js +1 -1
- package/dist/tui/components/JobDetail.js.map +1 -1
- package/dist/tui/components/JobForm.d.ts.map +1 -1
- package/dist/tui/components/JobForm.js +40 -23
- package/dist/tui/components/JobForm.js.map +1 -1
- package/dist/tui/components/JobList.js +3 -1
- package/dist/tui/components/JobList.js.map +1 -1
- package/images/pipeline-runner/Dockerfile +5 -1
- package/images/pipeline-runner/entrypoint.sh +25 -2
- package/package.json +5 -3
- 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
|
|
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 (
|
|
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
|
|
53
|
-
│ │
|
|
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,
|
|
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
|
-
#
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
#
|
|
77
|
-
npm
|
|
78
|
-
|
|
79
|
-
#
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
#
|
|
83
|
-
|
|
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
|
-
|
|
86
|
-
npm run build
|
|
100
|
+
## Platform Support
|
|
87
101
|
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
|
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
|
[](https://www.npmjs.com/package/agent-oven)
|
|
4
4
|
[](https://github.com/FRE-Studios/Agent-Oven/blob/main/LICENSE)
|
|
5
5
|
|
|
6
|
-
|
|
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
|
|
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 (
|
|
33
|
-
agent-oven up # start
|
|
34
|
-
agent-oven down # stop
|
|
35
|
-
agent-oven daemon
|
|
36
|
-
agent-oven 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 (
|
|
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
|
-
└─────────┘
|
|
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
|
-
|
|
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
|
-
`
|
|
96
|
+
`agent-oven init` launches an interactive wizard that walks through the full setup. The wizard adapts to your platform automatically:
|
|
88
97
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
`
|
|
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
|
-
-
|
|
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 `
|
|
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
|
|
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.
|
|
350
|
-
2.
|
|
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
|
|
425
|
-
│ │
|
|
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,
|
|
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"}
|
package/dist/cli/commands/add.js
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
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 (
|
|
39
|
-
error('--schedule and --
|
|
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":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGpD,SAAS,iBAAiB,CAAC,KAAa,EAAE,QAAkB;IAC1D,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,eAAe,CAAC;SAC5B,cAAc,CAAC,eAAe,EAAE,yBAAyB,CAAC;SAC1D,MAAM,CAAC,eAAe,EAAE,qCAAqC,EAAE,QAAQ,CAAC;SACxE,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;SACpE,MAAM,CAAC,iBAAiB,EAAE,iEAAiE,CAAC;SAC5F,MAAM,CAAC,cAAc,EAAE,2CAA2C,CAAC;SACnE,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,mEAAmE,CAAC;SAChG,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;SACjE,MAAM,CAAC,6BAA6B,EAAE,wDAAwD,CAAC;SAC/F,MAAM,CAAC,6BAA6B,EAAE,0DAA0D,CAAC;SACjG,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,EAAE,CAAC;SAChF,MAAM,CAAC,gBAAgB,EAAE,6CAA6C,EAAE,iBAAiB,EAAE,EAAE,CAAC;SAC9F,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,CAAC;SAC7D,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;SAC1D,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAkB1B,EAAE,EAAE;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAE/B,+EAA+E;YAC/E,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YACxF,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,QAAkB,CAAC;YACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,OAAO,EAAE,CAAC;oBACZ,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnD,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACzE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,KAAK,CAAC,uDAAuD,CAAC,CAAC;oBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,UAAU,GAAyB;oBACvC,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;oBACjB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;oBACf,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClE,CAAC;gBACF,MAAM,KAAK,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAC/C,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,QAAQ,GAAG,UAAU,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBACvB,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAK,EAAE,CAAC;YACpD,CAAC;YAED,mBAAmB;YACnB,MAAM,GAAG,GAA2B,EAAE,CAAC;YACvC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjB,KAAK,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;oBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,kBAAkB;YAClB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7D,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC,CAAC,SAAS,CAAC;YAEd,oBAAoB;YACpB,IAAI,UAAyB,CAAC;YAE9B,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACnB,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,UAAU,GAAG;oBACX,EAAE;oBACF,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,gBAAgB;oBACtB,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;oBAChD,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ;oBACR,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ;oBACvB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChB,KAAK,CAAC,qCAAqC,CAAC,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,KAAK,CAAC,uCAAuC,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,6CAA6C;gBAC7C,IAAI,OAA0B,CAAC;gBAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC;wBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACrC,CAAC;oBAAC,MAAM,CAAC;wBACP,KAAK,CAAC,kCAAkC,CAAC,CAAC;wBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBACzB,CAAC;gBAED,UAAU,GAAG;oBACX,EAAE;oBACF,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,OAAO;oBACP,QAAQ;oBACR,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ;oBACvB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC;YACJ,CAAC;YAED,WAAW;YACX,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,KAAK,CAAC,CAAC,CAAC,CAAC;gBACX,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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 {
|
|
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
|
|
20
|
-
const
|
|
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(`
|
|
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
|
-
|
|
40
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
80
|
-
|
|
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
|
|
80
|
+
await platform.stopDaemon();
|
|
87
81
|
info('Daemon stopped');
|
|
88
82
|
}
|
|
89
|
-
await
|
|
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":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/down.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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"}
|