agentirc-cli 0.10.6__tar.gz → 0.10.7__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 (199) hide show
  1. agentirc_cli-0.10.7/.claude/skills/pr-review/SKILL.md +184 -0
  2. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/CHANGELOG.md +9 -0
  3. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/PKG-INFO +1 -1
  4. agentirc_cli-0.10.7/agentirc/__init__.py +1 -0
  5. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/cli.py +20 -0
  6. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/irc_transport.py +7 -1
  7. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/irc_transport.py +7 -1
  8. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/irc_transport.py +7 -1
  9. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/irc_transport.py +7 -1
  10. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/irc_transport.py +7 -1
  11. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/pyproject.toml +1 -1
  12. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_irc_transport.py +48 -0
  13. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/uv.lock +1 -1
  14. agentirc_cli-0.10.6/agentirc/__init__.py +0 -1
  15. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/.github/workflows/pages.yml +0 -0
  16. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/.github/workflows/publish.yml +0 -0
  17. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/.github/workflows/tests.yml +0 -0
  18. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/.gitignore +0 -0
  19. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/.markdownlint-cli2.yaml +0 -0
  20. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/.pr_agent.toml +0 -0
  21. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/CLAUDE.md +0 -0
  22. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/CNAME +0 -0
  23. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/Gemfile +0 -0
  24. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/Gemfile.lock +0 -0
  25. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/LICENSE +0 -0
  26. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/README.md +0 -0
  27. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/_config.yml +0 -0
  28. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/_sass/color_schemes/anthropic.scss +0 -0
  29. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/_sass/custom/custom.scss +0 -0
  30. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/__init__.py +0 -0
  31. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/__init__.py +0 -0
  32. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/__main__.py +0 -0
  33. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/agent_runner.py +0 -0
  34. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/config.py +0 -0
  35. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/daemon.py +0 -0
  36. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/ipc.py +0 -0
  37. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/message_buffer.py +0 -0
  38. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/skill/SKILL.md +0 -0
  39. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/skill/__init__.py +0 -0
  40. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/skill/irc_client.py +0 -0
  41. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/socket_server.py +0 -0
  42. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/supervisor.py +0 -0
  43. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/claude/webhook.py +0 -0
  44. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/__init__.py +0 -0
  45. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/agent_runner.py +0 -0
  46. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/config.py +0 -0
  47. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/daemon.py +0 -0
  48. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/ipc.py +0 -0
  49. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/message_buffer.py +0 -0
  50. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/skill/SKILL.md +0 -0
  51. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/skill/__init__.py +0 -0
  52. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/skill/irc_client.py +0 -0
  53. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/socket_server.py +0 -0
  54. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/supervisor.py +0 -0
  55. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/codex/webhook.py +0 -0
  56. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/__init__.py +0 -0
  57. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/agent_runner.py +0 -0
  58. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/config.py +0 -0
  59. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/daemon.py +0 -0
  60. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/ipc.py +0 -0
  61. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/message_buffer.py +0 -0
  62. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/skill/SKILL.md +0 -0
  63. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/skill/__init__.py +0 -0
  64. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/skill/irc_client.py +0 -0
  65. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/socket_server.py +0 -0
  66. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/supervisor.py +0 -0
  67. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/copilot/webhook.py +0 -0
  68. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/__init__.py +0 -0
  69. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/agent_runner.py +0 -0
  70. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/config.py +0 -0
  71. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/daemon.py +0 -0
  72. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/ipc.py +0 -0
  73. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/message_buffer.py +0 -0
  74. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/skill/SKILL.md +0 -0
  75. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/skill/__init__.py +0 -0
  76. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/skill/irc_client.py +0 -0
  77. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/socket_server.py +0 -0
  78. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/supervisor.py +0 -0
  79. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/clients/opencode/webhook.py +0 -0
  80. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/observer.py +0 -0
  81. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/pidfile.py +0 -0
  82. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/__init__.py +0 -0
  83. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/commands.py +0 -0
  84. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/extensions/federation.md +0 -0
  85. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/extensions/history.md +0 -0
  86. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/message.py +0 -0
  87. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/protocol-index.md +0 -0
  88. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/protocol/replies.py +0 -0
  89. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/__init__.py +0 -0
  90. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/__main__.py +0 -0
  91. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/channel.py +0 -0
  92. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/client.py +0 -0
  93. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/config.py +0 -0
  94. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/ircd.py +0 -0
  95. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/remote_client.py +0 -0
  96. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/server_link.py +0 -0
  97. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/skill.py +0 -0
  98. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/skills/__init__.py +0 -0
  99. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/agentirc/server/skills/history.py +0 -0
  100. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/agent-client.md +0 -0
  101. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/agent-harness-spec.md +0 -0
  102. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/ci.md +0 -0
  103. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/cli.md +0 -0
  104. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/configuration.md +0 -0
  105. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/context-management.md +0 -0
  106. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/irc-tools.md +0 -0
  107. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/overview.md +0 -0
  108. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/setup.md +0 -0
  109. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/supervisor.md +0 -0
  110. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/claude/webhooks.md +0 -0
  111. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/configuration.md +0 -0
  112. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/context-management.md +0 -0
  113. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/irc-tools.md +0 -0
  114. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/overview.md +0 -0
  115. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/setup.md +0 -0
  116. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/supervisor.md +0 -0
  117. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/codex/webhooks.md +0 -0
  118. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/configuration.md +0 -0
  119. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/context-management.md +0 -0
  120. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/irc-tools.md +0 -0
  121. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/overview.md +0 -0
  122. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/setup.md +0 -0
  123. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/supervisor.md +0 -0
  124. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/copilot/webhooks.md +0 -0
  125. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/configuration.md +0 -0
  126. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/context-management.md +0 -0
  127. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/irc-tools.md +0 -0
  128. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/overview.md +0 -0
  129. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/setup.md +0 -0
  130. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/supervisor.md +0 -0
  131. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/clients/opencode/webhooks.md +0 -0
  132. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/codex-backend.md +0 -0
  133. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/copilot-backend.md +0 -0
  134. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/design.md +0 -0
  135. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/docs-site.md +0 -0
  136. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/getting-started.md +0 -0
  137. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/grow-your-agent.md +0 -0
  138. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/layer1-core-irc.md +0 -0
  139. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/layer2-attention.md +0 -0
  140. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/layer3-skills.md +0 -0
  141. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/layer4-federation.md +0 -0
  142. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/layer5-agent-harness.md +0 -0
  143. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/opencode-backend.md +0 -0
  144. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/publishing.md +0 -0
  145. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  146. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/server-architecture.md +0 -0
  147. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  148. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  149. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  150. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  151. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/01-pair-programming.md +0 -0
  152. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/02-code-review-ensemble.md +0 -0
  153. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/03-cross-server-delegation.md +0 -0
  154. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/04-knowledge-propagation.md +0 -0
  155. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/05-the-observer.md +0 -0
  156. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/06-cross-server-ops.md +0 -0
  157. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/07-supervisor-intervention.md +0 -0
  158. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/08-apps-as-agents.md +0 -0
  159. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/09-research-swarm.md +0 -0
  160. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases/10-grow-your-agent.md +0 -0
  161. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/docs/use-cases-index.md +0 -0
  162. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/index.md +0 -0
  163. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/README.md +0 -0
  164. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/config.py +0 -0
  165. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/daemon.py +0 -0
  166. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/ipc.py +0 -0
  167. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/message_buffer.py +0 -0
  168. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/skill/SKILL.md +0 -0
  169. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/skill/irc_client.py +0 -0
  170. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/socket_server.py +0 -0
  171. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/packages/agent-harness/webhook.py +0 -0
  172. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  173. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  174. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/plugins/codex/skills/agentirc-irc/SKILL.md +0 -0
  175. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/__init__.py +0 -0
  176. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/conftest.py +0 -0
  177. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_agent_runner.py +0 -0
  178. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_channel.py +0 -0
  179. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_codex_daemon.py +0 -0
  180. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_connection.py +0 -0
  181. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_copilot_daemon.py +0 -0
  182. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_daemon.py +0 -0
  183. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_daemon_config.py +0 -0
  184. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_discovery.py +0 -0
  185. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_federation.py +0 -0
  186. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_history.py +0 -0
  187. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_integration_layer5.py +0 -0
  188. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_ipc.py +0 -0
  189. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_mentions.py +0 -0
  190. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_message.py +0 -0
  191. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_message_buffer.py +0 -0
  192. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_messaging.py +0 -0
  193. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_modes.py +0 -0
  194. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_opencode_daemon.py +0 -0
  195. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_skill_client.py +0 -0
  196. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_skills.py +0 -0
  197. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_socket_server.py +0 -0
  198. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_supervisor.py +0 -0
  199. {agentirc_cli-0.10.6 → agentirc_cli-0.10.7}/tests/test_webhook.py +0 -0
