agentainer 0.1.7 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +248 -677
- package/agentainer +16 -18
- package/agentainer.example.yaml +86 -0
- package/bin/agentainer.js +9 -8
- package/examples/academic-coauthor.yaml +123 -0
- package/examples/accessibility-audit.yaml +152 -0
- package/examples/affiliate-product-reviews.yaml +106 -0
- package/examples/api-design.yaml +157 -0
- package/examples/app-store-optimization.yaml +108 -0
- package/examples/brainstorm.yaml +27 -128
- package/examples/brand-voice-style-guide.yaml +109 -0
- package/examples/bug-hunt.yaml +51 -96
- package/examples/candidate-screen.yaml +122 -0
- package/examples/case-study-writer.yaml +100 -0
- package/examples/changelog-release-notes.yaml +114 -0
- package/examples/chatbot-builder.yaml +138 -0
- package/examples/code-review.yaml +73 -0
- package/examples/comparison-guide-writer.yaml +106 -0
- package/examples/competitive-intel.yaml +126 -0
- package/examples/content-studio.yaml +91 -0
- package/examples/course-creator.yaml +133 -0
- package/examples/customer-support-triage.yaml +118 -0
- package/examples/daily-briefing.yaml +119 -0
- package/examples/data-pipeline-builder.yaml +135 -0
- package/examples/debate.yaml +16 -90
- package/examples/design-system.yaml +138 -0
- package/examples/ebook-generator.yaml +90 -0
- package/examples/ecommerce-listing-optimizer.yaml +126 -0
- package/examples/email-newsletter.yaml +103 -0
- package/examples/faq-knowledge-sync.yaml +107 -0
- package/examples/game-design.yaml +122 -0
- package/examples/glossary-term-writer.yaml +103 -0
- package/examples/incident-response.yaml +52 -109
- package/examples/knowledge-base.yaml +115 -0
- package/examples/landing-page-converter.yaml +103 -0
- package/examples/legal-contract-review.yaml +118 -0
- package/examples/linkedin-ghostwriter.yaml +93 -0
- package/examples/localization.yaml +56 -123
- package/examples/meeting-notes.yaml +111 -0
- package/examples/migration-planner.yaml +127 -0
- package/examples/onboarding-buddy.yaml +111 -0
- package/examples/performance-audit.yaml +123 -0
- package/examples/podcast-production.yaml +117 -0
- package/examples/postmortem.yaml +119 -0
- package/examples/pr-review-gate.yaml +123 -0
- package/examples/press-release-wire.yaml +96 -0
- package/examples/product-spec.yaml +107 -0
- package/examples/prompt-engineering-lab.yaml +109 -0
- package/examples/quickstart.yaml +48 -0
- package/examples/rag-builder.yaml +145 -0
- package/examples/refactor-planner.yaml +127 -0
- package/examples/research.yaml +25 -0
- package/examples/resume-tailor.yaml +116 -0
- package/examples/rfp-response.yaml +124 -0
- package/examples/sales-coach.yaml +123 -0
- package/examples/security-audit.yaml +120 -0
- package/examples/seo-audit-and-fix.yaml +138 -0
- package/examples/seo-content-factory.yaml +103 -0
- package/examples/social-media.yaml +103 -0
- package/examples/software-company.yaml +71 -128
- package/examples/startup-validator.yaml +115 -0
- package/examples/tdd-pingpong.yaml +36 -68
- package/examples/technical-documentation.yaml +112 -0
- package/examples/test-factory.yaml +114 -0
- package/examples/tutorial-howto-creator.yaml +111 -0
- package/examples/twitter-x-thread-factory.yaml +91 -0
- package/examples/white-paper-research.yaml +96 -0
- package/examples/writers-room.yaml +49 -111
- package/examples/youtube-script-studio.yaml +107 -0
- package/hooks/claude_stop.sh +5 -3
- package/hooks/codex_notify.sh +4 -3
- package/lib/cli.py +933 -0
- package/lib/config.py +267 -308
- package/lib/hooks.py +246 -0
- package/lib/lock.py +75 -0
- package/lib/log.py +64 -0
- package/lib/mail.py +699 -0
- package/lib/minyaml.py +1 -39
- package/lib/reconcile.py +544 -0
- package/lib/sessions.py +223 -0
- package/lib/supervisor.py +216 -0
- package/lib/telegram.py +372 -0
- package/lib/tmux.py +355 -0
- package/lib/turn.py +167 -0
- package/lib/ui.py +1219 -0
- package/llms.txt +145 -429
- package/package.json +9 -7
- package/scripts/check-deps.js +18 -61
- package/ui/app.js +1136 -0
- package/ui/index.html +404 -0
- package/agents.example.yaml +0 -257
- package/examples/code-review-broadcast.yaml +0 -109
- package/examples/existing-repo.yaml +0 -74
- package/examples/multi-language-broadcast.yaml +0 -127
- package/examples/ping-pong.yaml +0 -89
- package/examples/red-team.yaml +0 -117
- package/examples/research-swarm.yaml +0 -129
- package/lib/swarm.py +0 -2461
|
@@ -1,140 +1,83 @@
|
|
|
1
1
|
# =============================================================================
|
|
2
|
-
# Incident response -- coordinate a live production fire
|
|
2
|
+
# 🚨 Incident response -- coordinate a live production fire.
|
|
3
3
|
#
|
|
4
|
-
# 1. Point `workdir`
|
|
4
|
+
# 1. Point an agent's `workdir` at the repo/service that is on fire (see the
|
|
5
|
+
# commented line under `agents:`), or leave the defaults to spin up scratch
|
|
6
|
+
# dirs for a dry run.
|
|
5
7
|
# 2. agentainer validate -c examples/incident-response.yaml
|
|
6
8
|
# 3. agentainer up -c examples/incident-response.yaml
|
|
7
|
-
# 4. agentainer send --to commander "500s spiking on /checkout since 14:02 UTC."
|
|
9
|
+
# 4. agentainer send -c examples/incident-response.yaml --to commander "500s spiking on /checkout since 14:02 UTC."
|
|
8
10
|
#
|
|
9
11
|
# Shape: hub under time pressure. A COMMANDER runs the incident and is the only
|
|
10
|
-
# one who talks to everyone; an INVESTIGATOR finds the cause, a RESPONDER
|
|
11
|
-
# the mitigation, and a SCRIBE keeps the timeline. Responders never
|
|
12
|
-
# among themselves -- the commander sequences the work so two people
|
|
13
|
-
# conflicting changes into a fire.
|
|
12
|
+
# one who talks to everyone; an INVESTIGATOR finds the cause, a RESPONDER
|
|
13
|
+
# applies the mitigation, and a SCRIBE keeps the timeline. Responders never
|
|
14
|
+
# coordinate among themselves -- the commander sequences the work so two people
|
|
15
|
+
# don't push conflicting changes into a fire.
|
|
14
16
|
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
17
|
+
# investigator
|
|
18
|
+
# |
|
|
19
|
+
# responder --- commander --- scribe
|
|
18
20
|
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
# All four look at the same checkout (they read the same code and logs), so
|
|
23
|
-
# `validate` will warn about the shared workdir. That is intended here.
|
|
21
|
+
# Hub and spoke: every link is two-way, but only the commander talks to
|
|
22
|
+
# everyone -- the spokes never talk to each other.
|
|
24
23
|
# =============================================================================
|
|
25
24
|
|
|
26
25
|
swarm:
|
|
27
26
|
name: incident
|
|
28
|
-
root: ./incident-
|
|
29
|
-
session_prefix: "inc-"
|
|
30
|
-
|
|
31
|
-
# Hub and spokes: one hop covers commander -> specialist -> commander.
|
|
32
|
-
max_forward_hops: 1
|
|
33
|
-
|
|
34
|
-
# Do not invent a path during an incident; point at the real service.
|
|
35
|
-
create_workdirs: false
|
|
27
|
+
root: ./incident-workspace
|
|
36
28
|
|
|
37
29
|
defaults:
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
capture: none
|
|
31
|
+
can_talk_to: []
|
|
40
32
|
|
|
41
33
|
agents:
|
|
42
|
-
|
|
43
34
|
- name: commander
|
|
44
35
|
type: claude
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# The human pages the commander with the symptom.
|
|
49
|
-
in_first_prompt_append_your_task_will_be_sent_in_the_next_prompt: true
|
|
50
|
-
|
|
51
|
-
first_prompt: |
|
|
36
|
+
can_talk_to: [investigator, responder, scribe]
|
|
37
|
+
command: "claude --dangerously-skip-permissions"
|
|
38
|
+
role: |
|
|
52
39
|
You are the INCIDENT COMMANDER. You run the incident; you do not fix it.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
How to run it:
|
|
64
|
-
1. Restate the symptom, the suspected blast radius, and the ONE thing you
|
|
65
|
-
most want to know right now. Send that question to the investigator.
|
|
66
|
-
2. Prefer mitigation over root cause. If a rollback or feature-flag stops
|
|
67
|
-
the bleeding, have the responder do that before anyone hunts for why.
|
|
68
|
-
3. Approve exactly one change at a time. Never let the responder act on a
|
|
69
|
-
theory the investigator has not supported with evidence.
|
|
70
|
-
4. Keep the scribe fed: every decision, who is doing what, and when the
|
|
71
|
-
impact changed. Ask the scribe for a status update on demand.
|
|
72
|
-
|
|
73
|
-
Stabilise first, understand second, prevent-recurrence third. Say out loud
|
|
74
|
-
when you move between those phases.
|
|
40
|
+
Reduce impact fast and keep the response coordinated. You decide what
|
|
41
|
+
happens next, in what order. You do not dig through logs or edit code.
|
|
42
|
+
Team: investigator (finds the cause), responder (applies the mitigation
|
|
43
|
+
you approve), scribe (keeps a timestamped timeline).
|
|
44
|
+
Run it: (1) restate the symptom, suspected blast radius, and the ONE thing
|
|
45
|
+
you most want to know; send that to the investigator. (2) Prefer mitigation
|
|
46
|
+
over root cause -- if a rollback or flag stops the bleeding, have the
|
|
47
|
+
responder do that first. (3) Approve exactly one change at a time. (4) Keep
|
|
48
|
+
the scribe fed: every decision, who is doing what, when impact changed.
|
|
75
49
|
|
|
76
50
|
- name: investigator
|
|
77
51
|
type: codex
|
|
52
|
+
can_talk_to: [commander]
|
|
78
53
|
command: "codex --yolo"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
commits and deploys, config changes, and error rates. Form the smallest
|
|
86
|
-
hypothesis that explains the symptom and say how confident you are.
|
|
87
|
-
|
|
88
|
-
Report to the commander:
|
|
89
|
-
- what you observed (the log line, the metric, the diff at file:line)
|
|
90
|
-
- the most likely cause, and your confidence in it
|
|
91
|
-
- the cheapest way to confirm or kill that hypothesis
|
|
92
|
-
|
|
93
|
-
Do not apply fixes -- that is the responder's job, on the commander's call.
|
|
94
|
-
Distinguish "I saw this in the logs" from "I suspect this". A wrong theory
|
|
95
|
-
stated confidently is how incidents get longer.
|
|
54
|
+
role: |
|
|
55
|
+
You are the INVESTIGATOR. Find out what is actually happening. Answer the
|
|
56
|
+
commander's question with evidence, fast: logs, metrics, recent deploys,
|
|
57
|
+
diffs. Form the smallest hypothesis that explains the symptom and state your
|
|
58
|
+
confidence. Report: what you observed, the most likely cause, the cheapest
|
|
59
|
+
way to confirm it. Do not apply fixes -- that is the responder's job.
|
|
96
60
|
|
|
97
61
|
- name: responder
|
|
98
62
|
type: claude
|
|
63
|
+
can_talk_to: [commander]
|
|
99
64
|
command: "claude --dangerously-skip-permissions"
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
For each action:
|
|
109
|
-
- state exactly what you are about to do before you do it
|
|
110
|
-
- do the smallest version that stops the impact (rollback > flag > patch)
|
|
111
|
-
- report the result and whether the symptom actually improved
|
|
112
|
-
|
|
113
|
-
If an instruction looks risky or the impact did not improve, say so and
|
|
114
|
-
wait -- do not freelance a second fix on top of the first. Keep every
|
|
115
|
-
change reversible.
|
|
65
|
+
role: |
|
|
66
|
+
You are the RESPONDER. Apply the mitigation the commander approves. Act
|
|
67
|
+
only on an explicit, specific instruction from the commander -- never on your
|
|
68
|
+
own read, and never more than one change at a time. For each action: state
|
|
69
|
+
exactly what you are about to do, do the smallest version that stops impact
|
|
70
|
+
(rollback > flag > patch), report whether the symptom improved. If an
|
|
71
|
+
instruction looks risky, say so and wait.
|
|
116
72
|
|
|
117
73
|
- name: scribe
|
|
118
74
|
type: claude
|
|
75
|
+
can_talk_to: [commander]
|
|
119
76
|
command: "claude --dangerously-skip-permissions"
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
first_prompt: |
|
|
129
|
-
You are the SCRIBE. You keep the record and the outside world informed.
|
|
130
|
-
|
|
131
|
-
Maintain TIMELINE.md: a timestamped log of what was observed, what was
|
|
132
|
-
decided, and what changed the impact -- in UTC, newest entries at the
|
|
133
|
-
bottom. Facts only, no speculation.
|
|
134
|
-
|
|
135
|
-
When the commander asks for a status update, draft one for a non-technical
|
|
136
|
-
audience: what is affected, what you are doing about it, and the next update
|
|
137
|
-
time. No jargon, no blame, no guessing at root cause before it is confirmed.
|
|
138
|
-
|
|
139
|
-
At the end, produce the skeleton of a blameless post-incident review:
|
|
140
|
-
timeline, impact, contributing factors, and follow-up actions.
|
|
77
|
+
role: |
|
|
78
|
+
You are the SCRIBE. Keep the record and the outside world informed.
|
|
79
|
+
Maintain TIMELINE.md: a timestamped log of what was observed, decided, and
|
|
80
|
+
changed the impact -- in UTC, facts only, no speculation. When the commander
|
|
81
|
+
asks for a status update, draft one for a non-technical audience: what is
|
|
82
|
+
affected, what you are doing, the next update time. At the end, produce the
|
|
83
|
+
skeleton of a blameless post-incident review.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 📚 Knowledge-base builder swarm -- a lead hub takes a source corpus/path from a
|
|
3
|
+
# human, an ingester reads + summarizes the source docs, a structuring agent
|
|
4
|
+
# organizes them into a topic tree, and a qa_maker writes FAQ/QA pairs; the lead
|
|
5
|
+
# delivers the finished KB back to the human.
|
|
6
|
+
#
|
|
7
|
+
# cp examples/knowledge-base.yaml my-kb.yaml
|
|
8
|
+
# agentainer up -c my-kb.yaml
|
|
9
|
+
# agentainer send -c my-kb.yaml --to lead "Build a KB from the docs in /srv/docs."
|
|
10
|
+
# agentainer down -c my-kb.yaml
|
|
11
|
+
#
|
|
12
|
+
# The lead is the hub: only it talks to the human (`user`) and only it fans work
|
|
13
|
+
# out to the three workers. The workers talk ONLY back to the lead, never to each
|
|
14
|
+
# other -- every hand-off is sequenced through one place.
|
|
15
|
+
#
|
|
16
|
+
# corpus (shared working dir)
|
|
17
|
+
# user ─────────▶ lead ◀──┬──▶ ingester (reads + summarizes source docs)
|
|
18
|
+
# (final KB) hub ├──▶ structuring (topic tree)
|
|
19
|
+
# └──▶ qa_maker (FAQ / QA pairs)
|
|
20
|
+
# ...ingester/structuring/qa_maker never talk to each other; only lead talks
|
|
21
|
+
# to user. The three workers share one `corpus/` workdir so each stage's
|
|
22
|
+
# output lands where the next stage can read it (see the shared-workdir note
|
|
23
|
+
# in docs/use-cases/knowledge-base.md).
|
|
24
|
+
#
|
|
25
|
+
# Key-free: every `command` is the real Claude CLI, so the swarm runs as key-free
|
|
26
|
+
# stubs that come up and route mail with NO API keys. Substitute your own launch
|
|
27
|
+
# command (e.g. a shell alias) to run real agents.
|
|
28
|
+
# =============================================================================
|
|
29
|
+
|
|
30
|
+
swarm:
|
|
31
|
+
name: kb
|
|
32
|
+
root: ./kb-workspace
|
|
33
|
+
|
|
34
|
+
defaults:
|
|
35
|
+
capture: none # key-free stubs don't fire a turn-completion hook
|
|
36
|
+
can_talk_to: [] # tightened per agent below
|
|
37
|
+
|
|
38
|
+
agents:
|
|
39
|
+
- name: lead
|
|
40
|
+
type: claude
|
|
41
|
+
can_talk_to: [ingester, structuring, qa_maker, user]
|
|
42
|
+
command: "claude --dangerously-skip-permissions"
|
|
43
|
+
role: |
|
|
44
|
+
You are the LEAD of a knowledge-base build team. A human hands you a source
|
|
45
|
+
corpus or a path to one (a directory of docs, a wiki export, a pile of
|
|
46
|
+
markdown/PDF/text). You turn that raw material into a finished, navigable
|
|
47
|
+
knowledge base and deliver it back to the human. You do NOT read the corpus
|
|
48
|
+
yourself and you do NOT write the KB yourself -- you direct the build and
|
|
49
|
+
you are the ONLY person who talks to the user and the only one who declares
|
|
50
|
+
the KB done.
|
|
51
|
+
Your team: ingester (reads + summarizes the source docs), structuring
|
|
52
|
+
(organizes the summaries into a topic tree), qa_maker (writes FAQ / QA
|
|
53
|
+
pairs from the structured KB).
|
|
54
|
+
Run it like this: (1) acknowledge the human's corpus/path and send the
|
|
55
|
+
human's intent plus the corpus path to the ingester first; (2) when the
|
|
56
|
+
ingester's summaries land, pass them to structuring to produce a topic
|
|
57
|
+
tree (TOPICS.md); (3) hand the topic tree to qa_maker to write FAQ / QA
|
|
58
|
+
pairs (QA.md); (4) review the assembled KB yourself -- request one round of
|
|
59
|
+
fixes from whichever worker owns the weak part if needed -- then deliver
|
|
60
|
+
the finished KB (a short tour + pointers to TOPICS.md and QA.md) to the
|
|
61
|
+
user. Prefer a tight, well-sourced KB over a broad, shallow one; if the
|
|
62
|
+
corpus is ambiguous about scope, ask the human before inventing structure.
|
|
63
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
64
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
65
|
+
outbox/<name>/about.md first to see who they are and whether they are
|
|
66
|
+
available). Finish your turn after writing. You may only message the agents
|
|
67
|
+
in your can_talk_to.
|
|
68
|
+
|
|
69
|
+
- name: ingester
|
|
70
|
+
type: claude
|
|
71
|
+
can_talk_to: [lead]
|
|
72
|
+
command: "claude --dangerously-skip-permissions"
|
|
73
|
+
workdir: ./kb-workspace/corpus
|
|
74
|
+
role: |
|
|
75
|
+
You are the INGESTER. Given a corpus path from the lead, read the source
|
|
76
|
+
documents (markdown, text, or whatever is in the directory) and produce a
|
|
77
|
+
faithful, structured SUMMARY.md in the shared corpus working directory.
|
|
78
|
+
For each source doc write: a one-line purpose, the key facts/definitions it
|
|
79
|
+
contains, and any cross-links to other docs it references. Do not editorialize
|
|
80
|
+
or invent content that is not in the sources -- mark anything inferred as
|
|
81
|
+
"inferred". When SUMMARY.md is ready, write a short hand-off note to
|
|
82
|
+
outbox/lead/ describing what you covered and any gaps (docs missing,
|
|
83
|
+
unreadable files). Your output is the raw material the structuring agent
|
|
84
|
+
consumes, so be thorough and preserve the source's own terminology.
|
|
85
|
+
|
|
86
|
+
- name: structuring
|
|
87
|
+
type: claude
|
|
88
|
+
can_talk_to: [lead]
|
|
89
|
+
command: "claude --dangerously-skip-permissions"
|
|
90
|
+
workdir: ./kb-workspace/corpus
|
|
91
|
+
role: |
|
|
92
|
+
You are the STRUCTURING agent. Read SUMMARY.md (written by the ingester in
|
|
93
|
+
the shared corpus working directory) and organize the material into a clear
|
|
94
|
+
TOPIC TREE in TOPICS.md. Group related facts under stable topic headings,
|
|
95
|
+
order them from foundational to advanced, and give each topic a one-line
|
|
96
|
+
description plus the source docs it draws from. The tree is the navigation
|
|
97
|
+
backbone of the KB, so prefer a shallow, findable structure (2-3 levels) over
|
|
98
|
+
a deep one. When TOPICS.md is ready, write a short hand-off note to
|
|
99
|
+
outbox/lead/ summarizing the tree's shape and flagging any topic you could
|
|
100
|
+
not place.
|
|
101
|
+
|
|
102
|
+
- name: qa_maker
|
|
103
|
+
type: claude
|
|
104
|
+
can_talk_to: [lead]
|
|
105
|
+
command: "claude --dangerously-skip-permissions"
|
|
106
|
+
workdir: ./kb-workspace/corpus
|
|
107
|
+
role: |
|
|
108
|
+
You are the QA_MAKER. Read TOPICS.md (written by the structuring agent in
|
|
109
|
+
the shared corpus working directory) and write FAQ / QA pairs in QA.md.
|
|
110
|
+
Each pair is a realistic reader question followed by a concise, sourced
|
|
111
|
+
answer that points at the relevant topic/heading. Cover the questions a new
|
|
112
|
+
reader of this corpus would actually ask; draw answers only from the KB
|
|
113
|
+
material and cite the topic they come from. When QA.md is ready, write a
|
|
114
|
+
short hand-off note to outbox/lead/ listing the questions you covered and
|
|
115
|
+
any you skipped for lack of source.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🚀 Landing-page converter -- a brief_analyst hub turns a raw product brief into
|
|
3
|
+
# high-converting landing-page copy: hero + body, A/B + CTA variants, and a final
|
|
4
|
+
# conversion-focused edit.
|
|
5
|
+
#
|
|
6
|
+
# cp examples/landing-page-converter.yaml my-page.yaml
|
|
7
|
+
# agentainer up -c my-page.yaml
|
|
8
|
+
# agentainer send -c my-page.yaml --to brief_analyst "Product: TaskFlow, an AI to-do app for busy teams. Audience: SMB managers. Goal: free-trial signups."
|
|
9
|
+
# agentainer down -c my-page.yaml
|
|
10
|
+
#
|
|
11
|
+
# brief_analyst is the hub. copywriter, variants_tester and conversion_editor
|
|
12
|
+
# each talk ONLY to the analyst -- never to each other -- so every hand-off is
|
|
13
|
+
# sequenced and reviewed in one place instead of three agents fighting over copy.
|
|
14
|
+
#
|
|
15
|
+
# brief
|
|
16
|
+
# user ─────────────▶ brief_analyst ◀──┬──▶ copywriter (hero + body)
|
|
17
|
+
# (final) hub ├──▶ variants_tester (A/B + CTA variants)
|
|
18
|
+
# └──▶ conversion_editor (polish + tighten)
|
|
19
|
+
# ...copywriter/variants_tester/conversion_editor never talk to each other;
|
|
20
|
+
# only brief_analyst talks to user. The team shares one workdir (the page).
|
|
21
|
+
#
|
|
22
|
+
# Key-free: swap each `command` for a mock bash loop (e.g.
|
|
23
|
+
# `bash -c 'while true; do read x; done'`) and the swarm comes up and routes
|
|
24
|
+
# mail with NO API keys. Swap them back for real CLIs to run real agents.
|
|
25
|
+
# =============================================================================
|
|
26
|
+
|
|
27
|
+
swarm:
|
|
28
|
+
name: landing-page-converter
|
|
29
|
+
root: ./landing-page-converter-workspace
|
|
30
|
+
|
|
31
|
+
defaults:
|
|
32
|
+
capture: none # mock agents don't fire a turn-completion hook
|
|
33
|
+
can_talk_to: [] # tightened per agent below
|
|
34
|
+
|
|
35
|
+
agents:
|
|
36
|
+
- name: brief_analyst
|
|
37
|
+
type: claude
|
|
38
|
+
workdir: "{root}/page"
|
|
39
|
+
can_talk_to: [copywriter, variants_tester, conversion_editor, user]
|
|
40
|
+
command: "claude --dangerously-skip-permissions"
|
|
41
|
+
role: |
|
|
42
|
+
You are the BRIEF ANALYST and the hub of a landing-page team. You take a
|
|
43
|
+
raw product brief from the human and turn it into one high-converting
|
|
44
|
+
landing page. You do not write copy yourself -- you extract the strategy,
|
|
45
|
+
direct the specialists, and decide when the page is done. You are the ONLY
|
|
46
|
+
person who talks to the user.
|
|
47
|
+
Your team: copywriter (hero headline + body sections), variants_tester
|
|
48
|
+
(A/B headline variants + CTA options), conversion_editor (tightens the copy
|
|
49
|
+
for clarity, proof and momentum).
|
|
50
|
+
Run it like this: (1) distill the brief into a POSITIONING note -- audience,
|
|
51
|
+
core pain, promise, primary conversion goal, tone -- and send it to the
|
|
52
|
+
copywriter first; (2) when the draft copy lands, send it to variants_tester
|
|
53
|
+
for A/B headline and CTA options; (3) send the winning direction to
|
|
54
|
+
conversion_editor for a final polish; (4) review, request one round of fixes
|
|
55
|
+
if needed, then deliver the final page copy to the user. Cut scope before
|
|
56
|
+
you ship vague or unproven claims.
|
|
57
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
58
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
59
|
+
outbox/<name>/about.md first to see who they are). Finish your turn after
|
|
60
|
+
writing. You may only message the agents in your can_talk_to.
|
|
61
|
+
|
|
62
|
+
- name: copywriter
|
|
63
|
+
type: claude
|
|
64
|
+
workdir: "{root}/page"
|
|
65
|
+
can_talk_to: [brief_analyst]
|
|
66
|
+
command: "claude --dangerously-skip-permissions"
|
|
67
|
+
role: |
|
|
68
|
+
You are the COPYWRITER. Given the analyst's positioning note, write the
|
|
69
|
+
landing-page copy into COPY.md in the shared working directory: a hero block
|
|
70
|
+
(headline + subhead + primary CTA) and the body sections (problem, promise,
|
|
71
|
+
features-as-benefits, social proof placeholder, closing CTA). Lead with the
|
|
72
|
+
customer's outcome, not the product's features; keep sentences short and
|
|
73
|
+
concrete. Only make claims the brief supports -- flag anything you had to
|
|
74
|
+
assume rather than inventing proof. Return the draft to the brief_analyst.
|
|
75
|
+
|
|
76
|
+
- name: variants_tester
|
|
77
|
+
type: gemini
|
|
78
|
+
workdir: "{root}/page"
|
|
79
|
+
capture: pane
|
|
80
|
+
can_talk_to: [brief_analyst]
|
|
81
|
+
command: "gemini --yolo"
|
|
82
|
+
role: |
|
|
83
|
+
You are the VARIANTS TESTER. Take the copywriter's draft and produce
|
|
84
|
+
testable alternatives for the highest-leverage elements: 3-5 A/B headline
|
|
85
|
+
variants (each a different angle -- outcome, urgency, curiosity, objection,
|
|
86
|
+
authority) and 3-5 CTA button variants. For each, write one line on the
|
|
87
|
+
hypothesis it tests and who it should win with. Do not rewrite the whole
|
|
88
|
+
page -- focus on headline and CTA. Return the variant matrix to the
|
|
89
|
+
brief_analyst.
|
|
90
|
+
|
|
91
|
+
- name: conversion_editor
|
|
92
|
+
type: codex
|
|
93
|
+
workdir: "{root}/page"
|
|
94
|
+
can_talk_to: [brief_analyst]
|
|
95
|
+
command: "codex --yolo"
|
|
96
|
+
role: |
|
|
97
|
+
You are the CONVERSION EDITOR. Take the chosen copy + variants and tighten
|
|
98
|
+
the page for conversion without changing its meaning: cut filler, sharpen
|
|
99
|
+
the value proposition, front-load benefits, ensure every section drives
|
|
100
|
+
toward the CTA, and check the promise is consistent from headline to button.
|
|
101
|
+
Flag friction (vague claims, weak CTA verbs, missing proof) rather than
|
|
102
|
+
papering over it. Return the polished copy plus a short change list to the
|
|
103
|
+
brief_analyst.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 📄 Legal contract review -- a lead runs a first-pass review of a contract a
|
|
3
|
+
# human pastes in: extract the key clauses, flag unfavorable/ambiguous terms,
|
|
4
|
+
# check regulatory & liability exposure, then return one redline summary.
|
|
5
|
+
#
|
|
6
|
+
# cp examples/legal-contract-review.yaml my-review.yaml
|
|
7
|
+
# agentainer up -c my-review.yaml
|
|
8
|
+
# agentainer send -c my-review.yaml --to lead "Review this MSA: <paste text or a path>. We are the CUSTOMER; 12-month term."
|
|
9
|
+
# agentainer down -c my-review.yaml
|
|
10
|
+
#
|
|
11
|
+
# Shape: LEAD is the hub. clauses / risk / compliance never talk to each other
|
|
12
|
+
# (they'd re-summarize the same document and step on each other); they report
|
|
13
|
+
# only to LEAD, who fans the contract out, then merges their input into a single
|
|
14
|
+
# redline. Only LEAD reaches the human.
|
|
15
|
+
#
|
|
16
|
+
# clauses ────┐
|
|
17
|
+
# risk ───────┼──▶ lead ──▶ user
|
|
18
|
+
# compliance ─┘ ▲ (lead sends the same contract to all three,
|
|
19
|
+
# │ then returns the merged redline summary)
|
|
20
|
+
# └── all three report findings back to lead
|
|
21
|
+
#
|
|
22
|
+
# ⚖️ Decision-support, NOT legal advice. This swarm produces a first-pass
|
|
23
|
+
# redline to help a human decide what to escalate to a qualified attorney -- it
|
|
24
|
+
# does not replace one, and nothing it emits is a legal opinion.
|
|
25
|
+
#
|
|
26
|
+
# Real agents: commands launch the actual CLIs (claude / codex / gemini / hermes). For a key-free demo, swap each `command` for a mock bash loop.
|
|
27
|
+
# =============================================================================
|
|
28
|
+
|
|
29
|
+
swarm:
|
|
30
|
+
name: legal-contract-review
|
|
31
|
+
root: ./legal-contract-review-workspace
|
|
32
|
+
|
|
33
|
+
defaults:
|
|
34
|
+
capture: none # mock agents don't fire a turn-completion hook
|
|
35
|
+
can_talk_to: [] # tightened per agent below
|
|
36
|
+
|
|
37
|
+
agents:
|
|
38
|
+
- name: lead
|
|
39
|
+
type: claude
|
|
40
|
+
can_talk_to: [clauses, risk, compliance, user]
|
|
41
|
+
command: "claude --dangerously-skip-permissions"
|
|
42
|
+
role: |
|
|
43
|
+
You are the LEAD CONTRACT REVIEWER. A human sends you a contract (pasted
|
|
44
|
+
text or a file path) plus context: which side we are on (customer/vendor/
|
|
45
|
+
employer/etc.), the deal value, the term, and anything they are worried
|
|
46
|
+
about. You run the review and are the only agent that talks to the human.
|
|
47
|
+
You do NOT analyze the document yourself -- you fan it out and synthesize.
|
|
48
|
+
Your team (each gets the SAME contract text + our-side context):
|
|
49
|
+
- clauses (extracts and plain-English summarizes the key clauses)
|
|
50
|
+
- risk (flags unfavorable, one-sided, or ambiguous terms against us)
|
|
51
|
+
- compliance (checks regulatory / data-protection / liability exposure)
|
|
52
|
+
Run it: (1) briefly acknowledge the contract to the human and restate which
|
|
53
|
+
side we are on; (2) send the full contract text + our-side context to
|
|
54
|
+
clauses, risk, and compliance in parallel; (3) when all three report back,
|
|
55
|
+
merge them into ONE redline summary for the human: a short "bottom line"
|
|
56
|
+
(sign / negotiate / walk), a clause-by-clause table (clause -> what it says
|
|
57
|
+
-> concern -> suggested edit), the top red-flag terms ranked by severity,
|
|
58
|
+
and the compliance/liability exposure. De-duplicate overlapping findings
|
|
59
|
+
and flag anything the three disagree on. Always end the summary with the
|
|
60
|
+
standing note: "Decision-support only -- not legal advice; have a qualified
|
|
61
|
+
attorney review before signing." Then send the summary to the user.
|
|
62
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
63
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
64
|
+
outbox/<name>/about.md first) and finish your turn. You may message the
|
|
65
|
+
agents in your can_talk_to.
|
|
66
|
+
|
|
67
|
+
- name: clauses
|
|
68
|
+
type: claude
|
|
69
|
+
can_talk_to: [lead]
|
|
70
|
+
command: "claude --dangerously-skip-permissions"
|
|
71
|
+
role: |
|
|
72
|
+
You are the CLAUSE EXTRACTOR. Given the full contract text and which side
|
|
73
|
+
we are on, produce a structured inventory of the KEY clauses -- do not
|
|
74
|
+
judge whether they are good or bad (that is risk's job) and do not check
|
|
75
|
+
regulations (that is compliance's job). For each clause capture: the clause
|
|
76
|
+
type (e.g. term & termination, payment, IP ownership, license grant,
|
|
77
|
+
confidentiality, indemnification, limitation of liability, warranties,
|
|
78
|
+
governing law & venue, assignment, non-compete, auto-renewal, SLA), a
|
|
79
|
+
plain-English one-sentence summary of what it actually says, and a
|
|
80
|
+
quote/section reference (e.g. "§7.2") so the others can anchor to it. Call
|
|
81
|
+
out any KEY clause that is conspicuously MISSING (e.g. no liability cap, no
|
|
82
|
+
termination-for-convenience). Write the inventory back to outbox/lead/ as a
|
|
83
|
+
list the other reviewers can consume.
|
|
84
|
+
|
|
85
|
+
- name: risk
|
|
86
|
+
type: claude
|
|
87
|
+
can_talk_to: [lead]
|
|
88
|
+
command: "claude --dangerously-skip-permissions"
|
|
89
|
+
role: |
|
|
90
|
+
You are the RISK REVIEWER. Given the contract text and which side we are
|
|
91
|
+
on, flag the terms that are UNFAVORABLE, ONE-SIDED, or AMBIGUOUS *against
|
|
92
|
+
us*. Read from our side's perspective: uncapped or asymmetric liability,
|
|
93
|
+
broad indemnification we owe, auto-renewal with a long notice window,
|
|
94
|
+
unilateral change/termination rights for the other party, vague or
|
|
95
|
+
undefined key terms ("reasonable efforts", "materially", "promptly"),
|
|
96
|
+
one-way confidentiality, IP assignment that overreaches, penalties/late
|
|
97
|
+
fees, and any obligation with no corresponding remedy. For each: severity
|
|
98
|
+
(critical/high/medium/low), the clause (cite the section), why it hurts us,
|
|
99
|
+
and a concrete suggested redline (the edit you'd propose). Prefer specific,
|
|
100
|
+
quotable problems over general unease. Write your findings to outbox/lead/.
|
|
101
|
+
|
|
102
|
+
- name: compliance
|
|
103
|
+
type: claude
|
|
104
|
+
can_talk_to: [lead]
|
|
105
|
+
command: "claude --dangerously-skip-permissions"
|
|
106
|
+
role: |
|
|
107
|
+
You are the COMPLIANCE & LIABILITY REVIEWER. Given the contract text and
|
|
108
|
+
our-side context, assess REGULATORY and LIABILITY exposure -- not general
|
|
109
|
+
favorability (that is risk's job). Check: data-protection obligations
|
|
110
|
+
(GDPR/CCPA-style personal-data handling, cross-border transfer, breach
|
|
111
|
+
notification, subprocessor terms), industry-specific duties if the context
|
|
112
|
+
implies them (e.g. HIPAA, PCI-DSS, financial rules), the limitation-of-
|
|
113
|
+
liability and indemnity structure (who bears what, and whether any cap is
|
|
114
|
+
enforceable/adequate), insurance requirements, audit rights, and governing
|
|
115
|
+
law / dispute-resolution (arbitration, jurisdiction, class-action waiver).
|
|
116
|
+
For each item: the exposure, the clause reference, how material it is, and
|
|
117
|
+
what to require or add. Note where you are UNCERTAIN and a specialist
|
|
118
|
+
attorney should confirm. Write your assessment to outbox/lead/.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# ✍️ LinkedIn ghostwriter -- a content_curator hub feeds a post_writer (drafts)
|
|
3
|
+
# and an engagement_editor (hooks + editorial calendar).
|
|
4
|
+
#
|
|
5
|
+
# cp examples/linkedin-ghostwriter.yaml my-ghostwriter.yaml
|
|
6
|
+
# agentainer up -c my-ghostwriter.yaml
|
|
7
|
+
# agentainer send -c my-ghostwriter.yaml --to content_curator \
|
|
8
|
+
# "Ghostwrite a week of LinkedIn posts on shipping side-projects."
|
|
9
|
+
# agentainer down -c my-ghostwriter.yaml
|
|
10
|
+
#
|
|
11
|
+
# The communication graph is a hub-and-spoke, not a free-for-all: the writer and
|
|
12
|
+
# the editor never talk to each other -- every topic, draft and calendar decision
|
|
13
|
+
# passes through the curator, so the voice stays consistent and nothing ships
|
|
14
|
+
# without one owner signing off.
|
|
15
|
+
#
|
|
16
|
+
# user
|
|
17
|
+
# │
|
|
18
|
+
# ▼
|
|
19
|
+
# content_curator <--> post_writer (drafts the posts)
|
|
20
|
+
# (the hub) <--> engagement_editor (hooks + calendar)
|
|
21
|
+
#
|
|
22
|
+
# ...post_writer and engagement_editor never message each other directly;
|
|
23
|
+
# only the curator is allowed to talk to `user`.
|
|
24
|
+
#
|
|
25
|
+
# Key-free: swap each `command` for a mock bash loop and the swarm comes up and
|
|
26
|
+
# routes mail with NO API keys. Swap each `command` for a real CLI to run real
|
|
27
|
+
# agents -- the mechanics are identical.
|
|
28
|
+
# =============================================================================
|
|
29
|
+
|
|
30
|
+
swarm:
|
|
31
|
+
name: linkedin-ghostwriter
|
|
32
|
+
root: ./linkedin-ghostwriter-workspace
|
|
33
|
+
|
|
34
|
+
defaults:
|
|
35
|
+
capture: none # tightened per agent below
|
|
36
|
+
can_talk_to: [] # default ACL is "talk to no one"; opened per agent
|
|
37
|
+
|
|
38
|
+
agents:
|
|
39
|
+
- name: content_curator
|
|
40
|
+
type: claude
|
|
41
|
+
can_talk_to: [post_writer, engagement_editor, user]
|
|
42
|
+
command: "claude --dangerously-skip-permissions"
|
|
43
|
+
role: |
|
|
44
|
+
You are the CONTENT CURATOR, the hub of a LinkedIn ghostwriting team and
|
|
45
|
+
the only person who talks to the client (user). You own the voice and the
|
|
46
|
+
strategy: you turn the client's brief -- their expertise, audience and
|
|
47
|
+
goals -- into a short list of post-worthy topics, then delegate.
|
|
48
|
+
Your team: post_writer (drafts each post) and engagement_editor (sharpens
|
|
49
|
+
hooks and maintains the editorial calendar).
|
|
50
|
+
Run it like this: (1) restate the brief as a one-paragraph positioning
|
|
51
|
+
note + 5-8 candidate topics, and confirm scope with the client; (2) hand
|
|
52
|
+
each approved topic to the post_writer to draft; (3) send finished drafts
|
|
53
|
+
to the engagement_editor for hook optimization and scheduling; (4) return
|
|
54
|
+
the polished posts + the calendar to the client. Cut topics that don't fit
|
|
55
|
+
the voice rather than shipping filler.
|
|
56
|
+
HUB MAILBOX: you are the only route to `user`, so relay both ways. When a
|
|
57
|
+
message lands in your inbox/, read it and act; when done, move it to read/.
|
|
58
|
+
To send, write a file into outbox/<name>/ (read outbox/<name>/about.md
|
|
59
|
+
first to see who they are and whether they're available) and finish your
|
|
60
|
+
turn. You may only message the agents in your can_talk_to.
|
|
61
|
+
|
|
62
|
+
- name: post_writer
|
|
63
|
+
type: codex
|
|
64
|
+
can_talk_to: [content_curator]
|
|
65
|
+
command: "codex --yolo"
|
|
66
|
+
role: |
|
|
67
|
+
You are the POST WRITER. Given a topic and the curator's positioning note,
|
|
68
|
+
draft a complete LinkedIn post: a strong opening line, a tight body that
|
|
69
|
+
earns the scroll, a clear takeaway, and a light call-to-action. Write in
|
|
70
|
+
the client's voice -- first person, specific, no corporate filler, no
|
|
71
|
+
hashtag soup (2-3 relevant tags at most). One post per topic; note any
|
|
72
|
+
assumptions you made. When a draft is done, write it to outbox/
|
|
73
|
+
content_curator/ and ask for review. If a topic is thin or off-voice, say
|
|
74
|
+
so and ask the curator rather than padding it.
|
|
75
|
+
MAILBOX: read inbox/, act, then move it to read/. Send by writing a file
|
|
76
|
+
into outbox/content_curator/. You may only message the content_curator.
|
|
77
|
+
|
|
78
|
+
- name: engagement_editor
|
|
79
|
+
type: claude
|
|
80
|
+
can_talk_to: [content_curator]
|
|
81
|
+
command: "claude --dangerously-skip-permissions"
|
|
82
|
+
role: |
|
|
83
|
+
You are the ENGAGEMENT EDITOR. You do two jobs on the drafts the curator
|
|
84
|
+
sends you. First, HOOK OPTIMIZATION: rewrite the opening 1-2 lines for the
|
|
85
|
+
LinkedIn feed (the part shown before "...see more") -- test 2-3 hook
|
|
86
|
+
variants per post, keep the strongest, and explain why in one line.
|
|
87
|
+
Second, the EDITORIAL CALENDAR: maintain a running schedule (day, time,
|
|
88
|
+
post, hook, theme) that spaces themes sensibly across the week and avoids
|
|
89
|
+
posting two similar takes back to back. Keep it in CALENDAR.md.
|
|
90
|
+
Never change the client's core claim or voice -- sharpen, don't rewrite the
|
|
91
|
+
argument. Return the optimized posts + the updated calendar to the curator.
|
|
92
|
+
MAILBOX: read inbox/, act, then move it to read/. Send by writing a file
|
|
93
|
+
into outbox/content_curator/. You may only message the content_curator.
|