hermes-jobctl
Declarative Hermes cron jobs from Markdown files: YAML front matter for metadata and a Markdown body as the Hermes agent prompt—think apply/delete/status for cron specs.
Requirements
- Python 3.10+
- The
hermesCLI onPATH, or override withHERMES_JOBCTL_HERMES_BIN
Installation
From PyPI
pip install hermes-jobctl
From source
With uv
From a checkout of this repository:
cd /path/to/hermes-jobctl
uv sync
Run the CLI via the managed environment:
uv run hermes-jobctl --help
Editable install still bound to your tree:
uv pip install -e .
With pip
Inside the repo:
pip install .
pip install -e '.[dev]' # editable + dev deps
Hermes plugin registration
Note: there is currently an upstream bug in Hermes CLI plugin command registration (
register_cli_commandwiring). See NousResearch/hermes-agent#13643.
Until the official fix lands, prefer the standalonehermes-jobctlCLI path for reliable usage.
Install this plugin from Hermes registry:
hermes plugins install mikewei/hermes-plugin-jobctl
Or copy the hermes_jobctl directory to ~/.hermes/plugins manually and enable it.
Quick Start
Command naming depends on installation method:
- Plugin install uses
hermes jobctl ... - pip/uv install uses
hermes-jobctl ...(oruv run hermes-jobctl ...from the project directory) - Due to current upstream CLI plugin registration issues,
hermes-jobctl ...is the recommended path before upstream fix is merged.
# Scaffold a spec next to cwd
hermes-jobctl new nightly-report --schedule "every 24h" --dir .
# Edit nightly-report.md: set YAML header and write the Markdown prompt body
# Push spec to Hermes cron
hermes-jobctl apply ./nightly-report.md
# See sync state vs jobs.json
hermes-jobctl status ./nightly-report.md
Notes:
- You can pass multiple paths; each argument may be a
.mdfile or a directory (every*.mdin that directory, non-recursive). - See
Spec formatat the bottom ofhermes-jobctl --helpfor the full field list.
Front matter (YAML header)
Everything between the first --- and the closing --- is YAML. Do not put the Hermes prompt in YAML—put it below the closing --- as Markdown.
| Field | Required | Description |
|---|---|---|
type |
yes | Task kind. Only hermes-cron is supported today (reserved for future kinds). |
schedule |
yes | Hermes cron schedule string (e.g. 30m, every 2h, 0 9 * * *). |
name |
no | Job name; default: filename without .md. |
deliver |
no | Passed to Hermes --deliver; omit for default. |
repeat |
no | Integer; omit or ≤0 → unlimited per Hermes rules. |
skills |
no | List or single string → multiple --skill. |
script |
no | Maps to --script. |
workdir |
no | Maps to --workdir (often absolute). |
suspend |
no | If true, apply then pause job to match (default false). |
Any other YAML keys are ignored (not forwarded to Hermes).
Example spec file
Repository copy: examples/sample-cron-task.md.
---
type: hermes-cron
schedule: "every 24h"
deliver: local
suspend: false
---
Example scheduled task for Hermes cron. Copy and edit as needed.
- Summarize open todos in three short sections.
- If anything is blocked, call it out in one line.
(No `skills` in this sample; add `skills: [your-skill]` in the YAML header if you need them.)
Commands
| Command | Purpose |
|---|---|
apply PATHS… |
Create or update jobs from .md files and/or directories (non‑recursive *.md each). |
delete PATHS… | delete --name NAME |
Remove a job by spec path(s) or by job name. |
status PATHS… |
Compare specs to jobs.json (sync / pending_apply / missing, etc.). |
get |
List jobs in jobs.json (optional --name, --json). |
new TASK |
Scaffold a starter spec (--schedule, --dir / -o/--output, --stdout, --force). |
Common flags: -p/--profile, --hermes-bin, -v/--verbose; apply / delete also support --accept-hooks.
hermes-jobctl apply ./examples/sample-cron-task.md
hermes-jobctl status ./examples/
hermes-jobctl delete ./examples/sample-cron-task.md
hermes-jobctl delete --name my-job
hermes-jobctl new my-task --schedule "every 24h"
Profile resolution
Resolution order for which Hermes home / jobs.json is used:
- CLI
--profile(default→ unnamed profile) - Environment variable
HERMES_JOBCTL_PROFILE - If
cwdis under~/.hermes/profiles/<name>/…, infer<name>
Each run prints a short line on stderr, e.g. profile: default.
Development
uv sync --extra dev && uv run pytest
# or: pip install -e '.[dev]' && pytest
Distribution name hermes-jobctl in pyproject.toml [project]; console entry point hermes-jobctl.
Metadata
Release files for hermes-jobctl 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| hermes_jobctl-0.1.1.tar.gz | 37.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hermes_jobctl-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.6 kB
Release files / hermes_jobctl-0.1.1.tar.gz
| Download URL | hermes_jobctl-0.1.1.tar.gz |
|---|---|
| Size | 37.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
50ce518f2473140590af477e1afb55b8b792466e696e6522dcb962af19f826df
|
|
BLAKE2b-256 checksum How to use checksums |
8345aa2244ad0ccfd8616b6ac814c8cf814324781982672d1a3f4193bc49e186
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / hermes_jobctl-0.1.1-py3-none-any.whl
| Download URL | hermes_jobctl-0.1.1-py3-none-any.whl |
|---|---|
| Size | 23.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fadc47002b0ccebf9fa1edaf5cad46f7b1805dfae8b3f73b7e9a66d46bd28abc
|
|
BLAKE2b-256 checksum How to use checksums |
dd0f6fd18ee36b2e547f75470171cbfd94edcf6b976c5ddcbac98ebc70a1684c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Security for hermes-jobctl 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.