@casys/mcp-erpnext 0.1.2 → 0.1.3
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 +381 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
# @casys/mcp-erpnext
|
|
2
|
+
|
|
3
|
+
MCP server for [ERPNext](https://erpnext.com) / Frappe ERP — **120 tools** across **13 categories**, with **7 interactive UI viewers**.
|
|
4
|
+
|
|
5
|
+
Connect any MCP-compatible AI agent (Claude Desktop, PML, custom) to your ERPNext instance via the standard [Model Context Protocol](https://modelcontextprotocol.io).
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
### Prerequisites
|
|
10
|
+
|
|
11
|
+
Generate API credentials in ERPNext:
|
|
12
|
+
1. Login to ERPNext → top-right menu → **My Settings**
|
|
13
|
+
2. Section **API Access** → **Generate Keys**
|
|
14
|
+
3. Copy `API Key` and `API Secret`
|
|
15
|
+
|
|
16
|
+
### Claude Desktop / Claude Code (npm)
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"mcpServers": {
|
|
21
|
+
"erpnext": {
|
|
22
|
+
"command": "npx",
|
|
23
|
+
"args": ["-y", "@casys/mcp-erpnext"],
|
|
24
|
+
"env": {
|
|
25
|
+
"ERPNEXT_URL": "http://localhost:8000",
|
|
26
|
+
"ERPNEXT_API_KEY": "your-api-key",
|
|
27
|
+
"ERPNEXT_API_SECRET": "your-api-secret"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> Zero dependencies — single self-contained bundle. Requires Node >= 20.
|
|
35
|
+
|
|
36
|
+
### Deno (stdio)
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"mcpServers": {
|
|
41
|
+
"erpnext": {
|
|
42
|
+
"command": "deno",
|
|
43
|
+
"args": ["run", "--allow-all", "server.ts"],
|
|
44
|
+
"env": {
|
|
45
|
+
"ERPNEXT_URL": "http://localhost:8000",
|
|
46
|
+
"ERPNEXT_API_KEY": "your-api-key",
|
|
47
|
+
"ERPNEXT_API_SECRET": "your-api-secret"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### HTTP mode
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ERPNEXT_URL=http://localhost:8000 \
|
|
58
|
+
ERPNEXT_API_KEY=xxx \
|
|
59
|
+
ERPNEXT_API_SECRET=xxx \
|
|
60
|
+
npx -y @casys/mcp-erpnext --http --port=3012
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Category filtering
|
|
64
|
+
|
|
65
|
+
Load only the categories you need:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx -y @casys/mcp-erpnext --categories=sales,inventory
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Fresh Instance Setup
|
|
72
|
+
|
|
73
|
+
On a fresh ERPNext instance (no setup wizard), you need to create master data before using business tools. Use `erpnext_doc_create` for prerequisites:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
1. Warehouse Types: Transit, Default
|
|
77
|
+
2. UOMs: Nos, Kg, Unit, Set, Meter
|
|
78
|
+
3. Item Groups: All Item Groups (is_group=1), then Products, Raw Material (parent=All Item Groups)
|
|
79
|
+
4. Territories: All Territories (is_group=1), then France, etc.
|
|
80
|
+
5. Customer Groups: All Customer Groups (is_group=1), then Commercial, etc.
|
|
81
|
+
6. Supplier Groups: All Supplier Groups (is_group=1), then Hardware, etc.
|
|
82
|
+
7. Company: requires Warehouse Types to exist first
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Tools (120)
|
|
86
|
+
|
|
87
|
+
### Setup (2)
|
|
88
|
+
|
|
89
|
+
| Tool | DocType | Operations |
|
|
90
|
+
|------|---------|-----------|
|
|
91
|
+
| `erpnext_company_list` | Company | List companies |
|
|
92
|
+
| `erpnext_company_create` | Company | Create (name, abbr, currency, country, domain) |
|
|
93
|
+
|
|
94
|
+
### Sales (17)
|
|
95
|
+
|
|
96
|
+
| Tool | DocType | Operations |
|
|
97
|
+
|------|---------|-----------|
|
|
98
|
+
| `erpnext_customer_list` | Customer | List + filters (group, territory, disabled) |
|
|
99
|
+
| `erpnext_customer_get` | Customer | Get by name |
|
|
100
|
+
| `erpnext_customer_create` | Customer | Create (name, group, territory, email, type) |
|
|
101
|
+
| `erpnext_customer_update` | Customer | Update fields |
|
|
102
|
+
| `erpnext_sales_order_list` | Sales Order | List + filters (customer, status, dates) |
|
|
103
|
+
| `erpnext_sales_order_get` | Sales Order | Get with line items |
|
|
104
|
+
| `erpnext_sales_order_create` | Sales Order | Create (customer + items + delivery_date) |
|
|
105
|
+
| `erpnext_sales_order_update` | Sales Order | Update (delivery_date, items) |
|
|
106
|
+
| `erpnext_sales_order_submit` | Sales Order | Submit (Draft → To Deliver and Bill) |
|
|
107
|
+
| `erpnext_sales_order_cancel` | Sales Order | Cancel |
|
|
108
|
+
| `erpnext_sales_invoice_list` | Sales Invoice | List + filters |
|
|
109
|
+
| `erpnext_sales_invoice_get` | Sales Invoice | Get with line items |
|
|
110
|
+
| `erpnext_sales_invoice_create` | Sales Invoice | Create (customer + items + dates) |
|
|
111
|
+
| `erpnext_sales_invoice_submit` | Sales Invoice | Submit (Draft → Unpaid) |
|
|
112
|
+
| `erpnext_quotation_list` | Quotation | List + filters (party, status) |
|
|
113
|
+
| `erpnext_quotation_get` | Quotation | Get with line items |
|
|
114
|
+
| `erpnext_quotation_create` | Quotation | Create (Customer/Lead + items) |
|
|
115
|
+
|
|
116
|
+
### Inventory (9)
|
|
117
|
+
|
|
118
|
+
| Tool | DocType | Operations |
|
|
119
|
+
|------|---------|-----------|
|
|
120
|
+
| `erpnext_item_list` | Item | List + filters (group, stock flag, disabled) |
|
|
121
|
+
| `erpnext_item_get` | Item | Get by name/code |
|
|
122
|
+
| `erpnext_item_create` | Item | Create (code, name, group, uom, rate) |
|
|
123
|
+
| `erpnext_item_update` | Item | Update fields |
|
|
124
|
+
| `erpnext_stock_balance` | Bin | Stock balances by item/warehouse |
|
|
125
|
+
| `erpnext_warehouse_list` | Warehouse | List + filters (company, type) |
|
|
126
|
+
| `erpnext_stock_entry_list` | Stock Entry | List + filters (type, dates) |
|
|
127
|
+
| `erpnext_stock_entry_get` | Stock Entry | Get with item details |
|
|
128
|
+
| `erpnext_stock_entry_create` | Stock Entry | Create (type + items + warehouses) |
|
|
129
|
+
|
|
130
|
+
### Purchasing (11)
|
|
131
|
+
|
|
132
|
+
| Tool | DocType | Operations |
|
|
133
|
+
|------|---------|-----------|
|
|
134
|
+
| `erpnext_supplier_list` | Supplier | List + filters (group, type, disabled) |
|
|
135
|
+
| `erpnext_supplier_get` | Supplier | Get by name |
|
|
136
|
+
| `erpnext_supplier_create` | Supplier | Create (name, group, type, country, currency) |
|
|
137
|
+
| `erpnext_purchase_order_list` | Purchase Order | List + filters (supplier, status, dates) |
|
|
138
|
+
| `erpnext_purchase_order_get` | Purchase Order | Get with line items |
|
|
139
|
+
| `erpnext_purchase_order_create` | Purchase Order | Create (supplier + items + schedule_date) |
|
|
140
|
+
| `erpnext_purchase_invoice_list` | Purchase Invoice | List + filters |
|
|
141
|
+
| `erpnext_purchase_invoice_get` | Purchase Invoice | Get with line items |
|
|
142
|
+
| `erpnext_purchase_receipt_list` | Purchase Receipt | List + filters |
|
|
143
|
+
| `erpnext_purchase_receipt_get` | Purchase Receipt | Get with received items |
|
|
144
|
+
| `erpnext_supplier_quotation_list` | Supplier Quotation | List + filters |
|
|
145
|
+
|
|
146
|
+
### Accounting (6)
|
|
147
|
+
|
|
148
|
+
| Tool | DocType | Operations |
|
|
149
|
+
|------|---------|-----------|
|
|
150
|
+
| `erpnext_account_list` | Account | Chart of accounts + filters (root_type, is_group) |
|
|
151
|
+
| `erpnext_journal_entry_list` | Journal Entry | List + filters (voucher_type, dates) |
|
|
152
|
+
| `erpnext_journal_entry_get` | Journal Entry | Get with accounts |
|
|
153
|
+
| `erpnext_journal_entry_create` | Journal Entry | Create (voucher_type + balanced accounts) |
|
|
154
|
+
| `erpnext_payment_entry_list` | Payment Entry | List + filters (type, party, dates) |
|
|
155
|
+
| `erpnext_payment_entry_get` | Payment Entry | Get with references |
|
|
156
|
+
|
|
157
|
+
### HR (12)
|
|
158
|
+
|
|
159
|
+
| Tool | DocType | Operations |
|
|
160
|
+
|------|---------|-----------|
|
|
161
|
+
| `erpnext_employee_list` | Employee | List + filters (department, status, company) |
|
|
162
|
+
| `erpnext_employee_get` | Employee | Get by ID |
|
|
163
|
+
| `erpnext_attendance_list` | Attendance | List + filters (employee, status, dates) |
|
|
164
|
+
| `erpnext_leave_application_list` | Leave Application | List + filters |
|
|
165
|
+
| `erpnext_leave_application_get` | Leave Application | Get by name |
|
|
166
|
+
| `erpnext_leave_application_create` | Leave Application | Create (employee, type, dates, reason) |
|
|
167
|
+
| `erpnext_salary_slip_list` | Salary Slip | List + filters (employee, status, dates) |
|
|
168
|
+
| `erpnext_salary_slip_get` | Salary Slip | Get with earnings/deductions |
|
|
169
|
+
| `erpnext_payroll_entry_list` | Payroll Entry | List + filters (company, status) |
|
|
170
|
+
| `erpnext_expense_claim_list` | Expense Claim | List + filters |
|
|
171
|
+
| `erpnext_expense_claim_create` | Expense Claim | Create (employee + expenses[]) |
|
|
172
|
+
| `erpnext_leave_balance` | Leave Allocation | Get allocations by employee |
|
|
173
|
+
|
|
174
|
+
### Project (9)
|
|
175
|
+
|
|
176
|
+
| Tool | DocType | Operations |
|
|
177
|
+
|------|---------|-----------|
|
|
178
|
+
| `erpnext_project_list` | Project | List + filters (status, company) |
|
|
179
|
+
| `erpnext_project_get` | Project | Get by name |
|
|
180
|
+
| `erpnext_project_create` | Project | Create (name, status, dates, budget, company) |
|
|
181
|
+
| `erpnext_task_list` | Task | List + filters (project, status, priority) |
|
|
182
|
+
| `erpnext_task_get` | Task | Get with dependencies |
|
|
183
|
+
| `erpnext_task_create` | Task | Create (project, subject, status, priority, dates) |
|
|
184
|
+
| `erpnext_task_update` | Task | Update (status, priority, progress, dates) |
|
|
185
|
+
| `erpnext_timesheet_list` | Timesheet | List + filters (employee, project, status) |
|
|
186
|
+
| `erpnext_timesheet_get` | Timesheet | Get with time log details |
|
|
187
|
+
|
|
188
|
+
### Delivery (5)
|
|
189
|
+
|
|
190
|
+
| Tool | DocType | Operations |
|
|
191
|
+
|------|---------|-----------|
|
|
192
|
+
| `erpnext_delivery_note_list` | Delivery Note | List + filters (customer, status, dates) |
|
|
193
|
+
| `erpnext_delivery_note_get` | Delivery Note | Get with delivered items |
|
|
194
|
+
| `erpnext_delivery_note_create` | Delivery Note | Create (customer + items + against_sales_order) |
|
|
195
|
+
| `erpnext_shipment_list` | Shipment | List + filters (status, carrier, dates) |
|
|
196
|
+
| `erpnext_shipment_get` | Shipment | Get with parcels |
|
|
197
|
+
|
|
198
|
+
### Manufacturing (7)
|
|
199
|
+
|
|
200
|
+
| Tool | DocType | Operations |
|
|
201
|
+
|------|---------|-----------|
|
|
202
|
+
| `erpnext_bom_list` | BOM | List + filters (item, is_active, is_default) |
|
|
203
|
+
| `erpnext_bom_get` | BOM | Get with raw materials + operations |
|
|
204
|
+
| `erpnext_work_order_list` | Work Order | List + filters (production_item, status, dates) |
|
|
205
|
+
| `erpnext_work_order_get` | Work Order | Get with operations + materials |
|
|
206
|
+
| `erpnext_work_order_create` | Work Order | Create (production_item, bom_no, qty, dates) |
|
|
207
|
+
| `erpnext_job_card_list` | Job Card | List + filters (work_order, status, operation) |
|
|
208
|
+
| `erpnext_job_card_get` | Job Card | Get with time logs + material transfers |
|
|
209
|
+
|
|
210
|
+
### CRM (8)
|
|
211
|
+
|
|
212
|
+
| Tool | DocType | Operations |
|
|
213
|
+
|------|---------|-----------|
|
|
214
|
+
| `erpnext_lead_list` | Lead | List + filters (status, lead_owner, source) |
|
|
215
|
+
| `erpnext_lead_get` | Lead | Get by name |
|
|
216
|
+
| `erpnext_lead_create` | Lead | Create (name, company, email, phone, source) |
|
|
217
|
+
| `erpnext_opportunity_list` | Opportunity | List + filters (status, owner, party) |
|
|
218
|
+
| `erpnext_opportunity_get` | Opportunity | Get with items + competitors |
|
|
219
|
+
| `erpnext_contact_list` | Contact | List + filters (company, status) |
|
|
220
|
+
| `erpnext_contact_get` | Contact | Get by name |
|
|
221
|
+
| `erpnext_campaign_list` | Campaign | List + filters (campaign_type) |
|
|
222
|
+
|
|
223
|
+
### Assets (8)
|
|
224
|
+
|
|
225
|
+
| Tool | DocType | Operations |
|
|
226
|
+
|------|---------|-----------|
|
|
227
|
+
| `erpnext_asset_list` | Asset | List + filters (status, category, location) |
|
|
228
|
+
| `erpnext_asset_get` | Asset | Get with depreciation + maintenance |
|
|
229
|
+
| `erpnext_asset_create` | Asset | Create (name, category, company, purchase_date, cost) |
|
|
230
|
+
| `erpnext_asset_movement_list` | Asset Movement | List + filters (purpose, dates) |
|
|
231
|
+
| `erpnext_asset_movement_get` | Asset Movement | Get with assets moved |
|
|
232
|
+
| `erpnext_asset_maintenance_list` | Asset Maintenance | List + filters |
|
|
233
|
+
| `erpnext_asset_maintenance_get` | Asset Maintenance | Get with maintenance tasks |
|
|
234
|
+
| `erpnext_asset_category_list` | Asset Category | List all categories |
|
|
235
|
+
|
|
236
|
+
### Generic Operations (7)
|
|
237
|
+
|
|
238
|
+
These tools work with **any** ERPNext DocType:
|
|
239
|
+
|
|
240
|
+
| Tool | Operation | Notes |
|
|
241
|
+
|------|-----------|-------|
|
|
242
|
+
| `erpnext_doc_create` | Create | Any DocType — essential for master data setup |
|
|
243
|
+
| `erpnext_doc_get` | Get | Any document by DocType + name |
|
|
244
|
+
| `erpnext_doc_list` | List | Any DocType with fields, filters, limit, order_by |
|
|
245
|
+
| `erpnext_doc_update` | Update | Partial patch — pass only fields to change |
|
|
246
|
+
| `erpnext_doc_delete` | Delete | Draft documents only |
|
|
247
|
+
| `erpnext_doc_submit` | Submit | Any submittable document |
|
|
248
|
+
| `erpnext_doc_cancel` | Cancel | Any submitted document |
|
|
249
|
+
|
|
250
|
+
### Analytics (19)
|
|
251
|
+
|
|
252
|
+
Tools that return shaped data for chart, pipeline, KPI, and funnel viewers.
|
|
253
|
+
|
|
254
|
+
| Tool | Viewer | Description |
|
|
255
|
+
|------|--------|-------------|
|
|
256
|
+
| `erpnext_order_pipeline` | order-pipeline-viewer | Sales orders kanban by status |
|
|
257
|
+
| `erpnext_purchase_pipeline` | order-pipeline-viewer | Purchase orders kanban by status |
|
|
258
|
+
| `erpnext_stock_chart` | chart-viewer | Bar chart of stock levels by item/warehouse |
|
|
259
|
+
| `erpnext_sales_chart` | chart-viewer | Revenue by customer, item, or status (bar/donut) |
|
|
260
|
+
| `erpnext_revenue_trend` | chart-viewer | Monthly revenue trend (line/area, per customer) |
|
|
261
|
+
| `erpnext_order_breakdown` | chart-viewer | Orders by customer/status (stacked-bar/pie/donut) |
|
|
262
|
+
| `erpnext_revenue_vs_orders` | chart-viewer | Revenue bars + order count line (dual axis) |
|
|
263
|
+
| `erpnext_stock_treemap` | chart-viewer | Stock value treemap by item or warehouse |
|
|
264
|
+
| `erpnext_product_radar` | chart-viewer | Radar comparing items (stock, value, orders, revenue) |
|
|
265
|
+
| `erpnext_price_vs_qty` | chart-viewer | Scatter: selling price vs quantity ordered |
|
|
266
|
+
| `erpnext_ar_aging` | chart-viewer | AR aging buckets (0-30, 31-60, 61-90, 90+ days) |
|
|
267
|
+
| `erpnext_gross_profit` | chart-viewer | Revenue bars + margin % line by item/customer |
|
|
268
|
+
| `erpnext_profit_loss` | chart-viewer | P&L: income vs expenses per month + net profit |
|
|
269
|
+
| `erpnext_kpi_revenue` | kpi-viewer | Revenue MTD with delta vs previous month + sparkline |
|
|
270
|
+
| `erpnext_kpi_outstanding` | kpi-viewer | Outstanding receivables (count + total) |
|
|
271
|
+
| `erpnext_kpi_orders` | kpi-viewer | Orders this month with delta vs last month |
|
|
272
|
+
| `erpnext_kpi_gross_margin` | kpi-viewer | Gross margin % based on valuation rates |
|
|
273
|
+
| `erpnext_kpi_overdue` | kpi-viewer | Overdue invoices count + value |
|
|
274
|
+
| `erpnext_sales_funnel` | funnel-viewer | Lead → Opportunity → Quotation → Order funnel |
|
|
275
|
+
|
|
276
|
+
## UI Viewers
|
|
277
|
+
|
|
278
|
+
Seven interactive [MCP Apps](https://github.com/anthropics/mcp-apps-sdk) viewers, registered as `ui://mcp-erpnext/{name}`:
|
|
279
|
+
|
|
280
|
+
| Viewer | Description |
|
|
281
|
+
|--------|-------------|
|
|
282
|
+
| `doclist-viewer` | Generic document table with sort, filter, pagination, CSV export |
|
|
283
|
+
| `invoice-viewer` | Single invoice display (header, items, totals, payment status) |
|
|
284
|
+
| `stock-viewer` | Stock balance table with color-coded qty badges |
|
|
285
|
+
| `chart-viewer` | Universal chart renderer (12 chart types via Recharts) |
|
|
286
|
+
| `order-pipeline-viewer` | Sales/Purchase Order kanban by status |
|
|
287
|
+
| `kpi-viewer` | Single metric card with delta, sparkline, trend indicator |
|
|
288
|
+
| `funnel-viewer` | Trapezoid sales funnel with conversion rates between stages |
|
|
289
|
+
|
|
290
|
+
### Building UI viewers
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
cd src/ui
|
|
294
|
+
npm install
|
|
295
|
+
node build-all.mjs
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## npm Package
|
|
299
|
+
|
|
300
|
+
The npm package (`@casys/mcp-erpnext`) is a single self-contained bundle (1.3MB) with zero runtime dependencies. UI viewers are embedded.
|
|
301
|
+
|
|
302
|
+
To rebuild for npm from source:
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
cd lib/erpnext
|
|
306
|
+
deno task ui:build # Build UI viewers
|
|
307
|
+
./scripts/build-node.sh # Generate dist-node/
|
|
308
|
+
cd dist-node && npx esbuild server.ts --bundle --platform=node --target=node20 --format=esm --outfile=bin/mcp-erpnext.mjs --external:'node:*'
|
|
309
|
+
cd bin && npm publish --access public
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Environment Variables
|
|
313
|
+
|
|
314
|
+
| Variable | Required | Description |
|
|
315
|
+
|----------|----------|-------------|
|
|
316
|
+
| `ERPNEXT_URL` | Yes | ERPNext base URL (e.g. `http://localhost:8000`) |
|
|
317
|
+
| `ERPNEXT_API_KEY` | Yes | API Key from User Settings |
|
|
318
|
+
| `ERPNEXT_API_SECRET` | Yes | API Secret from User Settings |
|
|
319
|
+
|
|
320
|
+
## Architecture
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
mod.ts # Public API
|
|
324
|
+
server.ts # MCP server (stdio + HTTP)
|
|
325
|
+
deno.json # Package config
|
|
326
|
+
scripts/
|
|
327
|
+
build-node.sh # Node.js distribution builder
|
|
328
|
+
src/
|
|
329
|
+
api/
|
|
330
|
+
frappe-client.ts # Frappe REST HTTP client
|
|
331
|
+
types.ts # Type definitions
|
|
332
|
+
tools/
|
|
333
|
+
sales.ts # 17 sales tools
|
|
334
|
+
inventory.ts # 9 inventory tools
|
|
335
|
+
purchasing.ts # 11 purchasing tools
|
|
336
|
+
accounting.ts # 6 accounting tools
|
|
337
|
+
hr.ts # 12 HR tools
|
|
338
|
+
project.ts # 9 project tools
|
|
339
|
+
delivery.ts # 5 delivery tools
|
|
340
|
+
manufacturing.ts # 7 manufacturing tools
|
|
341
|
+
crm.ts # 8 CRM tools
|
|
342
|
+
assets.ts # 8 asset tools
|
|
343
|
+
operations.ts # 7 generic CRUD tools
|
|
344
|
+
setup.ts # 2 company/setup tools
|
|
345
|
+
analytics.ts # 19 analytics tools (charts, KPIs, pipelines, funnel)
|
|
346
|
+
mod.ts # Registry
|
|
347
|
+
types.ts # Tool interface
|
|
348
|
+
client.ts # ErpNextToolsClient
|
|
349
|
+
runtime.ts # Deno runtime shim
|
|
350
|
+
runtime.node.ts # Node.js runtime shim
|
|
351
|
+
ui/
|
|
352
|
+
doclist-viewer/ # Generic document list
|
|
353
|
+
invoice-viewer/ # Invoice display
|
|
354
|
+
stock-viewer/ # Stock balance display
|
|
355
|
+
chart-viewer/ # Universal chart renderer (Recharts)
|
|
356
|
+
order-pipeline-viewer/ # Kanban pipeline
|
|
357
|
+
kpi-viewer/ # Single metric card
|
|
358
|
+
funnel-viewer/ # Sales funnel
|
|
359
|
+
shared/ # Shared theme + branding
|
|
360
|
+
tests/
|
|
361
|
+
docs/
|
|
362
|
+
coverage.md # Full coverage matrix
|
|
363
|
+
ROADMAP.md # Viewer & analytics roadmap
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Development
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
# Run tests
|
|
370
|
+
deno test --allow-all tests/
|
|
371
|
+
|
|
372
|
+
# Type check
|
|
373
|
+
deno check mod.ts server.ts
|
|
374
|
+
|
|
375
|
+
# Start HTTP server (dev)
|
|
376
|
+
deno task serve
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## License
|
|
380
|
+
|
|
381
|
+
MIT
|
package/package.json
CHANGED