agentirc-cli 4.2.1__tar.gz → 4.3.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 (310) hide show
  1. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.github/workflows/pages.yml +6 -5
  2. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.github/workflows/publish.yml +2 -3
  3. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.github/workflows/security-checks.yml +2 -3
  4. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.github/workflows/tests.yml +2 -3
  5. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/CHANGELOG.md +20 -0
  6. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/PKG-INFO +1 -1
  7. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/bot_manager.py +1 -1
  8. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/agent.py +31 -3
  9. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/mesh.py +1 -1
  10. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/server.py +1 -1
  11. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/config.py +27 -0
  12. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/config.py +27 -0
  13. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/config.py +27 -0
  14. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/config.py +27 -0
  15. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/client.py +3 -3
  16. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +52 -0
  17. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/config.py +27 -0
  18. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/pyproject.toml +1 -1
  19. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_archive.py +405 -0
  20. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/uv.lock +1 -1
  21. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.claude/skills/pr-review/SKILL.md +0 -0
  22. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.claude/skills/run-tests/SKILL.md +0 -0
  23. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  24. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.flake8 +0 -0
  25. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.gitignore +0 -0
  26. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.markdownlint-cli2.yaml +0 -0
  27. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.pr_agent.toml +0 -0
  28. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.pre-commit-config.yaml +0 -0
  29. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/.pylintrc +0 -0
  30. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/CLAUDE.md +0 -0
  31. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/CNAME +0 -0
  32. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/Gemfile +0 -0
  33. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/Gemfile.lock +0 -0
  34. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/LICENSE +0 -0
  35. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/README.md +0 -0
  36. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/SECURITY.md +0 -0
  37. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/_config.yml +0 -0
  38. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/_sass/color_schemes/anthropic.scss +0 -0
  39. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/_sass/custom/custom.scss +0 -0
  40. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/__init__.py +0 -0
  41. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/__main__.py +0 -0
  42. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/aio.py +0 -0
  43. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/__init__.py +0 -0
  44. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/bot.py +0 -0
  45. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/config.py +0 -0
  46. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/http_listener.py +0 -0
  47. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/template_engine.py +0 -0
  48. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/bots/virtual_client.py +0 -0
  49. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/__init__.py +0 -0
  50. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/_helpers.py +0 -0
  51. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/bot.py +0 -0
  52. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/channel.py +0 -0
  53. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/cli/skills.py +0 -0
  54. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/__init__.py +0 -0
  55. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/__init__.py +0 -0
  56. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/agent_runner.py +0 -0
  57. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/daemon.py +0 -0
  58. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/ipc.py +0 -0
  59. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/irc_transport.py +0 -0
  60. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/message_buffer.py +0 -0
  61. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/skill/SKILL.md +0 -0
  62. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/skill/__init__.py +0 -0
  63. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/skill/irc_client.py +0 -0
  64. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/socket_server.py +0 -0
  65. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/supervisor.py +0 -0
  66. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/acp/webhook.py +0 -0
  67. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/__init__.py +0 -0
  68. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/__main__.py +0 -0
  69. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/agent_runner.py +0 -0
  70. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/daemon.py +0 -0
  71. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/ipc.py +0 -0
  72. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/irc_transport.py +0 -0
  73. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/message_buffer.py +0 -0
  74. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/skill/SKILL.md +0 -0
  75. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/skill/__init__.py +0 -0
  76. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/skill/irc_client.py +0 -0
  77. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/socket_server.py +0 -0
  78. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/supervisor.py +0 -0
  79. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/claude/webhook.py +0 -0
  80. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/__init__.py +0 -0
  81. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/agent_runner.py +0 -0
  82. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/daemon.py +0 -0
  83. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/ipc.py +0 -0
  84. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/irc_transport.py +0 -0
  85. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/message_buffer.py +0 -0
  86. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/skill/SKILL.md +0 -0
  87. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/skill/__init__.py +0 -0
  88. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/skill/irc_client.py +0 -0
  89. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/socket_server.py +0 -0
  90. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/supervisor.py +0 -0
  91. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/codex/webhook.py +0 -0
  92. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/__init__.py +0 -0
  93. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/agent_runner.py +0 -0
  94. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/daemon.py +0 -0
  95. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/ipc.py +0 -0
  96. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/irc_transport.py +0 -0
  97. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/message_buffer.py +0 -0
  98. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/skill/SKILL.md +0 -0
  99. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/skill/__init__.py +0 -0
  100. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/skill/irc_client.py +0 -0
  101. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/socket_server.py +0 -0
  102. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/supervisor.py +0 -0
  103. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/clients/copilot/webhook.py +0 -0
  104. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/__init__.py +0 -0
  105. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/app.py +0 -0
  106. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/commands.py +0 -0
  107. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/widgets/__init__.py +0 -0
  108. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/widgets/chat.py +0 -0
  109. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/widgets/info_panel.py +0 -0
  110. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/console/widgets/sidebar.py +0 -0
  111. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/credentials.py +0 -0
  112. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/learn_prompt.py +0 -0
  113. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/mesh_config.py +0 -0
  114. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/observer.py +0 -0
  115. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/overview/__init__.py +0 -0
  116. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/overview/collector.py +0 -0
  117. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/overview/model.py +0 -0
  118. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/overview/renderer_text.py +0 -0
  119. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/overview/renderer_web.py +0 -0
  120. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/overview/web/style.css +0 -0
  121. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/persistence.py +0 -0
  122. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/pidfile.py +0 -0
  123. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/__init__.py +0 -0
  124. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/commands.py +0 -0
  125. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/extensions/federation.md +0 -0
  126. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/extensions/history.md +0 -0
  127. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/extensions/icons.md +0 -0
  128. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/extensions/rooms.md +0 -0
  129. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/extensions/tags.md +0 -0
  130. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/extensions/threads.md +0 -0
  131. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/message.py +0 -0
  132. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/protocol-index.md +0 -0
  133. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/protocol/replies.py +0 -0
  134. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/__init__.py +0 -0
  135. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/__main__.py +0 -0
  136. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/channel.py +0 -0
  137. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/client.py +0 -0
  138. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/config.py +0 -0
  139. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/ircd.py +0 -0
  140. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/remote_client.py +0 -0
  141. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/room_store.py +0 -0
  142. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/rooms_util.py +0 -0
  143. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/server_link.py +0 -0
  144. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/skill.py +0 -0
  145. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/skills/__init__.py +0 -0
  146. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/skills/history.py +0 -0
  147. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/skills/icon.py +0 -0
  148. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/skills/rooms.py +0 -0
  149. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/skills/threads.py +0 -0
  150. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/server/thread_store.py +0 -0
  151. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/culture/skills/culture/SKILL.md +0 -0
  152. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/agent-lifecycle.md +0 -0
  153. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/agentic-self-learn.md +0 -0
  154. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/agent-client.md +0 -0
  155. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/agent-harness-spec.md +0 -0
  156. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/design.md +0 -0
  157. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/harness-conformance.md +0 -0
  158. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/index.md +0 -0
  159. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/layer1-core-irc.md +0 -0
  160. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/layer2-attention.md +0 -0
  161. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/layer3-skills.md +0 -0
  162. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/layer4-federation.md +0 -0
  163. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/layer5-agent-harness.md +0 -0
  164. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/server-architecture.md +0 -0
  165. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/architecture/threads.md +0 -0
  166. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/channel-polling.md +0 -0
  167. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/acp/overview.md +0 -0
  168. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/configuration.md +0 -0
  169. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/context-management.md +0 -0
  170. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/irc-tools.md +0 -0
  171. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/overview.md +0 -0
  172. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/setup.md +0 -0
  173. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/supervisor.md +0 -0
  174. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/claude/webhooks.md +0 -0
  175. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/configuration.md +0 -0
  176. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/context-management.md +0 -0
  177. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/irc-tools.md +0 -0
  178. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/overview.md +0 -0
  179. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/setup.md +0 -0
  180. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/supervisor.md +0 -0
  181. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/codex/webhooks.md +0 -0
  182. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/configuration.md +0 -0
  183. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/context-management.md +0 -0
  184. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/irc-tools.md +0 -0
  185. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/overview.md +0 -0
  186. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/setup.md +0 -0
  187. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/supervisor.md +0 -0
  188. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/clients/copilot/webhooks.md +0 -0
  189. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/culture-cli.md +0 -0
  190. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/getting-started.md +0 -0
  191. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/index.md +0 -0
  192. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/SECURITY.md +0 -0
  193. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/bots.md +0 -0
  194. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/ci.md +0 -0
  195. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/cli.md +0 -0
  196. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/docs-site.md +0 -0
  197. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/index.md +0 -0
  198. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/ops-tooling.md +0 -0
  199. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/overview.md +0 -0
  200. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/operations/publishing.md +0 -0
  201. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  202. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/rooms.md +0 -0
  203. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/server-rename.md +0 -0
  204. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  205. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  206. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  207. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  208. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  209. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  210. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  211. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  212. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  213. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  214. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  215. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  216. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  217. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  218. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  219. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  220. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  221. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  222. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  223. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  224. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  225. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/01-pair-programming.md +0 -0
  226. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
  227. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
  228. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
  229. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/05-the-observer.md +0 -0
  230. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/06-cross-server-ops.md +0 -0
  231. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
  232. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/08-apps-as-agents.md +0 -0
  233. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/09-research-swarm.md +0 -0
  234. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases/10-agent-lifecycle.md +0 -0
  235. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/use-cases-index.md +0 -0
  236. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/docs/what-is-culture.md +0 -0
  237. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/README.md +0 -0
  238. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/daemon.py +0 -0
  239. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/ipc.py +0 -0
  240. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/irc_transport.py +0 -0
  241. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/message_buffer.py +0 -0
  242. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/skill/SKILL.md +0 -0
  243. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/skill/irc_client.py +0 -0
  244. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/socket_server.py +0 -0
  245. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/packages/agent-harness/webhook.py +0 -0
  246. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  247. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  248. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  249. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  250. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/sonar-project.properties +0 -0
  251. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/__init__.py +0 -0
  252. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/conftest.py +0 -0
  253. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_acp_daemon.py +0 -0
  254. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_agent_runner.py +0 -0
  255. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_bot.py +0 -0
  256. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_bot_config.py +0 -0
  257. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_bot_manager.py +0 -0
  258. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_bots_integration.py +0 -0
  259. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_channel.py +0 -0
  260. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_codex_daemon.py +0 -0
  261. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_connection.py +0 -0
  262. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_console_client.py +0 -0
  263. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_console_commands.py +0 -0
  264. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_console_connection.py +0 -0
  265. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_console_icons.py +0 -0
  266. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_console_integration.py +0 -0
  267. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_copilot_daemon.py +0 -0
  268. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_daemon.py +0 -0
  269. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_daemon_config.py +0 -0
  270. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_daemon_ipc.py +0 -0
  271. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_discovery.py +0 -0
  272. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_federation.py +0 -0
  273. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_history.py +0 -0
  274. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_http_listener.py +0 -0
  275. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_integration_layer5.py +0 -0
  276. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_ipc.py +0 -0
  277. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_irc_transport.py +0 -0
  278. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_link_reconnect.py +0 -0
  279. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_mention_alias.py +0 -0
  280. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_mention_target_cleanup.py +0 -0
  281. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_mentions.py +0 -0
  282. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_mesh_config.py +0 -0
  283. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_message.py +0 -0
  284. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_message_buffer.py +0 -0
  285. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_messaging.py +0 -0
  286. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_modes.py +0 -0
  287. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_overview_cli.py +0 -0
  288. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_overview_collector.py +0 -0
  289. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_overview_model.py +0 -0
  290. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_overview_renderer.py +0 -0
  291. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_overview_web.py +0 -0
  292. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_persistence.py +0 -0
  293. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_pidfile.py +0 -0
  294. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_poll_loop.py +0 -0
  295. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_room_persistence.py +0 -0
  296. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_rooms.py +0 -0
  297. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_rooms_federation.py +0 -0
  298. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_rooms_integration.py +0 -0
  299. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_server_icon_skill.py +0 -0
  300. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_setup_update_cli.py +0 -0
  301. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_skill_client.py +0 -0
  302. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_skills.py +0 -0
  303. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_socket_server.py +0 -0
  304. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_supervisor.py +0 -0
  305. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_template_engine.py +0 -0
  306. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_thread_buffer.py +0 -0
  307. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_threads.py +0 -0
  308. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_virtual_client.py +0 -0
  309. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_wait_for_port.py +0 -0
  310. {agentirc_cli-4.2.1 → agentirc_cli-4.3.1}/tests/test_webhook.py +0 -0
