agentirc-cli 5.0.3__tar.gz → 6.0.0__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 (349) hide show
  1. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/CHANGELOG.md +16 -0
  2. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/CLAUDE.md +3 -3
  3. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/PKG-INFO +12 -2
  4. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/README.md +11 -1
  5. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/__main__.py +2 -2
  6. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/channel.py +4 -4
  7. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/client.py +7 -7
  8. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/ircd.py +15 -15
  9. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/remote_client.py +2 -2
  10. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/server_link.py +3 -3
  11. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skill.py +2 -2
  12. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/history.py +3 -3
  13. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/icon.py +2 -2
  14. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/rooms.py +7 -7
  15. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/threads.py +11 -11
  16. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/bots/bot.py +1 -1
  17. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/bots/bot_manager.py +1 -1
  18. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/bots/virtual_client.py +5 -5
  19. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/channel.py +29 -24
  20. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/server.py +2 -2
  21. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/shared/mesh.py +2 -2
  22. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/daemon.py +1 -1
  23. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/daemon.py +1 -1
  24. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/daemon.py +1 -1
  25. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/daemon.py +1 -1
  26. agentirc_cli-6.0.0/docs/agent-readiness.md +102 -0
  27. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/index.md +3 -1
  28. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/layer1-core-irc.md +1 -1
  29. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/server-architecture.md +5 -3
  30. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/index.md +2 -1
  31. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +11 -11
  32. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-30-rooms-management.md +78 -78
  33. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-02-conversation-threads.md +35 -35
  34. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-02-ops-tooling.md +13 -13
  35. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-04-culture-rename.md +1 -1
  36. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-06-console-chat.md +17 -17
  37. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +1 -1
  38. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +4 -4
  39. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +2 -2
  40. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +3 -3
  41. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/01-pair-programming.md +3 -3
  42. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/pyproject.toml +1 -1
  43. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/conftest.py +2 -2
  44. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_federation.py +2 -2
  45. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_history.py +7 -7
  46. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_link_reconnect.py +2 -2
  47. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_room_persistence.py +5 -5
  48. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_rooms.py +7 -7
  49. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_skills.py +1 -1
  50. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_threads.py +2 -2
  51. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/uv.lock +1 -1
  52. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.claude/skills/pr-review/SKILL.md +0 -0
  53. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.claude/skills/run-tests/SKILL.md +0 -0
  54. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  55. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.flake8 +0 -0
  56. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.github/workflows/pages.yml +0 -0
  57. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.github/workflows/publish.yml +0 -0
  58. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.github/workflows/security-checks.yml +0 -0
  59. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.github/workflows/tests.yml +0 -0
  60. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.gitignore +0 -0
  61. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.markdownlint-cli2.yaml +0 -0
  62. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.pr_agent.toml +0 -0
  63. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.pre-commit-config.yaml +0 -0
  64. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/.pylintrc +0 -0
  65. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/CNAME +0 -0
  66. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/Gemfile +0 -0
  67. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/Gemfile.lock +0 -0
  68. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/LICENSE +0 -0
  69. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/SECURITY.md +0 -0
  70. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/_config.yml +0 -0
  71. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/_includes/head_custom.html +0 -0
  72. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/_sass/color_schemes/anthropic.scss +0 -0
  73. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/_sass/custom/custom.scss +0 -0
  74. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/assets/images/apple-touch-icon.png +0 -0
  75. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/assets/images/favicon-16x16.png +0 -0
  76. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/assets/images/favicon-32x32.png +0 -0
  77. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/assets/images/favicon.ico +0 -0
  78. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/__init__.py +0 -0
  79. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/__main__.py +0 -0
  80. {agentirc_cli-5.0.3/culture/bots → agentirc_cli-6.0.0/culture/agentirc}/__init__.py +0 -0
  81. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/config.py +0 -0
  82. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/history_store.py +0 -0
  83. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/room_store.py +0 -0
  84. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/rooms_util.py +0 -0
  85. {agentirc_cli-5.0.3/culture/cli/shared → agentirc_cli-6.0.0/culture/agentirc/skills}/__init__.py +0 -0
  86. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/agentirc}/thread_store.py +0 -0
  87. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/aio.py +0 -0
  88. {agentirc_cli-5.0.3/culture/clients → agentirc_cli-6.0.0/culture/bots}/__init__.py +0 -0
  89. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/bots/config.py +0 -0
  90. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/bots/http_listener.py +0 -0
  91. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/bots/template_engine.py +0 -0
  92. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/__init__.py +0 -0
  93. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/agent.py +0 -0
  94. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/bot.py +0 -0
  95. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/mesh.py +0 -0
  96. {agentirc_cli-5.0.3/culture/clients/acp → agentirc_cli-6.0.0/culture/cli/shared}/__init__.py +0 -0
  97. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/shared/constants.py +0 -0
  98. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/shared/display.py +0 -0
  99. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/shared/formatting.py +0 -0
  100. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/shared/ipc.py +0 -0
  101. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/shared/process.py +0 -0
  102. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/cli/skills.py +0 -0
  103. {agentirc_cli-5.0.3/culture/clients/acp/skill → agentirc_cli-6.0.0/culture/clients}/__init__.py +0 -0
  104. {agentirc_cli-5.0.3/culture/clients/claude → agentirc_cli-6.0.0/culture/clients/acp}/__init__.py +0 -0
  105. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/agent_runner.py +0 -0
  106. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/config.py +0 -0
  107. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/culture.yaml +0 -0
  108. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/ipc.py +0 -0
  109. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/irc_transport.py +0 -0
  110. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/message_buffer.py +0 -0
  111. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/skill/SKILL.md +0 -0
  112. {agentirc_cli-5.0.3/culture/clients/claude → agentirc_cli-6.0.0/culture/clients/acp}/skill/__init__.py +0 -0
  113. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/skill/irc_client.py +0 -0
  114. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/socket_server.py +0 -0
  115. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/supervisor.py +0 -0
  116. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/acp/webhook.py +0 -0
  117. {agentirc_cli-5.0.3/culture/clients/codex → agentirc_cli-6.0.0/culture/clients/claude}/__init__.py +0 -0
  118. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/__main__.py +0 -0
  119. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/agent_runner.py +0 -0
  120. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/config.py +0 -0
  121. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/culture.yaml +0 -0
  122. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/ipc.py +0 -0
  123. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/irc_transport.py +0 -0
  124. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/message_buffer.py +0 -0
  125. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/skill/SKILL.md +0 -0
  126. {agentirc_cli-5.0.3/culture/clients/codex → agentirc_cli-6.0.0/culture/clients/claude}/skill/__init__.py +0 -0
  127. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/skill/irc_client.py +0 -0
  128. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/socket_server.py +0 -0
  129. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/supervisor.py +0 -0
  130. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/claude/webhook.py +0 -0
  131. {agentirc_cli-5.0.3/culture/clients/copilot → agentirc_cli-6.0.0/culture/clients/codex}/__init__.py +0 -0
  132. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/agent_runner.py +0 -0
  133. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/config.py +0 -0
  134. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/culture.yaml +0 -0
  135. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/ipc.py +0 -0
  136. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/irc_transport.py +0 -0
  137. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/message_buffer.py +0 -0
  138. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/skill/SKILL.md +0 -0
  139. {agentirc_cli-5.0.3/culture/clients/copilot → agentirc_cli-6.0.0/culture/clients/codex}/skill/__init__.py +0 -0
  140. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/skill/irc_client.py +0 -0
  141. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/socket_server.py +0 -0
  142. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/supervisor.py +0 -0
  143. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/codex/webhook.py +0 -0
  144. {agentirc_cli-5.0.3/culture/protocol → agentirc_cli-6.0.0/culture/clients/copilot}/__init__.py +0 -0
  145. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/agent_runner.py +0 -0
  146. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/config.py +0 -0
  147. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/culture.yaml +0 -0
  148. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/ipc.py +0 -0
  149. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/irc_transport.py +0 -0
  150. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/message_buffer.py +0 -0
  151. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/skill/SKILL.md +0 -0
  152. {agentirc_cli-5.0.3/culture/server → agentirc_cli-6.0.0/culture/clients/copilot/skill}/__init__.py +0 -0
  153. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/skill/irc_client.py +0 -0
  154. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/socket_server.py +0 -0
  155. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/supervisor.py +0 -0
  156. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/clients/copilot/webhook.py +0 -0
  157. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/config.py +0 -0
  158. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/__init__.py +0 -0
  159. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/app.py +0 -0
  160. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/client.py +0 -0
  161. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/commands.py +0 -0
  162. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/widgets/__init__.py +0 -0
  163. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/widgets/chat.py +0 -0
  164. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/widgets/info_panel.py +0 -0
  165. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/console/widgets/sidebar.py +0 -0
  166. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/credentials.py +0 -0
  167. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/formatting.py +0 -0
  168. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/learn_prompt.py +0 -0
  169. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/mesh_config.py +0 -0
  170. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/observer.py +0 -0
  171. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/overview/__init__.py +0 -0
  172. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/overview/collector.py +0 -0
  173. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/overview/model.py +0 -0
  174. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/overview/renderer_text.py +0 -0
  175. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/overview/renderer_web.py +0 -0
  176. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/overview/web/style.css +0 -0
  177. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/persistence.py +0 -0
  178. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/pidfile.py +0 -0
  179. {agentirc_cli-5.0.3/culture/server/skills → agentirc_cli-6.0.0/culture/protocol}/__init__.py +0 -0
  180. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/commands.py +0 -0
  181. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/extensions/federation.md +0 -0
  182. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/extensions/history.md +0 -0
  183. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/extensions/icons.md +0 -0
  184. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/extensions/rooms.md +0 -0
  185. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/extensions/tags.md +0 -0
  186. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/extensions/threads.md +0 -0
  187. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/message.py +0 -0
  188. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/protocol-index.md +0 -0
  189. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/protocol/replies.py +0 -0
  190. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/culture/skills/culture/SKILL.md +0 -0
  191. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/agent-lifecycle.md +0 -0
  192. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/agentic-self-learn.md +0 -0
  193. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/agents/decentralized-config.md +0 -0
  194. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/agent-client.md +0 -0
  195. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/agent-harness-spec.md +0 -0
  196. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/design.md +0 -0
  197. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/harness-conformance.md +0 -0
  198. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/layer2-attention.md +0 -0
  199. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/layer3-skills.md +0 -0
  200. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/layer4-federation.md +0 -0
  201. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/layer5-agent-harness.md +0 -0
  202. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/architecture/threads.md +0 -0
  203. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/channel-polling.md +0 -0
  204. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/acp/overview.md +0 -0
  205. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/acp/system-prompt.md +0 -0
  206. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/configuration.md +0 -0
  207. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/context-management.md +0 -0
  208. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/irc-tools.md +0 -0
  209. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/overview.md +0 -0
  210. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/setup.md +0 -0
  211. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/supervisor.md +0 -0
  212. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/claude/webhooks.md +0 -0
  213. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/configuration.md +0 -0
  214. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/context-management.md +0 -0
  215. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/irc-tools.md +0 -0
  216. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/overview.md +0 -0
  217. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/setup.md +0 -0
  218. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/supervisor.md +0 -0
  219. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/codex/webhooks.md +0 -0
  220. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/configuration.md +0 -0
  221. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/context-management.md +0 -0
  222. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/irc-tools.md +0 -0
  223. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/overview.md +0 -0
  224. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/setup.md +0 -0
  225. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/supervisor.md +0 -0
  226. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/clients/copilot/webhooks.md +0 -0
  227. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/culture-cli.md +0 -0
  228. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/getting-started.md +0 -0
  229. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/SECURITY.md +0 -0
  230. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/bots.md +0 -0
  231. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/ci.md +0 -0
  232. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/cli.md +0 -0
  233. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/docs-site.md +0 -0
  234. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/index.md +0 -0
  235. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/ops-tooling.md +0 -0
  236. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/overview.md +0 -0
  237. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/operations/publishing.md +0 -0
  238. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/persistent-history.md +0 -0
  239. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/reflective-development.md +0 -0
  240. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  241. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/rooms.md +0 -0
  242. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/server-rename.md +0 -0
  243. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  244. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  245. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  246. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
  247. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  248. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  249. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  250. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  251. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  252. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  253. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  254. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  255. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
  256. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
  257. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
  258. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
  259. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/02-code-review-ensemble.md +0 -0
  260. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/03-cross-server-delegation.md +0 -0
  261. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/04-knowledge-propagation.md +0 -0
  262. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/05-the-observer.md +0 -0
  263. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/06-cross-server-ops.md +0 -0
  264. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/07-supervisor-intervention.md +0 -0
  265. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/08-apps-as-agents.md +0 -0
  266. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/09-research-swarm.md +0 -0
  267. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases/10-agent-lifecycle.md +0 -0
  268. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/use-cases-index.md +0 -0
  269. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/docs/what-is-culture.md +0 -0
  270. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/favicon.ico +0 -0
  271. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/README.md +0 -0
  272. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/config.py +0 -0
  273. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/culture.yaml +0 -0
  274. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/daemon.py +0 -0
  275. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/ipc.py +0 -0
  276. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/irc_transport.py +0 -0
  277. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/message_buffer.py +0 -0
  278. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/skill/SKILL.md +0 -0
  279. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/skill/irc_client.py +0 -0
  280. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/socket_server.py +0 -0
  281. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/packages/agent-harness/webhook.py +0 -0
  282. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  283. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  284. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  285. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  286. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/sonar-project.properties +0 -0
  287. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/__init__.py +0 -0
  288. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_acp_daemon.py +0 -0
  289. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_agent_runner.py +0 -0
  290. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_archive.py +0 -0
  291. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_bot.py +0 -0
  292. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_bot_config.py +0 -0
  293. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_bot_manager.py +0 -0
  294. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_bots_integration.py +0 -0
  295. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_channel.py +0 -0
  296. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_channel_cli.py +0 -0
  297. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_codex_daemon.py +0 -0
  298. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_connection.py +0 -0
  299. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_console_client.py +0 -0
  300. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_console_commands.py +0 -0
  301. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_console_connection.py +0 -0
  302. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_console_icons.py +0 -0
  303. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_console_integration.py +0 -0
  304. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_copilot_daemon.py +0 -0
  305. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_credentials.py +0 -0
  306. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_culture_config.py +0 -0
  307. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_daemon.py +0 -0
  308. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_daemon_config.py +0 -0
  309. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_daemon_ipc.py +0 -0
  310. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_discovery.py +0 -0
  311. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_display.py +0 -0
  312. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_http_listener.py +0 -0
  313. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_integration_layer5.py +0 -0
  314. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_ipc.py +0 -0
  315. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_irc_transport.py +0 -0
  316. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_learn_prompt.py +0 -0
  317. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_mention_alias.py +0 -0
  318. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_mention_target_cleanup.py +0 -0
  319. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_mention_warning.py +0 -0
  320. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_mentions.py +0 -0
  321. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_mesh_config.py +0 -0
  322. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_mesh_readiness.py +0 -0
  323. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_message.py +0 -0
  324. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_message_buffer.py +0 -0
  325. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_messaging.py +0 -0
  326. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_migrate_cli.py +0 -0
  327. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_modes.py +0 -0
  328. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_overview_cli.py +0 -0
  329. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_overview_collector.py +0 -0
  330. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_overview_model.py +0 -0
  331. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_overview_renderer.py +0 -0
  332. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_overview_web.py +0 -0
  333. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_persistence.py +0 -0
  334. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_pidfile.py +0 -0
  335. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_poll_loop.py +0 -0
  336. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_register_cli.py +0 -0
  337. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_rooms_federation.py +0 -0
  338. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_rooms_integration.py +0 -0
  339. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_server_icon_skill.py +0 -0
  340. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_setup_update_cli.py +0 -0
  341. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_skill_client.py +0 -0
  342. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_skill_docs.py +0 -0
  343. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_socket_server.py +0 -0
  344. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_supervisor.py +0 -0
  345. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_template_engine.py +0 -0
  346. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_thread_buffer.py +0 -0
  347. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_virtual_client.py +0 -0
  348. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_wait_for_port.py +0 -0
  349. {agentirc_cli-5.0.3 → agentirc_cli-6.0.0}/tests/test_webhook.py +0 -0
@@ -4,6 +4,22 @@ 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
+ ## [6.0.0] - 2026-04-10
8
+
9
+
10
+ ### Changed
11
+
12
+ - **BREAKING:** Renamed internal Python package `culture.server` to `culture.agentirc`. All imports must update from `culture.server.*` to `culture.agentirc.*`. CLI command `culture server` and config path `~/.culture/server.yaml` are unchanged.
13
+ - **AgentIRC** is now the official name for the server engine in documentation.
14
+
15
+ ## [5.0.4] - 2026-04-10
16
+
17
+
18
+ ### Fixed
19
+
20
+ - Reduce cognitive complexity of _cmd_topic in channel CLI
21
+ - Fix f-string with no replacement fields in topic error message
22
+
7
23
  ## [5.0.3] - 2026-04-10
8
24
 
9
25
 
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
4
4
 
5
5
  ## Project Overview
6
6
 
7
- **culture** — A mesh of IRC servers where AI agents collaborate, share knowledge, and coordinate work. Humans participate as first-class citizens. Custom async Python IRCd built from scratch, with Claude Agent SDK client harnesses.
7
+ **culture** — A mesh of IRC servers where AI agents collaborate, share knowledge, and coordinate work. Humans participate as first-class citizens. The server engine, **AgentIRC** (`culture/agentirc/`), is a custom async Python IRCd built from scratch. Claude Agent SDK client harnesses connect agents to the mesh.
8
8
 
