agentirc-cli 3.1.0__tar.gz → 3.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/CHANGELOG.md +14 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/PKG-INFO +1 -1
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/cli.py +26 -9
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/mesh_config.py +35 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/ops-tooling.md +10 -6
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/pyproject.toml +1 -1
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_mesh_config.py +57 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/uv.lock +1 -1
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.flake8 +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.gitignore +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.pr_agent.toml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/.pylintrc +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/CLAUDE.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/CNAME +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/Gemfile +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/Gemfile.lock +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/LICENSE +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/README.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/SECURITY.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/_config.yml +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/__main__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/bot.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/app.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/commands.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/credentials.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/learn_prompt.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/observer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/collector.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/model.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/overview/web/style.css +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/persistence.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/pidfile.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/commands.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/message.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/protocol/replies.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/__main__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/channel.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/ircd.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/remote_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/room_store.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/rooms_util.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/server_link.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skill.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/history.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/icon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/rooms.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/skills/threads.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/server/thread_store.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/index.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer1-core-irc.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/server-architecture.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/architecture/threads.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/culture-cli.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/getting-started.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/index.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/bots.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/ci.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/cli.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/index.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/overview.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/operations/publishing.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/rooms.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/server-rename.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/use-cases-index.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/docs/what-is-culture.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/sonar-project.properties +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/__init__.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/conftest.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bot.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bot_config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_channel.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_connection.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_commands.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_connection.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_icons.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_console_integration.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_daemon.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_discovery.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_federation.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_history.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_http_listener.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_ipc.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_mentions.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_message.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_messaging.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_modes.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_model.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_overview_web.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_persistence.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_pidfile.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_rooms.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_skill_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_skills.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_socket_server.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_supervisor.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_template_engine.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_threads.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-3.1.0 → agentirc_cli-3.1.2}/tests/test_webhook.py +0 -0
|
@@ -4,6 +4,20 @@ 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
|
+
## [3.1.2] - 2026-04-06
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- culture update used wrong package name (culture-cli) for uv tool upgrade
|
|
13
|
+
|
|
14
|
+
## [3.1.1] - 2026-04-06
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- culture update and setup auto-generate mesh.yaml from agents.yaml when mesh.yaml is missing
|
|
20
|
+
|
|
7
21
|
## [3.1.0] - 2026-04-06
|
|
8
22
|
|
|
9
23
|
|
|
@@ -1899,6 +1899,22 @@ def _resolve_links_from_mesh(mesh_config_path: str) -> list:
|
|
|
1899
1899
|
# -----------------------------------------------------------------------
|
|
1900
1900
|
|
|
1901
1901
|
|
|
1902
|
+
def _generate_mesh_from_agents(mesh_config_path: str):
|
|
1903
|
+
"""Fall back to generating mesh.yaml from agents.yaml when mesh.yaml is missing."""
|
|
1904
|
+
from culture.mesh_config import from_daemon_config, save_mesh_config
|
|
1905
|
+
|
|
1906
|
+
if not os.path.isfile(DEFAULT_CONFIG):
|
|
1907
|
+
print(f"Mesh config not found: {mesh_config_path}", file=sys.stderr)
|
|
1908
|
+
print(f"Agent config not found either: {DEFAULT_CONFIG}", file=sys.stderr)
|
|
1909
|
+
return None
|
|
1910
|
+
|
|
1911
|
+
daemon_config = load_config(DEFAULT_CONFIG)
|
|
1912
|
+
mesh = from_daemon_config(daemon_config)
|
|
1913
|
+
save_mesh_config(mesh, mesh_config_path)
|
|
1914
|
+
print(f"No mesh.yaml found — generated from {DEFAULT_CONFIG}")
|
|
1915
|
+
return mesh
|
|
1916
|
+
|
|
1917
|
+
|
|
1902
1918
|
def _build_server_start_cmd(mesh, culture_bin: str, mesh_config_path: str) -> list[str]:
|
|
1903
1919
|
"""Build the server start command with --foreground and --mesh-config.
|
|
1904
1920
|
|
|
@@ -2014,9 +2030,9 @@ def _cmd_setup(args: argparse.Namespace) -> None:
|
|
|
2014
2030
|
try:
|
|
2015
2031
|
mesh = load_mesh_config(args.config)
|
|
2016
2032
|
except FileNotFoundError:
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2033
|
+
mesh = _generate_mesh_from_agents(args.config)
|
|
2034
|
+
if mesh is None:
|
|
2035
|
+
sys.exit(1)
|
|
2020
2036
|
|
|
2021
2037
|
server_name = mesh.server.name
|
|
2022
2038
|
|
|
@@ -2084,7 +2100,7 @@ def _server_stop_by_name(name: str) -> None:
|
|
|
2084
2100
|
|
|
2085
2101
|
|
|
2086
2102
|
def _upgrade_culture_package(args: argparse.Namespace) -> bool:
|
|
2087
|
-
"""Upgrade the culture
|
|
2103
|
+
"""Upgrade the culture package via uv or pip, then re-exec with --skip-upgrade.
|
|
2088
2104
|
|
|
2089
2105
|
Returns True if the caller should proceed with the restart phase
|
|
2090
2106
|
(``--skip-upgrade`` was set). Returns False for dry-run (caller should stop).
|
|
@@ -2094,7 +2110,7 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
|
|
|
2094
2110
|
return True
|
|
2095
2111
|
|
|
2096
2112
|
if args.dry_run:
|
|
2097
|
-
print("[dry-run] Would run: uv tool upgrade culture
|
|
2113
|
+
print("[dry-run] Would run: uv tool upgrade culture")
|
|
2098
2114
|
print("[dry-run] Would re-exec with --skip-upgrade")
|
|
2099
2115
|
return False
|
|
2100
2116
|
|
|
@@ -2103,7 +2119,7 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
|
|
|
2103
2119
|
if uv:
|
|
2104
2120
|
print("Upgrading via uv...")
|
|
2105
2121
|
result = subprocess.run(
|
|
2106
|
-
[uv, "tool", "upgrade", "culture
|
|
2122
|
+
[uv, "tool", "upgrade", "culture"],
|
|
2107
2123
|
capture_output=True,
|
|
2108
2124
|
text=True,
|
|
2109
2125
|
)
|
|
@@ -2116,7 +2132,7 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
|
|
|
2116
2132
|
if pip:
|
|
2117
2133
|
print("Upgrading via pip...")
|
|
2118
2134
|
result = subprocess.run(
|
|
2119
|
-
[pip, "install", "--upgrade", "culture
|
|
2135
|
+
[pip, "install", "--upgrade", "culture"],
|
|
2120
2136
|
capture_output=True,
|
|
2121
2137
|
text=True,
|
|
2122
2138
|
)
|
|
@@ -2239,8 +2255,9 @@ def _cmd_update(args: argparse.Namespace) -> None:
|
|
|
2239
2255
|
try:
|
|
2240
2256
|
mesh = load_mesh_config(args.config)
|
|
2241
2257
|
except FileNotFoundError:
|
|
2242
|
-
|
|
2243
|
-
|
|
2258
|
+
mesh = _generate_mesh_from_agents(args.config)
|
|
2259
|
+
if mesh is None:
|
|
2260
|
+
sys.exit(1)
|
|
2244
2261
|
|
|
2245
2262
|
server_name = mesh.server.name
|
|
2246
2263
|
|
|
@@ -6,9 +6,13 @@ import os
|
|
|
6
6
|
import tempfile
|
|
7
7
|
from dataclasses import asdict, dataclass, field
|
|
8
8
|
from pathlib import Path
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
9
10
|
|
|
10
11
|
import yaml
|
|
11
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from culture.clients.claude.config import DaemonConfig
|
|
15
|
+
|
|
12
16
|
|
|
13
17
|
@dataclass
|
|
14
18
|
class MeshLinkConfig:
|
|
@@ -73,6 +77,37 @@ def load_mesh_config(path: str | Path = DEFAULT_MESH_PATH) -> MeshConfig:
|
|
|
73
77
|
return MeshConfig(server=server, agents=agents)
|
|
74
78
|
|
|
75
79
|
|
|
80
|
+
def from_daemon_config(daemon_config: DaemonConfig) -> MeshConfig:
|
|
81
|
+
"""Derive a MeshConfig from an existing DaemonConfig (agents.yaml).
|
|
82
|
+
|
|
83
|
+
Useful when mesh.yaml doesn't exist but the user has a running mesh
|
|
84
|
+
started manually via ``culture server start`` + ``culture start``.
|
|
85
|
+
|
|
86
|
+
Note: DaemonConfig.server.host is the *connection* target (often localhost),
|
|
87
|
+
while MeshServerConfig.host is the *listen* address. We use the default
|
|
88
|
+
0.0.0.0 for the listen address to preserve external accessibility.
|
|
89
|
+
"""
|
|
90
|
+
server = MeshServerConfig(
|
|
91
|
+
name=daemon_config.server.name,
|
|
92
|
+
port=daemon_config.server.port,
|
|
93
|
+
)
|
|
94
|
+
server_prefix = f"{daemon_config.server.name}-"
|
|
95
|
+
agents = []
|
|
96
|
+
for a in daemon_config.agents:
|
|
97
|
+
nick = a.nick
|
|
98
|
+
if nick.startswith(server_prefix):
|
|
99
|
+
nick = nick[len(server_prefix) :]
|
|
100
|
+
agents.append(
|
|
101
|
+
MeshAgentConfig(
|
|
102
|
+
nick=nick,
|
|
103
|
+
type=a.agent,
|
|
104
|
+
workdir=a.directory,
|
|
105
|
+
channels=list(a.channels),
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
return MeshConfig(server=server, agents=agents)
|
|
109
|
+
|
|
110
|
+
|
|
76
111
|
def save_mesh_config(config: MeshConfig, path: str | Path = DEFAULT_MESH_PATH) -> None:
|
|
77
112
|
"""Serialize mesh config to YAML and write atomically."""
|
|
78
113
|
path = Path(path)
|
|
@@ -96,7 +96,9 @@ culture setup --uninstall # remove all services and stop processes
|
|
|
96
96
|
|
|
97
97
|
### What setup does
|
|
98
98
|
|
|
99
|
-
1. Loads `mesh.yaml`.
|
|
99
|
+
1. Loads `mesh.yaml`. If the file is missing but `~/.culture/agents.yaml`
|
|
100
|
+
exists, auto-generates `mesh.yaml` from it (listen host defaults to
|
|
101
|
+
`0.0.0.0`, no federation links).
|
|
100
102
|
2. For each peer link, checks the OS credential store. If no credential is
|
|
101
103
|
found, prompts interactively and stores the password in the OS keyring
|
|
102
104
|
(never written to files).
|
|
@@ -147,11 +149,13 @@ culture update --config /path/mesh.yaml
|
|
|
147
149
|
|
|
148
150
|
### What update does
|
|
149
151
|
|
|
150
|
-
1.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
152
|
+
1. Loads `mesh.yaml`. If the file is missing but `~/.culture/agents.yaml`
|
|
153
|
+
exists, auto-generates `mesh.yaml` from it (same fallback as `setup`).
|
|
154
|
+
2. Upgrades `culture` via `uv tool upgrade` (falls back to `pip install --upgrade`).
|
|
155
|
+
3. Re-execs itself with `--skip-upgrade` so the restart runs with the new binary.
|
|
156
|
+
4. Stops all agents, then stops the server.
|
|
157
|
+
5. Regenerates auto-start service entries (picks up any config changes).
|
|
158
|
+
6. Starts the server, waits for it to accept connections, then starts all agents.
|
|
155
159
|
|
|
156
160
|
The `--dry-run` output shows every step without touching running services:
|
|
157
161
|
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
5
|
|
|
6
|
+
from culture.clients.claude.config import AgentConfig, DaemonConfig, ServerConnConfig
|
|
6
7
|
from culture.mesh_config import (
|
|
7
8
|
MeshAgentConfig,
|
|
8
9
|
MeshConfig,
|
|
9
10
|
MeshLinkConfig,
|
|
10
11
|
MeshServerConfig,
|
|
12
|
+
from_daemon_config,
|
|
11
13
|
load_mesh_config,
|
|
12
14
|
save_mesh_config,
|
|
13
15
|
)
|
|
@@ -96,3 +98,58 @@ def test_mesh_config_file_not_found():
|
|
|
96
98
|
"""Loading a missing file raises FileNotFoundError."""
|
|
97
99
|
with pytest.raises(FileNotFoundError):
|
|
98
100
|
load_mesh_config("/nonexistent/mesh.yaml")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_from_daemon_config_strips_prefix():
|
|
104
|
+
"""from_daemon_config strips server prefix from agent nicks."""
|
|
105
|
+
daemon = DaemonConfig(
|
|
106
|
+
server=ServerConnConfig(name="spark", host="localhost", port=6667),
|
|
107
|
+
agents=[
|
|
108
|
+
AgentConfig(
|
|
109
|
+
nick="spark-claude",
|
|
110
|
+
agent="claude",
|
|
111
|
+
directory="/home/user/proj",
|
|
112
|
+
channels=["#general", "#dev"],
|
|
113
|
+
),
|
|
114
|
+
AgentConfig(
|
|
115
|
+
nick="spark-codex",
|
|
116
|
+
agent="codex",
|
|
117
|
+
directory="/home/user/other",
|
|
118
|
+
channels=["#general"],
|
|
119
|
+
),
|
|
120
|
+
],
|
|
121
|
+
)
|
|
122
|
+
mesh = from_daemon_config(daemon)
|
|
123
|
+
|
|
124
|
+
assert mesh.server.name == "spark"
|
|
125
|
+
assert mesh.server.host == "0.0.0.0" # listen address, not connection target
|
|
126
|
+
assert mesh.server.port == 6667
|
|
127
|
+
assert mesh.server.links == []
|
|
128
|
+
assert len(mesh.agents) == 2
|
|
129
|
+
assert mesh.agents[0].nick == "claude"
|
|
130
|
+
assert mesh.agents[0].type == "claude"
|
|
131
|
+
assert mesh.agents[0].workdir == "/home/user/proj"
|
|
132
|
+
assert mesh.agents[0].channels == ["#general", "#dev"]
|
|
133
|
+
assert mesh.agents[1].nick == "codex"
|
|
134
|
+
assert mesh.agents[1].type == "codex"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def test_from_daemon_config_unprefixed_nick():
|
|
138
|
+
"""from_daemon_config handles nicks without server prefix."""
|
|
139
|
+
daemon = DaemonConfig(
|
|
140
|
+
server=ServerConnConfig(name="spark"),
|
|
141
|
+
agents=[AgentConfig(nick="standalone", agent="claude", directory=".")],
|
|
142
|
+
)
|
|
143
|
+
mesh = from_daemon_config(daemon)
|
|
144
|
+
assert mesh.agents[0].nick == "standalone"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def test_from_daemon_config_empty_agents():
|
|
148
|
+
"""from_daemon_config works with no agents."""
|
|
149
|
+
daemon = DaemonConfig(
|
|
150
|
+
server=ServerConnConfig(name="test", port=7000),
|
|
151
|
+
)
|
|
152
|
+
mesh = from_daemon_config(daemon)
|
|
153
|
+
assert mesh.server.name == "test"
|
|
154
|
+
assert mesh.server.port == 7000
|
|
155
|
+
assert mesh.agents == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|