@delorenj/pjangler 1.2.18 → 1.2.19
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/dist/index.js +244 -6
- package/dist/mcp-server.js +245 -7
- package/package.json +8 -2
- package/templates/commonproject/AGENTS.md +3 -3
- package/templates/commonproject/README.md +11 -12
- package/templates/commonproject/copier.yml +8 -27
- package/templates/commonproject/template/.project.json.jinja +9 -13
- package/templates/hermes-agent/README.md +9 -9
- package/templates/hermes-agent/config.example.toml +1 -66
- package/templates/hermes-agent/copier.yml +4 -3
- package/templates/hermes-agent/docs/architecture.md +9 -12
- package/templates/hermes-agent/docs/fleet-control-plane/README.md +1 -1
- package/templates/hermes-agent/docs/operations.md +6 -5
- package/templates/hermes-agent/docs/sentinel/README.md +9 -7
- package/templates/hermes-agent/docs/sentinel/architecture.md +1 -2
- package/templates/hermes-agent/docs/sentinel/development.md +12 -13
- package/templates/hermes-agent/docs/sentinel/providers.md +34 -15
- package/templates/hermes-agent/install-local.sh +15 -14
- package/templates/hermes-agent/runtime-scaffold/README.md +1 -1
- package/templates/hermes-agent/runtime-scaffold/bloodbank-consumer.py +46 -14
- package/templates/hermes-agent/runtime-scaffold/memories/MEMORY.md +2 -2
- package/templates/hermes-agent/scripts/fleet-sync.sh +1 -64
- package/templates/hermes-agent/template/.gitignore.jinja +0 -2
- package/templates/hermes-agent/template/.runtime-scaffold/README.md +1 -1
- package/templates/hermes-agent/template/.runtime-scaffold/bloodbank-consumer.py +43 -9
- package/templates/hermes-agent/template/.runtime-scaffold/memories/MEMORY.md +2 -2
- package/templates/hermes-agent/template/.scripts/01-config.sh +0 -1
- package/templates/hermes-agent/template/.scripts/05-fleet-env.sh +0 -9
- package/templates/hermes-agent/template/.scripts/10-hermes-profile.sh +3 -22
- package/templates/hermes-agent/template/.scripts/20-runtime-repo.sh +0 -22
- package/templates/hermes-agent/template/.scripts/40-plane.sh +51 -0
- package/templates/hermes-agent/template/.scripts/42-ticket-provider.sh +59 -21
- package/templates/hermes-agent/template/.scripts/60-bloodbank.sh +2 -1
- package/templates/hermes-agent/template/.scripts/70-systemd.sh +1 -10
- package/templates/hermes-agent/template/.scripts/_lib.sh +3 -61
- package/templates/hermes-agent/template/.scripts/config.example.toml +0 -5
- package/templates/hermes-agent/template/.scripts/heartbeat.sh +22 -66
- package/templates/hermes-agent/template/.scripts/lib/ticket-provider.sh +5 -9
- package/templates/hermes-agent/template/.scripts/providers/linear.sh +176 -0
- package/templates/hermes-agent/template/.scripts/providers/plane.sh +9 -29
- package/templates/hermes-agent/template/.scripts/sentinel/docs/autonomous-delegated-review.md +2 -2
- package/templates/hermes-agent/template/.scripts/sentinel/docs/continuous-ticket-orchestration.md +1 -33
- package/templates/hermes-agent/template/.scripts/sentinel.prompt.md.jinja +1 -27
- package/templates/hermes-agent/template/SOUL.md.jinja +19 -21
- package/templates/hermes-agent/template/role.yaml.jinja +35 -4
- package/templates/hermes-agent/tests/test_bloodbank_consumer_contract.py +138 -0
- package/templates/hermes-agent/docs/bloodbank-gateway.md +0 -57
- package/templates/hermes-agent/docs/fleet-control-plane/n8n-service-hub.md +0 -60
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# CommonProject
|
|
2
2
|
|
|
3
|
-
Copier template for creating new 33GOD ecosystem components with BMAD methodology, ticket
|
|
3
|
+
Copier template for creating new 33GOD ecosystem components with BMAD methodology, Plane ticket enforcement, and multi-agent development tooling.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Language Support**: Python, TypeScript, Rust
|
|
8
8
|
- **Event-Driven Architecture**: Optional [Bloodbank](https://github.com/delorenj/Bloodbank) integration
|
|
9
|
-
- **
|
|
10
|
-
- **Ticket Enforcement**: Git hooks enforce
|
|
9
|
+
- **Plane Integration**: `.project.json` for ticket management and project config
|
|
10
|
+
- **Ticket Enforcement**: Git hooks enforce Plane ticket requirements
|
|
11
11
|
- [TODO] **BMAD Integration**: Full BMAD methodology structure by auto running `npx bmad-method@latest install`
|
|
12
12
|
- [TODO] Multiple-choice selection for different workflows: BMAD, GSD, GoogleAgentSkills, None.
|
|
13
13
|
- **Containerization**: Optional Docker + Docker Compose
|
|
@@ -25,7 +25,7 @@ uv tool install copier
|
|
|
25
25
|
# Or with pip
|
|
26
26
|
pip install copier
|
|
27
27
|
|
|
28
|
-
# Set up
|
|
28
|
+
# Set up Plane API key (for automated project creation)
|
|
29
29
|
export PLANE_API_KEY="your-plane-api-key"
|
|
30
30
|
OR
|
|
31
31
|
[TODO] export PLANE_API_KEY=op://VaultName/Key/Field
|
|
@@ -36,14 +36,14 @@ OR
|
|
|
36
36
|
|
|
37
37
|
### Option 1: Automated Init (Recommended)
|
|
38
38
|
|
|
39
|
-
[TODO] One command handles everything:
|
|
39
|
+
[TODO] One command handles everything: Plane project creation + Copier template:
|
|
40
40
|
|
|
41
41
|
> TASK - Implement the following:
|
|
42
42
|
> Currently, I have to run `copier copy --trust ~/code CommonProject .` globally, or `mise run init-project` while in the CommonProject source dir - but this is not ideal.
|
|
43
43
|
> I would rather run `commonProject .` globally.
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
# Interactive wizard - creates
|
|
46
|
+
# Interactive wizard - creates Plane project automatically
|
|
47
47
|
mise run init-project
|
|
48
48
|
|
|
49
49
|
# Or non-interactive (uses defaults)
|
|
@@ -56,7 +56,7 @@ mise run init-project-non-interactive
|
|
|
56
56
|
The wizard will:
|
|
57
57
|
|
|
58
58
|
1. Ask for project details (name, description, type)
|
|
59
|
-
2. Create
|
|
59
|
+
2. Create the Plane project automatically
|
|
60
60
|
3. Run Copier with all answers pre-filled
|
|
61
61
|
4. Output next steps
|
|
62
62
|
|
|
@@ -83,10 +83,9 @@ The template asks for:
|
|
|
83
83
|
- **Project Slug**: Directory/package name (auto-generated from name)
|
|
84
84
|
- **Description**: One-sentence project description
|
|
85
85
|
|
|
86
|
-
###
|
|
86
|
+
### Plane Integration
|
|
87
87
|
|
|
88
|
-
- **
|
|
89
|
-
- **Workspace**: Provider workspace slug when applicable (Plane default: 33god)
|
|
88
|
+
- **Workspace**: Plane workspace slug (default: 33god)
|
|
90
89
|
- **Project Name**
|
|
91
90
|
- **Project Identifier**: 2+ character ticket prefix (e.g., HOLO, VERN)
|
|
92
91
|
|
|
@@ -111,10 +110,10 @@ The template asks for:
|
|
|
111
110
|
git commit -m "Initial commit from template"
|
|
112
111
|
```
|
|
113
112
|
|
|
114
|
-
3. **Create
|
|
113
|
+
3. **Create Plane Ticket**
|
|
115
114
|
|
|
116
115
|
```bash
|
|
117
|
-
# Create or
|
|
116
|
+
# Create ticket in Plane (or it was already created for you!)
|
|
118
117
|
# Move to "In Progress"
|
|
119
118
|
git checkout -b <IDENTIFIER>-123-initial-setup
|
|
120
119
|
```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# Generic base project template. Creates a project skeleton with:
|
|
5
5
|
# - BMAD methodology (pre-initialized)
|
|
6
|
-
# -
|
|
6
|
+
# - Plane project (auto-created in 33god workspace)
|
|
7
7
|
# - mise environment management
|
|
8
8
|
# - CLI coder configs (Claude, Codex, Gemini, etc.)
|
|
9
9
|
|
|
@@ -30,15 +30,16 @@ project_description:
|
|
|
30
30
|
help: One-line description
|
|
31
31
|
default: ""
|
|
32
32
|
|
|
33
|
-
# Ticket board provider for this project.
|
|
34
|
-
#
|
|
35
|
-
# persisted into .project.json so it is
|
|
36
|
-
# the hermes-agent template's agents.
|
|
33
|
+
# Ticket board provider for this project. The board itself is created by
|
|
34
|
+
# init-project.sh (create-plane-project.sh) BEFORE copier runs; its identity is
|
|
35
|
+
# threaded back in via plane_* below and persisted into .project.json so it is
|
|
36
|
+
# the single source of truth shared with the hermes-agent template's agents.
|
|
37
37
|
ticket_provider:
|
|
38
38
|
type: str
|
|
39
39
|
help: Ticket board provider this project's board lives in
|
|
40
40
|
default: plane
|
|
41
41
|
choices:
|
|
42
|
+
Linear: linear
|
|
42
43
|
Plane: plane
|
|
43
44
|
Trello: trello
|
|
44
45
|
|
|
@@ -49,7 +50,8 @@ project_slug:
|
|
|
49
50
|
default: "{{ project_name | lower | replace(' ', '-') | replace('_', '-') }}"
|
|
50
51
|
when: false
|
|
51
52
|
|
|
52
|
-
#
|
|
53
|
+
# Board binding — supplied by init-project.sh's --data-file after the board is
|
|
54
|
+
# created. Defaults keep a bare `copier copy` rendering valid (empty binding).
|
|
53
55
|
plane_workspace:
|
|
54
56
|
type: str
|
|
55
57
|
default: "33god"
|
|
@@ -70,27 +72,6 @@ plane_base:
|
|
|
70
72
|
default: "https://plane.delo.sh"
|
|
71
73
|
when: false
|
|
72
74
|
|
|
73
|
-
# Provider-agnostic board binding — supplied by pjangler's --data values after
|
|
74
|
-
# the board is created or linked. Defaults keep a bare `copier copy` rendering
|
|
75
|
-
# valid, and fall back to the legacy plane_* aliases above. Board URLs are
|
|
76
|
-
# derived from provider/workspace/board_id and are intentionally not persisted.
|
|
77
|
-
board_id:
|
|
78
|
-
type: str
|
|
79
|
-
default: "{{ plane_project_id }}"
|
|
80
|
-
when: false
|
|
81
|
-
|
|
82
|
-
# Deprecated no-op accepted so older pjangler/CommonProject callers do not fail
|
|
83
|
-
# when they still pass `--data board_url=...`.
|
|
84
|
-
board_url:
|
|
85
|
-
type: str
|
|
86
|
-
default: ""
|
|
87
|
-
when: false
|
|
88
|
-
|
|
89
|
-
ticket_workspace:
|
|
90
|
-
type: str
|
|
91
|
-
default: "{{ plane_workspace if ticket_provider == 'plane' else '' }}"
|
|
92
|
-
when: false
|
|
93
|
-
|
|
94
75
|
# Drives conditional blocks in rendered files (e.g. _.python.venv in mise.toml).
|
|
95
76
|
# Not asked interactively; init-project.sh can override via --data-file.
|
|
96
77
|
primary_language:
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
{%
|
|
2
|
-
{% set
|
|
1
|
+
{% if ticket_provider == 'plane' and plane_project_id -%}
|
|
2
|
+
{% set board_url = plane_base ~ '/' ~ plane_workspace ~ '/projects/' ~ plane_project_id ~ '/issues/' -%}
|
|
3
|
+
{% else -%}
|
|
4
|
+
{% set board_url = '' -%}
|
|
5
|
+
{% endif -%}
|
|
3
6
|
{
|
|
4
7
|
"project_name": {{ project_name | tojson }},
|
|
5
8
|
"project_description": {{ project_description | tojson }},
|
|
@@ -7,17 +10,10 @@
|
|
|
7
10
|
"repo_path": "",
|
|
8
11
|
"ticket_provider": {
|
|
9
12
|
"type": {{ ticket_provider | tojson }},
|
|
10
|
-
"workspace": {{
|
|
13
|
+
"workspace": {{ plane_workspace | tojson }},
|
|
11
14
|
"identifier": {{ project_identifier | tojson }},
|
|
12
|
-
"board_id": {{
|
|
13
|
-
"
|
|
15
|
+
"board_id": {{ plane_project_id | tojson }},
|
|
16
|
+
"board_url": {{ board_url | tojson }}
|
|
14
17
|
},
|
|
15
|
-
"agents": {}
|
|
16
|
-
"automation": {
|
|
17
|
-
"reconcile": {
|
|
18
|
-
"enabled": false,
|
|
19
|
-
"grace_hours": 0,
|
|
20
|
-
"auto_review": true
|
|
21
|
-
}
|
|
22
|
-
}
|
|
18
|
+
"agents": {}
|
|
23
19
|
}
|
|
@@ -11,7 +11,7 @@ memory/state checkpointing.
|
|
|
11
11
|
| What it scaffolds | A new top-level project | An agent role inside an existing project |
|
|
12
12
|
| Copier target | `./my-new-project/` | `./agents/hermes/<role>/` |
|
|
13
13
|
| Asks | project name + description | role + purpose + tone |
|
|
14
|
-
| Post-gen artifacts |
|
|
14
|
+
| Post-gen artifacts | Plane project, bmad init, mise tasks | Plane project, Telegram bot wiring, agent-hm-* runtime repo, systemd units |
|
|
15
15
|
|
|
16
16
|
CommonProject runs first to create the umbrella project. hermes-agent-template
|
|
17
17
|
runs second (for each agent role you want) to drop agents into it.
|
|
@@ -20,8 +20,8 @@ runs second (for each agent role you want) to drop agents into it.
|
|
|
20
20
|
|
|
21
21
|
The template provisions a single Hermes role per invocation. The `pm` role
|
|
22
22
|
handles project management and triage, and also runs the continuous ticket
|
|
23
|
-
sentinel out-of-band: a provider-agnostic board-reconciliation pass (
|
|
24
|
-
Trello) with an autonomous adversarial review (act, do not wait). The
|
|
23
|
+
sentinel out-of-band: a provider-agnostic board-reconciliation pass (Linear,
|
|
24
|
+
Plane, or Trello) with an autonomous adversarial review (act, do not wait). The
|
|
25
25
|
sentinel runs as the PM's **heartbeat** — a fused systemd timer tick that does
|
|
26
26
|
the reconciliation pass and then a gated runtime checkpoint. (There is no
|
|
27
27
|
separate `scrum-master` role; its duties folded into the PM heartbeat.)
|
|
@@ -47,7 +47,7 @@ The template will:
|
|
|
47
47
|
5. Populate it with the runtime scaffold (config.yaml, SOUL.md, memories, consumer.py)
|
|
48
48
|
6. Add it as a git submodule at `agents/hermes/pm/runtime/` (== HERMES_HOME)
|
|
49
49
|
7. Prompt for a BotFather token, store it in `runtime/.env`
|
|
50
|
-
8. Create
|
|
50
|
+
8. Create a Plane project in your configured workspace
|
|
51
51
|
9. Install systemd `--user` units: gateway, consumer, heartbeat timer (reconcile + checkpoint)
|
|
52
52
|
10. Append the agent to `~/.hermes/agents-registry.yaml`
|
|
53
53
|
|
|
@@ -68,7 +68,7 @@ you to review it. Keys:
|
|
|
68
68
|
| `fleet` | `fleet_env`, `registry_file` | Fleet source-of-truth + registry locations |
|
|
69
69
|
| `fleet` | `oauth_file`, `codex_home` | Shared Hermes OAuth store + Codex CLI/app-server auth home |
|
|
70
70
|
| `fleet` | `runtime_scaffold_dir` | Fallback scaffold (if agent-local one is missing) |
|
|
71
|
-
| `fleet` | `canonical_skills_dir`, `
|
|
71
|
+
| `fleet` | `canonical_skills_dir`, `symlinked_runtime_skills` | Skills mirrored into each profile |
|
|
72
72
|
| `github` | `runtime_repo_owner` | Owner of the `agent-hm-*` runtime repos |
|
|
73
73
|
| `plane` | `base`, `workspace` | Plane URL + workspace slug |
|
|
74
74
|
| `bloodbank` | `nats_host`, `nats_port`, `compose_dir` | NATS endpoint + compose dir hint |
|
|
@@ -138,14 +138,14 @@ to force re-run:
|
|
|
138
138
|
|
|
139
139
|
```bash
|
|
140
140
|
cd agents/hermes/pm
|
|
141
|
-
rm .scripts/.done-
|
|
142
|
-
SKIP_SYSTEMD=1 ./.scripts/
|
|
141
|
+
rm .scripts/.done-40-plane
|
|
142
|
+
SKIP_TELEGRAM=1 SKIP_SYSTEMD=1 ./.scripts/40-plane.sh
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
## Retiring an agent
|
|
146
146
|
|
|
147
147
|
(TODO: ship `retire.sh` in v1.1)
|
|
148
148
|
|
|
149
|
-
Manual: stop systemd units, `hermes profile delete`, archive the
|
|
150
|
-
|
|
149
|
+
Manual: stop systemd units, `hermes profile delete`, archive the Plane
|
|
150
|
+
project, `/deletebot` in BotFather, archive the
|
|
151
151
|
`agent-hm-*` runtime repo, remove the registry entry.
|
|
@@ -1,66 +1 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# This file holds every environment-specific default the provisioning scripts
|
|
4
|
-
# need. Copy it to ~/.config/hermes-agent-template/config.toml (the first
|
|
5
|
-
# provisioning run does this for you) and edit the values for YOUR machine.
|
|
6
|
-
#
|
|
7
|
-
# Resolution precedence for each value (highest wins):
|
|
8
|
-
# explicit env var > ~/.hermes/fleet.env > this file > built-in fallback
|
|
9
|
-
#
|
|
10
|
-
# Override the config location with $HERMES_TEMPLATE_CONFIG if you keep it
|
|
11
|
-
# somewhere other than $XDG_CONFIG_HOME/hermes-agent-template/config.toml.
|
|
12
|
-
|
|
13
|
-
[fleet]
|
|
14
|
-
# Absolute path to the shared Hermes executable every agent launcher execs.
|
|
15
|
-
hermes_bin = "~/.hermes/hermes-agent/.venv/bin/hermes"
|
|
16
|
-
# Checkout of the hermes-agent repo. Its .venv is used to install nats-py, etc.
|
|
17
|
-
hermes_repo = "~/.hermes/hermes-agent"
|
|
18
|
-
# Fallback runtime scaffold dir — used only when an agent's vendored
|
|
19
|
-
# ./.runtime-scaffold is missing.
|
|
20
|
-
runtime_scaffold_dir = "~/code/hermes-agent-template/runtime-scaffold"
|
|
21
|
-
# Shared fleet source-of-truth env file + fleet registry. ~ is expanded.
|
|
22
|
-
fleet_env = "~/.hermes/fleet.env"
|
|
23
|
-
registry_file = "~/.hermes/agents-registry.yaml"
|
|
24
|
-
# Shared auth roots. HERMES_OAUTH_FILE is the Hermes provider OAuth store
|
|
25
|
-
# (including openai-codex); CODEX_HOME is for Codex CLI/app-server auth.
|
|
26
|
-
oauth_file = "~/.hermes/auth.json"
|
|
27
|
-
codex_home = "~/.codex"
|
|
28
|
-
# Canonical external skills dir mirrored into each agent profile.
|
|
29
|
-
canonical_skills_dir = "/home/delorenj/.agents/skills"
|
|
30
|
-
# PM-only external skill libraries surfaced alongside Hermes built-ins.
|
|
31
|
-
pm_external_skill_dirs = [
|
|
32
|
-
"~/code/skillex/skill-sets/global/.system",
|
|
33
|
-
"~/code/skillex/packs/bmad/6.10.2",
|
|
34
|
-
]
|
|
35
|
-
# Voxxy plugin + service defaults for Hermes PM agents.
|
|
36
|
-
voxxy_plugin_dir = "~/code/voxxy/plugins/tts/voxxy"
|
|
37
|
-
vox_url = "https://vox.delo.sh"
|
|
38
|
-
# Canonical PM config.yaml the provisioner seeds each runtime's config.yaml from.
|
|
39
|
-
# This is the fleet-wide Hermes inference/skill config (model, toolsets, etc.)
|
|
40
|
-
# every agent runtime starts from. ~ is expanded.
|
|
41
|
-
# canonical_pm_config = "~/.hermes/config.yaml"
|
|
42
|
-
# Skills symlinked into every agent's runtime skills root.
|
|
43
|
-
symlinked_runtime_skills = [
|
|
44
|
-
"delonet-conventions",
|
|
45
|
-
"delonet-dotenv",
|
|
46
|
-
"hermes-pm-template-maintenance",
|
|
47
|
-
"hindsight",
|
|
48
|
-
"33god-projects",
|
|
49
|
-
"subagent-driven-development",
|
|
50
|
-
]
|
|
51
|
-
|
|
52
|
-
[github]
|
|
53
|
-
# Owner of the per-agent runtime repos (creates <owner>/agent-hm-<repo>-<role>).
|
|
54
|
-
runtime_repo_owner = "delorenj"
|
|
55
|
-
|
|
56
|
-
[plane]
|
|
57
|
-
# Plane instance base URL and workspace slug (one project per agent).
|
|
58
|
-
base = "https://plane.delo.sh"
|
|
59
|
-
workspace = "33god"
|
|
60
|
-
|
|
61
|
-
[bloodbank]
|
|
62
|
-
# NATS endpoint the consumer connects to.
|
|
63
|
-
nats_host = "127.0.0.1"
|
|
64
|
-
nats_port = 4222
|
|
65
|
-
# Where the bloodbank docker compose lives (used only for a hint message). ~ ok.
|
|
66
|
-
compose_dir = "~/code/33GOD/bloodbank"
|
|
1
|
+
template/.scripts/config.example.toml
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
# 1. Renders agents/hermes/<role>/{role.yaml, SOUL.md, hermes, .scripts/}
|
|
13
13
|
# 2. Creates a per-agent runtime repo gh:delorenj/agent-hm-<repo>-<role>
|
|
14
14
|
# 3. Submodules it at agents/hermes/<role>/runtime/ (this is HERMES_HOME)
|
|
15
|
-
# 4. Creates
|
|
15
|
+
# 4. Creates a Plane project in 33god workspace
|
|
16
16
|
# 6. Prompts for a BotFather Telegram token, stores in runtime/.env
|
|
17
17
|
# 7. Installs a Bloodbank consumer + heartbeat timer (reconcile + checkpoint)
|
|
18
18
|
# 8. Appends to ~/.hermes/agents-registry.yaml
|
|
19
19
|
#
|
|
20
|
-
# Environment-specific defaults (Hermes binary path, runtime repo owner,
|
|
21
|
-
#
|
|
20
|
+
# Environment-specific defaults (Hermes binary path, runtime repo owner, Plane
|
|
21
|
+
# workspace/URL, NATS endpoint, skills dir, …) are NOT hardcoded — they live in
|
|
22
22
|
# ~/.config/hermes-agent-template/config.toml, seeded from config.example.toml on
|
|
23
23
|
# first run. Edit that file to retarget the template for a different machine/user.
|
|
24
24
|
|
|
@@ -59,6 +59,7 @@ ticket_provider:
|
|
|
59
59
|
help: "Ticket system this agent's board lives in"
|
|
60
60
|
default: plane
|
|
61
61
|
choices:
|
|
62
|
+
"Linear": linear
|
|
62
63
|
"Plane": plane
|
|
63
64
|
"Trello": trello
|
|
64
65
|
|
|
@@ -92,23 +92,20 @@ happen to share a token, the second one's startup fails fast. The N×M cost
|
|
|
92
92
|
(N BotFather sessions per fleet) is the price we accept for zero custom
|
|
93
93
|
routing code.
|
|
94
94
|
|
|
95
|
-
## One
|
|
95
|
+
## One Plane project per agent
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
A Plane "project" is the natural unit of work isolation. Mixing agents into a
|
|
98
|
+
shared project would conflate decisions and break filters. 1:1 also makes
|
|
99
|
+
archive-on-retire clean.
|
|
100
100
|
|
|
101
101
|
## Bloodbank wiring
|
|
102
102
|
|
|
103
103
|
Each consumer subscribes to two lanes:
|
|
104
|
-
- `bloodbank.evt.v1.repo
|
|
105
|
-
- `bloodbank.cmd.v1.agent
|
|
104
|
+
- `bloodbank.evt.v1.repo.>` — canonical repo-domain events, filtered by `data.repo`
|
|
105
|
+
- `bloodbank.cmd.v1.agent.>` — canonical agent-domain commands, filtered by `data.target_agent_id`
|
|
106
106
|
|
|
107
107
|
Each agent emits CloudEvents 1.0 envelopes with `actor.agent_id`,
|
|
108
108
|
`producer = hermes-agent:<id>`, `source = hermes://agent/<id>`. The naming
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
capture. The target architecture is a first-class Hermes Bloodbank gateway where
|
|
113
|
-
command events enter the same turn queue as Telegram/web messages; see
|
|
114
|
-
[Bloodbank Gateway](bloodbank-gateway.md).
|
|
109
|
+
contract is owned by Bloodbank (`~/code/33GOD/bloodbank/docs/event-naming.md`).
|
|
110
|
+
Repo and agent identifiers belong in envelope data, actor, or source fields,
|
|
111
|
+
never in type or subject tokens.
|
|
@@ -24,7 +24,6 @@ The Fleet remains a set of independently useful parts:
|
|
|
24
24
|
- [prd.md](./prd.md) - Functional and non-functional requirements.
|
|
25
25
|
- [architecture.md](./architecture.md) - Technical architecture and ADRs.
|
|
26
26
|
- [epics-and-stories.md](./epics-and-stories.md) - Implementation backlog with acceptance criteria.
|
|
27
|
-
- [n8n-service-hub.md](./n8n-service-hub.md) - Concrete service-hub shape for n8n plus systemd fallback.
|
|
28
27
|
- [implementation-readiness-report-2026-06-27.md](./implementation-readiness-report-2026-06-27.md) - Readiness assessment and launch gates.
|
|
29
28
|
|
|
30
29
|
## Adapted BMAD Note
|
|
@@ -33,3 +32,4 @@ The formal BMAD workflow expects a project-local `_bmad` runtime, PRD, and
|
|
|
33
32
|
step-by-step user confirmations. This repo does not currently contain `_bmad`.
|
|
34
33
|
These artifacts preserve the BMAD intent and structure while using the live
|
|
35
34
|
architecture review and advanced elicitation decisions as input.
|
|
35
|
+
|
|
@@ -29,7 +29,7 @@ invocations).
|
|
|
29
29
|
| 10 hermes profile | `hermes profile create <repo>-<role> --clone --no-alias` + mirror skills/plugins/hooks from default + symlink canonical runtime skills (`delonet-conventions`, `delonet-dotenv`, `hermes-pm-template-maintenance`, `hindsight`, `subagent-driven-development`) from `/home/delorenj/.agents/skills`; PM roles also seed `VOX_URL` in profile `.env` | n/a |
|
|
30
30
|
| 20 runtime repo | Create gh:delorenj/agent-hm-<repo>-<role> (private), push scaffold from role-local `.runtime-scaffold/`, submodule-add into ./runtime/, symlink ~/.hermes/profiles/<id> → runtime; PM roles also link the Voxxy plugin and set `tts.provider: voxxy` | `SKIP_RUNTIME_REPO=1` |
|
|
31
31
|
| 30 telegram | Capture BotFather token, write to runtime/.env, enable hermes-telegram toolset | `SKIP_TELEGRAM=1` |
|
|
32
|
-
|
|
|
32
|
+
| 40 plane | Create Plane project in 33god workspace (1:1 with agent), patch identifier into role.yaml | `SKIP_PLANE=1` |
|
|
33
33
|
| 60 bloodbank | Install consumer (renders from scaffold w/ agent values), health-check NATS, install nats-py via uv if missing | `SKIP_BLOODBANK=1` |
|
|
34
34
|
| 70 systemd | Install user units: gateway, consumer, heartbeat timer (board-reconciliation sentinel pass + gated runtime checkpoint, one tick) | `SKIP_SYSTEMD=1` |
|
|
35
35
|
| 80 registry | Append entry to ~/.hermes/agents-registry.yaml | n/a |
|
|
@@ -118,7 +118,7 @@ systemctl --user start hermes-${AGENT}-gateway.service
|
|
|
118
118
|
| --- | --- |
|
|
119
119
|
| Telegram | DM `@<repo>_<role>_bot` (once Telegram is wired) |
|
|
120
120
|
| Local CLI | `./agents/hermes/<role>/hermes chat "..."` |
|
|
121
|
-
| Bloodbank | Publish to
|
|
121
|
+
| Bloodbank | Publish to `bloodbank.cmd.v1.agent.task.assign` with `data.target_agent_id = <agent_id>` |
|
|
122
122
|
|
|
123
123
|
## Inspect fleet state
|
|
124
124
|
|
|
@@ -187,10 +187,10 @@ systemctl --user disable --now hermes-${AGENT}-heartbeat.timer
|
|
|
187
187
|
# that's what you want!)
|
|
188
188
|
hermes profile delete ${AGENT}
|
|
189
189
|
|
|
190
|
-
# 3. Archive
|
|
190
|
+
# 3. Archive Plane project (Plane UI or API)
|
|
191
191
|
PROJECT_ID=$(python3 -c "import yaml,pathlib; print(yaml.safe_load(pathlib.Path.home().joinpath('.hermes/agents-registry.yaml').read_text())['agents']['${AGENT}']['plane']['project_id'])")
|
|
192
192
|
curl -X POST "https://plane.delo.sh/api/v1/workspaces/33god/projects/${PROJECT_ID}/archive/" \
|
|
193
|
-
-H "X-API-Key: ${
|
|
193
|
+
-H "X-API-Key: ${PLANE_33GOD_API_KEY}"
|
|
194
194
|
|
|
195
195
|
# 4. BotFather: /deletebot @<repo>_<role>_bot
|
|
196
196
|
# 5. Archive runtime repo (GitHub UI; we don't have delete_repo scope by default)
|
|
@@ -219,7 +219,8 @@ rm -rf agents/hermes/<role>
|
|
|
219
219
|
### Consumer not seeing events
|
|
220
220
|
- Verify NATS is up: `docker compose -f ~/code/33GOD/bloodbank/compose/docker-compose.yml ps`
|
|
221
221
|
- Tail consumer: `journalctl --user -fu hermes-<agent>-consumer.service`
|
|
222
|
-
- Make sure something is
|
|
222
|
+
- Make sure something is publishing canonical repo events such as
|
|
223
|
+
`bloodbank.evt.v1.repo.issue.updated` with `data.repo = <repo>`
|
|
223
224
|
|
|
224
225
|
### Heartbeat not checkpointing (runtime not pushing)
|
|
225
226
|
The checkpoint runs inside the heartbeat tick (after the board-reconciliation
|
|
@@ -26,7 +26,7 @@ that does the board-reconciliation pass and then a gated runtime checkpoint
|
|
|
26
26
|
`.scripts/sentinel/`.
|
|
27
27
|
|
|
28
28
|
It talks to the ticket board through a pluggable adapter, so the same engine
|
|
29
|
-
runs on Plane or Trello. The engine lives once in this template (the
|
|
29
|
+
runs on Linear, Plane, or Trello. The engine lives once in this template (the
|
|
30
30
|
single source of truth) and propagates to every deployment with
|
|
31
31
|
`copier update`.
|
|
32
32
|
|
|
@@ -37,6 +37,8 @@ The following is true as of June 1, 2026.
|
|
|
37
37
|
- The engine, the provider abstraction, and the autonomous adversarial-review
|
|
38
38
|
enforcement are built, syntax-clean, and validated offline with a mock
|
|
39
39
|
provider.
|
|
40
|
+
- The **Linear** adapter is verified live against a real board (a real
|
|
41
|
+
`DEL` team: `resolve`, `list_issues` returning 93 issues, and `get_issue`).
|
|
40
42
|
- The **Plane** adapter is verified live against a real workspace
|
|
41
43
|
(`resolve`, `list_issues`, `get_issue`, `comment`, and a
|
|
42
44
|
`transition` to `completed` on a disposable issue).
|
|
@@ -52,7 +54,7 @@ For a local, single-machine install (no GitHub runtime repo, no Telegram, no
|
|
|
52
54
|
NATS), use the one-command bootstrap. From inside the target project:
|
|
53
55
|
|
|
54
56
|
```bash
|
|
55
|
-
export
|
|
57
|
+
export PLANE_API_KEY=<key> # or LINEAR_API_KEY / TRELLO_KEY + TRELLO_TOKEN
|
|
56
58
|
curl -fsSL https://raw.githubusercontent.com/delorenj/hermes-agent-template/main/install-local.sh | sh
|
|
57
59
|
```
|
|
58
60
|
|
|
@@ -64,7 +66,7 @@ macOS). See [Development guide: local install](development.md#local-install-one-
|
|
|
64
66
|
<!-- prettier-ignore -->
|
|
65
67
|
> [!IMPORTANT]
|
|
66
68
|
> Full (non-local) provisioning is outward-facing. It can create a GitHub
|
|
67
|
-
> runtime repo, a Telegram bot, and a
|
|
69
|
+
> runtime repo, a Telegram bot, and a Plane project, and the Telegram step is
|
|
68
70
|
> interactive. Use `install-local.sh` or the `SKIP_*` flags described in
|
|
69
71
|
> [Development guide:
|
|
70
72
|
> provisioning](development.md#provisioning-the-pm-manual) for local or lean
|
|
@@ -77,9 +79,9 @@ All paths are relative to the repository root.
|
|
|
77
79
|
| Path | What it is |
|
|
78
80
|
| --- | --- |
|
|
79
81
|
| `copier.yml` | Questions (`role`, `ticket_provider`) and the `_tasks` provisioning chain. |
|
|
80
|
-
| `template/role.yaml.jinja` | The rendered role
|
|
82
|
+
| `template/role.yaml.jinja` | The rendered role manifest, including the `ticket_provider` binding and the `reconcile` knobs (`grace_hours`, `auto_review`). |
|
|
81
83
|
| `template/.scripts/lib/ticket-provider.sh` | The adapter dispatcher (`tp`). The engine's only seam to a ticket system. |
|
|
82
|
-
| `template/.scripts/providers/{plane,trello}.sh` | The provider adapters. |
|
|
84
|
+
| `template/.scripts/providers/{linear,plane,trello}.sh` | The provider adapters. |
|
|
83
85
|
| `template/.scripts/42-ticket-provider.sh` | Provisioning step that resolves or creates the board. |
|
|
84
86
|
| `template/.scripts/70-systemd.sh` | Provisioning step that installs the gateway, consumer, and the fused `heartbeat` timer (board-reconciliation sentinel pass + gated runtime checkpoint). |
|
|
85
87
|
| `install-local.sh` | One-command local install (no cloud, macOS + Linux). |
|
|
@@ -107,8 +109,8 @@ the agent to read at run time. Keep the two in sync when behavior changes.
|
|
|
107
109
|
|
|
108
110
|
The highest-value open work, in order:
|
|
109
111
|
|
|
110
|
-
1. Live-verify the **Trello** adapter against a real board (Plane
|
|
111
|
-
See [Providers: verifying an
|
|
112
|
+
1. Live-verify the **Trello** adapter against a real board (Linear and Plane are
|
|
113
|
+
done). See [Providers: verifying an
|
|
112
114
|
adapter](providers.md#verifying-an-adapter-against-a-live-board).
|
|
113
115
|
2. Confirm `install-local.sh` on a real macOS machine. The Linux path and the
|
|
114
116
|
Plane adapter are verified; the macOS `launchd` agent and `mkdir` lock get
|
|
@@ -71,8 +71,7 @@ function, `tp`, that dispatches to one provider implementation under
|
|
|
71
71
|
through the `ticket_provider` question and recorded in `role.yaml` under
|
|
72
72
|
`ticket_provider.name`.
|
|
73
73
|
|
|
74
|
-
This is what lets one engine serve
|
|
75
|
-
Trello.
|
|
74
|
+
This is what lets one engine serve three back ends: Trello, Plane, and Linear.
|
|
76
75
|
For the full contract and the per-provider details, see
|
|
77
76
|
[Providers](providers.md).
|
|
78
77
|
|
|
@@ -112,7 +112,7 @@ repository root instead of driving Copier by hand. From inside the target
|
|
|
112
112
|
project:
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
|
-
export
|
|
115
|
+
export PLANE_API_KEY=<key> # or LINEAR_API_KEY / TRELLO_KEY + TRELLO_TOKEN
|
|
116
116
|
curl -fsSL https://raw.githubusercontent.com/delorenj/hermes-agent-template/main/install-local.sh | sh
|
|
117
117
|
```
|
|
118
118
|
|
|
@@ -133,8 +133,8 @@ The script:
|
|
|
133
133
|
7. smoke-tests the board connection through the adapter.
|
|
134
134
|
|
|
135
135
|
Useful environment overrides (skip the prompts): `HAT_REPO`, `HAT_PROVIDER`,
|
|
136
|
-
`HAT_ROLES`, `HAT_PLANE_WORKSPACE`, `HAT_PLANE_PROJECT`, `
|
|
137
|
-
and `HAT_DRY_RUN=1` to preview without changing anything.
|
|
136
|
+
`HAT_ROLES`, `HAT_PLANE_WORKSPACE`, `HAT_PLANE_PROJECT`, `HAT_LINEAR_TEAM`,
|
|
137
|
+
`HAT_TRELLO_BOARD`, and `HAT_DRY_RUN=1` to preview without changing anything.
|
|
138
138
|
|
|
139
139
|
This local path does not wire Telegram or email. Those are convenience layers in
|
|
140
140
|
the `pjangler` provisioner, not requirements for a working agent — talk to the
|
|
@@ -151,7 +151,7 @@ cd /path/to/your-project
|
|
|
151
151
|
copier copy gh:delorenj/hermes-agent-template ./agents/hermes/pm \
|
|
152
152
|
--data role=pm \
|
|
153
153
|
--data target_repo=<repo> \
|
|
154
|
-
--data ticket_provider=<plane|trello>
|
|
154
|
+
--data ticket_provider=<linear|plane|trello>
|
|
155
155
|
```
|
|
156
156
|
|
|
157
157
|
The `_tasks` chain in `copier.yml` runs the numbered provisioning scripts in
|
|
@@ -162,7 +162,7 @@ order. Several of them reach outside the repository.
|
|
|
162
162
|
> Full provisioning is outward-facing and partly interactive.
|
|
163
163
|
> `20-runtime-repo.sh` creates a private GitHub repo with `gh repo create`,
|
|
164
164
|
> `30-telegram.sh` prompts for a BotFather token and blocks waiting for input,
|
|
165
|
-
> and `42-ticket-provider.sh` can create a
|
|
165
|
+
> and `42-ticket-provider.sh` can create a Plane project. Don't run full
|
|
166
166
|
> provisioning unattended.
|
|
167
167
|
|
|
168
168
|
Use the `SKIP_*` environment flags for a local or lean install. Each numbered
|
|
@@ -172,7 +172,7 @@ script checks its flag and skips cleanly.
|
|
|
172
172
|
| --- | --- |
|
|
173
173
|
| `SKIP_TELEGRAM` | The interactive BotFather token step. |
|
|
174
174
|
| `SKIP_RUNTIME_REPO` | Creating the GitHub runtime repo. |
|
|
175
|
-
| `SKIP_PLANE` | Creating
|
|
175
|
+
| `SKIP_PLANE` | Creating a Plane project. |
|
|
176
176
|
| `SKIP_BLOODBANK` | Installing the BloodBank consumer. |
|
|
177
177
|
| `SKIP_SYSTEMD` | Installing `systemd` units (gateway, consumer, heartbeat timer). |
|
|
178
178
|
|
|
@@ -181,14 +181,13 @@ For example, a local install that creates no cloud resources:
|
|
|
181
181
|
```bash
|
|
182
182
|
SKIP_TELEGRAM=1 SKIP_RUNTIME_REPO=1 SKIP_PLANE=1 SKIP_BLOODBANK=1 \
|
|
183
183
|
copier copy gh:delorenj/hermes-agent-template ./agents/hermes/pm \
|
|
184
|
-
--data role=pm --data target_repo=<repo> --data ticket_provider=
|
|
184
|
+
--data role=pm --data target_repo=<repo> --data ticket_provider=linear
|
|
185
185
|
```
|
|
186
186
|
|
|
187
187
|
After provisioning, set the board binding in
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
a `systemd` `EnvironmentFile` (for example
|
|
188
|
+
`agents/hermes/pm/role.yaml`. For Linear, set `ticket_provider.team`
|
|
189
|
+
to the team key. Make the provider key available to the heartbeat's environment:
|
|
190
|
+
on Linux through a `systemd` `EnvironmentFile` (for example
|
|
192
191
|
`~/.hermes/<agent_id>.env`); on macOS the `launchd` agent sources that same
|
|
193
192
|
per-agent env file, so write the key there.
|
|
194
193
|
|
|
@@ -257,8 +256,8 @@ These cost real debugging time. Watch for them.
|
|
|
257
256
|
|
|
258
257
|
The following work is open for the incoming agent, roughly in priority order.
|
|
259
258
|
|
|
260
|
-
1. **Live-verify the Trello adapter.** Plane
|
|
261
|
-
(
|
|
259
|
+
1. **Live-verify the Trello adapter.** Linear and Plane are verified live
|
|
260
|
+
(Plane includes `transition` and `comment`). Trello is implemented against
|
|
262
261
|
the contract but unverified. Follow [Providers: verifying an
|
|
263
262
|
adapter](providers.md#verifying-an-adapter-against-a-live-board) with Trello
|
|
264
263
|
credentials, and fix any endpoint or field mismatches.
|