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.
Files changed (98) hide show
  1. package/README.md +248 -677
  2. package/agentainer +16 -18
  3. package/agentainer.example.yaml +86 -0
  4. package/bin/agentainer.js +9 -8
  5. package/examples/academic-coauthor.yaml +123 -0
  6. package/examples/accessibility-audit.yaml +152 -0
  7. package/examples/affiliate-product-reviews.yaml +106 -0
  8. package/examples/api-design.yaml +157 -0
  9. package/examples/app-store-optimization.yaml +108 -0
  10. package/examples/brainstorm.yaml +27 -128
  11. package/examples/brand-voice-style-guide.yaml +109 -0
  12. package/examples/bug-hunt.yaml +51 -96
  13. package/examples/candidate-screen.yaml +122 -0
  14. package/examples/case-study-writer.yaml +100 -0
  15. package/examples/changelog-release-notes.yaml +114 -0
  16. package/examples/chatbot-builder.yaml +138 -0
  17. package/examples/code-review.yaml +73 -0
  18. package/examples/comparison-guide-writer.yaml +106 -0
  19. package/examples/competitive-intel.yaml +126 -0
  20. package/examples/content-studio.yaml +91 -0
  21. package/examples/course-creator.yaml +133 -0
  22. package/examples/customer-support-triage.yaml +118 -0
  23. package/examples/daily-briefing.yaml +119 -0
  24. package/examples/data-pipeline-builder.yaml +135 -0
  25. package/examples/debate.yaml +16 -90
  26. package/examples/design-system.yaml +138 -0
  27. package/examples/ebook-generator.yaml +90 -0
  28. package/examples/ecommerce-listing-optimizer.yaml +126 -0
  29. package/examples/email-newsletter.yaml +103 -0
  30. package/examples/faq-knowledge-sync.yaml +107 -0
  31. package/examples/game-design.yaml +122 -0
  32. package/examples/glossary-term-writer.yaml +103 -0
  33. package/examples/incident-response.yaml +52 -109
  34. package/examples/knowledge-base.yaml +115 -0
  35. package/examples/landing-page-converter.yaml +103 -0
  36. package/examples/legal-contract-review.yaml +118 -0
  37. package/examples/linkedin-ghostwriter.yaml +93 -0
  38. package/examples/localization.yaml +56 -123
  39. package/examples/meeting-notes.yaml +111 -0
  40. package/examples/migration-planner.yaml +127 -0
  41. package/examples/onboarding-buddy.yaml +111 -0
  42. package/examples/performance-audit.yaml +123 -0
  43. package/examples/podcast-production.yaml +117 -0
  44. package/examples/postmortem.yaml +119 -0
  45. package/examples/pr-review-gate.yaml +123 -0
  46. package/examples/press-release-wire.yaml +96 -0
  47. package/examples/product-spec.yaml +107 -0
  48. package/examples/prompt-engineering-lab.yaml +109 -0
  49. package/examples/quickstart.yaml +48 -0
  50. package/examples/rag-builder.yaml +145 -0
  51. package/examples/refactor-planner.yaml +127 -0
  52. package/examples/research.yaml +25 -0
  53. package/examples/resume-tailor.yaml +116 -0
  54. package/examples/rfp-response.yaml +124 -0
  55. package/examples/sales-coach.yaml +123 -0
  56. package/examples/security-audit.yaml +120 -0
  57. package/examples/seo-audit-and-fix.yaml +138 -0
  58. package/examples/seo-content-factory.yaml +103 -0
  59. package/examples/social-media.yaml +103 -0
  60. package/examples/software-company.yaml +71 -128
  61. package/examples/startup-validator.yaml +115 -0
  62. package/examples/tdd-pingpong.yaml +36 -68
  63. package/examples/technical-documentation.yaml +112 -0
  64. package/examples/test-factory.yaml +114 -0
  65. package/examples/tutorial-howto-creator.yaml +111 -0
  66. package/examples/twitter-x-thread-factory.yaml +91 -0
  67. package/examples/white-paper-research.yaml +96 -0
  68. package/examples/writers-room.yaml +49 -111
  69. package/examples/youtube-script-studio.yaml +107 -0
  70. package/hooks/claude_stop.sh +5 -3
  71. package/hooks/codex_notify.sh +4 -3
  72. package/lib/cli.py +933 -0
  73. package/lib/config.py +267 -308
  74. package/lib/hooks.py +246 -0
  75. package/lib/lock.py +75 -0
  76. package/lib/log.py +64 -0
  77. package/lib/mail.py +699 -0
  78. package/lib/minyaml.py +1 -39
  79. package/lib/reconcile.py +544 -0
  80. package/lib/sessions.py +223 -0
  81. package/lib/supervisor.py +216 -0
  82. package/lib/telegram.py +372 -0
  83. package/lib/tmux.py +355 -0
  84. package/lib/turn.py +167 -0
  85. package/lib/ui.py +1219 -0
  86. package/llms.txt +145 -429
  87. package/package.json +9 -7
  88. package/scripts/check-deps.js +18 -61
  89. package/ui/app.js +1136 -0
  90. package/ui/index.html +404 -0
  91. package/agents.example.yaml +0 -257
  92. package/examples/code-review-broadcast.yaml +0 -109
  93. package/examples/existing-repo.yaml +0 -74
  94. package/examples/multi-language-broadcast.yaml +0 -127
  95. package/examples/ping-pong.yaml +0 -89
  96. package/examples/red-team.yaml +0 -117
  97. package/examples/research-swarm.yaml +0 -129
  98. package/lib/swarm.py +0 -2461
