agentirc-cli 6.0.0__tar.gz → 6.0.1__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-6.0.0 → agentirc_cli-6.0.1}/CHANGELOG.md +9 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/PKG-INFO +1 -1
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/agent.py +80 -117
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/server.py +6 -12
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/config.py +284 -7
- agentirc_cli-6.0.1/docs/manifest-migration.md +74 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/pyproject.toml +1 -1
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_archive.py +7 -7
- agentirc_cli-6.0.1/tests/test_manifest_config.py +317 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_migrate_cli.py +25 -14
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/uv.lock +1 -1
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.flake8 +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.gitignore +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.pr_agent.toml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/.pylintrc +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/CLAUDE.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/CNAME +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/Gemfile +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/Gemfile.lock +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/LICENSE +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/README.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/SECURITY.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_config.yml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_includes/head_custom.html +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/apple-touch-icon.png +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/favicon-16x16.png +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/favicon-32x32.png +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/assets/images/favicon.ico +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/__main__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/__main__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/channel.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/history_store.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/ircd.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/remote_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/room_store.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/rooms_util.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/server_link.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skill.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/history.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/icon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/rooms.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/skills/threads.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/agentirc/thread_store.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/aio.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/bot.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/bot.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/channel.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/mesh.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/constants.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/display.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/formatting.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/mesh.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/shared/process.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/cli/skills.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/culture.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/culture.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/culture.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/culture.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/app.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/commands.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/credentials.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/formatting.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/learn_prompt.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/mesh_config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/observer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/collector.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/model.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/overview/web/style.css +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/persistence.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/pidfile.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/commands.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/message.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/protocol/replies.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agent-readiness.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/agents/decentralized-config.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/index.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer1-core-irc.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/server-architecture.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/architecture/threads.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/channel-polling.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/acp/system-prompt.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/culture-cli.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/getting-started.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/index.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/bots.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/ci.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/cli.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/index.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/ops-tooling.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/overview.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/operations/publishing.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/persistent-history.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/reflective-development.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/rooms.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/server-rename.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/use-cases-index.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/docs/what-is-culture.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/favicon.ico +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/culture.yaml +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/sonar-project.properties +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/__init__.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/conftest.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bot.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bot_config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_channel.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_channel_cli.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_connection.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_commands.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_connection.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_icons.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_console_integration.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_credentials.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_culture_config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_daemon.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_discovery.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_display.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_federation.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_history.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_http_listener.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_ipc.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_learn_prompt.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mention_alias.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mention_target_cleanup.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mention_warning.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mentions.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_mesh_readiness.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_message.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_messaging.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_modes.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_model.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_overview_web.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_persistence.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_pidfile.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_register_cli.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_rooms.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_skill_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_skill_docs.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_skills.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_socket_server.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_supervisor.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_template_engine.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_threads.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-6.0.0 → agentirc_cli-6.0.1}/tests/test_webhook.py +0 -0
|
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [6.0.1] - 2026-04-10
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- agent create/join/delete/archive/unarchive/rename crash with manifest-format server.yaml (#208)
|
|
13
|
+
- Auto-migrate legacy agents.yaml to manifest format on first load
|
|
14
|
+
- Server rename/archive/unarchive now work with manifest format
|
|
15
|
+
|
|
7
16
|
## [6.0.0] - 2026-04-10
|
|
8
17
|
|
|
9
18
|
|
|
@@ -12,12 +12,6 @@ from pathlib import Path
|
|
|
12
12
|
|
|
13
13
|
import yaml
|
|
14
14
|
|
|
15
|
-
from culture.clients.claude.config import (
|
|
16
|
-
add_agent_to_config,
|
|
17
|
-
archive_agent,
|
|
18
|
-
remove_agent,
|
|
19
|
-
unarchive_agent,
|
|
20
|
-
)
|
|
21
15
|
from culture.config import (
|
|
22
16
|
AgentConfig,
|
|
23
17
|
DaemonConfig,
|
|
@@ -26,13 +20,17 @@ from culture.config import (
|
|
|
26
20
|
SupervisorConfig,
|
|
27
21
|
WebhookConfig,
|
|
28
22
|
add_to_manifest,
|
|
23
|
+
archive_manifest_agent,
|
|
29
24
|
load_config,
|
|
30
25
|
load_config_or_default,
|
|
31
26
|
load_culture_yaml,
|
|
32
27
|
remove_from_manifest,
|
|
28
|
+
remove_manifest_agent,
|
|
29
|
+
rename_manifest_agent,
|
|
33
30
|
sanitize_agent_name,
|
|
34
31
|
save_culture_yaml,
|
|
35
32
|
save_server_config,
|
|
33
|
+
unarchive_manifest_agent,
|
|
36
34
|
)
|
|
37
35
|
from culture.pidfile import (
|
|
38
36
|
is_process_alive,
|
|
@@ -198,9 +196,6 @@ def register(subparsers: argparse._SubParsersAction) -> None:
|
|
|
198
196
|
"migrate", help="Migrate agents.yaml to server.yaml + culture.yaml"
|
|
199
197
|
)
|
|
200
198
|
migrate_parser.add_argument("--config", default=LEGACY_CONFIG, help="Legacy agents.yaml path")
|
|
201
|
-
migrate_parser.add_argument(
|
|
202
|
-
"--output", default=DEFAULT_SERVER_CONFIG, help="Output server.yaml path"
|
|
203
|
-
)
|
|
204
199
|
|
|
205
200
|
|
|
206
201
|
def dispatch(args: argparse.Namespace) -> None:
|
|
@@ -321,39 +316,73 @@ def _create_agent_config(args: argparse.Namespace, full_nick: str) -> AgentConfi
|
|
|
321
316
|
return _create_default_config(full_nick, args.agent)
|
|
322
317
|
|
|
323
318
|
|
|
324
|
-
def
|
|
325
|
-
|
|
319
|
+
def _check_existing_agent(config, full_nick: str, config_path: str) -> None:
|
|
320
|
+
"""Check for duplicate agent nick. Removes archived duplicates; exits on active ones."""
|
|
321
|
+
for existing in config.agents:
|
|
322
|
+
if existing.nick != full_nick:
|
|
323
|
+
continue
|
|
324
|
+
if existing.archived:
|
|
325
|
+
print(f"Replacing archived agent '{full_nick}'")
|
|
326
|
+
remove_manifest_agent(config_path, full_nick)
|
|
327
|
+
return
|
|
328
|
+
channels = existing.channels if isinstance(existing.channels, list) else []
|
|
329
|
+
print(f"Agent '{full_nick}' already exists in config", file=sys.stderr)
|
|
330
|
+
print(f" Directory: {existing.directory}", file=sys.stderr)
|
|
331
|
+
print(f" Backend: {existing.agent}", file=sys.stderr)
|
|
332
|
+
print(f" Channels: {', '.join(channels)}", file=sys.stderr)
|
|
333
|
+
print(f" Model: {existing.model}", file=sys.stderr)
|
|
334
|
+
print(f" Config: {config_path}", file=sys.stderr)
|
|
335
|
+
print(file=sys.stderr)
|
|
336
|
+
print(f"Start with: culture agent start {full_nick}", file=sys.stderr)
|
|
337
|
+
sys.exit(1)
|
|
326
338
|
|
|
327
|
-
server_name = args.server or config.server.name or "culture"
|
|
328
339
|
|
|
329
|
-
|
|
330
|
-
|
|
340
|
+
def _to_manifest_agent(raw_agent, suffix: str) -> AgentConfig:
|
|
341
|
+
"""Convert a backend-specific AgentConfig to a manifest-format AgentConfig."""
|
|
342
|
+
backend = getattr(raw_agent, "backend", None) or getattr(raw_agent, "agent", "claude")
|
|
343
|
+
extras = {}
|
|
344
|
+
if hasattr(raw_agent, "acp_command") and backend == "acp":
|
|
345
|
+
extras["acp_command"] = raw_agent.acp_command
|
|
346
|
+
return AgentConfig(
|
|
347
|
+
suffix=suffix,
|
|
348
|
+
backend=backend,
|
|
349
|
+
channels=raw_agent.channels,
|
|
350
|
+
model=raw_agent.model,
|
|
351
|
+
directory=raw_agent.directory,
|
|
352
|
+
extras=extras,
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def _save_agent_to_directory(agent: AgentConfig) -> None:
|
|
357
|
+
"""Save agent to culture.yaml, merging with existing agents in the directory."""
|
|
358
|
+
culture_yaml_path = Path(agent.directory) / "culture.yaml"
|
|
359
|
+
if culture_yaml_path.exists():
|
|
360
|
+
existing = load_culture_yaml(agent.directory)
|
|
361
|
+
agents_to_save = [a for a in existing if a.suffix != agent.suffix]
|
|
362
|
+
agents_to_save.append(agent)
|
|
331
363
|
else:
|
|
332
|
-
|
|
333
|
-
|
|
364
|
+
agents_to_save = [agent]
|
|
365
|
+
save_culture_yaml(agent.directory, agents_to_save)
|
|
366
|
+
|
|
334
367
|
|
|
368
|
+
def _cmd_create(args: argparse.Namespace) -> None:
|
|
369
|
+
config = load_config_or_default(args.config)
|
|
370
|
+
|
|
371
|
+
server_name = args.server or config.server.name or "culture"
|
|
372
|
+
suffix = args.nick or sanitize_agent_name(os.path.basename(os.getcwd()))
|
|
335
373
|
full_nick = f"{server_name}-{suffix}"
|
|
336
374
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
remove_agent(args.config, full_nick)
|
|
342
|
-
break
|
|
343
|
-
channels = existing.channels if isinstance(existing.channels, list) else []
|
|
344
|
-
print(f"Agent '{full_nick}' already exists in config", file=sys.stderr)
|
|
345
|
-
print(f" Directory: {existing.directory}", file=sys.stderr)
|
|
346
|
-
print(f" Backend: {existing.agent}", file=sys.stderr)
|
|
347
|
-
print(f" Channels: {', '.join(channels)}", file=sys.stderr)
|
|
348
|
-
print(f" Model: {existing.model}", file=sys.stderr)
|
|
349
|
-
print(f" Config: {args.config}", file=sys.stderr)
|
|
350
|
-
print(file=sys.stderr)
|
|
351
|
-
print(f"Start with: culture agent start {full_nick}", file=sys.stderr)
|
|
352
|
-
sys.exit(1)
|
|
375
|
+
_check_existing_agent(config, full_nick, args.config)
|
|
376
|
+
|
|
377
|
+
raw_agent = _create_agent_config(args, full_nick)
|
|
378
|
+
agent = _to_manifest_agent(raw_agent, suffix)
|
|
353
379
|
|
|
354
|
-
agent
|
|
380
|
+
_save_agent_to_directory(agent)
|
|
381
|
+
add_to_manifest(args.config, suffix, agent.directory)
|
|
355
382
|
|
|
356
|
-
|
|
383
|
+
if args.server and args.server != config.server.name:
|
|
384
|
+
config.server.name = args.server
|
|
385
|
+
save_server_config(str(args.config), config)
|
|
357
386
|
|
|
358
387
|
print(f"Agent created: {full_nick}")
|
|
359
388
|
print(f" Directory: {agent.directory}")
|
|
@@ -717,11 +746,6 @@ def _cmd_status(args: argparse.Namespace) -> None:
|
|
|
717
746
|
|
|
718
747
|
def _cmd_rename(args: argparse.Namespace) -> None:
|
|
719
748
|
"""Rename an agent's suffix within the same server."""
|
|
720
|
-
from culture.clients.claude.config import (
|
|
721
|
-
load_config_or_default,
|
|
722
|
-
rename_agent,
|
|
723
|
-
sanitize_agent_name,
|
|
724
|
-
)
|
|
725
749
|
from culture.pidfile import rename_pid
|
|
726
750
|
|
|
727
751
|
config = load_config_or_default(args.config)
|
|
@@ -749,7 +773,7 @@ def _cmd_rename(args: argparse.Namespace) -> None:
|
|
|
749
773
|
return
|
|
750
774
|
|
|
751
775
|
try:
|
|
752
|
-
|
|
776
|
+
rename_manifest_agent(args.config, old_nick, new_nick)
|
|
753
777
|
except ValueError as exc:
|
|
754
778
|
print(str(exc), file=sys.stderr)
|
|
755
779
|
sys.exit(1)
|
|
@@ -765,11 +789,6 @@ def _cmd_rename(args: argparse.Namespace) -> None:
|
|
|
765
789
|
|
|
766
790
|
def _cmd_assign(args: argparse.Namespace) -> None:
|
|
767
791
|
"""Move an agent to a different server (change nick prefix)."""
|
|
768
|
-
from culture.clients.claude.config import (
|
|
769
|
-
load_config_or_default,
|
|
770
|
-
rename_agent,
|
|
771
|
-
sanitize_agent_name,
|
|
772
|
-
)
|
|
773
792
|
from culture.pidfile import rename_pid
|
|
774
793
|
|
|
775
794
|
config = load_config_or_default(args.config)
|
|
@@ -799,7 +818,7 @@ def _cmd_assign(args: argparse.Namespace) -> None:
|
|
|
799
818
|
return
|
|
800
819
|
|
|
801
820
|
try:
|
|
802
|
-
|
|
821
|
+
rename_manifest_agent(args.config, old_nick, new_nick)
|
|
803
822
|
except ValueError as exc:
|
|
804
823
|
print(str(exc), file=sys.stderr)
|
|
805
824
|
sys.exit(1)
|
|
@@ -941,7 +960,7 @@ def _cmd_archive(args: argparse.Namespace) -> None:
|
|
|
941
960
|
if pid and is_process_alive(pid):
|
|
942
961
|
stop_agent(args.nick)
|
|
943
962
|
|
|
944
|
-
|
|
963
|
+
archive_manifest_agent(args.config, args.nick, reason=args.reason)
|
|
945
964
|
|
|
946
965
|
print(f"Agent archived: {args.nick}")
|
|
947
966
|
if args.reason:
|
|
@@ -952,7 +971,7 @@ def _cmd_archive(args: argparse.Namespace) -> None:
|
|
|
952
971
|
def _cmd_unarchive(args: argparse.Namespace) -> None:
|
|
953
972
|
"""Restore an archived agent."""
|
|
954
973
|
try:
|
|
955
|
-
|
|
974
|
+
unarchive_manifest_agent(args.config, args.nick)
|
|
956
975
|
except ValueError as exc:
|
|
957
976
|
print(str(exc), file=sys.stderr)
|
|
958
977
|
sys.exit(1)
|
|
@@ -974,7 +993,7 @@ def _cmd_delete(args: argparse.Namespace) -> None:
|
|
|
974
993
|
if pid and is_process_alive(pid):
|
|
975
994
|
stop_agent(args.nick)
|
|
976
995
|
|
|
977
|
-
|
|
996
|
+
remove_manifest_agent(args.config, args.nick)
|
|
978
997
|
print(f"Agent deleted: {args.nick}")
|
|
979
998
|
|
|
980
999
|
|
|
@@ -1044,77 +1063,21 @@ def _cmd_unregister(args: argparse.Namespace) -> None:
|
|
|
1044
1063
|
|
|
1045
1064
|
def _cmd_migrate(args: argparse.Namespace) -> None:
|
|
1046
1065
|
"""Migrate from agents.yaml to server.yaml + per-directory culture.yaml."""
|
|
1066
|
+
from culture.config import _is_legacy_format, migrate_legacy_to_manifest
|
|
1067
|
+
|
|
1047
1068
|
legacy_path = Path(args.config)
|
|
1048
1069
|
if not legacy_path.exists():
|
|
1049
1070
|
print(f"No agents.yaml found at {legacy_path}", file=sys.stderr)
|
|
1050
1071
|
sys.exit(1)
|
|
1051
1072
|
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
# Group agents by directory
|
|
1059
|
-
by_dir: dict[str, list[tuple[str, dict]]] = {}
|
|
1060
|
-
for agent_raw in raw.get("agents", []):
|
|
1061
|
-
nick = agent_raw.get("nick", "")
|
|
1062
|
-
suffix = nick.removeprefix(prefix) if nick.startswith(prefix) else nick
|
|
1063
|
-
directory = str(Path(agent_raw.get("directory", ".")).resolve())
|
|
1064
|
-
by_dir.setdefault(directory, []).append((suffix, agent_raw))
|
|
1065
|
-
|
|
1066
|
-
# Create culture.yaml in each directory
|
|
1067
|
-
manifest: dict[str, str] = {}
|
|
1068
|
-
for directory, entries in by_dir.items():
|
|
1069
|
-
agents = []
|
|
1070
|
-
for suffix, agent_raw in entries:
|
|
1071
|
-
backend = agent_raw.get("agent", "claude")
|
|
1072
|
-
known_fields = {
|
|
1073
|
-
"suffix": suffix,
|
|
1074
|
-
"backend": backend,
|
|
1075
|
-
"channels": agent_raw.get("channels", ["#general"]),
|
|
1076
|
-
"model": agent_raw.get("model", "claude-opus-4-6"),
|
|
1077
|
-
"thinking": agent_raw.get("thinking", "medium"),
|
|
1078
|
-
"system_prompt": agent_raw.get("system_prompt", ""),
|
|
1079
|
-
"tags": agent_raw.get("tags", []),
|
|
1080
|
-
"icon": agent_raw.get("icon"),
|
|
1081
|
-
"archived": agent_raw.get("archived", False),
|
|
1082
|
-
"archived_at": agent_raw.get("archived_at", ""),
|
|
1083
|
-
"archived_reason": agent_raw.get("archived_reason", ""),
|
|
1084
|
-
}
|
|
1085
|
-
skip_keys = set(known_fields.keys()) | {"nick", "directory", "agent"}
|
|
1086
|
-
extras = {k: v for k, v in agent_raw.items() if k not in skip_keys}
|
|
1087
|
-
agents.append(AgentConfig(**known_fields, extras=extras))
|
|
1088
|
-
manifest[suffix] = directory
|
|
1089
|
-
|
|
1090
|
-
dir_path = Path(directory)
|
|
1091
|
-
dir_path.mkdir(parents=True, exist_ok=True)
|
|
1092
|
-
save_culture_yaml(directory, agents)
|
|
1093
|
-
print(f" Created {directory}/culture.yaml ({len(agents)} agent(s))")
|
|
1094
|
-
|
|
1095
|
-
# Create server.yaml
|
|
1096
|
-
server = ServerConnConfig(**raw.get("server", {}))
|
|
1097
|
-
supervisor = SupervisorConfig(**raw.get("supervisor", {}))
|
|
1098
|
-
webhooks = WebhookConfig(**raw.get("webhooks", {}))
|
|
1099
|
-
server_config = ServerConfig(
|
|
1100
|
-
server=server,
|
|
1101
|
-
supervisor=supervisor,
|
|
1102
|
-
webhooks=webhooks,
|
|
1103
|
-
buffer_size=raw.get("buffer_size", 500),
|
|
1104
|
-
poll_interval=raw.get("poll_interval", 60),
|
|
1105
|
-
sleep_start=raw.get("sleep_start", "23:00"),
|
|
1106
|
-
sleep_end=raw.get("sleep_end", "08:00"),
|
|
1107
|
-
manifest=manifest,
|
|
1108
|
-
)
|
|
1073
|
+
if not _is_legacy_format(legacy_path):
|
|
1074
|
+
print(f"{legacy_path} is already in manifest format", file=sys.stderr)
|
|
1075
|
+
sys.exit(1)
|
|
1076
|
+
|
|
1077
|
+
config = migrate_legacy_to_manifest(legacy_path)
|
|
1109
1078
|
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
print(f"
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
backup = legacy_path.with_suffix(".yaml.bak")
|
|
1116
|
-
legacy_path.rename(backup)
|
|
1117
|
-
print(f" Backed up {legacy_path} -> {backup}")
|
|
1118
|
-
print(f"\nMigration complete: {len(manifest)} agent(s) across {len(by_dir)} directory(ies)")
|
|
1119
|
-
print(f"\nAgent commands now use {output_path} by default.")
|
|
1120
|
-
print(f"Verify with: culture agent status")
|
|
1079
|
+
agent_count = len(config.manifest)
|
|
1080
|
+
dir_count = len(set(config.manifest.values()))
|
|
1081
|
+
print(f"\nMigration complete: {agent_count} agent(s) across {dir_count} directory(ies)")
|
|
1082
|
+
print(f"\nAgent commands now use {legacy_path} by default.")
|
|
1083
|
+
print("Verify with: culture agent status")
|
|
@@ -191,7 +191,7 @@ def dispatch(args: argparse.Namespace) -> None:
|
|
|
191
191
|
|
|
192
192
|
def _server_rename(args: argparse.Namespace) -> None:
|
|
193
193
|
"""Rename the server: update config, agent nicks, and PID files."""
|
|
194
|
-
from culture.
|
|
194
|
+
from culture.config import rename_manifest_server, sanitize_agent_name
|
|
195
195
|
from culture.pidfile import (
|
|
196
196
|
is_process_alive,
|
|
197
197
|
read_default_server,
|
|
@@ -207,7 +207,7 @@ def _server_rename(args: argparse.Namespace) -> None:
|
|
|
207
207
|
sys.exit(1)
|
|
208
208
|
|
|
209
209
|
try:
|
|
210
|
-
old_name, renamed =
|
|
210
|
+
old_name, renamed = rename_manifest_server(args.config, new_name)
|
|
211
211
|
except ValueError as exc:
|
|
212
212
|
print(str(exc), file=sys.stderr)
|
|
213
213
|
sys.exit(1)
|
|
@@ -578,10 +578,7 @@ def _set_bots_archive_state(agent_nicks: set, *, archive: bool, reason: str = ""
|
|
|
578
578
|
|
|
579
579
|
def _server_archive(args: argparse.Namespace) -> None:
|
|
580
580
|
"""Archive the server and cascade to all agents and bots."""
|
|
581
|
-
from culture.
|
|
582
|
-
archive_server,
|
|
583
|
-
load_config_or_default,
|
|
584
|
-
)
|
|
581
|
+
from culture.config import archive_manifest_server, load_config_or_default
|
|
585
582
|
|
|
586
583
|
config = load_config_or_default(args.config)
|
|
587
584
|
server_name = _validate_config_name(config, args.name)
|
|
@@ -606,7 +603,7 @@ def _server_archive(args: argparse.Namespace) -> None:
|
|
|
606
603
|
stop_agent(agent.nick)
|
|
607
604
|
|
|
608
605
|
# Archive server + agents in config
|
|
609
|
-
archived_nicks =
|
|
606
|
+
archived_nicks = archive_manifest_server(args.config, reason=args.reason)
|
|
610
607
|
|
|
611
608
|
# Archive bots whose owner matches any agent on this server
|
|
612
609
|
agent_nicks = {a.nick for a in config.agents}
|
|
@@ -624,10 +621,7 @@ def _server_archive(args: argparse.Namespace) -> None:
|
|
|
624
621
|
|
|
625
622
|
def _server_unarchive(args: argparse.Namespace) -> None:
|
|
626
623
|
"""Restore an archived server and cascade to agents and bots."""
|
|
627
|
-
from culture.
|
|
628
|
-
load_config_or_default,
|
|
629
|
-
unarchive_server,
|
|
630
|
-
)
|
|
624
|
+
from culture.config import load_config_or_default, unarchive_manifest_server
|
|
631
625
|
|
|
632
626
|
config = load_config_or_default(args.config)
|
|
633
627
|
server_name = _validate_config_name(config, args.name)
|
|
@@ -637,7 +631,7 @@ def _server_unarchive(args: argparse.Namespace) -> None:
|
|
|
637
631
|
sys.exit(1)
|
|
638
632
|
|
|
639
633
|
# Unarchive server + agents
|
|
640
|
-
unarchived_nicks =
|
|
634
|
+
unarchived_nicks = unarchive_manifest_server(args.config)
|
|
641
635
|
|
|
642
636
|
# Unarchive bots whose owner matches any agent on this server
|
|
643
637
|
agent_nicks = {a.nick for a in config.agents}
|