@delorenj/pjangler 1.2.17 → 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.
Files changed (48) hide show
  1. package/dist/index.js +244 -6
  2. package/dist/mcp-server.js +245 -7
  3. package/package.json +8 -2
  4. package/templates/commonproject/AGENTS.md +3 -3
  5. package/templates/commonproject/README.md +11 -12
  6. package/templates/commonproject/copier.yml +8 -27
  7. package/templates/commonproject/template/.project.json.jinja +9 -13
  8. package/templates/hermes-agent/README.md +9 -9
  9. package/templates/hermes-agent/config.example.toml +1 -66
  10. package/templates/hermes-agent/copier.yml +4 -3
  11. package/templates/hermes-agent/docs/architecture.md +9 -12
  12. package/templates/hermes-agent/docs/fleet-control-plane/README.md +1 -1
  13. package/templates/hermes-agent/docs/operations.md +6 -5
  14. package/templates/hermes-agent/docs/sentinel/README.md +9 -7
  15. package/templates/hermes-agent/docs/sentinel/architecture.md +1 -2
  16. package/templates/hermes-agent/docs/sentinel/development.md +12 -13
  17. package/templates/hermes-agent/docs/sentinel/providers.md +34 -15
  18. package/templates/hermes-agent/install-local.sh +15 -14
  19. package/templates/hermes-agent/runtime-scaffold/README.md +1 -1
  20. package/templates/hermes-agent/runtime-scaffold/bloodbank-consumer.py +46 -14
  21. package/templates/hermes-agent/runtime-scaffold/memories/MEMORY.md +2 -2
  22. package/templates/hermes-agent/scripts/fleet-sync.sh +1 -64
  23. package/templates/hermes-agent/template/.gitignore.jinja +0 -2
  24. package/templates/hermes-agent/template/.runtime-scaffold/README.md +1 -1
  25. package/templates/hermes-agent/template/.runtime-scaffold/bloodbank-consumer.py +43 -9
  26. package/templates/hermes-agent/template/.runtime-scaffold/memories/MEMORY.md +2 -2
  27. package/templates/hermes-agent/template/.scripts/01-config.sh +0 -1
  28. package/templates/hermes-agent/template/.scripts/05-fleet-env.sh +0 -9
  29. package/templates/hermes-agent/template/.scripts/10-hermes-profile.sh +3 -22
  30. package/templates/hermes-agent/template/.scripts/20-runtime-repo.sh +0 -22
  31. package/templates/hermes-agent/template/.scripts/40-plane.sh +51 -0
  32. package/templates/hermes-agent/template/.scripts/42-ticket-provider.sh +59 -21
  33. package/templates/hermes-agent/template/.scripts/60-bloodbank.sh +2 -1
  34. package/templates/hermes-agent/template/.scripts/70-systemd.sh +1 -10
  35. package/templates/hermes-agent/template/.scripts/_lib.sh +3 -61
  36. package/templates/hermes-agent/template/.scripts/config.example.toml +0 -5
  37. package/templates/hermes-agent/template/.scripts/heartbeat.sh +22 -66
  38. package/templates/hermes-agent/template/.scripts/lib/ticket-provider.sh +5 -9
  39. package/templates/hermes-agent/template/.scripts/providers/linear.sh +176 -0
  40. package/templates/hermes-agent/template/.scripts/providers/plane.sh +9 -29
  41. package/templates/hermes-agent/template/.scripts/sentinel/docs/autonomous-delegated-review.md +2 -2
  42. package/templates/hermes-agent/template/.scripts/sentinel/docs/continuous-ticket-orchestration.md +1 -1
  43. package/templates/hermes-agent/template/.scripts/sentinel.prompt.md.jinja +1 -6
  44. package/templates/hermes-agent/template/SOUL.md.jinja +19 -21
  45. package/templates/hermes-agent/template/role.yaml.jinja +35 -4
  46. package/templates/hermes-agent/tests/test_bloodbank_consumer_contract.py +138 -0
  47. package/templates/hermes-agent/docs/bloodbank-gateway.md +0 -57
  48. 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-provider enforcement, and multi-agent development tooling.
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
- - **Ticket Provider Integration**: `.project.json` records Plane or Trello board bindings
10
- - **Ticket Enforcement**: Git hooks enforce configured ticket-provider requirements
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 a provider key if you want automated board creation/linking
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: ticket board creation/linking + Copier template:
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/links the configured ticket board automatically
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 or link the configured ticket board
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
- ### Ticket Provider Integration
86
+ ### Plane Integration
87
87
 
