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
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🔌 API design & build swarm -- a lead hub turns an API goal from a human into
|
|
3
|
+
# a shipped, documented HTTP API: spec lists the resources/endpoints, designer
|
|
4
|
+
# nails the request/response contracts, implementer builds the handlers in a
|
|
5
|
+
# shared repo, and docs writes the OpenAPI + examples. The lead delivers back.
|
|
6
|
+
#
|
|
7
|
+
# cp examples/api-design.yaml my-api.yaml
|
|
8
|
+
# agentainer up -c my-api.yaml
|
|
9
|
+
# agentainer send -c my-api.yaml --to lead "Design a REST API for a URL shortener with links, hits and users."
|
|
10
|
+
# agentainer down -c my-api.yaml
|
|
11
|
+
#
|
|
12
|
+
# Shape: a linear build pipeline with a single human-facing hub. Work flows
|
|
13
|
+
# forward spec -> designer -> implementer -> docs, each stage may ask the one
|
|
14
|
+
# before it a question, and the lead sits over all of them and is the ONLY agent
|
|
15
|
+
# that may talk to you.
|
|
16
|
+
#
|
|
17
|
+
# API goal
|
|
18
|
+
# user ─────────────▶ lead ─────────────▶ spec
|
|
19
|
+
# (final) ◀──────┴──┐ │ resource/endpoint list
|
|
20
|
+
# │ ▼
|
|
21
|
+
# docs ◀── implementer ◀── designer
|
|
22
|
+
# OpenAPI+examples handlers contracts
|
|
23
|
+
#
|
|
24
|
+
# ...arrows are the FORWARD flow; each stage may also mail the lead, and the
|
|
25
|
+
# next stage back one hop to question a contract. See can_talk_to below.
|
|
26
|
+
#
|
|
27
|
+
# Shared repo: implementer and docs share ONE workdir ({root}/api-repo) -- the
|
|
28
|
+
# implementer writes the handlers there and docs writes the OpenAPI spec + curl
|
|
29
|
+
# examples alongside them. The orchestrator namespaces their mailboxes
|
|
30
|
+
# automatically, so their inbox/outbox folders never collide (see
|
|
31
|
+
# custom-workspace.md). Point both `workdir` lines at your real service repo to
|
|
32
|
+
# build against existing code.
|
|
33
|
+
#
|
|
34
|
+
# Key-free: every `command` is a REAL coding-agent CLI, so the swarm routes real
|
|
35
|
+
# mail with NO mock loops -- but the launch strings are PLACEHOLDERS. Substitute
|
|
36
|
+
# your own command (e.g. a shell alias that carries your API key). Treat command
|
|
37
|
+
# strings as sensitive; never print or commit secrets.
|
|
38
|
+
# =============================================================================
|
|
39
|
+
|
|
40
|
+
swarm:
|
|
41
|
+
name: api-design
|
|
42
|
+
root: ./api-design-workspace
|
|
43
|
+
|
|
44
|
+
defaults:
|
|
45
|
+
capture: none # upgraded to the type's hook for claude/codex at up
|
|
46
|
+
can_talk_to: [] # tightened per agent below
|
|
47
|
+
|
|
48
|
+
agents:
|
|
49
|
+
- name: lead
|
|
50
|
+
type: claude
|
|
51
|
+
can_talk_to: [spec, designer, implementer, docs, user]
|
|
52
|
+
command: "claude --dangerously-skip-permissions"
|
|
53
|
+
role: |
|
|
54
|
+
You are the API LEAD and the only human-facing agent. A human (the `user`)
|
|
55
|
+
gives you an API goal -- a product need, not a spec -- and you drive it to a
|
|
56
|
+
built, documented API by sequencing four specialists. You do not write the
|
|
57
|
+
spec, the contracts, the handlers, or the docs yourself; you decide scope,
|
|
58
|
+
order the work, and own the definition of done.
|
|
59
|
+
Your team: spec (lists the resources and endpoints), designer (defines the
|
|
60
|
+
exact request/response contracts), implementer (builds the handlers in the
|
|
61
|
+
shared api-repo), docs (writes the OpenAPI document and usage examples).
|
|
62
|
+
Run it like this: (1) restate the goal as one paragraph plus a short list of
|
|
63
|
+
must-have capabilities and constraints (auth, versioning, pagination), and
|
|
64
|
+
send it to spec first; (2) when spec returns the endpoint list, pass it to
|
|
65
|
+
designer; (3) when the contracts are settled, brief implementer; (4) once the
|
|
66
|
+
handlers exist, have docs produce the OpenAPI + examples; (5) review the whole
|
|
67
|
+
thing against your acceptance list, then deliver a short summary to the user
|
|
68
|
+
(what the API does, where the spec and code live, anything cut). Cut scope
|
|
69
|
+
rather than ship a half-built endpoint.
|
|
70
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
71
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
72
|
+
outbox/<name>/about.md first) and finish your turn. You may message the
|
|
73
|
+
agents in your can_talk_to.
|
|
74
|
+
|
|
75
|
+
- name: spec
|
|
76
|
+
type: claude
|
|
77
|
+
can_talk_to: [lead, designer]
|
|
78
|
+
command: "claude --dangerously-skip-permissions"
|
|
79
|
+
role: |
|
|
80
|
+
You are the API SPEC author. Given the lead's goal, produce the resource
|
|
81
|
+
model and the endpoint list -- nothing more. Name each resource, its fields
|
|
82
|
+
at a high level, and the relationships between them. Then list every endpoint
|
|
83
|
+
as METHOD + path + one line on what it does (e.g. `POST /links -> create a
|
|
84
|
+
short link`, `GET /links/{code}/hits -> list hits for a link`). Cover the
|
|
85
|
+
full CRUD surface each resource needs, plus any collection/sub-resource
|
|
86
|
+
routes the goal implies; call out auth-gated routes and where pagination
|
|
87
|
+
applies. Do NOT define request/response bodies or status codes -- that is the
|
|
88
|
+
designer's job. Write the list in ENDPOINTS.md, then send it to designer and
|
|
89
|
+
copy the lead. If the goal is ambiguous, ask the lead; do not invent scope.
|
|
90
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
91
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
92
|
+
outbox/<name>/about.md first) and finish your turn. You may message the
|
|
93
|
+
agents in your can_talk_to.
|
|
94
|
+
|
|
95
|
+
- name: designer
|
|
96
|
+
type: claude
|
|
97
|
+
can_talk_to: [lead, spec, implementer]
|
|
98
|
+
command: "claude --dangerously-skip-permissions"
|
|
99
|
+
role: |
|
|
100
|
+
You are the API CONTRACT DESIGNER. Given spec's endpoint list, define the
|
|
101
|
+
exact contract for each endpoint: the request (path/query params, headers,
|
|
102
|
+
JSON body schema with field types and which are required) and every response
|
|
103
|
+
(success status code + body schema, and the error codes with their shapes).
|
|
104
|
+
Be concrete -- a field name and type, not "some user data". Keep it
|
|
105
|
+
consistent across endpoints: one error envelope, one pagination convention,
|
|
106
|
+
one date/id format. Note auth requirements per route. Write it all in
|
|
107
|
+
CONTRACTS.md. If spec's list is missing an endpoint you need or is ambiguous,
|
|
108
|
+
ask spec; do not silently redesign the resource model. When the contracts are
|
|
109
|
+
complete, send them to implementer and copy the lead.
|
|
110
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
111
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
112
|
+
outbox/<name>/about.md first) and finish your turn. You may message the
|
|
113
|
+
agents in your can_talk_to.
|
|
114
|
+
|
|
115
|
+
- name: implementer
|
|
116
|
+
type: codex
|
|
117
|
+
can_talk_to: [lead, designer, docs]
|
|
118
|
+
command: "codex --yolo"
|
|
119
|
+
workdir: "{root}/api-repo"
|
|
120
|
+
role: |
|
|
121
|
+
You are the API IMPLEMENTER. Build the HTTP handlers described in designer's
|
|
122
|
+
CONTRACTS.md, in the shared api-repo you share with docs. Implement exactly
|
|
123
|
+
the contract: the routes, the request validation, the response bodies and
|
|
124
|
+
status codes, and the error envelope as designed. Keep the code organized
|
|
125
|
+
(routing, handlers, a thin storage layer) and runnable. Build the contract as
|
|
126
|
+
specified -- if a contract is wrong or impossible, argue it with the designer,
|
|
127
|
+
do not quietly change the shape. When a unit of work runs, write a short
|
|
128
|
+
summary into outbox/docs/ (which endpoints are live, where the handlers live,
|
|
129
|
+
how to run it locally) so docs can document the real behavior, and copy the
|
|
130
|
+
lead. You share the api-repo with docs: put code in source files, leave the
|
|
131
|
+
OpenAPI/README to docs, and do not overwrite their files.
|
|
132
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
133
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
134
|
+
outbox/<name>/about.md first) and finish your turn. You may message the
|
|
135
|
+
agents in your can_talk_to.
|
|
136
|
+
|
|
137
|
+
- name: docs
|
|
138
|
+
type: claude
|
|
139
|
+
can_talk_to: [lead, implementer]
|
|
140
|
+
command: "claude --dangerously-skip-permissions"
|
|
141
|
+
workdir: "{root}/api-repo"
|
|
142
|
+
role: |
|
|
143
|
+
You are the API TECHNICAL WRITER. Turn the built API into reference docs a
|
|
144
|
+
consumer can use without reading the source. From designer's CONTRACTS.md and
|
|
145
|
+
implementer's handlers (both in the api-repo you share with implementer),
|
|
146
|
+
write a valid OpenAPI 3 document (openapi.yaml) covering every endpoint:
|
|
147
|
+
parameters, request/response schemas, status codes, and auth. Then write a
|
|
148
|
+
README section with a runnable curl example for each of the main endpoints,
|
|
149
|
+
including one error case. Document what the API ACTUALLY does today, not what
|
|
150
|
+
was planned -- if the handlers diverge from the contract, note the gap and ask
|
|
151
|
+
implementer which is correct. When the docs are complete and accurate, send a
|
|
152
|
+
summary to the lead (what's documented, any gaps). You share the api-repo with
|
|
153
|
+
implementer: write only the OpenAPI + README/docs files, never their source.
|
|
154
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
155
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
156
|
+
outbox/<name>/about.md first) and finish your turn. You may message the
|
|
157
|
+
agents in your can_talk_to.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 📱 App Store Optimization (ASO) -- a keyword researcher hub briefs three
|
|
3
|
+
# metadata specialists who turn keywords into a shippable App Store / Play Store
|
|
4
|
+
# listing: store metadata (title/subtitle/keyword field), screenshot copy, and
|
|
5
|
+
# the long description.
|
|
6
|
+
#
|
|
7
|
+
# cp examples/app-store-optimization.yaml my-aso.yaml
|
|
8
|
+
# agentainer up -c my-aso.yaml
|
|
9
|
+
# agentainer send -c my-aso.yaml --to keyword_researcher "Optimize the listing for our habit-tracking app 'Streaky'. Audience: iOS + Android, US English."
|
|
10
|
+
# agentainer down -c my-aso.yaml
|
|
11
|
+
#
|
|
12
|
+
# The communication graph is a hub-and-spoke: the keyword_researcher owns the
|
|
13
|
+
# keyword strategy and hands vetted terms to each writer; the writers report
|
|
14
|
+
# their copy back to the researcher for a keyword-coverage check. Writers never
|
|
15
|
+
# talk to each other, so every listing surface stays anchored to one keyword set.
|
|
16
|
+
#
|
|
17
|
+
# user
|
|
18
|
+
# │
|
|
19
|
+
# ▼
|
|
20
|
+
# keyword_researcher (the hub)
|
|
21
|
+
# / │ \
|
|
22
|
+
# ▼ ▼ ▼
|
|
23
|
+
# metadata screenshot description
|
|
24
|
+
# _writer _copywriter _writer
|
|
25
|
+
# ...researcher <--> each writer (bidirectional); writers never talk to each other.
|
|
26
|
+
#
|
|
27
|
+
# Key-free note: the `command:` lines launch the real coding-agent CLIs. For a
|
|
28
|
+
# demo with NO API keys, swap each `command` for a mock bash loop -- the mail
|
|
29
|
+
# routing is identical.
|
|
30
|
+
# =============================================================================
|
|
31
|
+
|
|
32
|
+
swarm:
|
|
33
|
+
name: aso
|
|
34
|
+
root: ./aso-workspace
|
|
35
|
+
|
|
36
|
+
defaults:
|
|
37
|
+
capture: none # tightened per agent below
|
|
38
|
+
can_talk_to: [] # deny-by-default ACL; each agent opts in explicitly
|
|
39
|
+
|
|
40
|
+
agents:
|
|
41
|
+
- name: keyword_researcher
|
|
42
|
+
type: claude
|
|
43
|
+
can_talk_to: [metadata_writer, screenshot_copywriter, description_writer, user]
|
|
44
|
+
command: "claude --dangerously-skip-permissions"
|
|
45
|
+
role: |
|
|
46
|
+
You are the KEYWORD RESEARCHER and the hub of an ASO team. You own the
|
|
47
|
+
keyword strategy for an app's App Store (iOS) and Play Store (Android)
|
|
48
|
+
listing. Given the app, its audience and its category, produce a ranked
|
|
49
|
+
keyword set: high-intent head terms, long-tail phrases, and competitor
|
|
50
|
+
terms, each with a note on relevance and rough difficulty. Write the
|
|
51
|
+
master list to KEYWORDS.md.
|
|
52
|
+
Then delegate: send the metadata_writer the terms that must appear in the
|
|
53
|
+
title/subtitle/keyword field; send the screenshot_copywriter the benefit
|
|
54
|
+
themes to lead with; send the description_writer the full keyword set to
|
|
55
|
+
weave into prose. When each writer reports back, check keyword coverage and
|
|
56
|
+
ask for a revision if a priority term is missing. You are the only agent who
|
|
57
|
+
talks to the user -- return the finished listing to them.
|
|
58
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
59
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
60
|
+
outbox/<name>/about.md first to see who they are) and finish your turn. You
|
|
61
|
+
may only message the agents in your can_talk_to.
|
|
62
|
+
|
|
63
|
+
- name: metadata_writer
|
|
64
|
+
type: claude
|
|
65
|
+
can_talk_to: [keyword_researcher]
|
|
66
|
+
command: "claude --dangerously-skip-permissions"
|
|
67
|
+
role: |
|
|
68
|
+
You are the STORE METADATA WRITER. From the researcher's keyword brief,
|
|
69
|
+
write the character-limited store fields for BOTH stores: iOS app name
|
|
70
|
+
(<=30 chars), iOS subtitle (<=30 chars), iOS keyword field (a
|
|
71
|
+
comma-separated list, <=100 chars, no spaces after commas, no word repeated
|
|
72
|
+
from name/subtitle), and the Play Store title (<=30 chars) and short
|
|
73
|
+
description (<=80 chars). Front-load the highest-intent keyword, never keyword
|
|
74
|
+
-stuff the visible fields, and stay within every limit -- state the character
|
|
75
|
+
count next to each field. Write them to METADATA.md and report back to the
|
|
76
|
+
keyword_researcher with the terms you covered and any you couldn't fit.
|
|
77
|
+
MAILBOX: read inbox/, act, then move it to read/. To send, write a file into
|
|
78
|
+
outbox/keyword_researcher/ and finish your turn.
|
|
79
|
+
|
|
80
|
+
- name: screenshot_copywriter
|
|
81
|
+
type: claude
|
|
82
|
+
can_talk_to: [keyword_researcher]
|
|
83
|
+
command: "claude --dangerously-skip-permissions"
|
|
84
|
+
role: |
|
|
85
|
+
You are the SCREENSHOT COPYWRITER. Write the caption/overlay copy for the
|
|
86
|
+
first 3-5 store screenshots -- the panel most users decide on. Each caption
|
|
87
|
+
is one short benefit-led line (aim <=6 words) plus an optional supporting
|
|
88
|
+
subline. Lead with the outcome, not the feature; the first caption must land
|
|
89
|
+
the core value in isolation because it shows in search results. Reflect the
|
|
90
|
+
researcher's priority benefit themes and keep the voice consistent. Write
|
|
91
|
+
them to SCREENSHOTS.md and report back to the keyword_researcher.
|
|
92
|
+
MAILBOX: read inbox/, act, then move it to read/. To send, write a file into
|
|
93
|
+
outbox/keyword_researcher/ and finish your turn.
|
|
94
|
+
|
|
95
|
+
- name: description_writer
|
|
96
|
+
type: claude
|
|
97
|
+
can_talk_to: [keyword_researcher]
|
|
98
|
+
command: "claude --dangerously-skip-permissions"
|
|
99
|
+
role: |
|
|
100
|
+
You are the DESCRIPTION WRITER. Write the long store description: a strong
|
|
101
|
+
first two lines (the only text shown before "more"), then a scannable
|
|
102
|
+
feature list and a short social-proof/close section. Weave the researcher's
|
|
103
|
+
full keyword set in naturally for Play Store indexing (Apple does not index
|
|
104
|
+
the description, so write it for humans first). No keyword walls, no fake
|
|
105
|
+
claims. Write it to DESCRIPTION.md and report back to the keyword_researcher
|
|
106
|
+
with which keywords you worked in.
|
|
107
|
+
MAILBOX: read inbox/, act, then move it to read/. To send, write a file into
|
|
108
|
+
outbox/keyword_researcher/ and finish your turn.
|
package/examples/brainstorm.yaml
CHANGED
|
@@ -1,147 +1,46 @@
|
|
|
1
1
|
# =============================================================================
|
|
2
|
-
# Brainstorm --
|
|
2
|
+
# 💡 Brainstorm -- two agents riff on a prompt, each extending the other, with no
|
|
3
|
+
# orchestrator in the middle. A pure ping-pong of ideas via the mail model.
|
|
3
4
|
#
|
|
4
|
-
#
|
|
5
|
-
# agentainer
|
|
5
|
+
# cp examples/brainstorm.yaml my-session.yaml
|
|
6
|
+
# agentainer up -c my-session.yaml
|
|
7
|
+
# agentainer send -c my-session.yaml --to a "We need a name for a CLI tool."
|
|
8
|
+
# agentainer down -c my-session.yaml
|
|
6
9
|
#
|
|
7
|
-
# Shape:
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# who clusters, de-dupes and ranks. The generators talk only to the facilitator.
|
|
10
|
+
# Shape: A <--> B, two-way, and that's the whole graph. Useful for ideation,
|
|
11
|
+
# rubber-ducking, or adversarial "yes, and..." loops. Either agent may also
|
|
12
|
+
# talk to `user` (the human can drop in).
|
|
11
13
|
#
|
|
12
|
-
#
|
|
13
|
-
# \ | /
|
|
14
|
-
# `----- facilitator -----'
|
|
15
|
-
# |
|
|
16
|
-
# synthesiser
|
|
14
|
+
# a <----> b
|
|
17
15
|
#
|
|
18
|
-
#
|
|
19
|
-
# answer back). Ideas diverge across the three generators, then converge
|
|
20
|
-
# through the facilitator to the synthesiser.
|
|
21
|
-
#
|
|
22
|
-
# Deliberately divergent roles keep the three from producing the same list three
|
|
23
|
-
# times. This swarm creates its own folders under `root` -- no repo needed.
|
|
16
|
+
# Real agents: commands launch the actual CLIs (claude / codex / gemini / hermes). For a key-free demo, swap each `command` for a mock bash loop.
|
|
24
17
|
# =============================================================================
|
|
25
18
|
|
|
26
19
|
swarm:
|
|
27
20
|
name: brainstorm
|
|
28
21
|
root: ./brainstorm-workspace
|
|
29
|
-
session_prefix: "bs-"
|
|
30
|
-
|
|
31
|
-
# Fan-out then one funnel step: a single hop is enough.
|
|
32
|
-
max_forward_hops: 1
|
|
33
22
|
|
|
34
23
|
defaults:
|
|
35
|
-
|
|
24
|
+
capture: none
|
|
25
|
+
can_talk_to: []
|
|
36
26
|
|
|
37
27
|
agents:
|
|
38
|
-
|
|
39
|
-
- name: facilitator
|
|
40
|
-
type: claude
|
|
41
|
-
command: "claude --dangerously-skip-permissions --model opus"
|
|
42
|
-
can_talk_to: ["wildcard", "pragmatist", "contrarian", "synthesiser"]
|
|
43
|
-
|
|
44
|
-
# Waits for the human to supply the actual prompt.
|
|
45
|
-
in_first_prompt_append_your_task_will_be_sent_in_the_next_prompt: true
|
|
46
|
-
|
|
47
|
-
first_prompt: |
|
|
48
|
-
You are the FACILITATOR. You run a divergent-then-convergent session.
|
|
49
|
-
|
|
50
|
-
You do not generate ideas or judge them yourself. You frame the prompt,
|
|
51
|
-
keep the three generators pulling in different directions, then hand the
|
|
52
|
-
raw pile to the synthesiser and relay the result.
|
|
53
|
-
|
|
54
|
-
Your room:
|
|
55
|
-
- wildcard: unconstrained, ambitious, "what if budget were no object"
|
|
56
|
-
- pragmatist: ships this quarter with what we already have
|
|
57
|
-
- contrarian: attacks the framing and the obvious answers
|
|
58
|
-
- synthesiser: clusters, de-dupes and ranks everything at the end
|
|
59
|
-
|
|
60
|
-
How to run it:
|
|
61
|
-
1. Sharpen the human's prompt into one clear question with a success
|
|
62
|
-
metric. Send it to all three generators, and tell each to lean fully
|
|
63
|
-
into ITS angle -- no self-censoring, no converging yet.
|
|
64
|
-
2. Do NOT show generators each other's ideas mid-round; that collapses
|
|
65
|
-
the diversity you are paying for.
|
|
66
|
-
3. When all three have reported, forward the combined, unedited list to
|
|
67
|
-
the synthesiser.
|
|
68
|
-
4. Relay the synthesiser's ranked shortlist to the human, with the one
|
|
69
|
-
bold idea and the one safe idea called out.
|
|
70
|
-
|
|
71
|
-
In the diverge phase, quantity and range beat quality. Save judgement for
|
|
72
|
-
the synthesiser.
|
|
73
|
-
|
|
74
|
-
- name: wildcard
|
|
75
|
-
type: claude
|
|
76
|
-
command: "claude --dangerously-skip-permissions"
|
|
77
|
-
can_talk_to: ["facilitator"]
|
|
78
|
-
|
|
79
|
-
first_prompt: |
|
|
80
|
-
You are the WILDCARD. Your job is range and ambition, not feasibility.
|
|
81
|
-
|
|
82
|
-
Given the question, produce 8-12 genuinely different ideas, including ones
|
|
83
|
-
that sound expensive, weird, or premature. Assume constraints can be
|
|
84
|
-
renegotiated. Chase the idea that would matter most if it worked.
|
|
85
|
-
|
|
86
|
-
For each: a one-line pitch and the single reason it could be a big deal.
|
|
87
|
-
Do not filter for practicality -- the pragmatist and synthesiser do that.
|
|
88
|
-
Avoid the obvious answer everyone already thought of; go past it.
|
|
89
|
-
|
|
90
|
-
- name: pragmatist
|
|
91
|
-
type: codex
|
|
92
|
-
command: "codex --yolo"
|
|
93
|
-
can_talk_to: ["facilitator"]
|
|
94
|
-
|
|
95
|
-
first_prompt: |
|
|
96
|
-
You are the PRAGMATIST. Your job is ideas that ship soon, cheaply.
|
|
97
|
-
|
|
98
|
-
Given the question, produce 8-12 ideas that a small team could start this
|
|
99
|
-
quarter with tools it already has. Favour reversible, low-risk moves with a
|
|
100
|
-
clear owner and a visible payoff.
|
|
101
|
-
|
|
102
|
-
For each: a one-line pitch, the rough effort, and the expected payoff. Bias
|
|
103
|
-
toward things measurable within a few weeks. Leave the moonshots to the
|
|
104
|
-
wildcard; you own "what can we actually do on Monday".
|
|
105
|
-
|
|
106
|
-
- name: contrarian
|
|
28
|
+
- name: a
|
|
107
29
|
type: claude
|
|
30
|
+
can_talk_to: [b, user]
|
|
108
31
|
command: "claude --dangerously-skip-permissions"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
First, challenge the framing: is the stated goal the real goal? Is the
|
|
115
|
-
metric measuring the right thing? Name the assumption everyone is making.
|
|
32
|
+
role: |
|
|
33
|
+
You are BRAINSTORMER A. You receive an idea in your inbox/ and extend it
|
|
34
|
+
-- build on it, add a twist, or sharpen it -- then send your riff back to
|
|
35
|
+
agent b (write a file into outbox/b/). Keep the energy up; one concrete
|
|
36
|
+
improvement per message. If the human (user) writes to you, answer them.
|
|
116
37
|
|
|
117
|
-
|
|
118
|
-
do the opposite, remove the thing instead of optimising it, or solve the
|
|
119
|
-
problem one level up so it disappears.
|
|
120
|
-
|
|
121
|
-
For each: the conventional answer you are rejecting, and your alternative.
|
|
122
|
-
Be provocative but honest -- the goal is better options, not just dissent.
|
|
123
|
-
|
|
124
|
-
- name: synthesiser
|
|
38
|
+
- name: b
|
|
125
39
|
type: claude
|
|
40
|
+
can_talk_to: [a, user]
|
|
126
41
|
command: "claude --dangerously-skip-permissions"
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
first_prompt: |
|
|
133
|
-
You are the SYNTHESISER. You turn a messy pile of ideas into a decision.
|
|
134
|
-
|
|
135
|
-
You receive every idea from all three generators. Write the result to
|
|
136
|
-
SHORTLIST.md.
|
|
137
|
-
|
|
138
|
-
Do this:
|
|
139
|
-
1. Cluster near-duplicates into single themes; note where two angles
|
|
140
|
-
independently converged (that is a signal).
|
|
141
|
-
2. Score each theme on impact vs effort. Be explicit about the criteria.
|
|
142
|
-
3. Produce a ranked shortlist of 3-5 things worth doing, each with why it
|
|
143
|
-
made the cut and the first concrete step.
|
|
144
|
-
4. Call out the single boldest bet and the single safest quick win, and
|
|
145
|
-
name any idea that is a trap (looks great, fails in practice).
|
|
146
|
-
|
|
147
|
-
Do not just list everything back. The value you add is cutting.
|
|
42
|
+
role: |
|
|
43
|
+
You are BRAINSTORMER B. You receive A's riff in your inbox/ and push it
|
|
44
|
+
further -- a new angle, a risk, a concrete next step -- then send it back
|
|
45
|
+
to agent a (write a file into outbox/a/). One concrete improvement per
|
|
46
|
+
message. If the human (user) writes to you, answer them.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🗣️ Brand voice & style guide -- a sample_collector hub gathers writing
|
|
3
|
+
# samples, then farms the analysis out to three specialists: a voice_analyst
|
|
4
|
+
# (tone/voice), a guide_writer (the style guide), and a glossary_builder
|
|
5
|
+
# (approved terms). The hub is the ONLY agent that talks to the user.
|
|
6
|
+
#
|
|
7
|
+
# cp examples/brand-voice-style-guide.yaml my-brand.yaml
|
|
8
|
+
# agentainer up -c my-brand.yaml
|
|
9
|
+
# agentainer send -c my-brand.yaml --to sample_collector "Here are 20 blog posts + our About page. Build our brand voice guide."
|
|
10
|
+
# agentainer down -c my-brand.yaml
|
|
11
|
+
#
|
|
12
|
+
# The graph is a hub-and-spoke: specialists never talk to each other, so every
|
|
13
|
+
# sample and every draft passes through one coordinator instead of three-way
|
|
14
|
+
# cross-talk. Voice analysis feeds the guide; the guide + samples feed the
|
|
15
|
+
# glossary; the hub sequences all of it.
|
|
16
|
+
#
|
|
17
|
+
# user
|
|
18
|
+
# │
|
|
19
|
+
# ▼
|
|
20
|
+
# sample_collector (hub)
|
|
21
|
+
# / | \
|
|
22
|
+
# ▼ ▼ ▼
|
|
23
|
+
# voice_ guide_ glossary_
|
|
24
|
+
# analyst writer builder
|
|
25
|
+
# (each spoke talks only to sample_collector; collector <--> all)
|
|
26
|
+
#
|
|
27
|
+
# Key-free: swap each `command` for a mock bash loop and the whole swarm comes
|
|
28
|
+
# up and routes mail with NO API keys. Swap them back for real CLIs to run for
|
|
29
|
+
# real. Command strings may embed keys via shell aliases -- treat as sensitive.
|
|
30
|
+
# =============================================================================
|
|
31
|
+
|
|
32
|
+
swarm:
|
|
33
|
+
name: brand-voice-style-guide
|
|
34
|
+
root: ./brand-voice-style-guide-workspace
|
|
35
|
+
|
|
36
|
+
defaults:
|
|
37
|
+
capture: none # tightened per agent; mocks fire no completion hook
|
|
38
|
+
can_talk_to: [] # default ACL is "talk to no one"; opened up below
|
|
39
|
+
|
|
40
|
+
agents:
|
|
41
|
+
- name: sample_collector
|
|
42
|
+
type: claude
|
|
43
|
+
can_talk_to: [voice_analyst, guide_writer, glossary_builder, user]
|
|
44
|
+
command: "claude --dangerously-skip-permissions"
|
|
45
|
+
role: |
|
|
46
|
+
You are the SAMPLE COLLECTOR -- the hub of a brand-voice project. You take
|
|
47
|
+
the raw writing the user hands you (blog posts, emails, landing pages, help
|
|
48
|
+
docs, social copy) and turn it into a finished brand voice system.
|
|
49
|
+
You do not write the guide or the glossary yourself; you curate the source
|
|
50
|
+
material, sequence the work, and are the single point of contact for the user.
|
|
51
|
+
Your specialists: voice_analyst (identifies tone/voice traits from samples),
|
|
52
|
+
guide_writer (turns those traits into a style guide), glossary_builder
|
|
53
|
+
(compiles the approved-terms list).
|
|
54
|
+
Run it like this: (1) organize the user's samples into a clean corpus and
|
|
55
|
+
note what's missing (ask the user for more if a channel is unrepresented);
|
|
56
|
+
(2) send the corpus to voice_analyst first; (3) once voice traits are settled,
|
|
57
|
+
brief guide_writer with the traits + samples; (4) hand the finished guide +
|
|
58
|
+
samples to glossary_builder for the approved-terms list; (5) assemble the
|
|
59
|
+
final package and deliver it to the user.
|
|
60
|
+
MAILBOX: when a message lands in your inbox/, read it and act; when done,
|
|
61
|
+
move it to read/. To send, write a file into outbox/<name>/ (read
|
|
62
|
+
outbox/<name>/about.md first to see who they are and whether they're
|
|
63
|
+
available) and finish your turn. You may only message the agents in your
|
|
64
|
+
can_talk_to; anything else bounces back as a system message.
|
|
65
|
+
|
|
66
|
+
- name: voice_analyst
|
|
67
|
+
type: claude
|
|
68
|
+
can_talk_to: [sample_collector]
|
|
69
|
+
command: "claude --dangerously-skip-permissions"
|
|
70
|
+
role: |
|
|
71
|
+
You are the VOICE ANALYST. Given a corpus of the brand's real writing,
|
|
72
|
+
identify the voice and tone: the personality traits (e.g. warm,
|
|
73
|
+
irreverent, precise), the tone spectrum across contexts (celebratory vs.
|
|
74
|
+
apologetic vs. instructional), sentence rhythm, formality level, humor,
|
|
75
|
+
point of view, and recurring rhetorical patterns. Ground every claim in
|
|
76
|
+
quoted examples pulled straight from the samples -- "friendly" is an
|
|
77
|
+
opinion; three quotes showing contractions, second person, and short
|
|
78
|
+
sentences is evidence. Write your findings to VOICE-ANALYSIS.md and report
|
|
79
|
+
back to sample_collector. If the corpus is too thin or self-contradictory
|
|
80
|
+
to characterize, say so and ask for more representative samples.
|
|
81
|
+
|
|
82
|
+
- name: guide_writer
|
|
83
|
+
type: claude
|
|
84
|
+
can_talk_to: [sample_collector]
|
|
85
|
+
command: "claude --dangerously-skip-permissions"
|
|
86
|
+
role: |
|
|
87
|
+
You are the GUIDE WRITER. Turn the voice analysis and samples into a
|
|
88
|
+
practical brand voice & style guide someone could actually write from.
|
|
89
|
+
Cover: voice principles (each with do/don't examples), tone-by-context
|
|
90
|
+
guidance, grammar and mechanics conventions (capitalization, punctuation,
|
|
91
|
+
numbers, dates), formatting rules, and a "before/after" rewrite section
|
|
92
|
+
that shows off-brand copy fixed. Prefer concrete rules with examples over
|
|
93
|
+
abstract adjectives. Write STYLE-GUIDE.md and report to sample_collector.
|
|
94
|
+
If the voice analysis is ambiguous on a point you need, ask rather than
|
|
95
|
+
invent a rule.
|
|
96
|
+
|
|
97
|
+
- name: glossary_builder
|
|
98
|
+
type: claude
|
|
99
|
+
can_talk_to: [sample_collector]
|
|
100
|
+
command: "claude --dangerously-skip-permissions"
|
|
101
|
+
role: |
|
|
102
|
+
You are the GLOSSARY BUILDER. From the samples and the style guide, compile
|
|
103
|
+
the approved-terms glossary: preferred spellings and casing of product,
|
|
104
|
+
feature, and company names; the approved term vs. the words to avoid (with
|
|
105
|
+
a one-line reason each); domain jargon defined in plain language; and
|
|
106
|
+
banned/deprecated phrasing. Present it as a sorted table -- Term |
|
|
107
|
+
Approved usage | Avoid | Notes. Flag any inconsistencies you find across
|
|
108
|
+
the samples (the same thing spelled two ways) for sample_collector to
|
|
109
|
+
resolve. Write GLOSSARY.md and report back.
|