agentirc-cli 9.6.2__tar.gz → 9.8.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.
Files changed (157) hide show
  1. agentirc_cli-9.8.0/.devague/current +1 -0
  2. agentirc_cli-9.8.0/.devague/current_plan +1 -0
  3. agentirc_cli-9.8.0/.devague/frames/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +211 -0
  4. agentirc_cli-9.8.0/.devague/plans/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +318 -0
  5. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.gitignore +3 -0
  6. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/CHANGELOG.md +55 -0
  7. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/CLAUDE.md +9 -6
  8. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/PKG-INFO +38 -12
  9. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/README.md +34 -11
  10. agentirc_cli-9.8.0/agentirc/_internal/bots/bot_manager.py +33 -0
  11. agentirc_cli-9.8.0/agentirc/_internal/bots/http_listener.py +33 -0
  12. agentirc_cli-9.8.0/agentirc/bots/__init__.py +30 -0
  13. agentirc_cli-9.8.0/agentirc/bots/bot.py +269 -0
  14. agentirc_cli-9.8.0/agentirc/bots/bot_manager.py +347 -0
  15. agentirc_cli-9.8.0/agentirc/bots/cli.py +370 -0
  16. agentirc_cli-9.8.0/agentirc/bots/config.py +199 -0
  17. agentirc_cli-9.8.0/agentirc/bots/filter_dsl.py +339 -0
  18. agentirc_cli-9.8.0/agentirc/bots/http_listener.py +131 -0
  19. agentirc_cli-9.8.0/agentirc/bots/template_engine.py +68 -0
  20. agentirc_cli-9.8.0/agentirc/bots/virtual_client.py +29 -0
  21. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/cli.py +10 -0
  22. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/ircd.py +14 -11
  23. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/api-stability.md +122 -2
  24. agentirc_cli-9.8.0/docs/bots.md +174 -0
  25. agentirc_cli-9.8.0/docs/plans/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +86 -0
  26. agentirc_cli-9.8.0/docs/specs/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +50 -0
  27. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/pyproject.toml +52 -1
  28. agentirc_cli-9.8.0/tests/bots/test_bot.py +309 -0
  29. agentirc_cli-9.8.0/tests/bots/test_bot_host.py +77 -0
  30. agentirc_cli-9.8.0/tests/bots/test_bot_manager.py +302 -0
  31. agentirc_cli-9.8.0/tests/bots/test_cli_bot.py +328 -0
  32. agentirc_cli-9.8.0/tests/bots/test_config_bots.py +204 -0
  33. agentirc_cli-9.8.0/tests/bots/test_filter_dsl.py +260 -0
  34. agentirc_cli-9.8.0/tests/bots/test_http_listener.py +205 -0
  35. agentirc_cli-9.8.0/tests/bots/test_public_surface.py +168 -0
  36. agentirc_cli-9.8.0/tests/bots/test_template_engine.py +86 -0
  37. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/conftest.py +23 -0
  38. agentirc_cli-9.8.0/tests/telemetry/__init__.py +0 -0
  39. agentirc_cli-9.8.0/uv.lock +1473 -0
  40. agentirc_cli-9.6.2/agentirc/_internal/bots/bot_manager.py +0 -38
  41. agentirc_cli-9.6.2/agentirc/_internal/bots/http_listener.py +0 -36
  42. agentirc_cli-9.6.2/uv.lock +0 -676
  43. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  44. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  45. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/cicd/SKILL.md +0 -0
  46. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  47. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  48. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  49. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  50. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  51. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/communicate/SKILL.md +0 -0
  52. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  53. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  54. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  55. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  56. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  57. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  58. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/think/SKILL.md +0 -0
  59. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills/think/scripts/think.sh +0 -0
  60. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.claude/skills.local.yaml.example +0 -0
  61. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.github/workflows/publish.yml +0 -0
  62. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/.github/workflows/tests.yml +0 -0
  63. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/LICENSE +0 -0
  64. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/__init__.py +0 -0
  65. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/__main__.py +0 -0
  66. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/__init__.py +0 -0
  67. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/aio.py +0 -0
  68. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/bots/__init__.py +0 -0
  69. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/cli_shared/__init__.py +0 -0
  70. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/cli_shared/constants.py +0 -0
  71. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/cli_shared/mesh.py +0 -0
  72. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/constants.py +0 -0
  73. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/event_subscriptions.py +0 -0
  74. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/pidfile.py +0 -0
  75. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/protocol/__init__.py +0 -0
  76. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/protocol/message.py +0 -0
  77. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/protocol/replies.py +0 -0
  78. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/telemetry/__init__.py +0 -0
  79. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/telemetry/audit.py +0 -0
  80. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/telemetry/context.py +0 -0
  81. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/telemetry/metrics.py +0 -0
  82. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/telemetry/tracing.py +0 -0
  83. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/_internal/virtual_client.py +0 -0
  84. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/channel.py +0 -0
  85. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/client.py +0 -0
  86. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/config.py +0 -0
  87. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/events.py +0 -0
  88. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/history_store.py +0 -0
  89. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/protocol.py +0 -0
  90. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/remote_client.py +0 -0
  91. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/room_store.py +0 -0
  92. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/rooms_util.py +0 -0
  93. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/server_link.py +0 -0
  94. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/skill.py +0 -0
  95. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/skills/__init__.py +0 -0
  96. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/skills/history.py +0 -0
  97. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/skills/icon.py +0 -0
  98. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/skills/rooms.py +0 -0
  99. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/skills/threads.py +0 -0
  100. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/thread_store.py +0 -0
  101. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/agentirc/virtual_client.py +0 -0
  102. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/cli.md +0 -0
  103. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/deployment.md +0 -0
  104. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/extension-api.md +0 -0
  105. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/steward/onboarding.md +0 -0
  106. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/superpowers/specs/2026-04-30-bootstrap-design.md +0 -0
  107. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/superpowers/specs/2026-05-01-bot-extension-api-design.md +0 -0
  108. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/docs/superpowers/specs/2026-05-01-task14-audit.md +0 -0
  109. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/__init__.py +0 -0
  110. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/_helpers.py +0 -0
  111. {agentirc_cli-9.6.2/tests/telemetry → agentirc_cli-9.8.0/tests/bots}/__init__.py +0 -0
  112. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/_fakes.py +0 -0
  113. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/_metrics_helpers.py +0 -0
  114. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_audit_emit.py +0 -0
  115. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_audit_lifecycle.py +0 -0
  116. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_audit_module.py +0 -0
  117. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_audit_parse_error.py +0 -0
  118. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_config.py +0 -0
  119. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_dispatch_span.py +0 -0
  120. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_emit_event_span.py +0 -0
  121. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_metrics_init.py +0 -0
  122. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_metrics_s2s.py +0 -0
  123. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_outbound_inject.py +0 -0
  124. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_parse_error.py +0 -0
  125. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_s2s_relay_span.py +0 -0
  126. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_server_init.py +0 -0
  127. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_server_link_inject.py +0 -0
  128. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/telemetry/test_tracing.py +0 -0
  129. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_api_stability_embedding.py +0 -0
  130. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_bot_capability.py +0 -0
  131. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_channel.py +0 -0
  132. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_cli.py +0 -0
  133. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_config_loader.py +0 -0
  134. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_connection.py +0 -0
  135. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_discovery.py +0 -0
  136. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_event_subscriptions.py +0 -0
  137. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_eventpub.py +0 -0
  138. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_events_basic.py +0 -0
  139. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_events_catalog.py +0 -0
  140. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_events_federation.py +0 -0
  141. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_events_history.py +0 -0
  142. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_events_lifecycle.py +0 -0
  143. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_events_reserved_nick.py +0 -0
  144. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_federation.py +0 -0
  145. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_history.py +0 -0
  146. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_link_reconnect.py +0 -0
  147. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_mentions.py +0 -0
  148. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_messaging.py +0 -0
  149. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_modes.py +0 -0
  150. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_protocol_bot_exports.py +0 -0
  151. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_room_persistence.py +0 -0
  152. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_rooms_federation.py +0 -0
  153. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_rooms_integration.py +0 -0
  154. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_server_icon_skill.py +0 -0
  155. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_skills.py +0 -0
  156. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_threads.py +0 -0
  157. {agentirc_cli-9.6.2 → agentirc_cli-9.8.0}/tests/test_wire_format_envelope.py +0 -0