@@ -0,0 +1,184 @@
1
+ ---
2
+ name: pr-review
3
+ description: >
4
+ Full PR workflow for agentirc: branch, commit, push, create PR, wait for
5
+ automated reviewers, fetch comments, fix or pushback, reply, resolve threads.
6
+ Use when: creating PRs, handling review feedback, or the user says
7
+ "create PR", "review comments", "address feedback", or "resolve threads".
8
+ ---
9
+
10
+ # PR Review Workflow
11
+
12
+ Complete pull request lifecycle for the agentirc project. Follow every step
13
+ in order.
14
+
15
+ ## Step 1 — Branch
16
+
17
+ If you are on `main`, create a feature branch first:
18
+
19
+ ```bash
20
+ git checkout -b <branch-name>
21
+ ```
22
+
23
+ Branch naming conventions:
24
+
25
+ | Type | Pattern | Example |
26
+ |------|---------|---------|
27
+ | Bug fix | `fix/<short-desc>` | `fix/server-not-running-crash` |
28
+ | Feature | `feat/<short-desc>` | `feat/webhook-alerts` |
29
+ | Docs | `docs/<short-desc>` | `docs/protocol-extensions` |
30
+
31
+ ## Step 2 — Make changes, commit, push
32
+
33
+ 1. Edit code
34
+ 2. Run tests: `uv run pytest tests/ -x -q`
35
+ 3. Bump the version (required before PR):
36
+
37
+ ```bash
38
+ echo '{"fixed":["..."]}' | python3 ~/.claude/skills/version-bump/scripts/bump.py patch
39
+ ```
40
+
41
+ 4. Stage and commit:
42
+
43
+ ```bash
44
+ git add <files>
45
+ git commit -m "$(cat <<'EOF'
46
+ Commit message here.
47
+
48
+ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
49
+ EOF
50
+ )"
51
+ ```
52
+
53
+ 5. Push:
54
+
55
+ ```bash
56
+ git push -u origin <branch-name>
57
+ ```
58
+
59
+ ## Step 3 — Create PR
60
+
61
+ ```bash
62
+ gh pr create --title "Short title" --body "$(cat <<'EOF'
63
+ ## Summary
64
+ - Bullet points describing changes
65
+
66
+ ## Test plan
67
+ - [ ] Test items
68
+
69
+ - Claude
70
+ EOF
71
+ )"
72
+ ```
73
+
74
+ ## Step 4 — Wait for reviewers
75
+
76
+ Automated reviewers (Qodo, Copilot) need time to post comments.
77
+
78
+ **Wait 5 minutes** after creating the PR before checking for comments:
79
+
80
+ ```bash
81
+ sleep 300
82
+ ```
83
+
84
+ ## Step 5 — Poll for comments
85
+
86
+ After the initial wait, poll every 60 seconds until comments appear:
87
+
88
+ ```bash
89
+ bash ~/.claude/skills/pr-review/scripts/pr-comments.sh <PR_NUMBER>
90
+ ```
91
+
92
+ If no comments yet, wait and retry:
93
+
94
+ ```bash
95
+ sleep 60
96
+ bash ~/.claude/skills/pr-review/scripts/pr-comments.sh <PR_NUMBER>
97
+ ```
98
+
99
+ Continue until at least one unresolved comment exists, or 3 consecutive polls
100
+ return zero comments (reviewers are done / not configured).
101
+
102
+ ## Step 6 — Triage each comment
103
+
104
+ For every review comment, decide:
105
+
106
+ - **FIX** — valid concern, make the code change
107
+ - **PUSHBACK** — disagree, explain why in the reply
108
+
109
+ Guidelines:
110
+
111
+ - Exception type mismatches (e.g., breaking reconnect loops) are always valid
112
+ - Test requests are always valid — add them
113
+ - Style nits are usually valid — fix them
114
+ - Architecture opinions may warrant pushback if they conflict with project
115
+ conventions (check `CLAUDE.md` and `docs/`)
116
+
117
+ ## Step 7 — Fix code and push
118
+
119
+ 1. Make all code fixes
120
+ 2. Run tests: `uv run pytest tests/ -x -q`
121
+ 3. Commit with a descriptive message
122
+ 4. Push: `git push`
123
+
124
+ ## Step 8 — Reply and resolve threads
125
+
126
+ Use batch mode to reply to all comments at once:
127
+
128
+ ```bash
129
+ bash ~/.claude/skills/pr-review/scripts/pr-batch.sh --resolve <PR_NUMBER> <<'EOF'
130
+ {"comment_id": 123, "body": "Fixed -- changed X to Y.\n\n- Claude"}
131
+ {"comment_id": 456, "body": "Intentional -- this follows the pattern in Z because...\n\n- Claude"}
132
+ EOF
133
+ ```
134
+
135
+ Or reply to a single comment:
136
+
137
+ ```bash
138
+ bash ~/.claude/skills/pr-review/scripts/pr-reply.sh --resolve <PR_NUMBER> <COMMENT_ID> "Fixed -- updated.\n\n- Claude"
139
+ ```
140
+
141
+ **Important:**
142
+
143
+ - Always sign replies with `\n\n- Claude`
144
+ - Always use `--resolve` to resolve the thread after replying
145
+ - Every comment must get a reply — no silent fixes
146
+
147
+ ## Step 9 — Wait for merge
148
+
149
+ **Never merge the PR yourself.** The PR is merged manually on the GitHub site.
150
+
151
+ Report completion back to the IRC channel:
152
+
153
+ ```bash
154
+ # Using the IRC skill
155
+ AGENTIRC_NICK=<your-nick> python3 -m agentirc.clients.claude.skill.irc_client \
156
+ send "#general" "PR #<N> — all review threads addressed and resolved. Ready for merge."
157
+ ```
158
+
159
+ ## Script reference
160
+
161
+ | Script | Purpose |
162
+ |--------|---------|
163
+ | `pr-comments.sh <PR>` | Fetch all review comments |
164
+ | `pr-reply.sh [--resolve] <PR> <ID> "body"` | Reply to one comment |
165
+ | `pr-batch.sh [--resolve] <PR> < jsonl` | Batch reply from JSONL stdin |
166
+
167
+ All scripts auto-detect `owner/repo` from the current git remote.
168
+
169
+ ## Quick reference — full flow
170
+
171
+ ```text
172
+ git checkout -b fix/my-fix
173
+ # ... make changes ...
174
+ uv run pytest tests/ -x -q
175
+ echo '{"fixed":["desc"]}' | python3 ~/.claude/skills/version-bump/scripts/bump.py patch
176
+ git add <files> && git commit -m "message"
177
+ git push -u origin fix/my-fix
178
+ gh pr create --title "..." --body "..."
179
+ sleep 300
180
+ bash ~/.claude/skills/pr-review/scripts/pr-comments.sh <PR>
181
+ # ... fix issues, commit, push ...
182
+ bash ~/.claude/skills/pr-review/scripts/pr-batch.sh --resolve <PR> <<< '{"comment_id":N,"body":"Fixed\n\n- Claude"}'
183
+ # Wait for manual merge — never merge yourself
184
+ ```
@@ -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
+ ## [0.10.7] - 2026-03-28
8
+
9
+
10
+ ### Fixed
11
+
12
+ - Fix crash with cryptic asyncio Event loop is closed errors when starting agent without IRC server running
13
+ - Add server-running pre-check in CLI before starting agent daemon
14
+ - Wrap IRC transport connect in try/except for clear error on connection failure
15
+
7
16
  ## [0.10.6] - 2026-03-28
8
17
 
9
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 0.10.6
3
+ Version: 0.10.7
4
4
  Summary: IRC protocol chatrooms for AI agents (and humans allowed)
5
5
  Project-URL: Homepage, https://github.com/OriNachum/agentirc
6
6
  Author: Ori Nachum
@@ -0,0 +1 @@
1
+ __version__ = "0.10.7"
@@ -433,6 +433,26 @@ def _cmd_start(args: argparse.Namespace) -> None:
433
433
  print("No agents configured", file=sys.stderr)
434
434
  sys.exit(1)
435
435
 
436
+ # Best-effort check that the IRC server is reachable before starting agent(s)
437
+ import socket as _socket
438
+
439
+ server_name = config.server.name
440
+ host, port = config.server.host, config.server.port
441
+ try:
442
+ with _socket.create_connection((host, port), timeout=2):
443
+ pass
444
+ except (ConnectionRefusedError, OSError):
445
+ # TCP probe failed — add PID hint if available
446
+ hint = ""
447
+ server_pid = read_pid(f"server-{server_name}")
448
+ if not server_pid or not is_process_alive(server_pid):
449
+ hint = f"\nStart it with: agentirc server start --name {server_name}"
450
+ print(
451
+ f"Error: cannot connect to IRC server at {host}:{port}.{hint}",
452
+ file=sys.stderr,
453
+ )
454
+ sys.exit(1)
455
+
436
456
  if len(agents) == 1:
437
457
  # Run in foreground (single agent)
438
458
  agent = agents[0]
@@ -35,7 +35,13 @@ class IRCTransport:
35
35
  await self._do_connect()
36
36
 
37
37
  async def _do_connect(self) -> None:
38
- self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
38
+ try:
39
+ self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
40
+ except (ConnectionRefusedError, OSError) as exc:
41
+ raise ConnectionError(
42
+ f"Cannot connect to IRC server at {self.host}:{self.port} "
43
+ f"- is the server running?"
44
+ ) from exc
39
45
  await self._send_raw(f"NICK {self.nick}")
40
46
  await self._send_raw(f"USER {self.user} 0 * :{self.user}")
41
47
  self._read_task = asyncio.create_task(self._read_loop())
@@ -35,7 +35,13 @@ class IRCTransport:
35
35
  await self._do_connect()
36
36
 
37
37
  async def _do_connect(self) -> None:
38
- self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
38
+ try:
39
+ self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
40
+ except (ConnectionRefusedError, OSError) as exc:
41
+ raise ConnectionError(
42
+ f"Cannot connect to IRC server at {self.host}:{self.port} "
43
+ f"- is the server running?"
44
+ ) from exc
39
45
  await self._send_raw(f"NICK {self.nick}")
40
46
  await self._send_raw(f"USER {self.user} 0 * :{self.user}")
41
47
  self._read_task = asyncio.create_task(self._read_loop())
@@ -35,7 +35,13 @@ class IRCTransport:
35
35
  await self._do_connect()
36
36
 
37
37
  async def _do_connect(self) -> None:
38
- self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
38
+ try:
39
+ self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
40
+ except (ConnectionRefusedError, OSError) as exc:
41
+ raise ConnectionError(
42
+ f"Cannot connect to IRC server at {self.host}:{self.port} "
43
+ f"- is the server running?"
44
+ ) from exc
39
45
  await self._send_raw(f"NICK {self.nick}")
40
46
  await self._send_raw(f"USER {self.user} 0 * :{self.user}")
41
47
  self._read_task = asyncio.create_task(self._read_loop())
@@ -35,7 +35,13 @@ class IRCTransport:
35
35
  await self._do_connect()
36
36
 
37
37
  async def _do_connect(self) -> None:
38
- self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
38
+ try:
39
+ self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
40
+ except (ConnectionRefusedError, OSError) as exc:
41
+ raise ConnectionError(
42
+ f"Cannot connect to IRC server at {self.host}:{self.port} "
43
+ f"- is the server running?"
44
+ ) from exc
39
45
  await self._send_raw(f"NICK {self.nick}")
40
46
  await self._send_raw(f"USER {self.user} 0 * :{self.user}")
41
47
  self._read_task = asyncio.create_task(self._read_loop())
@@ -36,7 +36,13 @@ class IRCTransport:
36
36
  await self._do_connect()
37
37
 
38
38
  async def _do_connect(self) -> None:
39
- self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
39
+ try:
40
+ self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
41
+ except (ConnectionRefusedError, OSError) as exc:
42
+ raise ConnectionError(
43
+ f"Cannot connect to IRC server at {self.host}:{self.port} "
44
+ f"- is the server running?"
45
+ ) from exc
40
46
  await self._send_raw(f"NICK {self.nick}")
41
47
  await self._send_raw(f"USER {self.user} 0 * :{self.user}")
42
48
  self._read_task = asyncio.create_task(self._read_loop())
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentirc-cli"
3
- version = "0.10.6"
3
+ version = "0.10.7"
4
4
  description = "IRC protocol chatrooms for AI agents (and humans allowed)"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import pytest
3
+ import re
3
4
  from agentirc.clients.claude.irc_transport import IRCTransport
4
5
  from agentirc.clients.claude.message_buffer import MessageBuffer
5
6
 
@@ -89,3 +90,50 @@ async def test_send_join_part(server):
89
90
  await asyncio.sleep(0.2)
90
91
  assert "#new" not in server.channels
91
92
  await transport.disconnect()
93
+
94
+
95
+ @pytest.mark.asyncio
96
+ async def test_connect_raises_on_refused():
97
+ """Connecting to an unreachable server raises ConnectionError with a clear message."""
98
+ buf = MessageBuffer()
99
+ transport = IRCTransport(
100
+ host="127.0.0.1", port=1, # nothing listens here
101
+ nick="testserv-bot", user="bot", channels=["#general"], buffer=buf,
102
+ )
103
+ with pytest.raises(ConnectionError, match=re.escape("127.0.0.1:1")):
104
+ await transport.connect()
105
+
106
+
107
+ @pytest.mark.asyncio
108
+ async def test_reconnect_retries_after_connection_error(server):
109
+ """The reconnect loop retries after ConnectionError instead of crashing."""
110
+ buf = MessageBuffer()
111
+ # Use a port where nothing listens so the first _do_connect fails
112
+ transport = IRCTransport(
113
+ host="127.0.0.1", port=1,
114
+ nick="testserv-bot", user="bot", channels=["#general"], buffer=buf,
115
+ )
116
+ transport._should_run = True
117
+ transport._reconnecting = False
118
+
119
+ # Patch _do_connect to fail once with ConnectionError, then succeed
120
+ call_count = 0
121
+ original_do_connect = transport._do_connect
122
+
123
+ async def patched_do_connect():
124
+ nonlocal call_count
125
+ call_count += 1
126
+ if call_count == 1:
127
+ raise ConnectionError("simulated failure")
128
+ # On retry, connect to the real server
129
+ transport.host = "127.0.0.1"
130
+ transport.port = server.config.port
131
+ await original_do_connect()
132
+
133
+ transport._do_connect = patched_do_connect
134
+
135
+ # _reconnect should retry and eventually succeed
136
+ await asyncio.wait_for(transport._reconnect(), timeout=5.0)
137
+ assert call_count >= 2
138
+ assert transport.connected or not transport._reconnecting
139
+ await transport.disconnect()
@@ -4,7 +4,7 @@ requires-python = ">=3.12"
4
4
 
5
5
  [[package]]
6
6
  name = "agentirc-cli"
7
- version = "0.10.6"
7
+ version = "0.10.7"
8
8
  source = { editable = "." }
9
9
  dependencies = [
10
10
  { name = "anthropic" },
@@ -1 +0,0 @@
1
- __version__ = "0.10.6"
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