@@ -5,11 +5,6 @@ on:
5
5
  branches: ["main"]
6
6
  workflow_dispatch:
7
7
 
8
- permissions:
9
- contents: read
10
- pages: write
11
- id-token: write
12
-
13
8
  concurrency:
14
9
  group: "pages"
15
10
  cancel-in-progress: false
@@ -17,6 +12,9 @@ concurrency:
17
12
  jobs:
18
13
  build:
19
14
  runs-on: ubuntu-latest
15
+ permissions:
16
+ contents: read
17
+ pages: write
20
18
  steps:
21
19
  - name: Checkout
22
20
  uses: actions/checkout@v4
@@ -46,6 +44,9 @@ jobs:
46
44
  url: ${{ steps.deployment.outputs.page_url }}
47
45
  runs-on: ubuntu-latest
48
46
  needs: build
47
+ permissions:
48
+ pages: write
49
+ id-token: write
49
50
  steps:
50
51
  - name: Deploy to GitHub Pages
51
52
  id: deployment
@@ -12,12 +12,11 @@ on:
12
12
  - "pyproject.toml"
13
13
  - "culture/**"
14
14
 
15
- permissions:
16
- contents: read
17
-
18
15
  jobs:
19
16
  test:
20
17
  runs-on: ubuntu-latest