@@ -0,0 +1 @@
1
+ agentirc-9-7-0-ships-an-embedded-bot-framework-bot
@@ -0,0 +1 @@
1
+ agentirc-9-7-0-ships-an-embedded-bot-framework-bot
@@ -0,0 +1,211 @@
1
+ {
2
+ "slug": "agentirc-9-7-0-ships-an-embedded-bot-framework-bot",
3
+ "title": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap",
4
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-06-12T11:19:28Z",
7
+ "updated": "2026-06-12T11:27:23Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h4",
18
+ "text": "agentirc-cli 9.7.0 is published to PyPI with the bot framework importable, and culture's cutover PR replaces culture/bots/* with forwards while keeping its suite green",
19
+ "status": "confirmed"
20
+ }
21
+ ],
22
+ "hard_questions": [],
23
+ "links": []
24
+ },
25
+ {
26
+ "id": "c2",
27
+ "kind": "audience",
28
+ "text": "culture (the immediate consumer wiring its IRCd to install BotManager + forwarding culture bot CLI verbs) and any standalone agentirc embedder wanting deterministic YAML chatops bots inside their IRCd",
29
+ "origin": "llm",
30
+ "status": "confirmed",
31
+ "honesty_conditions": [
32
+ {
33
+ "id": "h5",
34
+ "text": "culture's cutover PR consumes the published agentirc API (installs BotManager + forwards CLI) without reimplementing bot logic",
35
+ "status": "confirmed"
36
+ }
37
+ ],
38
+ "hard_questions": [],
39
+ "links": []
40
+ },
41
+ {
42
+ "id": "c3",
43
+ "kind": "before_state",
44
+ "text": "the bot framework lives only in culture/bots/* (~1340 lines incl config.py); agentirc ships only no-op BotManager/http_listener stubs in _internal/bots/; culture cannot slim its front door because deleting bots would lose functionality",
45
+ "origin": "llm",
46
+ "status": "confirmed",
47
+ "honesty_conditions": [
48
+ {
49
+ "id": "h6",
50
+ "text": "the _internal/bots stubs and culture/bots/* line counts are verifiable in the two repos at cutover time",
51
+ "status": "confirmed"
52
+ }
53
+ ],
54
+ "hard_questions": [],
55
+ "links": []
56
+ },
57
+ {
58
+ "id": "c4",
59
+ "kind": "after_state",
60
+ "text": "manager + Bot + filter_dsl + template_engine + config (YAML BotConfig) live in agentirc, are unit-tested here (filter DSL + template engine edge cases especially), and a documented public API lets an embedder install a BotManager onto a running IRCd and register YAML-spec'd bots",
61
+ "origin": "llm",
62
+ "status": "confirmed",
63
+ "honesty_conditions": [
64
+ {
65
+ "id": "h7",
66
+ "text": "docs/api-stability.md documents the agentirc.bots install/register API with a worked example",
67
+ "status": "confirmed"
68
+ }
69
+ ],
70
+ "hard_questions": [],
71
+ "links": []
72
+ },
73
+ {
74
+ "id": "c5",
75
+ "kind": "why_it_matters",
76
+ "text": "the bot brain is already bound to agentirc protocol types (filter DSL evaluates Event/EventType; bot host subclasses agentirc.virtual_client.VirtualClient) \u2014 bots have no coherent life without an IRCd, so the framework belongs here, not in culture or a third package",
77
+ "origin": "llm",
78
+ "status": "confirmed",
79
+ "honesty_conditions": [
80
+ {
81
+ "id": "h8",
82
+ "text": "filter_dsl.evaluate runs against real agentirc Event objects in a test, and the bot host resolves agentirc.virtual_client.VirtualClient as its base",
83
+ "status": "confirmed"
84
+ }
85
+ ],
86
+ "hard_questions": [],
87
+ "links": []
88
+ },
89
+ {
90
+ "id": "c6",
91
+ "kind": "boundary",
92
+ "text": "NOT in scope: porting culture's system bots (culture/bots/system/*), any LLM/agent-backend bot harness (forbidden by the dependency boundary), and renaming on-disk artifacts (BOTS_DIR stays ~/.culture/bots for culture continuity)",
93
+ "origin": "llm",
94
+ "status": "confirmed",
95
+ "honesty_conditions": [
96
+ {
97
+ "id": "h9",
98
+ "text": "no file under culture/bots/system/ is vendored, no backend SDK is added to pyproject deps, and BOTS_DIR default still resolves under ~/.culture/bots",
99
+ "status": "confirmed"
100
+ }
101
+ ],
102
+ "hard_questions": [],
103
+ "links": []
104
+ },
105
+ {
106
+ "id": "c7",
107
+ "kind": "success_signal",
108
+ "text": "pip install agentirc-cli==9.7.0 in a clean venv imports the bot framework; pytest covers filter DSL + template engine + manager lifecycle; culture's cutover PR replaces culture/bots/* with re-export shims and its test suite stays green",
109
+ "origin": "llm",
110
+ "status": "confirmed",
111
+ "honesty_conditions": [
112
+ {
113
+ "id": "h10",
114
+ "text": "a clean-venv install test imports agentirc.bots and the DSL/template/lifecycle tests run green in agentirc CI",
115
+ "status": "confirmed"
116
+ }
117
+ ],
118
+ "hard_questions": [],
119
+ "links": []
120
+ },
121
+ {
122
+ "id": "c8",
123
+ "kind": "requirement",
124
+ "text": "the real BotManager must satisfy the existing _internal/bots stub contract (__init__(server), async load_bots, load_system_bots, get_bot(nick), async on_event(event), async stop_all) because IRCd.start() already calls these methods",
125
+ "origin": "llm",
126
+ "status": "confirmed",
127
+ "honesty_conditions": [
128
+ {
129
+ "id": "h1",
130
+ "text": "an IRCd booted in-process with a BotManager installed loads a YAML bot, dispatches a matching Event to it, and the bot replies \u2014 exercised by a test",
131
+ "status": "confirmed"
132
+ }
133
+ ],
134
+ "hard_questions": [],
135
+ "links": []
136
+ },
137
+ {
138
+ "id": "c9",
139
+ "kind": "requirement",
140
+ "text": "vendored via cite-don't-copy: each moved file gets a [tool.citation] entry (quote/paraphrase/synthesize) with source URL + sha256; culture.bots.* imports rewrite to agentirc.bots.*; bot.py's culture.constants.EVENT_TYPE_RE rewrites to agentirc._internal.constants",
141
+ "origin": "llm",
142
+ "status": "confirmed",
143
+ "honesty_conditions": [
144
+ {
145
+ "id": "h2",
146
+ "text": "cite check passes after the move and the new [tool.citation] entries resolve against real culture source SHAs",
147
+ "status": "confirmed"
148
+ }
149
+ ],
150
+ "hard_questions": [],
151
+ "links": []
152
+ },
153
+ {
154
+ "id": "c10",
155
+ "kind": "requirement",
156
+ "text": "no imports back into culture: git grep '^(from|import) culture' over agentirc/ must stay empty after the move",
157
+ "origin": "llm",
158
+ "status": "confirmed",
159
+ "honesty_conditions": [
160
+ {
161
+ "id": "h3",
162
+ "text": "CI's git grep portability check returns nothing for 'from culture'/'import culture' across agentirc/ and tests/",
163
+ "status": "confirmed"
164
+ }
165
+ ],
166
+ "hard_questions": [],
167
+ "links": []
168
+ },
169
+ {
170
+ "id": "c11",
171
+ "kind": "decision",
172
+ "text": "version bump is minor (9.7.0): the move is additive \u2014 a new public bot subsystem and CLI verbs, no breaking change to the five existing public modules",
173
+ "origin": "llm",
174
+ "status": "confirmed",
175
+ "honesty_conditions": [],
176
+ "hard_questions": [],
177
+ "links": []
178
+ },
179
+ {
180
+ "id": "c12",
181
+ "kind": "decision",
182
+ "text": "Webhook: port http_listener.py too \u2014 add aiohttp + opentelemetry-instrumentation-aiohttp-server deps, reversing the 9.5.0 deferral; bots ship with full webhook-ingress parity",
183
+ "origin": "llm",
184
+ "status": "confirmed",
185
+ "honesty_conditions": [],
186
+ "hard_questions": [],
187
+ "links": []
188
+ },
189
+ {
190
+ "id": "c13",
191
+ "kind": "decision",
192
+ "text": "Placement: agentirc/bots/ is a PUBLIC, semver-tracked subsystem (6th public surface); embedders import agentirc.bots.BotManager / Bot; _internal/bots stubs become re-export shims or are removed; public API table in CLAUDE.md + docs/api-stability.md gains an agentirc.bots row",
193
+ "origin": "llm",
194
+ "status": "confirmed",
195
+ "honesty_conditions": [],
196
+ "hard_questions": [],
197
+ "links": []
198
+ },
199
+ {
200
+ "id": "c14",
201
+ "kind": "decision",
202
+ "text": "CLI: ship 'agentirc bot create/start/stop/list/inspect/archive/unarchive' verbs in 9.7.0, ported from culture/cli/bot.py, so culture bot can become a thin forward to agentirc.cli.dispatch",
203
+ "origin": "llm",
204
+ "status": "confirmed",
205
+ "honesty_conditions": [],
206
+ "hard_questions": [],
207
+ "links": []
208
+ }
209
+ ],
210
+ "open_vagueness": []
211
+ }
@@ -0,0 +1,318 @@
1
+ {
2
+ "slug": "agentirc-9-7-0-ships-an-embedded-bot-framework-bot",
3
+ "title": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap",
4
+ "frame_slug": "agentirc-9-7-0-ships-an-embedded-bot-framework-bot",
5
+ "schema_version": 1,
6
+ "status": "exported",
7
+ "created": "2026-06-12T11:28:49Z",
8
+ "updated": "2026-06-12T11:32:38Z",
9
+ "targets": [
10
+ {
11
+ "id": "c1",
12
+ "kind": "announcement",
13
+ "text": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap"
14
+ },
15
+ {
16
+ "id": "h4",
17
+ "kind": "honesty",
18
+ "text": "agentirc-cli 9.7.0 is published to PyPI with the bot framework importable, and culture's cutover PR replaces culture/bots/* with forwards while keeping its suite green"
19
+ },
20
+ {
21
+ "id": "c2",
22
+ "kind": "audience",
23
+ "text": "culture (the immediate consumer wiring its IRCd to install BotManager + forwarding culture bot CLI verbs) and any standalone agentirc embedder wanting deterministic YAML chatops bots inside their IRCd"
24
+ },
25
+ {
26
+ "id": "h5",
27
+ "kind": "honesty",
28
+ "text": "culture's cutover PR consumes the published agentirc API (installs BotManager + forwards CLI) without reimplementing bot logic"
29
+ },
30
+ {
31
+ "id": "c3",
32
+ "kind": "before_state",
33
+ "text": "the bot framework lives only in culture/bots/* (~1340 lines incl config.py); agentirc ships only no-op BotManager/http_listener stubs in _internal/bots/; culture cannot slim its front door because deleting bots would lose functionality"
34
+ },
35
+ {
36
+ "id": "h6",
37
+ "kind": "honesty",
38
+ "text": "the _internal/bots stubs and culture/bots/* line counts are verifiable in the two repos at cutover time"
39
+ },
40
+ {
41
+ "id": "c4",
42
+ "kind": "after_state",
43
+ "text": "manager + Bot + filter_dsl + template_engine + config (YAML BotConfig) live in agentirc, are unit-tested here (filter DSL + template engine edge cases especially), and a documented public API lets an embedder install a BotManager onto a running IRCd and register YAML-spec'd bots"
44
+ },
45
+ {
46
+ "id": "h7",
47
+ "kind": "honesty",
48
+ "text": "docs/api-stability.md documents the agentirc.bots install/register API with a worked example"
49
+ },
50
+ {
51
+ "id": "c5",
52
+ "kind": "why_it_matters",
53
+ "text": "the bot brain is already bound to agentirc protocol types (filter DSL evaluates Event/EventType; bot host subclasses agentirc.virtual_client.VirtualClient) \u2014 bots have no coherent life without an IRCd, so the framework belongs here, not in culture or a third package"
54
+ },
55
+ {
56
+ "id": "h8",
57
+ "kind": "honesty",
58
+ "text": "filter_dsl.evaluate runs against real agentirc Event objects in a test, and the bot host resolves agentirc.virtual_client.VirtualClient as its base"
59
+ },
60
+ {
61
+ "id": "c6",
62
+ "kind": "boundary",
63
+ "text": "NOT in scope: porting culture's system bots (culture/bots/system/*), any LLM/agent-backend bot harness (forbidden by the dependency boundary), and renaming on-disk artifacts (BOTS_DIR stays ~/.culture/bots for culture continuity)"
64
+ },
65
+ {
66
+ "id": "h9",
67
+ "kind": "honesty",
68
+ "text": "no file under culture/bots/system/ is vendored, no backend SDK is added to pyproject deps, and BOTS_DIR default still resolves under ~/.culture/bots"
69
+ },
70
+ {
71
+ "id": "c7",
72
+ "kind": "success_signal",
73
+ "text": "pip install agentirc-cli==9.7.0 in a clean venv imports the bot framework; pytest covers filter DSL + template engine + manager lifecycle; culture's cutover PR replaces culture/bots/* with re-export shims and its test suite stays green"
74
+ },
75
+ {
76
+ "id": "h10",
77
+ "kind": "honesty",
78
+ "text": "a clean-venv install test imports agentirc.bots and the DSL/template/lifecycle tests run green in agentirc CI"
79
+ },
80
+ {
81
+ "id": "c8",
82
+ "kind": "requirement",
83
+ "text": "the real BotManager must satisfy the existing _internal/bots stub contract (__init__(server), async load_bots, load_system_bots, get_bot(nick), async on_event(event), async stop_all) because IRCd.start() already calls these methods"
84
+ },
85
+ {
86
+ "id": "h1",
87
+ "kind": "honesty",
88
+ "text": "an IRCd booted in-process with a BotManager installed loads a YAML bot, dispatches a matching Event to it, and the bot replies \u2014 exercised by a test"
89
+ },
90
+ {
91
+ "id": "c9",
92
+ "kind": "requirement",
93
+ "text": "vendored via cite-don't-copy: each moved file gets a [tool.citation] entry (quote/paraphrase/synthesize) with source URL + sha256; culture.bots.* imports rewrite to agentirc.bots.*; bot.py's culture.constants.EVENT_TYPE_RE rewrites to agentirc._internal.constants"
94
+ },
95
+ {
96
+ "id": "h2",
97
+ "kind": "honesty",
98
+ "text": "cite check passes after the move and the new [tool.citation] entries resolve against real culture source SHAs"
99
+ },
100
+ {
101
+ "id": "c10",
102
+ "kind": "requirement",
103
+ "text": "no imports back into culture: git grep '^(from|import) culture' over agentirc/ must stay empty after the move"
104
+ },
105
+ {
106
+ "id": "h3",
107
+ "kind": "honesty",
108
+ "text": "CI's git grep portability check returns nothing for 'from culture'/'import culture' across agentirc/ and tests/"
109
+ }
110
+ ],
111
+ "tasks": [
112
+ {
113
+ "id": "t1",
114
+ "summary": "Vendor template_engine.py -> agentirc/bots/template_engine.py (verbatim quote)",
115
+ "origin": "llm",
116
+ "status": "confirmed",
117
+ "acceptance_criteria": [
118
+ "render_template + render_fallback produce identical output to culture's template_engine across a case table incl. missing-key fallback and json-value rendering"
119
+ ],
120
+ "deps": [],
121
+ "covers": [
122
+ "c4"
123
+ ]
124
+ },
125
+ {
126
+ "id": "t2",
127
+ "summary": "Vendor filter_dsl.py -> agentirc/bots/filter_dsl.py (verbatim quote)",
128
+ "origin": "llm",
129
+ "status": "confirmed",
130
+ "acceptance_criteria": [
131
+ "compile_filter parses every DSL operator; evaluate() returns correct bool against a constructed agentirc Event; malformed filter raises FilterParseError"
132
+ ],
133
+ "deps": [],
134
+ "covers": [
135
+ "c5",
136
+ "h8"
137
+ ]
138
+ },
139
+ {
140
+ "id": "t3",
141
+ "summary": "Vendor config.py BotConfig + BOTS_DIR -> agentirc/bots/config.py (paraphrase)",
142
+ "origin": "llm",
143
+ "status": "confirmed",
144
+ "acceptance_criteria": [
145
+ "BotConfig loads a valid YAML bot spec; BOTS_DIR default resolves under ~/.culture/bots; malformed YAML rejected without partial state"
146
+ ],
147
+ "deps": [],
148
+ "covers": [
149
+ "c4",
150
+ "h9"
151
+ ]
152
+ },
153
+ {
154
+ "id": "t4",
155
+ "summary": "Vendor bot-host virtual_client subclass -> agentirc/bots/virtual_client.py (paraphrase)",
156
+ "origin": "llm",
157
+ "status": "confirmed",
158
+ "acceptance_criteria": [
159
+ "agentirc.bots.virtual_client.VirtualClient subclasses agentirc.virtual_client.VirtualClient with no behavioral override; instantiation registers presence in a channel"
160
+ ],
161
+ "deps": [],
162
+ "covers": [
163
+ "c5",
164
+ "h8"
165
+ ]
166
+ },
167
+ {
168
+ "id": "t5",
169
+ "summary": "Packaging: pyproject deps (aiohttp + opentelemetry-instrumentation-aiohttp-server) + version 9.7.0 + all [tool.citation] entries + uv.lock + CHANGELOG",
170
+ "origin": "llm",
171
+ "status": "confirmed",
172
+ "acceptance_criteria": [
173
+ "pyproject declares both aiohttp deps; agentirc version reads 9.7.0; uv.lock regenerated+staged; [tool.citation] has quote/paraphrase entries for all 8 vendored bot files; no backend SDK added"
174
+ ],
175
+ "deps": [],
176
+ "covers": [
177
+ "h4",
178
+ "c6",
179
+ "c9"
180
+ ]
181
+ },
182
+ {
183
+ "id": "t6",
184
+ "summary": "Vendor bot.py -> agentirc/bots/bot.py (paraphrase: import rewrites to agentirc.*)",
185
+ "origin": "llm",
186
+ "status": "confirmed",
187
+ "acceptance_criteria": [
188
+ "Bot loads from BotConfig, matches an Event via the filter DSL, renders a reply via the template engine; all imports resolve to agentirc.* with EVENT_TYPE_RE from agentirc._internal.constants; zero culture imports"
189
+ ],
190
+ "deps": [
191
+ "t1",
192
+ "t2",
193
+ "t3",
194
+ "t4"
195
+ ],
196
+ "covers": [
197
+ "c4",
198
+ "c5",
199
+ "c8",
200
+ "h8"
201
+ ]
202
+ },
203
+ {
204
+ "id": "t7",
205
+ "summary": "Vendor bot_manager.py -> agentirc/bots/bot_manager.py satisfying the _internal/bots stub contract",
206
+ "origin": "llm",
207
+ "status": "confirmed",
208
+ "acceptance_criteria": [
209
+ "BotManager matches the stub contract (__init__(server), async load_bots/on_event/stop_all, load_system_bots, get_bot); an in-process IRCd with BotManager installed loads a YAML bot, dispatches a matching Event, and the bot replies \u2014 proven by a test"
210
+ ],
211
+ "deps": [
212
+ "t6"
213
+ ],
214
+ "covers": [
215
+ "c2",
216
+ "c3",
217
+ "c8",
218
+ "h1"
219
+ ]
220
+ },
221
+ {
222
+ "id": "t8",
223
+ "summary": "Vendor http_listener.py -> agentirc/bots/http_listener.py (aiohttp webhook ingress)",
224
+ "origin": "llm",
225
+ "status": "confirmed",
226
+ "acceptance_criteria": [
227
+ "http_listener binds an aiohttp webhook endpoint that dispatches an inbound webhook to a registered bot; a test posts a webhook and asserts the bot fired; otel aiohttp instrumentation wired"
228
+ ],
229
+ "deps": [
230
+ "t7"
231
+ ],
232
+ "covers": [
233
+ "c4"
234
+ ]
235
+ },
236
+ {
237
+ "id": "t9",
238
+ "summary": "Public surface: agentirc/bots/__init__.py exports + convert _internal/bots stubs to deprecation re-export shims",
239
+ "origin": "llm",
240
+ "status": "confirmed",
241
+ "acceptance_criteria": [
242
+ "from agentirc.bots import BotManager, Bot works in a clean session; _internal/bots stubs re-export from agentirc.bots and emit DeprecationWarning"
243
+ ],
244
+ "deps": [
245
+ "t7"
246
+ ],
247
+ "covers": [
248
+ "c4",
249
+ "h5"
250
+ ]
251
+ },
252
+ {
253
+ "id": "t10",
254
+ "summary": "Port culture/cli/bot.py -> agentirc bot CLI verbs wired into agentirc.cli.dispatch",
255
+ "origin": "llm",
256
+ "status": "confirmed",
257
+ "acceptance_criteria": [
258
+ "agentirc bot create/start/stop/list/inspect/archive/unarchive dispatch through agentirc.cli; agentirc bot list runs; flags match culture/cli/bot.py so culture bot can forward"
259
+ ],
260
+ "deps": [
261
+ "t7",
262
+ "t9"
263
+ ],
264
+ "covers": [
265
+ "c2",
266
+ "h5"
267
+ ]
268
+ },
269
+ {
270
+ "id": "t11",
271
+ "summary": "Docs: agentirc.bots in docs/api-stability.md (worked example) + CLAUDE.md public API table row",
272
+ "origin": "llm",
273
+ "status": "confirmed",
274
+ "acceptance_criteria": [
275
+ "docs/api-stability.md gains an agentirc.bots row + worked example installing BotManager onto a running IRCd and registering a YAML bot; CLAUDE.md public API table lists agentirc.bots"
276
+ ],
277
+ "deps": [
278
+ "t9"
279
+ ],
280
+ "covers": [
281
+ "c4",
282
+ "h7"
283
+ ]
284
+ },
285
+ {
286
+ "id": "t12",
287
+ "summary": "Integration gate: cite check + full suite + clean-venv import + portability grep",
288
+ "origin": "llm",
289
+ "status": "confirmed",
290
+ "acceptance_criteria": [
291
+ "cite check passes (entries resolve to real culture SHAs); pytest -n auto green; clean-venv install of built wheel imports agentirc.bots; CI grep finds no 'from culture'/'import culture' in agentirc/+tests/; no culture/bots/system/ file vendored"
292
+ ],
293
+ "deps": [
294
+ "t5",
295
+ "t6",
296
+ "t7",
297
+ "t8",
298
+ "t9",
299
+ "t10",
300
+ "t11"
301
+ ],
302
+ "covers": [
303
+ "c1",
304
+ "c3",
305
+ "c6",
306
+ "c7",
307
+ "c9",
308
+ "c10",
309
+ "h2",
310
+ "h3",
311
+ "h6",
312
+ "h9",
313
+ "h10"
314
+ ]
315
+ }
316
+ ],
317
+ "risks": []
318
+ }
@@ -222,3 +222,6 @@ __marimo__/
222
222
 