9
9
  Design spec: `docs/superpowers/specs/2026-03-19-agentirc-design.md`
10
10
 
@@ -59,8 +59,8 @@ When implementing features, write a corresponding markdown doc in `docs/` descri
59
59
 
60
60
  ## Testing
61
61
 
62
- - Use `/run-tests` to run the test suite (parallel + verbose by default)
63
- - `pytest` + `pytest-asyncio`, always run with `-n auto` for parallel execution
62
+ - **Always use `/run-tests`** — this is the standard way to run tests. By default it runs in parallel with verbose output. Use `/run-tests --ci` (or `-c`) for coverage. Do not run `pytest` directly; use the skill.
63
+ - Stack: `pytest` + `pytest-asyncio` + `pytest-xdist` — default `/run-tests` uses `-n auto` for parallel execution
64
64
  - No mocks for the server — tests spin up real server instances on random ports with real TCP connections
65
65
  - Validate each layer with real IRC clients (weechat/irssi)
66
66
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 5.0.3
3
+ Version: 6.0.0
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
@@ -30,7 +30,7 @@ Description-Content-Type: text/markdown
30
30
  **Create the culture you envision.**
31
31
 
32
32
  Human city, beehive, alien hive mind — or something entirely new.<br>
33
- A space where humans and AI agents join, collaborate, and grow together.
33
+ An AgentIRC space where humans and AI agents join, collaborate, and grow together.
34
34
 
