@delorenj/pjangler 1.4.6 → 1.5.3
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/README.md +41 -596
- package/dist/assets/project-notebook-skill/SHA256SUMS +5 -5
- package/dist/assets/project-notebook-skill/export-manifest.json +5 -5
- package/dist/assets/project-notebook-skill/hooks/session-end.sh +20 -1
- package/dist/assets/project-notebook-skill/hooks/session-start.sh +20 -1
- package/dist/assets/project-notebook-skill/references/configuration.md +2 -0
- package/dist/assets/project-notebook-skill/scripts/project-hooks.py +33 -3
- package/dist/assets/project-notebook-skill/tests/test_project_hooks.py +37 -0
- package/dist/index.js +9385 -18379
- package/dist/mcp-server.js +9432 -17852
- package/dist/notebook/journal-service-main.js +5682 -0
- package/dist/project-registry-service.js +748 -0
- package/dist/prompt.js +2 -1
- package/package.json +15 -10
- package/scripts/install-project-registry.mjs +34 -0
- package/scripts/migrate-project-registry.mjs +117 -0
- package/src/project/registryClient.ts +62 -0
- package/templates/commonproject/copier.yml +16 -19
- package/templates/commonproject/template/.agents/hooks/README.md +10 -4
- package/templates/commonproject/template/.agents/hooks/hermes/hindsight-hook.sh +12 -2
- package/templates/commonproject/template/.agents/hooks/hooks.master.json +10 -10
- package/templates/commonproject/template/.agents/hooks/lib/hook-guard.sh +13 -0
- package/templates/commonproject/template/.agents/hooks/sync.py +66 -17
- package/templates/commonproject/template/.agents/skills.json +0 -1
- package/templates/commonproject/template/.github/workflows/code-review.yml.jinja +7 -1
- package/templates/commonproject/template/.project.json.jinja +1 -1
- package/templates/commonproject/template/mise.toml.jinja +11 -21
- package/contracts/fleet-contract.yaml +0 -584
- package/templates/commonproject/template/.mise/scripts/provision-packs.py +0 -587
- package/templates/commonproject/template/.mise/scripts/sync-skills.py +0 -2183
- package/templates/hermes-agent/copier.yml +0 -186
- package/templates/hermes-agent/template/.gitignore.jinja +0 -11
- package/templates/hermes-agent/template/.runtime-scaffold/.gitattributes +0 -10
- package/templates/hermes-agent/template/.runtime-scaffold/.gitignore.jinja +0 -44
- package/templates/hermes-agent/template/.runtime-scaffold/README.md +0 -56
- package/templates/hermes-agent/template/.runtime-scaffold/decisions/.gitkeep +0 -2
- package/templates/hermes-agent/template/.runtime-scaffold/logs/.gitkeep +0 -1
- package/templates/hermes-agent/template/.runtime-scaffold/memories/MEMORY.md +0 -50
- package/templates/hermes-agent/template/.runtime-scaffold/memories/USER.md +0 -51
- package/templates/hermes-agent/template/.scripts/00-banner.sh +0 -21
- package/templates/hermes-agent/template/.scripts/01-config.sh +0 -60
- package/templates/hermes-agent/template/.scripts/05-fleet-env.sh +0 -42
- package/templates/hermes-agent/template/.scripts/10-hermes-profile.sh +0 -222
- package/templates/hermes-agent/template/.scripts/20-runtime-repo.sh +0 -199
- package/templates/hermes-agent/template/.scripts/30-telegram.sh +0 -363
- package/templates/hermes-agent/template/.scripts/31-slack.sh +0 -457
- package/templates/hermes-agent/template/.scripts/40-plane.sh +0 -60
- package/templates/hermes-agent/template/.scripts/42-ticket-provider.sh +0 -373
- package/templates/hermes-agent/template/.scripts/60-bloodbank.sh +0 -18
- package/templates/hermes-agent/template/.scripts/70-systemd.sh +0 -354
- package/templates/hermes-agent/template/.scripts/80-registry.sh +0 -185
- package/templates/hermes-agent/template/.scripts/99-summary.sh +0 -87
- package/templates/hermes-agent/template/.scripts/_lib.sh +0 -1138
- package/templates/hermes-agent/template/.scripts/channel-transaction.py +0 -2340
- package/templates/hermes-agent/template/.scripts/checkpoint.sh +0 -82
- package/templates/hermes-agent/template/.scripts/config.example.toml +0 -70
- package/templates/hermes-agent/template/.scripts/credential-launch.sh +0 -85
- package/templates/hermes-agent/template/.scripts/heartbeat.sh +0 -283
- package/templates/hermes-agent/template/.scripts/lib/fleet-env.sh +0 -202
- package/templates/hermes-agent/template/.scripts/lib/parse-fleet-env.py +0 -761
- package/templates/hermes-agent/template/.scripts/lib/profile-config-lock.py +0 -182
- package/templates/hermes-agent/template/.scripts/lib/profile-config-seed.py +0 -108
- package/templates/hermes-agent/template/.scripts/lib/ticket-provider.sh +0 -199
- package/templates/hermes-agent/template/.scripts/lib/voice-config.py +0 -546
- package/templates/hermes-agent/template/.scripts/lifecycle.sh +0 -126
- package/templates/hermes-agent/template/.scripts/momo-wip-lock.py +0 -137
- package/templates/hermes-agent/template/.scripts/providers/linear.sh +0 -329
- package/templates/hermes-agent/template/.scripts/providers/plane.sh +0 -671
- package/templates/hermes-agent/template/.scripts/providers/trello.sh +0 -241
- package/templates/hermes-agent/template/.scripts/reporter-watchdog.py +0 -242
- package/templates/hermes-agent/template/.scripts/secret-scan.py +0 -134
- package/templates/hermes-agent/template/.scripts/sentinel/bin/emit-event.py +0 -106
- package/templates/hermes-agent/template/.scripts/sentinel/bin/issue-autonomous-review.sh +0 -339
- package/templates/hermes-agent/template/.scripts/sentinel/bin/issue-close-gate.sh +0 -179
- package/templates/hermes-agent/template/.scripts/sentinel/docs/autonomous-delegated-review.md +0 -162
- package/templates/hermes-agent/template/.scripts/sentinel/docs/bloodbank-events.md +0 -42
- package/templates/hermes-agent/template/.scripts/sentinel/docs/continuous-ticket-orchestration.md +0 -77
- package/templates/hermes-agent/template/.scripts/sentinel.prompt.md.jinja +0 -116
- package/templates/hermes-agent/template/.scripts/store-onepassword-secret.py +0 -260
- package/templates/hermes-agent/template/SOUL.md.jinja +0 -197
- package/templates/hermes-agent/template/hermes.jinja +0 -109
- package/templates/hermes-agent/template/momo.jinja +0 -177
- package/templates/hermes-agent/template/role.yaml.jinja +0 -112
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
# hermes-agent-template
|
|
2
|
-
# https://copier.readthedocs.io/
|
|
3
|
-
#
|
|
4
|
-
# Provisions a single Hermes agent role into an existing repository.
|
|
5
|
-
#
|
|
6
|
-
# Usage:
|
|
7
|
-
# cd /path/to/your-project
|
|
8
|
-
# copier copy gh:delorenj/hermes-agent-template ./agents/hermes/pm \
|
|
9
|
-
# --data role=pm
|
|
10
|
-
#
|
|
11
|
-
# What it does:
|
|
12
|
-
# 1. Renders agents/hermes/<role>/{role.yaml, SOUL.md, hermes, .scripts/}
|
|
13
|
-
# 2. Creates ignored local state at agents/hermes/<role>/runtime/ and delegates
|
|
14
|
-
# named-profile wiring to `pj migrate hermes.runtime-singleton`
|
|
15
|
-
# 4. Creates a Plane project in 33god workspace
|
|
16
|
-
# 6. Verifies a BotFather token, stores it in 1Password, and maps an op:// reference
|
|
17
|
-
# 7. Optionally does the same for a dedicated Slack app+bot pair
|
|
18
|
-
# 8. Records fleet-shared Bloodbank routing identity (no profile consumer)
|
|
19
|
-
# 9. Installs a profile gateway + heartbeat timer (reconcile + checkpoint)
|
|
20
|
-
# 10. Appends to ~/.hermes/agents-registry.yaml
|
|
21
|
-
#
|
|
22
|
-
# Environment-specific defaults (Hermes binary path, legacy archive owner, Plane
|
|
23
|
-
# workspace/URL, NATS endpoint, skills dir, …) are NOT hardcoded — they live in
|
|
24
|
-
# ~/.config/hermes-agent-template/config.toml, seeded from config.example.toml on
|
|
25
|
-
# first run. Edit that file to retarget the template for a different machine/user.
|
|
26
|
-
|
|
27
|
-
_min_copier_version: "9.0.0"
|
|
28
|
-
_subdirectory: template
|
|
29
|
-
_templates_suffix: .jinja
|
|
30
|
-
_envops:
|
|
31
|
-
block_start_string: "{%"
|
|
32
|
-
block_end_string: "%}"
|
|
33
|
-
variable_start_string: "{{"
|
|
34
|
-
variable_end_string: "}}"
|
|
35
|
-
comment_start_string: "{#"
|
|
36
|
-
comment_end_string: "#}"
|
|
37
|
-
_exclude:
|
|
38
|
-
- "**/__pycache__"
|
|
39
|
-
- "**/*.pyc"
|
|
40
|
-
- "**/*.pyo"
|
|
41
|
-
|
|
42
|
-
# ─── Questions (only what we can't derive) ───────────────────────────────
|
|
43
|
-
|
|
44
|
-
target_repo:
|
|
45
|
-
type: str
|
|
46
|
-
help: "Name of the project repo this agent belongs to"
|
|
47
|
-
validator: "{% if not target_repo %}Required{% endif %}"
|
|
48
|
-
# No default — must be provided explicitly via --data or interactively.
|
|
49
|
-
# Path-based auto-derivation is unreliable across relative/absolute dst_path.
|
|
50
|
-
|
|
51
|
-
role:
|
|
52
|
-
type: str
|
|
53
|
-
help: "Role for this agent (safe single path segment; arbitrary roles are supported)"
|
|
54
|
-
default: pm
|
|
55
|
-
validator: >-
|
|
56
|
-
{% set alnum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' -%}
|
|
57
|
-
{% set safe_chars = alnum ~ '._-' -%}
|
|
58
|
-
{% if not role or role != role|trim or role in ['.', '..'] or role[0] not in alnum or role[-1] not in alnum or role|reject('in', safe_chars)|list|length -%}
|
|
59
|
-
Role must be a non-empty safe single path segment using letters, numbers, dots, underscores, or hyphens
|
|
60
|
-
{%- endif %}
|
|
61
|
-
|
|
62
|
-
ticket_provider:
|
|
63
|
-
type: str
|
|
64
|
-
help: "Ticket system this agent's board lives in"
|
|
65
|
-
default: plane
|
|
66
|
-
choices:
|
|
67
|
-
"Linear": linear
|
|
68
|
-
"Plane": plane
|
|
69
|
-
"Trello": trello
|
|
70
|
-
|
|
71
|
-
agent_purpose:
|
|
72
|
-
type: str
|
|
73
|
-
help: "One-line description of what this agent does in this repo"
|
|
74
|
-
default: "{% if role == 'reporter' %}Company-wide evidence gathering, freshness-aware daily reporting, and critical delivery monitoring{% elif role == 'director' %}Company-level portfolio orchestration, delegation, and cross-project control{% else %}Project management, triage, and continuous board reconciliation{% endif %}"
|
|
75
|
-
|
|
76
|
-
model_provider:
|
|
77
|
-
type: str
|
|
78
|
-
help: "Inference provider (empty = inherit from global ~/.hermes config)"
|
|
79
|
-
default: ""
|
|
80
|
-
|
|
81
|
-
model_name:
|
|
82
|
-
type: str
|
|
83
|
-
help: "Model name (empty = inherit from global ~/.hermes config)"
|
|
84
|
-
default: ""
|
|
85
|
-
|
|
86
|
-
model_base_url:
|
|
87
|
-
type: str
|
|
88
|
-
help: "Per-agent model API base URL (empty = inherit from shared config)"
|
|
89
|
-
default: ""
|
|
90
|
-
|
|
91
|
-
model_api_mode:
|
|
92
|
-
type: str
|
|
93
|
-
help: "Per-agent model API protocol (empty = inherit from shared config)"
|
|
94
|
-
default: ""
|
|
95
|
-
choices:
|
|
96
|
-
"Inherit from shared config": ""
|
|
97
|
-
"OpenAI-compatible chat completions": chat_completions
|
|
98
|
-
"OpenAI Codex responses": codex_responses
|
|
99
|
-
"Anthropic messages": anthropic_messages
|
|
100
|
-
"AWS Bedrock converse": bedrock_converse
|
|
101
|
-
"Codex app server": codex_app_server
|
|
102
|
-
|
|
103
|
-
model_key_env:
|
|
104
|
-
type: str
|
|
105
|
-
help: "Environment variable NAME holding the per-agent model key (never the key value)"
|
|
106
|
-
default: ""
|
|
107
|
-
|
|
108
|
-
soul_tone:
|
|
109
|
-
type: str
|
|
110
|
-
help: "Tone for the agent's SOUL.md"
|
|
111
|
-
default: direct
|
|
112
|
-
choices:
|
|
113
|
-
- direct
|
|
114
|
-
- playful
|
|
115
|
-
- formal
|
|
116
|
-
- terse
|
|
117
|
-
|
|
118
|
-
reconcile_enabled:
|
|
119
|
-
type: bool
|
|
120
|
-
help: "Run autonomous PM ticket-board reconciliation from the heartbeat timer"
|
|
121
|
-
default: true
|
|
122
|
-
|
|
123
|
-
# ─── Derived (never asked) ───────────────────────────────────────────────
|
|
124
|
-
|
|
125
|
-
agent_id:
|
|
126
|
-
type: str
|
|
127
|
-
default: "{{ target_repo }}-{{ role }}"
|
|
128
|
-
when: false
|
|
129
|
-
|
|
130
|
-
display_name:
|
|
131
|
-
type: str
|
|
132
|
-
# Short roles (pm, dev, ops, qa, ci) get uppercased; longer ones get title-cased.
|
|
133
|
-
default: "{{ target_repo|title }} {% if role|length <= 3 %}{{ role|upper }}{% else %}{{ role|title }}{% endif %}"
|
|
134
|
-
when: false
|
|
135
|
-
|
|
136
|
-
bot_handle:
|
|
137
|
-
type: str
|
|
138
|
-
default: "{{ target_repo|lower|replace('-','_') }}_{{ role|lower }}_bot"
|
|
139
|
-
when: false
|
|
140
|
-
|
|
141
|
-
runtime_repo:
|
|
142
|
-
type: str
|
|
143
|
-
default: "agent-hm-{{ target_repo|lower }}-{{ role|lower }}"
|
|
144
|
-
when: false
|
|
145
|
-
|
|
146
|
-
runtime_repo_owner:
|
|
147
|
-
type: str
|
|
148
|
-
# Legacy archive identity only. Empty by default — resolved at provision time from
|
|
149
|
-
# ~/.config/hermes-agent-template/config.toml [github].runtime_repo_owner.
|
|
150
|
-
# Pass --data runtime_repo_owner=<owner> to override per-run.
|
|
151
|
-
default: ""
|
|
152
|
-
when: false
|
|
153
|
-
|
|
154
|
-
plane_workspace:
|
|
155
|
-
type: str
|
|
156
|
-
# Empty by default — resolved at provision time from
|
|
157
|
-
# ~/.config/hermes-agent-template/config.toml [plane].workspace.
|
|
158
|
-
default: ""
|
|
159
|
-
when: false
|
|
160
|
-
|
|
161
|
-
# ─── Post-generation tasks ───────────────────────────────────────────────
|
|
162
|
-
# Order matters. Each script logs to .scripts/.provision.log.
|
|
163
|
-
# All scripts are idempotent — safe to re-run if a step fails.
|
|
164
|
-
|
|
165
|
-
_tasks:
|
|
166
|
-
- "chmod +x .scripts/*.sh .scripts/sentinel/bin/*.sh hermes momo 2>/dev/null || true"
|
|
167
|
-
- "./.scripts/00-banner.sh"
|
|
168
|
-
- "./.scripts/01-config.sh"
|
|
169
|
-
- "./.scripts/05-fleet-env.sh"
|
|
170
|
-
- "./.scripts/10-hermes-profile.sh"
|
|
171
|
-
- "./.scripts/20-runtime-repo.sh"
|
|
172
|
-
- "./.scripts/30-telegram.sh"
|
|
173
|
-
- "./.scripts/31-slack.sh"
|
|
174
|
-
- "./.scripts/42-ticket-provider.sh"
|
|
175
|
-
- "./.scripts/60-bloodbank.sh"
|
|
176
|
-
- "./.scripts/70-systemd.sh"
|
|
177
|
-
- "./.scripts/80-registry.sh"
|
|
178
|
-
- "./.scripts/99-summary.sh"
|
|
179
|
-
|
|
180
|
-
_skip_if_exists:
|
|
181
|
-
# role.yaml contains verified channel identities and explicit operator
|
|
182
|
-
# choices (including reconcile_enabled=false). A forced Copier refresh must
|
|
183
|
-
# preserve those durable values; the idempotent tasks below reconcile any
|
|
184
|
-
# newly-required fields and lifecycle assets around them.
|
|
185
|
-
- role.yaml
|
|
186
|
-
- runtime
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Per-role ignores in agents/hermes/{{ role }}/
|
|
2
|
-
|
|
3
|
-
# The local runtime contains mutable agent state and secrets. It is never a
|
|
4
|
-
# project submodule or publishable project content.
|
|
5
|
-
runtime/
|
|
6
|
-
|
|
7
|
-
# Provisioning logs are host-local as well.
|
|
8
|
-
.scripts/.provision.log
|
|
9
|
-
.scripts/.last-run
|
|
10
|
-
.scripts/.done-*
|
|
11
|
-
.scripts/.plane-project-id
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# Route binary state through git-lfs so the checkpoint repo doesn't bloat.
|
|
2
|
-
*.db filter=lfs diff=lfs merge=lfs -text
|
|
3
|
-
*.sqlite filter=lfs diff=lfs merge=lfs -text
|
|
4
|
-
*.sqlite3 filter=lfs diff=lfs merge=lfs -text
|
|
5
|
-
*.png filter=lfs diff=lfs merge=lfs -text
|
|
6
|
-
*.jpg filter=lfs diff=lfs merge=lfs -text
|
|
7
|
-
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
|
8
|
-
*.wav filter=lfs diff=lfs merge=lfs -text
|
|
9
|
-
*.mp3 filter=lfs diff=lfs merge=lfs -text
|
|
10
|
-
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Per-agent runtime — what NOT to commit to the checkpoint repo.
|
|
2
|
-
# Sensitive credentials never go in git.
|
|
3
|
-
.env
|
|
4
|
-
.env.*
|
|
5
|
-
!.env.example
|
|
6
|
-
auth.json
|
|
7
|
-
auth.lock
|
|
8
|
-
secrets.*
|
|
9
|
-
*.pem
|
|
10
|
-
*.key
|
|
11
|
-
gateway.pid
|
|
12
|
-
gateway_state.json
|
|
13
|
-
processes.json
|
|
14
|
-
interrupt_debug.log
|
|
15
|
-
|
|
16
|
-
# Caches (large, regenerable)
|
|
17
|
-
audio_cache/
|
|
18
|
-
image_cache/
|
|
19
|
-
models_dev_cache.json
|
|
20
|
-
context_length_cache.yaml
|
|
21
|
-
honcho.json
|
|
22
|
-
|
|
23
|
-
# Sandboxes (ephemeral execution environments)
|
|
24
|
-
sandboxes/
|
|
25
|
-
|
|
26
|
-
# Heartbeat / sentinel ephemeral state — local to this runtime, never checkpointed.
|
|
27
|
-
# (Keeps the fused checkpoint a true no-op on a clean tree.)
|
|
28
|
-
continuous-ticket-sentinel-state.json
|
|
29
|
-
continuous-ticket-sentinel.lock
|
|
30
|
-
continuous-ticket-sentinel.lock.d/
|
|
31
|
-
.last-checkpoint
|
|
32
|
-
|
|
33
|
-
# Runtime logs (we want the LFS-tracked summary.log if we add one, not the noise)
|
|
34
|
-
logs/*.log
|
|
35
|
-
logs/*.systemd.log
|
|
36
|
-
|
|
37
|
-
# Python cruft
|
|
38
|
-
__pycache__/
|
|
39
|
-
*.pyc
|
|
40
|
-
.scripts/.done-*
|
|
41
|
-
.scripts/.provision.log
|
|
42
|
-
|
|
43
|
-
# Allow these subdirs to exist
|
|
44
|
-
!logs/.gitkeep
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# {{agent_id}} — runtime
|
|
2
|
-
|
|
3
|
-
This is the ignored, role-owned state for the **{{display_name}}** agent. The
|
|
4
|
-
actual HERMES_HOME is a real named directory under `~/.hermes/profiles/`, with
|
|
5
|
-
PJangler-managed links into this runtime. Back it up separately; it is not
|
|
6
|
-
published by project Git.
|
|
7
|
-
|
|
8
|
-
## What's in here
|
|
9
|
-
|
|
10
|
-
| Path | Tracked? | Purpose |
|
|
11
|
-
| --- | --- | --- |
|
|
12
|
-
| `config.yaml` | local | Legacy seed/delta; shared profile config comes from fleet root |
|
|
13
|
-
| `SOUL.md` | local | The agent's personality, evolves over time |
|
|
14
|
-
| `memories/MEMORY.md` | local | The condensed mental-model summary loaded each session |
|
|
15
|
-
| `memories/USER.md` | local | The operator's persona |
|
|
16
|
-
| `sessions/sessions.db` | local | SQLite store of conversations |
|
|
17
|
-
| `decisions/` | local | Agent-emitted decisions |
|
|
18
|
-
| `.env` | **no** | API keys + Telegram bot token (per-machine secret) |
|
|
19
|
-
| `auth.json` | **no** | Deprecated local OAuth store; named profiles use fleet auth fallback |
|
|
20
|
-
| `audio_cache/`, `image_cache/` | **no** | Regenerable caches |
|
|
21
|
-
| `sandboxes/` | **no** | Per-session ephemeral execution dirs |
|
|
22
|
-
|
|
23
|
-
Bloodbank ingress is fleet-shared. The fleet gateway discovers this profile
|
|
24
|
-
through `~/.hermes/agents-registry.yaml` and routes commands by
|
|
25
|
-
`data.target_agent_id`; this runtime has no consumer process or inbox bridge.
|
|
26
|
-
|
|
27
|
-
## Checkpoint cadence
|
|
28
|
-
|
|
29
|
-
- Heartbeat: systemd `--user` timer `hermes-{{agent_id}}-heartbeat.timer`. Each
|
|
30
|
-
tick reconciles the ticket board (the PM's sentinel pass) and then, gated to
|
|
31
|
-
at most once an hour, checkpoints this runtime.
|
|
32
|
-
- On session end: hermes Stop hook (TODO: hook script in `~/.hermes/hooks/`)
|
|
33
|
-
|
|
34
|
-
The heartbeat runner lives in the parent's `.scripts/heartbeat.sh`; it calls
|
|
35
|
-
`.scripts/checkpoint.sh` internally, which `git add -A`, commits only if dirty,
|
|
36
|
-
and pushes to `origin`.
|
|
37
|
-
|
|
38
|
-
## Restoring on a new machine
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
cd /path/to/parent-project
|
|
42
|
-
git submodule update --init --recursive
|
|
43
|
-
git -C agents/hermes/{{role}}/runtime lfs pull
|
|
44
|
-
# Provide the per-runtime secrets the submodule deliberately excluded:
|
|
45
|
-
cp ~/path/to/your/.env agents/hermes/{{role}}/runtime/.env
|
|
46
|
-
# OAuth provider credentials are shared across the fleet. If needed, login once:
|
|
47
|
-
agents/hermes/{{role}}/hermes auth add openai-codex
|
|
48
|
-
agents/hermes/{{role}}/hermes status
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## DO NOT manually edit on multiple machines
|
|
52
|
-
|
|
53
|
-
This repo is a single-writer system. Either run the agent on machine A or
|
|
54
|
-
machine B — not both. The checkpoint commit will fast-forward; concurrent
|
|
55
|
-
edits cause merge pain. If you really need to fork the agent (e.g. for
|
|
56
|
-
experimentation), branch this repo.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# keep logs/ in the repo so per-agent log paths exist on first checkout
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# MEMORY.md — {{agent_id}}
|
|
2
|
-
|
|
3
|
-
This file is loaded by the gateway at the start of every session. Keep it
|
|
4
|
-
short and high-signal — anything that should ALWAYS be in context.
|
|
5
|
-
|
|
6
|
-
## Identity
|
|
7
|
-
|
|
8
|
-
You are **{{display_name}}**, the `{{role}}` agent for the `{{repo}}` repo.
|
|
9
|
-
Your scope is the repo at the project root. You communicate via Telegram
|
|
10
|
-
(`@{{repo}}_{{role}}_bot`) and canonical Bloodbank repo events on
|
|
11
|
-
`bloodbank.evt.repo.>`, filtered by `data.repo = {{repo}}`.
|
|
12
|
-
|
|
13
|
-
## Operator
|
|
14
|
-
|
|
15
|
-
Jarad DeLorenzo. One-man dev team. Pivots hard and fast — when documentation
|
|
16
|
-
disagrees with reality, trust reality (the codebase, `git log`, `llr`/`find`
|
|
17
|
-
sorted by mtime). Prefers direct, decision-forward communication. Never
|
|
18
|
-
re-explains what the diff already shows. Hates "I'll help you with that"
|
|
19
|
-
preambles.
|
|
20
|
-
|
|
21
|
-
## DeloNet conventions you respect at all times
|
|
22
|
-
|
|
23
|
-
- LAN: `192.168.1.0/24`. Host machine `big-chungus` = `192.168.1.12`.
|
|
24
|
-
Tailscale IP `100.66.29.76`. **Never hardcode `10.0.0.x`** — that's stale
|
|
25
|
-
Xfinity-era data.
|
|
26
|
-
- External access: `*.delo.sh` via Cloudflare Tunnel
|
|
27
|
-
(`6dfd95af-6e2a-4833-84b8-e0a1fda5da4a`). Container-to-container uses
|
|
28
|
-
Docker service names.
|
|
29
|
-
- Secrets: `op://DeLoSecrets/<item>/<field>`, `~/.config/zshyzsh/secrets.zsh`
|
|
30
|
-
(exported), or project-local `.env`. Default creds:
|
|
31
|
-
`$DEFAULT_USERNAME` / `$DEFAULT_PASSWORD`.
|
|
32
|
-
- Hindsight memory: durable cross-session facts go in
|
|
33
|
-
`hindsight memory retain {{repo}} "..." --context <category>`. This file
|
|
34
|
-
is the runtime/session-start summary; Hindsight is the long-term store.
|
|
35
|
-
|
|
36
|
-
## Bloodbank events you emit
|
|
37
|
-
|
|
38
|
-
Always emit envelope-shaped events with `actor.agent_id = {{agent_id}}` and
|
|
39
|
-
`producer = hermes-agent:{{agent_id}}` for every consequential action.
|
|
40
|
-
Event type format: `bloodbank.<domain>.<entity>.<action>` (4 tokens,
|
|
41
|
-
lowercase, past-tense action for events). The NATS subject inserts a kind
|
|
42
|
-
marker as segment 2 — `bloodbank.<evt|cmd|rpy>.<domain>.<entity>.<action>`
|
|
43
|
-
(5 tokens). There is no version token in either shape; a breaking payload
|
|
44
|
-
change earns a new action or entity, never a `v<n>` segment. Naming spec
|
|
45
|
-
lives at `~/code/33GOD/bloodbank/docs/event-naming.md`.
|
|
46
|
-
|
|
47
|
-
## Recent context
|
|
48
|
-
|
|
49
|
-
(This section gets updated by the agent itself as work progresses.
|
|
50
|
-
Treat the bottom-most entry as the most relevant.)
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# USER.md — Jarad DeLorenzo
|
|
2
|
-
|
|
3
|
-
The operator behind this agent. Loaded into context at session start so the
|
|
4
|
-
agent doesn't have to re-discover who it's working with.
|
|
5
|
-
|
|
6
|
-
## Identity
|
|
7
|
-
|
|
8
|
-
- Name: Jarad DeLorenzo
|
|
9
|
-
- Email: jaradd@gmail.com (personal), jarad@automaticai.io (business)
|
|
10
|
-
- GitHub: `delorenj`
|
|
11
|
-
- Telegram: see `TELEGRAM_ALLOWED_USERS` in this agent's `.env`
|
|
12
|
-
- Role: One-man dev team running the 33GOD ecosystem and delonet homelab
|
|
13
|
-
|
|
14
|
-
## How Jarad works
|
|
15
|
-
|
|
16
|
-
- Pivots fast — instructions and architecture choices can flip between
|
|
17
|
-
sessions. Trust *current* code and `git log` over older documentation.
|
|
18
|
-
- Prefers terse responses, decision-forward. No throat-clearing. No
|
|
19
|
-
"I'll help you with that". When unsure, asks one specific question, not
|
|
20
|
-
three vague ones.
|
|
21
|
-
- Wants agents to act, then report. Not act, then ask if it was OK.
|
|
22
|
-
- Uses Hindsight for durable memory. Expects agents to retain useful learnings
|
|
23
|
-
themselves rather than waiting to be asked.
|
|
24
|
-
- Tracks confidence with `llr` (= `fdfind --type f --hidden --exclude .git -X
|
|
25
|
-
ls -lt --time=ctime -r`). Newer mtime = more authoritative.
|
|
26
|
-
|
|
27
|
-
## Tooling he ships with
|
|
28
|
-
|
|
29
|
-
- Copier (`gh:delorenj/CommonProject`) for new project bootstrap
|
|
30
|
-
- BMAD method (`_bmad/`, `_bmad_output/`) for spec-driven work
|
|
31
|
-
- Plane (`plane.delo.sh`) for ticket tracking — workspaces: 33god,
|
|
32
|
-
lasertoast, intelliforia
|
|
33
|
-
- Bloodbank for cross-agent event flow
|
|
34
|
-
- Hindsight for shared memory (banks: per-repo, `infra`, `33GOD`)
|
|
35
|
-
- 1Password CLI (`op`) for all secrets
|
|
36
|
-
- mise for env management
|
|
37
|
-
|
|
38
|
-
## What he hates
|
|
39
|
-
|
|
40
|
-
- Stale documentation that contradicts current state
|
|
41
|
-
- Manual setup steps that should be scripted
|
|
42
|
-
- Backwards-compatibility shims for code that just shipped
|
|
43
|
-
- Long preambles before the actual answer
|
|
44
|
-
- Hardcoded paths/IPs that break on the next machine
|
|
45
|
-
|
|
46
|
-
## What he loves
|
|
47
|
-
|
|
48
|
-
- Single source of truth (Holyfields-style schema registries)
|
|
49
|
-
- Reproducible bootstrap (Copier + provision scripts)
|
|
50
|
-
- Auto-checkpointed state (this very runtime repo!)
|
|
51
|
-
- Agents that emit Bloodbank events so the rest of the system can react
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Print the welcome banner and the role we're provisioning.
|
|
3
|
-
# shellcheck source=_lib.sh
|
|
4
|
-
source "$(dirname "$0")/_lib.sh"
|
|
5
|
-
load_role_env
|
|
6
|
-
|
|
7
|
-
cat >&2 <<EOF
|
|
8
|
-
|
|
9
|
-
╭─ Hermes Agent Provisioning ────────────────────────────────────────────╮
|
|
10
|
-
│ agent_id $AGENT_ID
|
|
11
|
-
│ repo $REPO
|
|
12
|
-
│ role $ROLE
|
|
13
|
-
│ display $DISPLAY_NAME
|
|
14
|
-
│ telegram @$BOT_HANDLE (one bot per agent)
|
|
15
|
-
│ plane $PLANE_WORKSPACE workspace
|
|
16
|
-
│ runtime $ROLE_DIR/runtime (pure-local, ignored)
|
|
17
|
-
│ profile ~/.hermes/profiles/$PROFILE_NAME
|
|
18
|
-
╰────────────────────────────────────────────────────────────────────────╯
|
|
19
|
-
|
|
20
|
-
EOF
|
|
21
|
-
mark_done 00-banner
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Ensure the distributable config exists before any other step reads it.
|
|
3
|
-
# Seeds ~/.config/hermes-agent-template/config.toml from the shipped example.
|
|
4
|
-
|
|
5
|
-
# MCP render transactions establish repo-local lifecycle eligibility before
|
|
6
|
-
# touching any host-global state. This guard must precede _lib.sh because that
|
|
7
|
-
# library creates the role log and may read fleet configuration.
|
|
8
|
-
if [[ "${SKIP_HOST_STATE:-0}" == "1" ]]; then
|
|
9
|
-
printf '%s\n' '[01] host config — DEFERRED (SKIP_HOST_STATE=1)' >&2
|
|
10
|
-
exit 0
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
# shellcheck source=_lib.sh
|
|
14
|
-
source "$(dirname "$0")/_lib.sh"
|
|
15
|
-
|
|
16
|
-
already_done 01-config && { log "[01] config already checked — skipping"; exit 0; }
|
|
17
|
-
|
|
18
|
-
CONFIG="$HERMES_TEMPLATE_CONFIG"
|
|
19
|
-
EXAMPLE="$ROLE_DIR/.scripts/config.example.toml"
|
|
20
|
-
|
|
21
|
-
if [[ -f "$CONFIG" ]]; then
|
|
22
|
-
log "[01] config present: $CONFIG"
|
|
23
|
-
else
|
|
24
|
-
mkdir -p "$(dirname "$CONFIG")"
|
|
25
|
-
if [[ -f "$EXAMPLE" ]]; then
|
|
26
|
-
cp "$EXAMPLE" "$CONFIG"
|
|
27
|
-
log "[01] seeded $CONFIG from shipped example"
|
|
28
|
-
else
|
|
29
|
-
# Last-resort minimal config if the example didn't ship with this agent.
|
|
30
|
-
cat > "$CONFIG" <<'TOML'
|
|
31
|
-
# hermes-agent-template config — edit for your environment.
|
|
32
|
-
[fleet]
|
|
33
|
-
hermes_bin = "~/.local/share/hermes-agent/releases/0408fec7a153e6c32c064acd2b8053917f1525f1/.venv/bin/hermes"
|
|
34
|
-
hermes_repo = "~/.local/share/hermes-agent/releases/0408fec7a153e6c32c064acd2b8053917f1525f1"
|
|
35
|
-
hermes_git_url = "https://github.com/delorenj/hermes-agent.git"
|
|
36
|
-
hermes_git_ref = "main"
|
|
37
|
-
hermes_git_sha = "0408fec7a153e6c32c064acd2b8053917f1525f1"
|
|
38
|
-
fleet_env = "~/.hermes/fleet.env"
|
|
39
|
-
registry_file = "~/.hermes/agents-registry.yaml"
|
|
40
|
-
canonical_skills_dir = "/home/delorenj/.agents/skills"
|
|
41
|
-
|
|
42
|
-
[github]
|
|
43
|
-
runtime_repo_owner = "delorenj"
|
|
44
|
-
|
|
45
|
-
[plane]
|
|
46
|
-
base = "https://plane.delo.sh"
|
|
47
|
-
workspace = "33god"
|
|
48
|
-
|
|
49
|
-
[bloodbank]
|
|
50
|
-
nats_host = "127.0.0.1"
|
|
51
|
-
nats_port = 4222
|
|
52
|
-
compose_dir = "~/code/33GOD/bloodbank"
|
|
53
|
-
TOML
|
|
54
|
-
log "[01] wrote built-in default config to $CONFIG"
|
|
55
|
-
fi
|
|
56
|
-
warn "[01] review $CONFIG and set values for YOUR environment"
|
|
57
|
-
warn " (hermes_bin, runtime_repo_owner, plane.base/workspace, …) before relying on defaults"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
mark_done 01-config
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Ensure a single shared fleet source-of-truth file exists.
|
|
3
|
-
|
|
4
|
-
if [[ "${SKIP_HOST_STATE:-0}" == "1" ]]; then
|
|
5
|
-
printf '%s\n' '[05] fleet env — DEFERRED (SKIP_HOST_STATE=1)' >&2
|
|
6
|
-
exit 0
|
|
7
|
-
fi
|
|
8
|
-
|
|
9
|
-
# shellcheck source=_lib.sh
|
|
10
|
-
source "$(dirname "$0")/_lib.sh"
|
|
11
|
-
load_role_env
|
|
12
|
-
|
|
13
|
-
already_done 05-fleet-env && log "[05] fleet env already checked — refreshing shared keys"
|
|
14
|
-
|
|
15
|
-
mkdir -p "$(dirname "$FLEET_ENV")"
|
|
16
|
-
|
|
17
|
-
new_fleet_env=0
|
|
18
|
-
if [[ ! -f "$FLEET_ENV" ]]; then
|
|
19
|
-
log "[05] creating fleet source-of-truth: $FLEET_ENV"
|
|
20
|
-
new_fleet_env=1
|
|
21
|
-
else
|
|
22
|
-
log "[05] fleet env exists: $FLEET_ENV"
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
fleet_env_parser="$ROLE_DIR/.scripts/lib/parse-fleet-env.py"
|
|
26
|
-
fleet_env_python="$(builtin type -P python3)" \
|
|
27
|
-
|| die "python3 is required to update the fleet source-of-truth"
|
|
28
|
-
|
|
29
|
-
upsert_fleet_env() {
|
|
30
|
-
local key="$1" value="$2"
|
|
31
|
-
"$fleet_env_python" -I "$fleet_env_parser" --upsert "$FLEET_ENV" "$key" "$value"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if [[ "$new_fleet_env" == "1" ]]; then
|
|
35
|
-
upsert_fleet_env HERMES_FLEET_BIN "$HERMES_BIN"
|
|
36
|
-
upsert_fleet_env HERMES_FLEET_REPO "$HERMES_AGENT_REPO"
|
|
37
|
-
upsert_fleet_env HERMES_FLEET_REGISTRY_FILE "$REGISTRY_FILE"
|
|
38
|
-
fi
|
|
39
|
-
upsert_fleet_env HERMES_FLEET_OAUTH_FILE "$HERMES_OAUTH_FILE"
|
|
40
|
-
upsert_fleet_env HERMES_FLEET_CODEX_HOME "$CODEX_HOME"
|
|
41
|
-
|
|
42
|
-
mark_done 05-fleet-env
|