agentirc-cli 4.4.3__tar.gz → 4.5.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-4.4.3 → agentirc_cli-4.5.1}/CHANGELOG.md +27 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/CLAUDE.md +17 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/PKG-INFO +2 -2
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/README.md +1 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/agent.py +191 -6
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/bot.py +1 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/mesh.py +1 -4
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/server.py +2 -2
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/constants.py +4 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/ipc.py +1 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/mesh.py +1 -1
- agentirc_cli-4.5.1/culture/clients/acp/culture.yaml +16 -0
- agentirc_cli-4.5.1/culture/clients/claude/culture.yaml +13 -0
- agentirc_cli-4.5.1/culture/clients/codex/culture.yaml +13 -0
- agentirc_cli-4.5.1/culture/clients/copilot/culture.yaml +13 -0
- agentirc_cli-4.5.1/culture/config.py +457 -0
- agentirc_cli-4.5.1/docs/agents/decentralized-config.md +194 -0
- agentirc_cli-4.5.1/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +2131 -0
- agentirc_cli-4.5.1/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +361 -0
- agentirc_cli-4.5.1/packages/agent-harness/culture.yaml +13 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/pyproject.toml +1 -1
- agentirc_cli-4.5.1/tests/test_culture_config.py +499 -0
- agentirc_cli-4.5.1/tests/test_migrate_cli.py +117 -0
- agentirc_cli-4.5.1/tests/test_register_cli.py +139 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/uv.lock +1 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.flake8 +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.gitignore +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.pr_agent.toml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/.pylintrc +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/CNAME +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/Gemfile +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/Gemfile.lock +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/LICENSE +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/SECURITY.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_config.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_includes/head_custom.html +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/apple-touch-icon.png +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/favicon-16x16.png +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/favicon-32x32.png +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/assets/images/favicon.ico +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/__main__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/aio.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/bot.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/channel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/display.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/formatting.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/shared/process.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/cli/skills.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/app.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/commands.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/credentials.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/formatting.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/learn_prompt.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/mesh_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/observer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/collector.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/model.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/overview/web/style.css +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/persistence.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/pidfile.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/commands.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/message.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/protocol/replies.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/__main__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/channel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/history_store.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/ircd.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/remote_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/room_store.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/rooms_util.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/server_link.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skill.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/history.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/icon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/rooms.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/skills/threads.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/server/thread_store.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer1-core-irc.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/server-architecture.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/architecture/threads.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/channel-polling.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/acp/system-prompt.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/culture-cli.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/getting-started.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/bots.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/ci.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/cli.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/ops-tooling.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/operations/publishing.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/persistent-history.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/reflective-development.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/rooms.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/server-rename.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/use-cases-index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/docs/what-is-culture.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/favicon.ico +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/sonar-project.properties +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/conftest.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_archive.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bot.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bot_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_channel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_connection.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_commands.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_connection.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_icons.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_console_integration.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_discovery.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_federation.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_history.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_http_listener.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mention_alias.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mention_target_cleanup.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mentions.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_message.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_messaging.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_modes.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_model.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_overview_web.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_persistence.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_pidfile.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_rooms.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_skill_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_skills.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_template_engine.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_threads.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.1}/tests/test_webhook.py +0 -0
|
@@ -4,8 +4,35 @@ 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
|
+
## [4.5.1] - 2026-04-09
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Fix mesh overview crash after agent config migration (str has no attribute items)
|
|
13
|
+
|
|
14
|
+
## [4.5.0] - 2026-04-09
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Decentralized agent configuration with per-directory culture.yaml files
|
|
20
|
+
- New ~/.culture/server.yaml for machine-level config with agent manifest
|
|
21
|
+
- CLI: culture agent register/unregister for managing agent directories
|
|
22
|
+
- CLI: culture agent migrate for one-time migration from agents.yaml
|
|
23
|
+
- Unified culture/config.py module with AgentConfig, ServerConfig, auto-detection
|
|
24
|
+
- culture.yaml definitions for harness template and backend agents (#harness channel)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Agent config split: per-agent settings in culture.yaml, server settings in server.yaml
|
|
30
|
+
- CLI agent commands now support both server.yaml and legacy agents.yaml formats
|
|
31
|
+
|
|
32
|
+
|
|
7
33
|
## [4.4.3] - 2026-04-08
|
|
8
34
|
|
|
35
|
+
|
|
9
36
|
### Changed
|
|
10
37
|
|
|
11
38
|
- Regenerate all favicons, including `/favicon.ico` and `/assets/images/favicon.ico`, from the source image with proper cropping and optimization
|
|
@@ -28,6 +28,23 @@ If you improve a generic component (e.g., `irc_transport.py`), update the refere
|
|
|
28
28
|
|
|
29
29
|
**All-backends rule:** When adding or changing a feature in any agent harness (config fields, transport capabilities, daemon handlers), propagate the change to **all** backends (`claude`, `codex`, `copilot`, `acp`) and update `docs/` accordingly. A feature that only exists in one backend is a bug.
|
|
30
30
|
|
|
31
|
+
## Agent Configuration
|
|
32
|
+
|
|
33
|
+
Agent definitions are decentralized into per-directory `culture.yaml` files:
|
|
34
|
+
|
|
35
|
+
- `culture.yaml` — agent identity and config, lives in the agent's working directory
|
|
36
|
+
- `~/.culture/server.yaml` — server connection, supervisor, webhooks, and agent manifest
|
|
37
|
+
|
|
38
|
+
Key commands:
|
|
39
|
+
|
|
40
|
+
- `culture agent register [path]` — register a directory's culture.yaml
|
|
41
|
+
- `culture agent unregister <suffix|nick>` — remove from manifest
|
|
42
|
+
- `culture agent migrate` — one-time migration from legacy agents.yaml
|
|
43
|
+
- `culture agent start/stop/status` — work with both server.yaml and legacy agents.yaml
|
|
44
|
+
|
|
45
|
+
Template: `packages/agent-harness/culture.yaml` is the reference implementation.
|
|
46
|
+
Each backend has its own `culture.yaml` in `culture/clients/<backend>/`.
|
|
47
|
+
|
|
31
48
|
## Documentation
|
|
32
49
|
|
|
33
50
|
When implementing features, write a corresponding markdown doc in `docs/` describing the feature — its purpose, usage, and any protocol details. Keep `docs/` as the living reference for the project.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentirc-cli
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.5.1
|
|
4
4
|
Summary: Legacy alias for culture — install culture instead
|
|
5
5
|
Project-URL: Homepage, https://github.com/OriNachum/culture
|
|
6
6
|
Author: Ori Nachum
|
|
@@ -46,7 +46,7 @@ Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
|
|
|
46
46
|
<br><br>
|
|
47
47
|
<sub>If you find Culture useful, <a href="https://github.com/OriNachum/culture/stargazers">give it a ⭐</a> — it helps others discover the project.</sub>
|
|
48
48
|
|
|
49
|
-
<img width="800" alt="
|
|
49
|
+
<img width="800" alt="culture-hero" src="https://github.com/user-attachments/assets/95dc79a2-d740-4554-b817-6e017b6cfd16" />
|
|
50
50
|
|
|
51
51
|
</div>
|
|
52
52
|
|
|
@@ -22,7 +22,7 @@ Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
|
|
|
22
22
|
<br><br>
|
|
23
23
|
<sub>If you find Culture useful, <a href="https://github.com/OriNachum/culture/stargazers">give it a ⭐</a> — it helps others discover the project.</sub>
|
|
24
24
|
|
|
25
|
-
<img width="800" alt="
|
|
25
|
+
<img width="800" alt="culture-hero" src="https://github.com/user-attachments/assets/95dc79a2-d740-4554-b817-6e017b6cfd16" />
|
|
26
26
|
|
|
27
27
|
</div>
|
|
28
28
|
|
|
@@ -8,17 +8,31 @@ import logging
|
|
|
8
8
|
import os
|
|
9
9
|
import signal
|
|
10
10
|
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import yaml
|
|
11
14
|
|
|
12
15
|
from culture.clients.claude.config import (
|
|
13
|
-
AgentConfig,
|
|
14
|
-
DaemonConfig,
|
|
15
16
|
add_agent_to_config,
|
|
16
17
|
archive_agent,
|
|
18
|
+
remove_agent,
|
|
19
|
+
unarchive_agent,
|
|
20
|
+
)
|
|
21
|
+
from culture.config import (
|
|
22
|
+
AgentConfig,
|
|
23
|
+
DaemonConfig,
|
|
24
|
+
ServerConfig,
|
|
25
|
+
ServerConnConfig,
|
|
26
|
+
SupervisorConfig,
|
|
27
|
+
WebhookConfig,
|
|
28
|
+
add_to_manifest,
|
|
17
29
|
load_config,
|
|
18
30
|
load_config_or_default,
|
|
19
|
-
|
|
31
|
+
load_culture_yaml,
|
|
32
|
+
remove_from_manifest,
|
|
20
33
|
sanitize_agent_name,
|
|
21
|
-
|
|
34
|
+
save_culture_yaml,
|
|
35
|
+
save_server_config,
|
|
22
36
|
)
|
|
23
37
|
from culture.pidfile import (
|
|
24
38
|
is_process_alive,
|
|
@@ -31,6 +45,8 @@ from .shared.constants import (
|
|
|
31
45
|
_CONFIG_HELP,
|
|
32
46
|
DEFAULT_CHANNEL,
|
|
33
47
|
DEFAULT_CONFIG,
|
|
48
|
+
DEFAULT_SERVER_CONFIG,
|
|
49
|
+
LEGACY_CONFIG,
|
|
34
50
|
LOG_DIR,
|
|
35
51
|
NO_AGENTS_MSG,
|
|
36
52
|
)
|
|
@@ -162,11 +178,35 @@ def register(subparsers: argparse._SubParsersAction) -> None:
|
|
|
162
178
|
delete_parser.add_argument("nick", help="Agent nick to delete")
|
|
163
179
|
delete_parser.add_argument("--config", default=DEFAULT_CONFIG, help=_CONFIG_HELP)
|
|
164
180
|
|
|
181
|
+
# -- register -------------------------------------------------------------
|
|
182
|
+
register_parser = agent_sub.add_parser("register", help="Register agent directory")
|
|
183
|
+
register_parser.add_argument(
|
|
184
|
+
"path", nargs="?", default=None, help="Directory containing culture.yaml (default: cwd)"
|
|
185
|
+
)
|
|
186
|
+
register_parser.add_argument(
|
|
187
|
+
"--suffix", default=None, help="Agent suffix (required for multi-agent culture.yaml)"
|
|
188
|
+
)
|
|
189
|
+
register_parser.add_argument("--config", default=DEFAULT_SERVER_CONFIG, help=_CONFIG_HELP)
|
|
190
|
+
|
|
191
|
+
# -- unregister -----------------------------------------------------------
|
|
192
|
+
unregister_parser = agent_sub.add_parser("unregister", help="Unregister agent")
|
|
193
|
+
unregister_parser.add_argument("target", help="Agent suffix or full nick")
|
|
194
|
+
unregister_parser.add_argument("--config", default=DEFAULT_SERVER_CONFIG, help=_CONFIG_HELP)
|
|
195
|
+
|
|
196
|
+
# -- migrate --------------------------------------------------------------
|
|
197
|
+
migrate_parser = agent_sub.add_parser(
|
|
198
|
+
"migrate", help="Migrate agents.yaml to server.yaml + culture.yaml"
|
|
199
|
+
)
|
|
200
|
+
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
|
+
|
|
165
205
|
|
|
166
206
|
def dispatch(args: argparse.Namespace) -> None:
|
|
167
207
|
if not args.agent_command:
|
|
168
208
|
print(
|
|
169
|
-
"Usage: culture agent {create|join|start|stop|status|rename|assign|sleep|wake|learn|message|read|archive|unarchive|delete}",
|
|
209
|
+
"Usage: culture agent {create|join|start|stop|status|rename|assign|sleep|wake|learn|message|read|archive|unarchive|delete|register|unregister|migrate}",
|
|
170
210
|
file=sys.stderr,
|
|
171
211
|
)
|
|
172
212
|
sys.exit(1)
|
|
@@ -187,6 +227,9 @@ def dispatch(args: argparse.Namespace) -> None:
|
|
|
187
227
|
"archive": _cmd_archive,
|
|
188
228
|
"unarchive": _cmd_unarchive,
|
|
189
229
|
"delete": _cmd_delete,
|
|
230
|
+
"register": _cmd_register,
|
|
231
|
+
"unregister": _cmd_unregister,
|
|
232
|
+
"migrate": _cmd_migrate,
|
|
190
233
|
}
|
|
191
234
|
handler = handlers.get(args.agent_command)
|
|
192
235
|
if handler:
|
|
@@ -259,7 +302,7 @@ def _create_default_config(full_nick: str, backend: str) -> AgentConfig:
|
|
|
259
302
|
"""Build a default (claude) AgentConfig."""
|
|
260
303
|
return AgentConfig(
|
|
261
304
|
nick=full_nick,
|
|
262
|
-
|
|
305
|
+
backend=backend,
|
|
263
306
|
directory=os.getcwd(),
|
|
264
307
|
channels=[DEFAULT_CHANNEL],
|
|
265
308
|
)
|
|
@@ -933,3 +976,145 @@ def _cmd_delete(args: argparse.Namespace) -> None:
|
|
|
933
976
|
|
|
934
977
|
remove_agent(args.config, args.nick)
|
|
935
978
|
print(f"Agent deleted: {args.nick}")
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
# -----------------------------------------------------------------------
|
|
982
|
+
# Register / Unregister
|
|
983
|
+
# -----------------------------------------------------------------------
|
|
984
|
+
|
|
985
|
+
|
|
986
|
+
def _cmd_register(args: argparse.Namespace) -> None:
|
|
987
|
+
"""Register a directory containing culture.yaml."""
|
|
988
|
+
directory = args.path if args.path else os.getcwd()
|
|
989
|
+
directory = str(Path(directory).resolve())
|
|
990
|
+
|
|
991
|
+
try:
|
|
992
|
+
agents = load_culture_yaml(directory)
|
|
993
|
+
except FileNotFoundError:
|
|
994
|
+
print(f"No culture.yaml found in {directory}", file=sys.stderr)
|
|
995
|
+
sys.exit(1)
|
|
996
|
+
|
|
997
|
+
if len(agents) > 1 and args.suffix is None:
|
|
998
|
+
print(
|
|
999
|
+
f"Multiple agents in {directory}/culture.yaml. " "Use --suffix to specify which one.",
|
|
1000
|
+
file=sys.stderr,
|
|
1001
|
+
)
|
|
1002
|
+
print("Available suffixes:", file=sys.stderr)
|
|
1003
|
+
for a in agents:
|
|
1004
|
+
print(f" {a.suffix}", file=sys.stderr)
|
|
1005
|
+
sys.exit(1)
|
|
1006
|
+
|
|
1007
|
+
targets = agents if args.suffix is None else [a for a in agents if a.suffix == args.suffix]
|
|
1008
|
+
if not targets:
|
|
1009
|
+
print(f"Suffix {args.suffix!r} not found in culture.yaml", file=sys.stderr)
|
|
1010
|
+
sys.exit(1)
|
|
1011
|
+
|
|
1012
|
+
config = load_config_or_default(args.config)
|
|
1013
|
+
server_name = config.server.name
|
|
1014
|
+
|
|
1015
|
+
for agent in targets:
|
|
1016
|
+
try:
|
|
1017
|
+
add_to_manifest(args.config, agent.suffix, directory)
|
|
1018
|
+
except ValueError as e:
|
|
1019
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
1020
|
+
sys.exit(1)
|
|
1021
|
+
print(f"Registered: {server_name}-{agent.suffix} at {directory}")
|
|
1022
|
+
|
|
1023
|
+
|
|
1024
|
+
def _cmd_unregister(args: argparse.Namespace) -> None:
|
|
1025
|
+
"""Remove an agent from the manifest."""
|
|
1026
|
+
target = args.target
|
|
1027
|
+
config = load_config_or_default(args.config)
|
|
1028
|
+
|
|
1029
|
+
prefix = f"{config.server.name}-"
|
|
1030
|
+
suffix = target.removeprefix(prefix) if target.startswith(prefix) else target
|
|
1031
|
+
|
|
1032
|
+
try:
|
|
1033
|
+
remove_from_manifest(args.config, suffix)
|
|
1034
|
+
except ValueError as e:
|
|
1035
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
1036
|
+
sys.exit(1)
|
|
1037
|
+
print(f"Unregistered: {prefix}{suffix}")
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
# -----------------------------------------------------------------------
|
|
1041
|
+
# Migrate
|
|
1042
|
+
# -----------------------------------------------------------------------
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
def _cmd_migrate(args: argparse.Namespace) -> None:
|
|
1046
|
+
"""Migrate from agents.yaml to server.yaml + per-directory culture.yaml."""
|
|
1047
|
+
legacy_path = Path(args.config)
|
|
1048
|
+
if not legacy_path.exists():
|
|
1049
|
+
print(f"No agents.yaml found at {legacy_path}", file=sys.stderr)
|
|
1050
|
+
sys.exit(1)
|
|
1051
|
+
|
|
1052
|
+
with open(legacy_path) as f:
|
|
1053
|
+
raw = yaml.safe_load(f) or {}
|
|
1054
|
+
|
|
1055
|
+
server_name = raw.get("server", {}).get("name", "culture")
|
|
1056
|
+
prefix = f"{server_name}-"
|
|
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
|
+
)
|
|
1109
|
+
|
|
1110
|
+
output_path = Path(args.output)
|
|
1111
|
+
save_server_config(str(output_path), server_config)
|
|
1112
|
+
print(f" Created {output_path}")
|
|
1113
|
+
|
|
1114
|
+
# Back up agents.yaml
|
|
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")
|
|
@@ -11,10 +11,7 @@ import subprocess
|
|
|
11
11
|
import sys
|
|
12
12
|
import time
|
|
13
13
|
|
|
14
|
-
from culture.
|
|
15
|
-
load_config,
|
|
16
|
-
load_config_or_default,
|
|
17
|
-
)
|
|
14
|
+
from culture.config import ServerConfig, load_config, load_config_or_default
|
|
18
15
|
|
|
19
16
|
from .shared.constants import AGENTS_YAML, CULTURE_DIR, DEFAULT_CONFIG
|
|
20
17
|
from .shared.mesh import build_server_start_cmd, generate_mesh_from_agents
|
|
@@ -159,7 +159,7 @@ def dispatch(args: argparse.Namespace) -> None:
|
|
|
159
159
|
|
|
160
160
|
# Also accept the configured server name
|
|
161
161
|
try:
|
|
162
|
-
from culture.
|
|
162
|
+
from culture.config import load_config_or_default
|
|
163
163
|
|
|
164
164
|
config = load_config_or_default(DEFAULT_CONFIG)
|
|
165
165
|
known_names.add(config.server.name)
|
|
@@ -314,7 +314,7 @@ def _verify_daemon_started(args: argparse.Namespace, pid: int) -> None:
|
|
|
314
314
|
|
|
315
315
|
def _check_server_archived(args: argparse.Namespace) -> None:
|
|
316
316
|
"""Exit if the server is archived."""
|
|
317
|
-
from culture.
|
|
317
|
+
from culture.config import load_config_or_default
|
|
318
318
|
|
|
319
319
|
config_path = getattr(args, "config", DEFAULT_CONFIG)
|
|
320
320
|
config = load_config_or_default(config_path)
|
|
@@ -4,7 +4,7 @@ import os
|
|
|
4
4
|
|
|
5
5
|
from culture.bots.config import BOT_CONFIG_FILE # noqa: F401
|
|
6
6
|
|
|
7
|
-
DEFAULT_CONFIG = os.path.expanduser("~/.culture/
|
|
7
|
+
DEFAULT_CONFIG = os.path.expanduser("~/.culture/server.yaml")
|
|
8
8
|
LOG_DIR = os.path.expanduser("~/.culture/logs")
|
|
9
9
|
|
|
10
10
|
_CONFIG_HELP = "Config file path"
|
|
@@ -15,3 +15,6 @@ DEFAULT_CHANNEL = "#general"
|
|
|
15
15
|
NO_AGENTS_MSG = "No agents configured"
|
|
16
16
|
CULTURE_DIR = ".culture"
|
|
17
17
|
AGENTS_YAML = "agents.yaml"
|
|
18
|
+
|
|
19
|
+
DEFAULT_SERVER_CONFIG = os.path.expanduser("~/.culture/server.yaml")
|
|
20
|
+
LEGACY_CONFIG = os.path.expanduser("~/.culture/agents.yaml")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
suffix: harness-acp
|
|
2
|
+
backend: claude
|
|
3
|
+
model: claude-opus-4-6
|
|
4
|
+
channels:
|
|
5
|
+
- "#harness"
|
|
6
|
+
acp_command:
|
|
7
|
+
- opencode
|
|
8
|
+
- acp
|
|
9
|
+
system_prompt: |
|
|
10
|
+
You maintain the ACP agent backend in culture/clients/acp/.
|
|
11
|
+
Listen on #harness for propagation instructions from spark-harness.
|
|
12
|
+
Apply changes using assimilai, adapting for ACP (Cline, OpenCode, Kiro)
|
|
13
|
+
specifics (agent_runner.py, supervisor.py).
|
|
14
|
+
tags:
|
|
15
|
+
- harness
|
|
16
|
+
- acp
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
suffix: harness-claude
|
|
2
|
+
backend: claude
|
|
3
|
+
model: claude-opus-4-6
|
|
4
|
+
channels:
|
|
5
|
+
- "#harness"
|
|
6
|
+
system_prompt: |
|
|
7
|
+
You maintain the Claude agent backend in culture/clients/claude/.
|
|
8
|
+
Listen on #harness for propagation instructions from spark-harness.
|
|
9
|
+
Apply changes using assimilai, adapting for Claude SDK specifics
|
|
10
|
+
(agent_runner.py, supervisor.py).
|
|
11
|
+
tags:
|
|
12
|
+
- harness
|
|
13
|
+
- claude
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
suffix: harness-codex
|
|
2
|
+
backend: codex
|
|
3
|
+
model: gpt-5.4
|
|
4
|
+
channels:
|
|
5
|
+
- "#harness"
|
|
6
|
+
system_prompt: |
|
|
7
|
+
You maintain the Codex agent backend in culture/clients/codex/.
|
|
8
|
+
Listen on #harness for propagation instructions from spark-harness.
|
|
9
|
+
Apply changes using assimilai, adapting for Codex CLI specifics
|
|
10
|
+
(agent_runner.py, supervisor.py).
|
|
11
|
+
tags:
|
|
12
|
+
- harness
|
|
13
|
+
- codex
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
suffix: harness-copilot
|
|
2
|
+
backend: claude
|
|
3
|
+
model: claude-opus-4-6
|
|
4
|
+
channels:
|
|
5
|
+
- "#harness"
|
|
6
|
+
system_prompt: |
|
|
7
|
+
You maintain the Copilot agent backend in culture/clients/copilot/.
|
|
8
|
+
Listen on #harness for propagation instructions from spark-harness.
|
|
9
|
+
Apply changes using assimilai, adapting for Copilot Extensions API
|
|
10
|
+
specifics (agent_runner.py, supervisor.py).
|
|
11
|
+
tags:
|
|
12
|
+
- harness
|
|
13
|
+
- copilot
|