agentirc-cli 6.0.0__tar.gz → 6.0.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 (351) hide show
  1. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/CHANGELOG.md +9 -0
  2. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/PKG-INFO +1 -1
  3. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/agent.py +80 -117
  4. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/server.py +6 -12
  5. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/config.py +284 -7
  6. agentirc_cli-6.0.1/docs/manifest-migration.md +74 -0
  7. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/pyproject.toml +1 -1
  8. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_archive.py +7 -7
  9. agentirc_cli-6.0.1/tests/test_manifest_config.py +317 -0
  10. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_migrate_cli.py +25 -14
  11. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/uv.lock +1 -1
  12. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.claude/skills/pr-review/SKILL.md +0 -0
  13. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.claude/skills/run-tests/SKILL.md +0 -0
  14. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  15. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.flake8 +0 -0
  16. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/pages.yml +0 -0
  17. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/publish.yml +0 -0
  18. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/security-checks.yml +0 -0
  19. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/tests.yml +0 -0
  20. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.gitignore +0 -0
  21. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.markdownlint-cli2.yaml +0 -0
  22. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.pr_agent.toml +0 -0
  23. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.pre-commit-config.yaml +0 -0
  24. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.pylintrc +0 -0
  25. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/CLAUDE.md +0 -0
  26. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/CNAME +0 -0
  27. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/Gemfile +0 -0
  28. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/Gemfile.lock +0 -0
  29. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/LICENSE +0 -0
  30. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/README.md +0 -0
  31. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/SECURITY.md +0 -0
  32. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_config.yml +0 -0
  33. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_includes/head_custom.html +0 -0
  34. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_sass/color_schemes/anthropic.scss +0 -0
  35. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_sass/custom/custom.scss +0 -0
  36. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/apple-touch-icon.png +0 -0
  37. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/favicon-16x16.png +0 -0
  38. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/favicon-32x32.png +0 -0
  39. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/favicon.ico +0 -0
  40. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/__init__.py +0 -0
  41. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/__main__.py +0 -0
  42. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/__init__.py +0 -0
  43. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/__main__.py +0 -0
  44. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/channel.py +0 -0
  45. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/client.py +0 -0
  46. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/config.py +0 -0
  47. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/history_store.py +0 -0
  48. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/ircd.py +0 -0
  49. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/remote_client.py +0 -0
  50. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/room_store.py +0 -0
  51. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/rooms_util.py +0 -0
  52. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/server_link.py +0 -0
  53. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skill.py +0 -0
  54. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/__init__.py +0 -0
  55. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/history.py +0 -0
  56. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/icon.py +0 -0
  57. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/rooms.py +0 -0
  58. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/threads.py +0 -0
  59. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/thread_store.py +0 -0
  60. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/aio.py +0 -0
  61. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/__init__.py +0 -0
  62. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/bot.py +0 -0
  63. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/bot_manager.py +0 -0
  64. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/config.py +0 -0
  65. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/http_listener.py +0 -0
  66. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/template_engine.py +0 -0
  67. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/virtual_client.py +0 -0
  68. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/__init__.py +0 -0
  69. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/bot.py +0 -0
  70. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/channel.py +0 -0
  71. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/mesh.py +0 -0
  72. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/__init__.py +0 -0
  73. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/constants.py +0 -0
  74. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/display.py +0 -0
  75. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/formatting.py +0 -0
  76. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/ipc.py +0 -0
  77. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/mesh.py +0 -0
  78. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/process.py +0 -0
  79. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/skills.py +0 -0
  80. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/__init__.py +0 -0
  81. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/__init__.py +0 -0
  82. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/agent_runner.py +0 -0
  83. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/config.py +0 -0
  84. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/culture.yaml +0 -0
  85. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/daemon.py +0 -0
  86. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/ipc.py +0 -0
  87. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/irc_transport.py +0 -0
  88. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/message_buffer.py +0 -0
  89. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/skill/SKILL.md +0 -0
  90. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/skill/__init__.py +0 -0
  91. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/skill/irc_client.py +0 -0
  92. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/socket_server.py +0 -0
  93. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/supervisor.py +0 -0
  94. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/webhook.py +0 -0
  95. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/__init__.py +0 -0
  96. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/__main__.py +0 -0
  97. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/agent_runner.py +0 -0
  98. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/config.py +0 -0
  99. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/culture.yaml +0 -0
  100. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/daemon.py +0 -0
  101. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/ipc.py +0 -0
  102. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/irc_transport.py +0 -0
  103. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/message_buffer.py +0 -0
  104. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/skill/SKILL.md +0 -0
  105. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/skill/__init__.py +0 -0
  106. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/skill/irc_client.py +0 -0
  107. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/socket_server.py +0 -0
  108. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/supervisor.py +0 -0
  109. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/webhook.py +0 -0
  110. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/__init__.py +0 -0
  111. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/agent_runner.py +0 -0
  112. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/config.py +0 -0
  113. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/culture.yaml +0 -0
  114. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/daemon.py +0 -0
  115. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/ipc.py +0 -0
  116. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/irc_transport.py +0 -0
  117. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/message_buffer.py +0 -0
  118. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/skill/SKILL.md +0 -0
  119. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/skill/__init__.py +0 -0
  120. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/skill/irc_client.py +0 -0
  121. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/socket_server.py +0 -0
  122. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/supervisor.py +0 -0
  123. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/webhook.py +0 -0
  124. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/__init__.py +0 -0
  125. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/agent_runner.py +0 -0
  126. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/config.py +0 -0
  127. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/culture.yaml +0 -0
  128. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/daemon.py +0 -0
  129. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/ipc.py +0 -0
  130. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/irc_transport.py +0 -0
  131. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/message_buffer.py +0 -0
  132. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/skill/SKILL.md +0 -0
  133. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/skill/__init__.py +0 -0
  134. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/skill/irc_client.py +0 -0
  135. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/socket_server.py +0 -0
  136. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/supervisor.py +0 -0
  137. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/webhook.py +0 -0
  138. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/__init__.py +0 -0
  139. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/app.py +0 -0
  140. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/client.py +0 -0
  141. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/commands.py +0 -0
  142. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/__init__.py +0 -0
  143. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/chat.py +0 -0
  144. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/info_panel.py +0 -0
  145. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/sidebar.py +0 -0
  146. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/credentials.py +0 -0
  147. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/formatting.py +0 -0
  148. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/learn_prompt.py +0 -0
  149. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/mesh_config.py +0 -0
  150. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/observer.py +0 -0
  151. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/__init__.py +0 -0
  152. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/collector.py +0 -0
  153. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/model.py +0 -0
  154. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/renderer_text.py +0 -0
  155. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/renderer_web.py +0 -0
  156. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/web/style.css +0 -0
  157. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/persistence.py +0 -0
  158. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/pidfile.py +0 -0
  159. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/__init__.py +0 -0
  160. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/commands.py +0 -0
  161. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/federation.md +0 -0
  162. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/history.md +0 -0
  163. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/icons.md +0 -0
  164. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/rooms.md +0 -0
  165. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/tags.md +0 -0
  166. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/threads.md +0 -0
  167. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/message.py +0 -0
  168. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/protocol-index.md +0 -0
  169. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/replies.py +0 -0
  170. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/skills/culture/SKILL.md +0 -0
  171. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agent-lifecycle.md +0 -0
  172. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agent-readiness.md +0 -0
  173. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agentic-self-learn.md +0 -0
  174. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agents/decentralized-config.md +0 -0
  175. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/agent-client.md +0 -0
  176. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/agent-harness-spec.md +0 -0
  177. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/design.md +0 -0
  178. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/harness-conformance.md +0 -0
  179. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/index.md +0 -0
  180. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer1-core-irc.md +0 -0
  181. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer2-attention.md +0 -0
  182. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer3-skills.md +0 -0
  183. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer4-federation.md +0 -0
  184. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer5-agent-harness.md +0 -0
  185. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/server-architecture.md +0 -0
  186. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/threads.md +0 -0
  187. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/channel-polling.md +0 -0
  188. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/acp/overview.md +0 -0
  189. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/acp/system-prompt.md +0 -0
  190. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/configuration.md +0 -0
  191. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/context-management.md +0 -0
  192. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/irc-tools.md +0 -0
  193. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/overview.md +0 -0
  194. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/setup.md +0 -0
  195. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/supervisor.md +0 -0
  196. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/webhooks.md +0 -0
  197. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/configuration.md +0 -0
  198. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/context-management.md +0 -0
  199. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/irc-tools.md +0 -0
  200. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/overview.md +0 -0
  201. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/setup.md +0 -0
  202. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/supervisor.md +0 -0
  203. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/webhooks.md +0 -0
  204. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/configuration.md +0 -0
  205. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/context-management.md +0 -0
  206. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/irc-tools.md +0 -0
  207. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/overview.md +0 -0
  208. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/setup.md +0 -0
  209. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/supervisor.md +0 -0
  210. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/webhooks.md +0 -0
  211. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/culture-cli.md +0 -0
  212. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/getting-started.md +0 -0
  213. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/index.md +0 -0
  214. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/SECURITY.md +0 -0
  215. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/bots.md +0 -0
  216. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/ci.md +0 -0
  217. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/cli.md +0 -0
  218. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/docs-site.md +0 -0
  219. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/index.md +0 -0
  220. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/ops-tooling.md +0 -0
  221. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/overview.md +0 -0
  222. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/publishing.md +0 -0
  223. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/persistent-history.md +0 -0
  224. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/reflective-development.md +0 -0
  225. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  226. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/rooms.md +0 -0
  227. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/server-rename.md +0 -0
  228. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  229. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  230. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  231. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  232. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  233. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  234. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  235. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  236. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  237. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
  238. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  239. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  240. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  241. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  242. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  243. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  244. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  245. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  246. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  247. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  248. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  249. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  250. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
  251. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
  252. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
  253. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
  254. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/01-pair-programming.md +0 -0
  255. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
  256. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
  257. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
  258. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/05-the-observer.md +0 -0
  259. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/06-cross-server-ops.md +0 -0
  260. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
  261. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/08-apps-as-agents.md +0 -0
  262. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/09-research-swarm.md +0 -0
  263. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/10-agent-lifecycle.md +0 -0
  264. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases-index.md +0 -0
  265. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/what-is-culture.md +0 -0
  266. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/favicon.ico +0 -0
  267. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/README.md +0 -0
  268. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/config.py +0 -0
  269. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/culture.yaml +0 -0
  270. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/daemon.py +0 -0
  271. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/ipc.py +0 -0
  272. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/irc_transport.py +0 -0
  273. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/message_buffer.py +0 -0
  274. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/skill/SKILL.md +0 -0
  275. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/skill/irc_client.py +0 -0
  276. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/socket_server.py +0 -0
  277. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/webhook.py +0 -0
  278. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  279. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  280. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  281. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  282. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/sonar-project.properties +0 -0
  283. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/__init__.py +0 -0
  284. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/conftest.py +0 -0
  285. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_acp_daemon.py +0 -0
  286. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_agent_runner.py +0 -0
  287. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bot.py +0 -0
  288. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bot_config.py +0 -0
  289. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bot_manager.py +0 -0
  290. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bots_integration.py +0 -0
  291. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_channel.py +0 -0
  292. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_channel_cli.py +0 -0
  293. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_codex_daemon.py +0 -0
  294. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_connection.py +0 -0
  295. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_client.py +0 -0
  296. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_commands.py +0 -0
  297. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_connection.py +0 -0
  298. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_icons.py +0 -0
  299. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_integration.py +0 -0
  300. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_copilot_daemon.py +0 -0
  301. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_credentials.py +0 -0
  302. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_culture_config.py +0 -0
  303. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_daemon.py +0 -0
  304. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_daemon_config.py +0 -0
  305. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_daemon_ipc.py +0 -0
  306. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_discovery.py +0 -0
  307. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_display.py +0 -0
  308. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_federation.py +0 -0
  309. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_history.py +0 -0
  310. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_http_listener.py +0 -0
  311. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_integration_layer5.py +0 -0
  312. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_ipc.py +0 -0
  313. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_irc_transport.py +0 -0
  314. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_learn_prompt.py +0 -0
  315. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_link_reconnect.py +0 -0
  316. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mention_alias.py +0 -0
  317. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mention_target_cleanup.py +0 -0
  318. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mention_warning.py +0 -0
  319. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mentions.py +0 -0
  320. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mesh_config.py +0 -0
  321. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mesh_readiness.py +0 -0
  322. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_message.py +0 -0
  323. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_message_buffer.py +0 -0
  324. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_messaging.py +0 -0
  325. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_modes.py +0 -0
  326. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_cli.py +0 -0
  327. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_collector.py +0 -0
  328. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_model.py +0 -0
  329. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_renderer.py +0 -0
  330. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_web.py +0 -0
  331. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_persistence.py +0 -0
  332. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_pidfile.py +0 -0
  333. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_poll_loop.py +0 -0
  334. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_register_cli.py +0 -0
  335. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_room_persistence.py +0 -0
  336. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_rooms.py +0 -0
  337. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_rooms_federation.py +0 -0
  338. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_rooms_integration.py +0 -0
  339. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_server_icon_skill.py +0 -0
  340. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_setup_update_cli.py +0 -0
  341. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_skill_client.py +0 -0
  342. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_skill_docs.py +0 -0
  343. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_skills.py +0 -0
  344. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_socket_server.py +0 -0
  345. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_supervisor.py +0 -0
  346. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_template_engine.py +0 -0
  347. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_thread_buffer.py +0 -0
  348. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_threads.py +0 -0
  349. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_virtual_client.py +0 -0
  350. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_wait_for_port.py +0 -0
  351. {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_webhook.py +0 -0
@@ -4,6 +4,15 @@ 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.1] - 2026-04-10
8
+
9
+
10
+ ### Fixed
11
+
12
+ - agent create/join/delete/archive/unarchive/rename crash with manifest-format server.yaml (#208)
13
+ - Auto-migrate legacy agents.yaml to manifest format on first load
14
+ - Server rename/archive/unarchive now work with manifest format
15
+
7
16
  ## [6.0.0] - 2026-04-10
8
17
 
9
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 6.0.0
3
+ Version: 6.0.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
@@ -12,12 +12,6 @@ from pathlib import Path
12
12
 
13
13
  import yaml
14
14
 
15
- from culture.clients.claude.config import (
16
- add_agent_to_config,
17
- archive_agent,
18
- remove_agent,
19
- unarchive_agent,
20
- )
21
15
  from culture.config import (
22
16
  AgentConfig,
23
17
  DaemonConfig,
@@ -26,13 +20,17 @@ from culture.config import (
26
20
  SupervisorConfig,
27
21
  WebhookConfig,
28
22
  add_to_manifest,
23
+ archive_manifest_agent,
29
24
  load_config,
30
25
  load_config_or_default,
31
26
  load_culture_yaml,
32
27
  remove_from_manifest,
28
+ remove_manifest_agent,
29
+ rename_manifest_agent,
33
30
  sanitize_agent_name,
34
31
  save_culture_yaml,
35
32
  save_server_config,
33
+ unarchive_manifest_agent,
36
34
  )
37
35
  from culture.pidfile import (
38
36
  is_process_alive,
@@ -198,9 +196,6 @@ def register(subparsers: argparse._SubParsersAction) -> None:
198
196
  "migrate", help="Migrate agents.yaml to server.yaml + culture.yaml"
199
197
  )
200
198
  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
199
 
205
200
 
206
201
  def dispatch(args: argparse.Namespace) -> None:
@@ -321,39 +316,73 @@ def _create_agent_config(args: argparse.Namespace, full_nick: str) -> AgentConfi
321
316
  return _create_default_config(full_nick, args.agent)
322
317
 
323
318
 
324
- def _cmd_create(args: argparse.Namespace) -> None:
325
- config = load_config_or_default(args.config)
319
+ def _check_existing_agent(config, full_nick: str, config_path: str) -> None:
320
+ """Check for duplicate agent nick. Removes archived duplicates; exits on active ones."""
321
+ for existing in config.agents:
322
+ if existing.nick != full_nick:
323
+ continue
324
+ if existing.archived:
325
+ print(f"Replacing archived agent '{full_nick}'")
326
+ remove_manifest_agent(config_path, full_nick)
327
+ return
328
+ channels = existing.channels if isinstance(existing.channels, list) else []
329
+ print(f"Agent '{full_nick}' already exists in config", file=sys.stderr)
330
+ print(f" Directory: {existing.directory}", file=sys.stderr)
331
+ print(f" Backend: {existing.agent}", file=sys.stderr)
332
+ print(f" Channels: {', '.join(channels)}", file=sys.stderr)
333
+ print(f" Model: {existing.model}", file=sys.stderr)
334
+ print(f" Config: {config_path}", file=sys.stderr)
335
+ print(file=sys.stderr)
336
+ print(f"Start with: culture agent start {full_nick}", file=sys.stderr)
337
+ sys.exit(1)
326
338
 
327
- server_name = args.server or config.server.name or "culture"
328
339
 
329
- if args.nick:
330
- suffix = args.nick
340
+ def _to_manifest_agent(raw_agent, suffix: str) -> AgentConfig:
341
+ """Convert a backend-specific AgentConfig to a manifest-format AgentConfig."""
342
+ backend = getattr(raw_agent, "backend", None) or getattr(raw_agent, "agent", "claude")
343
+ extras = {}
344
+ if hasattr(raw_agent, "acp_command") and backend == "acp":
345
+ extras["acp_command"] = raw_agent.acp_command
346
+ return AgentConfig(
347
+ suffix=suffix,
348
+ backend=backend,
349
+ channels=raw_agent.channels,
350
+ model=raw_agent.model,
351
+ directory=raw_agent.directory,
352
+ extras=extras,
353
+ )
354
+
355
+
356
+ def _save_agent_to_directory(agent: AgentConfig) -> None:
357
+ """Save agent to culture.yaml, merging with existing agents in the directory."""
358
+ culture_yaml_path = Path(agent.directory) / "culture.yaml"
359
+ if culture_yaml_path.exists():
360
+ existing = load_culture_yaml(agent.directory)
361
+ agents_to_save = [a for a in existing if a.suffix != agent.suffix]
362
+ agents_to_save.append(agent)
331
363
  else:
332
- dirname = os.path.basename(os.getcwd())
333
- suffix = sanitize_agent_name(dirname)
364
+ agents_to_save = [agent]
365
+ save_culture_yaml(agent.directory, agents_to_save)
366
+
334
367
 
368
+ def _cmd_create(args: argparse.Namespace) -> None:
369
+ config = load_config_or_default(args.config)
370
+
371
+ server_name = args.server or config.server.name or "culture"
372
+ suffix = args.nick or sanitize_agent_name(os.path.basename(os.getcwd()))
335
373
  full_nick = f"{server_name}-{suffix}"
336
374
 
337
- for existing in config.agents:
338
- if existing.nick == full_nick:
339
- if existing.archived:
340
- print(f"Replacing archived agent '{full_nick}'")
341
- remove_agent(args.config, full_nick)
342
- break
343
- channels = existing.channels if isinstance(existing.channels, list) else []
344
- print(f"Agent '{full_nick}' already exists in config", file=sys.stderr)
345
- print(f" Directory: {existing.directory}", file=sys.stderr)
346
- print(f" Backend: {existing.agent}", file=sys.stderr)
347
- print(f" Channels: {', '.join(channels)}", file=sys.stderr)
348
- print(f" Model: {existing.model}", file=sys.stderr)
349
- print(f" Config: {args.config}", file=sys.stderr)
350
- print(file=sys.stderr)
351
- print(f"Start with: culture agent start {full_nick}", file=sys.stderr)
352
- sys.exit(1)
375
+ _check_existing_agent(config, full_nick, args.config)
376
+
377
+ raw_agent = _create_agent_config(args, full_nick)
378
+ agent = _to_manifest_agent(raw_agent, suffix)
353
379
 
354
- agent = _create_agent_config(args, full_nick)
380
+ _save_agent_to_directory(agent)
381
+ add_to_manifest(args.config, suffix, agent.directory)
355
382
 
356
- add_agent_to_config(args.config, agent, server_name=server_name)
383
+ if args.server and args.server != config.server.name:
384
+ config.server.name = args.server
385
+ save_server_config(str(args.config), config)
357
386
 
358
387
  print(f"Agent created: {full_nick}")
359
388
  print(f" Directory: {agent.directory}")
@@ -717,11 +746,6 @@ def _cmd_status(args: argparse.Namespace) -> None:
717
746
 
718
747
  def _cmd_rename(args: argparse.Namespace) -> None:
719
748
  """Rename an agent's suffix within the same server."""
720
- from culture.clients.claude.config import (
721
- load_config_or_default,
722
- rename_agent,
723
- sanitize_agent_name,
724
- )
725
749
  from culture.pidfile import rename_pid
726
750
 
727
751
  config = load_config_or_default(args.config)
@@ -749,7 +773,7 @@ def _cmd_rename(args: argparse.Namespace) -> None:
749
773
  return
750
774
 
751
775
  try:
752
- rename_agent(args.config, old_nick, new_nick)
776
+ rename_manifest_agent(args.config, old_nick, new_nick)
753
777
  except ValueError as exc:
754
778
  print(str(exc), file=sys.stderr)
755
779
  sys.exit(1)
@@ -765,11 +789,6 @@ def _cmd_rename(args: argparse.Namespace) -> None:
765
789
 
766
790
  def _cmd_assign(args: argparse.Namespace) -> None:
767
791
  """Move an agent to a different server (change nick prefix)."""
768
- from culture.clients.claude.config import (
769
- load_config_or_default,
770
- rename_agent,
771
- sanitize_agent_name,
772
- )
773
792
  from culture.pidfile import rename_pid
774
793
 
775
794
  config = load_config_or_default(args.config)
@@ -799,7 +818,7 @@ def _cmd_assign(args: argparse.Namespace) -> None:
799
818
  return
800
819
 
801
820
  try:
802
- rename_agent(args.config, old_nick, new_nick)
821
+ rename_manifest_agent(args.config, old_nick, new_nick)
803
822
  except ValueError as exc:
804
823
  print(str(exc), file=sys.stderr)
805
824
  sys.exit(1)
@@ -941,7 +960,7 @@ def _cmd_archive(args: argparse.Namespace) -> None:
941
960
  if pid and is_process_alive(pid):
942
961
  stop_agent(args.nick)
943
962
 
944
- archive_agent(args.config, args.nick, reason=args.reason)
963
+ archive_manifest_agent(args.config, args.nick, reason=args.reason)
945
964
 
946
965
  print(f"Agent archived: {args.nick}")
947
966
  if args.reason:
@@ -952,7 +971,7 @@ def _cmd_archive(args: argparse.Namespace) -> None:
952
971
  def _cmd_unarchive(args: argparse.Namespace) -> None:
953
972
  """Restore an archived agent."""
954
973
  try:
955
- unarchive_agent(args.config, args.nick)
974
+ unarchive_manifest_agent(args.config, args.nick)
956
975
  except ValueError as exc:
957
976
  print(str(exc), file=sys.stderr)
958
977
  sys.exit(1)
@@ -974,7 +993,7 @@ def _cmd_delete(args: argparse.Namespace) -> None:
974
993
  if pid and is_process_alive(pid):
975
994
  stop_agent(args.nick)
976
995
 
977
- remove_agent(args.config, args.nick)
996
+ remove_manifest_agent(args.config, args.nick)
978
997
  print(f"Agent deleted: {args.nick}")
979
998
 
980
999
 
@@ -1044,77 +1063,21 @@ def _cmd_unregister(args: argparse.Namespace) -> None:
1044
1063
 
1045
1064
  def _cmd_migrate(args: argparse.Namespace) -> None:
1046
1065
  """Migrate from agents.yaml to server.yaml + per-directory culture.yaml."""
1066
+ from culture.config import _is_legacy_format, migrate_legacy_to_manifest
1067
+
1047
1068
  legacy_path = Path(args.config)
1048
1069
  if not legacy_path.exists():
1049
1070
  print(f"No agents.yaml found at {legacy_path}", file=sys.stderr)
1050
1071
  sys.exit(1)
1051
1072
 
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
- )
1073
+ if not _is_legacy_format(legacy_path):
1074
+ print(f"{legacy_path} is already in manifest format", file=sys.stderr)
1075
+ sys.exit(1)
1076
+
1077
+ config = migrate_legacy_to_manifest(legacy_path)
1109
1078
 
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")
1079
+ agent_count = len(config.manifest)
1080
+ dir_count = len(set(config.manifest.values()))
1081
+ print(f"\nMigration complete: {agent_count} agent(s) across {dir_count} directory(ies)")
1082
+ print(f"\nAgent commands now use {legacy_path} by default.")
1083
+ print("Verify with: culture agent status")
@@ -191,7 +191,7 @@ def dispatch(args: argparse.Namespace) -> None:
191
191
 
192
192
  def _server_rename(args: argparse.Namespace) -> None:
193
193
  """Rename the server: update config, agent nicks, and PID files."""
194
- from culture.clients.claude.config import rename_server, sanitize_agent_name
194
+ from culture.config import rename_manifest_server, sanitize_agent_name
195
195
  from culture.pidfile import (
196
196
  is_process_alive,
197
197
  read_default_server,
@@ -207,7 +207,7 @@ def _server_rename(args: argparse.Namespace) -> None:
207
207
  sys.exit(1)
208
208
 
209
209
  try:
210
- old_name, renamed = rename_server(args.config, new_name)
210
+ old_name, renamed = rename_manifest_server(args.config, new_name)
211
211
  except ValueError as exc:
212
212
  print(str(exc), file=sys.stderr)
213
213
  sys.exit(1)
@@ -578,10 +578,7 @@ def _set_bots_archive_state(agent_nicks: set, *, archive: bool, reason: str = ""
578
578
 
579
579
  def _server_archive(args: argparse.Namespace) -> None:
580
580
  """Archive the server and cascade to all agents and bots."""
581
- from culture.clients.claude.config import (
582
- archive_server,
583
- load_config_or_default,
584
- )
581
+ from culture.config import archive_manifest_server, load_config_or_default
585
582
 
586
583
  config = load_config_or_default(args.config)
587
584
  server_name = _validate_config_name(config, args.name)
@@ -606,7 +603,7 @@ def _server_archive(args: argparse.Namespace) -> None:
606
603
  stop_agent(agent.nick)
607
604
 
608
605
  # Archive server + agents in config
609
- archived_nicks = archive_server(args.config, reason=args.reason)
606
+ archived_nicks = archive_manifest_server(args.config, reason=args.reason)
610
607
 
611
608
  # Archive bots whose owner matches any agent on this server
612
609
  agent_nicks = {a.nick for a in config.agents}
@@ -624,10 +621,7 @@ def _server_archive(args: argparse.Namespace) -> None:
624
621
 
625
622
  def _server_unarchive(args: argparse.Namespace) -> None:
626
623
  """Restore an archived server and cascade to agents and bots."""
627
- from culture.clients.claude.config import (
628
- load_config_or_default,
629
- unarchive_server,
630
- )
624
+ from culture.config import load_config_or_default, unarchive_manifest_server
631
625
 
632
626
  config = load_config_or_default(args.config)
633
627
  server_name = _validate_config_name(config, args.name)
@@ -637,7 +631,7 @@ def _server_unarchive(args: argparse.Namespace) -> None:
637
631
  sys.exit(1)
638
632
 
639
633
  # Unarchive server + agents
640
- unarchived_nicks = unarchive_server(args.config)
634
+ unarchived_nicks = unarchive_manifest_server(args.config)
641
635
 
642
636
  # Unarchive bots whose owner matches any agent on this server
643
637
  agent_nicks = {a.nick for a in config.agents}