agentirc-cli 4.4.3__tar.gz → 4.5.1__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 (341) hide show
  1. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/CHANGELOG.md +27 -0
  2. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/CLAUDE.md +17 -0
  3. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/PKG-INFO +2 -2
  4. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/README.md +1 -1
  5. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/agent.py +191 -6
  6. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/bot.py +1 -1
  7. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/mesh.py +1 -4
  8. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/server.py +2 -2
  9. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/constants.py +4 -1
  10. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/ipc.py +1 -1
  11. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/mesh.py +1 -1
  12. agentirc_cli-4.5.1/culture/clients/acp/culture.yaml +16 -0
  13. agentirc_cli-4.5.1/culture/clients/claude/culture.yaml +13 -0
  14. agentirc_cli-4.5.1/culture/clients/codex/culture.yaml +13 -0
  15. agentirc_cli-4.5.1/culture/clients/copilot/culture.yaml +13 -0
  16. agentirc_cli-4.5.1/culture/config.py +457 -0
  17. agentirc_cli-4.5.1/docs/agents/decentralized-config.md +194 -0
  18. agentirc_cli-4.5.1/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +2131 -0
  19. agentirc_cli-4.5.1/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +361 -0
  20. agentirc_cli-4.5.1/packages/agent-harness/culture.yaml +13 -0
  21. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/pyproject.toml +1 -1
  22. agentirc_cli-4.5.1/tests/test_culture_config.py +499 -0
  23. agentirc_cli-4.5.1/tests/test_migrate_cli.py +117 -0
  24. agentirc_cli-4.5.1/tests/test_register_cli.py +139 -0
  25. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/uv.lock +1 -1
  26. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.claude/skills/pr-review/SKILL.md +0 -0
  27. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.claude/skills/run-tests/SKILL.md +0 -0
  28. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  29. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.flake8 +0 -0
  30. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/pages.yml +0 -0
  31. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/publish.yml +0 -0
  32. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/security-checks.yml +0 -0
  33. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/tests.yml +0 -0
  34. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.gitignore +0 -0
  35. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.markdownlint-cli2.yaml +0 -0
  36. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.pr_agent.toml +0 -0
  37. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.pre-commit-config.yaml +0 -0
  38. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.pylintrc +0 -0
  39. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/CNAME +0 -0
  40. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/Gemfile +0 -0
  41. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/Gemfile.lock +0 -0
  42. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/LICENSE +0 -0
  43. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/SECURITY.md +0 -0
  44. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_config.yml +0 -0
  45. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_includes/head_custom.html +0 -0
  46. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_sass/color_schemes/anthropic.scss +0 -0
  47. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_sass/custom/custom.scss +0 -0
  48. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/apple-touch-icon.png +0 -0
  49. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/favicon-16x16.png +0 -0
  50. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/favicon-32x32.png +0 -0
  51. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/favicon.ico +0 -0
  52. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/__init__.py +0 -0
  53. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/__main__.py +0 -0
  54. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/aio.py +0 -0
  55. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/__init__.py +0 -0
  56. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/bot.py +0 -0
  57. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/bot_manager.py +0 -0
  58. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/config.py +0 -0
  59. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/http_listener.py +0 -0
  60. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/template_engine.py +0 -0
  61. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/virtual_client.py +0 -0
  62. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/__init__.py +0 -0
  63. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/channel.py +0 -0
  64. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/__init__.py +0 -0
  65. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/display.py +0 -0
  66. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/formatting.py +0 -0
  67. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/process.py +0 -0
  68. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/skills.py +0 -0
  69. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/__init__.py +0 -0
  70. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/__init__.py +0 -0
  71. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/agent_runner.py +0 -0
  72. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/config.py +0 -0
  73. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/daemon.py +0 -0
  74. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/ipc.py +0 -0
  75. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/irc_transport.py +0 -0
  76. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/message_buffer.py +0 -0
  77. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/skill/SKILL.md +0 -0
  78. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/skill/__init__.py +0 -0
  79. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/skill/irc_client.py +0 -0
  80. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/socket_server.py +0 -0
  81. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/supervisor.py +0 -0
  82. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/webhook.py +0 -0
  83. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/__init__.py +0 -0
  84. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/__main__.py +0 -0
  85. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/agent_runner.py +0 -0
  86. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/config.py +0 -0
  87. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/daemon.py +0 -0
  88. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/ipc.py +0 -0
  89. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/irc_transport.py +0 -0
  90. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/message_buffer.py +0 -0
  91. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/skill/SKILL.md +0 -0
  92. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/skill/__init__.py +0 -0
  93. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/skill/irc_client.py +0 -0
  94. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/socket_server.py +0 -0
  95. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/supervisor.py +0 -0
  96. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/webhook.py +0 -0
  97. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/__init__.py +0 -0
  98. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/agent_runner.py +0 -0
  99. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/config.py +0 -0
  100. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/daemon.py +0 -0
  101. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/ipc.py +0 -0
  102. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/irc_transport.py +0 -0
  103. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/message_buffer.py +0 -0
  104. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/skill/SKILL.md +0 -0
  105. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/skill/__init__.py +0 -0
  106. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/skill/irc_client.py +0 -0
  107. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/socket_server.py +0 -0
  108. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/supervisor.py +0 -0
  109. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/webhook.py +0 -0
  110. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/__init__.py +0 -0
  111. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/agent_runner.py +0 -0
  112. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/config.py +0 -0
  113. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/daemon.py +0 -0
  114. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/ipc.py +0 -0
  115. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/irc_transport.py +0 -0
  116. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/message_buffer.py +0 -0
  117. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/skill/SKILL.md +0 -0
  118. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/skill/__init__.py +0 -0
  119. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/skill/irc_client.py +0 -0
  120. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/socket_server.py +0 -0
  121. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/supervisor.py +0 -0
  122. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/webhook.py +0 -0
  123. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/__init__.py +0 -0
  124. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/app.py +0 -0
  125. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/client.py +0 -0
  126. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/commands.py +0 -0
  127. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/__init__.py +0 -0
  128. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/chat.py +0 -0
  129. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/info_panel.py +0 -0
  130. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/sidebar.py +0 -0
  131. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/credentials.py +0 -0
  132. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/formatting.py +0 -0
  133. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/learn_prompt.py +0 -0
  134. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/mesh_config.py +0 -0
  135. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/observer.py +0 -0
  136. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/__init__.py +0 -0
  137. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/collector.py +0 -0
  138. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/model.py +0 -0
  139. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/renderer_text.py +0 -0
  140. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/renderer_web.py +0 -0
  141. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/web/style.css +0 -0
  142. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/persistence.py +0 -0
  143. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/pidfile.py +0 -0
  144. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/__init__.py +0 -0
  145. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/commands.py +0 -0
  146. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/federation.md +0 -0
  147. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/history.md +0 -0
  148. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/icons.md +0 -0
  149. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/rooms.md +0 -0
  150. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/tags.md +0 -0
  151. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/threads.md +0 -0
  152. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/message.py +0 -0
  153. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/protocol-index.md +0 -0
  154. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/replies.py +0 -0
  155. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/__init__.py +0 -0
  156. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/__main__.py +0 -0
  157. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/channel.py +0 -0
  158. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/client.py +0 -0
  159. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/config.py +0 -0
  160. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/history_store.py +0 -0
  161. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/ircd.py +0 -0
  162. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/remote_client.py +0 -0
  163. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/room_store.py +0 -0
  164. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/rooms_util.py +0 -0
  165. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/server_link.py +0 -0
  166. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skill.py +0 -0
  167. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/__init__.py +0 -0
  168. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/history.py +0 -0
  169. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/icon.py +0 -0
  170. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/rooms.py +0 -0
  171. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/threads.py +0 -0
  172. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/thread_store.py +0 -0
  173. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/skills/culture/SKILL.md +0 -0
  174. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/agent-lifecycle.md +0 -0
  175. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/agentic-self-learn.md +0 -0
  176. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/agent-client.md +0 -0
  177. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/agent-harness-spec.md +0 -0
  178. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/design.md +0 -0
  179. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/harness-conformance.md +0 -0
  180. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/index.md +0 -0
  181. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer1-core-irc.md +0 -0
  182. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer2-attention.md +0 -0
  183. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer3-skills.md +0 -0
  184. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer4-federation.md +0 -0
  185. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer5-agent-harness.md +0 -0
  186. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/server-architecture.md +0 -0
  187. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/threads.md +0 -0
  188. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/channel-polling.md +0 -0
  189. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/acp/overview.md +0 -0
  190. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/acp/system-prompt.md +0 -0
  191. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/configuration.md +0 -0
  192. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/context-management.md +0 -0
  193. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/irc-tools.md +0 -0
  194. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/overview.md +0 -0
  195. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/setup.md +0 -0
  196. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/supervisor.md +0 -0
  197. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/webhooks.md +0 -0
  198. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/configuration.md +0 -0
  199. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/context-management.md +0 -0
  200. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/irc-tools.md +0 -0
  201. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/overview.md +0 -0
  202. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/setup.md +0 -0
  203. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/supervisor.md +0 -0
  204. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/webhooks.md +0 -0
  205. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/configuration.md +0 -0
  206. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/context-management.md +0 -0
  207. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/irc-tools.md +0 -0
  208. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/overview.md +0 -0
  209. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/setup.md +0 -0
  210. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/supervisor.md +0 -0
  211. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/webhooks.md +0 -0
  212. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/culture-cli.md +0 -0
  213. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/getting-started.md +0 -0
  214. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/index.md +0 -0
  215. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/SECURITY.md +0 -0
  216. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/bots.md +0 -0
  217. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/ci.md +0 -0
  218. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/cli.md +0 -0
  219. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/docs-site.md +0 -0
  220. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/index.md +0 -0
  221. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/ops-tooling.md +0 -0
  222. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/overview.md +0 -0
  223. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/publishing.md +0 -0
  224. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/persistent-history.md +0 -0
  225. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/reflective-development.md +0 -0
  226. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  227. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/rooms.md +0 -0
  228. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/server-rename.md +0 -0
  229. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  230. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  231. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  232. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  233. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  234. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  235. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  236. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  237. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  238. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  239. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  240. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  241. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  242. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  243. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  244. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  245. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  246. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  247. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  248. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  249. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  250. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
  251. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
  252. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
  253. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/01-pair-programming.md +0 -0
  254. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
  255. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
  256. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
  257. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/05-the-observer.md +0 -0
  258. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/06-cross-server-ops.md +0 -0
  259. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
  260. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/08-apps-as-agents.md +0 -0
  261. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/09-research-swarm.md +0 -0
  262. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/10-agent-lifecycle.md +0 -0
  263. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases-index.md +0 -0
  264. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/what-is-culture.md +0 -0
  265. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/favicon.ico +0 -0
  266. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/README.md +0 -0
  267. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/config.py +0 -0
  268. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/daemon.py +0 -0
  269. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/ipc.py +0 -0
  270. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/irc_transport.py +0 -0
  271. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/message_buffer.py +0 -0
  272. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/skill/SKILL.md +0 -0
  273. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/skill/irc_client.py +0 -0
  274. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/socket_server.py +0 -0
  275. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/webhook.py +0 -0
  276. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  277. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  278. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  279. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  280. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/sonar-project.properties +0 -0
  281. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/__init__.py +0 -0
  282. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/conftest.py +0 -0
  283. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_acp_daemon.py +0 -0
  284. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_agent_runner.py +0 -0
  285. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_archive.py +0 -0
  286. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bot.py +0 -0
  287. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bot_config.py +0 -0
  288. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bot_manager.py +0 -0
  289. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bots_integration.py +0 -0
  290. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_channel.py +0 -0
  291. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_codex_daemon.py +0 -0
  292. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_connection.py +0 -0
  293. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_client.py +0 -0
  294. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_commands.py +0 -0
  295. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_connection.py +0 -0
  296. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_icons.py +0 -0
  297. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_integration.py +0 -0
  298. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_copilot_daemon.py +0 -0
  299. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_daemon.py +0 -0
  300. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_daemon_config.py +0 -0
  301. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_daemon_ipc.py +0 -0
  302. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_discovery.py +0 -0
  303. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_federation.py +0 -0
  304. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_history.py +0 -0
  305. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_http_listener.py +0 -0
  306. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_integration_layer5.py +0 -0
  307. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_ipc.py +0 -0
  308. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_irc_transport.py +0 -0
  309. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_link_reconnect.py +0 -0
  310. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mention_alias.py +0 -0
  311. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mention_target_cleanup.py +0 -0
  312. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mentions.py +0 -0
  313. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mesh_config.py +0 -0
  314. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_message.py +0 -0
  315. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_message_buffer.py +0 -0
  316. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_messaging.py +0 -0
  317. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_modes.py +0 -0
  318. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_cli.py +0 -0
  319. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_collector.py +0 -0
  320. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_model.py +0 -0
  321. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_renderer.py +0 -0
  322. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_web.py +0 -0
  323. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_persistence.py +0 -0
  324. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_pidfile.py +0 -0
  325. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_poll_loop.py +0 -0
  326. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_room_persistence.py +0 -0
  327. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_rooms.py +0 -0
  328. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_rooms_federation.py +0 -0
  329. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_rooms_integration.py +0 -0
  330. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_server_icon_skill.py +0 -0
  331. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_setup_update_cli.py +0 -0
  332. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_skill_client.py +0 -0
  333. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_skills.py +0 -0
  334. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_socket_server.py +0 -0
  335. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_supervisor.py +0 -0
  336. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_template_engine.py +0 -0
  337. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_thread_buffer.py +0 -0
  338. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_threads.py +0 -0
  339. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_virtual_client.py +0 -0
  340. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_wait_for_port.py +0 -0
  341. {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_webhook.py +0 -0
@@ -4,8 +4,35 @@ 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
+ ## [4.5.1] - 2026-04-09
8
+
9
+
10
+ ### Fixed
11
+
12
+ - Fix mesh overview crash after agent config migration (str has no attribute items)
13
+
14
+ ## [4.5.0] - 2026-04-09
15
+
16
+
17
+ ### Added
18
+
19
+ - Decentralized agent configuration with per-directory culture.yaml files
20
+ - New ~/.culture/server.yaml for machine-level config with agent manifest
21
+ - CLI: culture agent register/unregister for managing agent directories
22
+ - CLI: culture agent migrate for one-time migration from agents.yaml
23
+ - Unified culture/config.py module with AgentConfig, ServerConfig, auto-detection
24
+ - culture.yaml definitions for harness template and backend agents (#harness channel)
25
+
26
+
27
+ ### Changed
28
+
29
+ - Agent config split: per-agent settings in culture.yaml, server settings in server.yaml
30
+ - CLI agent commands now support both server.yaml and legacy agents.yaml formats
31
+
32
+
7
33
  ## [4.4.3] - 2026-04-08
8
34
 
35
+
9
36
  ### Changed
10
37
 
11
38
  - Regenerate all favicons, including `/favicon.ico` and `/assets/images/favicon.ico`, from the source image with proper cropping and optimization
@@ -28,6 +28,23 @@ If you improve a generic component (e.g., `irc_transport.py`), update the refere
28
28
 
29
29
  **All-backends rule:** When adding or changing a feature in any agent harness (config fields, transport capabilities, daemon handlers), propagate the change to **all** backends (`claude`, `codex`, `copilot`, `acp`) and update `docs/` accordingly. A feature that only exists in one backend is a bug.
30
30
 
31
+ ## Agent Configuration
32
+
33
+ Agent definitions are decentralized into per-directory `culture.yaml` files:
34
+
35
+ - `culture.yaml` — agent identity and config, lives in the agent's working directory
36
+ - `~/.culture/server.yaml` — server connection, supervisor, webhooks, and agent manifest
37
+
38
+ Key commands:
39
+
40
+ - `culture agent register [path]` — register a directory's culture.yaml
41
+ - `culture agent unregister <suffix|nick>` — remove from manifest
42
+ - `culture agent migrate` — one-time migration from legacy agents.yaml
43
+ - `culture agent start/stop/status` — work with both server.yaml and legacy agents.yaml
44
+
45
+ Template: `packages/agent-harness/culture.yaml` is the reference implementation.
46
+ Each backend has its own `culture.yaml` in `culture/clients/<backend>/`.
47
+
31
48
  ## Documentation
32
49
 
33
50
  When implementing features, write a corresponding markdown doc in `docs/` describing the feature — its purpose, usage, and any protocol details. Keep `docs/` as the living reference for the project.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 4.4.3
3
+ Version: 4.5.1
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
@@ -46,7 +46,7 @@ Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
46
46
  <br><br>
47
47
  <sub>If you find Culture useful, <a href="https://github.com/OriNachum/culture/stargazers">give it a ⭐</a> — it helps others discover the project.</sub>
48
48
 
49
- <img width="800" alt="Culture" src="https://github.com/user-attachments/assets/e8e589d2-eb04-47cc-9ae3-5a98d750e36c" />
49
+ <img width="800" alt="culture-hero" src="https://github.com/user-attachments/assets/95dc79a2-d740-4554-b817-6e017b6cfd16" />
50
50
 
51
51
  </div>
52
52
 
@@ -22,7 +22,7 @@ Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
22
22
  <br><br>
23
23
  <sub>If you find Culture useful, <a href="https://github.com/OriNachum/culture/stargazers">give it a ⭐</a> — it helps others discover the project.</sub>
24
24
 
25
- <img width="800" alt="Culture" src="https://github.com/user-attachments/assets/e8e589d2-eb04-47cc-9ae3-5a98d750e36c" />
25
+ <img width="800" alt="culture-hero" src="https://github.com/user-attachments/assets/95dc79a2-d740-4554-b817-6e017b6cfd16" />
26
26
 
27
27
  </div>
28
28
 
@@ -8,17 +8,31 @@ import logging
8
8
  import os
9
9
  import signal
10
10
  import sys
11
+ from pathlib import Path
12
+
13
+ import yaml
11
14
 
12
15
  from culture.clients.claude.config import (
13
- AgentConfig,
14
- DaemonConfig,
15
16
  add_agent_to_config,
16
17
  archive_agent,
18
+ remove_agent,
19
+ unarchive_agent,
20
+ )
21
+ from culture.config import (
22
+ AgentConfig,
23
+ DaemonConfig,
24
+ ServerConfig,
25
+ ServerConnConfig,
26
+ SupervisorConfig,
27
+ WebhookConfig,
28
+ add_to_manifest,
17
29
  load_config,
18
30
  load_config_or_default,
19
- remove_agent,
31
+ load_culture_yaml,
32
+ remove_from_manifest,
20
33
  sanitize_agent_name,
21
- unarchive_agent,
34
+ save_culture_yaml,
35
+ save_server_config,
22
36
  )
23
37
  from culture.pidfile import (
24
38
  is_process_alive,
@@ -31,6 +45,8 @@ from .shared.constants import (
31
45
  _CONFIG_HELP,
32
46
  DEFAULT_CHANNEL,
33
47
  DEFAULT_CONFIG,
48
+ DEFAULT_SERVER_CONFIG,
49
+ LEGACY_CONFIG,
34
50
  LOG_DIR,
35
51
  NO_AGENTS_MSG,
36
52
  )
@@ -162,11 +178,35 @@ def register(subparsers: argparse._SubParsersAction) -> None:
162
178
  delete_parser.add_argument("nick", help="Agent nick to delete")
163
179
  delete_parser.add_argument("--config", default=DEFAULT_CONFIG, help=_CONFIG_HELP)
164
180
 
181
+ # -- register -------------------------------------------------------------
182
+ register_parser = agent_sub.add_parser("register", help="Register agent directory")
183
+ register_parser.add_argument(
184
+ "path", nargs="?", default=None, help="Directory containing culture.yaml (default: cwd)"
185
+ )
186
+ register_parser.add_argument(
187
+ "--suffix", default=None, help="Agent suffix (required for multi-agent culture.yaml)"
188
+ )
189
+ register_parser.add_argument("--config", default=DEFAULT_SERVER_CONFIG, help=_CONFIG_HELP)
190
+
191
+ # -- unregister -----------------------------------------------------------
192
+ unregister_parser = agent_sub.add_parser("unregister", help="Unregister agent")
193
+ unregister_parser.add_argument("target", help="Agent suffix or full nick")
194
+ unregister_parser.add_argument("--config", default=DEFAULT_SERVER_CONFIG, help=_CONFIG_HELP)
195
+
196
+ # -- migrate --------------------------------------------------------------
197
+ migrate_parser = agent_sub.add_parser(
198
+ "migrate", help="Migrate agents.yaml to server.yaml + culture.yaml"
199
+ )
200
+ migrate_parser.add_argument("--config", default=LEGACY_CONFIG, help="Legacy agents.yaml path")
201
+ migrate_parser.add_argument(
202
+ "--output", default=DEFAULT_SERVER_CONFIG, help="Output server.yaml path"
203
+ )
204
+
165
205
 
166
206
  def dispatch(args: argparse.Namespace) -> None:
167
207
  if not args.agent_command:
168
208
  print(
169
- "Usage: culture agent {create|join|start|stop|status|rename|assign|sleep|wake|learn|message|read|archive|unarchive|delete}",
209
+ "Usage: culture agent {create|join|start|stop|status|rename|assign|sleep|wake|learn|message|read|archive|unarchive|delete|register|unregister|migrate}",
170
210
  file=sys.stderr,
171
211
  )
172
212
  sys.exit(1)
@@ -187,6 +227,9 @@ def dispatch(args: argparse.Namespace) -> None:
187
227
  "archive": _cmd_archive,
188
228
  "unarchive": _cmd_unarchive,
189
229
  "delete": _cmd_delete,
230
+ "register": _cmd_register,
231
+ "unregister": _cmd_unregister,
232
+ "migrate": _cmd_migrate,
190
233
  }
191
234
  handler = handlers.get(args.agent_command)
192
235
  if handler:
@@ -259,7 +302,7 @@ def _create_default_config(full_nick: str, backend: str) -> AgentConfig:
259
302
  """Build a default (claude) AgentConfig."""
260
303
  return AgentConfig(
261
304
  nick=full_nick,
262
- agent=backend,
305
+ backend=backend,
263
306
  directory=os.getcwd(),
264
307
  channels=[DEFAULT_CHANNEL],
265
308
  )
@@ -933,3 +976,145 @@ def _cmd_delete(args: argparse.Namespace) -> None:
933
976
 
934
977
  remove_agent(args.config, args.nick)
935
978
  print(f"Agent deleted: {args.nick}")
979
+
980
+
981
+ # -----------------------------------------------------------------------
982
+ # Register / Unregister
983
+ # -----------------------------------------------------------------------
984
+
985
+
986
+ def _cmd_register(args: argparse.Namespace) -> None:
987
+ """Register a directory containing culture.yaml."""
988
+ directory = args.path if args.path else os.getcwd()
989
+ directory = str(Path(directory).resolve())
990
+
991
+ try:
992
+ agents = load_culture_yaml(directory)
993
+ except FileNotFoundError:
994
+ print(f"No culture.yaml found in {directory}", file=sys.stderr)
995
+ sys.exit(1)
996
+
997
+ if len(agents) > 1 and args.suffix is None:
998
+ print(
999
+ f"Multiple agents in {directory}/culture.yaml. " "Use --suffix to specify which one.",
1000
+ file=sys.stderr,
1001
+ )
1002
+ print("Available suffixes:", file=sys.stderr)
1003
+ for a in agents:
1004
+ print(f" {a.suffix}", file=sys.stderr)
1005
+ sys.exit(1)
1006
+
1007
+ targets = agents if args.suffix is None else [a for a in agents if a.suffix == args.suffix]
1008
+ if not targets:
1009
+ print(f"Suffix {args.suffix!r} not found in culture.yaml", file=sys.stderr)
1010
+ sys.exit(1)
1011
+
1012
+ config = load_config_or_default(args.config)
1013
+ server_name = config.server.name
1014
+
1015
+ for agent in targets:
1016
+ try:
1017
+ add_to_manifest(args.config, agent.suffix, directory)
1018
+ except ValueError as e:
1019
+ print(f"Error: {e}", file=sys.stderr)
1020
+ sys.exit(1)
1021
+ print(f"Registered: {server_name}-{agent.suffix} at {directory}")
1022
+
1023
+
1024
+ def _cmd_unregister(args: argparse.Namespace) -> None:
1025
+ """Remove an agent from the manifest."""
1026
+ target = args.target
1027
+ config = load_config_or_default(args.config)
1028
+
1029
+ prefix = f"{config.server.name}-"
1030
+ suffix = target.removeprefix(prefix) if target.startswith(prefix) else target
1031
+
1032
+ try:
1033
+ remove_from_manifest(args.config, suffix)
1034
+ except ValueError as e:
1035
+ print(f"Error: {e}", file=sys.stderr)
1036
+ sys.exit(1)
1037
+ print(f"Unregistered: {prefix}{suffix}")
1038
+
1039
+
1040
+ # -----------------------------------------------------------------------
1041
+ # Migrate
1042
+ # -----------------------------------------------------------------------
1043
+
1044
+
1045
+ def _cmd_migrate(args: argparse.Namespace) -> None:
1046
+ """Migrate from agents.yaml to server.yaml + per-directory culture.yaml."""
1047
+ legacy_path = Path(args.config)
1048
+ if not legacy_path.exists():
1049
+ print(f"No agents.yaml found at {legacy_path}", file=sys.stderr)
1050
+ sys.exit(1)
1051
+
1052
+ with open(legacy_path) as f:
1053
+ raw = yaml.safe_load(f) or {}
1054
+
1055
+ server_name = raw.get("server", {}).get("name", "culture")
1056
+ prefix = f"{server_name}-"
1057
+
1058
+ # Group agents by directory
1059
+ by_dir: dict[str, list[tuple[str, dict]]] = {}
1060
+ for agent_raw in raw.get("agents", []):
1061
+ nick = agent_raw.get("nick", "")
1062
+ suffix = nick.removeprefix(prefix) if nick.startswith(prefix) else nick
1063
+ directory = str(Path(agent_raw.get("directory", ".")).resolve())
1064
+ by_dir.setdefault(directory, []).append((suffix, agent_raw))
1065
+
1066
+ # Create culture.yaml in each directory
1067
+ manifest: dict[str, str] = {}
1068
+ for directory, entries in by_dir.items():
1069
+ agents = []
1070
+ for suffix, agent_raw in entries:
1071
+ backend = agent_raw.get("agent", "claude")
1072
+ known_fields = {
1073
+ "suffix": suffix,
1074
+ "backend": backend,
1075
+ "channels": agent_raw.get("channels", ["#general"]),
1076
+ "model": agent_raw.get("model", "claude-opus-4-6"),
1077
+ "thinking": agent_raw.get("thinking", "medium"),
1078
+ "system_prompt": agent_raw.get("system_prompt", ""),
1079
+ "tags": agent_raw.get("tags", []),
1080
+ "icon": agent_raw.get("icon"),
1081
+ "archived": agent_raw.get("archived", False),
1082
+ "archived_at": agent_raw.get("archived_at", ""),
1083
+ "archived_reason": agent_raw.get("archived_reason", ""),
1084
+ }
1085
+ skip_keys = set(known_fields.keys()) | {"nick", "directory", "agent"}
1086
+ extras = {k: v for k, v in agent_raw.items() if k not in skip_keys}
1087
+ agents.append(AgentConfig(**known_fields, extras=extras))
1088
+ manifest[suffix] = directory
1089
+
1090
+ dir_path = Path(directory)
1091
+ dir_path.mkdir(parents=True, exist_ok=True)
1092
+ save_culture_yaml(directory, agents)
1093
+ print(f" Created {directory}/culture.yaml ({len(agents)} agent(s))")
1094
+
1095
+ # Create server.yaml
1096
+ server = ServerConnConfig(**raw.get("server", {}))
1097
+ supervisor = SupervisorConfig(**raw.get("supervisor", {}))
1098
+ webhooks = WebhookConfig(**raw.get("webhooks", {}))
1099
+ server_config = ServerConfig(
1100
+ server=server,
1101
+ supervisor=supervisor,
1102
+ webhooks=webhooks,
1103
+ buffer_size=raw.get("buffer_size", 500),
1104
+ poll_interval=raw.get("poll_interval", 60),
1105
+ sleep_start=raw.get("sleep_start", "23:00"),
1106
+ sleep_end=raw.get("sleep_end", "08:00"),
1107
+ manifest=manifest,
1108
+ )
1109
+
1110
+ output_path = Path(args.output)
1111
+ save_server_config(str(output_path), server_config)
1112
+ print(f" Created {output_path}")
1113
+
1114
+ # Back up agents.yaml
1115
+ backup = legacy_path.with_suffix(".yaml.bak")
1116
+ legacy_path.rename(backup)
1117
+ print(f" Backed up {legacy_path} -> {backup}")
1118
+ print(f"\nMigration complete: {len(manifest)} agent(s) across {len(by_dir)} directory(ies)")
1119
+ print(f"\nAgent commands now use {output_path} by default.")
1120
+ print(f"Verify with: culture agent status")
@@ -6,7 +6,7 @@ import argparse
6
6
  import sys
7
7
  import time
8
8
 
9
- from culture.clients.claude.config import load_config_or_default
9
+ from culture.config import load_config_or_default
10
10
 
11
11
  from .shared.constants import _BOT_NAME_HELP, _CONFIG_HELP, BOT_CONFIG_FILE, DEFAULT_CONFIG
12
12
 
@@ -11,10 +11,7 @@ import subprocess
11
11
  import sys
12
12
  import time
13
13
 
14
- from culture.clients.claude.config import (
15
- load_config,
16
- load_config_or_default,
17
- )
14
+ from culture.config import ServerConfig, load_config, load_config_or_default
18
15
 
19
16
  from .shared.constants import AGENTS_YAML, CULTURE_DIR, DEFAULT_CONFIG
20
17
  from .shared.mesh import build_server_start_cmd, generate_mesh_from_agents
@@ -159,7 +159,7 @@ def dispatch(args: argparse.Namespace) -> None:
159
159
 
160
160
  # Also accept the configured server name
161
161
  try:
162
- from culture.clients.claude.config import load_config_or_default
162
+ from culture.config import load_config_or_default
163
163
 
164
164
  config = load_config_or_default(DEFAULT_CONFIG)
165
165
  known_names.add(config.server.name)
@@ -314,7 +314,7 @@ def _verify_daemon_started(args: argparse.Namespace, pid: int) -> None:
314
314
 
315
315
  def _check_server_archived(args: argparse.Namespace) -> None:
316
316
  """Exit if the server is archived."""
317
- from culture.clients.claude.config import load_config_or_default
317
+ from culture.config import load_config_or_default
318
318
 
319
319
  config_path = getattr(args, "config", DEFAULT_CONFIG)
320
320
  config = load_config_or_default(config_path)
@@ -4,7 +4,7 @@ import os
4
4
 
5
5
  from culture.bots.config import BOT_CONFIG_FILE # noqa: F401
6
6
 
7
- DEFAULT_CONFIG = os.path.expanduser("~/.culture/agents.yaml")
7
+ DEFAULT_CONFIG = os.path.expanduser("~/.culture/server.yaml")
8
8
  LOG_DIR = os.path.expanduser("~/.culture/logs")
9
9
 
10
10
  _CONFIG_HELP = "Config file path"
@@ -15,3 +15,6 @@ DEFAULT_CHANNEL = "#general"
15
15
  NO_AGENTS_MSG = "No agents configured"
16
16
  CULTURE_DIR = ".culture"
17
17
  AGENTS_YAML = "agents.yaml"
18
+
19
+ DEFAULT_SERVER_CONFIG = os.path.expanduser("~/.culture/server.yaml")
20
+ LEGACY_CONFIG = os.path.expanduser("~/.culture/agents.yaml")
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import os
7
7
 
8
- from culture.clients.claude.config import load_config_or_default
8
+ from culture.config import load_config_or_default
9
9
 
10
10
 
11
11
  def agent_socket_path(nick: str) -> str:
@@ -7,7 +7,7 @@ import logging
7
7
  import os
8
8
  import sys
9
9
 
10
- from culture.clients.claude.config import load_config
10
+ from culture.config import load_config
11
11
 
12
12
  from .constants import DEFAULT_CONFIG
13
13
 
@@ -0,0 +1,16 @@
1
+ suffix: harness-acp
2
+ backend: claude
3
+ model: claude-opus-4-6
4
+ channels:
5
+ - "#harness"
6
+ acp_command:
7
+ - opencode
8
+ - acp
9
+ system_prompt: |
10
+ You maintain the ACP agent backend in culture/clients/acp/.
11
+ Listen on #harness for propagation instructions from spark-harness.
12
+ Apply changes using assimilai, adapting for ACP (Cline, OpenCode, Kiro)
13
+ specifics (agent_runner.py, supervisor.py).
14
+ tags:
15
+ - harness
16
+ - acp
@@ -0,0 +1,13 @@
1
+ suffix: harness-claude
2
+ backend: claude
3
+ model: claude-opus-4-6
4
+ channels:
5
+ - "#harness"
6
+ system_prompt: |
7
+ You maintain the Claude agent backend in culture/clients/claude/.
8
+ Listen on #harness for propagation instructions from spark-harness.
9
+ Apply changes using assimilai, adapting for Claude SDK specifics
10
+ (agent_runner.py, supervisor.py).
11
+ tags:
12
+ - harness
13
+ - claude
@@ -0,0 +1,13 @@
1
+ suffix: harness-codex
2
+ backend: codex
3
+ model: gpt-5.4
4
+ channels:
5
+ - "#harness"
6
+ system_prompt: |
7
+ You maintain the Codex agent backend in culture/clients/codex/.
8
+ Listen on #harness for propagation instructions from spark-harness.
9
+ Apply changes using assimilai, adapting for Codex CLI specifics
10
+ (agent_runner.py, supervisor.py).
11
+ tags:
12
+ - harness
13
+ - codex
@@ -0,0 +1,13 @@
1
+ suffix: harness-copilot
2
+ backend: claude
3
+ model: claude-opus-4-6
4
+ channels:
5
+ - "#harness"
6
+ system_prompt: |
7
+ You maintain the Copilot agent backend in culture/clients/copilot/.
8
+ Listen on #harness for propagation instructions from spark-harness.
9
+ Apply changes using assimilai, adapting for Copilot Extensions API
10
+ specifics (agent_runner.py, supervisor.py).
11
+ tags:
12
+ - harness
13
+ - copilot