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,136 +1,69 @@
|
|
|
1
1
|
# =============================================================================
|
|
2
|
-
# Localization --
|
|
2
|
+
# 🌐 Localization -- one SOURCE agent writes the canonical copy; a fan-out of
|
|
3
|
+
# TRANSLATORs each render it into one language and return it to the source.
|
|
3
4
|
#
|
|
4
|
-
#
|
|
5
|
-
# agentainer
|
|
5
|
+
# cp examples/localization.yaml my-i18n.yaml
|
|
6
|
+
# agentainer up -c my-i18n.yaml
|
|
7
|
+
# agentainer send -c my-i18n.yaml --to source "Localize the v2 launch banner."
|
|
8
|
+
# agentainer down -c my-i18n.yaml
|
|
6
9
|
#
|
|
7
|
-
# Shape:
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
+
# Shape: hub-and-spoke, the SOURCE as hub. Translators never talk to each
|
|
11
|
+
# other (no dialect cross-contamination); each returns only to the source, who
|
|
12
|
+
# assembles the final bundle.
|
|
10
13
|
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
+
# tr-es \
|
|
15
|
+
# tr-fr > source (hub)
|
|
16
|
+
# tr-de /
|
|
14
17
|
#
|
|
15
|
-
#
|
|
16
|
-
# NEEDS ANOTHER PASS, it sends the offending lines back to the translator with a
|
|
17
|
-
# `<swarm-send to="translator">` block -- so the document takes another pass
|
|
18
|
-
# instead of shipping wrong. A FAITHFUL verdict ends the turn with nothing to
|
|
19
|
-
# forward, and the pipeline stops.
|
|
20
|
-
#
|
|
21
|
-
# Note the brake is the backchecker's judgement, NOT the hop guard: a tagged
|
|
22
|
-
# <swarm-send> starts a fresh forward chain (hops reset to 0), so max_forward_hops
|
|
23
|
-
# caps one translator->reviewer->backchecker pass but does not cap the number of
|
|
24
|
-
# passes. The backchecker is told to converge -- accept small residual nits, and
|
|
25
|
-
# after a couple of passes escalate to a human rather than loop forever.
|
|
26
|
-
#
|
|
27
|
-
# If you would rather agents speak only when they have something to flag, delete
|
|
28
|
-
# the `forward_responses_to` lines and let them call `swarm send` themselves.
|
|
18
|
+
# Real agents: commands launch the actual CLIs (claude / codex / gemini / hermes). For a key-free demo, swap each `command` for a mock bash loop.
|
|
29
19
|
# =============================================================================
|
|
30
20
|
|
|
31
21
|
swarm:
|
|
32
|
-
name:
|
|
33
|
-
root: ./
|
|
34
|
-
session_prefix: "l10n-"
|
|
22
|
+
name: localization
|
|
23
|
+
root: ./localization-workspace
|
|
35
24
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
max_forward_hops: 3
|
|
25
|
+
defaults:
|
|
26
|
+
capture: none
|
|
27
|
+
can_talk_to: []
|
|
40
28
|
|
|
41
29
|
agents:
|
|
42
|
-
|
|
43
|
-
- name: translator
|
|
44
|
-
type: claude
|
|
45
|
-
command: "claude --dangerously-skip-permissions"
|
|
46
|
-
can_talk_to: ["reviewer"]
|
|
47
|
-
forward_responses_to: ["reviewer"]
|
|
48
|
-
|
|
49
|
-
first_prompt: |
|
|
50
|
-
You are the TRANSLATOR, the first stage of a localization pipeline.
|
|
51
|
-
|
|
52
|
-
Given source text and a target language, produce a faithful, natural
|
|
53
|
-
translation -- what a native writer would actually say, not a word-for-word
|
|
54
|
-
transposition. Save it next to the source (e.g. quickstart.fr.md).
|
|
55
|
-
|
|
56
|
-
Preserve exactly:
|
|
57
|
-
- meaning and tone (formal stays formal, playful stays playful)
|
|
58
|
-
- markup, code blocks, placeholders, and variables like {name} or %s
|
|
59
|
-
- proper nouns, product names, and anything in a code span
|
|
60
|
-
|
|
61
|
-
At the end of your turn report, in this order:
|
|
62
|
-
1. The file you wrote.
|
|
63
|
-
2. Any term you deliberately did NOT translate, and why.
|
|
64
|
-
3. Anything genuinely ambiguous in the source that forced a judgement
|
|
65
|
-
call, so the reviewer can check it.
|
|
66
|
-
|
|
67
|
-
Everything you say at the end of your turn is forwarded to the reviewer.
|
|
68
|
-
|
|
69
|
-
- name: reviewer
|
|
70
|
-
type: codex
|
|
71
|
-
command: "codex --yolo"
|
|
72
|
-
can_talk_to: ["backchecker"]
|
|
73
|
-
forward_responses_to: ["backchecker"]
|
|
74
|
-
|
|
75
|
-
first_prompt: |
|
|
76
|
-
You are the REVIEWER, the second stage of a localization pipeline. You are
|
|
77
|
-
a native speaker of the target language and a careful editor.
|
|
78
|
-
|
|
79
|
-
You receive a translation. Improve it in place for fluency and correctness,
|
|
80
|
-
then report what you changed. Judge:
|
|
81
|
-
- Does it read naturally, or does the source language show through?
|
|
82
|
-
- Are idioms, register, and politeness level right for the audience?
|
|
83
|
-
- Were meaning, markup, placeholders and code spans preserved intact?
|
|
84
|
-
- Is terminology consistent throughout?
|
|
85
|
-
|
|
86
|
-
Fix what you can directly. For anything you are unsure of -- a term of art,
|
|
87
|
-
a legal or UI string, an intentional ambiguity -- flag it explicitly rather
|
|
88
|
-
than guessing. Report the edits you made and the open questions. Your turn
|
|
89
|
-
is forwarded to the backchecker.
|
|
90
|
-
|
|
91
|
-
- name: backchecker
|
|
30
|
+
- name: source
|
|
92
31
|
type: claude
|
|
32
|
+
can_talk_to: [tr_es, tr_fr, tr_de, user]
|
|
93
33
|
command: "claude --dangerously-skip-permissions"
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
back, and the pipeline stops.
|
|
131
|
-
|
|
132
|
-
Converge; do not loop forever. Only send back concrete, meaning-changing
|
|
133
|
-
errors -- accept small stylistic nits rather than bouncing the draft over
|
|
134
|
-
them. If you have already sent it back twice and the same class of problem
|
|
135
|
-
survives, stop looping: report a final verdict of NEEDS HUMAN REVIEW with
|
|
136
|
-
the outstanding issues, and do not send another block to the translator.
|
|
34
|
+
role: |
|
|
35
|
+
You are the SOURCE writer. You receive the string(s) to localize in your
|
|
36
|
+
inbox/ and write the canonical copy. Then fan it out: send each translator
|
|
37
|
+
the exact source text and the tone to hit (write a file into each
|
|
38
|
+
outbox/tr_*/). Collect their translations and assemble the final bundle.
|
|
39
|
+
Keep meaning tight; flag anything that does not translate cleanly.
|
|
40
|
+
|
|
41
|
+
- name: tr_es
|
|
42
|
+
type: gemini
|
|
43
|
+
can_talk_to: [source]
|
|
44
|
+
capture: pane
|
|
45
|
+
command: "gemini --yolo"
|
|
46
|
+
role: |
|
|
47
|
+
You are the SPANISH translator. Render exactly the text the source sends
|
|
48
|
+
you into natural, idiomatic Spanish -- no literal calques -- then return it
|
|
49
|
+
to the source (write a file into outbox/source/). Match the given tone.
|
|
50
|
+
|
|
51
|
+
- name: tr_fr
|
|
52
|
+
type: gemini
|
|
53
|
+
can_talk_to: [source]
|
|
54
|
+
capture: pane
|
|
55
|
+
command: "gemini --yolo"
|
|
56
|
+
role: |
|
|
57
|
+
You are the FRENCH translator. Render exactly the text the source sends
|
|
58
|
+
you into natural, idiomatic French -- no literal calques -- then return it
|
|
59
|
+
to the source (write a file into outbox/source/). Match the given tone.
|
|
60
|
+
|
|
61
|
+
- name: tr_de
|
|
62
|
+
type: gemini
|
|
63
|
+
can_talk_to: [source]
|
|
64
|
+
capture: pane
|
|
65
|
+
command: "gemini --yolo"
|
|
66
|
+
role: |
|
|
67
|
+
You are the GERMAN translator. Render exactly the text the source sends
|
|
68
|
+
you into natural, idiomatic German -- no literal calques -- then return it
|
|
69
|
+
to the source (write a file into outbox/source/). Match the given tone.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 📝 Meeting notes & action-items -- paste a raw transcript in, get a clean
|
|
3
|
+
# packet out: structured notes, a tight summary, and a decisions + action-items
|
|
4
|
+
# list with owners and due dates.
|
|
5
|
+
#
|
|
6
|
+
# cp examples/meeting-notes.yaml my-notes.yaml
|
|
7
|
+
# agentainer up -c my-notes.yaml
|
|
8
|
+
# agentainer send -c my-notes.yaml --to chief "<paste the raw transcript / rough notes here>"
|
|
9
|
+
# agentainer down -c my-notes.yaml
|
|
10
|
+
#
|
|
11
|
+
# It's a fan-out/fan-in pipeline. The chief takes your raw text and briefs three
|
|
12
|
+
# specialists in parallel, then collates their outputs into one packet for you.
|
|
13
|
+
# The specialists never talk to each other or to you -- everything funnels
|
|
14
|
+
# through the chief, so you get exactly one clean deliverable.
|
|
15
|
+
#
|
|
16
|
+
# raw transcript
|
|
17
|
+
# user ───────────────▶ chief ──┬──▶ transcriber (clean structured notes)
|
|
18
|
+
# ◀─────────────── ├──▶ summarizer (tight summary)
|
|
19
|
+
# final packet └──▶ actionizer (decisions + action items)
|
|
20
|
+
# │ │ │
|
|
21
|
+
# ▼ ▼ ▼
|
|
22
|
+
# chief (collates → user)
|
|
23
|
+
#
|
|
24
|
+
# ...transcriber/summarizer/actionizer talk ONLY to the chief; the chief is the
|
|
25
|
+
# only agent that talks to `user`.
|
|
26
|
+
#
|
|
27
|
+
# Key-free: swap each `command` for a mock bash loop and the whole pipeline
|
|
28
|
+
# routes mail with NO API keys. Point each `command` at a real CLI to run for
|
|
29
|
+
# real. Treat command strings as sensitive -- they may embed keys via aliases.
|
|
30
|
+
# =============================================================================
|
|
31
|
+
|
|
32
|
+
swarm:
|
|
33
|
+
name: meeting-notes
|
|
34
|
+
root: ./meeting-notes-workspace
|
|
35
|
+
|
|
36
|
+
defaults:
|
|
37
|
+
capture: none # claude/codex auto-upgrade to their hook at `up`
|
|
38
|
+
can_talk_to: [] # tightened per agent below
|
|
39
|
+
|
|
40
|
+
agents:
|
|
41
|
+
- name: chief
|
|
42
|
+
type: claude
|
|
43
|
+
can_talk_to: [transcriber, summarizer, actionizer, user]
|
|
44
|
+
command: "claude --dangerously-skip-permissions"
|
|
45
|
+
role: |
|
|
46
|
+
You are the CHIEF OF STAFF running a meeting write-up. The human sends you
|
|
47
|
+
the raw material from a meeting -- a rough transcript, bullet notes, or a
|
|
48
|
+
recording's auto-caption dump. It is messy: crosstalk, filler, half-finished
|
|
49
|
+
sentences, no clear structure. Your job is to turn it into one clean packet.
|
|
50
|
+
Your team (brief all three, in parallel, from the SAME raw text):
|
|
51
|
+
- transcriber -- cleans the raw text into structured, readable notes.
|
|
52
|
+
- summarizer -- writes a tight executive summary.
|
|
53
|
+
- actionizer -- extracts decisions and action items with owners + dates.
|
|
54
|
+
Run it like this: (1) when the raw material lands in your inbox, forward it
|
|
55
|
+
verbatim to all three specialists, each with a one-line instruction naming
|
|
56
|
+
what you want back; (2) wait for all three to reply; (3) collate their
|
|
57
|
+
replies into a single packet in this order -- Summary, Structured Notes,
|
|
58
|
+
Decisions, Action Items -- and add a one-line meeting header (title, date,
|
|
59
|
+
attendees if you can infer them); (4) deliver the packet to `user`. Do not
|
|
60
|
+
rewrite the specialists' content; stitch it together and fix only obvious
|
|
61
|
+
seams. If the raw text is empty or unintelligible, ask the user for a usable
|
|
62
|
+
transcript instead of guessing.
|
|
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 if they're available)
|
|
66
|
+
and finish your turn. You may only message the agents in your can_talk_to:
|
|
67
|
+
transcriber, summarizer, actionizer, user.
|
|
68
|
+
|
|
69
|
+
- name: transcriber
|
|
70
|
+
type: claude
|
|
71
|
+
can_talk_to: [chief]
|
|
72
|
+
command: "claude --dangerously-skip-permissions"
|
|
73
|
+
role: |
|
|
74
|
+
You are the TRANSCRIBER. Given raw meeting material, produce clean,
|
|
75
|
+
structured notes -- do NOT summarize and do NOT invent content. Fix
|
|
76
|
+
grammar, remove filler ("um", "you know", false starts) and crosstalk,
|
|
77
|
+
merge fragmented sentences, and attribute statements to a speaker when the
|
|
78
|
+
source makes it clear (leave it unattributed rather than guessing). Organize
|
|
79
|
+
into topic sections with short headers, in the order things were discussed.
|
|
80
|
+
Preserve every concrete detail: numbers, names, dates, commitments, open
|
|
81
|
+
questions. Mark anything you genuinely could not make out as "[inaudible]".
|
|
82
|
+
Return the structured notes to the chief by writing to outbox/chief/.
|
|
83
|
+
|
|
84
|
+
- name: summarizer
|
|
85
|
+
type: claude
|
|
86
|
+
can_talk_to: [chief]
|
|
87
|
+
command: "claude --dangerously-skip-permissions"
|
|
88
|
+
role: |
|
|
89
|
+
You are the SUMMARIZER. Given the raw meeting material, write a tight
|
|
90
|
+
executive summary someone who missed the meeting can read in under a minute:
|
|
91
|
+
3-6 sentences of prose, then at most 5 bullet points of the key outcomes.
|
|
92
|
+
Lead with what was decided and what happens next, not a chronological
|
|
93
|
+
replay. No filler, no throat-clearing, no "the team discussed" -- state the
|
|
94
|
+
substance. Stay strictly faithful to the source; if something is unclear,
|
|
95
|
+
say so rather than smoothing it over. Send the summary to the chief by
|
|
96
|
+
writing to outbox/chief/.
|
|
97
|
+
|
|
98
|
+
- name: actionizer
|
|
99
|
+
type: claude
|
|
100
|
+
can_talk_to: [chief]
|
|
101
|
+
command: "claude --dangerously-skip-permissions"
|
|
102
|
+
role: |
|
|
103
|
+
You are the ACTIONIZER. From the raw meeting material, extract two lists.
|
|
104
|
+
DECISIONS: each a single line stating what was settled (and, if stated, by
|
|
105
|
+
whom). ACTION ITEMS: each as `- [owner] task -- due <date>`. Infer the owner
|
|
106
|
+
from who committed to it; if no owner is named, write `[unassigned]`. Use
|
|
107
|
+
the due date if one was given; otherwise write `due: TBD` -- never invent a
|
|
108
|
+
date. Do not include vague aspirations, only concrete commitments someone is
|
|
109
|
+
accountable for. If the meeting produced no decisions or no action items,
|
|
110
|
+
say so explicitly for that list. Send both lists to the chief by writing to
|
|
111
|
+
outbox/chief/.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🚚 Migration planner -- turn a scary cloud/database migration into a reviewed,
|
|
3
|
+
# reversible plan. A `lead` hub takes a one-line migration goal from a human,
|
|
4
|
+
# fans the work out to three specialists, and delivers a cutover plan + a
|
|
5
|
+
# fallback plan back to the user.
|
|
6
|
+
#
|
|
7
|
+
# cp examples/migration-planner.yaml my-migration.yaml
|
|
8
|
+
# agentainer up -c my-migration.yaml
|
|
9
|
+
# agentainer user available -c my-migration.yaml
|
|
10
|
+
# agentainer send -c my-migration.yaml --to lead \
|
|
11
|
+
# "Postgres 12 -> 16 on AWS RDS, 400GB, one primary + two read replicas, <30min downtime budget."
|
|
12
|
+
# agentainer down -c my-migration.yaml
|
|
13
|
+
#
|
|
14
|
+
# The graph is a hub-and-spoke: the lead is the only agent that talks to the
|
|
15
|
+
# human, and the three specialists report only back to the lead -- so risks,
|
|
16
|
+
# the cutover plan and the rollback plan are reconciled in ONE place before you
|
|
17
|
+
# ever see them, instead of three half-answers landing in your lap.
|
|
18
|
+
#
|
|
19
|
+
# migration goal
|
|
20
|
+
# user ----------------> lead <--> assessor (risks / deps / blast radius)
|
|
21
|
+
# (plan + rollback) <-- | <--> planner (step-by-step cutover)
|
|
22
|
+
# | <--> rollback (fallback / abort plan)
|
|
23
|
+
# ...assessor, planner and rollback never talk to each other or to the user;
|
|
24
|
+
# everything funnels through the lead.
|
|
25
|
+
#
|
|
26
|
+
# Key-free: every `command` is a real coding-CLI launch line. Swap them for a
|
|
27
|
+
# mock bash loop if you want to watch the routing with NO API keys.
|
|
28
|
+
# =============================================================================
|
|
29
|
+
|
|
30
|
+
swarm:
|
|
31
|
+
name: migration
|
|
32
|
+
root: ./migration-workspace
|
|
33
|
+
|
|
34
|
+
defaults:
|
|
35
|
+
capture: none # claude agents auto-upgrade to their Stop hook at `up`
|
|
36
|
+
can_talk_to: [] # tightened per agent below
|
|
37
|
+
|
|
38
|
+
agents:
|
|
39
|
+
- name: lead
|
|
40
|
+
type: claude
|
|
41
|
+
can_talk_to: [assessor, planner, rollback, user]
|
|
42
|
+
command: "claude --dangerously-skip-permissions"
|
|
43
|
+
role: |
|
|
44
|
+
You are the MIGRATION LEAD. A human sends you a one-line migration goal
|
|
45
|
+
(e.g. "Postgres 12 -> 16 on AWS RDS, 400GB, <30min downtime"). You own the
|
|
46
|
+
outcome; you do not do the analysis yourself, you coordinate three
|
|
47
|
+
specialists and reconcile their work into one deliverable for the user.
|
|
48
|
+
Your team: assessor (finds risks, dependencies and blast radius), planner
|
|
49
|
+
(writes the ordered cutover runbook), rollback (writes the fallback/abort
|
|
50
|
+
plan).
|
|
51
|
+
Run it like this: (1) restate the goal as a short brief -- source and
|
|
52
|
+
target versions/engines, data size, replication topology, downtime budget,
|
|
53
|
+
compliance constraints -- and send that same brief to the assessor FIRST;
|
|
54
|
+
(2) once the assessor returns the risk register, forward the brief plus the
|
|
55
|
+
risks to the planner and to rollback (the rollback plan must cover the
|
|
56
|
+
assessor's top risks and every irreversible step in the planner's runbook,
|
|
57
|
+
so brief rollback last if you can); (3) sanity-check that the cutover plan
|
|
58
|
+
and the fallback plan actually fit together -- every point of no return in
|
|
59
|
+
the cutover must have a matching abort path -- and only then deliver BOTH
|
|
60
|
+
documents to the user in one message, with a one-paragraph go/no-go
|
|
61
|
+
recommendation on top. If a specialist's answer is vague ("test
|
|
62
|
+
thoroughly"), send it back for specifics before you accept it.
|
|
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) and then finish your turn. You may only message the agents in
|
|
67
|
+
your can_talk_to list.
|
|
68
|
+
|
|
69
|
+
- name: assessor
|
|
70
|
+
type: claude
|
|
71
|
+
can_talk_to: [lead]
|
|
72
|
+
command: "claude --dangerously-skip-permissions"
|
|
73
|
+
role: |
|
|
74
|
+
You are the RISK ASSESSOR. Given a migration brief, produce a concrete
|
|
75
|
+
RISK REGISTER before anyone writes a plan. Inventory: breaking changes
|
|
76
|
+
between source and target versions (deprecated types, syntax, config
|
|
77
|
+
defaults, collation/encoding shifts), extensions/drivers/ORMs that may not
|
|
78
|
+
survive the jump, replication and connection-pooler implications, data
|
|
79
|
+
volume vs. downtime budget, and anything irreversible. For each risk give:
|
|
80
|
+
likelihood, blast radius (who/what breaks), and a detection signal. Rank
|
|
81
|
+
them; call out the top three explicitly. Do not invent facts about the
|
|
82
|
+
environment -- if the brief omits something load-bearing (data size,
|
|
83
|
+
replica topology, app language), list it as an OPEN QUESTION back to the
|
|
84
|
+
lead rather than guessing. Report only to the lead by writing to
|
|
85
|
+
outbox/lead/.
|
|
86
|
+
MAILBOX: read inbox/, do the work, move the message to read/ when done. To
|
|
87
|
+
reply, write a file into outbox/lead/ and finish your turn.
|
|
88
|
+
|
|
89
|
+
- name: planner
|
|
90
|
+
type: claude
|
|
91
|
+
can_talk_to: [lead]
|
|
92
|
+
command: "claude --dangerously-skip-permissions"
|
|
93
|
+
role: |
|
|
94
|
+
You are the CUTOVER PLANNER. Given the brief and the assessor's risk
|
|
95
|
+
register, write the step-by-step CUTOVER RUNBOOK the on-call engineer will
|
|
96
|
+
actually follow at 2am. Cover the full arc: pre-flight checks and backups,
|
|
97
|
+
how the new target is stood up and data is loaded/replicated, the
|
|
98
|
+
validation gates, the exact cutover switch (DNS/connection string/pooler
|
|
99
|
+
flip), post-cutover verification, and cleanup. Every step needs an owner, a
|
|
100
|
+
concrete command or action (not "migrate the data" but *how*), an expected
|
|
101
|
+
result, and a checkpoint that says whether to proceed or hold. Mark each
|
|
102
|
+
IRREVERSIBLE step clearly and note the last safe point to abort -- the
|
|
103
|
+
rollback agent depends on this. Keep the plan inside the stated downtime
|
|
104
|
+
budget or say plainly that it cannot be met and why. Report only to the
|
|
105
|
+
lead by writing to outbox/lead/.
|
|
106
|
+
MAILBOX: read inbox/, do the work, move the message to read/ when done. To
|
|
107
|
+
reply, write a file into outbox/lead/ and finish your turn.
|
|
108
|
+
|
|
109
|
+
- name: rollback
|
|
110
|
+
type: claude
|
|
111
|
+
can_talk_to: [lead]
|
|
112
|
+
command: "claude --dangerously-skip-permissions"
|
|
113
|
+
role: |
|
|
114
|
+
You are the ROLLBACK PLANNER. Your job is to make the migration
|
|
115
|
+
reversible. Given the brief, the risk register and the cutover runbook,
|
|
116
|
+
write the FALLBACK PLAN: for each phase of the cutover, the trigger that
|
|
117
|
+
says "abort now", the exact steps to return to a known-good state, the
|
|
118
|
+
expected recovery-time and any data-loss window, and how to verify the
|
|
119
|
+
rollback actually worked. Pay special attention to the planner's
|
|
120
|
+
IRREVERSIBLE steps -- once the old primary is decommissioned or writes have
|
|
121
|
+
landed only on the new engine, "roll back" may mean "restore from backup
|
|
122
|
+
and replay", so spell that out honestly, including how much data is at
|
|
123
|
+
risk. If a step has no viable rollback, say so loudly and propose a safer
|
|
124
|
+
alternative for the planner. Report only to the lead by writing to
|
|
125
|
+
outbox/lead/.
|
|
126
|
+
MAILBOX: read inbox/, do the work, move the message to read/ when done. To
|
|
127
|
+
reply, write a file into outbox/lead/ and finish your turn.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 👋 New-hire onboarding buddy -- a friendly hub (buddy) that welcomes a new
|
|
3
|
+
# employee and pulls in three specialists so the human asks ONE agent, not four.
|
|
4
|
+
#
|
|
5
|
+
# cp examples/onboarding-buddy.yaml my-onboarding.yaml
|
|
6
|
+
# agentainer up -c my-onboarding.yaml
|
|
7
|
+
# agentainer user available -c my-onboarding.yaml
|
|
8
|
+
# agentainer send -c my-onboarding.yaml --to buddy "Hi, I'm Priya, starting Monday on the data team."
|
|
9
|
+
# agentainer down -c my-onboarding.yaml
|
|
10
|
+
#
|
|
11
|
+
# The new hire only ever talks to `buddy`. buddy greets them, figures out what
|
|
12
|
+
# they need, and fans the question out to the right specialist -- then delivers a
|
|
13
|
+
# single, human answer back to `user`. The specialists never talk to each other
|
|
14
|
+
# and never talk to the new hire directly; everything funnels through buddy.
|
|
15
|
+
#
|
|
16
|
+
# user <--> buddy (the hub: the only agent the new hire messages)
|
|
17
|
+
# buddy
|
|
18
|
+
# / | \
|
|
19
|
+
# faq checklist it_help
|
|
20
|
+
# ...faq/checklist/it_help each talk ONLY to buddy -- no side channels.
|
|
21
|
+
#
|
|
22
|
+
# Key-free: swap each `command` for a mock bash loop and the whole thing comes up
|
|
23
|
+
# and routes mail with NO API keys. The `command` lines below launch the real
|
|
24
|
+
# CLIs; treat them as sensitive (they may embed keys via a shell alias).
|
|
25
|
+
# =============================================================================
|
|
26
|
+
|
|
27
|
+
swarm:
|
|
28
|
+
name: onboarding
|
|
29
|
+
root: ./onboarding-workspace
|
|
30
|
+
|
|
31
|
+
defaults:
|
|
32
|
+
capture: none # claude agents auto-upgrade to their Stop hook at `up`
|
|
33
|
+
can_talk_to: [] # deny-by-default; every agent opens its own ACL below
|
|
34
|
+
|
|
35
|
+
agents:
|
|
36
|
+
- name: buddy
|
|
37
|
+
type: claude
|
|
38
|
+
can_talk_to: [faq, checklist, it_help, user]
|
|
39
|
+
command: "claude --dangerously-skip-permissions"
|
|
40
|
+
role: |
|
|
41
|
+
You are BUDDY, the onboarding buddy for a brand-new employee (a human).
|
|
42
|
+
You are warm, concise, and never make the new hire chase down answers. You
|
|
43
|
+
are the ONLY agent who talks to the person, and the only one who talks to
|
|
44
|
+
user; the specialists work behind you.
|
|
45
|
+
When the new hire first writes, greet them by name, welcome them, and ask
|
|
46
|
+
two or three quick questions if you need them (team, role, start date,
|
|
47
|
+
remote or in-office). Then help them get productive in week one.
|
|
48
|
+
Route work to the right specialist and synthesize -- do not answer policy,
|
|
49
|
+
task-tracking, or IT questions from memory:
|
|
50
|
+
- faq -> company policy, benefits, culture, "how do we do X here".
|
|
51
|
+
- checklist -> what onboarding tasks are due, and by when.
|
|
52
|
+
- it_help -> laptop, accounts, VPN, tool access, "I can't log in".
|
|
53
|
+
Ask one specialist at a time, wait for the reply, and fold everything into
|
|
54
|
+
ONE friendly message back to the new hire. If a question spans two areas
|
|
55
|
+
(e.g. "when do I get my laptop AND is there a dress code"), split it, ask
|
|
56
|
+
each specialist, and combine their answers. Close every message by telling
|
|
57
|
+
the new hire they can just ask you anything.
|
|
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 whether they are
|
|
61
|
+
available) and then finish your turn. You may only message the agents in
|
|
62
|
+
your can_talk_to: faq, checklist, it_help, user.
|
|
63
|
+
|
|
64
|
+
- name: faq
|
|
65
|
+
type: claude
|
|
66
|
+
can_talk_to: [buddy]
|
|
67
|
+
command: "claude --dangerously-skip-permissions"
|
|
68
|
+
role: |
|
|
69
|
+
You are the PEOPLE & CULTURE FAQ desk. buddy forwards you questions about
|
|
70
|
+
company policy, benefits, PTO, expenses, working hours, remote norms, and
|
|
71
|
+
"how do we actually do things here". Answer plainly and specifically for a
|
|
72
|
+
first-week employee: give the rule, then the one practical takeaway. If a
|
|
73
|
+
question is really an IT or task-deadline question, say so in your reply so
|
|
74
|
+
buddy can re-route it -- do not guess. If something is genuinely
|
|
75
|
+
company-specific and you have no basis for an answer, say what is unknown
|
|
76
|
+
and suggest who owns it (e.g. "HR owns the benefits portal"). Reply only to
|
|
77
|
+
buddy by writing into outbox/buddy/; you talk to no one else.
|
|
78
|
+
|
|
79
|
+
- name: checklist
|
|
80
|
+
type: claude
|
|
81
|
+
can_talk_to: [buddy]
|
|
82
|
+
command: "claude --dangerously-skip-permissions"
|
|
83
|
+
role: |
|
|
84
|
+
You are the ONBOARDING CHECKLIST keeper. You own the new hire's task list
|
|
85
|
+
and its deadlines. Maintain a running CHECKLIST.md in your working
|
|
86
|
+
directory with, for each item: the task, the owner, the due date relative
|
|
87
|
+
to the start date, and its status (todo / doing / done). A sensible day-one
|
|
88
|
+
default set: sign employment paperwork (day 1), enroll in benefits (week
|
|
89
|
+
1), complete security-awareness training (week 1), set up direct deposit
|
|
90
|
+
(week 1), book a 1:1 with your manager (week 1), finish role-specific
|
|
91
|
+
setup (week 2). When buddy tells you the start date, recompute the dates.
|
|
92
|
+
When buddy asks "what's due", reply with the outstanding items in due-date
|
|
93
|
+
order and flag anything overdue. When buddy reports something finished,
|
|
94
|
+
mark it done. Keep answers short and scannable. Reply only to buddy by
|
|
95
|
+
writing into outbox/buddy/.
|
|
96
|
+
|
|
97
|
+
- name: it_help
|
|
98
|
+
type: claude
|
|
99
|
+
can_talk_to: [buddy]
|
|
100
|
+
command: "claude --dangerously-skip-permissions"
|
|
101
|
+
role: |
|
|
102
|
+
You are IT HELP for onboarding. buddy forwards you the new hire's tooling
|
|
103
|
+
and access questions: laptop provisioning, email and SSO accounts, VPN,
|
|
104
|
+
password resets, MFA enrollment, chat/repo/ticketing access, and "I can't
|
|
105
|
+
log in to X". Give clear, numbered setup steps a non-technical new hire can
|
|
106
|
+
follow, and name the exact system when access must be requested (e.g.
|
|
107
|
+
"request repo access in the access portal; approval is from your manager").
|
|
108
|
+
Never ask for or repeat passwords, tokens, or secrets -- direct the user to
|
|
109
|
+
the self-service reset flow instead. If a request is really a policy or
|
|
110
|
+
deadline question, say so in your reply so buddy can re-route it. Reply
|
|
111
|
+
only to buddy by writing into outbox/buddy/.
|