223
223
  # Streamlit
224
224
  .streamlit/secrets.toml
225
+
226
+ # devague working state (not committed by default)
227
+ .devague/reviews/
@@ -4,6 +4,61 @@ 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.8.0] - 2026-06-12
8
+
9
+ Make bot authoring discoverable: a dedicated guide plus first-class CLI support
10
+ for event-triggered bots.
11
+
12
+ ### Added
13
+
14
+ - **`agentirc bot create --trigger event --event-filter "<expr>"`** — the CLI
15
+ can now create event-triggered bots, not just `webhook` ones. The filter is
16
+ compiled and validated at create time (a malformed expression is rejected
17
+ immediately). `--event-filter` is required for `--trigger event` and rejected
18
+ for `--trigger webhook`.
19
+ - **[`docs/bots.md`](docs/bots.md)** — a bot-authoring guide: CLI quick start
20
+ for both trigger types, the `bot.yaml` schema for hand-authoring, the
21
+ event-filter DSL grammar, and templating. Linked from the README.
22
+
23
+ ### Changed
24
+
25
+ - README public-API table now lists all six public modules (it had drifted to
26
+ three) and gains an "Embedded bots" section. Corrected the stale 9.5.0
27
+ "webhook never bound" operational note — since 9.7.0 `IRCd.start()` binds the
28
+ listener when `webhook_port > 0`.
29
+
30
+ ## [9.7.0] - 2026-06-12
31
+
32
+ Absorb culture's bot framework into the public `agentirc.bots` subsystem. Closes
33
+ [#33](https://github.com/agentculture/agentirc/issues/33).
34
+
35
+ ### Added
36
+
37
+ - **`agentirc.bots` public subsystem** — embeds culture's bot framework directly
38
+ into agentirc as a semver-tracked public API. Eight modules vendored from
39
+ `culture@df50942` via the cite-don't-copy pattern:
40
+ - `agentirc.bots.template_engine` — Jinja2-style template engine for bot
41
+ response rendering (quote from `culture/bots/template_engine.py`).
42
+ - `agentirc.bots.filter_dsl` — filter DSL for routing bot event subscriptions
43
+ (quote from `culture/bots/filter_dsl.py`).
44
+ - `agentirc.bots.config` — bot YAML configuration dataclasses (paraphrase of
45
+ `culture/bots/config.py` with import rewrites).
46
+ - `agentirc.bots.virtual_client` — in-process IRC client for bots to speak
47
+ into a hosted IRCd (paraphrase of `culture/bots/virtual_client.py`).
48
+ - `agentirc.bots.bot` — base `Bot` class with lifecycle hooks and event
49
+ dispatch (paraphrase of `culture/bots/bot.py`).
50
+ - `agentirc.bots.bot_manager` — `BotManager` that owns the bot lifecycle and
51
+ wires bots to the IRCd's event subscription stream (paraphrase of
52
+ `culture/bots/bot_manager.py`).
53
+ - `agentirc.bots.http_listener` — `HttpListener` webhook receiver that
54
+ converts HTTP POST payloads into IRC events (paraphrase of
55
+ `culture/bots/http_listener.py`; requires `aiohttp`).
56
+ - `agentirc.bots.cli` — `bot` subcommand for the `agentirc` CLI (paraphrase
57
+ of `culture/cli/bot.py`).
58
+ - **New runtime dependencies**: `aiohttp>=3.9` (HTTP webhook listener) and
59
+ `opentelemetry-instrumentation-aiohttp-server>=0.43b0` (OTEL tracing for the
60
+ webhook server), consistent with the existing `>=1.22` otel pins.
61
+
7
62
  ## [9.6.2] - 2026-06-10
8
63
 
9
64
  Resync the vendored steward skills. Closes