88
- - **Provider**: Plane or Trello
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 or Claim Ticket**
113
+ 3. **Create Plane Ticket**
115
114
 
116
115
  ```bash
117
- # Create or claim a ticket in the configured provider
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
- # - Ticket-provider metadata (Plane or Trello)
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. Plane boards can be created before
34
- # Copier runs; Trello boards are linked by id/url. The board identity is
35
- # persisted into .project.json so it is the single source of truth shared with
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
- # Back-compat aliases kept for existing pjangler/CommonProject callers.
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
- {% set ticket_board_id = board_id | default(plane_project_id) -%}
2
- {% set workspace = ticket_workspace | default(plane_workspace if ticket_provider == 'plane' else '') -%}
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": {{ workspace | tojson }},
13
+ "workspace": {{ plane_workspace | tojson }},
11
14
  "identifier": {{ project_identifier | tojson }},
12
- "board_id": {{ ticket_board_id | tojson }},
13
- "state": {{ ("linked" if ticket_board_id else "planned") | tojson }}
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 | Ticket board binding, bmad init, mise tasks | Ticket board binding, Telegram bot wiring, agent-hm-* runtime repo, systemd units |
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 (Plane or
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 or bind the configured ticket board
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`, `pm_external_skill_dirs`, `symlinked_runtime_skills` | Shared runtime skills plus PM external skill libraries |
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-42-ticket-provider
142
- SKIP_SYSTEMD=1 ./.scripts/42-ticket-provider.sh
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 ticket board
150
- if the provider supports archival, `/deletebot` in BotFather, archive the
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
- # hermes-agent-template — distributable configuration
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 or binds the configured ticket board
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, ticket
21
- # provider defaults, NATS endpoint, skills dir, …) are NOT hardcoded — they live in
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 Ticket Board Per Repo
95
+ ## One Plane project per agent
96
96
 
97
- The configured ticket board is the natural unit of work isolation. The PM owns
98
- one board per repo and routes worker agents through that shared source of truth,
99
- so decisions, filters, and review state stay coherent.
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.<repo>.>` — events affecting this repo
105
- - `bloodbank.cmd.v1.agent.<agent_id>.>` — commands targeting THIS agent specifically
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
- spec is owned by Holyfields (`~/code/33GOD/bloodbank/docs/event-naming.md`).
110
-
111
- The current generated consumer is a transitional NATS receiver and audit
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
- | 42 ticket provider | Create or bind the configured ticket board, patch identifier into role.yaml | `SKIP_PLANE=1` |
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 subject `bloodbank.cmd.v1.agent.<agent_id>.<verb>.requested` |
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 the ticket board if the provider supports archival
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: ${PLANE_API_KEY:-${PLANE_33GOD_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 actually publishing to `bloodbank.evt.v1.repo.<repo>.*`
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 PLANE_33GOD_API_KEY=<key> # or PLANE_API_KEY / TRELLO_KEY + TRELLO_TOKEN
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 ticket board, and the Telegram step is
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 identity/personality manifest. Repo-owned board binding and reconciliation knobs live in repo-root `.project.json`. |
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 is done).
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 the supported ticket back ends: Plane and
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 PLANE_33GOD_API_KEY=<key> # or PLANE_API_KEY / TRELLO_KEY + TRELLO_TOKEN
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`, `HAT_TRELLO_BOARD`,
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 ticket board. Don't run full
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 or linking the ticket board. |
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=trello
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
- repo-root `.project.json`. For Trello, set `ticket_provider.board_id` to the
189
- board id; for Plane, set `ticket_provider.workspace` and `ticket_provider.board_id`.
190
- Make the provider key available to the heartbeat's environment: on Linux through
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 is verified live
261
- (including `transition` and `comment`). Trello is implemented against
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.