35
35
  Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
36
36
 
@@ -222,6 +222,16 @@ Full docs at **[culture.dev](https://culture.dev)** — or browse below.
222
222
 
223
223
  </details>
224
224
 
225
+ <details open>
226
+ <summary><b>Project Quality</b></summary>
227
+
228
+ | Doc | Description |
229
+ |-----|-------------|
230
+ | [Agent Readiness](docs/agent-readiness.md) | How the project stays ready for agents — skills, pipelines, testing, [Introspective Development](docs/reflective-development.md) |
231
+ | [CI / Testing](docs/operations/ci.md) | GitHub Actions test workflow |
232
+
233
+ </details>
234
+
225
235
  ---
226
236
 
227
237
  ## License
@@ -6,7 +6,7 @@
6
6
  **Create the culture you envision.**
7
7
 
8
8
  Human city, beehive, alien hive mind — or something entirely new.<br>
9
- A space where humans and AI agents join, collaborate, and grow together.
9
+ An AgentIRC space where humans and AI agents join, collaborate, and grow together.
10
10
 
11
11
  Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
12
12
 
@@ -198,6 +198,16 @@ Full docs at **[culture.dev](https://culture.dev)** — or browse below.
198
198
 
199
199
  </details>
200
200
 
201
+ <details open>
202
+ <summary><b>Project Quality</b></summary>
203
+
204
+ | Doc | Description |
205
+ |-----|-------------|
206
+ | [Agent Readiness](docs/agent-readiness.md) | How the project stays ready for agents — skills, pipelines, testing, [Introspective Development](docs/reflective-development.md) |
207
+ | [CI / Testing](docs/operations/ci.md) | GitHub Actions test workflow |
208
+
209
+ </details>
210
+
201
211
  ---
202
212
 
203
213
  ## License
@@ -1,8 +1,8 @@
1
1
  import argparse
2
2
  import asyncio
3
3
 
4
- from culture.server.config import LinkConfig, ServerConfig
5
- from culture.server.ircd import IRCd
4
+ from culture.agentirc.config import LinkConfig, ServerConfig
5
+ from culture.agentirc.ircd import IRCd
6
6
 
7
7
 
8
8
  def parse_link(value: str) -> LinkConfig:
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING, Union
4
4
 
5
5
  if TYPE_CHECKING:
6
- from culture.server.client import Client
7
- from culture.server.remote_client import RemoteClient
6
+ from culture.agentirc.client import Client
7
+ from culture.agentirc.remote_client import RemoteClient
8
8
 
9
9
  Member = Union[Client, RemoteClient]
10
10
 
@@ -41,15 +41,15 @@ class Channel:
41
41
 
42
42
  def _local_members(self) -> set[Client]:
43
43
  """Return only local (non-remote, non-virtual) members."""
44
+ from culture.agentirc.remote_client import RemoteClient
44
45
  from culture.bots.virtual_client import VirtualClient
45
- from culture.server.remote_client import RemoteClient
46
46
 
47
47
  return {m for m in self.members if not isinstance(m, (RemoteClient, VirtualClient))}
48
48
 
49
49
  def add(self, client: Client) -> None:
50
50
  # Only grant op to the first LOCAL joiner
51
51
  if not self._local_members():
52
- from culture.server.remote_client import RemoteClient
52
+ from culture.agentirc.remote_client import RemoteClient
53
53
 
54
54
  if not isinstance(client, RemoteClient):
55
55
  self.operators.add(client)
@@ -6,14 +6,14 @@ import logging
6
6
  import re
7
7
  from typing import TYPE_CHECKING
8
8
 
9
+ from culture.agentirc.channel import Channel
10
+ from culture.agentirc.skill import Event, EventType
9
11
  from culture.aio import maybe_await
10
12
  from culture.protocol import replies
11
13
  from culture.protocol.message import Message
12
- from culture.server.channel import Channel
13
- from culture.server.skill import Event, EventType
14
14
 
15
15
  if TYPE_CHECKING:
16
- from culture.server.ircd import IRCd
16
+ from culture.agentirc.ircd import IRCd
17
17
 
18
18
 
19
19
  class Client:
@@ -492,7 +492,7 @@ class Client:
492
492
  )
493
493
 
494
494
  async def _send_to_client(self, target, relay, text, is_notice):
495
- from culture.server.remote_client import RemoteClient
495
+ from culture.agentirc.remote_client import RemoteClient
496
496
 
497
497
  recipient = self.server.get_client(target)
498
498
  if not recipient:
@@ -550,7 +550,7 @@ class Client:
550
550
  await self._notify_mentions(None, text)
551
551
 
552
552
  async def _notify_mentions(self, channel_name: str | None, text: str) -> None:
553
- from culture.server.remote_client import RemoteClient
553
+ from culture.agentirc.remote_client import RemoteClient
554
554
 
555
555
  mentioned_nicks = re.findall(r"@(\S+)", text)
556
556
  if not mentioned_nicks:
@@ -618,7 +618,7 @@ class Client:
618
618
  return flags
619
619
 
620
620
  async def _send_who_reply(self, member, channel_name: str, channel=None) -> None:
621
- from culture.server.remote_client import RemoteClient # noqa: F811
621
+ from culture.agentirc.remote_client import RemoteClient # noqa: F811
622
622
 
623
623
  flags = self._build_who_flags(member, channel)
624
624
  server_name = (
@@ -660,7 +660,7 @@ class Client:
660
660
  await self.send_numeric(replies.RPL_ENDOFWHO, target, replies.MSG_ENDOFWHO)
661
661
 
662
662
  async def _handle_whois(self, msg: Message) -> None:
663
- from culture.server.remote_client import RemoteClient
663
+ from culture.agentirc.remote_client import RemoteClient
664
664
 
665
665
  if not msg.params:
666
666
  await self.send_numeric(replies.ERR_NONICKNAMEGIVEN, "No nickname given")
@@ -6,17 +6,17 @@ import logging
6
6
  from collections import deque
7
7
  from typing import TYPE_CHECKING
8
8
 
9
- from culture.server.channel import Channel
10
- from culture.server.config import ServerConfig
11
- from culture.server.skill import Event, Skill
9
+ from culture.agentirc.channel import Channel
10
+ from culture.agentirc.config import ServerConfig
11
+ from culture.agentirc.skill import Event, Skill
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
15
  if TYPE_CHECKING:
16
+ from culture.agentirc.client import Client
17
+ from culture.agentirc.remote_client import RemoteClient
18
+ from culture.agentirc.server_link import ServerLink
16
19
  from culture.bots.virtual_client import VirtualClient
17
- from culture.server.client import Client
18
- from culture.server.remote_client import RemoteClient
19
- from culture.server.server_link import ServerLink
20
20
 
21
21
 
22
22
  class IRCd:
@@ -91,10 +91,10 @@ class IRCd:
91
91
  logger.info("Server ready")
92
92
 
93
93
  async def _register_default_skills(self) -> None:
94
- from culture.server.skills.history import HistorySkill
95
- from culture.server.skills.icon import IconSkill
96
- from culture.server.skills.rooms import RoomsSkill
97
- from culture.server.skills.threads import ThreadsSkill
94
+ from culture.agentirc.skills.history import HistorySkill
95
+ from culture.agentirc.skills.icon import IconSkill
96
+ from culture.agentirc.skills.rooms import RoomsSkill
97
+ from culture.agentirc.skills.threads import ThreadsSkill
98
98
 
99
99
  await self.register_skill(HistorySkill())
100
100
  await self.register_skill(IconSkill())
@@ -173,7 +173,7 @@ class IRCd:
173
173
  self, host: str, port: int, password: str, trust: str = "full"
174
174
  ) -> ServerLink:
175
175
  """Initiate an outbound S2S connection."""
176
- from culture.server.server_link import ServerLink
176
+ from culture.agentirc.server_link import ServerLink
177
177
 
178
178
  reader, writer = await asyncio.open_connection(host, port)
179
179
  link = ServerLink(reader, writer, self, password, initiator=True, trust=trust)
@@ -288,7 +288,7 @@ class IRCd:
288
288
  msg,
289
289
  ) -> None:
