agentirc-cli 9.10.0__tar.gz → 9.11.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-9.11.0/.github/workflows/tests.yml +238 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/CHANGELOG.md +60 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/PKG-INFO +33 -4
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/README.md +31 -3
- agentirc_cli-9.11.0/agentirc/_internal/cli_client.py +556 -0
- agentirc_cli-9.11.0/agentirc/_internal/constants.py +122 -0
- agentirc_cli-9.11.0/agentirc/agent_client.py +490 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/cli.py +130 -11
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/client.py +547 -38
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/config.py +18 -3
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/history_store.py +73 -9
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/ircd.py +136 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/protocol.py +152 -3
- agentirc_cli-9.11.0/agentirc/skills/history.py +667 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/skills/rooms.py +95 -23
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/skills/threads.py +145 -29
- agentirc_cli-9.11.0/docs/agent-walkthrough.md +331 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/api-stability.md +180 -8
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/cli.md +145 -9
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/extension-api.md +170 -3
- agentirc_cli-9.11.0/docs/specs/2026-07-02-agent-accessibility-gap-verification.md +29 -0
- agentirc_cli-9.11.0/docs/specs/2026-07-02-agent-accessibility-release-audit.md +54 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/pyproject.toml +16 -1
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/_helpers.py +25 -0
- agentirc_cli-9.11.0/tests/test_agent_client.py +426 -0
- agentirc_cli-9.11.0/tests/test_agent_walkthrough.py +219 -0
- agentirc_cli-9.11.0/tests/test_cli_client_verbs.py +554 -0
- agentirc_cli-9.11.0/tests/test_cli_json.py +341 -0
- agentirc_cli-9.11.0/tests/test_client_backfill.py +431 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_config_loader.py +27 -0
- agentirc_cli-9.11.0/tests/test_disk_paths.py +135 -0
- agentirc_cli-9.11.0/tests/test_dm_history.py +430 -0
- agentirc_cli-9.11.0/tests/test_docs_promises.py +119 -0
- agentirc_cli-9.11.0/tests/test_error_tokens.py +665 -0
- agentirc_cli-9.11.0/tests/test_history_since.py +495 -0
- agentirc_cli-9.11.0/tests/test_liveness.py +344 -0
- agentirc_cli-9.11.0/tests/test_long_messages.py +493 -0
- agentirc_cli-9.11.0/tests/test_message_tags.py +306 -0
- agentirc_cli-9.11.0/tests/test_reconnect_catchup.py +388 -0
- agentirc_cli-9.11.0/tests/test_verb_discovery.py +299 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_wire_format_envelope.py +239 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/uv.lock +15 -1
- agentirc_cli-9.10.0/.github/workflows/tests.yml +0 -128
- agentirc_cli-9.10.0/agentirc/_internal/constants.py +0 -17
- agentirc_cli-9.10.0/agentirc/skills/history.py +0 -225
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/cicd/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/communicate/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/recall/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/recall/scripts/recall.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/remember/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/remember/scripts/remember.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/think/SKILL.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills/think/scripts/think.sh +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.claude/skills.local.yaml.example +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.devague/current +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.devague/current_plan +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.devague/frames/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.devague/frames/agentirc-ships-an-agent-accessibility-release-ai-a.json +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.devague/plans/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.devague/plans/agentirc-ships-an-agent-accessibility-release-ai-a.json +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/.gitignore +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/CLAUDE.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/LICENSE +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/__main__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/aio.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/bots/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/bots/bot_manager.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/bots/http_listener.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/cli_shared/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/cli_shared/constants.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/cli_shared/mesh.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/event_subscriptions.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/pidfile.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/protocol/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/protocol/message.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/protocol/replies.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/telemetry/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/telemetry/audit.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/telemetry/context.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/telemetry/metrics.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/telemetry/tracing.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/_internal/virtual_client.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/bot.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/bot_manager.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/cli.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/config.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/filter_dsl.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/http_listener.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/template_engine.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/bots/virtual_client.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/channel.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/events.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/remote_client.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/room_store.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/rooms_util.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/server_link.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/skill.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/skills/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/skills/icon.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/thread_store.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/agentirc/virtual_client.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/bots.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/deployment.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/plans/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/plans/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/specs/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/specs/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/steward/onboarding.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/superpowers/specs/2026-04-30-bootstrap-design.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/superpowers/specs/2026-05-01-bot-extension-api-design.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/docs/superpowers/specs/2026-05-01-task14-audit.md +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_bot.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_bot_host.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_bot_manager.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_cli_bot.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_config_bots.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_filter_dsl.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_http_listener.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_public_surface.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/bots/test_template_engine.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/conftest.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/__init__.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/_fakes.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/_metrics_helpers.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_audit_emit.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_audit_lifecycle.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_audit_module.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_audit_parse_error.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_config.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_dispatch_span.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_emit_event_span.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_metrics_init.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_metrics_s2s.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_outbound_inject.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_parse_error.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_s2s_relay_span.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_server_init.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_server_link_inject.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/telemetry/test_tracing.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_api_stability_embedding.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_bot_capability.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_channel.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_cli.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_connection.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_discovery.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_event_subscriptions.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_eventpub.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_events_basic.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_events_catalog.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_events_federation.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_events_history.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_events_lifecycle.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_events_reserved_nick.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_federation.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_history.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_mentions.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_messaging.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_modes.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_protocol_bot_exports.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_skills.py +0 -0
- {agentirc_cli-9.10.0 → agentirc_cli-9.11.0}/tests/test_threads.py +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
16
|
+
with:
|
|
17
|
+
fetch-depth: 0
|
|
18
|
+
|
|
19
|
+
- name: Portability lint (full tree)
|
|
20
|
+
run: bash .claude/skills/cicd/scripts/portability-lint.sh --all
|
|
21
|
+
|
|
22
|
+
test:
|
|
23
|
+
needs: lint
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
permissions:
|
|
26
|
+
contents: read
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
29
|
+
|
|
30
|
+
- name: Bootstrap status check
|
|
31
|
+
id: bootstrap
|
|
32
|
+
run: |
|
|
33
|
+
if [ -f pyproject.toml ]; then
|
|
34
|
+
echo "ready=true" >> "$GITHUB_OUTPUT"
|
|
35
|
+
else
|
|
36
|
+
echo "ready=false" >> "$GITHUB_OUTPUT"
|
|
37
|
+
echo "::notice::Pre-bootstrap (no pyproject.toml) — pytest skipped."
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
41
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
42
|
+
|
|
43
|
+
- name: Install Python
|
|
44
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
45
|
+
run: uv python install 3.12
|
|
46
|
+
|
|
47
|
+
- name: Sync deps (with dev extras)
|
|
48
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
49
|
+
run: uv sync --extra dev
|
|
50
|
+
|
|
51
|
+
- name: Run tests
|
|
52
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
53
|
+
env:
|
|
54
|
+
# Console scripts only land on PATH after `uv sync` activates the
|
|
55
|
+
# project venv; this guard surfaces the path issue clearly if it
|
|
56
|
+
# ever regresses.
|
|
57
|
+
UV_PROJECT_ENVIRONMENT: .venv
|
|
58
|
+
run: uv run pytest -n auto -v
|
|
59
|
+
|
|
60
|
+
version-check:
|
|
61
|
+
needs: lint
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
permissions:
|
|
64
|
+
contents: read
|
|
65
|
+
pull-requests: write
|
|
66
|
+
steps:
|
|
67
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
68
|
+
with:
|
|
69
|
+
fetch-depth: 0
|
|
70
|
+
|
|
71
|
+
- name: Bootstrap status check
|
|
72
|
+
id: bootstrap
|
|
73
|
+
run: |
|
|
74
|
+
if [ -f pyproject.toml ]; then
|
|
75
|
+
echo "ready=true" >> "$GITHUB_OUTPUT"
|
|
76
|
+
else
|
|
77
|
+
echo "ready=false" >> "$GITHUB_OUTPUT"
|
|
78
|
+
echo "::notice::Pre-bootstrap (no pyproject.toml) — version check skipped."
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
- run: git fetch origin main
|
|
82
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
83
|
+
|
|
84
|
+
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
|
85
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
86
|
+
with:
|
|
87
|
+
python-version: "3.12"
|
|
88
|
+
|
|
89
|
+
- name: Check if code changed
|
|
90
|
+
id: changes
|
|
91
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
92
|
+
run: |
|
|
93
|
+
CODE_CHANGED=$(git diff --name-only origin/main...HEAD -- 'agentirc/' 'pyproject.toml' 'tests/' | head -1)
|
|
94
|
+
if [ -z "$CODE_CHANGED" ]; then
|
|
95
|
+
echo "skip=true" >> "$GITHUB_OUTPUT"
|
|
96
|
+
else
|
|
97
|
+
echo "skip=false" >> "$GITHUB_OUTPUT"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
- name: Check version bump
|
|
101
|
+
if: steps.bootstrap.outputs.ready == 'true' && steps.changes.outputs.skip != 'true'
|
|
102
|
+
env:
|
|
103
|
+
GH_TOKEN: ${{ github.token }}
|
|
104
|
+
run: |
|
|
105
|
+
PR_VERSION=$(python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
|
|
106
|
+
if ! git cat-file -e origin/main:pyproject.toml 2>/dev/null; then
|
|
107
|
+
echo "::notice::main lacks pyproject.toml (first-time bootstrap PR) — skipping version-bump check."
|
|
108
|
+
exit 0
|
|
109
|
+
fi
|
|
110
|
+
MAIN_VERSION=$(git show origin/main:pyproject.toml | python3 -c "import sys,tomllib; print(tomllib.loads(sys.stdin.read())['project']['version'])")
|
|
111
|
+
|
|
112
|
+
if [ "$PR_VERSION" = "$MAIN_VERSION" ]; then
|
|
113
|
+
BODY="⚠️ **Version not bumped** — \`pyproject.toml\` still has \`$PR_VERSION\` (same as main). Run \`/version-bump patch\` (or minor/major) before merging.
|
|
114
|
+
|
|
115
|
+
<!-- version-check -->"
|
|
116
|
+
|
|
117
|
+
EXISTING=$(gh api repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments \
|
|
118
|
+
--jq '.[] | select(.body | contains("<!-- version-check -->")) | .id' | head -1)
|
|
119
|
+
|
|
120
|
+
if [ -n "$EXISTING" ]; then
|
|
121
|
+
gh api repos/${{ github.repository }}/issues/comments/$EXISTING -X PATCH -f body="$BODY" > /dev/null
|
|
122
|
+
else
|
|
123
|
+
gh pr comment ${{ github.event.pull_request.number }} --body "$BODY" || true
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
echo "::error::Version $PR_VERSION matches main. Bump before merging."
|
|
127
|
+
exit 1
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
# Guards for the agent-accessibility release (task t14). GitHub-hosted
|
|
131
|
+
# runners never have a `../culture` checkout, so the "clean venv, no
|
|
132
|
+
# culture on the machine" guarantee already holds by construction here;
|
|
133
|
+
# the explicit check below turns that ambient fact into a loud failure
|
|
134
|
+
# if it's ever violated (e.g. a self-hosted runner, or a future workflow
|
|
135
|
+
# change that checks out a sibling repo).
|
|
136
|
+
# Pre-bootstrap gating is handled per-step via `steps.bootstrap.outputs.ready`
|
|
137
|
+
# below (same pattern as `test`/`version-check`), NOT a job-level
|
|
138
|
+
# `if: hashFiles(...)`. A job-level `hashFiles()` fails to evaluate for push
|
|
139
|
+
# events that don't match the branch filter, which GitHub reports as a
|
|
140
|
+
# spurious "workflow file issue" run failure on feature-branch pushes.
|
|
141
|
+
agent-guards:
|
|
142
|
+
needs: lint
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
permissions:
|
|
145
|
+
contents: read
|
|
146
|
+
steps:
|
|
147
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
148
|
+
|
|
149
|
+
- name: Bootstrap status check
|
|
150
|
+
id: bootstrap
|
|
151
|
+
run: |
|
|
152
|
+
if [ -f pyproject.toml ]; then
|
|
153
|
+
echo "ready=true" >> "$GITHUB_OUTPUT"
|
|
154
|
+
else
|
|
155
|
+
echo "ready=false" >> "$GITHUB_OUTPUT"
|
|
156
|
+
echo "::notice::Pre-bootstrap (no pyproject.toml) — agent guards skipped."
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
160
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
161
|
+
|
|
162
|
+
- name: Install Python
|
|
163
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
164
|
+
run: uv python install 3.12
|
|
165
|
+
|
|
166
|
+
- name: Sync deps (fresh venv, with dev extras)
|
|
167
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
168
|
+
run: uv sync --extra dev
|
|
169
|
+
|
|
170
|
+
- name: Assert no ../culture checkout on this runner
|
|
171
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
172
|
+
run: |
|
|
173
|
+
if [ -d ../culture ]; then
|
|
174
|
+
echo "::error::../culture checkout found next to agentirc — this job exists to guarantee agentirc's test suite (and this walkthrough) run clean, with no culture checkout on the machine. Remove the sibling checkout or move it outside the runner's workspace."
|
|
175
|
+
exit 1
|
|
176
|
+
fi
|
|
177
|
+
echo "No ../culture checkout present — clean-venv invariant holds."
|
|
178
|
+
|
|
179
|
+
- name: No 'import culture' under agentirc/ or tests/
|
|
180
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
181
|
+
run: |
|
|
182
|
+
if git grep -nE '^(from|import) culture' -- agentirc/ tests/; then
|
|
183
|
+
echo "::error::Found a top-level 'import culture' / 'from culture import ...' under agentirc/ or tests/ — agentirc must have no import-time dependency on culture (see CLAUDE.md's 'Hard invariants')."
|
|
184
|
+
exit 1
|
|
185
|
+
fi
|
|
186
|
+
echo "No 'import culture' found under agentirc/ or tests/."
|
|
187
|
+
|
|
188
|
+
- name: No agent/backend SDKs declared in pyproject.toml
|
|
189
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
190
|
+
run: |
|
|
191
|
+
python3 - <<'PYEOF'
|
|
192
|
+
import sys
|
|
193
|
+
import tomllib
|
|
194
|
+
|
|
195
|
+
# agentirc's dependency boundary (CLAUDE.md "Hard invariants"):
|
|
196
|
+
# no backend/agent SDKs, ever, as a real dependency. Checked
|
|
197
|
+
# against declared dependency *names* (project.dependencies +
|
|
198
|
+
# every project.optional-dependencies group), not the raw file
|
|
199
|
+
# text — pyproject.toml's own [tool.citation] notes legitimately
|
|
200
|
+
# *mention* several of these names in prose explaining why
|
|
201
|
+
# they're forbidden, which a plain grep would misfire on.
|
|
202
|
+
FORBIDDEN = {
|
|
203
|
+
"claude-agent-sdk",
|
|
204
|
+
"anthropic",
|
|
205
|
+
"agex-cli",
|
|
206
|
+
"afi-cli",
|
|
207
|
+
"github-copilot-sdk",
|
|
208
|
+
"openai",
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
with open("pyproject.toml", "rb") as f:
|
|
212
|
+
data = tomllib.load(f)
|
|
213
|
+
|
|
214
|
+
project = data.get("project", {})
|
|
215
|
+
deps = list(project.get("dependencies", []))
|
|
216
|
+
for group_deps in project.get("optional-dependencies", {}).values():
|
|
217
|
+
deps.extend(group_deps)
|
|
218
|
+
|
|
219
|
+
def dep_name(spec: str) -> str:
|
|
220
|
+
name = spec.split(";", 1)[0] # drop environment markers
|
|
221
|
+
for sep in (">=", "<=", "==", "~=", "!=", ">", "<", "[", " "):
|
|
222
|
+
name = name.split(sep, 1)[0]
|
|
223
|
+
return name.strip().lower()
|
|
224
|
+
|
|
225
|
+
hits = [d for d in deps if dep_name(d) in FORBIDDEN]
|
|
226
|
+
if hits:
|
|
227
|
+
for h in hits:
|
|
228
|
+
print(f"::error::Forbidden agent/backend SDK dependency in pyproject.toml: {h!r}")
|
|
229
|
+
sys.exit(1)
|
|
230
|
+
|
|
231
|
+
print("No forbidden agent/backend SDK dependencies found in pyproject.toml.")
|
|
232
|
+
PYEOF
|
|
233
|
+
|
|
234
|
+
- name: Agent walkthrough smoke (by marker)
|
|
235
|
+
if: steps.bootstrap.outputs.ready == 'true'
|
|
236
|
+
env:
|
|
237
|
+
UV_PROJECT_ENVIRONMENT: .venv
|
|
238
|
+
run: uv run pytest -m walkthrough -v
|
|
@@ -4,6 +4,66 @@ 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
|
+
## [9.11.0] - 2026-07-02
|
|
8
|
+
|
|
9
|
+
The agent-accessibility release. Spec:
|
|
10
|
+
`docs/specs/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md`;
|
|
11
|
+
plan: `docs/plans/2026-07-01-…` (16 tasks, built wave-by-wave by a
|
|
12
|
+
fanned-out workforce with TDD-gated merges). Everything below is additive:
|
|
13
|
+
clients that worked against 9.7.0 work unchanged, and non-`message-tags`
|
|
14
|
+
clients see a byte-identical wire format (locked by golden tests).
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **Agent CLI client verbs** — `agentirc join/send/read/watch` drive a
|
|
19
|
+
running daemon over real TCP from a shell (built on the new public
|
|
20
|
+
transport; no culture checkout, no Python). `read`/`watch` accept a bare
|
|
21
|
+
nick for DM pairs; `read --since <cursor>` resumes without count-guessing
|
|
22
|
+
and prints the next cursor; `--json` emits one object per line with
|
|
23
|
+
`msgid`. `agentirc status --json` / `version --json` for orchestrators.
|
|
24
|
+
- **Public reconnecting transport** — `agentirc.agent_client.AgentClient` +
|
|
25
|
+
`IncomingMessage` (semver-tracked): auto-reconnect with exponential
|
|
26
|
+
backoff, nick re-registration, channel re-join, `messages()` spanning
|
|
27
|
+
reconnects, `send_raw()`/`raw_lines()` escape hatch.
|
|
28
|
+
- **Message structure** — server stamps `msgid` (fan-out-stable) and `time`
|
|
29
|
+
(IRCv3 server-time) tags on PRIVMSG delivery and `agentirc.io/thread` on
|
|
30
|
+
thread messages, gated on the `message-tags` cap.
|
|
31
|
+
- **Stable error tokens** — every rooms/threads/history error reply carries
|
|
32
|
+
a named token via the `agentirc.io/error` tag (`ERROR_TOKEN_*`,
|
|
33
|
+
`ERROR_TOKENS_VERSION = 1` in `agentirc.protocol`); prose replies are
|
|
34
|
+
byte-unchanged for non-tag clients.
|
|
35
|
+
- **HISTORY SINCE** — opaque-cursor pagination (deterministic, gap- and
|
|
36
|
+
duplicate-free across retention prunes) on both backends; replay lines
|
|
37
|
+
carry `msgid`/`time` tags; `HISTORYEND` returns the next cursor.
|
|
38
|
+
- **DM history** — DMs to connected recipients are stored under a canonical
|
|
39
|
+
pair key, queryable only by the two participants (`HISTORY <nick>`), same
|
|
40
|
+
retention as channels. Offline DMs stay undelivered and unstored by
|
|
41
|
+
design; `agentirc send <nick>` now exits `1` on `ERR_NOSUCHNICK`.
|
|
42
|
+
- **Client-facing BACKFILL** — the overflow-recovery path extension-api.md
|
|
43
|
+
had promised since 9.5.0 is now real (`BACKFILL <channel-or-*>
|
|
44
|
+
<cursor-or-*> [limit]`, bot-cap gated, EVENT-shaped replay, `BACKFILLEND`
|
|
45
|
+
terminator, DM history never replayed); a docs-vs-implementation test
|
|
46
|
+
keeps the doc honest.
|
|
47
|
+
- **VERBS discovery** — versioned, machine-parseable inventory of the verbs
|
|
48
|
+
the running server accepts (derived live from the dispatch surface),
|
|
49
|
+
negotiable caps, and the error-token vocabulary version.
|
|
50
|
+
- **Server liveness** — periodic server→client PING with a dead-connection
|
|
51
|
+
reaper (`ping_interval`/`pong_timeout` in `ServerConfig`/YAML, defaults
|
|
52
|
+
60/120 s, `0` disables); activity counts as liveness, so busy clients
|
|
53
|
+
ignoring PING are never dropped.
|
|
54
|
+
- **Long-message handling** — outbound relay splits over-budget messages at
|
|
55
|
+
the 512-byte line limit (codepoint-safe, order-preserving, each chunk its
|
|
56
|
+
own msgid/history entry); over-limit inbound lines get an explicit
|
|
57
|
+
`line-too-long` error naming the limit instead of the old silent
|
|
58
|
+
truncation.
|
|
59
|
+
- **Docs** — `docs/agent-walkthrough.md` (end-to-end, runnable as written,
|
|
60
|
+
with a five-dimension feature-traceability table), agent-facing updates
|
|
61
|
+
to `api-stability.md` (7th public module), `extension-api.md`, `cli.md`,
|
|
62
|
+
README. Gap-verification and release-audit notes under `docs/specs/`.
|
|
63
|
+
- **CI** — `agent-guards` job: fresh-venv suite + walkthrough smoke with no
|
|
64
|
+
culture checkout, culture-import grep, backend-SDK dependency check
|
|
65
|
+
(tomllib-scoped), on-disk-path lock tests.
|
|
66
|
+
|
|
7
67
|
## [9.10.0] - 2026-06-24
|
|
8
68
|
|
|
9
69
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentirc-cli
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.11.0
|
|
4
4
|
Summary: Agent-friendly IRCd: server core for AI agent meshes
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentculture/agentirc
|
|
6
6
|
Project-URL: Issues, https://github.com/agentculture/agentirc/issues
|
|
@@ -32,6 +32,7 @@ Requires-Dist: flake8; extra == 'dev'
|
|
|
32
32
|
Requires-Dist: isort; extra == 'dev'
|
|
33
33
|
Requires-Dist: pylint; extra == 'dev'
|
|
34
34
|
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
|
|
35
36
|
Requires-Dist: pytest-xdist>=3; extra == 'dev'
|
|
36
37
|
Requires-Dist: pytest>=8; extra == 'dev'
|
|
37
38
|
Description-Content-Type: text/markdown
|
|
@@ -143,9 +144,31 @@ See [`docs/cli.md`](docs/cli.md) for the full verb reference and
|
|
|
143
144
|
[`docs/deployment.md`](docs/deployment.md) for systemd, containers, and
|
|
144
145
|
multi-host federation.
|
|
145
146
|
|
|
147
|
+
## Agent CLI (since 9.11.0)
|
|
148
|
+
|
|
149
|
+
For a shell agent that just wants to talk to a running server — no Python,
|
|
150
|
+
no raw IRC — four verbs cover join/send/read/watch:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
agentirc join '#general' --nick myagent-bot
|
|
154
|
+
agentirc send '#general' 'hello' --nick myagent-bot
|
|
155
|
+
agentirc read '#general' --since '*' --json # resume with the printed next-cursor
|
|
156
|
+
agentirc watch '#general' --json # stream live messages until Ctrl-C
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`read`/`send` also accept a bare nick instead of `#channel` for direct
|
|
160
|
+
messages. Messages carry a stable `msgid` and IRCv3 server-time in
|
|
161
|
+
`--json` mode. [`docs/agent-walkthrough.md`](docs/agent-walkthrough.md) is
|
|
162
|
+
a full, copy-pasteable, verified-as-written walkthrough — install, start a
|
|
163
|
+
server, join, send, read, disconnect-and-catch-up, watch, DMs, status,
|
|
164
|
+
stop — plus a pointer to the raw-TCP/bot-facing wire contract in
|
|
165
|
+
[`docs/extension-api.md`](docs/extension-api.md) for clients that want
|
|
166
|
+
more than the CLI wraps (`VERBS` discovery, stable error tokens,
|
|
167
|
+
`BACKFILL`).
|
|
168
|
+
|
|
146
169
|
## Public API and stability
|
|
147
170
|
|
|
148
|
-
|
|
171
|
+
Seven modules form the **public, semver-tracked surface**. Everything else
|
|
149
172
|
under `agentirc.*` is internal and may be refactored — including renamed,
|
|
150
173
|
split, or removed — in any minor or patch release.
|
|
151
174
|
|
|
@@ -153,10 +176,11 @@ split, or removed — in any minor or patch release.
|
|
|
153
176
|
|---|---|---|
|
|
154
177
|
| [`agentirc.config`](docs/api-stability.md#agentircconfig) | `ServerConfig`, `LinkConfig`, `TelemetryConfig`, `ServerConfig.from_yaml(path)` | 9.0.0 |
|
|
155
178
|
| [`agentirc.cli`](docs/api-stability.md#agentirccli) | `main()`, `dispatch(argv) -> int` | 9.2.0 |
|
|
156
|
-
| [`agentirc.protocol`](docs/api-stability.md#agentircprotocol) | Verb constants, numeric reply codes, IRCv3/extension tag names, the bot extension surface (`Event`, `EventType`, `EVENT_TYPE_*`, `EVENTSUB`/`EVENTUNSUB`/`EVENT`/`EVENTERR`/`EVENTPUB`/`SEVENT`, `BOT_CAP`) | 9.2.0 |
|
|
179
|
+
| [`agentirc.protocol`](docs/api-stability.md#agentircprotocol) | Verb constants, numeric reply codes, IRCv3/extension tag names, the bot extension surface (`Event`, `EventType`, `EVENT_TYPE_*`, `EVENTSUB`/`EVENTUNSUB`/`EVENT`/`EVENTERR`/`EVENTPUB`/`SEVENT`, `BOT_CAP`), and the agent-accessibility surface (`VERBS`, `MSGID_TAG`, `SERVER_TIME_TAG`, `THREAD_TAG`, `ERROR_TAG`/`ERROR_TOKEN_*`) | 9.2.0 (extended 9.11.0) |
|
|
157
180
|
| [`agentirc.ircd`](docs/api-stability.md#embedding-agentirc-in-process) | `IRCd` (constructor + `start`/`stop`/`emit_event` + core attributes) | 9.6.0 |
|
|
158
181
|
| [`agentirc.virtual_client`](docs/api-stability.md#embedding-agentirc-in-process) | `VirtualClient` | 9.6.0 |
|
|
159
182
|
| [`agentirc.bots`](docs/api-stability.md#botconfig-yaml-schema) | `BotManager`, `Bot`, `BotConfig` — embedded YAML-spec'd bots (see [`docs/bots.md`](docs/bots.md)) | 9.7.0 |
|
|
183
|
+
| [`agentirc.agent_client`](docs/api-stability.md#agentircagent_client) | `AgentClient`, `IncomingMessage` — the reconnecting transport behind `join`/`send`/`read`/`watch` | 9.11.0 |
|
|
160
184
|
|
|
161
185
|
`agentirc.cli.dispatch(argv)` is the in-process integration surface — it is
|
|
162
186
|
what culture's `culture server` shim calls today. It returns `int` on
|
|
@@ -300,13 +324,18 @@ still-9.4 peers until those peers upgrade.
|
|
|
300
324
|
- [`docs/api-stability.md`](docs/api-stability.md) — public modules,
|
|
301
325
|
semver contract, `ServerConfig` / `LinkConfig` / `TelemetryConfig`
|
|
302
326
|
field reference, verb constants, wire-format quirks.
|
|
327
|
+
- [`docs/agent-walkthrough.md`](docs/agent-walkthrough.md) — copy-pasteable
|
|
328
|
+
agent CLI walkthrough (join/send/read/watch, catch-up, DMs) plus a
|
|
329
|
+
feature-traceability table.
|
|
303
330
|
- [`docs/cli.md`](docs/cli.md) — verb table, flag reference, exit codes,
|
|
304
331
|
YAML/CLI precedence, `agentirc`-vs-`culture server` diff table.
|
|
305
332
|
- [`docs/deployment.md`](docs/deployment.md) — on-disk footprint, systemd
|
|
306
333
|
unit, Dockerfile, multi-host federation, log rotation, coexistence
|
|
307
334
|
with culture, backup.
|
|
308
335
|
- [`docs/extension-api.md`](docs/extension-api.md) — bot-author quick
|
|
309
|
-
reference for `agentirc.io/bot` + `EVENTSUB`/`EVENTPUB
|
|
336
|
+
reference for `agentirc.io/bot` + `EVENTSUB`/`EVENTPUB`, plus the
|
|
337
|
+
agent-accessibility wire additions (`VERBS`, error tokens,
|
|
338
|
+
`msgid`/`time`/thread tags, `BACKFILL`).
|
|
310
339
|
- [`docs/superpowers/specs/`](docs/superpowers/specs/) — dated design
|
|
311
340
|
documents: bootstrap design, agentirc extraction design, bot-extension
|
|
312
341
|
API design.
|
|
@@ -105,9 +105,31 @@ See [`docs/cli.md`](docs/cli.md) for the full verb reference and
|
|
|
105
105
|
[`docs/deployment.md`](docs/deployment.md) for systemd, containers, and
|
|
106
106
|
multi-host federation.
|
|
107
107
|
|
|
108
|
+
## Agent CLI (since 9.11.0)
|
|
109
|
+
|
|
110
|
+
For a shell agent that just wants to talk to a running server — no Python,
|
|
111
|
+
no raw IRC — four verbs cover join/send/read/watch:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
agentirc join '#general' --nick myagent-bot
|
|
115
|
+
agentirc send '#general' 'hello' --nick myagent-bot
|
|
116
|
+
agentirc read '#general' --since '*' --json # resume with the printed next-cursor
|
|
117
|
+
agentirc watch '#general' --json # stream live messages until Ctrl-C
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`read`/`send` also accept a bare nick instead of `#channel` for direct
|
|
121
|
+
messages. Messages carry a stable `msgid` and IRCv3 server-time in
|
|
122
|
+
`--json` mode. [`docs/agent-walkthrough.md`](docs/agent-walkthrough.md) is
|
|
123
|
+
a full, copy-pasteable, verified-as-written walkthrough — install, start a
|
|
124
|
+
server, join, send, read, disconnect-and-catch-up, watch, DMs, status,
|
|
125
|
+
stop — plus a pointer to the raw-TCP/bot-facing wire contract in
|
|
126
|
+
[`docs/extension-api.md`](docs/extension-api.md) for clients that want
|
|
127
|
+
more than the CLI wraps (`VERBS` discovery, stable error tokens,
|
|
128
|
+
`BACKFILL`).
|
|
129
|
+
|
|
108
130
|
## Public API and stability
|
|
109
131
|
|
|
110
|
-
|
|
132
|
+
Seven modules form the **public, semver-tracked surface**. Everything else
|
|
111
133
|
under `agentirc.*` is internal and may be refactored — including renamed,
|
|
112
134
|
split, or removed — in any minor or patch release.
|
|
113
135
|
|
|
@@ -115,10 +137,11 @@ split, or removed — in any minor or patch release.
|
|
|
115
137
|
|---|---|---|
|
|
116
138
|
| [`agentirc.config`](docs/api-stability.md#agentircconfig) | `ServerConfig`, `LinkConfig`, `TelemetryConfig`, `ServerConfig.from_yaml(path)` | 9.0.0 |
|
|
117
139
|
| [`agentirc.cli`](docs/api-stability.md#agentirccli) | `main()`, `dispatch(argv) -> int` | 9.2.0 |
|
|
118
|
-
| [`agentirc.protocol`](docs/api-stability.md#agentircprotocol) | Verb constants, numeric reply codes, IRCv3/extension tag names, the bot extension surface (`Event`, `EventType`, `EVENT_TYPE_*`, `EVENTSUB`/`EVENTUNSUB`/`EVENT`/`EVENTERR`/`EVENTPUB`/`SEVENT`, `BOT_CAP`) | 9.2.0 |
|
|
140
|
+
| [`agentirc.protocol`](docs/api-stability.md#agentircprotocol) | Verb constants, numeric reply codes, IRCv3/extension tag names, the bot extension surface (`Event`, `EventType`, `EVENT_TYPE_*`, `EVENTSUB`/`EVENTUNSUB`/`EVENT`/`EVENTERR`/`EVENTPUB`/`SEVENT`, `BOT_CAP`), and the agent-accessibility surface (`VERBS`, `MSGID_TAG`, `SERVER_TIME_TAG`, `THREAD_TAG`, `ERROR_TAG`/`ERROR_TOKEN_*`) | 9.2.0 (extended 9.11.0) |
|
|
119
141
|
| [`agentirc.ircd`](docs/api-stability.md#embedding-agentirc-in-process) | `IRCd` (constructor + `start`/`stop`/`emit_event` + core attributes) | 9.6.0 |
|
|
120
142
|
| [`agentirc.virtual_client`](docs/api-stability.md#embedding-agentirc-in-process) | `VirtualClient` | 9.6.0 |
|
|
121
143
|
| [`agentirc.bots`](docs/api-stability.md#botconfig-yaml-schema) | `BotManager`, `Bot`, `BotConfig` — embedded YAML-spec'd bots (see [`docs/bots.md`](docs/bots.md)) | 9.7.0 |
|
|
144
|
+
| [`agentirc.agent_client`](docs/api-stability.md#agentircagent_client) | `AgentClient`, `IncomingMessage` — the reconnecting transport behind `join`/`send`/`read`/`watch` | 9.11.0 |
|
|
122
145
|
|
|
123
146
|
`agentirc.cli.dispatch(argv)` is the in-process integration surface — it is
|
|
124
147
|
what culture's `culture server` shim calls today. It returns `int` on
|
|
@@ -262,13 +285,18 @@ still-9.4 peers until those peers upgrade.
|
|
|
262
285
|
- [`docs/api-stability.md`](docs/api-stability.md) — public modules,
|
|
263
286
|
semver contract, `ServerConfig` / `LinkConfig` / `TelemetryConfig`
|
|
264
287
|
field reference, verb constants, wire-format quirks.
|
|
288
|
+
- [`docs/agent-walkthrough.md`](docs/agent-walkthrough.md) — copy-pasteable
|
|
289
|
+
agent CLI walkthrough (join/send/read/watch, catch-up, DMs) plus a
|
|
290
|
+
feature-traceability table.
|
|
265
291
|
- [`docs/cli.md`](docs/cli.md) — verb table, flag reference, exit codes,
|
|
266
292
|
YAML/CLI precedence, `agentirc`-vs-`culture server` diff table.
|
|
267
293
|
- [`docs/deployment.md`](docs/deployment.md) — on-disk footprint, systemd
|
|
268
294
|
unit, Dockerfile, multi-host federation, log rotation, coexistence
|
|
269
295
|
with culture, backup.
|
|
270
296
|
- [`docs/extension-api.md`](docs/extension-api.md) — bot-author quick
|
|
271
|
-
reference for `agentirc.io/bot` + `EVENTSUB`/`EVENTPUB
|
|
297
|
+
reference for `agentirc.io/bot` + `EVENTSUB`/`EVENTPUB`, plus the
|
|
298
|
+
agent-accessibility wire additions (`VERBS`, error tokens,
|
|
299
|
+
`msgid`/`time`/thread tags, `BACKFILL`).
|
|
272
300
|
- [`docs/superpowers/specs/`](docs/superpowers/specs/) — dated design
|
|
273
301
|
documents: bootstrap design, agentirc extraction design, bot-extension
|
|
274
302
|
API design.
|