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.
- package/README.md +75 -27
- package/dist/agent-57MG4LBM.js +2 -0
- package/dist/audit-JU3HWISB.js +3 -0
- package/dist/audit-JU3HWISB.js.map +1 -0
- package/dist/{board-dashboard-CXIVJKDP.js → board-dashboard-HXDOYGIG.js} +2237 -69
- package/dist/board-dashboard-HXDOYGIG.js.map +1 -0
- package/dist/chunk-23AUU4S2.js +102 -0
- package/dist/chunk-23AUU4S2.js.map +1 -0
- package/dist/{chunk-EKTPCSN4.js → chunk-4ITQP3XL.js} +2 -2
- package/dist/chunk-4MREHZP5.js +111 -0
- package/dist/chunk-4MREHZP5.js.map +1 -0
- package/dist/chunk-4YCH6IZV.js +2 -0
- package/dist/chunk-53NRX2NA.js +2 -0
- package/dist/chunk-53NRX2NA.js.map +1 -0
- package/dist/chunk-6B74TO2J.js +743 -0
- package/dist/chunk-6B74TO2J.js.map +1 -0
- package/dist/chunk-7P5QRX5W.js +108 -0
- package/dist/chunk-7P5QRX5W.js.map +1 -0
- package/dist/chunk-A6BKSZQA.js +3 -0
- package/dist/chunk-A6BKSZQA.js.map +1 -0
- package/dist/{chunk-6PPIFDOQ.js → chunk-CNNLREHD.js} +67 -22
- package/dist/{chunk-6PPIFDOQ.js.map → chunk-CNNLREHD.js.map} +1 -1
- package/dist/chunk-DJEZ2HVU.js +5 -0
- package/dist/chunk-DJEZ2HVU.js.map +1 -0
- package/dist/chunk-DLVOHCTA.js +5 -0
- package/dist/{chunk-MBEQASP3.js.map → chunk-DLVOHCTA.js.map} +1 -1
- package/dist/chunk-E4ZZILAK.js +15 -0
- package/dist/chunk-E4ZZILAK.js.map +1 -0
- package/dist/{chunk-63UYRJIC.js → chunk-IKBHHTIT.js} +2 -2
- package/dist/chunk-JGXE2YNV.js +46 -0
- package/dist/chunk-JGXE2YNV.js.map +1 -0
- package/dist/chunk-JTJIPNXY.js +2 -0
- package/dist/chunk-JTJIPNXY.js.map +1 -0
- package/dist/chunk-MBOLXKA2.js +6 -0
- package/dist/chunk-MBOLXKA2.js.map +1 -0
- package/dist/{inbox-L5ZZ623Y.js → chunk-MTRWXRFF.js} +69 -4
- package/dist/chunk-MTRWXRFF.js.map +1 -0
- package/dist/{processes-XF5CV4LK.js → chunk-NOF4HSGK.js} +3 -3
- package/dist/{processes-XF5CV4LK.js.map → chunk-NOF4HSGK.js.map} +1 -1
- package/dist/chunk-QW2OYR3N.js +7 -0
- package/dist/chunk-QW2OYR3N.js.map +1 -0
- package/dist/chunk-SR3X25TN.js +3 -0
- package/dist/chunk-SR3X25TN.js.map +1 -0
- package/dist/chunk-SV3I4CI7.js +440 -0
- package/dist/chunk-SV3I4CI7.js.map +1 -0
- package/dist/{chunk-TT2Q7YMZ.js → chunk-TC3BSUP7.js} +6 -6
- package/dist/{chunk-TT2Q7YMZ.js.map → chunk-TC3BSUP7.js.map} +1 -1
- package/dist/chunk-VJUTQAPJ.js +2 -0
- package/dist/chunk-VJUTQAPJ.js.map +1 -0
- package/dist/chunk-VWTBHLMX.js +1 -0
- package/dist/chunk-WFHIIVLL.js +719 -0
- package/dist/chunk-WFHIIVLL.js.map +1 -0
- package/dist/chunk-WPPUOTY6.js +6 -0
- package/dist/chunk-WPPUOTY6.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{compaction-X46EQEPS.js → compaction-BTUJJ3LJ.js} +4 -4
- package/dist/config-QXWKEQON.js +2 -0
- package/dist/config-mutator-53XGR2NT.js +2 -0
- package/dist/conflict-detector-D7VIYPDI.js +2 -0
- package/dist/conflict-detector-D7VIYPDI.js.map +1 -0
- package/dist/{context-planner-G2J7FNNU.js → context-planner-I7ID7XF3.js} +3 -3
- package/dist/debug-N3B5NVJU.js +2 -0
- package/dist/discover-XJXQXXIO.js +4 -0
- package/dist/discover-XJXQXXIO.js.map +1 -0
- package/dist/doctor-SEOUFHSL.js +2 -0
- package/dist/{editor-chat-R54E65W5.js → editor-chat-RVLCKKB7.js} +2 -2
- package/dist/heal-YEQYWX2L.js +2 -0
- package/dist/inbox-BIN2S5XN.js +2 -0
- package/dist/index.d.ts +1292 -122
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/{ingest-whatsapp-NS4OWDOU.js → ingest-whatsapp-LZE62INA.js} +2 -2
- package/dist/loader-5CA3O5GM.js +2 -0
- package/dist/loader-6IHUCPVO.js +2 -0
- package/dist/memory-extract-KRCHD3OP.js +2 -0
- package/dist/migrate-v2-QO7SLKIM.js +4 -0
- package/dist/migrate-v2-QO7SLKIM.js.map +1 -0
- package/dist/processes-RJ6RDP32.js +2 -0
- package/dist/program-SASDC2GV.js +2 -0
- package/dist/providers-WVCMIW67.js +2 -0
- package/dist/query-HZYYRCLU.js +2 -0
- package/dist/recipes-EPLE2SNT.js +2 -0
- package/dist/registry-HM4ELSXS.js +2 -0
- package/dist/rotation-memo-GMTZPMNE.js +13 -0
- package/dist/rotation-memo-GMTZPMNE.js.map +1 -0
- package/dist/scheduler-XVFIK4XH.js +2 -0
- package/dist/{slack-PSQLVTGB.js → slack-6P7ZJ32Y.js} +2 -2
- package/dist/store-BAPDZHXE.js +2 -0
- package/dist/{subagent-2SJHSSJS.js → subagent-WV7QKQ3L.js} +2 -2
- package/dist/{task-store-NM7VKNLE.js → task-store-RHISEU6V.js} +2 -2
- package/dist/task-store-RHISEU6V.js.map +1 -0
- package/dist/{telegram-W4SLFMNY.js → telegram-PIYDRM46.js} +2 -2
- package/dist/timers-5LPZN55J.js +2 -0
- package/dist/timers-5LPZN55J.js.map +1 -0
- package/dist/types-VECTMYTO.js +2 -0
- package/dist/types-VECTMYTO.js.map +1 -0
- package/dist/types-ZRLHHCGB.js +2 -0
- package/dist/types-ZRLHHCGB.js.map +1 -0
- package/dist/web/activity-graph.global.js +654 -0
- package/dist/web/activity-graph.global.js.map +1 -0
- package/dist/web/workflow-editor.global.js +35 -12
- package/dist/web/workflow-editor.global.js.map +1 -1
- package/dist/{whatsapp-DCHRBRVV.js → whatsapp-PFRDMUMT.js} +2 -2
- package/dist/{whatsapp-state-6D6FHHD2.js → whatsapp-state-XMTCSRXU.js} +2 -2
- package/dist/wiki-53W5NLZV.js +2 -0
- package/dist/wiki-53W5NLZV.js.map +1 -0
- package/dist/workspace-setup-FPGN5VNY.js +2 -0
- package/dist/workspace-setup-FPGN5VNY.js.map +1 -0
- package/package.json +13 -2
- package/dist/agent-4AOMVXRJ.js +0 -2
- package/dist/board-dashboard-CXIVJKDP.js.map +0 -1
- package/dist/chunk-34NG7UDX.js +0 -11
- package/dist/chunk-34NG7UDX.js.map +0 -1
- package/dist/chunk-4HP6UC2X.js +0 -13
- package/dist/chunk-4HP6UC2X.js.map +0 -1
- package/dist/chunk-5WNGHDFC.js +0 -164
- package/dist/chunk-5WNGHDFC.js.map +0 -1
- package/dist/chunk-ABCHHNG6.js +0 -625
- package/dist/chunk-ABCHHNG6.js.map +0 -1
- package/dist/chunk-FIOB3MEX.js +0 -2
- package/dist/chunk-HCFSHGK4.js +0 -46
- package/dist/chunk-HCFSHGK4.js.map +0 -1
- package/dist/chunk-HHJGKD5B.js +0 -71
- package/dist/chunk-HHJGKD5B.js.map +0 -1
- package/dist/chunk-LEIYC3BF.js +0 -104
- package/dist/chunk-LEIYC3BF.js.map +0 -1
- package/dist/chunk-MBEQASP3.js +0 -5
- package/dist/chunk-MCJUAE6V.js +0 -6
- package/dist/chunk-MCJUAE6V.js.map +0 -1
- package/dist/chunk-SRHLXZRF.js +0 -7
- package/dist/chunk-SRHLXZRF.js.map +0 -1
- package/dist/chunk-WZEYII2S.js +0 -6
- package/dist/chunk-WZEYII2S.js.map +0 -1
- package/dist/chunk-XDJSYQST.js +0 -6
- package/dist/chunk-XDJSYQST.js.map +0 -1
- package/dist/chunk-YPOELN6Z.js +0 -798
- package/dist/chunk-YPOELN6Z.js.map +0 -1
- package/dist/config-KCYHMKCT.js +0 -2
- package/dist/config-mutator-QP4GLBOE.js +0 -2
- package/dist/debug-3MEUO2P2.js +0 -2
- package/dist/heal-JDXUPRET.js +0 -2
- package/dist/inbox-L5ZZ623Y.js.map +0 -1
- package/dist/loader-PTCXLJEX.js +0 -2
- package/dist/memory-extract-WH4FZ456.js +0 -2
- package/dist/program-FFWEILAS.js +0 -2
- package/dist/providers-AKQ4HTB4.js +0 -2
- package/dist/query-PKGYE5HR.js +0 -2
- package/dist/registry-IFMDJWQ7.js +0 -2
- package/dist/scheduler-63D5KFO7.js +0 -2
- package/dist/store-5MJOO74U.js +0 -2
- package/dist/timers-PCB4ZIBD.js +0 -2
- package/dist/types-C7IFH42Z.js +0 -2
- package/dist/types-OIFU3KSQ.js +0 -2
- package/dist/usage-dashboard-AXPXB2KP.js +0 -803
- package/dist/usage-dashboard-AXPXB2KP.js.map +0 -1
- package/dist/wiki-UDPYFJBL.js +0 -2
- package/dist/workspace-setup-C4VB3QZV.js +0 -2
- /package/dist/{agent-4AOMVXRJ.js.map → agent-57MG4LBM.js.map} +0 -0
- /package/dist/{chunk-EKTPCSN4.js.map → chunk-4ITQP3XL.js.map} +0 -0
- /package/dist/{chunk-FIOB3MEX.js.map → chunk-4YCH6IZV.js.map} +0 -0
- /package/dist/{chunk-63UYRJIC.js.map → chunk-IKBHHTIT.js.map} +0 -0
- /package/dist/{config-KCYHMKCT.js.map → chunk-VWTBHLMX.js.map} +0 -0
- /package/dist/{compaction-X46EQEPS.js.map → compaction-BTUJJ3LJ.js.map} +0 -0
- /package/dist/{config-mutator-QP4GLBOE.js.map → config-QXWKEQON.js.map} +0 -0
- /package/dist/{debug-3MEUO2P2.js.map → config-mutator-53XGR2NT.js.map} +0 -0
- /package/dist/{context-planner-G2J7FNNU.js.map → context-planner-I7ID7XF3.js.map} +0 -0
- /package/dist/{heal-JDXUPRET.js.map → debug-N3B5NVJU.js.map} +0 -0
- /package/dist/{loader-PTCXLJEX.js.map → doctor-SEOUFHSL.js.map} +0 -0
- /package/dist/{editor-chat-R54E65W5.js.map → editor-chat-RVLCKKB7.js.map} +0 -0
- /package/dist/{memory-extract-WH4FZ456.js.map → heal-YEQYWX2L.js.map} +0 -0
- /package/dist/{program-FFWEILAS.js.map → inbox-BIN2S5XN.js.map} +0 -0
- /package/dist/{ingest-whatsapp-NS4OWDOU.js.map → ingest-whatsapp-LZE62INA.js.map} +0 -0
- /package/dist/{providers-AKQ4HTB4.js.map → loader-5CA3O5GM.js.map} +0 -0
- /package/dist/{query-PKGYE5HR.js.map → loader-6IHUCPVO.js.map} +0 -0
- /package/dist/{registry-IFMDJWQ7.js.map → memory-extract-KRCHD3OP.js.map} +0 -0
- /package/dist/{scheduler-63D5KFO7.js.map → processes-RJ6RDP32.js.map} +0 -0
- /package/dist/{store-5MJOO74U.js.map → program-SASDC2GV.js.map} +0 -0
- /package/dist/{task-store-NM7VKNLE.js.map → providers-WVCMIW67.js.map} +0 -0
- /package/dist/{timers-PCB4ZIBD.js.map → query-HZYYRCLU.js.map} +0 -0
- /package/dist/{types-C7IFH42Z.js.map → recipes-EPLE2SNT.js.map} +0 -0
- /package/dist/{types-OIFU3KSQ.js.map → registry-HM4ELSXS.js.map} +0 -0
- /package/dist/{wiki-UDPYFJBL.js.map → scheduler-XVFIK4XH.js.map} +0 -0
- /package/dist/{slack-PSQLVTGB.js.map → slack-6P7ZJ32Y.js.map} +0 -0
- /package/dist/{workspace-setup-C4VB3QZV.js.map → store-BAPDZHXE.js.map} +0 -0
- /package/dist/{subagent-2SJHSSJS.js.map → subagent-WV7QKQ3L.js.map} +0 -0
- /package/dist/{telegram-W4SLFMNY.js.map → telegram-PIYDRM46.js.map} +0 -0
- /package/dist/{whatsapp-DCHRBRVV.js.map → whatsapp-PFRDMUMT.js.map} +0 -0
- /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
|
-
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- **
|
|
23
|
-
- **`agentx
|
|
24
|
-
-
|
|
25
|
-
|
|
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
|
|
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
|
-
|
|
72
|
-
- [
|
|
73
|
-
- [
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- [
|
|
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
|
-
|
|
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[
|
|
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"]}
|