- Initialize Elixir project with Ash and Ash Postgres.
- Install and configure Ash Encryption.
- Add Oban and Oban Web.
- Create Ash resource: Environment.
- Create Ash resource: Variable.
- Attributes: name, encrypted_value, environment_id.
- Create Ash resource: Command.
- Attributes: name, shell_command, cron_expression, environment_id.
- Create Ash resource: CommandExecutionEvent.
- Attributes: command_id, status, started_at, finished_at, duration_ms, stdout, stderr.
- Configure Oban with crontab support.
- Implement Ash action to sync Command.cron_expression to Oban crontab.
- Ensure updates re-register schedules dynamically.
- Implement Oban Worker:
- Load Command by ID.
- Resolve variables for environment.
- Interpolate $VARIABLE references.
- Execute shell command using System.cmd or Port.
- Capture stdout and stderr separately.
- Measure execution time.
- Emit CommandExecutionEvent records for:
- started
- succeeded
- failed
- Initialize React app with shadcn/ui.
- Integrate Ash TypeScript client.
- Build UI screens:
- Environments
- Variables / Secrets
- Commands + Schedule Editor
- Execution History
- Ensure secrets never logged.
- Add retry and timeout handling in workers.
- Verify Oban Web visibility.
- Add indexes on execution events.
- Encode all steps as tasks for coding agent.
- Enforce no REST endpoints — Ash resources only.