agentirc-cli 4.4.3__tar.gz → 4.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/CHANGELOG.md +20 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/CLAUDE.md +17 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/PKG-INFO +2 -2
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/README.md +1 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/agent.py +191 -6
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/constants.py +4 -1
- agentirc_cli-4.5.0/culture/clients/acp/culture.yaml +16 -0
- agentirc_cli-4.5.0/culture/clients/claude/culture.yaml +13 -0
- agentirc_cli-4.5.0/culture/clients/codex/culture.yaml +13 -0
- agentirc_cli-4.5.0/culture/clients/copilot/culture.yaml +13 -0
- agentirc_cli-4.5.0/culture/config.py +457 -0
- agentirc_cli-4.5.0/docs/agents/decentralized-config.md +194 -0
- agentirc_cli-4.5.0/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +2131 -0
- agentirc_cli-4.5.0/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +361 -0
- agentirc_cli-4.5.0/packages/agent-harness/culture.yaml +13 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/pyproject.toml +1 -1
- agentirc_cli-4.5.0/tests/test_culture_config.py +499 -0
- agentirc_cli-4.5.0/tests/test_migrate_cli.py +117 -0
- agentirc_cli-4.5.0/tests/test_register_cli.py +139 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/uv.lock +1 -1
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.flake8 +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.gitignore +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.pr_agent.toml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/.pylintrc +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/CNAME +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/Gemfile +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/Gemfile.lock +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/LICENSE +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/SECURITY.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/_config.yml +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/_includes/head_custom.html +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/assets/images/apple-touch-icon.png +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/assets/images/favicon-16x16.png +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/assets/images/favicon-32x32.png +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/assets/images/favicon.ico +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/__main__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/aio.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/bot.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/bot.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/channel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/mesh.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/display.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/formatting.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/mesh.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/shared/process.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/cli/skills.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/app.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/commands.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/credentials.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/formatting.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/learn_prompt.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/mesh_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/observer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/overview/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/overview/collector.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/overview/model.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/overview/web/style.css +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/persistence.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/pidfile.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/commands.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/message.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/protocol/replies.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/__main__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/channel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/history_store.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/ircd.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/remote_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/room_store.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/rooms_util.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/server_link.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/skill.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/skills/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/skills/history.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/skills/icon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/skills/rooms.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/skills/threads.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/server/thread_store.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/layer1-core-irc.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/server-architecture.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/architecture/threads.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/channel-polling.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/acp/system-prompt.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/culture-cli.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/getting-started.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/bots.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/ci.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/cli.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/ops-tooling.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/operations/publishing.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/persistent-history.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/reflective-development.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/rooms.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/server-rename.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/use-cases-index.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/docs/what-is-culture.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/favicon.ico +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/sonar-project.properties +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/__init__.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/conftest.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_archive.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_bot.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_bot_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_channel.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_connection.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_console_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_console_commands.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_console_connection.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_console_icons.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_console_integration.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_daemon.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_discovery.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_federation.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_history.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_http_listener.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_ipc.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_mention_alias.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_mention_target_cleanup.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_mentions.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_message.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_messaging.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_modes.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_overview_model.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_overview_web.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_persistence.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_pidfile.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_rooms.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_skill_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_skills.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_socket_server.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_supervisor.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_template_engine.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_threads.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-4.4.3 → agentirc_cli-4.5.0}/tests/test_webhook.py +0 -0
|
@@ -4,8 +4,28 @@ 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.0] - 2026-04-09
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Decentralized agent configuration with per-directory culture.yaml files
|
|
13
|
+
- New ~/.culture/server.yaml for machine-level config with agent manifest
|
|
14
|
+
- CLI: culture agent register/unregister for managing agent directories
|
|
15
|
+
- CLI: culture agent migrate for one-time migration from agents.yaml
|
|
16
|
+
- Unified culture/config.py module with AgentConfig, ServerConfig, auto-detection
|
|
17
|
+
- culture.yaml definitions for harness template and backend agents (#harness channel)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Agent config split: per-agent settings in culture.yaml, server settings in server.yaml
|
|
23
|
+
- CLI agent commands now support both server.yaml and legacy agents.yaml formats
|
|
24
|
+
|
|
25
|
+
|
|
7
26
|
## [4.4.3] - 2026-04-08
|
|
8
27
|
|
|
28
|
+
|
|
9
29
|
### Changed
|
|
10
30
|
|
|
11
31
|
- 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.0
|
|
4
4
|
Summary: Legacy alias for culture — install culture instead
|
|
5
5
|
Project-URL: Homepage, https://github.com/OriNachum/culture
|
|
6
6
|
Author: Ori Nachum
|
|
@@ -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")
|
|
@@ -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
|