290
290
  """Handle an inbound S2S (server-to-server) connection."""
291
- from culture.server.server_link import ServerLink
291
+ from culture.agentirc.server_link import ServerLink
292
292
 
293
293
  # S2S connection - password validated after SERVER reveals peer name
294
294
  if not self.config.links:
@@ -315,7 +315,7 @@ class IRCd:
315
315
  msg,
316
316
  ) -> None:
317
317
  """Handle an inbound C2S (client-to-server) connection."""
318
- from culture.server.client import Client
318
+ from culture.agentirc.client import Client
319
319
 
320
320
  # C2S connection
321
321
  client = Client(reader, writer, self)
@@ -341,7 +341,7 @@ class IRCd:
341
341
 
342
342
  def _notify_local_quit(self, rc, quit_msg, notified: set) -> None:
343
343
  """Notify local members of a remote client quit and clean up channels."""
344
- from culture.server.remote_client import RemoteClient
344
+ from culture.agentirc.remote_client import RemoteClient
345
345
 
346
346
  for channel in list(rc.channels):
347
347
  for member in list(channel.members):
@@ -385,7 +385,7 @@ class IRCd:
385
385
  """Reload persistent rooms from disk on startup."""
386
386
  if not self.config.data_dir:
387
387
  return
388
- from culture.server.room_store import RoomStore
388
+ from culture.agentirc.room_store import RoomStore
389
389
 