18
+ permissions:
19
+ contents: read
21
20
  steps:
22
21
  - uses: actions/checkout@v4
23
22
 
@@ -9,13 +9,12 @@ on:
9
9
  - cron: '0 0 * * 0' # Weekly on Sunday at midnight
10
10
  workflow_dispatch:
11
11
 
12
- permissions:
13
- contents: read
14
-
15
12
  jobs:
16
13
  security-scans:
17
14
  name: Security Scans
18
15
  runs-on: ubuntu-latest
16
+ permissions:
17
+ contents: read
19
18
  steps:
20
19
  - uses: actions/checkout@v4
21
20
 
@@ -4,12 +4,11 @@ on:
4
4
  pull_request:
5
5
  branches: [main]
6
6
 
7
- permissions:
8
- contents: read
9
-
10
7
  jobs:
11
8
  test:
12
9
  runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
13
12
  steps:
14
13
  - uses: actions/checkout@v4
15
14
 
@@ -4,6 +4,26 @@ 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.3.1] - 2026-04-07
8
+
9
+
10
+ ### Fixed
11
+
12
+ - Remove unnecessary list() wrapping on already-iterable values (SonarCloud S7504/S7494)
13
+
14
+ ## [4.3.0] - 2026-04-07
15
+
16
+
17
+ ### Added
18
+
19
+ - agent delete command to remove agents from config entirely
20
+ - agent create now overwrites archived agents, enabling harness/model migration
21
+
22
+
23
+ ### Fixed
24
+
25
+ - agent create no longer blocks when the matching nick is archived
26
+
7
27
  ## [4.2.1] - 2026-04-07
