agentirc-cli 5.0.1__tar.gz → 5.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/CHANGELOG.md +8 -0
  2. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/PKG-INFO +1 -1
  3. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/mesh.py +44 -11
  4. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/credentials.py +11 -6
  5. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/pyproject.toml +1 -1
  6. agentirc_cli-5.0.2/tests/test_credentials.py +24 -0
  7. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/uv.lock +1 -1
  8. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.claude/skills/pr-review/SKILL.md +0 -0
  9. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.claude/skills/run-tests/SKILL.md +0 -0
  10. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
  11. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.flake8 +0 -0
  12. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/pages.yml +0 -0
  13. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/publish.yml +0 -0
  14. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/security-checks.yml +0 -0
  15. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/tests.yml +0 -0
  16. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.gitignore +0 -0
  17. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.markdownlint-cli2.yaml +0 -0
  18. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.pr_agent.toml +0 -0
  19. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.pre-commit-config.yaml +0 -0
  20. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.pylintrc +0 -0
  21. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/CLAUDE.md +0 -0
  22. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/CNAME +0 -0
  23. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/Gemfile +0 -0
  24. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/Gemfile.lock +0 -0
  25. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/LICENSE +0 -0
  26. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/README.md +0 -0
  27. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/SECURITY.md +0 -0
  28. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_config.yml +0 -0
  29. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_includes/head_custom.html +0 -0
  30. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_sass/color_schemes/anthropic.scss +0 -0
  31. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_sass/custom/custom.scss +0 -0
  32. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/apple-touch-icon.png +0 -0
  33. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/favicon-16x16.png +0 -0
  34. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/favicon-32x32.png +0 -0
  35. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/favicon.ico +0 -0
  36. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/__init__.py +0 -0
  37. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/__main__.py +0 -0
  38. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/aio.py +0 -0
  39. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/__init__.py +0 -0
  40. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/bot.py +0 -0
  41. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/bot_manager.py +0 -0
  42. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/config.py +0 -0
  43. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/http_listener.py +0 -0
  44. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/template_engine.py +0 -0
  45. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/virtual_client.py +0 -0
  46. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/__init__.py +0 -0
  47. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/agent.py +0 -0
  48. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/bot.py +0 -0
  49. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/channel.py +0 -0
  50. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/server.py +0 -0
  51. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/__init__.py +0 -0
  52. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/constants.py +0 -0
  53. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/display.py +0 -0
  54. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/formatting.py +0 -0
  55. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/ipc.py +0 -0
  56. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/mesh.py +0 -0
  57. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/process.py +0 -0
  58. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/skills.py +0 -0
  59. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/__init__.py +0 -0
  60. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/__init__.py +0 -0
  61. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/agent_runner.py +0 -0
  62. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/config.py +0 -0
  63. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/culture.yaml +0 -0
  64. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/daemon.py +0 -0
  65. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/ipc.py +0 -0
  66. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/irc_transport.py +0 -0
  67. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/message_buffer.py +0 -0
  68. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/skill/SKILL.md +0 -0
  69. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/skill/__init__.py +0 -0
  70. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/skill/irc_client.py +0 -0
  71. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/socket_server.py +0 -0
  72. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/supervisor.py +0 -0
  73. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/webhook.py +0 -0
  74. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/__init__.py +0 -0
  75. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/__main__.py +0 -0
  76. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/agent_runner.py +0 -0
  77. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/config.py +0 -0
  78. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/culture.yaml +0 -0
  79. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/daemon.py +0 -0
  80. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/ipc.py +0 -0
  81. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/irc_transport.py +0 -0
  82. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/message_buffer.py +0 -0
  83. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/skill/SKILL.md +0 -0
  84. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/skill/__init__.py +0 -0
  85. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/skill/irc_client.py +0 -0
  86. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/socket_server.py +0 -0
  87. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/supervisor.py +0 -0
  88. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/webhook.py +0 -0
  89. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/__init__.py +0 -0
  90. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/agent_runner.py +0 -0
  91. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/config.py +0 -0
  92. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/culture.yaml +0 -0
  93. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/daemon.py +0 -0
  94. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/ipc.py +0 -0
  95. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/irc_transport.py +0 -0
  96. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/message_buffer.py +0 -0
  97. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/skill/SKILL.md +0 -0
  98. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/skill/__init__.py +0 -0
  99. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/skill/irc_client.py +0 -0
  100. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/socket_server.py +0 -0
  101. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/supervisor.py +0 -0
  102. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/webhook.py +0 -0
  103. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/__init__.py +0 -0
  104. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/agent_runner.py +0 -0
  105. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/config.py +0 -0
  106. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/culture.yaml +0 -0
  107. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/daemon.py +0 -0
  108. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/ipc.py +0 -0
  109. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/irc_transport.py +0 -0
  110. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/message_buffer.py +0 -0
  111. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/skill/SKILL.md +0 -0
  112. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/skill/__init__.py +0 -0
  113. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/skill/irc_client.py +0 -0
  114. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/socket_server.py +0 -0
  115. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/supervisor.py +0 -0
  116. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/webhook.py +0 -0
  117. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/config.py +0 -0
  118. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/__init__.py +0 -0
  119. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/app.py +0 -0
  120. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/client.py +0 -0
  121. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/commands.py +0 -0
  122. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/__init__.py +0 -0
  123. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/chat.py +0 -0
  124. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/info_panel.py +0 -0
  125. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/sidebar.py +0 -0
  126. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/formatting.py +0 -0
  127. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/learn_prompt.py +0 -0
  128. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/mesh_config.py +0 -0
  129. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/observer.py +0 -0
  130. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/__init__.py +0 -0
  131. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/collector.py +0 -0
  132. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/model.py +0 -0
  133. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/renderer_text.py +0 -0
  134. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/renderer_web.py +0 -0
  135. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/web/style.css +0 -0
  136. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/persistence.py +0 -0
  137. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/pidfile.py +0 -0
  138. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/__init__.py +0 -0
  139. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/commands.py +0 -0
  140. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/federation.md +0 -0
  141. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/history.md +0 -0
  142. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/icons.md +0 -0
  143. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/rooms.md +0 -0
  144. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/tags.md +0 -0
  145. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/threads.md +0 -0
  146. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/message.py +0 -0
  147. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/protocol-index.md +0 -0
  148. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/replies.py +0 -0
  149. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/__init__.py +0 -0
  150. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/__main__.py +0 -0
  151. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/channel.py +0 -0
  152. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/client.py +0 -0
  153. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/config.py +0 -0
  154. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/history_store.py +0 -0
  155. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/ircd.py +0 -0
  156. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/remote_client.py +0 -0
  157. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/room_store.py +0 -0
  158. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/rooms_util.py +0 -0
  159. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/server_link.py +0 -0
  160. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skill.py +0 -0
  161. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/__init__.py +0 -0
  162. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/history.py +0 -0
  163. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/icon.py +0 -0
  164. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/rooms.py +0 -0
  165. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/threads.py +0 -0
  166. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/thread_store.py +0 -0
  167. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/skills/culture/SKILL.md +0 -0
  168. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/agent-lifecycle.md +0 -0
  169. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/agentic-self-learn.md +0 -0
  170. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/agents/decentralized-config.md +0 -0
  171. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/agent-client.md +0 -0
  172. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/agent-harness-spec.md +0 -0
  173. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/design.md +0 -0
  174. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/harness-conformance.md +0 -0
  175. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/index.md +0 -0
  176. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer1-core-irc.md +0 -0
  177. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer2-attention.md +0 -0
  178. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer3-skills.md +0 -0
  179. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer4-federation.md +0 -0
  180. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer5-agent-harness.md +0 -0
  181. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/server-architecture.md +0 -0
  182. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/threads.md +0 -0
  183. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/channel-polling.md +0 -0
  184. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/acp/overview.md +0 -0
  185. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/acp/system-prompt.md +0 -0
  186. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/configuration.md +0 -0
  187. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/context-management.md +0 -0
  188. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/irc-tools.md +0 -0
  189. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/overview.md +0 -0
  190. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/setup.md +0 -0
  191. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/supervisor.md +0 -0
  192. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/webhooks.md +0 -0
  193. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/configuration.md +0 -0
  194. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/context-management.md +0 -0
  195. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/irc-tools.md +0 -0
  196. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/overview.md +0 -0
  197. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/setup.md +0 -0
  198. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/supervisor.md +0 -0
  199. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/webhooks.md +0 -0
  200. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/configuration.md +0 -0
  201. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/context-management.md +0 -0
  202. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/irc-tools.md +0 -0
  203. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/overview.md +0 -0
  204. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/setup.md +0 -0
  205. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/supervisor.md +0 -0
  206. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/webhooks.md +0 -0
  207. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/culture-cli.md +0 -0
  208. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/getting-started.md +0 -0
  209. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/index.md +0 -0
  210. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/SECURITY.md +0 -0
  211. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/bots.md +0 -0
  212. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/ci.md +0 -0
  213. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/cli.md +0 -0
  214. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/docs-site.md +0 -0
  215. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/index.md +0 -0
  216. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/ops-tooling.md +0 -0
  217. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/overview.md +0 -0
  218. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/publishing.md +0 -0
  219. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/persistent-history.md +0 -0
  220. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/reflective-development.md +0 -0
  221. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  222. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/rooms.md +0 -0
  223. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/server-rename.md +0 -0
  224. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  225. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  226. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  227. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  228. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  229. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  230. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  231. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  232. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  233. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
  234. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  235. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  236. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  237. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  238. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  239. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  240. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  241. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  242. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  243. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  244. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  245. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  246. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
  247. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
  248. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
  249. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
  250. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/01-pair-programming.md +0 -0
  251. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/02-code-review-ensemble.md +0 -0
  252. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/03-cross-server-delegation.md +0 -0
  253. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/04-knowledge-propagation.md +0 -0
  254. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/05-the-observer.md +0 -0
  255. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/06-cross-server-ops.md +0 -0
  256. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/07-supervisor-intervention.md +0 -0
  257. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/08-apps-as-agents.md +0 -0
  258. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/09-research-swarm.md +0 -0
  259. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/10-agent-lifecycle.md +0 -0
  260. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases-index.md +0 -0
  261. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/what-is-culture.md +0 -0
  262. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/favicon.ico +0 -0
  263. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/README.md +0 -0
  264. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/config.py +0 -0
  265. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/culture.yaml +0 -0
  266. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/daemon.py +0 -0
  267. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/ipc.py +0 -0
  268. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/irc_transport.py +0 -0
  269. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/message_buffer.py +0 -0
  270. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/skill/SKILL.md +0 -0
  271. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/skill/irc_client.py +0 -0
  272. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/socket_server.py +0 -0
  273. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/webhook.py +0 -0
  274. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  275. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  276. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  277. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  278. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/sonar-project.properties +0 -0
  279. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/__init__.py +0 -0
  280. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/conftest.py +0 -0
  281. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_acp_daemon.py +0 -0
  282. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_agent_runner.py +0 -0
  283. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_archive.py +0 -0
  284. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bot.py +0 -0
  285. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bot_config.py +0 -0
  286. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bot_manager.py +0 -0
  287. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bots_integration.py +0 -0
  288. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_channel.py +0 -0
  289. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_codex_daemon.py +0 -0
  290. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_connection.py +0 -0
  291. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_client.py +0 -0
  292. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_commands.py +0 -0
  293. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_connection.py +0 -0
  294. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_icons.py +0 -0
  295. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_integration.py +0 -0
  296. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_copilot_daemon.py +0 -0
  297. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_culture_config.py +0 -0
  298. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_daemon.py +0 -0
  299. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_daemon_config.py +0 -0
  300. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_daemon_ipc.py +0 -0
  301. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_discovery.py +0 -0
  302. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_display.py +0 -0
  303. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_federation.py +0 -0
  304. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_history.py +0 -0
  305. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_http_listener.py +0 -0
  306. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_integration_layer5.py +0 -0
  307. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_ipc.py +0 -0
  308. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_irc_transport.py +0 -0
  309. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_learn_prompt.py +0 -0
  310. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_link_reconnect.py +0 -0
  311. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mention_alias.py +0 -0
  312. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mention_target_cleanup.py +0 -0
  313. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mention_warning.py +0 -0
  314. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mentions.py +0 -0
  315. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mesh_config.py +0 -0
  316. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_message.py +0 -0
  317. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_message_buffer.py +0 -0
  318. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_messaging.py +0 -0
  319. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_migrate_cli.py +0 -0
  320. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_modes.py +0 -0
  321. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_cli.py +0 -0
  322. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_collector.py +0 -0
  323. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_model.py +0 -0
  324. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_renderer.py +0 -0
  325. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_web.py +0 -0
  326. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_persistence.py +0 -0
  327. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_pidfile.py +0 -0
  328. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_poll_loop.py +0 -0
  329. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_register_cli.py +0 -0
  330. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_room_persistence.py +0 -0
  331. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_rooms.py +0 -0
  332. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_rooms_federation.py +0 -0
  333. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_rooms_integration.py +0 -0
  334. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_server_icon_skill.py +0 -0
  335. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_setup_update_cli.py +0 -0
  336. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_skill_client.py +0 -0
  337. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_skill_docs.py +0 -0
  338. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_skills.py +0 -0
  339. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_socket_server.py +0 -0
  340. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_supervisor.py +0 -0
  341. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_template_engine.py +0 -0
  342. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_thread_buffer.py +0 -0
  343. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_threads.py +0 -0
  344. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_virtual_client.py +0 -0
  345. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_wait_for_port.py +0 -0
  346. {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_webhook.py +0 -0
@@ -4,6 +4,14 @@ 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
+ ## [5.0.2] - 2026-04-09
8
+
9
+
10
+ ### Fixed
11
+
12
+ - Handle missing credential tool (secret-tool/security/powershell) gracefully instead of crashing the server
13
+ - Report restart failures in mesh update instead of claiming success
14
+
7
15
  ## [5.0.1] - 2026-04-09
8
16
 
9
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 5.0.1
3
+ Version: 5.0.2
4
4
  Summary: Legacy alias for culture — install culture instead
5
5
  Project-URL: Homepage, https://github.com/OriNachum/culture
6
6
  Author: Ori Nachum
@@ -469,16 +469,18 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
469
469
  os.execvp(culture_bin, reexec_args)
470
470
 
471
471
 
472
- def _wait_for_server_port(port: int, retries: int = 50, interval: float = 0.1) -> None:
473
- """Poll until *port* accepts a TCP connection."""
472
+ def _wait_for_server_port(host: str, port: int, retries: int = 50, interval: float = 0.1) -> bool:
473
+ """Poll until *host*:*port* accepts a TCP connection. Returns True on success."""
474
474
  import socket as _socket
475
475
 
476
+ probe = "localhost" if host in ("0.0.0.0", "::", "") else host
476
477
  for _ in range(retries):
477
478
  try:
478
- with _socket.create_connection(("localhost", port), timeout=1):
479
- return
479
+ with _socket.create_connection((probe, port), timeout=1):
480
+ return True
480
481
  except OSError:
481
482
  time.sleep(interval)
483
+ return False
482
484
 
483
485
 
484
486
  def _dry_run_restart(mesh, server_name: str) -> None:
@@ -509,13 +511,16 @@ def _restart_single_service(svc_name: str, fallback_cmd: list[str], restart_serv
509
511
 
510
512
  def _restart_mesh_services(
511
513
  mesh, server_name: str, culture_bin: str, config_path: str, dry_run: bool
512
- ) -> None:
513
- """Stop agents and server, regenerate service entries, then restart everything."""
514
+ ) -> bool:
515
+ """Stop agents and server, regenerate service entries, then restart everything.
516
+
517
+ Returns True if the server came up successfully, False otherwise.
518
+ """
514
519
  print(f"Restarting mesh node '{server_name}'...")
515
520
 
516
521
  if dry_run:
517
522
  _dry_run_restart(mesh, server_name)
518
- return
523
+ return True
519
524
 
520
525
  for agent in mesh.agents:
521
526
  full_nick = f"{server_name}-{agent.nick}"
@@ -561,7 +566,17 @@ def _restart_mesh_services(
561
566
  ]
562
567
  _restart_single_service(server_svc, server_fallback, restart_service)
563
568
 
564
- _wait_for_server_port(mesh.server.port)
569
+ if not _wait_for_server_port(mesh.server.host, mesh.server.port):
570
+ if sys.platform == "linux":
571
+ hint = f"journalctl --user -u culture-server-{server_name}"
572
+ else:
573
+ hint = f"~/.culture/logs/server-{server_name}.log"
574
+ print(
575
+ f" Error: server {server_name} did not start on port {mesh.server.port}. "
576
+ f"Check logs: {hint}",
577
+ file=sys.stderr,
578
+ )
579
+ return False
565
580
 
566
581
  for agent in mesh.agents:
567
582
  full_nick = f"{server_name}-{agent.nick}"
@@ -579,6 +594,7 @@ def _restart_mesh_services(
579
594
  _restart_single_service(agent_svc, agent_fallback, restart_service)
580
595
 
581
596
  print()
597
+ return True
582
598
 
583
599
 
584
600
  def _resolve_mesh_for_server(server_name: str, config_path: str):
@@ -630,6 +646,7 @@ def _cmd_update(args: argparse.Namespace) -> None:
630
646
  culture_bin = shutil.which("culture") or "culture"
631
647
 
632
648
  running = list_servers()
649
+ failed = []
633
650
 
634
651
  if running:
635
652
  for srv in running:
@@ -640,7 +657,10 @@ def _cmd_update(args: argparse.Namespace) -> None:
640
657
  file=sys.stderr,
641
658
  )
642
659
  continue
643
- _restart_mesh_services(mesh, srv["name"], culture_bin, args.config, args.dry_run)
660
+ if not _restart_mesh_services(
661
+ mesh, srv["name"], culture_bin, args.config, args.dry_run
662
+ ):
663
+ failed.append(srv["name"])
644
664
  else:
645
665
  try:
646
666
  mesh = load_mesh_config(args.config)
@@ -648,6 +668,19 @@ def _cmd_update(args: argparse.Namespace) -> None:
648
668
  mesh = generate_mesh_from_agents(args.config)
649
669
  if mesh is None:
650
670
  sys.exit(1)
651
- _restart_mesh_services(mesh, mesh.server.name, culture_bin, args.config, args.dry_run)
671
+ if not _restart_mesh_services(
672
+ mesh, mesh.server.name, culture_bin, args.config, args.dry_run
673
+ ):
674
+ failed.append(mesh.server.name)
675
+
676
+ if failed:
677
+ print(
678
+ f"Update finished with errors. Failed to restart: {', '.join(failed)}",
679
+ file=sys.stderr,
680
+ )
681
+ sys.exit(1)
652
682
 
653
- print("Update complete. All services restarted.")
683
+ if args.dry_run:
684
+ print("Dry run complete. No services were restarted.")
685
+ else:
686
+ print("Update complete. All services restarted.")
@@ -21,12 +21,17 @@ SERVICE_NAME = "culture"
21
21
 
22
22
  def _run(args: list[str], input: str | None = None) -> tuple[int, str]:
23
23
  """Run a command and return (returncode, stdout)."""
24
- result = subprocess.run(
25
- args,
26
- input=input,
27
- capture_output=True,
28
- text=True,
29
- )
24
+ try:
25
+ result = subprocess.run(
26
+ args,
27
+ input=input,
28
+ capture_output=True,
29
+ text=True,
30
+ )
31
+ except FileNotFoundError:
32
+ tool = {"darwin": "security", "win32": "powershell"}.get(sys.platform, "secret-tool")
33
+ logger.warning("Credential tool '%s' not found — is it installed?", tool)
34
+ return 127, ""
30
35
  return result.returncode, result.stdout.strip()
31
36
 
32
37
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentirc-cli"
3
- version = "5.0.1"
3
+ version = "5.0.2"
4
4
  description = "Legacy alias for culture — install culture instead"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -0,0 +1,24 @@
1
+ """Tests for culture.credentials — OS credential store helpers."""
2
+
3
+ from unittest.mock import patch
4
+
5
+ from culture.credentials import _run, lookup_credential, store_credential
6
+
7
+
8
+ def test_run_missing_binary():
9
+ """_run() returns (127, '') when the binary is not found."""
10
+ rc, out = _run(["nonexistent-binary-xyz-12345"])
11
+ assert rc == 127
12
+ assert out == ""
13
+
14
+
15
+ def test_lookup_credential_missing_tool():
16
+ """lookup_credential() returns None when the credential tool is missing."""
17
+ with patch("culture.credentials._run", return_value=(127, "")):
18
+ assert lookup_credential("some-peer") is None
19
+
20
+
21
+ def test_store_credential_missing_tool():
22
+ """store_credential() returns False when the credential tool is missing."""
23
+ with patch("culture.credentials._run", return_value=(127, "")):
24
+ assert store_credential("some-peer", "password") is False
@@ -561,7 +561,7 @@ wheels = [
561
561
 
562
562
  [[package]]
563
563
  name = "culture"
564
- version = "5.0.1"
564
+ version = "5.0.2"
565
565
  source = { editable = "." }
566
566
  dependencies = [
567
567
  { name = "aiohttp" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes