agentirc-cli 8.0.0__tar.gz → 8.1.0__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 (404) hide show
  1. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/CHANGELOG.md +13 -0
  2. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/PKG-INFO +2 -1
  3. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/__init__.py +3 -2
  4. agentirc_cli-8.1.0/culture/cli/_passthrough.py +116 -0
  5. agentirc_cli-8.1.0/culture/cli/afi.py +71 -0
  6. agentirc_cli-8.1.0/culture/cli/devex.py +71 -0
  7. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/features.md +1 -1
  8. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/vision.md +8 -8
  9. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/what-is-culture.md +5 -4
  10. agentirc_cli-8.1.0/docs/reference/cli/afi.md +95 -0
  11. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/cli/devex.md +5 -6
  12. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/cli/index.md +10 -6
  13. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/pyproject.toml +2 -1
  14. agentirc_cli-8.1.0/tests/test_cli_afi.py +111 -0
  15. agentirc_cli-8.1.0/tests/test_cli_passthrough.py +146 -0
  16. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/uv.lock +12 -1
  17. agentirc_cli-8.0.0/culture/cli/devex.py +0 -111
  18. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/agents/doc-test-alignment.md +0 -0
  19. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/skills/pr-review/SKILL.md +0 -0
  20. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/skills/run-tests/SKILL.md +0 -0
  21. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  22. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.flake8 +0 -0
  23. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/docs-check.yml +0 -0
  24. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/publish.yml +0 -0
  25. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/security-checks.yml +0 -0
  26. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/tests.yml +0 -0
  27. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.gitignore +0 -0
  28. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.markdownlint-cli2.yaml +0 -0
  29. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.pr_agent.toml +0 -0
  30. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.pre-commit-config.yaml +0 -0
  31. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.pylintrc +0 -0
  32. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/CLAUDE.md +0 -0
  33. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/Gemfile +0 -0
  34. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/Gemfile.lock +0 -0
  35. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/LICENSE +0 -0
  36. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/README.md +0 -0
  37. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/SECURITY.md +0 -0
  38. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_config.base.yml +0 -0
  39. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_config.culture.yml +0 -0
  40. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_data/sites.yml +0 -0
  41. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_includes/head_custom.html +0 -0
  42. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_sass/color_schemes/anthropic.scss +0 -0
  43. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_sass/color_schemes/dark-terminal.scss +0 -0
  44. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_sass/custom/custom.scss +0 -0
  45. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/IMG_3183.png +0 -0
  46. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/apple-touch-icon.png +0 -0
  47. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/favicon-16x16.png +0 -0
  48. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/favicon-32x32.png +0 -0
  49. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/favicon.ico +0 -0
  50. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/og-agentirc.png +0 -0
  51. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/og-culture.png +0 -0
  52. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/__init__.py +0 -0
  53. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/__main__.py +0 -0
  54. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/CLAUDE.md +0 -0
  55. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/__init__.py +0 -0
  56. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/__main__.py +0 -0
  57. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/channel.py +0 -0
  58. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/client.py +0 -0
  59. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/config.py +0 -0
  60. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc-architecture.md +0 -0
  61. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc-features.md +0 -0
  62. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc-skill.md +0 -0
  63. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc.md +0 -0
  64. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/events.py +0 -0
  65. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/history_store.py +0 -0
  66. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/ircd.py +0 -0
  67. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/remote_client.py +0 -0
  68. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/room_store.py +0 -0
  69. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/rooms_util.py +0 -0
  70. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/server_link.py +0 -0
  71. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skill.py +0 -0
  72. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/__init__.py +0 -0
  73. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/history.py +0 -0
  74. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/icon.py +0 -0
  75. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/rooms.py +0 -0
  76. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/threads.py +0 -0
  77. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/thread_store.py +0 -0
  78. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/aio.py +0 -0
  79. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/__init__.py +0 -0
  80. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/bot.py +0 -0
  81. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/bot_manager.py +0 -0
  82. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/config.py +0 -0
  83. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/filter_dsl.py +0 -0
  84. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/http_listener.py +0 -0
  85. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/__init__.py +0 -0
  86. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/welcome/__init__.py +0 -0
  87. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/welcome/bot.yaml +0 -0
  88. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/welcome/handler.py +0 -0
  89. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/template_engine.py +0 -0
  90. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/virtual_client.py +0 -0
  91. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/agent.py +0 -0
  92. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/bot.py +0 -0
  93. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/channel.py +0 -0
  94. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/introspect.py +0 -0
  95. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/mesh.py +0 -0
  96. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/server.py +0 -0
  97. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/__init__.py +0 -0
  98. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/constants.py +0 -0
  99. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/display.py +0 -0
  100. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/formatting.py +0 -0
  101. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/ipc.py +0 -0
  102. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/mesh.py +0 -0
  103. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/process.py +0 -0
  104. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/skills.py +0 -0
  105. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/__init__.py +0 -0
  106. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/__init__.py +0 -0
  107. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/agent_runner.py +0 -0
  108. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/config.py +0 -0
  109. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/culture.yaml +0 -0
  110. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/daemon.py +0 -0
  111. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/ipc.py +0 -0
  112. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/irc_transport.py +0 -0
  113. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/message_buffer.py +0 -0
  114. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/skill/SKILL.md +0 -0
  115. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/skill/__init__.py +0 -0
  116. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/skill/irc_client.py +0 -0
  117. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/socket_server.py +0 -0
  118. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/supervisor.py +0 -0
  119. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/webhook.py +0 -0
  120. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/__init__.py +0 -0
  121. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/__main__.py +0 -0
  122. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/agent_runner.py +0 -0
  123. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/config.py +0 -0
  124. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/culture.yaml +0 -0
  125. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/daemon.py +0 -0
  126. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/ipc.py +0 -0
  127. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/irc_transport.py +0 -0
  128. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/message_buffer.py +0 -0
  129. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/skill/SKILL.md +0 -0
  130. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/skill/__init__.py +0 -0
  131. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/skill/irc_client.py +0 -0
  132. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/socket_server.py +0 -0
  133. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/supervisor.py +0 -0
  134. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/webhook.py +0 -0
  135. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/__init__.py +0 -0
  136. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/agent_runner.py +0 -0
  137. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/config.py +0 -0
  138. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/culture.yaml +0 -0
  139. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/daemon.py +0 -0
  140. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/ipc.py +0 -0
  141. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/irc_transport.py +0 -0
  142. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/message_buffer.py +0 -0
  143. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/skill/SKILL.md +0 -0
  144. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/skill/__init__.py +0 -0
  145. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/skill/irc_client.py +0 -0
  146. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/socket_server.py +0 -0
  147. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/supervisor.py +0 -0
  148. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/webhook.py +0 -0
  149. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/__init__.py +0 -0
  150. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/agent_runner.py +0 -0
  151. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/config.py +0 -0
  152. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/culture.yaml +0 -0
  153. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/daemon.py +0 -0
  154. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/ipc.py +0 -0
  155. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/irc_transport.py +0 -0
  156. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/message_buffer.py +0 -0
  157. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/skill/SKILL.md +0 -0
  158. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/skill/__init__.py +0 -0
  159. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/skill/irc_client.py +0 -0
  160. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/socket_server.py +0 -0
  161. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/supervisor.py +0 -0
  162. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/webhook.py +0 -0
  163. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/config.py +0 -0
  164. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/__init__.py +0 -0
  165. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/app.py +0 -0
  166. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/client.py +0 -0
  167. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/commands.py +0 -0
  168. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/status.py +0 -0
  169. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/__init__.py +0 -0
  170. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/chat.py +0 -0
  171. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/info_panel.py +0 -0
  172. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/sidebar.py +0 -0
  173. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/constants.py +0 -0
  174. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/credentials.py +0 -0
  175. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/formatting.py +0 -0
  176. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/learn_prompt.py +0 -0
  177. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/mesh_config.py +0 -0
  178. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/observer.py +0 -0
  179. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/__init__.py +0 -0
  180. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/collector.py +0 -0
  181. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/model.py +0 -0
  182. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/renderer_text.py +0 -0
  183. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/renderer_web.py +0 -0
  184. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/web/style.css +0 -0
  185. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/persistence.py +0 -0
  186. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/pidfile.py +0 -0
  187. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/__init__.py +0 -0
  188. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/commands.py +0 -0
  189. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/events.md +0 -0
  190. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/federation.md +0 -0
  191. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/history.md +0 -0
  192. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/icons.md +0 -0
  193. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/rooms.md +0 -0
  194. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/tags.md +0 -0
  195. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/threads.md +0 -0
  196. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/message.py +0 -0
  197. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/protocol-index.md +0 -0
  198. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/replies.py +0 -0
  199. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/skills/culture/SKILL.md +0 -0
  200. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/README.md +0 -0
  201. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/architecture-overview.md +0 -0
  202. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/bots.md +0 -0
  203. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/events.md +0 -0
  204. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/index.md +0 -0
  205. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/why-agentirc.md +0 -0
  206. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/agent-lifecycle.md +0 -0
  207. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/choose-a-harness.md +0 -0
  208. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/index.md +0 -0
  209. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/mental-model.md +0 -0
  210. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/operate.md +0 -0
  211. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/patterns.md +0 -0
  212. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/quickstart.md +0 -0
  213. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/reflective-development.md +0 -0
  214. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/vision-patterns-index.md +0 -0
  215. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/agent-harness-spec.md +0 -0
  216. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/index.md +0 -0
  217. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/layers.md +0 -0
  218. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/threads.md +0 -0
  219. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/cli/commands.md +0 -0
  220. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/console.md +0 -0
  221. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/acp.md +0 -0
  222. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/claude.md +0 -0
  223. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/codex.md +0 -0
  224. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/copilot.md +0 -0
  225. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/index.md +0 -0
  226. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/index.md +0 -0
  227. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/architecture.md +0 -0
  228. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/config.md +0 -0
  229. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/deployment.md +0 -0
  230. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/index.md +0 -0
  231. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/security.md +0 -0
  232. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  233. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/resources/positioning.md +0 -0
  234. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/federation.md +0 -0
  235. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/harnesses.md +0 -0
  236. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/humans-and-agents.md +0 -0
  237. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/index.md +0 -0
  238. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/persistence.md +0 -0
  239. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/rooms.md +0 -0
  240. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/demos/magic-demo.md +0 -0
  241. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/first-session.md +0 -0
  242. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/index.md +0 -0
  243. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/join-as-human.md +0 -0
  244. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/local-setup.md +0 -0
  245. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/multi-machine.md +0 -0
  246. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/01-pair-programming.md +0 -0
  247. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/02-code-review-ensemble.md +0 -0
  248. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/03-cross-server-delegation.md +0 -0
  249. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/04-knowledge-propagation.md +0 -0
  250. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/05-the-observer.md +0 -0
  251. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/06-cross-server-ops.md +0 -0
  252. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/07-supervisor-intervention.md +0 -0
  253. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/08-apps-as-agents.md +0 -0
  254. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/09-research-swarm.md +0 -0
  255. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/10-agent-lifecycle.md +0 -0
  256. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases-index.md +0 -0
  257. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  258. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  259. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  260. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  261. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  262. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  263. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  264. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  265. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  266. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
  267. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-12-console-enhancements.md +0 -0
  268. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-15-mesh-events.md +0 -0
  269. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-18-culture-dev-positioning.md +0 -0
  270. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-22-agex-integration.md +0 -0
  271. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  272. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  273. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  274. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  275. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  276. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  277. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  278. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  279. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  280. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  281. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  282. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  283. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
  284. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
  285. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
  286. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
  287. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-12-console-enhancements-design.md +0 -0
  288. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-15-mesh-events-design.md +0 -0
  289. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-17-sites-repositioning-design.md +0 -0
  290. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-18-culture-dev-positioning-design.md +0 -0
  291. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-22-agex-integration-design.md +0 -0
  292. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/favicon.ico +0 -0
  293. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/README.md +0 -0
  294. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/config.py +0 -0
  295. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/culture.yaml +0 -0
  296. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/daemon.py +0 -0
  297. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/ipc.py +0 -0
  298. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/irc_transport.py +0 -0
  299. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/message_buffer.py +0 -0
  300. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/skill/SKILL.md +0 -0
  301. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/skill/irc_client.py +0 -0
  302. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/socket_server.py +0 -0
  303. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/webhook.py +0 -0
  304. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  305. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  306. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  307. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  308. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/robots.txt +0 -0
  309. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sitemap-agentirc.html +0 -0
  310. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sitemap-main.html +0 -0
  311. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sitemap.html +0 -0
  312. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sonar-project.properties +0 -0
  313. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/__init__.py +0 -0
  314. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/conftest.py +0 -0
  315. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_acp_daemon.py +0 -0
  316. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_agent_runner.py +0 -0
  317. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_archive.py +0 -0
  318. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot.py +0 -0
  319. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot_config.py +0 -0
  320. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot_config_fires_event_toplevel.py +0 -0
  321. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot_manager.py +0 -0
  322. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bots_integration.py +0 -0
  323. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_channel.py +0 -0
  324. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_channel_cli.py +0 -0
  325. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_cli_devex.py +0 -0
  326. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_cli_introspect.py +0 -0
  327. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_codex_daemon.py +0 -0
  328. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_connection.py +0 -0
  329. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_chat_markdown.py +0 -0
  330. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_client.py +0 -0
  331. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_commands.py +0 -0
  332. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_connection.py +0 -0
  333. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_fixes_224_227.py +0 -0
  334. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_icons.py +0 -0
  335. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_integration.py +0 -0
  336. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_status.py +0 -0
  337. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_copilot_daemon.py +0 -0
  338. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_credentials.py +0 -0
  339. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_culture_config.py +0 -0
  340. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_daemon.py +0 -0
  341. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_daemon_config.py +0 -0
  342. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_daemon_ipc.py +0 -0
  343. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_discovery.py +0 -0
  344. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_display.py +0 -0
  345. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_basic.py +0 -0
  346. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_bot_chain.py +0 -0
  347. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_bot_trigger.py +0 -0
  348. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_cap_fallback.py +0 -0
  349. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_catalog.py +0 -0
  350. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_federation.py +0 -0
  351. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_history.py +0 -0
  352. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_lifecycle.py +0 -0
  353. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_reserved_nick.py +0 -0
  354. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_federation.py +0 -0
  355. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_filter_dsl.py +0 -0
  356. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_history.py +0 -0
  357. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_http_listener.py +0 -0
  358. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_integration_layer5.py +0 -0
  359. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_ipc.py +0 -0
  360. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_irc_transport.py +0 -0
  361. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_irc_transport_tags.py +0 -0
  362. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_learn_prompt.py +0 -0
  363. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_link_reconnect.py +0 -0
  364. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_manifest_config.py +0 -0
  365. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mention_alias.py +0 -0
  366. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mention_target_cleanup.py +0 -0
  367. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mention_warning.py +0 -0
  368. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mentions.py +0 -0
  369. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mesh_config.py +0 -0
  370. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mesh_readiness.py +0 -0
  371. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_message.py +0 -0
  372. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_message_buffer.py +0 -0
  373. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_message_tags.py +0 -0
  374. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_messaging.py +0 -0
  375. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_migrate_cli.py +0 -0
  376. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_modes.py +0 -0
  377. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_cli.py +0 -0
  378. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_collector.py +0 -0
  379. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_model.py +0 -0
  380. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_renderer.py +0 -0
  381. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_web.py +0 -0
  382. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_persistence.py +0 -0
  383. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_persistence_timeout.py +0 -0
  384. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_pidfile.py +0 -0
  385. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_poll_loop.py +0 -0
  386. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_register_cli.py +0 -0
  387. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_room_persistence.py +0 -0
  388. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_rooms.py +0 -0
  389. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_rooms_federation.py +0 -0
  390. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_rooms_integration.py +0 -0
  391. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_server_icon_skill.py +0 -0
  392. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_setup_update_cli.py +0 -0
  393. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_skill_client.py +0 -0
  394. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_skill_docs.py +0 -0
  395. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_skills.py +0 -0
  396. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_socket_server.py +0 -0
  397. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_supervisor.py +0 -0
  398. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_template_engine.py +0 -0
  399. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_thread_buffer.py +0 -0
  400. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_threads.py +0 -0
  401. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_virtual_client.py +0 -0
  402. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_wait_for_port.py +0 -0
  403. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_webhook.py +0 -0
  404. {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_welcome_bot.py +0 -0
@@ -4,6 +4,19 @@ 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
+ ## [8.1.0] - 2026-04-23
8
+
9
+ ### Added
10
+
11
+ - `culture afi` namespace — passthrough to the standalone `afi-cli` (Agent First Interface scaffolder) with argparse-REMAINDER argument forwarding, parallel to `culture devex`.
12
+ - Universal verbs register the `afi` topic; `culture explain afi` / `culture overview afi` / `culture learn afi` all route through `afi-cli` 0.3+ and `culture explain` no longer marks `culture afi` as coming-soon.
13
+ - `afi-cli>=0.3,<1.0` as a library dependency (0.3 added the `overview` verb + sixth rubric bundle per agentculture/afi-cli#5).
14
+ - `culture/cli/_passthrough.py` — shared plumbing for `culture <ext>` subcommands that embed a sibling CLI. Supplies `run()`, `capture()`, and `register_topic()` so each passthrough module stays a thin adapter.
15
+
16
+ ### Changed
17
+
18
+ - `culture/cli/devex.py` refactored onto the new shared passthrough helper. Behaviour is preserved (explain/overview/learn argv and typer app invocation unchanged); the module shrinks to a package-specific entry adapter and a single `register_topic` call. When agex-cli adopts the agent-first CLI contract (`main(argv) -> int`, tracking: agentculture/agex-cli#30), the adapter collapses to a direct delegation.
19
+
7
20
  ## [8.0.0] - 2026-04-22
8
21
 
9
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 8.0.0
3
+ Version: 8.1.0
4
4
  Summary: Legacy alias for culture — install culture instead
5
5
  Project-URL: Homepage, https://github.com/OriNachum/culture
6
6
  Author: Ori Nachum
@@ -12,6 +12,7 @@ Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Topic :: Communications :: Chat :: Internet Relay Chat
14
14
  Requires-Python: >=3.12
15
+ Requires-Dist: afi-cli<1.0,>=0.3
15
16
  Requires-Dist: agex-cli<1.0,>=0.13
16
17
  Requires-Dist: aiohttp>=3.9
17
18
  Requires-Dist: anthropic>=0.40
@@ -8,6 +8,7 @@ Commands are organized into noun-based groups:
8
8
  culture bot {create,start,stop,list,inspect,archive,unarchive}
9
9
  culture skills {install}
10
10
  culture devex {...developer-experience passthrough (powered by agex-cli)...}
11
+ culture afi {...agent-first interface passthrough (powered by afi-cli)...}
11
12
 
12
13
  Universal verbs (available at the root):
13
14
  culture explain [topic] full description of topic (default: culture)
@@ -22,9 +23,9 @@ import logging
22
23
  import sys
23
24
 
24
25
  from culture import __version__
25
- from culture.cli import agent, bot, channel, devex, introspect, mesh, server, skills
26
+ from culture.cli import afi, agent, bot, channel, devex, introspect, mesh, server, skills
26
27
 
27
- GROUPS = [agent, server, mesh, channel, bot, skills, devex, introspect]
28
+ GROUPS = [agent, server, mesh, channel, bot, skills, devex, afi, introspect]
28
29
 
29
30
 
30
31
  def _names_of(group) -> set[str]:
@@ -0,0 +1,116 @@
1
+ """Shared plumbing for `culture <ext>` passthrough subcommands.
2
+
3
+ A passthrough module (e.g. ``culture devex``, ``culture afi``) embeds a
4
+ sibling CLI in-process: arguments after the namespace token are forwarded
5
+ verbatim to the external CLI's entry callable, and the three universal
6
+ verbs (``explain`` / ``overview`` / ``learn``) capture the external CLI's
7
+ output and route it through :mod:`culture.cli.introspect`.
8
+
9
+ Each passthrough module supplies a package-specific ``Entry`` callable
10
+ with signature ``(argv: list[str]) -> int | None``. The callable may:
11
+
12
+ * return ``None`` or ``0`` for success,
13
+ * return a non-zero ``int`` for a handled error,
14
+ * raise ``SystemExit`` for argparse ``--help`` / ``--version`` / errors
15
+ or typer's standalone-mode hard-exit on completion.
16
+
17
+ :func:`run` propagates via ``sys.exit`` (for the ``dispatch()`` path).
18
+ :func:`capture` collects stdout+stderr and translates ``SystemExit`` into
19
+ an ``int`` return code (for the universal-verb handlers, which must
20
+ return ``(stdout, rc)``).
21
+
22
+ The long-term target is every embedded CLI exposing a clean
23
+ ``main(argv) -> int`` (agent-first CLI contract owned by afi-cli). Until
24
+ then, typer-backed CLIs like agex-cli can be wrapped in a small entry
25
+ adapter that calls the typer ``app`` — the plumbing here stays unchanged.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import contextlib
31
+ import io
32
+ import sys
33
+ from typing import Callable
34
+
35
+ from culture.cli import introspect
36
+
37
+ Entry = Callable[[list[str]], "int | None"]
38
+
39
+
40
+ def _translate_exit(code: "int | str | None") -> "tuple[int, str | None]":
41
+ """Map a ``SystemExit.code`` to ``(rc, message)``.
42
+
43
+ Python's ``sys.exit`` accepts ``None`` (rc 0), an ``int`` (rc = int), or
44
+ anything else (rc 1 with the stringified value printed to stderr). We
45
+ mirror all three so an embedded CLI using any ``sys.exit`` form is
46
+ surfaced to culture's caller the way a bare invocation would be.
47
+ """
48
+ if code is None:
49
+ return 0, None
50
+ if isinstance(code, int):
51
+ return code, None
52
+ return 1, str(code)
53
+
54
+
55
+ def run(entry: Entry, argv: list[str]) -> None:
56
+ """Invoke ``entry(argv)`` and ``sys.exit`` with its return code.
57
+
58
+ Used by a group module's ``dispatch()`` to forward arguments verbatim to
59
+ the embedded CLI. ``SystemExit`` raised inside the entry (typer's
60
+ hard-exit, argparse's ``--help`` / ``--version`` / error path, or
61
+ ``sys.exit("msg")``) is caught, its message (if any) forwarded to
62
+ stderr, and its code re-emitted via ``sys.exit`` so the behaviour
63
+ matches a bare invocation of the embedded CLI.
64
+ """
65
+ try:
66
+ rc = entry(argv) or 0
67
+ except SystemExit as exc: # NOSONAR S5754 — SystemExit is re-emitted via sys.exit below
68
+ rc, message = _translate_exit(exc.code)
69
+ if message is not None:
70
+ print(message, file=sys.stderr)
71
+ sys.exit(rc)
72
+
73
+
74
+ def capture(entry: Entry, argv: list[str]) -> tuple[str, int]:
75
+ """Invoke ``entry(argv)`` with stdout+stderr captured; return ``(out, rc)``.
76
+
77
+ Used by universal-verb handlers (``explain`` / ``overview`` / ``learn``),
78
+ which must return a value rather than exit. ``SystemExit`` raised inside
79
+ the entry is translated into the ``rc`` half of the return tuple; any
80
+ string-valued ``exc.code`` is appended to the captured buffer so the
81
+ embedded CLI's error text reaches the caller the way a bare invocation
82
+ would emit it on stderr.
83
+ """
84
+ buf = io.StringIO()
85
+ rc = 0
86
+ try:
87
+ with contextlib.redirect_stdout(buf), contextlib.redirect_stderr(buf):
88
+ rc = entry(argv) or 0
89
+ except SystemExit as exc: # NOSONAR S5754 — code is surfaced as rc; behaviour documented above
90
+ rc, message = _translate_exit(exc.code)
91
+ if message is not None:
92
+ buf.write(message)
93
+ if not message.endswith("\n"):
94
+ buf.write("\n")
95
+ return buf.getvalue(), rc
96
+
97
+
98
+ def register_topic(
99
+ topic: str,
100
+ entry: Entry,
101
+ *,
102
+ explain_argv: list[str],
103
+ overview_argv: list[str],
104
+ learn_argv: list[str],
105
+ ) -> None:
106
+ """Register ``explain`` / ``overview`` / ``learn`` handlers for ``topic``.
107
+
108
+ Each handler captures the output of ``entry(<verb_argv>)`` and returns
109
+ ``(stdout, rc)`` per the :mod:`culture.cli.introspect` handler protocol.
110
+ """
111
+ introspect.register_topic(
112
+ topic,
113
+ explain=lambda _t: capture(entry, explain_argv),
114
+ overview=lambda _t: capture(entry, overview_argv),
115
+ learn=lambda _t: capture(entry, learn_argv),
116
+ )
@@ -0,0 +1,71 @@
1
+ """`culture afi` — passthrough to the standalone afi CLI.
2
+
3
+ afi (Agent First Interface) scaffolds and audits agent-first CLIs, MCP
4
+ servers, and HTTP sites. Culture embeds it as a first-class namespace so
5
+ the culture CLI exposes the same agent-first affordances afi enforces.
6
+
7
+ This module is a thin adapter: it supplies a package-specific ``Entry``
8
+ callable and wires the three universal verbs
9
+ (``explain`` / ``overview`` / ``learn``) through
10
+ :mod:`culture.cli._passthrough`. afi already implements the agent-first
11
+ CLI contract (``main(argv) -> int``), so the entry is a direct
12
+ delegation — no typer adapter needed.
13
+
14
+ ``afi-cli`` owns the rubric the contract is measured against. See
15
+ `agentculture/afi-cli#5 <https://github.com/agentculture/afi-cli/issues/5>`_
16
+ for the tracking issue that adds an ``overview`` verb + rubric bundle so
17
+ afi models every check it enforces.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import argparse
23
+ import sys
24
+
25
+ from culture.cli import _passthrough
26
+
27
+ NAME = "afi"
28
+
29
+
30
+ def _entry(argv: list[str]) -> "int | None":
31
+ """In-process call into ``afi.cli.main(argv)``.
32
+
33
+ afi's ``main`` returns an ``int`` on normal completion and raises
34
+ ``SystemExit`` only for argparse-level exits (``--help``, ``--version``,
35
+ unknown flag). Both paths are handled by :mod:`culture.cli._passthrough`.
36
+ """
37
+ try:
38
+ from afi.cli import main
39
+ except ImportError as exc: # pragma: no cover — declared dep
40
+ print(f"afi-cli is not installed: {exc}", file=sys.stderr)
41
+ sys.exit(2)
42
+ return main(argv)
43
+
44
+
45
+ _passthrough.register_topic(
46
+ "afi",
47
+ _entry,
48
+ explain_argv=["explain"],
49
+ overview_argv=["overview"],
50
+ learn_argv=["learn"],
51
+ )
52
+
53
+
54
+ # --- CLI group protocol ---------------------------------------------------
55
+
56
+
57
+ def register(subparsers: "argparse._SubParsersAction") -> None:
58
+ # prefix_chars=chr(0): every token (including --help, --version) is
59
+ # treated as positional and captured in afi_args for the underlying
60
+ # afi argparse parser to handle.
61
+ p = subparsers.add_parser(
62
+ NAME,
63
+ help="Run the afi agent-first CLI via passthrough",
64
+ add_help=False,
65
+ prefix_chars=chr(0),
66
+ )
67
+ p.add_argument("afi_args", nargs=argparse.REMAINDER, help="Arguments passed to afi")
68
+
69
+
70
+ def dispatch(args: argparse.Namespace) -> None:
71
+ _passthrough.run(_entry, list(getattr(args, "afi_args", []) or []))
@@ -0,0 +1,71 @@
1
+ """`culture devex` — passthrough to the standalone agex CLI.
2
+
3
+ Under the hood, ``devex`` is powered by the standalone ``agex-cli``
4
+ (``agent_experience`` package). The command name differs for familiarity
5
+ with the developer-experience vocabulary; the underlying tool is the
6
+ same.
7
+
8
+ This module is a thin adapter: it supplies a package-specific ``Entry``
9
+ callable and wires the three universal verbs
10
+ (``explain`` / ``overview`` / ``learn``) through
11
+ :mod:`culture.cli._passthrough`. When agex-cli migrates to the
12
+ agent-first CLI contract (``main(argv) -> int``), the adapter becomes a
13
+ one-line ``return main(argv)`` without touching the shared plumbing.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ import sys
20
+
21
+ from culture.cli import _passthrough
22
+
23
+ NAME = "devex"
24
+
25
+
26
+ def _entry(argv: list[str]) -> None:
27
+ """In-process call into the agex typer ``app``.
28
+
29
+ Typer's default ``standalone_mode=True`` makes ``app`` call ``sys.exit``
30
+ when it finishes — so this function naturally raises ``SystemExit``,
31
+ which :mod:`culture.cli._passthrough` translates into an ``int`` for the
32
+ universal-verb handlers and re-emits via ``sys.exit`` for the direct
33
+ passthrough path.
34
+ """
35
+ try:
36
+ from agent_experience.cli import app
37
+ except ImportError as exc: # pragma: no cover — declared dep
38
+ print(f"agex-cli is not installed: {exc}", file=sys.stderr)
39
+ sys.exit(2)
40
+ app(args=argv)
41
+
42
+
43
+ # The underlying agex library refers to itself as "agex"; we pass that to
44
+ # its own explain verb. The culture-facing name is devex.
45
+ _passthrough.register_topic(
46
+ "devex",
47
+ _entry,
48
+ explain_argv=["explain", "agex"],
49
+ overview_argv=["overview", "--agent", "claude-code"],
50
+ learn_argv=["learn", "--agent", "claude-code"],
51
+ )
52
+
53
+
54
+ # --- CLI group protocol ---------------------------------------------------
55
+
56
+
57
+ def register(subparsers: "argparse._SubParsersAction") -> None:
58
+ # prefix_chars=chr(0) means the devex subparser has no recognized flag
59
+ # prefix character, so every token (including --help, --version) is
60
+ # treated as positional and captured in devex_args for typer to handle.
61
+ p = subparsers.add_parser(
62
+ NAME,
63
+ help="Run the agex developer-experience CLI via passthrough",
64
+ add_help=False,
65
+ prefix_chars=chr(0),
66
+ )
67
+ p.add_argument("devex_args", nargs=argparse.REMAINDER, help="Arguments passed to agex")
68
+
69
+
70
+ def dispatch(args: argparse.Namespace) -> None:
71
+ _passthrough.run(_entry, list(getattr(args, "devex_args", []) or []))
@@ -79,7 +79,7 @@ description: Everything in the workspace — grouped by who it's for.
79
79
  <div class="feature-group-items">
80
80
  <div>culture explain / overview / learn</div>
81
81
  <div>culture devex (powered by agex-cli)</div>
82
- <div>culture afi (coming soon)</div>
82
+ <div>culture afi (powered by afi-cli)</div>
83
83
  <div>culture identity / secret (coming soon)</div>
84
84
  </div>
85
85
  <a class="feature-group-deep" href="{{ '/reference/cli/devex/' | relative_url }}">Read the contract →</a>
@@ -64,14 +64,14 @@ management — but the foundation is standard IRC.
64
64
  ## Upcoming
65
65
 
66
66
  Culture is the framework of agreements that makes agent behavior portable,
67
- inspectable, and effective. Beyond the workspace runtime and the
68
- [`culture devex`]({{ '/reference/cli/devex/' | relative_url }}) namespace
69
- (powered by the standalone `agex-cli`) that already ship, three more
70
- first-class namespaces are next:
71
-
72
- - **`culture afi`** Agent First Interface. Standards and scaffolding
73
- for tools whose primary consumer is an AI agent (CLI / MCP / HTTP).
74
- Wraps the standalone `afi-cli`.
67
+ inspectable, and effective. Beyond the workspace runtime and the two
68
+ first-class passthrough namespaces that already ship
69
+ [`culture devex`]({{ '/reference/cli/devex/' | relative_url }}) (powered
70
+ by `agex-cli`) and
71
+ [`culture afi`]({{ '/reference/cli/afi/' | relative_url }}) (powered by
72
+ the standalone `afi-cli`, the Agent First Interface scaffolder) two
73
+ more first-class namespaces are next:
74
+
75
75
  - **`culture identity`** — Identity management across the mesh. Wraps a
76
76
  standalone `zehut-cli` (Hebrew: "identity"). The command you'll reach
77
77
  for to name agents, issue keys, and federate trust between servers.
@@ -62,10 +62,11 @@ to that node and its descendants:
62
62
 
63
63
  Each namespace owns its own handlers — culture is pure plumbing. Today
64
64
  the [`culture devex`]({{ '/reference/cli/devex/' | relative_url }})
65
- namespace (powered by the standalone `agex-cli`) is registered;
66
- `culture afi`, `culture identity`, and `culture secret` are surfaced as
67
- `(coming soon)` and will be added in future releases following the same
68
- pattern.
65
+ namespace (powered by `agex-cli`) and the
66
+ [`culture afi`]({{ '/reference/cli/afi/' | relative_url }}) namespace
67
+ (powered by `afi-cli`) are registered; `culture identity` and
68
+ `culture secret` remain `(coming soon)` and will be added in future
69
+ releases following the same pattern.
69
70
 
70
71
  ## Reference points
71
72
 
@@ -0,0 +1,95 @@
1
+ ---
2
+ title: "culture afi"
3
+ parent: "CLI"
4
+ grand_parent: "Reference"
5
+ nav_order: 11
6
+ sites: [agentirc, culture]
7
+ description: "Agent First Interface passthrough and universal introspection verbs."
8
+ permalink: /reference/cli/afi/
9
+ ---
10
+
11
+ # `culture afi` and universal verbs
12
+
13
+ Culture ships the **Agent First Interface** (afi) as a first-class
14
+ namespace. `culture afi` is powered by the standalone
15
+ [`afi-cli`](https://github.com/agentculture/afi-cli) (Python package
16
+ `afi`). afi generates and audits agent-first CLIs, MCP servers, and
17
+ HTTP sites — and models, on itself, every pattern it enforces on
18
+ others.
19
+
20
+ Two affordances:
21
+
22
+ ## `culture afi <anything>`
23
+
24
+ A full passthrough to the standalone `afi` CLI. Everything after
25
+ `culture afi` is forwarded verbatim to the argparse app. Exit codes
26
+ propagate.
27
+
28
+ ```bash
29
+ culture afi --version
30
+ culture afi explain
31
+ culture afi learn
32
+ culture afi cli verify .
33
+ ```
34
+
35
+ `culture afi --help` shows the underlying afi argparse help, not
36
+ culture's.
37
+
38
+ afi itself is argparse-based and exposes a library-grade
39
+ `afi.cli.main(argv) -> int` entry point. Culture embeds it in-process
40
+ via the shared passthrough helper at `culture/cli/_passthrough.py`;
41
+ stdout and stderr from afi are captured cleanly and exit codes are
42
+ preserved.
43
+
44
+ ## Universal verbs: `explain` / `overview` / `learn`
45
+
46
+ Three verbs live at the root of the culture command tree. Each takes an
47
+ optional `topic`; when omitted, the topic defaults to `culture`.
48
+
49
+ | Verb | Meaning |
50
+ |------|---------|
51
+ | `explain afi` | Full markdown description of afi (routes to `afi explain`) |
52
+ | `overview afi` | Shallow map of afi (routes to `afi overview`) |
53
+ | `learn afi` | Agent-facing onboarding prompt for operating afi |
54
+
55
+ ```bash
56
+ culture explain afi # markdown docs for afi root
57
+ culture overview afi # shallow map
58
+ culture learn afi # agent onboarding prompt for afi
59
+ ```
60
+
61
+ All three verbs are live from culture 8.1.0 + `afi-cli` 0.3.0 onward;
62
+ the `overview` verb and its rubric bundle were added in
63
+ [agentculture/afi-cli#5](https://github.com/agentculture/afi-cli/issues/5).
64
+
65
+ ## Each namespace owns its own
66
+
67
+ Culture is pure plumbing — the dispatcher at
68
+ `culture/cli/introspect.py` maps topics to handlers, and the shared
69
+ embedder at `culture/cli/_passthrough.py` provides the in-process
70
+ call, output capture, and `SystemExit` translation. `afi.py` is a thin
71
+ adapter: it supplies the package-specific entry callable and one call
72
+ to `_passthrough.register_topic`. Adding another namespace that wraps
73
+ a sibling CLI follows the same recipe.
74
+
75
+ ### Sibling namespaces
76
+
77
+ | Namespace | Backing CLI | State |
78
+ |-----------|-------------|-------|
79
+ | `culture devex` | `agex-cli` (`agent_experience`) | Registered |
80
+ | `culture afi` | `afi-cli` (`afi`) | Registered |
81
+ | `culture identity` | future `zehut-cli` | Coming soon |
82
+ | `culture secret` | future `shushu-cli` | Coming soon |
83
+
84
+ Culture uses English for its first-class nouns; the underlying CLIs
85
+ keep their brand names. `culture explain` is the always-current source
86
+ of truth for which namespaces are ready vs. coming soon.
87
+
88
+ ## See also
89
+
90
+ - [`culture devex` and universal verbs](./devex/) — the parallel
91
+ passthrough for the developer-experience CLI, and the full handler
92
+ protocol for namespace authors.
93
+ - [afi-cli on GitHub](https://github.com/agentculture/afi-cli) — the
94
+ standalone tool, its rubric, and the spec for what makes a CLI
95
+ agent-first.
@@ -70,14 +70,13 @@ that wants to participate registers its own handlers on import. For
70
70
  `devex`, the `agex-cli` library already implements the three verbs —
71
71
  culture just routes.
72
72
 
73
- ### Upcoming namespaces
73
+ ### Sibling and upcoming namespaces
74
74
 
75
- Three more namespaces are registered as `(coming soon)` in
76
- `culture explain` output and will gain full handlers in future releases:
75
+ [`culture afi`](./afi/) is registered as of culture 8.1, riding the
76
+ same passthrough plumbing as devex. Two more namespaces are listed as
77
+ `(coming soon)` in `culture explain` output and will gain full
78
+ handlers in future releases:
77
79
 
78
- - **`culture afi`** — Agent First Interface. Scaffolding standards for
79
- tools whose primary consumer is an AI agent. Wraps the standalone
80
- [`afi-cli`](https://github.com/agentculture/afi-cli).
81
80
  - **`culture identity`** — Identity management across the mesh. Will
82
81
  wrap a standalone `zehut-cli` (Hebrew: "identity").
83
82
  - **`culture secret`** — Secret management. Will wrap a standalone
@@ -11,10 +11,12 @@ permalink: /reference/cli/
11
11
  # CLI Reference
12
12
 
13
13
  The `culture` command manages servers, agents, bots, channels, and the
14
- mesh, plus embeds the agex developer-experience CLI as `culture devex`.
15
- Every level of the command tree is inspectable via three universal
16
- verbs `explain`, `overview`, `learn`. See
17
- [`culture devex` and universal verbs](./devex/) for the full contract.
14
+ mesh, and embeds two sibling CLIs: the agex developer-experience CLI
15
+ as [`culture devex`](./devex/) and the afi Agent-First-Interface CLI
16
+ as [`culture afi`](./afi/). Every level of the command tree is
17
+ inspectable via three universal verbs `explain`, `overview`,
18
+ `learn`. See [`culture devex` and universal verbs](./devex/) for the
19
+ full contract.
18
20
 
19
21
  Install: `uv tool install culture` or `pip install culture`
20
22
 
@@ -407,6 +409,8 @@ registry of participating namespaces.
407
409
  - `culture learn [topic]` — agent onboarding prompt
408
410
  - `culture devex <anything>` — developer-experience passthrough
409
411
  (powered by `agex-cli`)
412
+ - `culture afi <anything>` — Agent First Interface passthrough
413
+ (powered by `afi-cli`)
410
414
 
411
- `culture afi`, `culture identity`, and `culture secret` are upcoming
412
- and appear as `(coming soon)` in `culture explain` output.
415
+ `culture identity` and `culture secret` are upcoming and appear as
416
+ `(coming soon)` in `culture explain` output.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentirc-cli"
3
- version = "8.0.0"
3
+ version = "8.1.0"
4
4
  description = "Legacy alias for culture — install culture instead"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -21,6 +21,7 @@ dependencies = [
21
21
  "aiohttp>=3.9",
22
22
  "textual>=1.0",
23
23
  "agex-cli>=0.13,<1.0",
24
+ "afi-cli>=0.3,<1.0",
24
25
  ]
25
26
 
26
27
  [project.urls]
@@ -0,0 +1,111 @@
1
+ """Tests for `culture afi` passthrough and `afi` universal topic."""
2
+
3
+ import subprocess
4
+ import sys
5
+
6
+
7
+ def test_culture_afi_version_runs():
8
+ result = subprocess.run(
9
+ [sys.executable, "-m", "culture", "afi", "--version"],
10
+ capture_output=True,
11
+ text=True,
12
+ check=False,
13
+ )
14
+ assert result.returncode == 0, result.stderr
15
+ # afi --version prints "afi X.Y.Z"
16
+ assert result.stdout.strip().startswith("afi ")
17
+
18
+
19
+ def test_culture_afi_explain_runs():
20
+ result = subprocess.run(
21
+ [sys.executable, "-m", "culture", "afi", "explain"],
22
+ capture_output=True,
23
+ text=True,
24
+ check=False,
25
+ )
26
+ assert result.returncode == 0, result.stderr
27
+ assert result.stdout.strip()
28
+
29
+
30
+ def test_culture_afi_learn_runs():
31
+ result = subprocess.run(
32
+ [sys.executable, "-m", "culture", "afi", "learn"],
33
+ capture_output=True,
34
+ text=True,
35
+ check=False,
36
+ )
37
+ assert result.returncode == 0, result.stderr
38
+ assert result.stdout.strip()
39
+
40
+
41
+ def test_culture_afi_overview_runs():
42
+ # afi-cli 0.3+ exposes `overview`; our pin guarantees it.
43
+ result = subprocess.run(
44
+ [sys.executable, "-m", "culture", "afi", "overview"],
45
+ capture_output=True,
46
+ text=True,
47
+ check=False,
48
+ )
49
+ assert result.returncode == 0, result.stderr
50
+ assert result.stdout.strip()
51
+
52
+
53
+ def test_culture_afi_help_shows_argparse_help():
54
+ result = subprocess.run(
55
+ [sys.executable, "-m", "culture", "afi", "--help"],
56
+ capture_output=True,
57
+ text=True,
58
+ check=False,
59
+ )
60
+ assert result.returncode == 0
61
+ # afi uses argparse; help text contains the usage banner
62
+ assert "usage:" in result.stdout.lower()
63
+
64
+
65
+ def test_culture_explain_afi_via_universal_verb():
66
+ result = subprocess.run(
67
+ [sys.executable, "-m", "culture", "explain", "afi"],
68
+ capture_output=True,
69
+ text=True,
70
+ check=False,
71
+ )
72
+ assert result.returncode == 0, result.stderr
73
+ assert result.stdout.strip()
74
+
75
+
76
+ def test_culture_learn_afi_via_universal_verb():
77
+ result = subprocess.run(
78
+ [sys.executable, "-m", "culture", "learn", "afi"],
79
+ capture_output=True,
80
+ text=True,
81
+ check=False,
82
+ )
83
+ assert result.returncode == 0, result.stderr
84
+ assert result.stdout.strip()
85
+
86
+
87
+ def test_culture_overview_afi_via_universal_verb():
88
+ result = subprocess.run(
89
+ [sys.executable, "-m", "culture", "overview", "afi"],
90
+ capture_output=True,
91
+ text=True,
92
+ check=False,
93
+ )
94
+ assert result.returncode == 0, result.stderr
95
+ assert result.stdout.strip()
96
+
97
+
98
+ def test_culture_explain_lists_afi_as_registered():
99
+ # When afi registers handlers, `culture explain` should no longer show it
100
+ # as "(coming soon)".
101
+ result = subprocess.run(
102
+ [sys.executable, "-m", "culture", "explain"],
103
+ capture_output=True,
104
+ text=True,
105
+ check=False,
106
+ )
107
+ assert result.returncode == 0, result.stderr
108
+ lines = [ln for ln in result.stdout.splitlines() if "`culture afi`" in ln]
109
+ assert lines, "afi line missing from `culture explain` namespaces list"
110
+ # The line must not carry the "(coming soon)" marker
111
+ assert "coming soon" not in lines[0], lines[0]