390
390
  store = RoomStore(self.config.data_dir)
391
391
  for data in store.load_all():
@@ -6,8 +6,8 @@ from typing import TYPE_CHECKING
6
6
  from culture.protocol.message import Message
7
7
 
8
8
  if TYPE_CHECKING:
9
- from culture.server.channel import Channel
10
- from culture.server.server_link import ServerLink
9
+ from culture.agentirc.channel import Channel
10
+ from culture.agentirc.server_link import ServerLink
11
11
 
12
12
 
13
13
  class RemoteClient:
@@ -5,13 +5,13 @@ import asyncio
5
5
  import logging
6
6
  from typing import TYPE_CHECKING
7
7
 
8
+ from culture.agentirc.remote_client import RemoteClient
9
+ from culture.agentirc.skill import Event, EventType
8
10
  from culture.aio import maybe_await
9
11
  from culture.protocol.message import Message
10
- from culture.server.remote_client import RemoteClient
11
- from culture.server.skill import Event, EventType
12
12
 
13
13
  if TYPE_CHECKING:
14
- from culture.server.ircd import IRCd
14
+ from culture.agentirc.ircd import IRCd
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
@@ -6,9 +6,9 @@ from enum import Enum
6
6
  from typing import TYPE_CHECKING, Any
7
7
 
8
8
  if TYPE_CHECKING:
9
+ from culture.agentirc.client import Client
10
+ from culture.agentirc.ircd import IRCd
9
11
  from culture.protocol.message import Message
10
- from culture.server.client import Client
11
- from culture.server.ircd import IRCd
12
12
 
13
13
 
14
14
  class EventType(Enum):
@@ -6,12 +6,12 @@ from collections import deque
6
6
  from dataclasses import dataclass
7
7
  from typing import TYPE_CHECKING
8
8
 
9
+ from culture.agentirc.skill import Event, EventType, Skill
9
10
  from culture.protocol import replies
10
11
  from culture.protocol.message import Message
11
- from culture.server.skill import Event, EventType, Skill
12
12
 
13
13
  if TYPE_CHECKING:
14
- from culture.server.client import Client
14
+ from culture.agentirc.client import Client
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
@@ -46,7 +46,7 @@ class HistorySkill(Skill):
46
46
  """Reload persisted history from SQLite on startup."""
47
47
  if not self.server.config.data_dir:
48
48
  return
49
- from culture.server.history_store import HistoryStore
49
+ from culture.agentirc.history_store import HistoryStore
50
50
 
51
51
  try:
52
52
  store = HistoryStore(self.server.config.data_dir)
@@ -4,11 +4,11 @@ from __future__ import annotations
4
4
 
5
5
  from typing import TYPE_CHECKING
6
6
 
7
+ from culture.agentirc.skill import Skill
7
8
  from culture.protocol.message import Message
8
- from culture.server.skill import Skill
9
9
 
10
10
  if TYPE_CHECKING:
11
- from culture.server.client import Client
11
+ from culture.agentirc.client import Client
12
12
 
13
13
 
14
14
  class IconSkill(Skill):
@@ -6,14 +6,14 @@ import asyncio
6
6
  import time
7
7
  from typing import TYPE_CHECKING, Callable
8
8
 
9
+ from culture.agentirc.rooms_util import generate_room_id, parse_room_meta
10
+ from culture.agentirc.skill import Event, EventType, Skill
9
11
  from culture.aio import maybe_await
10
12
  from culture.protocol import replies
11
13
  from culture.protocol.message import Message
12
- from culture.server.rooms_util import generate_room_id, parse_room_meta
13
- from culture.server.skill import Event, EventType, Skill
14
14
 
15
15
  if TYPE_CHECKING:
16
- from culture.server.client import Client
16
+ from culture.agentirc.client import Client
17
17
 
18
18
 
19
19
  class RoomsSkill(Skill):
@@ -333,7 +333,7 @@ class RoomsSkill(Skill):
333
333
 
334
334
  async def _handle_tags_added(self, channel, added_tags: set) -> None:
335
335
  """Invite local agents whose tags match newly added room tags."""
336
- from culture.server.remote_client import RemoteClient
336
+ from culture.agentirc.remote_client import RemoteClient
337
337
 
338
338
  for client in list(self.server.clients.values()):
339
339
  if isinstance(client, RemoteClient):
@@ -344,7 +344,7 @@ class RoomsSkill(Skill):
344
344
 
345
345
  async def _handle_tags_removed(self, channel, removed_tags: set) -> None:
346
346
  """Notify local members whose tags match removed room tags."""
347
- from culture.server.remote_client import RemoteClient
347
+ from culture.agentirc.remote_client import RemoteClient
348
348
 
349
349
  for member in list(channel.members):
350
350
  if isinstance(member, RemoteClient):
@@ -502,7 +502,7 @@ class RoomsSkill(Skill):
502
502
  )
503
503
 
504
504
  async def _handle_roominvite(self, client: Client, msg: Message) -> None:
505
- from culture.server.remote_client import RemoteClient
505
+ from culture.agentirc.remote_client import RemoteClient
506
506
 
507
507
  if len(msg.params) < 2:
508
508
  await client.send_numeric(
@@ -756,7 +756,7 @@ class RoomsSkill(Skill):
756
756
  """Save room to disk if data_dir is configured."""
757
757
  if not self.server.config.data_dir:
758
758
  return
759
- from culture.server.room_store import RoomStore
759
+ from culture.agentirc.room_store import RoomStore
760
760
 
761
761
  store = RoomStore(self.server.config.data_dir)
762
762
  store.save(channel)
@@ -7,13 +7,13 @@ import time
7
7
  from dataclasses import dataclass, field
8
8
  from typing import TYPE_CHECKING
9
9
 
10
+ from culture.agentirc.skill import Event, EventType, Skill
10
11
  from culture.protocol import replies
11
12
  from culture.protocol.message import Message
12
- from culture.server.skill import Event, EventType, Skill
13
13
 
14
14
  if TYPE_CHECKING:
15
- from culture.server.channel import Channel
16
- from culture.server.client import Client
15
+ from culture.agentirc.channel import Channel
16
+ from culture.agentirc.client import Client
17
17
 
18
18
  # Thread name: alphanumeric + hyphens, 1-32 chars, must start/end with alnum
19
19
  _THREAD_NAME_RE = re.compile(r"^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,30}[a-zA-Z0-9])?$")
@@ -59,7 +59,7 @@ class ThreadsSkill(Skill):
59
59
  """Reload persisted threads from disk on startup."""
60
60
  if not self.server.config.data_dir:
61
61
  return
62
- from culture.server.thread_store import ThreadStore
62
+ from culture.agentirc.thread_store import ThreadStore
63
63
 
64
64
  store = ThreadStore(self.server.config.data_dir)
65
65
  for data in store.load_all():
@@ -86,7 +86,7 @@ class ThreadsSkill(Skill):
86
86
  """Save a thread to disk if data_dir is configured."""
87
87
  if not self.server.config.data_dir:
88
88
  return
89
- from culture.server.thread_store import ThreadStore
89
+ from culture.agentirc.thread_store import ThreadStore
90
90
 
91
91
  store = ThreadStore(self.server.config.data_dir)
92
92
  store.save(
@@ -306,7 +306,7 @@ class ThreadsSkill(Skill):
306
306
 
307
307
  Returns the prefixed text for use in event data.
308
308
  """
309
- from culture.server.remote_client import RemoteClient
309
+ from culture.agentirc.remote_client import RemoteClient
310
310
 
311
311
  prefixed = self._format_thread_msg(thread_name, text)
312
312
  relay = Message(
@@ -330,7 +330,7 @@ class ThreadsSkill(Skill):
330
330
  text: str,
331
331
  ) -> None:
332
332
  """Find @mentions in text and send a NOTICE to each mentioned user in the channel."""
333
- from culture.server.remote_client import RemoteClient
333
+ from culture.agentirc.remote_client import RemoteClient
334
334
 
335
335
  mentioned_nicks = re.findall(r"@(\S+)", text)
336
336
  if not mentioned_nicks:
@@ -411,7 +411,7 @@ class ThreadsSkill(Skill):
411
411
  summary: str | None,
412
412
  ) -> None:
413
413
  """Archive a thread, notify channel members, persist, and emit event."""
414
- from culture.server.remote_client import RemoteClient
414
+ from culture.agentirc.remote_client import RemoteClient
415
415
 
416
416
  thread.archived = True
417
417
  thread.summary = summary
@@ -552,7 +552,7 @@ class ThreadsSkill(Skill):
552
552
  breakout_name: str,
553
553
  ) -> None:
554
554
  """Archive the promoted thread, notify channel, persist, and emit event."""
555
- from culture.server.remote_client import RemoteClient
555
+ from culture.agentirc.remote_client import RemoteClient
556
556
 
557
557
  thread.archived = True
558
558
  thread.summary = f"Promoted to {breakout_name}"
@@ -659,7 +659,7 @@ class ThreadsSkill(Skill):
659
659
 
660
660
  async def _populate_breakout(self, thread: Thread, breakout, breakout_name: str) -> None:
661
661
  """Gather local participants from the thread, auto-join them, and send JOIN messages."""
662
- from culture.server.remote_client import RemoteClient
662
+ from culture.agentirc.remote_client import RemoteClient
663
663
 
664
664
  participant_nicks = thread.participants
665
665
  participants = []
@@ -683,7 +683,7 @@ class ThreadsSkill(Skill):
683
683
 
684
684
  async def _replay_thread_history(self, thread: Thread, breakout_name: str) -> None:
685
685
  """Replay all thread messages as NOTICE to breakout channel members."""
686
- from culture.server.remote_client import RemoteClient
686
+ from culture.agentirc.remote_client import RemoteClient
687
687
 
688
688
  breakout = self.server.channels.get(breakout_name)
689
689
  if breakout is None:
@@ -12,7 +12,7 @@ from culture.bots.template_engine import render_fallback, render_template
12
12
  from culture.bots.virtual_client import VirtualClient
13
13
 
14
14
  if TYPE_CHECKING:
15
- from culture.server.ircd import IRCd
15
+ from culture.agentirc.ircd import IRCd
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
18
 
@@ -15,7 +15,7 @@ from culture.bots.config import (
15
15
  )
16
16
 
17
17
  if TYPE_CHECKING:
18
- from culture.server.ircd import IRCd
18
+ from culture.agentirc.ircd import IRCd
19
19
 
20
20
  logger = logging.getLogger(__name__)
21
21
 
@@ -5,12 +5,12 @@ from __future__ import annotations
5
5
  import logging
6
6
  from typing import TYPE_CHECKING
7
7
 
8
+ from culture.agentirc.skill import Event, EventType
8
9
  from culture.protocol.message import Message
9
- from culture.server.skill import Event, EventType
10
10
 
11
11
  if TYPE_CHECKING:
12
- from culture.server.channel import Channel
13
- from culture.server.ircd import IRCd
12
+ from culture.agentirc.channel import Channel
13
+ from culture.agentirc.ircd import IRCd
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
@@ -132,7 +132,7 @@ class VirtualClient:
132
132
  async def send_dm(self, target_nick: str, text: str) -> None:
133
133
  """Send a direct PRIVMSG to a specific user."""
134
134
  text = _sanitize_irc_text(text)
135
- from culture.server.remote_client import RemoteClient
135
+ from culture.agentirc.remote_client import RemoteClient
136
136
 
137
137
  recipient = self.server.get_client(target_nick)
138
138
  if not recipient:
@@ -159,7 +159,7 @@ class VirtualClient:
159
159
  """Send NOTICE to any @mentioned users in the text."""
160
160
  import re
161
161
 
162
- from culture.server.remote_client import RemoteClient
162
+ from culture.agentirc.remote_client import RemoteClient
163
163
 
164
164
  mentioned_nicks = re.findall(r"@(\S+)", text)
165
165
  if not mentioned_nicks:
@@ -291,31 +291,36 @@ def _cmd_topic(args: argparse.Namespace) -> None:
291
291
  target = args.target if args.target.startswith("#") else f"#{args.target}"
292
292
 
293
293
  if args.text is not None:
294
- # Setting topic requires the daemon (must act as agent nick)
295
- resp = _require_ipc("irc_topic", channel=target, topic=args.text)
296
- if resp.get("ok"):
297
- print(f"Topic set for {target}")
298
- else:
299
- print(f"Error: {resp.get('error', 'unknown error')}", file=sys.stderr)
300
- sys.exit(1)
294
+ _topic_set(target, args.text)
301
295
  else:
302
- # Reading topic — the daemon IPC handler returns results
303
- # asynchronously via IRC numerics, so use IPC to fire the query
304
- # and report that it was sent.
305
- resp = _try_ipc("irc_topic", channel=target)
306
- if resp and resp.get("ok"):
307
- data = resp.get("data") or {}
308
- if "topic" in data:
309
- topic = data["topic"]
310
- print(f"Topic for {target}: {topic}" if topic else f"No topic set for {target}")
311
- else:
312
- print(f"Topic query sent for {target} (result arrives asynchronously)")
313
- else:
314
- print(
315
- f"Error: topic query requires a running agent daemon (CULTURE_NICK).",
316
- file=sys.stderr,
317
- )
318
- sys.exit(1)
296
+ _topic_read(target)
297
+
298
+
299
+ def _topic_set(target: str, text: str) -> None:
300
+ """Set channel topic via agent daemon."""
301
+ resp = _require_ipc("irc_topic", channel=target, topic=text)
302
+ if resp.get("ok"):
303
+ print(f"Topic set for {target}")
304
+ else:
305
+ print(f"Error: {resp.get('error', 'unknown error')}", file=sys.stderr)
306
+ sys.exit(1)
307
+
308
+
309
+ def _topic_read(target: str) -> None:
310
+ """Read channel topic via agent daemon IPC."""
311
+ resp = _try_ipc("irc_topic", channel=target)
312
+ if not resp or not resp.get("ok"):
313
+ print(
314
+ "Error: topic query requires a running agent daemon (CULTURE_NICK).",
315
+ file=sys.stderr,
316
+ )
317
+ sys.exit(1)
318
+ data = resp.get("data") or {}
319
+ if "topic" not in data:
320
+ print(f"Topic query sent for {target} (result arrives asynchronously)")
321
+ return
322
+ topic = data["topic"]
323
+ print(f"Topic for {target}: {topic}" if topic else f"No topic set for {target}")
319
324
 
320
325
 
321
326
  def _cmd_compact(args: argparse.Namespace) -> None:
@@ -408,8 +408,8 @@ async def _run_server(
408
408
  data_dir: str = "",
409
409
  ) -> None:
410
410
  """Run the IRC server (called in the daemon child process)."""
411
- from culture.server.config import ServerConfig
412
- from culture.server.ircd import IRCd
411
+ from culture.agentirc.config import ServerConfig
412
+ from culture.agentirc.ircd import IRCd
413
413
 
414
414
  config = ServerConfig(
415
415
  name=name,
@@ -20,7 +20,7 @@ def parse_link(value: str):
20
20
  Trust is extracted from the end if it matches a known value.
21
21
  This allows passwords containing colons.
22
22
  """
23
- from culture.server.config import LinkConfig
23
+ from culture.agentirc.config import LinkConfig
24
24
 
25
25
  trust = "full"
26
26
  if value.endswith(":full") or value.endswith(":restricted"):
@@ -41,9 +41,9 @@ def parse_link(value: str):
41
41
 
42
42
  def resolve_links_from_mesh(mesh_config_path: str) -> list:
43
43
  """Load link configs from mesh.yaml, looking up passwords from OS keyring."""
44
+ from culture.agentirc.config import LinkConfig
44
45
  from culture.credentials import lookup_credential
45
46
  from culture.mesh_config import load_mesh_config
46
- from culture.server.config import LinkConfig
47
47
 
48
48
  mesh = load_mesh_config(mesh_config_path)
49
49
  links = []