agentix-cli 0.17.0 → 0.19.0

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 (189) hide show
  1. package/README.md +75 -27
  2. package/dist/agent-57MG4LBM.js +2 -0
  3. package/dist/audit-JU3HWISB.js +3 -0
  4. package/dist/audit-JU3HWISB.js.map +1 -0
  5. package/dist/{board-dashboard-CXIVJKDP.js → board-dashboard-HXDOYGIG.js} +2237 -69
  6. package/dist/board-dashboard-HXDOYGIG.js.map +1 -0
  7. package/dist/chunk-23AUU4S2.js +102 -0
  8. package/dist/chunk-23AUU4S2.js.map +1 -0
  9. package/dist/{chunk-EKTPCSN4.js → chunk-4ITQP3XL.js} +2 -2
  10. package/dist/chunk-4MREHZP5.js +111 -0
  11. package/dist/chunk-4MREHZP5.js.map +1 -0
  12. package/dist/chunk-4YCH6IZV.js +2 -0
  13. package/dist/chunk-53NRX2NA.js +2 -0
  14. package/dist/chunk-53NRX2NA.js.map +1 -0
  15. package/dist/chunk-6B74TO2J.js +743 -0
  16. package/dist/chunk-6B74TO2J.js.map +1 -0
  17. package/dist/chunk-7P5QRX5W.js +108 -0
  18. package/dist/chunk-7P5QRX5W.js.map +1 -0
  19. package/dist/chunk-A6BKSZQA.js +3 -0
  20. package/dist/chunk-A6BKSZQA.js.map +1 -0
  21. package/dist/{chunk-6PPIFDOQ.js → chunk-CNNLREHD.js} +67 -22
  22. package/dist/{chunk-6PPIFDOQ.js.map → chunk-CNNLREHD.js.map} +1 -1
  23. package/dist/chunk-DJEZ2HVU.js +5 -0
  24. package/dist/chunk-DJEZ2HVU.js.map +1 -0
  25. package/dist/chunk-DLVOHCTA.js +5 -0
  26. package/dist/{chunk-MBEQASP3.js.map → chunk-DLVOHCTA.js.map} +1 -1
  27. package/dist/chunk-E4ZZILAK.js +15 -0
  28. package/dist/chunk-E4ZZILAK.js.map +1 -0
  29. package/dist/{chunk-63UYRJIC.js → chunk-IKBHHTIT.js} +2 -2
  30. package/dist/chunk-JGXE2YNV.js +46 -0
  31. package/dist/chunk-JGXE2YNV.js.map +1 -0
  32. package/dist/chunk-JTJIPNXY.js +2 -0
  33. package/dist/chunk-JTJIPNXY.js.map +1 -0
  34. package/dist/chunk-MBOLXKA2.js +6 -0
  35. package/dist/chunk-MBOLXKA2.js.map +1 -0
  36. package/dist/{inbox-L5ZZ623Y.js → chunk-MTRWXRFF.js} +69 -4
  37. package/dist/chunk-MTRWXRFF.js.map +1 -0
  38. package/dist/{processes-XF5CV4LK.js → chunk-NOF4HSGK.js} +3 -3
  39. package/dist/{processes-XF5CV4LK.js.map → chunk-NOF4HSGK.js.map} +1 -1
  40. package/dist/chunk-QW2OYR3N.js +7 -0
  41. package/dist/chunk-QW2OYR3N.js.map +1 -0
  42. package/dist/chunk-SR3X25TN.js +3 -0
  43. package/dist/chunk-SR3X25TN.js.map +1 -0
  44. package/dist/chunk-SV3I4CI7.js +440 -0
  45. package/dist/chunk-SV3I4CI7.js.map +1 -0
  46. package/dist/{chunk-TT2Q7YMZ.js → chunk-TC3BSUP7.js} +6 -6
  47. package/dist/{chunk-TT2Q7YMZ.js.map → chunk-TC3BSUP7.js.map} +1 -1
  48. package/dist/chunk-VJUTQAPJ.js +2 -0
  49. package/dist/chunk-VJUTQAPJ.js.map +1 -0
  50. package/dist/chunk-VWTBHLMX.js +1 -0
  51. package/dist/chunk-WFHIIVLL.js +719 -0
  52. package/dist/chunk-WFHIIVLL.js.map +1 -0
  53. package/dist/chunk-WPPUOTY6.js +6 -0
  54. package/dist/chunk-WPPUOTY6.js.map +1 -0
  55. package/dist/cli.js +1 -1
  56. package/dist/cli.js.map +1 -1
  57. package/dist/{compaction-X46EQEPS.js → compaction-BTUJJ3LJ.js} +4 -4
  58. package/dist/config-QXWKEQON.js +2 -0
  59. package/dist/config-mutator-53XGR2NT.js +2 -0
  60. package/dist/conflict-detector-D7VIYPDI.js +2 -0
  61. package/dist/conflict-detector-D7VIYPDI.js.map +1 -0
  62. package/dist/{context-planner-G2J7FNNU.js → context-planner-I7ID7XF3.js} +3 -3
  63. package/dist/debug-N3B5NVJU.js +2 -0
  64. package/dist/discover-XJXQXXIO.js +4 -0
  65. package/dist/discover-XJXQXXIO.js.map +1 -0
  66. package/dist/doctor-SEOUFHSL.js +2 -0
  67. package/dist/{editor-chat-R54E65W5.js → editor-chat-RVLCKKB7.js} +2 -2
  68. package/dist/heal-YEQYWX2L.js +2 -0
  69. package/dist/inbox-BIN2S5XN.js +2 -0
  70. package/dist/index.d.ts +1292 -122
  71. package/dist/index.js +8 -8
  72. package/dist/index.js.map +1 -1
  73. package/dist/{ingest-whatsapp-NS4OWDOU.js → ingest-whatsapp-LZE62INA.js} +2 -2
  74. package/dist/loader-5CA3O5GM.js +2 -0
  75. package/dist/loader-6IHUCPVO.js +2 -0
  76. package/dist/memory-extract-KRCHD3OP.js +2 -0
  77. package/dist/migrate-v2-QO7SLKIM.js +4 -0
  78. package/dist/migrate-v2-QO7SLKIM.js.map +1 -0
  79. package/dist/processes-RJ6RDP32.js +2 -0
  80. package/dist/program-SASDC2GV.js +2 -0
  81. package/dist/providers-WVCMIW67.js +2 -0
  82. package/dist/query-HZYYRCLU.js +2 -0
  83. package/dist/recipes-EPLE2SNT.js +2 -0
  84. package/dist/registry-HM4ELSXS.js +2 -0
  85. package/dist/rotation-memo-GMTZPMNE.js +13 -0
  86. package/dist/rotation-memo-GMTZPMNE.js.map +1 -0
  87. package/dist/scheduler-XVFIK4XH.js +2 -0
  88. package/dist/{slack-PSQLVTGB.js → slack-6P7ZJ32Y.js} +2 -2
  89. package/dist/store-BAPDZHXE.js +2 -0
  90. package/dist/{subagent-2SJHSSJS.js → subagent-WV7QKQ3L.js} +2 -2
  91. package/dist/{task-store-NM7VKNLE.js → task-store-RHISEU6V.js} +2 -2
  92. package/dist/task-store-RHISEU6V.js.map +1 -0
  93. package/dist/{telegram-W4SLFMNY.js → telegram-PIYDRM46.js} +2 -2
  94. package/dist/timers-5LPZN55J.js +2 -0
  95. package/dist/timers-5LPZN55J.js.map +1 -0
  96. package/dist/types-VECTMYTO.js +2 -0
  97. package/dist/types-VECTMYTO.js.map +1 -0
  98. package/dist/types-ZRLHHCGB.js +2 -0
  99. package/dist/types-ZRLHHCGB.js.map +1 -0
  100. package/dist/web/activity-graph.global.js +654 -0
  101. package/dist/web/activity-graph.global.js.map +1 -0
  102. package/dist/web/workflow-editor.global.js +35 -12
  103. package/dist/web/workflow-editor.global.js.map +1 -1
  104. package/dist/{whatsapp-DCHRBRVV.js → whatsapp-PFRDMUMT.js} +2 -2
  105. package/dist/{whatsapp-state-6D6FHHD2.js → whatsapp-state-XMTCSRXU.js} +2 -2
  106. package/dist/wiki-53W5NLZV.js +2 -0
  107. package/dist/wiki-53W5NLZV.js.map +1 -0
  108. package/dist/workspace-setup-FPGN5VNY.js +2 -0
  109. package/dist/workspace-setup-FPGN5VNY.js.map +1 -0
  110. package/package.json +13 -2
  111. package/dist/agent-4AOMVXRJ.js +0 -2
  112. package/dist/board-dashboard-CXIVJKDP.js.map +0 -1
  113. package/dist/chunk-34NG7UDX.js +0 -11
  114. package/dist/chunk-34NG7UDX.js.map +0 -1
  115. package/dist/chunk-4HP6UC2X.js +0 -13
  116. package/dist/chunk-4HP6UC2X.js.map +0 -1
  117. package/dist/chunk-5WNGHDFC.js +0 -164
  118. package/dist/chunk-5WNGHDFC.js.map +0 -1
  119. package/dist/chunk-ABCHHNG6.js +0 -625
  120. package/dist/chunk-ABCHHNG6.js.map +0 -1
  121. package/dist/chunk-FIOB3MEX.js +0 -2
  122. package/dist/chunk-HCFSHGK4.js +0 -46
  123. package/dist/chunk-HCFSHGK4.js.map +0 -1
  124. package/dist/chunk-HHJGKD5B.js +0 -71
  125. package/dist/chunk-HHJGKD5B.js.map +0 -1
  126. package/dist/chunk-LEIYC3BF.js +0 -104
  127. package/dist/chunk-LEIYC3BF.js.map +0 -1
  128. package/dist/chunk-MBEQASP3.js +0 -5
  129. package/dist/chunk-MCJUAE6V.js +0 -6
  130. package/dist/chunk-MCJUAE6V.js.map +0 -1
  131. package/dist/chunk-SRHLXZRF.js +0 -7
  132. package/dist/chunk-SRHLXZRF.js.map +0 -1
  133. package/dist/chunk-WZEYII2S.js +0 -6
  134. package/dist/chunk-WZEYII2S.js.map +0 -1
  135. package/dist/chunk-XDJSYQST.js +0 -6
  136. package/dist/chunk-XDJSYQST.js.map +0 -1
  137. package/dist/chunk-YPOELN6Z.js +0 -798
  138. package/dist/chunk-YPOELN6Z.js.map +0 -1
  139. package/dist/config-KCYHMKCT.js +0 -2
  140. package/dist/config-mutator-QP4GLBOE.js +0 -2
  141. package/dist/debug-3MEUO2P2.js +0 -2
  142. package/dist/heal-JDXUPRET.js +0 -2
  143. package/dist/inbox-L5ZZ623Y.js.map +0 -1
  144. package/dist/loader-PTCXLJEX.js +0 -2
  145. package/dist/memory-extract-WH4FZ456.js +0 -2
  146. package/dist/program-FFWEILAS.js +0 -2
  147. package/dist/providers-AKQ4HTB4.js +0 -2
  148. package/dist/query-PKGYE5HR.js +0 -2
  149. package/dist/registry-IFMDJWQ7.js +0 -2
  150. package/dist/scheduler-63D5KFO7.js +0 -2
  151. package/dist/store-5MJOO74U.js +0 -2
  152. package/dist/timers-PCB4ZIBD.js +0 -2
  153. package/dist/types-C7IFH42Z.js +0 -2
  154. package/dist/types-OIFU3KSQ.js +0 -2
  155. package/dist/usage-dashboard-AXPXB2KP.js +0 -803
  156. package/dist/usage-dashboard-AXPXB2KP.js.map +0 -1
  157. package/dist/wiki-UDPYFJBL.js +0 -2
  158. package/dist/workspace-setup-C4VB3QZV.js +0 -2
  159. /package/dist/{agent-4AOMVXRJ.js.map → agent-57MG4LBM.js.map} +0 -0
  160. /package/dist/{chunk-EKTPCSN4.js.map → chunk-4ITQP3XL.js.map} +0 -0
  161. /package/dist/{chunk-FIOB3MEX.js.map → chunk-4YCH6IZV.js.map} +0 -0
  162. /package/dist/{chunk-63UYRJIC.js.map → chunk-IKBHHTIT.js.map} +0 -0
  163. /package/dist/{config-KCYHMKCT.js.map → chunk-VWTBHLMX.js.map} +0 -0
  164. /package/dist/{compaction-X46EQEPS.js.map → compaction-BTUJJ3LJ.js.map} +0 -0
  165. /package/dist/{config-mutator-QP4GLBOE.js.map → config-QXWKEQON.js.map} +0 -0
  166. /package/dist/{debug-3MEUO2P2.js.map → config-mutator-53XGR2NT.js.map} +0 -0
  167. /package/dist/{context-planner-G2J7FNNU.js.map → context-planner-I7ID7XF3.js.map} +0 -0
  168. /package/dist/{heal-JDXUPRET.js.map → debug-N3B5NVJU.js.map} +0 -0
  169. /package/dist/{loader-PTCXLJEX.js.map → doctor-SEOUFHSL.js.map} +0 -0
  170. /package/dist/{editor-chat-R54E65W5.js.map → editor-chat-RVLCKKB7.js.map} +0 -0
  171. /package/dist/{memory-extract-WH4FZ456.js.map → heal-YEQYWX2L.js.map} +0 -0
  172. /package/dist/{program-FFWEILAS.js.map → inbox-BIN2S5XN.js.map} +0 -0
  173. /package/dist/{ingest-whatsapp-NS4OWDOU.js.map → ingest-whatsapp-LZE62INA.js.map} +0 -0
  174. /package/dist/{providers-AKQ4HTB4.js.map → loader-5CA3O5GM.js.map} +0 -0
  175. /package/dist/{query-PKGYE5HR.js.map → loader-6IHUCPVO.js.map} +0 -0
  176. /package/dist/{registry-IFMDJWQ7.js.map → memory-extract-KRCHD3OP.js.map} +0 -0
  177. /package/dist/{scheduler-63D5KFO7.js.map → processes-RJ6RDP32.js.map} +0 -0
  178. /package/dist/{store-5MJOO74U.js.map → program-SASDC2GV.js.map} +0 -0
  179. /package/dist/{task-store-NM7VKNLE.js.map → providers-WVCMIW67.js.map} +0 -0
  180. /package/dist/{timers-PCB4ZIBD.js.map → query-HZYYRCLU.js.map} +0 -0
  181. /package/dist/{types-C7IFH42Z.js.map → recipes-EPLE2SNT.js.map} +0 -0
  182. /package/dist/{types-OIFU3KSQ.js.map → registry-HM4ELSXS.js.map} +0 -0
  183. /package/dist/{wiki-UDPYFJBL.js.map → scheduler-XVFIK4XH.js.map} +0 -0
  184. /package/dist/{slack-PSQLVTGB.js.map → slack-6P7ZJ32Y.js.map} +0 -0
  185. /package/dist/{workspace-setup-C4VB3QZV.js.map → store-BAPDZHXE.js.map} +0 -0
  186. /package/dist/{subagent-2SJHSSJS.js.map → subagent-WV7QKQ3L.js.map} +0 -0
  187. /package/dist/{telegram-W4SLFMNY.js.map → telegram-PIYDRM46.js.map} +0 -0
  188. /package/dist/{whatsapp-DCHRBRVV.js.map → whatsapp-PFRDMUMT.js.map} +0 -0
  189. /package/dist/{whatsapp-state-6D6FHHD2.js.map → whatsapp-state-XMTCSRXU.js.map} +0 -0