8
28
 
9
29
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 4.2.1
3
+ Version: 4.3.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
@@ -86,7 +86,7 @@ class BotManager:
86
86
 
87
87
  def list_bots(self, owner: str | None = None) -> list[Bot]:
88
88
  """List bots, optionally filtered by owner."""
89
- bots = list(self.bots.values())
89
+ bots = self.bots.values()
90
90
  if owner:
91
91
  bots = [b for b in bots if b.config.owner == owner]
92
92
  return sorted(bots, key=lambda b: b.name)
@@ -16,6 +16,7 @@ from culture.clients.claude.config import (
16
16
  archive_agent,
17
17
  load_config,
18
18
  load_config_or_default,
19
+ remove_agent,
19
20
  sanitize_agent_name,
20
21
  unarchive_agent,
21
22
  )
@@ -158,11 +159,16 @@ def register(subparsers: argparse._SubParsersAction) -> None:
158
159
  unarchive_parser.add_argument("nick", help="Agent nick to unarchive")
159
160
  unarchive_parser.add_argument("--config", default=DEFAULT_CONFIG, help=_CONFIG_HELP)
160
161
 
162
+ # -- delete ---------------------------------------------------------------
163
+ delete_parser = agent_sub.add_parser("delete", help="Remove an agent from config entirely")
164
+ delete_parser.add_argument("nick", help="Agent nick to delete")
165
+ delete_parser.add_argument("--config", default=DEFAULT_CONFIG, help=_CONFIG_HELP)
166
+
161
167
 
162
168
  def dispatch(args: argparse.Namespace) -> None:
163
169
  if not args.agent_command:
164
170
  print(
165
- "Usage: culture agent {create|join|start|stop|status|rename|assign|sleep|wake|learn|message|read|archive|unarchive}",
171
+ "Usage: culture agent {create|join|start|stop|status|rename|assign|sleep|wake|learn|message|read|archive|unarchive|delete}",
166
172
  file=sys.stderr,
167
173
  )
168
174
  sys.exit(1)
@@ -182,6 +188,7 @@ def dispatch(args: argparse.Namespace) -> None:
182
188
  "read": _cmd_read,
183
189
  "archive": _cmd_archive,
184
190
  "unarchive": _cmd_unarchive,
191
+ "delete": _cmd_delete,
185
192
  }
186
193
  handler = handlers.get(args.agent_command)
187
194
  if handler:
@@ -264,6 +271,10 @@ def _cmd_create(args: argparse.Namespace) -> None:
264
271
 
265
272
  for existing in config.agents:
266
273
  if existing.nick == full_nick:
274
+ if existing.archived:
275
+ print(f"Replacing archived agent '{full_nick}'")
276
+ remove_agent(args.config, full_nick)
277
+ break
267
278
  channels = existing.channels if isinstance(existing.channels, list) else []
268
279
  print(f"Agent '{full_nick}' already exists in config", file=sys.stderr)
269
280
  print(f" Directory: {existing.directory}", file=sys.stderr)
@@ -437,10 +448,10 @@ async def _run_single_agent(config: DaemonConfig, agent: AgentConfig) -> None:
437
448
  agent="acp",
438
449
  acp_command=getattr(agent, "acp_command", None) or ["opencode", "acp"],
439
450
  directory=agent.directory,
440
- channels=list(agent.channels),
451
+ channels=agent.channels,
441
452
  model=agent.model,
442
453
  system_prompt=agent.system_prompt,
443
- tags=list(agent.tags),
454
+ tags=agent.tags,
444
455
  )
445
456
  else:
446
457
  acp_agent = agent
@@ -831,3 +842,20 @@ def _cmd_unarchive(args: argparse.Namespace) -> None:
831
842
 
832
843
  print(f"Agent unarchived: {args.nick}")
833
844
  print(f"\nStart with: culture agent start {args.nick}")
845
+
846
+
847
+ def _cmd_delete(args: argparse.Namespace) -> None:
848
+ """Remove an agent from config entirely."""
849
+ config = load_config_or_default(args.config)
850
+ agent = config.get_agent(args.nick)
851
+ if not agent:
852
+ print(f"Agent '{args.nick}' not found in config", file=sys.stderr)
853
+ sys.exit(1)
854
+
855
+ # Stop the agent if it's running
856
+ pid = read_pid(f"agent-{args.nick}")
857
+ if pid and is_process_alive(pid):
858
+ stop_agent(args.nick)
859
+
860
+ remove_agent(args.config, args.nick)
861
+ print(f"Agent deleted: {args.nick}")
@@ -324,7 +324,7 @@ def _generate_agent_configs(mesh, server_name: str) -> None:
324
324
  nick=full_nick,
325
325
  agent=a.type,
326
326
  directory=workdir,
327
- channels=list(a.channels),
327
+ channels=a.channels,
328
328
  )
329
329
  )
330
330
 
@@ -230,7 +230,7 @@ def _server_start(args: argparse.Namespace) -> None:
230
230
  print(f"Server '{args.name}' is already running (PID {existing})")
231
231
  sys.exit(1)
232
232
 
233
- links = list(args.link)
233
+ links = args.link
234
234
  if getattr(args, "mesh_config", None):
235
235
  links = resolve_links_from_mesh(args.mesh_config)
236
236
 