@@ -1,136 +1,69 @@
1
1
  # =============================================================================
2
- # Localization -- translate content and quality-check it, hands-free.
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
- # agentainer up -c examples/localization.yaml
5
- # agentainer send --to translator "Translate ./docs/quickstart.md to French."
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: mostly a one-way pipeline, like bug-hunt. Each stage auto-forwards its
8
- # finished turn to the next via `forward_responses_to`, so a human kicks it off
9
- # once and the draft flows through review without further prodding:
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
- # translator --> reviewer --> backchecker
12
- # ^ |
13
- # `---------- (retry) ----------'
14
+ # tr-es \
15
+ # tr-fr > source (hub)
16
+ # tr-de /
14
17
  #
15
- # That last edge is the loop-back. When the backchecker's verdict is
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: l10n
33
- root: ./l10n-workspace
34
- session_prefix: "l10n-"
22
+ name: localization
23
+ root: ./localization-workspace
35
24
 
36
- # A forward chain is at most translator -> reviewer -> backchecker (3 hops).
37
- # The retry loop-back does not lengthen it: a tagged <swarm-send> resets the
38
- # hop count, so each pass is a fresh 3-hop chain.
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
- # The backchecker can send a failed draft back to the translator for another
96
- # pass. It does NOT auto-forward (that would resend a clean verdict too);
97
- # instead it emits a <swarm-send> block only when the verdict demands a retry.
98
- can_talk_to: ["translator"]
99
-
100
- first_prompt: |
101
- You are the BACKCHECKER, the last stage of a localization pipeline. You do
102
- not trust the translation until you have tested it.
103
-
104
- Back-translate the reviewed text into the SOURCE language, working only
105
- from the translation -- do not peek at the original until your
106
- back-translation is written. Then compare the two source versions and find
107
- every place the meaning drifted, softened, or flipped.
108
-
109
- Report:
110
- 1. Any semantic difference between the original and your back-translation,
111
- quoting both sides.
112
- 2. Whether markup, placeholders and code spans survived unchanged.
113
- 3. A verdict: FAITHFUL, or NEEDS ANOTHER PASS with the specific lines
114
- that need it.
115
-
116
- Be concrete: cite the exact phrase and both readings. A confident "looks
117
- fine" that skips the comparison is worse than useless.
118
-
119
- If your verdict is NEEDS ANOTHER PASS, do not end your turn silently: close
120
- your report with a block addressed to the translator containing the exact
121
- phrases that need work and your suggested fix, so the draft takes another
122
- pass:
123
-
124
- <swarm-send to="translator">
125
- Lines 12 and 19 still read literally -- "open the door" should be the
126
- idiomatic "let them in". Also the {count} placeholder was dropped.
127
- </swarm-send>
128
-
129
- If your verdict is FAITHFUL, just report it and finish -- nothing is sent
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/.