package/README.md CHANGED
@@ -1,28 +1,58 @@
1
1
  # AgentX
2
2
 
3
- **The AI operations layer for small & medium businesses.** Plug in the channels your team already uses — Telegram, WhatsApp, Slack, Discord, GitLab — set schedules, and watch your agents work. Web wizard for non-technical operators, CLI for engineers. Self-hosted.
3
+ **The AI operations layer for small & medium businesses.** Plug in the channels your team already uses — Telegram, WhatsApp, Slack, Discord, GitLab, GitHub — set schedules, and watch your agents work. Web wizard for non-technical operators, CLI for engineers. Self-hosted.
4
4
 
5
5
  ## Who it's for
6
6
 
7
7
  **Small & medium businesses running AI agents on real channels.** Support queues, devops squads, ops teams, internal automation. You want multiple agents handling different jobs, coordinating across machines, answering on the tools your people already use — without standing up a ML platform or hiring dedicated infra.
8
8
 
9
9
  - **Non-technical operators** add agents, connect channels, and schedule jobs from a browser wizard and `/admin` panel — no JSON editing.
10
- - **Engineers** get a full CLI, `agentx.json`, scoped API tokens, mesh federation, and a mutateConfig-safe write path.
10
+ - **Engineers** get a full CLI, `agentx.json`, scoped API tokens, mesh federation, plugins, an append-only intent ledger, and a mutateConfig-safe write path.
11
11
 
12
12
  > **Running AgentX solo for yourself?** [OpenClaw](https://github.com/openclaw/openclaw) is built for single-user assistants and has a lighter install path. If you outgrow it, we import your config — see [Migrate from OpenClaw](docs/migration/from-openclaw.md).
13
13
 
14
14
  ## What you get out of the box
15
15
 
16
- - **Answer on Telegram, WhatsApp, Slack, Discord, GitLab** — one config, all channels. Pair WhatsApp with a QR code in the browser.
17
- - **Browser-based setup wizard + `/admin` panel** — add agents, wire channels, mint scoped API tokens, schedule crons, all without editing JSON
18
- - **Agents = folders, not code** — each agent has its own persona, knowledge, and tools in plain Markdown
19
- - **Multiple machines, one team** — mesh federation across laptops + servers; manage any peer's config from a single dashboard via the mesh selector
20
- - **Scheduled jobs in plain English** — `agentx schedule "every Monday at 9am" --agent sales`
21
- - **Live dashboard** — a browser view of what every agent is doing right now, with full task history, streaming output, and replay
22
- - **Scoped API tokens** — let external apps message an agent with a time-bound, scope-limited token (see [Tokens](docs/reference/tokens.md) and [Public agents](docs/reference/public-agents.md))
23
- - **`agentx doctor`** — pre-flight health check that catches missing keys, unreachable daemons, and misconfigured channels
24
- - **Bring your own AI** — Claude Code (deep reasoning + tools), OpenAI / Anthropic API, Ollama, or anything in between
25
- - **Wiki memory** — conversations compound into a shared knowledge base each agent draws from
16
+ **Channels & routing**
17
+ - **Telegram, WhatsApp, Slack, Discord, GitLab, GitHub, generic webhooks** — one config, all channels. Pair WhatsApp with a QR code in the browser.
18
+ - **Cross-channel `/send`** — agents reply on the channel they received on, or push to any other channel programmatically.
19
+ - **Mesh federation** — agents on different machines collaborate over Tailscale/VPN. Manage any peer's config from one dashboard.
20
+
21
+ **Operator surface**
22
+ - **Browser-based setup wizard + 11-page admin dashboard** — add agents, wire channels, mint scoped tokens, drag-drop Kanban, intent-graph triage, workflow editor — all without editing JSON.
23
+ - **`agentx setup`** — opens the wizard from the terminal; safe to re-run, only writes deltas.
24
+ - **`agentx doctor`** — pre-flight health check that catches missing keys, unreachable daemons, expired tokens, misconfigured channels.
25
+
26
+ **Work pool & backlog**
27
+ - **Backlog import + two-way sync** — `agentx backlog import` pulls open issues from GitLab/GitHub with autocomplete-multiselect; mutations on imported items push assignee/labels/title/description/milestone/state back upstream.
28
+ - **Boards (Kanban)** — column-based view over GitLab projects with drag-drop, scoped-label transitions, stale-Doing reconciler.
29
+
30
+ **Agents are folders, not code**
31
+ - Each agent has its own persona, knowledge, and tools in plain Markdown — `CLAUDE.md`, `.claude/skills/`, optional `references/`.
32
+ - **Bring your own AI** — Claude Code (subscription, full features), Anthropic / OpenAI API, Ollama, or anything in between.
33
+
34
+ **Workflows & procedures**
35
+ - **Declarative state machines in YAML or JSON** under `.agentx/workflows/`, with a visual editor in the dashboard. Triggers from any channel; user-task forms render to Telegram/WhatsApp/Slack/web.
36
+ - **Procedures** — versioned SOPs (`.agentx/procedures/<id>.md`) agents reference at runtime.
37
+ - **Deterministic services** — fixed-prompt handlers for known patterns (no LLM call when the answer is canonical).
38
+
39
+ **Scheduled work**
40
+ - **Plain-English cron** — `agentx schedule "every Monday at 9am" --agent sales`.
41
+ - `onError` pipeline that can both notify you AND auto-disable after N failures.
42
+
43
+ **Governance & observability**
44
+ - **Append-only intent ledger** — every dispatch decision recorded in SQLite; `agentx ledger replay` reproduces them deterministically (Phase 1–8 of the [architectural rescue](docs/journey/11-production-hardening.md)).
45
+ - **PM gating + typed capabilities + delegation-depth caps** — admission control auditable through the ledger.
46
+ - **Live dashboard + token-cost dashboard** — `/live`, `/processes`, `/inbox` for activity; `agentx usage serve` for tier-2 hotspots and per-agent cost.
47
+ - **Scoped API tokens** — time-bound, revocable bearer tokens with named scopes for external integrations.
48
+
49
+ **Extensibility**
50
+ - **Plugins** — drop-in npm packages register custom channel adapters and bus subscribers. `agentx plugin init <name>` scaffolds one.
51
+ - **MCP server** — `agentx serve --stdio` exposes the daemon to Claude Code, Cursor, Windsurf as a tool surface.
52
+
53
+ **Knowledge**
54
+ - **Wiki memory** — conversations compound into a shared, citable knowledge base each agent draws from. Agentic query at read time, daily absorb at write time.
55
+ - **Intent knowledge graph** — fixed-axis taxonomy fed by an LLM classifier with operator triage queue.
26
56
 
27
57
  ## Install
28
58
 
@@ -49,9 +79,9 @@ npm install -g agentix-cli
49
79
  agentx setup # opens the web wizard
50
80
  ```
51
81
 
52
- Open the dashboard at **http://127.0.0.1:4202** — live agents, task history, Kanban boards, and the `/admin` panel for managing agents, channels, and tokens. A `?`-Glossary link is in the topbar if anything looks unfamiliar.
82
+ Open the dashboard at **http://127.0.0.1:4202** — live agents, task history, Kanban boards, intent graph, workflow editor, and the `/admin` panel for managing agents, channels, tokens, and webhooks. A `?`-Glossary link is in the topbar if anything looks unfamiliar.
53
83
 
54
- See the [full install guide](docs/install.md) for advanced setups.
84
+ See the [full install guide](docs/install.md) for advanced setups, Tailscale binding, systemd, and TLS reverse proxy.
55
85
 
56
86
  ## Docs
57
87
 
@@ -61,19 +91,33 @@ Full documentation: **[https://agentx-docs.pages.dev](https://agentx-docs.pages.
61
91
  - [Install](docs/install.md) — from zero to a running daemon in 5 minutes
62
92
  - [Concepts](docs/concepts.md) — what an agent, channel, schedule, and team network are (glossary also lives at `/glossary` in the dashboard)
63
93
 
64
- **Worked examples, simple → advanced:**
94
+ **Worked examples, simple → advanced (12 chapters):**
65
95
  - [1. Telegram Q&A bot](docs/journey/01-telegram-qa-bot.md) — one agent, one channel, one conversation
66
96
  - [2. Scheduled reports with failure alerts](docs/journey/02-scheduled-reports.md)
67
97
  - [3. Multi-agent group chat](docs/journey/03-multi-agent-group.md)
98
+ - [4. Cross-channel — GitLab MR → WhatsApp ping](docs/journey/04-cross-channel.md)
99
+ - [5. Hooks and webhooks](docs/journey/05-hooks-webhooks.md) — generic webhook receiver, hook events, signing
100
+ - [6. Shared wiki](docs/journey/06-shared-wiki.md) — knowledge that compounds
68
101
  - [7. Run a team with AI agents](docs/journey/07-business-layer.md) — roles, KPIs, org chart
69
102
  - [8. Two machines, one team](docs/journey/08-mesh-federation.md) — mesh federation
70
-
71
- **For configuration:**
72
- - [CLI reference](docs/reference/cli.md) · [Config schema](docs/reference/config-schema.md) · [Communication matrix](docs/reference/communication-matrix.md)
73
- - [Scoped API tokens](docs/reference/tokens.md) — mint / scope / revoke
74
- - [Public agents](docs/reference/public-agents.md) — expose an agent over HTTP
75
- - [`agentx doctor`](docs/reference/doctor.md) — pre-flight health check
76
- - [Slack channel](docs/reference/slack.md) — Socket Mode setup
103
+ - [9. Deterministic services](docs/journey/09-deterministic-services.md) — workflows without LLM tokens
104
+ - [10. MCP server](docs/journey/10-mcp-server.md) — drive AgentX from Cursor / Claude Code
105
+ - [11. Production hardening](docs/journey/11-production-hardening.md) — permissions, debug, observability, incident playbook
106
+ - [12. BPM — grant application](docs/journey/12-bpm-grant-application.md)
107
+
108
+ **Operator playbooks:**
109
+ - [Backlog import + upstream sync](docs/playbooks/backlog-import-sync.md)
110
+ - [Plugin authoring](docs/playbooks/plugin-authoring.md)
111
+ - [PM gating — org-chart governance](docs/playbooks/pm-gating.md)
112
+ - [Capability audit — typed intents and delegation depth](docs/playbooks/capability-audit.md)
113
+ - [Tier-2 billing lifecycle](docs/playbooks/tier2-billing.md)
114
+
115
+ **Reference:**
116
+ - [CLI](docs/reference/cli.md) · [Config schema](docs/reference/config-schema.md) · [Communication matrix](docs/reference/communication-matrix.md)
117
+ - [Dashboard pillar](docs/reference/dashboard/) — every admin page documented (setup, live, boards, workflows, inbox, processes, intent graph, agent, admin, usage)
118
+ - [Workflows](docs/reference/workflows.md) · [Boards](docs/reference/boards.md) · [Intent graph](docs/reference/graph.md)
119
+ - [Scoped API tokens](docs/reference/tokens.md) · [Public agents](docs/reference/public-agents.md) · [`agentx doctor`](docs/reference/doctor.md)
120
+ - [Slack channel](docs/reference/slack.md) · [Tailscale mesh VPN](docs/reference/tailscale-setup.md) · [Rollback runbook](docs/reference/rollback-runbook.md)
77
121
 
78
122
  **Moving from another tool:**
79
123
  - [Migrate from OpenClaw](docs/migration/from-openclaw.md) — we import the bulk of your config in one shot
@@ -89,19 +133,23 @@ graph LR
89
133
  S[Slack] --> R
90
134
  D[Discord] --> R
91
135
  G[GitLab] --> R
136
+ GH[GitHub] --> R
92
137
  C[Cron] --> R
93
138
  H[Webhook] --> R
94
139
  M[Mesh peer] --> R
95
- R --> CTX[Context Engine<br/>10 layers, token-budgeted]
140
+ PL[Plugin channels] --> R
141
+ R --> LDG[(Intent Ledger<br/>append-only)]
142
+ LDG --> CTX[Context Engine<br/>layered or planner]
96
143
  CTX --> AG[Agent workspace]
97
- AG --> P1[claude -p]
98
- AG --> P2[OpenAI]
144
+ AG --> P1[Claude Code]
145
+ AG --> P2[OpenAI / Anthropic API]
99
146
  AG --> P3[Ollama]
100
- AG -.-> MEM[(Wiki + Memory)]
147
+ AG -.-> MEM[(Wiki + Graph + Memory)]
148
+ AG -.-> WF[Workflows + Procedures]
101
149
  AG -.-> R
102
150
  ```
103
151
 
104
- Each agent = a workspace directory with Claude Code configuration (`.claude/`, `CLAUDE.md`, skills, hooks, MCP servers). AgentX orchestrates when and where agents run.
152
+ Each agent = a workspace directory with Claude Code configuration (`.claude/`, `CLAUDE.md`, skills, hooks, MCP servers). AgentX orchestrates when and where agents run, ledger-records every dispatch decision, and lets plugins extend the channel + bus surface.
105
153
 
106
154
  ## License
107
155
 
@@ -0,0 +1,2 @@
1
+ import{A as a,B as b,C as c}from"./chunk-TC3BSUP7.js";import"./chunk-SFQUP3BP.js";import"./chunk-JGXE2YNV.js";import"./chunk-VJUTQAPJ.js";import"./chunk-DJEZ2HVU.js";import"./chunk-DSYKYZMT.js";import"./chunk-QOYAX2FT.js";import"./chunk-4YCH6IZV.js";export{a as createAgentContext,b as generate,c as generateStream};
2
+ //# sourceMappingURL=agent-57MG4LBM.js.map
@@ -0,0 +1,3 @@
1
+ import"./chunk-4YCH6IZV.js";function h(e,t,o,n){let r=[],s=e.frontmatter,f=e.instructions??"",l="PASS";if(s.references?.length)for(let i of s.references)m(i,t)||(l="FAILING",r.push(`references: "${i}" does not resolve in the registry`));if(s.delegatesTo?.length)for(let i of s.delegatesTo)n.has(i)||(l="FAILING",r.push(`delegatesTo: "${i}" has no installed SKILL.md`));k(f)&&(l!=="FAILING"&&(l="REVIEW"),r.push("body contains raw `python3 ~/scripts/...` inside a code block \u2014 delegate to the relevant skill instead"));let d=["deploy","ssh","email","gitlab","ops"],p=(s.category||"").toLowerCase(),I=(s.tags||[]).map(i=>i.toLowerCase());(d.includes(p)||I.some(i=>d.includes(i))||/\b(deploy|ssh|gitlab|hotmail|server|host)\b/i.test(s.description||""))&&(!s.references||s.references.length===0)&&(l==="PASS"&&(l="REVIEW"),r.push("infrastructure-flavored skill has no `references:` frontmatter \u2014 facts should be cited from the registry"));let c=f.match(/\b\d{1,3}(?:\.\d{1,3}){3}\b/g);if(c&&c.length>0){let i=new Set([...t.byId.values()].flatMap(a=>Object.values(a.fields).filter(g=>typeof g=="string"))),u=c.filter(a=>!i.has(a));u.length>0&&(l==="PASS"&&(l="REVIEW"),r.push(`body contains raw IP(s) not in the registry: ${[...new Set(u)].slice(0,3).join(", ")}`))}return{skill:e,name:s.name,verdict:l,reasons:r}}function S(e,t){let o=new Set;for(let r of e.recipes)for(let s of r.skills)o.add(s);let n=[];for(let r of o)t.has(r)||n.push({skill:null,name:r,verdict:"FAILING",reasons:["required by a recipe, but no SKILL.md is installed"]});return n}function A(e){let t=new Set(e.skills.map(n=>n.frontmatter.name));return[...e.skills.map(n=>h(n,e.references,e.recipes,t)),...S(e.recipes,t)]}function k(e){let t=!1;for(let o of e.split(`
2
+ `)){if(/^\s*```/.test(o)){t=!t;continue}if(t&&/python3\s+~\/scripts\//.test(o))return!0}return!1}function m(e,t){if(e.endsWith(".*")){let o=e.slice(0,-2);for(let n of t.byId.keys())if(n===o||n.startsWith(`${o}.`))return!0;return!1}return t.byId.has(e)}export{A as auditAll,S as auditMissingSkills,h as auditSkill};
3
+ //# sourceMappingURL=audit-JU3HWISB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/skills/audit.ts"],"sourcesContent":["import type { Skill } from \"./types\"\nimport type { ReferenceIndex } from \"@/agents/references/types\"\nimport type { RecipeIndex } from \"@/agents/references/recipes\"\n\n// --- Skill audit lint ---\n//\n// Verdicts:\n// PASS — skill is deterministic and consistent with the references registry\n// REVIEW — skill works but embeds raw infra facts that should live in references,\n// or carries known-bad anti-patterns (e.g. raw `python3 ~/scripts/...`)\n// FAILING — skill cites references that don't resolve, OR a recipe requires this\n// skill but its SKILL.md is missing, OR delegatesTo points at a\n// non-existent skill\n\nexport type SkillAuditVerdict = \"PASS\" | \"REVIEW\" | \"FAILING\"\n\nexport interface SkillAuditResult {\n skill: Skill | null\n /** Either skill.frontmatter.name or — when missing — the requiredName. */\n name: string\n verdict: SkillAuditVerdict\n reasons: string[]\n}\n\nexport interface AuditInput {\n skills: Skill[]\n references: ReferenceIndex\n recipes: RecipeIndex\n}\n\n/**\n * Audit a single skill against the reference + recipe indices.\n * Pure function — easy to test, no I/O.\n */\nexport function auditSkill(\n skill: Skill,\n references: ReferenceIndex,\n recipes: RecipeIndex,\n knownSkillNames: Set<string>,\n): SkillAuditResult {\n const reasons: string[] = []\n const fm = skill.frontmatter\n const body = skill.instructions ?? \"\"\n let verdict: SkillAuditVerdict = \"PASS\"\n\n // --- FAILING: unresolved references ---\n if (fm.references?.length) {\n for (const ref of fm.references) {\n if (!referenceResolves(ref, references)) {\n verdict = \"FAILING\"\n reasons.push(`references: \"${ref}\" does not resolve in the registry`)\n }\n }\n }\n\n // --- FAILING: delegatesTo points at a missing skill ---\n if (fm.delegatesTo?.length) {\n for (const delegate of fm.delegatesTo) {\n if (!knownSkillNames.has(delegate)) {\n verdict = \"FAILING\"\n reasons.push(`delegatesTo: \"${delegate}\" has no installed SKILL.md`)\n }\n }\n }\n\n // --- REVIEW: hardcoded raw script invocations inside fenced code blocks ---\n // Flagging only fenced code blocks avoids false positives from prose like\n // \"Do not invoke `python3 ~/scripts/...`\" — the skill is *recommending*\n // the script when it puts it inside ```...``` (or indented as a runnable\n // command), not when it explicitly forbids it.\n if (containsRawScriptInCodeFence(body)) {\n if (verdict !== \"FAILING\") verdict = \"REVIEW\"\n reasons.push(\"body contains raw `python3 ~/scripts/...` inside a code block — delegate to the relevant skill instead\")\n }\n\n // --- REVIEW: deploy/ssh/email/gitlab skills with no references frontmatter ---\n const infraCategory = [\"deploy\", \"ssh\", \"email\", \"gitlab\", \"ops\"]\n const cat = (fm.category || \"\").toLowerCase()\n const tags = (fm.tags || []).map(t => t.toLowerCase())\n const looksInfra =\n infraCategory.includes(cat) ||\n tags.some(t => infraCategory.includes(t)) ||\n /\\b(deploy|ssh|gitlab|hotmail|server|host)\\b/i.test(fm.description || \"\")\n if (looksInfra && (!fm.references || fm.references.length === 0)) {\n if (verdict === \"PASS\") verdict = \"REVIEW\"\n reasons.push(\n \"infrastructure-flavored skill has no `references:` frontmatter — facts should be cited from the registry\",\n )\n }\n\n // --- REVIEW: raw IP/email patterns embedded that look like deterministic facts ---\n const ipMatches = body.match(/\\b\\d{1,3}(?:\\.\\d{1,3}){3}\\b/g)\n if (ipMatches && ipMatches.length > 0) {\n const known = new Set(\n [...references.byId.values()].flatMap(c =>\n Object.values(c.fields).filter(v => typeof v === \"string\"),\n ),\n )\n const stranded = ipMatches.filter(ip => !known.has(ip))\n if (stranded.length > 0) {\n if (verdict === \"PASS\") verdict = \"REVIEW\"\n reasons.push(\n `body contains raw IP(s) not in the registry: ${[...new Set(stranded)].slice(0, 3).join(\", \")}`,\n )\n }\n }\n\n return { skill, name: fm.name, verdict, reasons }\n}\n\n/**\n * Audit every recipe-required skill: if a recipe lists a skill name that has\n * no SKILL.md, report it as a FAILING phantom-skill row. The non-existent\n * skill is reported under its required name with skill=null.\n */\nexport function auditMissingSkills(\n recipes: RecipeIndex,\n knownSkillNames: Set<string>,\n): SkillAuditResult[] {\n const required = new Set<string>()\n for (const recipe of recipes.recipes) {\n for (const s of recipe.skills) required.add(s)\n }\n const results: SkillAuditResult[] = []\n for (const name of required) {\n if (!knownSkillNames.has(name)) {\n results.push({\n skill: null,\n name,\n verdict: \"FAILING\",\n reasons: [`required by a recipe, but no SKILL.md is installed`],\n })\n }\n }\n return results\n}\n\n/**\n * Convenience: audit every skill in `input.skills`, plus phantom-skill rows.\n */\nexport function auditAll(input: AuditInput): SkillAuditResult[] {\n const knownNames = new Set(input.skills.map(s => s.frontmatter.name))\n const results = input.skills.map(s =>\n auditSkill(s, input.references, input.recipes, knownNames),\n )\n return [...results, ...auditMissingSkills(input.recipes, knownNames)]\n}\n\nfunction containsRawScriptInCodeFence(body: string): boolean {\n let inFence = false\n for (const line of body.split(\"\\n\")) {\n if (/^\\s*```/.test(line)) {\n inFence = !inFence\n continue\n }\n if (inFence && /python3\\s+~\\/scripts\\//.test(line)) return true\n }\n return false\n}\n\nfunction referenceResolves(ref: string, idx: ReferenceIndex): boolean {\n if (ref.endsWith(\".*\")) {\n const prefix = ref.slice(0, -2)\n for (const id of idx.byId.keys()) {\n if (id === prefix || id.startsWith(`${prefix}.`)) return true\n }\n return false\n }\n return idx.byId.has(ref)\n}\n"],"mappings":"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","names":["auditSkill","skill","references","recipes","knownSkillNames","reasons","fm","body","verdict","ref","referenceResolves","delegate","containsRawScriptInCodeFence","infraCategory","cat","tags","t","ipMatches","known","c","v","stranded","ip","auditMissingSkills","required","recipe","results","name","auditAll","input","knownNames","s","inFence","line","idx","prefix","id"]}