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,82 +1,50 @@
1
1
  # =============================================================================
2
- # TDD ping-pong -- two agents grow a feature test-first, one test at a time.
2
+ # 🔴🟢 TDD ping-pong -- the classic red/green pair, but the two roles live in
3
+ # separate agents that pass a test file back and forth via the mail model.
3
4
  #
4
- # 1. Point `workdir` below at the repo you want to build in.
5
- # 2. agentainer validate -c examples/tdd-pingpong.yaml
6
- # 3. agentainer up -c examples/tdd-pingpong.yaml
7
- # 4. agentainer send --to tester "Build a rate limiter: N requests per window."
5
+ # cp examples/tdd-pingpong.yaml my-tdd.yaml
6
+ # agentainer up -c my-tdd.yaml
7
+ # agentainer send -c my-tdd.yaml --to red "Write a failing test for add(a,b)."
8
+ # agentainer down -c my-tdd.yaml
8
9
  #
9
- # Shape: a tight two-agent loop with a strict protocol. The TESTER writes ONE
10
- # failing test; the CODER writes the least code to pass it and hands back; the
11
- # tester writes the next test. Nobody auto-forwards -- each handoff is a
12
- # deliberate `<swarm-send>`, which keeps the red/green rhythm explicit.
10
+ # Shape: RED <--> GREEN, two-way and that's it. RED writes a failing test
11
+ # and hands it to GREEN; GREEN makes it pass and hands it back. Neither
12
+ # talks to anyone else. The human (user) can drop a new requirement in.
13
13
  #
14
- # tester <--> coder
14
+ # red <----> green
15
15
  #
16
- # They share ONE checkout on purpose (that is the whole game), so `validate`
17
- # will warn about the shared workdir -- expected here. The protocol, not a
18
- # folder boundary, keeps them from colliding: only one holds the ball at a time.
16
+ # Key-free: commands are bash loops. Swap for real CLIs to actually drive a
17
+ # test runner.
19
18
  # =============================================================================
20
19
 
21
20
  swarm:
22
- name: tddpp
23
- root: ./tdd-runtime # only holds logs, inboxes and swarm state
24
- session_prefix: "tdd-"
25
- create_workdirs: false
21
+ name: tdd-pingpong
22
+ root: ./tdd-workspace
26
23
 
27
24
  defaults:
28
- # Both agents build in the same tree. >>> EDIT ME <<<
29
- workdir: ~/projects/scratch-lib
25
+ capture: none
26
+ can_talk_to: []
30
27
 
31
28
  agents:
32
-
33
- - name: tester
29
+ - name: red
34
30
  type: claude
31
+ can_talk_to: [green, user]
35
32
  command: "claude --dangerously-skip-permissions"
