@delorenj/pjangler 1.4.5 → 1.5.2

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.
Files changed (83) hide show
  1. package/README.md +41 -520
  2. package/dist/assets/project-notebook-skill/SHA256SUMS +5 -5
  3. package/dist/assets/project-notebook-skill/export-manifest.json +5 -5
  4. package/dist/assets/project-notebook-skill/hooks/session-end.sh +20 -1
  5. package/dist/assets/project-notebook-skill/hooks/session-start.sh +20 -1
  6. package/dist/assets/project-notebook-skill/references/configuration.md +2 -0
  7. package/dist/assets/project-notebook-skill/scripts/project-hooks.py +33 -3
  8. package/dist/assets/project-notebook-skill/tests/test_project_hooks.py +37 -0
  9. package/dist/index.js +5747 -13483
  10. package/dist/mcp-server.js +6853 -14059
  11. package/dist/notebook/journal-service-main.js +5682 -0
  12. package/dist/project-registry-service.js +748 -0
  13. package/dist/prompt.js +2 -1
  14. package/package.json +15 -10
  15. package/scripts/install-project-registry.mjs +34 -0
  16. package/scripts/migrate-project-registry.mjs +117 -0
  17. package/src/project/registryClient.ts +62 -0
  18. package/templates/commonproject/copier.yml +16 -19
  19. package/templates/commonproject/template/.agents/hooks/README.md +10 -4
  20. package/templates/commonproject/template/.agents/hooks/hermes/hindsight-hook.sh +12 -2
  21. package/templates/commonproject/template/.agents/hooks/hooks.master.json +10 -10
  22. package/templates/commonproject/template/.agents/hooks/lib/hook-guard.sh +13 -0
  23. package/templates/commonproject/template/.agents/hooks/sync.py +66 -17
  24. package/templates/commonproject/template/.agents/skills.json +0 -1
  25. package/templates/commonproject/template/.github/workflows/code-review.yml.jinja +7 -1
  26. package/templates/commonproject/template/.project.json.jinja +1 -1
  27. package/templates/commonproject/template/mise.toml.jinja +11 -21
  28. package/contracts/fleet-contract.yaml +0 -513
  29. package/templates/commonproject/template/.mise/scripts/provision-packs.py +0 -587
  30. package/templates/commonproject/template/.mise/scripts/sync-skills.py +0 -2183
  31. package/templates/hermes-agent/copier.yml +0 -186
  32. package/templates/hermes-agent/template/.gitignore.jinja +0 -11
  33. package/templates/hermes-agent/template/.runtime-scaffold/.gitattributes +0 -10
  34. package/templates/hermes-agent/template/.runtime-scaffold/.gitignore.jinja +0 -44
  35. package/templates/hermes-agent/template/.runtime-scaffold/README.md +0 -56
  36. package/templates/hermes-agent/template/.runtime-scaffold/decisions/.gitkeep +0 -2
  37. package/templates/hermes-agent/template/.runtime-scaffold/logs/.gitkeep +0 -1
  38. package/templates/hermes-agent/template/.runtime-scaffold/memories/MEMORY.md +0 -50
  39. package/templates/hermes-agent/template/.runtime-scaffold/memories/USER.md +0 -51
  40. package/templates/hermes-agent/template/.scripts/00-banner.sh +0 -21
  41. package/templates/hermes-agent/template/.scripts/01-config.sh +0 -60
  42. package/templates/hermes-agent/template/.scripts/05-fleet-env.sh +0 -42
  43. package/templates/hermes-agent/template/.scripts/10-hermes-profile.sh +0 -222
  44. package/templates/hermes-agent/template/.scripts/20-runtime-repo.sh +0 -199
  45. package/templates/hermes-agent/template/.scripts/30-telegram.sh +0 -363
  46. package/templates/hermes-agent/template/.scripts/31-slack.sh +0 -457
  47. package/templates/hermes-agent/template/.scripts/40-plane.sh +0 -60
  48. package/templates/hermes-agent/template/.scripts/42-ticket-provider.sh +0 -373
  49. package/templates/hermes-agent/template/.scripts/60-bloodbank.sh +0 -18
  50. package/templates/hermes-agent/template/.scripts/70-systemd.sh +0 -354
  51. package/templates/hermes-agent/template/.scripts/80-registry.sh +0 -185
  52. package/templates/hermes-agent/template/.scripts/99-summary.sh +0 -87
  53. package/templates/hermes-agent/template/.scripts/_lib.sh +0 -1138
  54. package/templates/hermes-agent/template/.scripts/channel-transaction.py +0 -2340
  55. package/templates/hermes-agent/template/.scripts/checkpoint.sh +0 -82
  56. package/templates/hermes-agent/template/.scripts/config.example.toml +0 -70
  57. package/templates/hermes-agent/template/.scripts/credential-launch.sh +0 -85
  58. package/templates/hermes-agent/template/.scripts/heartbeat.sh +0 -283
  59. package/templates/hermes-agent/template/.scripts/lib/fleet-env.sh +0 -202
  60. package/templates/hermes-agent/template/.scripts/lib/parse-fleet-env.py +0 -761
  61. package/templates/hermes-agent/template/.scripts/lib/profile-config-lock.py +0 -182
  62. package/templates/hermes-agent/template/.scripts/lib/profile-config-seed.py +0 -108
  63. package/templates/hermes-agent/template/.scripts/lib/ticket-provider.sh +0 -199
  64. package/templates/hermes-agent/template/.scripts/lib/voice-config.py +0 -546
  65. package/templates/hermes-agent/template/.scripts/lifecycle.sh +0 -126
  66. package/templates/hermes-agent/template/.scripts/momo-wip-lock.py +0 -137
  67. package/templates/hermes-agent/template/.scripts/providers/linear.sh +0 -329
  68. package/templates/hermes-agent/template/.scripts/providers/plane.sh +0 -671
  69. package/templates/hermes-agent/template/.scripts/providers/trello.sh +0 -241
  70. package/templates/hermes-agent/template/.scripts/reporter-watchdog.py +0 -242
  71. package/templates/hermes-agent/template/.scripts/secret-scan.py +0 -134
  72. package/templates/hermes-agent/template/.scripts/sentinel/bin/emit-event.py +0 -106
  73. package/templates/hermes-agent/template/.scripts/sentinel/bin/issue-autonomous-review.sh +0 -339
  74. package/templates/hermes-agent/template/.scripts/sentinel/bin/issue-close-gate.sh +0 -179
  75. package/templates/hermes-agent/template/.scripts/sentinel/docs/autonomous-delegated-review.md +0 -162
  76. package/templates/hermes-agent/template/.scripts/sentinel/docs/bloodbank-events.md +0 -42
  77. package/templates/hermes-agent/template/.scripts/sentinel/docs/continuous-ticket-orchestration.md +0 -77
  78. package/templates/hermes-agent/template/.scripts/sentinel.prompt.md.jinja +0 -116
  79. package/templates/hermes-agent/template/.scripts/store-onepassword-secret.py +0 -260
  80. package/templates/hermes-agent/template/SOUL.md.jinja +0 -197
  81. package/templates/hermes-agent/template/hermes.jinja +0 -109
  82. package/templates/hermes-agent/template/momo.jinja +0 -177
  83. 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,2 +0,0 @@
1
- # Agents drop one markdown file per important decision here.
2
- # Filename convention: YYYY-MM-DD-HHMMSS-<slug>.md
@@ -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