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.
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/CHANGELOG.md +13 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/PKG-INFO +2 -1
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/__init__.py +3 -2
- agentirc_cli-8.1.0/culture/cli/_passthrough.py +116 -0
- agentirc_cli-8.1.0/culture/cli/afi.py +71 -0
- agentirc_cli-8.1.0/culture/cli/devex.py +71 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/features.md +1 -1
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/vision.md +8 -8
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/what-is-culture.md +5 -4
- agentirc_cli-8.1.0/docs/reference/cli/afi.md +95 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/cli/devex.md +5 -6
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/cli/index.md +10 -6
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/pyproject.toml +2 -1
- agentirc_cli-8.1.0/tests/test_cli_afi.py +111 -0
- agentirc_cli-8.1.0/tests/test_cli_passthrough.py +146 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/uv.lock +12 -1
- agentirc_cli-8.0.0/culture/cli/devex.py +0 -111
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/agents/doc-test-alignment.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.flake8 +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/docs-check.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.gitignore +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.pr_agent.toml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/.pylintrc +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/CLAUDE.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/Gemfile +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/Gemfile.lock +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/LICENSE +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/README.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/SECURITY.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_config.base.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_config.culture.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_data/sites.yml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_includes/head_custom.html +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_sass/color_schemes/dark-terminal.scss +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/IMG_3183.png +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/apple-touch-icon.png +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/favicon-16x16.png +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/favicon-32x32.png +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/favicon.ico +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/og-agentirc.png +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/assets/images/og-culture.png +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/__main__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/CLAUDE.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/__main__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/channel.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc-architecture.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc-features.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc-skill.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/docs/agentirc.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/events.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/history_store.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/ircd.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/remote_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/room_store.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/rooms_util.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/server_link.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skill.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/history.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/icon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/rooms.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/skills/threads.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/agentirc/thread_store.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/aio.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/bot.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/filter_dsl.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/welcome/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/welcome/bot.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/system/welcome/handler.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/agent.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/bot.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/channel.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/introspect.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/mesh.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/constants.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/display.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/formatting.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/mesh.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/shared/process.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/cli/skills.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/culture.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/culture.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/culture.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/culture.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/app.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/commands.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/status.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/constants.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/credentials.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/formatting.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/learn_prompt.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/mesh_config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/observer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/collector.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/model.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/overview/web/style.css +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/persistence.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/pidfile.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/commands.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/events.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/message.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/protocol/replies.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/README.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/architecture-overview.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/bots.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/events.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/agentirc/why-agentirc.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/agent-lifecycle.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/choose-a-harness.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/mental-model.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/operate.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/patterns.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/quickstart.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/reflective-development.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/culture/vision-patterns-index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/layers.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/architecture/threads.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/cli/commands.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/console.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/acp.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/claude.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/codex.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/copilot.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/harnesses/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/architecture.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/config.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/deployment.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/reference/server/security.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/resources/positioning.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/federation.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/harnesses.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/humans-and-agents.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/persistence.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/concepts/rooms.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/demos/magic-demo.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/first-session.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/join-as-human.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/local-setup.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/guides/multi-machine.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/shared/use-cases-index.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-12-console-enhancements.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-15-mesh-events.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-18-culture-dev-positioning.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/plans/2026-04-22-agex-integration.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-12-console-enhancements-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-15-mesh-events-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-17-sites-repositioning-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-18-culture-dev-positioning-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/docs/superpowers/specs/2026-04-22-agex-integration-design.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/favicon.ico +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/culture.yaml +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/robots.txt +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sitemap-agentirc.html +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sitemap-main.html +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sitemap.html +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/sonar-project.properties +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/__init__.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/conftest.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_archive.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot_config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot_config_fires_event_toplevel.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_channel.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_channel_cli.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_cli_devex.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_cli_introspect.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_connection.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_chat_markdown.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_commands.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_connection.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_fixes_224_227.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_icons.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_integration.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_console_status.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_credentials.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_culture_config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_daemon.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_discovery.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_display.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_basic.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_bot_chain.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_bot_trigger.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_cap_fallback.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_catalog.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_federation.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_history.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_lifecycle.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_events_reserved_nick.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_federation.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_filter_dsl.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_history.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_http_listener.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_ipc.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_irc_transport_tags.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_learn_prompt.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_manifest_config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mention_alias.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mention_target_cleanup.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mention_warning.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mentions.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_mesh_readiness.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_message.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_message_tags.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_messaging.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_migrate_cli.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_modes.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_model.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_overview_web.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_persistence.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_persistence_timeout.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_pidfile.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_register_cli.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_rooms.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_skill_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_skill_docs.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_skills.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_socket_server.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_supervisor.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_template_engine.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_threads.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-8.0.0 → agentirc_cli-8.1.0}/tests/test_webhook.py +0 -0
- {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.
|
|
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 (
|
|
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
|
-
|
|
69
|
-
(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
66
|
-
`culture afi
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
###
|
|
73
|
+
### Sibling and upcoming namespaces
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
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,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
412
|
-
|
|
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.
|
|
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]
|