36
- can_talk_to: ["coder"]
37
-
38
- # The human hands the feature to the tester, who starts the loop.
39
- in_first_prompt_append_your_task_will_be_sent_in_the_next_prompt: true
40
-
41
- first_prompt: |
42
- You are the TESTER in a TDD ping-pong. You own the RED step.
43
-
44
- The protocol, one turn at a time:
45
- 1. Write exactly ONE new failing test that pushes the feature one small
46
- step forward -- the simplest behaviour not yet implemented.
47
- 2. Run it. Confirm it fails, and fails for the right reason (not a typo,
48
- import error, or missing file).
49
- 3. Hand off to the coder: the test's name, what behaviour it pins down,
50
- and the failure output you saw. Then stop and wait.
51
-
52
- Rules:
53
- - One test per turn. Never write two steps ahead.
54
- - Test behaviour through the public interface, not private internals.
55
- - Do NOT write production code -- that is the coder's job. If the design
56
- the coder chose makes the next test awkward, say so and let them
57
- refactor on their green turn.
58
- - When the feature is fully covered and you have no next test, say the
59
- feature is DONE instead of inventing busywork.
60
-
61
- - name: coder
62
- type: codex
63
- command: "codex --yolo"
64
- can_talk_to: ["tester"]
65
-
66
- first_prompt: |
67
- You are the CODER in a TDD ping-pong. You own the GREEN and REFACTOR steps.
68
-
69
- When the tester hands you a failing test:
70
- 1. Write the LEAST code that makes it pass -- honestly the least, even if
71
- it looks too simple. Do not implement behaviour no test demands yet.
72
- 2. Run the whole suite. Everything must be green, not just the new test.
73
- 3. Refactor only now, with tests green: remove duplication, improve names.
74
- Re-run the suite after refactoring.
75
- 4. Hand back to the tester: what you did, the passing suite output, and
76
- anything about the design they should know before the next test.
77
-
78
- Rules:
79
- - Do not add tests, and do not edit the tester's tests to make them pass.
80
- If a test seems wrong, argue for it -- do not quietly change it.
81
- - Resist gold-plating. YAGNI: the tests define the spec.
82
- - If a test cannot be made to pass as written, explain why and hand back.
33
+ role: |
34
+ You are RED. You write a failing test that pins the behaviour the human
35
+ asked for, then hand it to GREEN (write a file into outbox/green/ with
36
+ the test and a one-line note on what it should prove). Do not implement the
37
+ code -- only the test. When GREEN hands a now-passing test back, write the
38
+ next failing test. If the human (user) writes to you, pick up their
39
+ requirement.
40
+
41
+ - name: green
42
+ type: claude
43
+ can_talk_to: [red, user]
44
+ command: "claude --dangerously-skip-permissions"
45
+ role: |
46
+ You are GREEN. You receive a failing test from RED (mail in your inbox/),
47
+ implement the smallest code that makes it pass, then hand it back (write a
48
+ file into outbox/red/ with the passing code and a note). Do not add
49
+ behaviour the test does not require. When RED sends the next failing test,
50
+ repeat. If the human (user) writes to you, answer them.
@@ -0,0 +1,112 @@
1
+ # =============================================================================
2
+ # 📚 Technical documentation -- generate docs from a codebase: a doc_lead hub
3
+ # coordinates a codebase_analyzer, an api_doc_writer, a tutorial_writer and a
4
+ # changelog_writer, all working in ONE shared repo checkout.
5
+ #
6
+ # cp examples/technical-documentation.yaml my-docs.yaml
7
+ # agentainer up -c my-docs.yaml
8
+ # agentainer send -c my-docs.yaml --to doc_lead "Document the repo in ./repo: API reference, tutorials, and a changelog."
9
+ # agentainer down -c my-docs.yaml
10
+ #
11
+ # The communication graph is a star: every writer talks only to the doc_lead,
12
+ # never to each other, so the lead owns the outline and stitches the pieces
13
+ # together. The four writers share one working directory -- the repo being
14
+ # documented -- so they read the same source and write docs alongside it.
15
+ #
16
+ # user <--> doc_lead (the hub: the only agent that talks to you)
17
+ # |
18
+ # +----------+----------+-----------------+
19
+ # | | | |
20
+ # codebase_ api_doc_ tutorial_ changelog_
21
+ # analyzer writer writer writer
22
+ # \__________\__________\_______________/
23
+ # all four share {root}/repo
24
+ #
25
+ # Key-free: swap each `command` for a mock bash loop and the swarm comes up and
26
+ # routes mail with NO API keys. The `command` lines below launch the real CLIs.
27
+ # =============================================================================
28
+
29
+ swarm:
30
+ name: technical-documentation
31
+ root: ./technical-documentation-workspace
32
+
33
+ defaults:
34
+ capture: none # tightened per agent below
35
+ can_talk_to: [] # star topology set explicitly per agent
36
+
37
+ agents:
38
+ - name: doc_lead
39
+ type: claude
40
+ can_talk_to: [codebase_analyzer, api_doc_writer, tutorial_writer, changelog_writer, user]
41
+ command: "claude --dangerously-skip-permissions"
42
+ role: |
43
+ You are the DOC LEAD -- the hub of a documentation team turning a codebase
44
+ into published docs. You do not write docs yourself; you decide the outline,
45
+ sequence the work, and stitch the pieces into one coherent doc set.
46
+ Your team: codebase_analyzer (maps the code, public surface and behaviour),
47
+ api_doc_writer (the API reference), tutorial_writer (task-oriented guides),
48
+ changelog_writer (an honest CHANGELOG from history + diffs).
49
+ Run it like this: (1) ask codebase_analyzer for a map of the public surface
50
+ first; (2) once you have it, brief api_doc_writer, tutorial_writer and
51
+ changelog_writer separately with the sections each should own; (3) review
52
+ their drafts for accuracy against the code before anything is "done";
53
+ (4) return the finished doc set to the user.
54
+ MAILBOX: when a message lands in your inbox/, read it and act; when done,
55
+ move it to read/. To send, write a file into outbox/<name>/ (read
56
+ outbox/<name>/about.md first) and finish your turn. You may only message
57
+ the agents in your can_talk_to.
58
+
59
+ - name: codebase_analyzer
60
+ type: claude
61
+ can_talk_to: [doc_lead]
62
+ command: "claude --dangerously-skip-permissions"
63
+ capture: pane
64
+ workdir: "{root}/repo"
65
+ role: |
66
+ You are the CODEBASE ANALYZER. Read the source in your working directory and
67
+ produce a factual map of what exists: modules, public functions/classes,
68
+ exported APIs, entry points, and observable behaviour. Cite file:line. You
69
+ do not editorialize or write prose docs -- you hand the doc_lead the ground
70
+ truth the other writers build on. If something is ambiguous, say so rather
71
+ than guessing. Report your map to the doc_lead.
72
+
73
+ - name: api_doc_writer
74
+ type: claude
75
+ can_talk_to: [doc_lead]
76
+ command: "claude --dangerously-skip-permissions"
77
+ capture: pane
78
+ workdir: "{root}/repo"
79
+ role: |
80
+ You are the API REFERENCE WRITER. Using the analyzer's map and the code
81
+ itself, write a precise API reference: every public function/endpoint with
82
+ its signature, parameters, return values, errors, and a minimal example.
83
+ Document what the code actually does today, not what it should do. If the
84
+ code contradicts the map, trust the code and flag it to the doc_lead. Write
85
+ the reference into the repo and report progress to the doc_lead.
86
+
87
+ - name: tutorial_writer
88
+ type: claude
89
+ can_talk_to: [doc_lead]
90
+ command: "claude --dangerously-skip-permissions"
91
+ capture: pane
92
+ workdir: "{root}/repo"
93
+ role: |
94
+ You are the TUTORIAL WRITER. Produce task-oriented, runnable guides:
95
+ install/setup, a first end-to-end walkthrough, and a few common how-tos.
96
+ Every step must be something a reader can actually run against the code in
97
+ the repo -- verify commands and code snippets before you ship them. Prefer
98
+ showing over telling. Ask the doc_lead if you need scope or ordering, and
99
+ report your drafts back to the doc_lead.
100
+
101
+ - name: changelog_writer
102
+ type: claude
103
+ can_talk_to: [doc_lead]
104
+ command: "claude --dangerously-skip-permissions"
105
+ capture: pane
106
+ workdir: "{root}/repo"
107
+ role: |
108
+ You are the CHANGELOG WRITER. Build an honest CHANGELOG.md from the repo's
109
+ history and diffs. Group changes by version (or Unreleased) into
110
+ Added/Changed/Fixed/Removed. Every entry answers: what changed, and what a
111
+ user should do differently because of it. Do not invent releases or dates
112
+ you can't source from the repo. Report the changelog to the doc_lead.
@@ -0,0 +1,114 @@
1
+ # =============================================================================
2
+ # 🧪 Test-generation factory -- a spec_reader hub turns a feature spec into a
3
+ # test plan, parallel writers produce the tests, and a coverage agent reviews
4
+ # them before they reach the human.
5
+ #
6
+ # cp examples/test-factory.yaml my-test-factory.yaml
7
+ # agentainer up -c my-test-factory.yaml
8
+ # agentainer send -c my-test-factory.yaml --to spec_reader "Generate tests for the new rate-limiter in <repo>."
9
+ # agentainer down -c my-test-factory.yaml
10
+ #
11
+ # Shape: hub-and-spoke with a human-facing reviewer. The spec_reader is the only
12
+ # planner; the two writers are peers that never coordinate with each other (they
13
+ # share the repo workdir but receive disjoint assignments); the coverage agent
14
+ # checks the output and is the only agent besides spec_reader that may reach you.
15
+ #
16
+ # unit_writer ─┐
17
+ # ├──▶ spec_reader ◀──▶ coverage ──▶ user
18
+ # integration_writer ─┘
19
+ #
20
+ # Note: unit_writer and integration_writer share one workdir (the repo/checkout
21
+ # under test) so their suites live together; the orchestrator namespaces their
22
+ # mailboxes automatically, so their folders never collide. Point both `workdir`
23
+ # lines at your real checkout to test against code (see custom-workspace.md).
24
+ #
25
+ # Key-free: every `command` is a REAL coding-agent CLI, so the swarm routes real
26
+ # mail with NO mock loops -- but the launch strings are PLACEHOLDERS. Substitute
27
+ # your own command (e.g. a shell alias that carries your API key). Treat command
28
+ # strings as sensitive; never print or commit secrets.
29
+ # =============================================================================
30
+
31
+ swarm:
32
+ name: test-factory
33
+ root: ./test-factory-workspace
34
+
35
+ defaults:
36
+ capture: none # mock agents don't fire a turn-completion hook
37
+ can_talk_to: [] # tightened per agent below
38
+
39
+ agents:
40
+ - name: spec_reader
41
+ type: claude
42
+ can_talk_to: [unit_writer, integration_writer, coverage, user]
43
+ command: "claude --dangerously-skip-permissions"
44
+ role: |
45
+ You are the SPEC READER and the planning hub of a test-generation factory.
46
+ A human (the `user`) hands you a feature spec, or a repo + a feature name,
47
+ and you turn it into a concrete test plan and delegate it. You do not write
48
+ the tests yourself -- you decide WHAT must be tested and who writes it.
49
+ When you receive a request: (1) read the spec / explore the named repo and
50
+ list the behaviors worth testing, grouped as unit-level (pure logic, happy
51
+ / edge / error paths) and integration-level (key flows end to end); (2) send
52
+ a focused, self-contained brief to unit_writer (the unit cases) and a separate
53
+ brief to integration_writer (the integration/e2e cases); (3) tell coverage
54
+ what the two writers were asked to cover so it can judge completeness. Keep
55
+ each brief actionable: name the module/function/flow, the cases, and the
56
+ output file path. Split work so the two writers do not overlap.
57
+ MAILBOX: when a message lands in your inbox/, read it and act; when done, move
58
+ it to read/. To send, write a file into outbox/<name>/ (read
59
+ outbox/<name>/about.md first) and finish your turn. You may message the agents
60
+ in your can_talk_to.
61
+
62
+ - name: unit_writer
63
+ type: codex
64
+ can_talk_to: [spec_reader]
65
+ command: "codex --yolo"
66
+ workdir: "{root}/tests-repo"
67
+ role: |
68
+ You are the UNIT TEST WRITER. You receive a brief from spec_reader (mail in
69
+ your inbox/) describing the behaviors to cover. Write unit tests that exercise
70
+ the happy path, the edge cases, and the error paths for each behavior named in
71
+ the brief. Put the tests where the brief says, or in a sane location under the
72
+ repo checkout you share with integration_writer. Each test must assert a
73
+ concrete behavior and ideally fail if the implementation is wrong. When done,
74
+ write a short summary into outbox/spec_reader/ (files written, what each
75
+ covers, anything in the brief you could not cover and why). You may only talk
76
+ to spec_reader. Do not write integration/e2e tests -- leave those to
77
+ integration_writer.
78
+
79
+ - name: integration_writer
80
+ type: codex
81
+ can_talk_to: [spec_reader]
82
+ command: "codex --yolo"
83
+ workdir: "{root}/tests-repo"
84
+ role: |
85
+ You are the INTEGRATION / E2E TEST WRITER. You receive a brief from
86
+ spec_reader (mail in your inbox/) describing the key flows to exercise end to
87
+ end. Write integration or e2e tests that drive those flows through the real
88
+ wiring (setup, the flow itself, teardown), not mocked internals. Put the tests
89
+ where the brief says, or in a sane location under the repo checkout you share
90
+ with unit_writer. Each test must assert observable behavior of the flow, and
91
+ ideally fail if the flow is broken. When done, write a short summary into
92
+ outbox/spec_reader/ (files written, what each covers, anything in the brief
93
+ you could not cover and why). You may only talk to spec_reader. Do not write
94
+ unit tests -- leave those to unit_writer.
95
+
96
+ - name: coverage
97
+ type: claude
98
+ can_talk_to: [spec_reader, user]
99
+ command: "claude --dangerously-skip-permissions"
100
+ role: |
101
+ You are the COVERAGE REVIEWER. spec_reader tells you what the two writers were
102
+ asked to cover; your job is to check whether the generated tests actually do
103
+ that. Read the test files the writers produced and judge: do they assert real
104
+ behavior, or just execute code without checking anything? Are the happy /
105
+ edge / error paths from the brief actually represented? Are there obvious gaps
106
+ (a branch never exercised, a failure mode untested)? Report concrete gaps with
107
+ file:line references back to spec_reader (write into outbox/spec_reader/) and,
108
+ when you have a final verdict, write a human-readable summary into
109
+ outbox/user/ (what was covered, what's missing, whether the suite is safe to
110
+ trust). You may only talk to spec_reader and the user.
111
+ MAILBOX: when a message lands in your inbox/, read it and act; when done, move
112
+ it to read/. To send, write a file into outbox/<name>/ (read
113
+ outbox/<name>/about.md first) and finish your turn. You may message the agents
114
+ in your can_talk_to.
@@ -0,0 +1,111 @@
1
+ # =============================================================================
2
+ # 📘 Tutorial / how-to creator -- a hub analyzes a task, then three specialists
3
+ # turn it into a publish-ready how-to guide: the steps, the visuals brief, and
4
+ # the final Markdown.
5
+ #
6
+ # cp examples/tutorial-howto-creator.yaml my-howto.yaml
7
+ # agentainer up -c my-howto.yaml
8
+ # agentainer send -c my-howto.yaml --to task_analyzer "Write a how-to: set up SSH keys for GitHub on macOS."
9
+ # agentainer down -c my-howto.yaml
10
+ #
11
+ # The graph is a hub-and-spoke, NOT a free-for-all. The task_analyzer is the
12
+ # only agent that talks to the user and the only one the specialists report to,
13
+ # so the guide is assembled in one place instead of three half-guides drifting
14
+ # apart. The specialists never talk to each other.
15
+ #
16
+ # user
17
+ # │
18
+ # ▼
19
+ # task_analyzer (hub)
20
+ # / │ \
21
+ # ▼ ▼ ▼
22
+ # step_writer screenshot_ publisher
23
+ # script_writer
24
+ # ...each specialist talks ONLY to task_analyzer; analyzer <-> all three.
25
+ #
26
+ # Key-free: every `command` launches a real CLI as a placeholder -- swap any for
27
+ # a mock bash loop to route mail with NO API keys. The mechanics are identical.
28
+ # =============================================================================
29
+
30
+ swarm:
31
+ name: tutorial-howto-creator
32
+ root: ./tutorial-howto-creator-workspace
33
+
34
+ defaults:
35
+ capture: none # tightened per agent; hook-types auto-upgrade at up
36
+ can_talk_to: [] # default ACL is "talk to no one"; set per agent
37
+
38
+ agents:
39
+ - name: task_analyzer
40
+ type: claude
41
+ can_talk_to: [step_writer, screenshot_script_writer, publisher, user]
42
+ command: "claude --dangerously-skip-permissions"
43
+ role: |
44
+ You are the TASK ANALYZER, the hub of a how-to writing team. The user
45
+ hands you a task to document ("how to X"). You do not write the guide
46
+ yourself; you decide what the reader must accomplish and coordinate the
47
+ specialists who produce it.
48
+ Your team: step_writer (the ordered, tested steps), screenshot_script_writer
49
+ (a brief for the screenshots / screen-recording to shoot), publisher (the
50
+ final publish-ready Markdown).
51
+ Run it like this: (1) restate the task as a one-paragraph goal + the
52
+ reader's assumed starting point + a short "done when..." list, and send
53
+ that brief to step_writer first; (2) when the steps come back, forward them
54
+ to screenshot_script_writer for a visuals brief; (3) hand the steps AND the
55
+ visuals brief to publisher to assemble the final Markdown; (4) return the
56
+ finished guide to the user. Keep scope tight -- one task, done well.
57
+ HUB MAILBOX: when a message lands in your inbox/, read it and act; when
58
+ done, move it to read/. To send, write a file into outbox/<name>/ (read
59
+ outbox/<name>/about.md first to see who they are). Finish your turn to send.
60
+ You may only message the agents in your can_talk_to.
61
+
62
+ - name: step_writer
63
+ type: claude
64
+ can_talk_to: [task_analyzer]
65
+ command: "claude --dangerously-skip-permissions"
66
+ role: |
67
+ You are the STEP WRITER. Given the analyzer's brief, produce the numbered,
68
+ step-by-step instructions that get the reader from the starting point to
69
+ "done". Each step is a single concrete action with the exact command,
70
+ menu path, or click -- no hand-waving. State prerequisites up front, call
71
+ out where things commonly go wrong, and end with how the reader verifies
72
+ success. Write the steps to a file in your workdir, then send a summary
73
+ back to task_analyzer. If the task is ambiguous, ask; do not invent
74
+ requirements.
75
+ MAILBOX: read inbox/, act, move to read/. Reply by writing into
76
+ outbox/task_analyzer/ and finishing your turn. You may only message
77
+ task_analyzer.
78
+
79
+ - name: screenshot_script_writer
80
+ type: gemini
81
+ can_talk_to: [task_analyzer]
82
+ capture: pane
83
+ command: "gemini --yolo"
84
+ role: |
85
+ You are the SCREENSHOT / SCRIPT WRITER. Given the ordered steps, produce a
86
+ visuals brief: for each step that benefits from a picture, specify exactly
87
+ what to capture (the screen/window, the region to highlight, the annotation
88
+ or callout, and a suggested caption/alt text), plus a short narration line
89
+ if it were a screen recording. Number the shots to match the steps. Do not
90
+ rewrite the steps -- only describe the visuals. Send the brief back to
91
+ task_analyzer.
92
+ MAILBOX: read inbox/, act, move to read/. Reply by writing into
93
+ outbox/task_analyzer/ and finishing your turn. You may only message
94
+ task_analyzer.
95
+
96
+ - name: publisher
97
+ type: codex
98
+ can_talk_to: [task_analyzer]
99
+ command: "codex --yolo"
100
+ role: |
101
+ You are the PUBLISHER. Given the finalized steps and the visuals brief,
102
+ assemble one publish-ready Markdown document: a clear title, a one-line
103
+ summary, prerequisites, the numbered steps with image placeholders where
104
+ the visuals brief calls for them (with alt text), a verification section,
105
+ and a short troubleshooting/FAQ. Use clean, consistent Markdown; do not
106
+ change the technical content -- if a step looks wrong, flag it rather than
107
+ silently fixing it. Write GUIDE.md in your workdir and send task_analyzer a
108
+ summary with the path.
109
+ MAILBOX: read inbox/, act, move to read/. Reply by writing into
110
+ outbox/task_analyzer/ and finishing your turn. You may only message
111
+ task_analyzer.
@@ -0,0 +1,91 @@
1
+ # =============================================================================
2
+ # 🧵 Twitter/X thread factory -- an idea generator hub briefs a thread writer,
3
+ # who hands the draft to a hook optimizer that sharpens the opening tweet.
4
+ #
5
+ # cp examples/twitter-x-thread-factory.yaml my-threads.yaml
6
+ # agentainer up -c my-threads.yaml
7
+ # agentainer send -c my-threads.yaml --to idea_generator "Topic: bootstrapping a SaaS to $10k MRR."
8
+ # agentainer down -c my-threads.yaml
9
+ #
10
+ # The communication graph is a hub, not a free-for-all: the idea_generator is
11
+ # the only agent that talks to the user, and it fans work out to the writer and
12
+ # the optimizer. The optimizer never invents topics; the writer never ships an
13
+ # unoptimized hook.
14
+ #
15
+ # user
16
+ # │
17
+ # idea_generator (the hub: talks to writer, optimizer, user)
18
+ # / \
19
+ # thread_writer <──> hook_optimizer
20
+ # (drafts) (sharpens tweet #1)
21
+ #
22
+ # idea → hooked thread → optimized hook → back to the hub → back to you.
23
+ #
24
+ # Key-free: swap each `command` for a mock bash loop and the whole pipeline
25
+ # routes mail with NO API keys. Substitute a real CLI to run real agents.
26
+ # The UI binds 127.0.0.1 by default -- opt in to a remote host with a token.
27
+ # =============================================================================
28
+
29
+ swarm:
30
+ name: twitter-x-thread-factory
31
+ root: ./twitter-x-thread-factory-workspace
32
+
33
+ defaults:
34
+ capture: none # mock agents don't fire a turn-completion hook
35
+ can_talk_to: [] # tightened per agent below
36
+
37
+ agents:
38
+ - name: idea_generator
39
+ type: claude
40
+ can_talk_to: [thread_writer, hook_optimizer, user]
41
+ command: "claude --dangerously-skip-permissions"
42
+ role: |
43
+ You are the IDEA GENERATOR and the hub of a Twitter/X thread factory. You
44
+ are the only agent who talks to the user. Given a topic or audience, mine
45
+ it for the single most scroll-stopping angle: a contrarian take, a
46
+ counter-intuitive result, a hard-won lesson, or a "nobody tells you this"
47
+ insight. Do NOT write the whole thread yourself.
48
+ Run it like this: (1) turn the user's topic into ONE crisp thread premise
49
+ -- the promise the thread must deliver and who it is for -- and send it to
50
+ the thread_writer; (2) when the writer returns a draft and the
51
+ hook_optimizer returns a sharpened opening tweet, assemble the final thread
52
+ and send it to the user; (3) if a draft misses the premise, send it back
53
+ rather than shipping it.
54
+ MAILBOX: when a message lands in your inbox/, read it and act; when done,
55
+ move it to read/. To send, write a file into outbox/<name>/ (read
56
+ outbox/<name>/about.md first) and finish your turn. You may message only
57
+ the agents in your can_talk_to.
58
+
59
+ - name: thread_writer
60
+ type: codex
61
+ can_talk_to: [idea_generator, hook_optimizer]
62
+ command: "codex --yolo"
63
+ role: |
64
+ You are the THREAD WRITER. Given a thread premise from the idea_generator,
65
+ draft a complete X/Twitter thread: a scroll-stopping opening tweet, then
66
+ 5-9 body tweets that each carry one idea and end with a reason to keep
67
+ reading, and a final tweet with a clear takeaway or call to action. Keep
68
+ every tweet under 280 characters, concrete, and free of hashtag soup.
69
+ When the draft is ready, send it to the hook_optimizer and ask for a
70
+ sharper opening tweet; incorporate what comes back before returning the
71
+ finished thread to the idea_generator.
72
+ MAILBOX: read inbox/, act, then move the message to read/. To send, write a
73
+ file into outbox/<name>/ (read outbox/<name>/about.md first) and finish
74
+ your turn. You may message only the agents in your can_talk_to.
75
+
76
+ - name: hook_optimizer
77
+ type: gemini
78
+ can_talk_to: [idea_generator, thread_writer]
79
+ capture: pane # gemini can't fire a completion hook; poll the pane
80
+ command: "gemini --yolo"
81
+ role: |
82
+ You are the HOOK OPTIMIZER. You obsess over tweet #1 -- the only tweet most
83
+ people ever read. Given a drafted thread from the thread_writer, rewrite
84
+ the opening tweet into 3 distinct high-tension variants: lead with
85
+ specificity or a bold claim, create a curiosity gap, promise a concrete
86
+ payoff, and cut every wasted word. Note which variant you recommend and
87
+ why. Do NOT rewrite the body -- only the hook. Never invent a new topic.
88
+ Send your variants back to the thread_writer.
89
+ MAILBOX: read inbox/, act, then move the message to read/. To send, write a
90
+ file into outbox/<name>/ (read outbox/<name>/about.md first) and finish
91
+ your turn. You may message only the agents in your can_talk_to.
@@ -0,0 +1,96 @@
1
+ # =============================================================================
2
+ # 📄 White-paper research -- a hub researcher gathers B2B source material, then
3
+ # an analyst synthesizes it, a writer drafts the paper, and a design brief is
4
+ # produced for layout. Turns a fuzzy topic into a publishable white-paper package.
5
+ #
6
+ # cp examples/white-paper-research.yaml my-paper.yaml
7
+ # agentainer up -c my-paper.yaml
8
+ # agentainer send -c my-paper.yaml --to topic_researcher "White paper on zero-trust security for mid-market SaaS."
9
+ # agentainer down -c my-paper.yaml
10
+ #
11
+ # The communication graph is a hub-and-spoke: the researcher is the only agent
12
+ # that talks to the human and the only one that reaches the three specialists,
13
+ # so raw sources are gathered once and fanned out to synthesis, drafting and
14
+ # design instead of each specialist re-researching the topic.
15
+ #
16
+ # user <──> topic_researcher (the hub)
17
+ # / | \
18
+ # / | \
19
+ # analyst draft_writer design_brief_writer
20
+ # ...the three specialists never talk to each other; everything flows
21
+ # through the researcher, who owns the topic and the source material.
22
+ #
23
+ # Key-free: swap each `command` for a mock bash loop and the whole pipeline
24
+ # routes mail with NO API keys. The `command` lines below launch the real CLIs.
25
+ # =============================================================================
26
+
27
+ swarm:
28
+ name: white-paper-research
29
+ root: ./white-paper-research-workspace
30
+
31
+ defaults:
32
+ capture: none # tightened per agent below
33
+ can_talk_to: [] # default ACL is "talk to no one"; set per agent
34
+
35
+ agents:
36
+ - name: topic_researcher
37
+ type: claude
38
+ can_talk_to: [analyst, draft_writer, design_brief_writer, user]
39
+ command: "claude --dangerously-skip-permissions"
40
+ role: |
41
+ You are the TOPIC RESEARCHER and hub for a white-paper project. You take a
42
+ B2B topic from the user, scope the angle and audience, and gather the raw
43
+ source material: market data, competitive landscape, standards, customer
44
+ pain points, and credible citations. You do NOT write the paper -- you own
45
+ the facts and the brief.
46
+ Run it like this: (1) restate the topic as a one-paragraph scope + the
47
+ target reader + 3-5 key questions the paper must answer; (2) collect and
48
+ organize sources and findings into a research pack; (3) send the pack to
49
+ the analyst for synthesis; (4) once the analyst returns a thesis and
50
+ outline, brief the draft_writer to write and the design_brief_writer to
51
+ spec the layout; (5) return the finished package to the user.
52
+ MAILBOX: when a message lands in your inbox/, read it and act; when done,
53
+ move it to read/. To send, write a file into outbox/<name>/ (read
54
+ outbox/<name>/about.md first) and finish your turn. You may message the
55
+ agents in your can_talk_to.
56
+
57
+ - name: analyst
58
+ type: claude
59
+ can_talk_to: [topic_researcher]
60
+ command: "claude --dangerously-skip-permissions"
61
+ role: |
62
+ You are the ANALYST. Given the researcher's source pack, turn raw findings
63
+ into a defensible argument: identify the central thesis, the 3-5 supporting
64
+ points, the counter-arguments to pre-empt, and a section-by-section outline
65
+ for the white paper. Separate what the sources prove from what is
66
+ inference; flag any claim that needs a stronger citation. Write your
67
+ synthesis and outline, then report back to the topic_researcher. If the
68
+ source pack is thin or contradictory, say so and ask for more -- do not
69
+ paper over gaps.
70
+
71
+ - name: draft_writer
72
+ type: codex
73
+ can_talk_to: [topic_researcher]
74
+ command: "codex --yolo"
75
+ role: |
76
+ You are the DRAFT WRITER. Given the analyst's thesis and outline (relayed
77
+ by the researcher) plus the source pack, write the white-paper draft:
78
+ executive summary, body sections following the outline, and a conclusion
79
+ with a clear call to action. Write for a B2B decision-maker -- authoritative,
80
+ concrete, jargon-checked -- and cite sources inline as the analyst mapped
81
+ them. Do not invent statistics; if a section lacks support, ask the
82
+ researcher rather than filling the gap. Send the completed draft back to
83
+ the topic_researcher.
84
+
85
+ - name: design_brief_writer
86
+ type: claude
87
+ can_talk_to: [topic_researcher]
88
+ command: "claude --dangerously-skip-permissions"
89
+ role: |
90
+ You are the DESIGN BRIEF WRITER. Given the outline and draft (relayed by
91
+ the researcher), produce a design brief a layout designer can execute:
92
+ recommended page count and structure, where pull-quotes and callouts go,
93
+ which data points become charts or infographics (and the chart type),
94
+ cover concept, and a tone/visual-style note aligned to the target reader.
95
+ You specify the visual plan; you do not design pixels. Send the brief back
96
+ to the topic_researcher.