agentirc-cli 3.1.0__tar.gz → 3.1.2__tar.gz

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 (295) hide show
  1. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/CHANGELOG.md +14 -0
  2. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/PKG-INFO +1 -1
  3. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/cli.py +26 -9
  4. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/mesh_config.py +35 -0
  5. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/ops-tooling.md +10 -6
  6. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/pyproject.toml +1 -1
  7. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_mesh_config.py +57 -0
  8. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/uv.lock +1 -1
  9. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.claude/skills/pr-review/SKILL.md +0 -0
  10. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.claude/skills/run-tests/SKILL.md +0 -0
  11. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
  12. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.flake8 +0 -0
  13. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/pages.yml +0 -0
  14. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/publish.yml +0 -0
  15. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/security-checks.yml +0 -0
  16. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/tests.yml +0 -0
  17. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.gitignore +0 -0
  18. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.markdownlint-cli2.yaml +0 -0
  19. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.pr_agent.toml +0 -0
  20. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.pre-commit-config.yaml +0 -0
  21. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.pylintrc +0 -0
  22. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/CLAUDE.md +0 -0
  23. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/CNAME +0 -0
  24. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/Gemfile +0 -0
  25. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/Gemfile.lock +0 -0
  26. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/LICENSE +0 -0
  27. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/README.md +0 -0
  28. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/SECURITY.md +0 -0
  29. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/_config.yml +0 -0
  30. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/_sass/color_schemes/anthropic.scss +0 -0
  31. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/_sass/custom/custom.scss +0 -0
  32. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/__init__.py +0 -0
  33. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/__main__.py +0 -0
  34. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/__init__.py +0 -0
  35. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/bot.py +0 -0
  36. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/bot_manager.py +0 -0
  37. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/config.py +0 -0
  38. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/http_listener.py +0 -0
  39. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/template_engine.py +0 -0
  40. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/virtual_client.py +0 -0
  41. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/__init__.py +0 -0
  42. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/__init__.py +0 -0
  43. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/agent_runner.py +0 -0
  44. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/config.py +0 -0
  45. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/daemon.py +0 -0
  46. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/ipc.py +0 -0
  47. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/irc_transport.py +0 -0
  48. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/message_buffer.py +0 -0
  49. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/skill/SKILL.md +0 -0
  50. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/skill/__init__.py +0 -0
  51. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/skill/irc_client.py +0 -0
  52. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/socket_server.py +0 -0
  53. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/supervisor.py +0 -0
  54. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/webhook.py +0 -0
  55. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/__init__.py +0 -0
  56. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/__main__.py +0 -0
  57. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/agent_runner.py +0 -0
  58. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/config.py +0 -0
  59. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/daemon.py +0 -0
  60. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/ipc.py +0 -0
  61. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/irc_transport.py +0 -0
  62. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/message_buffer.py +0 -0
  63. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/skill/SKILL.md +0 -0
  64. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/skill/__init__.py +0 -0
  65. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/skill/irc_client.py +0 -0
  66. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/socket_server.py +0 -0
  67. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/supervisor.py +0 -0
  68. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/webhook.py +0 -0
  69. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/__init__.py +0 -0
  70. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/agent_runner.py +0 -0
  71. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/config.py +0 -0
  72. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/daemon.py +0 -0
  73. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/ipc.py +0 -0
  74. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/irc_transport.py +0 -0
  75. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/message_buffer.py +0 -0
  76. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/skill/SKILL.md +0 -0
  77. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/skill/__init__.py +0 -0
  78. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/skill/irc_client.py +0 -0
  79. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/socket_server.py +0 -0
  80. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/supervisor.py +0 -0
  81. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/webhook.py +0 -0
  82. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/__init__.py +0 -0
  83. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/agent_runner.py +0 -0
  84. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/config.py +0 -0
  85. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/daemon.py +0 -0
  86. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/ipc.py +0 -0
  87. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/irc_transport.py +0 -0
  88. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/message_buffer.py +0 -0
  89. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/skill/SKILL.md +0 -0
  90. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/skill/__init__.py +0 -0
  91. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/skill/irc_client.py +0 -0
  92. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/socket_server.py +0 -0
  93. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/supervisor.py +0 -0
  94. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/webhook.py +0 -0
  95. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/__init__.py +0 -0
  96. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/app.py +0 -0
  97. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/client.py +0 -0
  98. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/commands.py +0 -0
  99. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/__init__.py +0 -0
  100. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/chat.py +0 -0
  101. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/info_panel.py +0 -0
  102. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/sidebar.py +0 -0
  103. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/credentials.py +0 -0
  104. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/learn_prompt.py +0 -0
  105. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/observer.py +0 -0
  106. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/__init__.py +0 -0
  107. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/collector.py +0 -0
  108. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/model.py +0 -0
  109. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/renderer_text.py +0 -0
  110. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/renderer_web.py +0 -0
  111. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/web/style.css +0 -0
  112. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/persistence.py +0 -0
  113. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/pidfile.py +0 -0
  114. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/__init__.py +0 -0
  115. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/commands.py +0 -0
  116. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/federation.md +0 -0
  117. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/history.md +0 -0
  118. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/icons.md +0 -0
  119. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/rooms.md +0 -0
  120. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/tags.md +0 -0
  121. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/threads.md +0 -0
  122. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/message.py +0 -0
  123. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/protocol-index.md +0 -0
  124. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/replies.py +0 -0
  125. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/__init__.py +0 -0
  126. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/__main__.py +0 -0
  127. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/channel.py +0 -0
  128. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/client.py +0 -0
  129. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/config.py +0 -0
  130. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/ircd.py +0 -0
  131. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/remote_client.py +0 -0
  132. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/room_store.py +0 -0
  133. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/rooms_util.py +0 -0
  134. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/server_link.py +0 -0
  135. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skill.py +0 -0
  136. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/__init__.py +0 -0
  137. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/history.py +0 -0
  138. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/icon.py +0 -0
  139. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/rooms.py +0 -0
  140. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/threads.py +0 -0
  141. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/thread_store.py +0 -0
  142. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/skills/culture/SKILL.md +0 -0
  143. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/agent-lifecycle.md +0 -0
  144. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/agentic-self-learn.md +0 -0
  145. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/agent-client.md +0 -0
  146. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/agent-harness-spec.md +0 -0
  147. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/design.md +0 -0
  148. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/harness-conformance.md +0 -0
  149. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/index.md +0 -0
  150. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer1-core-irc.md +0 -0
  151. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer2-attention.md +0 -0
  152. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer3-skills.md +0 -0
  153. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer4-federation.md +0 -0
  154. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer5-agent-harness.md +0 -0
  155. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/server-architecture.md +0 -0
  156. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/threads.md +0 -0
  157. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/acp/overview.md +0 -0
  158. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/configuration.md +0 -0
  159. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/context-management.md +0 -0
  160. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/irc-tools.md +0 -0
  161. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/overview.md +0 -0
  162. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/setup.md +0 -0
  163. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/supervisor.md +0 -0
  164. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/webhooks.md +0 -0
  165. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/configuration.md +0 -0
  166. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/context-management.md +0 -0
  167. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/irc-tools.md +0 -0
  168. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/overview.md +0 -0
  169. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/setup.md +0 -0
  170. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/supervisor.md +0 -0
  171. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/webhooks.md +0 -0
  172. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/configuration.md +0 -0
  173. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/context-management.md +0 -0
  174. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/irc-tools.md +0 -0
  175. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/overview.md +0 -0
  176. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/setup.md +0 -0
  177. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/supervisor.md +0 -0
  178. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/webhooks.md +0 -0
  179. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/culture-cli.md +0 -0
  180. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/getting-started.md +0 -0
  181. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/index.md +0 -0
  182. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/SECURITY.md +0 -0
  183. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/bots.md +0 -0
  184. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/ci.md +0 -0
  185. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/cli.md +0 -0
  186. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/docs-site.md +0 -0
  187. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/index.md +0 -0
  188. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/overview.md +0 -0
  189. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/publishing.md +0 -0
  190. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  191. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/rooms.md +0 -0
  192. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/server-rename.md +0 -0
  193. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  194. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  195. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  196. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  197. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  198. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  199. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  200. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  201. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  202. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  203. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  204. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  205. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  206. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  207. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  208. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  209. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  210. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  211. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  212. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  213. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/01-pair-programming.md +0 -0
  214. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/02-code-review-ensemble.md +0 -0
  215. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/03-cross-server-delegation.md +0 -0
  216. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/04-knowledge-propagation.md +0 -0
  217. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/05-the-observer.md +0 -0
  218. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/06-cross-server-ops.md +0 -0
  219. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/07-supervisor-intervention.md +0 -0
  220. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/08-apps-as-agents.md +0 -0
  221. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/09-research-swarm.md +0 -0
  222. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/10-agent-lifecycle.md +0 -0
  223. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases-index.md +0 -0
  224. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/what-is-culture.md +0 -0
  225. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/README.md +0 -0
  226. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/config.py +0 -0
  227. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/daemon.py +0 -0
  228. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/ipc.py +0 -0
  229. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/irc_transport.py +0 -0
  230. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/message_buffer.py +0 -0
  231. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/skill/SKILL.md +0 -0
  232. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/skill/irc_client.py +0 -0
  233. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/socket_server.py +0 -0
  234. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/webhook.py +0 -0
  235. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  236. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  237. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  238. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  239. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/sonar-project.properties +0 -0
  240. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/__init__.py +0 -0
  241. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/conftest.py +0 -0
  242. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_acp_daemon.py +0 -0
  243. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_agent_runner.py +0 -0
  244. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bot.py +0 -0
  245. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bot_config.py +0 -0
  246. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bot_manager.py +0 -0
  247. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bots_integration.py +0 -0
  248. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_channel.py +0 -0
  249. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_codex_daemon.py +0 -0
  250. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_connection.py +0 -0
  251. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_client.py +0 -0
  252. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_commands.py +0 -0
  253. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_connection.py +0 -0
  254. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_icons.py +0 -0
  255. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_integration.py +0 -0
  256. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_copilot_daemon.py +0 -0
  257. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_daemon.py +0 -0
  258. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_daemon_config.py +0 -0
  259. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_daemon_ipc.py +0 -0
  260. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_discovery.py +0 -0
  261. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_federation.py +0 -0
  262. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_history.py +0 -0
  263. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_http_listener.py +0 -0
  264. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_integration_layer5.py +0 -0
  265. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_ipc.py +0 -0
  266. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_irc_transport.py +0 -0
  267. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_link_reconnect.py +0 -0
  268. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_mentions.py +0 -0
  269. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_message.py +0 -0
  270. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_message_buffer.py +0 -0
  271. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_messaging.py +0 -0
  272. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_modes.py +0 -0
  273. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_cli.py +0 -0
  274. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_collector.py +0 -0
  275. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_model.py +0 -0
  276. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_renderer.py +0 -0
  277. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_web.py +0 -0
  278. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_persistence.py +0 -0
  279. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_pidfile.py +0 -0
  280. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_room_persistence.py +0 -0
  281. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_rooms.py +0 -0
  282. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_rooms_federation.py +0 -0
  283. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_rooms_integration.py +0 -0
  284. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_server_icon_skill.py +0 -0
  285. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_setup_update_cli.py +0 -0
  286. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_skill_client.py +0 -0
  287. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_skills.py +0 -0
  288. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_socket_server.py +0 -0
  289. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_supervisor.py +0 -0
  290. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_template_engine.py +0 -0
  291. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_thread_buffer.py +0 -0
  292. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_threads.py +0 -0
  293. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_virtual_client.py +0 -0
  294. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_wait_for_port.py +0 -0
  295. {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_webhook.py +0 -0
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
+ ## [3.1.2] - 2026-04-06
8
+
9
+
10
+ ### Fixed
11
+
12
+ - culture update used wrong package name (culture-cli) for uv tool upgrade
13
+
14
+ ## [3.1.1] - 2026-04-06
15
+
16
+
17
+ ### Fixed
18
+
19
+ - culture update and setup auto-generate mesh.yaml from agents.yaml when mesh.yaml is missing
20
+
7
21
  ## [3.1.0] - 2026-04-06
8
22
 
9
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 3.1.0
3
+ Version: 3.1.2
4
4
  Summary: Legacy alias for culture — install culture instead
5
5
  Project-URL: Homepage, https://github.com/OriNachum/culture
6
6
  Author: Ori Nachum
@@ -1899,6 +1899,22 @@ def _resolve_links_from_mesh(mesh_config_path: str) -> list:
1899
1899
  # -----------------------------------------------------------------------
1900
1900
 
1901
1901
 
1902
+ def _generate_mesh_from_agents(mesh_config_path: str):
1903
+ """Fall back to generating mesh.yaml from agents.yaml when mesh.yaml is missing."""
1904
+ from culture.mesh_config import from_daemon_config, save_mesh_config
1905
+
1906
+ if not os.path.isfile(DEFAULT_CONFIG):
1907
+ print(f"Mesh config not found: {mesh_config_path}", file=sys.stderr)
1908
+ print(f"Agent config not found either: {DEFAULT_CONFIG}", file=sys.stderr)
1909
+ return None
1910
+
1911
+ daemon_config = load_config(DEFAULT_CONFIG)
1912
+ mesh = from_daemon_config(daemon_config)
1913
+ save_mesh_config(mesh, mesh_config_path)
1914
+ print(f"No mesh.yaml found — generated from {DEFAULT_CONFIG}")
1915
+ return mesh
1916
+
1917
+
1902
1918
  def _build_server_start_cmd(mesh, culture_bin: str, mesh_config_path: str) -> list[str]:
1903
1919
  """Build the server start command with --foreground and --mesh-config.
1904
1920
 
@@ -2014,9 +2030,9 @@ def _cmd_setup(args: argparse.Namespace) -> None:
2014
2030
  try:
2015
2031
  mesh = load_mesh_config(args.config)
2016
2032
  except FileNotFoundError:
2017
- print(f"Mesh config not found: {args.config}", file=sys.stderr)
2018
- print("Create it manually or ask your AI agent to generate it.", file=sys.stderr)
2019
- sys.exit(1)
2033
+ mesh = _generate_mesh_from_agents(args.config)
2034
+ if mesh is None:
2035
+ sys.exit(1)
2020
2036
 
2021
2037
  server_name = mesh.server.name
2022
2038
 
@@ -2084,7 +2100,7 @@ def _server_stop_by_name(name: str) -> None:
2084
2100
 
2085
2101
 
2086
2102
  def _upgrade_culture_package(args: argparse.Namespace) -> bool:
2087
- """Upgrade the culture-cli package via uv or pip, then re-exec with --skip-upgrade.
2103
+ """Upgrade the culture package via uv or pip, then re-exec with --skip-upgrade.
2088
2104
 
2089
2105
  Returns True if the caller should proceed with the restart phase
2090
2106
  (``--skip-upgrade`` was set). Returns False for dry-run (caller should stop).
@@ -2094,7 +2110,7 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
2094
2110
  return True
2095
2111
 
2096
2112
  if args.dry_run:
2097
- print("[dry-run] Would run: uv tool upgrade culture-cli")
2113
+ print("[dry-run] Would run: uv tool upgrade culture")
2098
2114
  print("[dry-run] Would re-exec with --skip-upgrade")
2099
2115
  return False
2100
2116
 
@@ -2103,7 +2119,7 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
2103
2119
  if uv:
2104
2120
  print("Upgrading via uv...")
2105
2121
  result = subprocess.run(
2106
- [uv, "tool", "upgrade", "culture-cli"],
2122
+ [uv, "tool", "upgrade", "culture"],
2107
2123
  capture_output=True,
2108
2124
  text=True,
2109
2125
  )
@@ -2116,7 +2132,7 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
2116
2132
  if pip:
2117
2133
  print("Upgrading via pip...")
2118
2134
  result = subprocess.run(
2119
- [pip, "install", "--upgrade", "culture-cli"],
2135
+ [pip, "install", "--upgrade", "culture"],
2120
2136
  capture_output=True,
2121
2137
  text=True,
2122
2138
  )
@@ -2239,8 +2255,9 @@ def _cmd_update(args: argparse.Namespace) -> None:
2239
2255
  try:
2240
2256
  mesh = load_mesh_config(args.config)
2241
2257
  except FileNotFoundError:
2242
- print(f"Mesh config not found: {args.config}", file=sys.stderr)
2243
- sys.exit(1)
2258
+ mesh = _generate_mesh_from_agents(args.config)
2259
+ if mesh is None:
2260
+ sys.exit(1)
2244
2261
 
2245
2262
  server_name = mesh.server.name
2246
2263
 
@@ -6,9 +6,13 @@ import os
6
6
  import tempfile
7
7
  from dataclasses import asdict, dataclass, field
8
8
  from pathlib import Path
9
+ from typing import TYPE_CHECKING
9
10
 
10
11
  import yaml
11
12
 
13
+ if TYPE_CHECKING:
14
+ from culture.clients.claude.config import DaemonConfig
15
+
12
16
 
13
17
  @dataclass
14
18
  class MeshLinkConfig:
@@ -73,6 +77,37 @@ def load_mesh_config(path: str | Path = DEFAULT_MESH_PATH) -> MeshConfig:
73
77
  return MeshConfig(server=server, agents=agents)
74
78
 
75
79
 
80
+ def from_daemon_config(daemon_config: DaemonConfig) -> MeshConfig:
81
+ """Derive a MeshConfig from an existing DaemonConfig (agents.yaml).
82
+
83
+ Useful when mesh.yaml doesn't exist but the user has a running mesh
84
+ started manually via ``culture server start`` + ``culture start``.
85
+
86
+ Note: DaemonConfig.server.host is the *connection* target (often localhost),
87
+ while MeshServerConfig.host is the *listen* address. We use the default
88
+ 0.0.0.0 for the listen address to preserve external accessibility.
89
+ """
90
+ server = MeshServerConfig(
91
+ name=daemon_config.server.name,
92
+ port=daemon_config.server.port,
93
+ )
94
+ server_prefix = f"{daemon_config.server.name}-"
95
+ agents = []
96
+ for a in daemon_config.agents:
97
+ nick = a.nick
98
+ if nick.startswith(server_prefix):
99
+ nick = nick[len(server_prefix) :]
100
+ agents.append(
101
+ MeshAgentConfig(
102
+ nick=nick,
103
+ type=a.agent,
104
+ workdir=a.directory,
105
+ channels=list(a.channels),
106
+ )
107
+ )
108
+ return MeshConfig(server=server, agents=agents)
109
+
110
+
76
111
  def save_mesh_config(config: MeshConfig, path: str | Path = DEFAULT_MESH_PATH) -> None:
77
112
  """Serialize mesh config to YAML and write atomically."""
78
113
  path = Path(path)
@@ -96,7 +96,9 @@ culture setup --uninstall # remove all services and stop processes
96
96
 
97
97
  ### What setup does
98
98
 
99
- 1. Loads `mesh.yaml`. Exits with an error if the file is missing.
99
+ 1. Loads `mesh.yaml`. If the file is missing but `~/.culture/agents.yaml`
100
+ exists, auto-generates `mesh.yaml` from it (listen host defaults to
101
+ `0.0.0.0`, no federation links).
100
102
  2. For each peer link, checks the OS credential store. If no credential is
101
103
  found, prompts interactively and stores the password in the OS keyring
102
104
  (never written to files).
@@ -147,11 +149,13 @@ culture update --config /path/mesh.yaml
147
149
 
148
150
  ### What update does
149
151
 
150
- 1. Upgrades `culture` via `uv tool upgrade` (falls back to `pip install --upgrade`).
151
- 2. Re-execs itself with `--skip-upgrade` so the restart runs with the new binary.
152
- 3. Stops all agents, then stops the server.
153
- 4. Regenerates auto-start service entries (picks up any config changes).
154
- 5. Starts the server, waits for it to accept connections, then starts all agents.
152
+ 1. Loads `mesh.yaml`. If the file is missing but `~/.culture/agents.yaml`
153
+ exists, auto-generates `mesh.yaml` from it (same fallback as `setup`).
154
+ 2. Upgrades `culture` via `uv tool upgrade` (falls back to `pip install --upgrade`).
155
+ 3. Re-execs itself with `--skip-upgrade` so the restart runs with the new binary.
156
+ 4. Stops all agents, then stops the server.
157
+ 5. Regenerates auto-start service entries (picks up any config changes).
158
+ 6. Starts the server, waits for it to accept connections, then starts all agents.
155
159
 
156
160
  The `--dry-run` output shows every step without touching running services:
157
161
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentirc-cli"
3
- version = "3.1.0"
3
+ version = "3.1.2"
4
4
  description = "Legacy alias for culture — install culture instead"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -3,11 +3,13 @@
3
3
 
4
4
  import pytest
5
5
 
6
+ from culture.clients.claude.config import AgentConfig, DaemonConfig, ServerConnConfig
6
7
  from culture.mesh_config import (
7
8
  MeshAgentConfig,
8
9
  MeshConfig,
9
10
  MeshLinkConfig,
10
11
  MeshServerConfig,
12
+ from_daemon_config,
11
13
  load_mesh_config,
12
14
  save_mesh_config,
13
15
  )
@@ -96,3 +98,58 @@ def test_mesh_config_file_not_found():
96
98
  """Loading a missing file raises FileNotFoundError."""
97
99
  with pytest.raises(FileNotFoundError):
98
100
  load_mesh_config("/nonexistent/mesh.yaml")
101
+
102
+
103
+ def test_from_daemon_config_strips_prefix():
104
+ """from_daemon_config strips server prefix from agent nicks."""
105
+ daemon = DaemonConfig(
106
+ server=ServerConnConfig(name="spark", host="localhost", port=6667),
107
+ agents=[
108
+ AgentConfig(
109
+ nick="spark-claude",
110
+ agent="claude",
111
+ directory="/home/user/proj",
112
+ channels=["#general", "#dev"],
113
+ ),
114
+ AgentConfig(
115
+ nick="spark-codex",
116
+ agent="codex",
117
+ directory="/home/user/other",
118
+ channels=["#general"],
119
+ ),
120
+ ],
121
+ )
122
+ mesh = from_daemon_config(daemon)
123
+
124
+ assert mesh.server.name == "spark"
125
+ assert mesh.server.host == "0.0.0.0" # listen address, not connection target
126
+ assert mesh.server.port == 6667
127
+ assert mesh.server.links == []
128
+ assert len(mesh.agents) == 2
129
+ assert mesh.agents[0].nick == "claude"
130
+ assert mesh.agents[0].type == "claude"
131
+ assert mesh.agents[0].workdir == "/home/user/proj"
132
+ assert mesh.agents[0].channels == ["#general", "#dev"]
133
+ assert mesh.agents[1].nick == "codex"
134
+ assert mesh.agents[1].type == "codex"
135
+
136
+
137
+ def test_from_daemon_config_unprefixed_nick():
138
+ """from_daemon_config handles nicks without server prefix."""
139
+ daemon = DaemonConfig(
140
+ server=ServerConnConfig(name="spark"),
141
+ agents=[AgentConfig(nick="standalone", agent="claude", directory=".")],
142
+ )
143
+ mesh = from_daemon_config(daemon)
144
+ assert mesh.agents[0].nick == "standalone"
145
+
146
+
147
+ def test_from_daemon_config_empty_agents():
148
+ """from_daemon_config works with no agents."""
149
+ daemon = DaemonConfig(
150
+ server=ServerConnConfig(name="test", port=7000),
151
+ )
152
+ mesh = from_daemon_config(daemon)
153
+ assert mesh.server.name == "test"
154
+ assert mesh.server.port == 7000
155
+ assert mesh.agents == []
@@ -561,7 +561,7 @@ wheels = [
561
561
 
562
562
  [[package]]
563
563
  name = "culture"
564
- version = "3.1.0"
564
+ version = "3.1.2"
565
565
  source = { editable = "." }
566
566
  dependencies = [
567
567
  { name = "aiohttp" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes