human-approved implementer for hermes-nightshift-glm. kanban triage, model lanes, quota-gated GLM execution, Codex execution, and guarded PR repair.
dayshift is the companion implementer for hermes-nightshift-glm. Nightshift creates issues and PRs. Dayshift scans those outputs, classifies what is actionable, puts them on a local kanban board, and only runs an executor after a human moves a card into an execution lane.
- scan: reads open GitHub issues and PRs that look like Nightshift output
- classify: scores each item for fixability, risk, effort, and approval path
- triage: stores local state in
~/.dayshift/state.jsonand renders a jKanban board - approve: human moves cards into model-specific execution lanes
- execute: runs Codex or Hermes/GLM with the issue or PR context
- validate: installs lockfile dependencies when needed and runs detected tests/checks
- output: issue cards create Dayshift PRs; PR cards can be repaired or merged when policy allows
Dayshift is intentionally conservative:
scan ──→ classify ──→ board ──→ execution lane ──→ agent ──→ validate ──→ PR/merge
│ │ │
└──── local state ┘ └── failed → retry lane
- local board state is the source of truth: GitHub labels are best-effort sync, but stale labels do not override local moves
- execution lanes are explicit: a lane chooses model, command, run policy, reasoning effort, and whether to merge after execution
- terminal work stays off the board: closed, merged, skipped, ignored, and done records remain in state but do not clutter kanban
- failed means real execution failure: label sync noise is hidden and missing old labels are treated as already-clean
requires a GitHub token that can read issues/PRs, apply labels, push branches, and create PRs in the target repos.
mkdir -p ~/dayshift-workspace ~/.dayshift
curl -sL https://raw.githubusercontent.com/Microck/hermes-dayshift-glm/main/dayshift.py > ~/dayshift-workspace/dayshift.py
curl -sL https://raw.githubusercontent.com/Microck/hermes-dayshift-glm/main/scripts/hermes-agent-runner.py > ~/dayshift-workspace/hermes-agent-runner.py
chmod +x ~/dayshift-workspace/dayshift.py ~/dayshift-workspace/hermes-agent-runner.pysave a GitHub token:
printf '%s\n' 'github-token-here' > ~/.dayshift/.gh-token-dayshift
chmod 600 ~/.dayshift/.gh-token-dayshiftscan, run once, or serve the board:
python3 ~/dayshift-workspace/dayshift.py scan
python3 ~/dayshift-workspace/dayshift.py run
python3 ~/dayshift-workspace/dayshift.py serve --host 127.0.0.1 --port 3001The web UI is local-first and intentionally small. It supports:
- model-specific execution columns such as
execute: GLM 5.1andexecute: GPT 5.3 Codex - per-card executor notes, injected into the next agent prompt as human guidance
- local search and bulk selection
- red
xclose action that closes the GitHub issue or PR - yellow
/ignore action that hides a card locally without closing GitHub - bulk move, skip, and close actions
Default visible board order:
issue inboxPR inbox- one
execute: <model>column per configured lane readyandmerge, shown only when human merge approval is neededin-progressfailed, only for real executor or validation errors
done and skip are workflow states, not visible columns. Those records are retained in ~/.dayshift/state.json for auditability.
The default lanes are:
| lane | model | runner | policy |
|---|---|---|---|
dayshift/execute-glm-5-1 |
glm-5.1 |
Hermes Agent adapter | waits for GLM quota window |
dayshift/execute-gpt-5-3-codex |
gpt-5.3-codex |
Codex CLI | runs immediately |
The GLM lane uses scripts/hermes-agent-runner.py, which passes a prompt file to hermes chat --query. The Codex lane streams the prompt through stdin with:
codex exec --model gpt-5.3-codex -Dayshift detects common project shapes before accepting agent output:
- Python tests:
python3 -m unittest discover - pnpm repos:
pnpm install --frozen-lockfile, thenpnpm test - Bun repos:
bun install --frozen-lockfile, thenbun test - Yarn repos:
yarn install --frozen-lockfile, thenyarn test - npm repos:
npm ci, thennpm test - CMake repos: configure, build, then
ctest --output-on-failure
You can override this with validation_commands in config.
Dayshift reads ~/.dayshift/config.json. If the file does not exist, defaults are used.
{
"target_repos": [],
"repo_discovery_mode": "dayshift",
"exclude_repos": ["*-backup"],
"public_only": true,
"max_inactive_days": 30,
"min_size_kb": 10,
"max_repos_to_consider": 30,
"max_prs_per_repo": 2,
"github_token_file": "~/.dayshift/.gh-token-dayshift",
"nightshift_token_file": "~/.nightshift/.gh-token-nightshift",
"kanban_enabled": true,
"scheduler_enabled": true,
"scheduler_interval_seconds": 30,
"glm_quota_command": "python3 ~/nightshift-workspace/glm_quota.py --check",
"validation_commands": [],
"merge_method": "squash"
}The settings page exposes execution lanes, token file paths, scheduler options, merge policy, repo discovery, and validation commands.
python3 dayshift.py config-path
python3 dayshift.py scan
python3 dayshift.py scan --apply-labels
python3 dayshift.py run
python3 dayshift.py serve --host 127.0.0.1 --port 3001Environment override:
DAYSHIFT_TARGET_REPOS=Microck/hermes-nightshift-glm python3 dayshift.py scan| file | description |
|---|---|
dayshift.py |
scanner, classifier, scheduler, kanban UI, executor orchestration |
scripts/hermes-agent-runner.py |
non-interactive Hermes Agent adapter for GLM lanes |
test_dayshift.py |
unit tests for parsing, state, kanban rendering, scheduler, execution lanes, validation |
architecture.md |
design notes for scanner, labels, board, executor, and merge policy |
classifier.md |
classifier heuristics and risk model |
input-sources.md |
GitHub input source notes |
kanban.md |
board model and workflow labels |
roadmap.md |
implementation roadmap |
if a user asks you to install or run hermes-dayshift-glm:
-
create directories:
mkdir -p ~/dayshift-workspace ~/.dayshift
-
download
dayshift.pyandscripts/hermes-agent-runner.pyfrom this repo -
ensure a GitHub token exists at
~/.dayshift/.gh-token-dayshift -
scan a narrow target first:
DAYSHIFT_TARGET_REPOS=Microck/hermes-nightshift-glm python3 ~/dayshift-workspace/dayshift.py scan -
start the board:
python3 ~/dayshift-workspace/dayshift.py serve --host 127.0.0.1 --port 3001 -
move cards into execution lanes only after reviewing title, summary, risk, and approach
Never publish ~/.dayshift/config.json, ~/.dayshift/state.json, GitHub tokens, Hermes config, BrowserStack credentials, or agent runtime logs.
