agentirc-cli 5.0.1__tar.gz → 5.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/CHANGELOG.md +8 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/PKG-INFO +1 -1
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/mesh.py +44 -11
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/credentials.py +11 -6
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/pyproject.toml +1 -1
- agentirc_cli-5.0.2/tests/test_credentials.py +24 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/uv.lock +1 -1
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.flake8 +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.gitignore +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.pr_agent.toml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/.pylintrc +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/CLAUDE.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/CNAME +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/Gemfile +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/Gemfile.lock +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/LICENSE +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/README.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/SECURITY.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_config.yml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_includes/head_custom.html +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/apple-touch-icon.png +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/favicon-16x16.png +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/favicon-32x32.png +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/assets/images/favicon.ico +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/__main__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/aio.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/bot.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/agent.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/bot.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/channel.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/constants.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/display.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/formatting.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/mesh.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/shared/process.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/cli/skills.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/culture.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/culture.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/culture.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/culture.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/app.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/commands.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/formatting.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/learn_prompt.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/mesh_config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/observer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/collector.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/model.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/overview/web/style.css +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/persistence.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/pidfile.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/commands.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/message.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/protocol/replies.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/__main__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/channel.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/history_store.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/ircd.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/remote_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/room_store.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/rooms_util.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/server_link.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skill.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/history.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/icon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/rooms.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/skills/threads.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/server/thread_store.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/agents/decentralized-config.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/index.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer1-core-irc.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/server-architecture.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/architecture/threads.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/channel-polling.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/acp/system-prompt.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/culture-cli.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/getting-started.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/index.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/bots.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/ci.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/cli.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/index.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/ops-tooling.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/overview.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/operations/publishing.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/persistent-history.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/reflective-development.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/rooms.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/server-rename.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/use-cases-index.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/docs/what-is-culture.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/favicon.ico +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/culture.yaml +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/sonar-project.properties +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/__init__.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/conftest.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_archive.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bot.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bot_config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_channel.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_connection.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_commands.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_connection.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_icons.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_console_integration.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_culture_config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_daemon.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_discovery.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_display.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_federation.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_history.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_http_listener.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_ipc.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_learn_prompt.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mention_alias.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mention_target_cleanup.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mention_warning.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mentions.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_message.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_messaging.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_migrate_cli.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_modes.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_model.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_overview_web.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_persistence.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_pidfile.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_register_cli.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_rooms.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_skill_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_skill_docs.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_skills.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_socket_server.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_supervisor.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_template_engine.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_threads.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-5.0.1 → agentirc_cli-5.0.2}/tests/test_webhook.py +0 -0
|
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [5.0.2] - 2026-04-09
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Handle missing credential tool (secret-tool/security/powershell) gracefully instead of crashing the server
|
|
13
|
+
- Report restart failures in mesh update instead of claiming success
|
|
14
|
+
|
|
7
15
|
## [5.0.1] - 2026-04-09
|
|
8
16
|
|
|
9
17
|
|
|
@@ -469,16 +469,18 @@ def _upgrade_culture_package(args: argparse.Namespace) -> bool:
|
|
|
469
469
|
os.execvp(culture_bin, reexec_args)
|
|
470
470
|
|
|
471
471
|
|
|
472
|
-
def _wait_for_server_port(port: int, retries: int = 50, interval: float = 0.1) ->
|
|
473
|
-
"""Poll until *port* accepts a TCP connection."""
|
|
472
|
+
def _wait_for_server_port(host: str, port: int, retries: int = 50, interval: float = 0.1) -> bool:
|
|
473
|
+
"""Poll until *host*:*port* accepts a TCP connection. Returns True on success."""
|
|
474
474
|
import socket as _socket
|
|
475
475
|
|
|
476
|
+
probe = "localhost" if host in ("0.0.0.0", "::", "") else host
|
|
476
477
|
for _ in range(retries):
|
|
477
478
|
try:
|
|
478
|
-
with _socket.create_connection((
|
|
479
|
-
return
|
|
479
|
+
with _socket.create_connection((probe, port), timeout=1):
|
|
480
|
+
return True
|
|
480
481
|
except OSError:
|
|
481
482
|
time.sleep(interval)
|
|
483
|
+
return False
|
|
482
484
|
|
|
483
485
|
|
|
484
486
|
def _dry_run_restart(mesh, server_name: str) -> None:
|
|
@@ -509,13 +511,16 @@ def _restart_single_service(svc_name: str, fallback_cmd: list[str], restart_serv
|
|
|
509
511
|
|
|
510
512
|
def _restart_mesh_services(
|
|
511
513
|
mesh, server_name: str, culture_bin: str, config_path: str, dry_run: bool
|
|
512
|
-
) ->
|
|
513
|
-
"""Stop agents and server, regenerate service entries, then restart everything.
|
|
514
|
+
) -> bool:
|
|
515
|
+
"""Stop agents and server, regenerate service entries, then restart everything.
|
|
516
|
+
|
|
517
|
+
Returns True if the server came up successfully, False otherwise.
|
|
518
|
+
"""
|
|
514
519
|
print(f"Restarting mesh node '{server_name}'...")
|
|
515
520
|
|
|
516
521
|
if dry_run:
|
|
517
522
|
_dry_run_restart(mesh, server_name)
|
|
518
|
-
return
|
|
523
|
+
return True
|
|
519
524
|
|
|
520
525
|
for agent in mesh.agents:
|
|
521
526
|
full_nick = f"{server_name}-{agent.nick}"
|
|
@@ -561,7 +566,17 @@ def _restart_mesh_services(
|
|
|
561
566
|
]
|
|
562
567
|
_restart_single_service(server_svc, server_fallback, restart_service)
|
|
563
568
|
|
|
564
|
-
_wait_for_server_port(mesh.server.port)
|
|
569
|
+
if not _wait_for_server_port(mesh.server.host, mesh.server.port):
|
|
570
|
+
if sys.platform == "linux":
|
|
571
|
+
hint = f"journalctl --user -u culture-server-{server_name}"
|
|
572
|
+
else:
|
|
573
|
+
hint = f"~/.culture/logs/server-{server_name}.log"
|
|
574
|
+
print(
|
|
575
|
+
f" Error: server {server_name} did not start on port {mesh.server.port}. "
|
|
576
|
+
f"Check logs: {hint}",
|
|
577
|
+
file=sys.stderr,
|
|
578
|
+
)
|
|
579
|
+
return False
|
|
565
580
|
|
|
566
581
|
for agent in mesh.agents:
|
|
567
582
|
full_nick = f"{server_name}-{agent.nick}"
|
|
@@ -579,6 +594,7 @@ def _restart_mesh_services(
|
|
|
579
594
|
_restart_single_service(agent_svc, agent_fallback, restart_service)
|
|
580
595
|
|
|
581
596
|
print()
|
|
597
|
+
return True
|
|
582
598
|
|
|
583
599
|
|
|
584
600
|
def _resolve_mesh_for_server(server_name: str, config_path: str):
|
|
@@ -630,6 +646,7 @@ def _cmd_update(args: argparse.Namespace) -> None:
|
|
|
630
646
|
culture_bin = shutil.which("culture") or "culture"
|
|
631
647
|
|
|
632
648
|
running = list_servers()
|
|
649
|
+
failed = []
|
|
633
650
|
|
|
634
651
|
if running:
|
|
635
652
|
for srv in running:
|
|
@@ -640,7 +657,10 @@ def _cmd_update(args: argparse.Namespace) -> None:
|
|
|
640
657
|
file=sys.stderr,
|
|
641
658
|
)
|
|
642
659
|
continue
|
|
643
|
-
_restart_mesh_services(
|
|
660
|
+
if not _restart_mesh_services(
|
|
661
|
+
mesh, srv["name"], culture_bin, args.config, args.dry_run
|
|
662
|
+
):
|
|
663
|
+
failed.append(srv["name"])
|
|
644
664
|
else:
|
|
645
665
|
try:
|
|
646
666
|
mesh = load_mesh_config(args.config)
|
|
@@ -648,6 +668,19 @@ def _cmd_update(args: argparse.Namespace) -> None:
|
|
|
648
668
|
mesh = generate_mesh_from_agents(args.config)
|
|
649
669
|
if mesh is None:
|
|
650
670
|
sys.exit(1)
|
|
651
|
-
_restart_mesh_services(
|
|
671
|
+
if not _restart_mesh_services(
|
|
672
|
+
mesh, mesh.server.name, culture_bin, args.config, args.dry_run
|
|
673
|
+
):
|
|
674
|
+
failed.append(mesh.server.name)
|
|
675
|
+
|
|
676
|
+
if failed:
|
|
677
|
+
print(
|
|
678
|
+
f"Update finished with errors. Failed to restart: {', '.join(failed)}",
|
|
679
|
+
file=sys.stderr,
|
|
680
|
+
)
|
|
681
|
+
sys.exit(1)
|
|
652
682
|
|
|
653
|
-
|
|
683
|
+
if args.dry_run:
|
|
684
|
+
print("Dry run complete. No services were restarted.")
|
|
685
|
+
else:
|
|
686
|
+
print("Update complete. All services restarted.")
|
|
@@ -21,12 +21,17 @@ SERVICE_NAME = "culture"
|
|
|
21
21
|
|
|
22
22
|
def _run(args: list[str], input: str | None = None) -> tuple[int, str]:
|
|
23
23
|
"""Run a command and return (returncode, stdout)."""
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
try:
|
|
25
|
+
result = subprocess.run(
|
|
26
|
+
args,
|
|
27
|
+
input=input,
|
|
28
|
+
capture_output=True,
|
|
29
|
+
text=True,
|
|
30
|
+
)
|
|
31
|
+
except FileNotFoundError:
|
|
32
|
+
tool = {"darwin": "security", "win32": "powershell"}.get(sys.platform, "secret-tool")
|
|
33
|
+
logger.warning("Credential tool '%s' not found — is it installed?", tool)
|
|
34
|
+
return 127, ""
|
|
30
35
|
return result.returncode, result.stdout.strip()
|
|
31
36
|
|
|
32
37
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Tests for culture.credentials — OS credential store helpers."""
|
|
2
|
+
|
|
3
|
+
from unittest.mock import patch
|
|
4
|
+
|
|
5
|
+
from culture.credentials import _run, lookup_credential, store_credential
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_run_missing_binary():
|
|
9
|
+
"""_run() returns (127, '') when the binary is not found."""
|
|
10
|
+
rc, out = _run(["nonexistent-binary-xyz-12345"])
|
|
11
|
+
assert rc == 127
|
|
12
|
+
assert out == ""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_lookup_credential_missing_tool():
|
|
16
|
+
"""lookup_credential() returns None when the credential tool is missing."""
|
|
17
|
+
with patch("culture.credentials._run", return_value=(127, "")):
|
|
18
|
+
assert lookup_credential("some-peer") is None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_store_credential_missing_tool():
|
|
22
|
+
"""store_credential() returns False when the credential tool is missing."""
|
|
23
|
+
with patch("culture.credentials._run", return_value=(127, "")):
|
|
24
|
+
assert store_credential("some-peer", "password") is False
|
|
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
|
|
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
|