@@ -248,3 +248,30 @@ def rename_agent(
248
248
  return
249
249
 
250
250
  raise ValueError(f"agent {old_nick!r} not found in config")
251
+
252
+
253
+ def remove_agent(
254
+ path: str | Path,
255
+ nick: str,
256
+ ) -> None:
257
+ """Remove an agent from config entirely.
258
+
259
+ Operates on raw YAML to preserve backend-specific fields on other
260
+ agents that the typed schema would strip.
261
+ Raises ValueError if the agent is not found.
262
+ """
263
+ path = Path(path)
264
+ if not path.exists():
265
+ raise ValueError(f"agent {nick!r} not found in config")
266
+
267
+ with open(path) as f:
268
+ raw = yaml.safe_load(f) or {}
269
+
270
+ agents = raw.get("agents", [])
271
+ for i, agent_raw in enumerate(agents):
272
+ if agent_raw.get("nick") == nick:
273
+ agents.pop(i)
274
+ with open(path, "w") as f:
275
+ yaml.dump(raw, f, default_flow_style=False, sort_keys=False)
276
+ return
277
+ raise ValueError(f"agent {nick!r} not found in config")
@@ -303,6 +303,33 @@ def unarchive_agent(
303
303
  raise ValueError(f"agent {nick!r} not found in config")
304
304
 
305
305
 
306
+ def remove_agent(
307
+ path: str | Path,
308
+ nick: str,
309
+ ) -> None:
310
+ """Remove an agent from config entirely.
311
+
312
+ Operates on raw YAML to preserve backend-specific fields (e.g.
313
+ acp_command) on other agents that the typed schema would strip.
314
+ Raises ValueError if the agent is not found.
315
+ """
316
+ path = Path(path)
317
+ if not path.exists():
318
+ raise ValueError(f"agent {nick!r} not found in config")
319
+
320
+ with open(path) as f:
321
+ raw = yaml.safe_load(f) or {}
322
+
323
+ agents = raw.get("agents", [])
324
+ for i, agent_raw in enumerate(agents):
325
+ if agent_raw.get("nick") == nick:
326
+ agents.pop(i)
327
+ with open(path, "w") as f:
328
+ yaml.dump(raw, f, default_flow_style=False, sort_keys=False)
329
+ return
330
+ raise ValueError(f"agent {nick!r} not found in config")
331
+
332
+
306
333
  def archive_server(
307
334
  path: str | Path,
308
335
  reason: str = "",
@@ -248,3 +248,30 @@ def rename_agent(
248
248
  return
249
249
 
250
250
  raise ValueError(f"agent {old_nick!r} not found in config")
251
+
252
+
253
+ def remove_agent(
254
+ path: str | Path,
255
+ nick: str,
256
+ ) -> None:
257
+ """Remove an agent from config entirely.
258
+
259
+ Operates on raw YAML to preserve backend-specific fields on other
260
+ agents that the typed schema would strip.
261
+ Raises ValueError if the agent is not found.
262
+ """
263
+ path = Path(path)
264
+ if not path.exists():
265
+ raise ValueError(f"agent {nick!r} not found in config")
266
+
267
+ with open(path) as f:
268
+ raw = yaml.safe_load(f) or {}
269
+
270
+ agents = raw.get("agents", [])
271
+ for i, agent_raw in enumerate(agents):
272
+ if agent_raw.get("nick") == nick:
273
+ agents.pop(i)
274
+ with open(path, "w") as f:
275
+ yaml.dump(raw, f, default_flow_style=False, sort_keys=False)
276
+ return
277
+ raise ValueError(f"agent {nick!r} not found in config")
@@ -248,3 +248,30 @@ def rename_agent(
248
248
  return
249
249
 
250
250
  raise ValueError(f"agent {old_nick!r} not found in config")
251
+
252
+
253
+ def remove_agent(
254
+ path: str | Path,
255
+ nick: str,
256
+ ) -> None:
257
+ """Remove an agent from config entirely.
258
+
259
+ Operates on raw YAML to preserve backend-specific fields on other
260
+ agents that the typed schema would strip.
261
+ Raises ValueError if the agent is not found.
262
+ """
263
+ path = Path(path)
264
+ if not path.exists():
265
+ raise ValueError(f"agent {nick!r} not found in config")
266
+
267
+ with open(path) as f:
268
+ raw = yaml.safe_load(f) or {}
269
+
270
+ agents = raw.get("agents", [])
271
+ for i, agent_raw in enumerate(agents):
272
+ if agent_raw.get("nick") == nick:
273
+ agents.pop(i)
274
+ with open(path, "w") as f:
275
+ yaml.dump(raw, f, default_flow_style=False, sort_keys=False)
276
+ return
277
+ raise ValueError(f"agent {nick!r} not found in config")
@@ -199,7 +199,7 @@ class ConsoleIRCClient:
199
199
  finally:
200
200
  self._pending.pop("323", None)
201
201
 
202
- channels = list(self._collect_buffers.pop(key, []))
202
+ channels = self._collect_buffers.pop(key, [])
203
203
  return sorted(channels)
204
204
 
205
205
  async def who(self, target: str) -> list[dict]:
@@ -221,7 +221,7 @@ class ConsoleIRCClient:
221
221
  finally:
222
222
  self._pending.pop(f"315:{target}", None)
223
223
 
224
- entries = list(self._collect_buffers.pop(key, []))
224
+ entries = self._collect_buffers.pop(key, [])
225
225
  return entries
226
226
 
227
227
  async def history(self, channel: str, limit: int = 50) -> list[dict]:
@@ -243,7 +243,7 @@ class ConsoleIRCClient:
243
243
  finally:
244
244
  self._pending.pop(f"HISTORYEND:{channel}", None)
245
245
 
246
- entries = list(self._collect_buffers.pop(key, []))
246
+ entries = self._collect_buffers.pop(key, [])
247
247
  return entries
248
248
 
249
249
  # ------------------------------------------------------------------
@@ -238,6 +238,58 @@ per-file (no list to search through).
238
238
  - `test_start_refuses_archived_server` -- verify error message
239
239
  - `test_start_all_skips_archived` -- verify `--all` only starts active agents
240
240
 
241
+ ## Agent Deletion and Create-Overwrite
242
+
243
+ ### Problem
244
+
245
+ Once an agent is archived, there's no way to recreate it with a different
246
+ backend or model. `culture agent create` blocks with "already exists in config"
247
+ because the archived entry is still present. Users must manually edit
248
+ `agents.yaml` to change an agent's harness.
249
+
250
+ ### Delete Command
251
+
252
+ ```
253
+ culture agent delete <nick> [--config PATH]
254
+ ```
255
+
256
+ Removes an agent from config entirely. Stops the agent if running.
257
+
258
+ ### Create Overwrites Archived Agents
259
+
260
+ `culture agent create` now detects when the matching agent is archived and
261
+ automatically replaces it:
262
+
263
+ ```
264
+ $ culture agent archive spark-daria
265
+ Agent archived: spark-daria
266
+
267
+ $ culture agent create --server spark --nick daria --agent acp
268
+ Replacing archived agent 'spark-daria'
269
+ Agent created: spark-daria
270
+ ...
271
+ ```
272
+
273
+ Non-archived agents still block `create` with the existing error. This is the
274
+ primary mechanism for moving an agent to a different harness or model.
275
+
276
+ ### Config Layer
277
+
278
+ ```python
279
+ def remove_agent(path, nick):
280
+ """Remove an agent from config entirely. Raises ValueError if not found."""
281
+ ```
282
+
283
+ Added to all backend config files (`claude`, `acp`, `codex`, `copilot`) and
284
+ `packages/agent-harness/config.py`. Uses raw YAML manipulation to preserve
285
+ backend-specific fields (e.g. `acp_command`) on other agents.
286
+
287
+ ### Protocol Details
288
+
289
+ No new protocol changes. Delete and create-overwrite are CLI/config operations
290
+ only, consistent with the existing archiving scope (CLI-only, no federation
291
+ concern).
292
+
241
293
  ## Verification
242
294
 
243
295
  1. Create test agents: `culture agent create --nick test1 && culture agent create --nick test2`
@@ -246,3 +246,30 @@ def rename_agent(
246
246
  return
247
247
 
248
248
  raise ValueError(f"agent {old_nick!r} not found in config")
249
+
250
+
251
+ def remove_agent(
252
+ path: str | Path,
253
+ nick: str,
254
+ ) -> None:
255
+ """Remove an agent from config entirely.
256
+
257
+ Operates on raw YAML to preserve backend-specific fields on other
258
+ agents that the typed schema would strip.
259
+ Raises ValueError if the agent is not found.
260
+ """
261
+ path = Path(path)
262
+ if not path.exists():
263
+ raise ValueError(f"agent {nick!r} not found in config")
264
+
265
+ with open(path) as f:
266
+ raw = yaml.safe_load(f) or {}
267
+
268
+ agents = raw.get("agents", [])
269
+ for i, agent_raw in enumerate(agents):
270
+ if agent_raw.get("nick") == nick:
271
+ agents.pop(i)
272
+ with open(path, "w") as f:
273
+ yaml.dump(raw, f, default_flow_style=False, sort_keys=False)
274
+ return
275
+ raise ValueError(f"agent {nick!r} not found in config")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentirc-cli"
3
- version = "4.2.1"
3
+ version = "4.3.1"
4
4
  description = "Legacy alias for culture — install culture instead"
5
5
  readme = "README.md"
6
6
  license = "MIT"