@newpeak/barista-cli 0.2.277 → 0.2.279

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 CHANGED
@@ -1,356 +1,401 @@
1
- # ☕ Barista CLI
2
-
3
- > **Let AI assistants control production management systems** — Bridge AI tools (Claude Code, OpenCode, OpenClaw) to enterprise SaaS
4
-
5
- [![AI-Native](https://img.shields.io/badge/AI--Native-CLI-blue?style=flat-square)](https://gitlab.newpeaksh.com/coffee/coffee-barista-cli)
6
- [![npm version](https://img.shields.io/npm/v/@newpeak/barista-cli.svg?style=flat-square)](https://www.npmjs.com/package/@newpeak/barista-cli)
7
- [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](LICENSE)
8
- [![Weekly Downloads](https://img.shields.io/npm/dw/@newpeak/barista-cli?style=flat-square)](https://www.npmjs.com/package/@newpeak/barista-cli)
9
- [![Node.js](https://img.shields.io/badge/Node.js-18%2B-brightgreen?style=flat-square)](https://nodejs.org/)
10
-
11
- ---
12
-
13
- ## ⚡ Quick Start
14
-
15
- ### 1. Install
16
-
17
- ```bash
18
- npm install -g @newpeak/barista-cli
19
- ```
20
-
21
- ### 2. Authenticate
22
-
23
- ```bash
24
- # AI needs credentials to operate on behalf of user
25
- barista liberica auth login prod-cn your-tenant your-username your-password
26
-
27
- # Interactive login (prompts for missing info)
28
- barista liberica auth login
29
- ```
30
-
31
- ### 3. AI Integration
32
-
33
- ```typescript
34
- // In Claude Code / OpenCode / OpenClaw:
35
- const orders = await $`barista liberica sales-orders list --env prod-cn --tenant your-tenant --json`
36
- const { success, data } = JSON.parse(orders.stdout)
37
-
38
- // AI parses and acts on the data
39
- if (data.items.length > 0) {
40
- console.log(`Found ${data.pagination.total} orders`)
41
- }
42
- ```
43
-
44
- **[View AI Integration Examples →](#ai-integration)**
45
-
46
- ---
47
-
48
- ## 🤖 AI Integration
49
-
50
- Barista CLI is designed for AI coding assistants. Every output is structured, every error is actionable.
51
-
52
- ### Supported AI Tools
53
-
54
- | AI Tool | Integration | Install Skill |
55
- |---------|------------|--------------|
56
- | **Claude Code** | `$` backticks + `--json` | `barista skills install --ai claude` |
57
- | **Cursor** | Terminal + `--json` | `barista skills install --ai cursor` |
58
- | **Trae** | SOLO mode + skill | `barista skills install --ai trae` |
59
- | **OpenCode** | Shell + `--json` | `barista skills install --ai opencode` |
60
- | **Windsurf** | Terminal + `--json` | `barista skills install --ai windsurf` |
61
- | **Copilot** | Terminal + `--json` | `barista skills install --ai copilot` |
62
- | **Roo Code** | Terminal + `--json` | `barista skills install --ai roocode` |
63
- | **Continue** | Terminal + `--json` | `barista skills install --ai continue` |
64
- | **Gemini CLI** | Terminal + `--json` | `barista skills install --ai gemini` |
65
- | _Codex, Kiro, Qoder, Droid_ | Terminal + `--json` | `barista skills install --ai <name>` |
66
-
67
- ### Integration Pattern
68
-
69
- ```typescript
70
- // 1. Execute command with JSON output
71
- const result = await $`barista liberica sales-orders list \
72
- --env prod-cn \
73
- --tenant your-tenant \
74
- --json \
75
- --page 1 \
76
- --size 50`
77
-
78
- // 2. Parse structured response
79
- const { success, data, meta } = JSON.parse(result.stdout)
80
-
81
- // 3. Work with data
82
- const pendingOrders = data.items
83
-
84
- // 4. Execute operations safely
85
- for (const order of pendingOrders) {
86
- // Always dry-run first (AI safety)
87
- const preview = await $`barista liberica sales-orders delete ${order.id} --dry-run`
88
-
89
- // Parse preview, verify, then execute with --force
90
- // ...
91
- }
92
- ```
93
-
94
- ### Response Envelope
95
-
96
- All JSON responses follow this structure:
97
-
98
- ```json
99
- {
100
- "success": true,
101
- "data": {
102
- "items": [...],
103
- "pagination": { "page": 1, "size": 20, "total": 150 }
104
- },
105
- "meta": {
106
- "requestId": "req-abc123",
107
- "timestamp": "2024-01-15T10:30:00Z",
108
- "environment": "prod-cn",
109
- "tenant": "your-tenant"
110
- }
111
- }
112
- ```
113
-
114
- **Error format:**
115
-
116
- ```json
117
- {
118
- "success": false,
119
- "error": {
120
- "code": "A150001",
121
- "message": "Order not found"
122
- },
123
- "meta": {
124
- "requestId": "req-xyz789",
125
- "timestamp": "2024-01-15T10:30:00Z"
126
- }
127
- }
128
- ```
129
-
130
- ### AI Skills for Your Assistant
131
-
132
- Install the barista-cli Skill so your AI assistant knows all available commands, system quirks, and safety rules:
133
-
134
- ```bash
135
- # Interactive install (pick your platform)
136
- barista skills install
137
-
138
- # Direct install for specific AI tool
139
- barista skills install --ai claude # → .claude/skills/barista-cli/SKILL.md
140
- barista skills install --ai trae # → .trae/skills/barista-cli/SKILL.md
141
- barista skills install --ai opencode # → .opencode/skills/barista-cli/SKILL.md
142
- barista skills install --ai cursor # → .cursor/rules/barista-cli.mdc
143
-
144
- # Global install (all projects)
145
- barista skills install --ai claude --global
146
-
147
- # List all supported platforms
148
- barista skills install --list
149
-
150
- # Search commands by intent (without the AI skill)
151
- barista skills query "采购订单" # fuzzy search
152
- barista skills query "入库单" --domain liberica # filter by service
153
- ```
154
-
155
- **The Skill covers**: Liberica 76-module production management + Arabica subscription platform, with critical traps (email login, hidden --tenant, epoch timestamps), safety rules (dry-run→force), and auto-generated command data.
156
-
157
- ---
158
-
159
- ## 🚀 Features
160
-
161
- ### AI-First Design
162
-
163
- | Feature | Description |
164
- |---------|-------------|
165
- | 🤖 **JSON-First Output** | All commands support `--json` for AI parsing |
166
- | 📦 **Structured Responses** | Consistent `{success, data, meta}` envelope |
167
- | 🔄 **Idempotent Operations** | Safe for AI retry loops |
168
- | 🛡️ **Dry-Run by Default** | Destructive operations preview before execution |
169
- | 🔐 **Secure Storage** | Credentials in system keychain, not env vars |
170
-
171
- ### Enterprise Connectivity
172
-
173
- | Service | For | Capabilities |
174
- |---------|-----|-------------|
175
- | ☕ **Liberica** | Tenant employees | Production management: supply chain, inventory, BOM/routing, work orders, quality, finance, HR (70+ modules) |
176
- | 🛒 **Arabica** | Members (membership) | Subscribe to Liberica: plan browsing, order placement, invoice download, enterprise registration |
177
-
178
- > **Arabica → Liberica flow**: Register as member → register enterprise → subscribe to plan → get Liberica access → log in as employee
179
-
180
- ### Operational Safety
181
-
182
- - 📊 **Audit Trail** — Every operation logged with request ID
183
- - ⚠️ **Confirmation Guards** — `--dry-run` / `--force` for write operations
184
- - 🏢 **Multi-Tenant Isolation** — Credentials isolated per tenant
185
-
186
- ---
187
-
188
- ## 🔧 Command Reference
189
-
190
- ### Core Pattern
191
-
192
- ```
193
- barista <service> <resource> <action> [options]
194
- ```
195
-
196
- ### Global Options
197
-
198
- | Option | Description | Default |
199
- |--------|-------------|---------|
200
- | `--env` | Environment (dev\|test\|prod-cn\|prod-jp) | `dev` |
201
- | `--tenant` | Tenant name | - |
202
- | `--json` | JSON output | `false` |
203
- | `--dry-run` | Preview mode (recommended for AI) | `false` |
204
- | `--force` | Skip confirmation | `false` |
205
- | `--page` | Page number | `1` |
206
- | `--size` | Page size (max items) | `20` |
207
-
208
- ### Quick Reference
209
-
210
- | Command | Description |
211
- |---------|-------------|
212
- | `barista context show` | Show current env/tenant context |
213
- | `barista context use-env <env>` | Switch environment |
214
- | `barista context use-tenant <tenant>` | Switch tenant |
215
- | `barista liberica auth login <env> <tenant> <user> <pass>` | Liberica login (tenant employee) |
216
- | `barista arabica auth login <env> <account> <pass>` | Arabica login (member) |
217
- | `barista liberica sales-orders list --json` | List sales orders |
218
- | `barista liberica purchase-orders list --json` | List purchase orders |
219
- | `barista liberica transfer-in-forms create --dry-run ...` | Preview stock-in |
220
- | `barista liberica materials list --json` | List materials |
221
- | `barista arabica plans list --json` | Browse subscription plans |
222
- | `barista arabica subscription current --json` | Check subscription |
223
- | `barista skills install --ai claude` | Install AI skill |
224
- | `barista skills query "采购订单"` | Search commands by intent |
225
-
226
- **[→ Full Command Reference](./docs/commands/REFERENCE.md)**
227
-
228
- ---
229
-
230
- ## 🛡️ AI Safety Guidelines
231
-
232
- ### 1. Always Dry-Run First
233
-
234
- ```typescript
235
- // ❌ Wrong - executing blindly
236
- await $`barista liberica sales-orders delete 12345`
237
-
238
- // ✅ Correct - preview first
239
- const preview = await $`barista liberica sales-orders delete 12345 --dry-run`
240
- // Parse preview, verify correctness, then:
241
- await $`barista liberica sales-orders delete 12345 --force`
242
- ```
243
-
244
- ### 2. Check Success Before Proceeding
245
-
246
- ```typescript
247
- const result = JSON.parse(stdout)
248
- if (!result.success) {
249
- // Handle error, don't continue
250
- throw new Error(result.error?.message || result.meta?.message)
251
- }
252
- ```
253
-
254
- ### 3. Use Request IDs for Debugging
255
-
256
- ```typescript
257
- const { meta } = JSON.parse(stdout)
258
- console.log(`Request ID: ${meta.requestId}`)
259
- ```
260
-
261
- ### 4. Respect Rate Limits
262
-
263
- - Add delays between bulk operations
264
- - Use `--size 100` for bulk fetches
265
- - Cache responses when appropriate
266
-
267
- ---
268
-
269
- ## ⚙️ Configuration
270
-
271
- ### File Location
272
-
273
- `~/.barista/config.yaml`
274
-
275
- ### Quick Config
276
-
277
- ```yaml
278
- defaults:
279
- env: prod-cn
280
- tenant: your-tenant
281
- service: liberica
282
-
283
- environments:
284
- prod-cn:
285
- liberica:
286
- baseUrl: "https://{tenant}.newpeaksh.com"
287
- timeout: 60000
288
- arabica:
289
- baseUrl: "https://www.newpeaksh.com"
290
- timeout: 60000
291
- ```
292
-
293
- ### Authentication
294
-
295
- ```bash
296
- # Liberica (tenant employee login)
297
- barista liberica auth login <env> <tenant> <username> <password>
298
- barista liberica auth login # interactive prompt
299
-
300
- # Arabica (member login — no tenant needed)
301
- barista arabica auth login <env> <account> <password>
302
- barista arabica auth login # interactive prompt
303
- barista arabica auth register # register new member account
304
-
305
- # Check / logout
306
- barista auth status
307
- barista auth logout --service liberica --env prod-cn
308
- ```
309
-
310
- ---
311
-
312
- ## ❓ Troubleshooting
313
-
314
- ### Auth Failures
315
-
316
- ```bash
317
- barista auth status # check token status by env
318
- barista liberica auth login dev tenant user pass # re-authenticate
319
- barista context show # verify env + tenant
320
- ```
321
-
322
- **Common login traps:**
323
- - Email usernames must use positional args (`barista liberica auth login dev sh my@email.com pass`), not `--username`
324
- - Liberica = tenant username + password; Arabica = account + password (no tenant)
325
-
326
- ### API Errors
327
-
328
- ```bash
329
- barista liberica sales-orders list --json # always --json for error codes
330
- ```
331
-
332
- | Error | Meaning | Fix |
333
- |-------|---------|-----|
334
- | `B0301` | Token expired | Re-login |
335
- | `A958001` | Wrong tenant (teams) | `barista context use-tenant <correct>` then retry |
336
- | `B0001` | Date format error | Dates must be epoch ms (use `Date.now()`), not `"YYYY-MM-DD"` |
337
- | `A0900006` | Email username via `--username` | Use positional args instead |
338
- | `A1506` | teams issue close needs assignee | Use `update --status CLOSED --assign-to <id>` |
339
-
340
- ---
341
-
342
- ## 📚 Related Projects
343
-
344
- | Project | Description |
345
- |---------|-------------|
346
- | ☕ Liberica Backend | Production management SaaS backend |
347
- | 🖥️ Liberica Frontend | Production management web UI |
348
- | 📱 Liberica Mobile | Production management mobile app |
349
- | 🛒 Arabica Backend | Online subscription SaaS backend |
350
- | 🌐 Arabica Frontend | Online subscription web UI |
351
-
352
- ---
353
-
354
- ## 📄 License
355
-
356
- [MIT](LICENSE) © Newpeak Technology
1
+ # ☕ Barista CLI
2
+
3
+ > **Let AI assistants control production management systems** — Bridge AI tools (Claude Code, OpenCode, OpenClaw) to enterprise SaaS
4
+
5
+ [![AI-Native](https://img.shields.io/badge/AI--Native-CLI-blue?style=flat-square)](https://gitlab.newpeaksh.com/coffee/coffee-barista-cli)
6
+ [![npm version](https://img.shields.io/npm/v/@newpeak/barista-cli.svg?style=flat-square)](https://www.npmjs.com/package/@newpeak/barista-cli)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](LICENSE)
8
+ [![Weekly Downloads](https://img.shields.io/npm/dw/@newpeak/barista-cli?style=flat-square)](https://www.npmjs.com/package/@newpeak/barista-cli)
9
+ [![Node.js](https://img.shields.io/badge/Node.js-18%2B-brightgreen?style=flat-square)](https://nodejs.org/)
10
+
11
+ ---
12
+
13
+ ## ⚡ Quick Start
14
+
15
+ ### 1. Install
16
+
17
+ ```bash
18
+ npm install -g @newpeak/barista-cli
19
+ ```
20
+
21
+ ### 2. Authenticate
22
+
23
+ ```bash
24
+ # AI needs credentials to operate on behalf of user
25
+ barista liberica auth login prod-cn your-tenant your-username your-password
26
+
27
+ # Interactive login (prompts for missing info)
28
+ barista liberica auth login
29
+ ```
30
+
31
+ ### 3. AI Integration
32
+
33
+ ```typescript
34
+ // In Claude Code / OpenCode / OpenClaw:
35
+ const orders = await $`barista liberica sales-orders list --env prod-cn --tenant your-tenant --json`
36
+ const { success, data } = JSON.parse(orders.stdout)
37
+
38
+ // AI parses and acts on the data
39
+ if (data.items.length > 0) {
40
+ console.log(`Found ${data.pagination.total} orders`)
41
+ }
42
+ ```
43
+
44
+ **[View AI Integration Examples →](#ai-integration)**
45
+
46
+ ---
47
+
48
+ ## 🤖 AI Integration
49
+
50
+ Barista CLI is designed for AI coding assistants. Every output is structured, every error is actionable.
51
+
52
+ ### Supported AI Tools
53
+
54
+ | AI Tool | Integration | Install Skill |
55
+ |---------|------------|--------------|
56
+ | **Claude Code** | `$` backticks + `--json` | `barista skills install --ai claude` |
57
+ | **Cursor** | Terminal + `--json` | `barista skills install --ai cursor` |
58
+ | **Trae** | SOLO mode + skill | `barista skills install --ai trae` |
59
+ | **OpenCode** | Shell + `--json` | `barista skills install --ai opencode` |
60
+ | **Windsurf** | Terminal + `--json` | `barista skills install --ai windsurf` |
61
+ | **Copilot** | Terminal + `--json` | `barista skills install --ai copilot` |
62
+ | **Roo Code** | Terminal + `--json` | `barista skills install --ai roocode` |
63
+ | **Continue** | Terminal + `--json` | `barista skills install --ai continue` |
64
+ | **Gemini CLI** | Terminal + `--json` | `barista skills install --ai gemini` |
65
+ | _Codex, Kiro, Qoder, Droid_ | Terminal + `--json` | `barista skills install --ai <name>` |
66
+
67
+ ### Integration Pattern
68
+
69
+ ```typescript
70
+ // 1. Execute command with JSON output
71
+ const result = await $`barista liberica sales-orders list \
72
+ --env prod-cn \
73
+ --tenant your-tenant \
74
+ --json \
75
+ --page 1 \
76
+ --size 50`
77
+
78
+ // 2. Parse structured response
79
+ const { success, data, meta } = JSON.parse(result.stdout)
80
+
81
+ // 3. Work with data
82
+ const pendingOrders = data.items
83
+
84
+ // 4. Execute operations safely
85
+ for (const order of pendingOrders) {
86
+ // Always dry-run first (AI safety)
87
+ const preview = await $`barista liberica sales-orders delete ${order.id} --dry-run`
88
+
89
+ // Parse preview, verify, then execute with --force
90
+ // ...
91
+ }
92
+ ```
93
+
94
+ ### Response Envelope
95
+
96
+ All JSON responses follow this structure:
97
+
98
+ ```json
99
+ {
100
+ "success": true,
101
+ "data": {
102
+ "items": [...],
103
+ "pagination": { "page": 1, "size": 20, "total": 150 }
104
+ },
105
+ "meta": {
106
+ "requestId": "req-abc123",
107
+ "timestamp": "2024-01-15T10:30:00Z",
108
+ "environment": "prod-cn",
109
+ "tenant": "your-tenant"
110
+ }
111
+ }
112
+ ```
113
+
114
+ **Error format:**
115
+
116
+ ```json
117
+ {
118
+ "success": false,
119
+ "error": {
120
+ "code": "A150001",
121
+ "message": "Order not found"
122
+ },
123
+ "meta": {
124
+ "requestId": "req-xyz789",
125
+ "timestamp": "2024-01-15T10:30:00Z"
126
+ }
127
+ }
128
+ ```
129
+
130
+ ### AI Skills for Your Assistant
131
+
132
+ Install the barista-cli Skill so your AI assistant knows all available commands, system quirks, and safety rules:
133
+
134
+ ```bash
135
+ # Interactive install (pick your platform)
136
+ barista skills install
137
+
138
+ # Direct install for specific AI tool
139
+ barista skills install --ai claude # → .claude/skills/barista-cli/SKILL.md
140
+ barista skills install --ai trae # → .trae/skills/barista-cli/SKILL.md
141
+ barista skills install --ai opencode # → .opencode/skills/barista-cli/SKILL.md
142
+ barista skills install --ai cursor # → .cursor/rules/barista-cli.mdc
143
+
144
+ # Global install (all projects)
145
+ barista skills install --ai claude --global
146
+
147
+ # List all supported platforms
148
+ barista skills install --list
149
+
150
+ # Search commands by intent (without the AI skill)
151
+ barista skills query "采购订单" # fuzzy search
152
+ barista skills query "入库单" --domain liberica # filter by service
153
+ ```
154
+
155
+ **The Skill covers**: Liberica 76-module production management + Arabica subscription platform, with critical traps (email login, hidden --tenant, epoch timestamps), safety rules (dry-run→force), and auto-generated command data.
156
+
157
+ ---
158
+
159
+ ## 🚀 Features
160
+
161
+ ### AI-First Design
162
+
163
+ | Feature | Description |
164
+ |---------|-------------|
165
+ | 🤖 **JSON-First Output** | All commands support `--json` for AI parsing |
166
+ | 📦 **Structured Responses** | Consistent `{success, data, meta}` envelope |
167
+ | 🔄 **Idempotent Operations** | Safe for AI retry loops |
168
+ | 🛡️ **Dry-Run by Default** | Destructive operations preview before execution |
169
+ | 🔐 **Secure Storage** | Credentials in system keychain, not env vars |
170
+
171
+ ### Enterprise Connectivity
172
+
173
+ | Service | For | Capabilities |
174
+ |---------|-----|-------------|
175
+ | ☕ **Liberica** | Tenant employees | Production management: supply chain, inventory, BOM/routing, work orders, quality, finance, HR (70+ modules) |
176
+ | 🛒 **Arabica** | Members (membership) | Subscribe to Liberica: plan browsing, order placement, invoice download, enterprise registration |
177
+
178
+ > **Arabica → Liberica flow**: Register as member → register enterprise → subscribe to plan → get Liberica access → log in as employee
179
+
180
+ ### Operational Safety
181
+
182
+ - 📊 **Audit Trail** — Every operation logged with request ID
183
+ - ⚠️ **Confirmation Guards** — `--dry-run` / `--force` for write operations
184
+ - 🏢 **Multi-Tenant Isolation** — Credentials isolated per tenant
185
+
186
+ ---
187
+
188
+ ## 🔧 Command Reference
189
+
190
+ ### Core Pattern
191
+
192
+ ```
193
+ barista <service> <resource> <action> [options]
194
+ ```
195
+
196
+ ### Global Options
197
+
198
+ | Option | Description | Default |
199
+ |--------|-------------|---------|
200
+ | `--env` | Environment (dev\|test\|prod-cn\|prod-jp) | `dev` |
201
+ | `--tenant` | Tenant name | - |
202
+ | `--json` | JSON output | `false` |
203
+ | `--dry-run` | Preview mode (recommended for AI) | `false` |
204
+ | `--force` | Skip confirmation | `false` |
205
+ | `--page` | Page number | `1` |
206
+ | `--size` | Page size (max items) | `20` |
207
+
208
+ ### Quick Reference
209
+
210
+ | Command | Description |
211
+ |---------|-------------|
212
+ | `barista context show` | Show current env/tenant context |
213
+ | `barista context use-env <env>` | Switch environment |
214
+ | `barista context use-tenant <tenant>` | Switch tenant |
215
+ | `barista liberica auth login <env> <tenant> <user> <pass>` | Liberica login (tenant employee) |
216
+ | `barista arabica auth login <env> <account> <pass>` | Arabica login (member) |
217
+ | `barista liberica sales-orders list --json` | List sales orders |
218
+ | `barista liberica purchase-orders list --json` | List purchase orders |
219
+ | `barista liberica transfer-in-forms create --dry-run ...` | Preview stock-in |
220
+ | `barista liberica materials list --json` | List materials |
221
+ | `barista arabica plans list --json` | Browse subscription plans |
222
+ | `barista arabica subscription current --json` | Check subscription |
223
+ | `barista skills install --ai claude` | Install AI skill |
224
+ | `barista skills query "采购订单"` | Search commands by intent |
225
+
226
+ **[→ Full Command Reference](./docs/commands/REFERENCE.md)**
227
+
228
+ ---
229
+
230
+ ## 🛡️ AI Safety Guidelines
231
+
232
+ ### 1. Always Dry-Run First
233
+
234
+ ```typescript
235
+ // ❌ Wrong - executing blindly
236
+ await $`barista liberica sales-orders delete 12345`
237
+
238
+ // ✅ Correct - preview first
239
+ const preview = await $`barista liberica sales-orders delete 12345 --dry-run`
240
+ // Parse preview, verify correctness, then:
241
+ await $`barista liberica sales-orders delete 12345 --force`
242
+ ```
243
+
244
+ ### 2. Check Success Before Proceeding
245
+
246
+ ```typescript
247
+ const result = JSON.parse(stdout)
248
+ if (!result.success) {
249
+ // Handle error, don't continue
250
+ throw new Error(result.error?.message || result.meta?.message)
251
+ }
252
+ ```
253
+
254
+ ### 3. Use Request IDs for Debugging
255
+
256
+ ```typescript
257
+ const { meta } = JSON.parse(stdout)
258
+ console.log(`Request ID: ${meta.requestId}`)
259
+ ```
260
+
261
+ ### 4. Respect Rate Limits
262
+
263
+ - Add delays between bulk operations
264
+ - Use `--size 100` for bulk fetches
265
+ - Cache responses when appropriate
266
+
267
+ ---
268
+
269
+ ## ⚙️ Configuration
270
+
271
+ ### File Location
272
+
273
+ `~/.barista/config.yaml`
274
+
275
+ ### Quick Config
276
+
277
+ ```yaml
278
+ defaults:
279
+ env: prod-cn
280
+ tenant: your-tenant
281
+ service: liberica
282
+
283
+ environments:
284
+ prod-cn:
285
+ liberica:
286
+ baseUrl: "https://{tenant}.newpeaksh.com"
287
+ timeout: 60000
288
+ arabica:
289
+ baseUrl: "https://www.newpeaksh.com"
290
+ timeout: 60000
291
+ ```
292
+
293
+ ### Authentication
294
+
295
+ ```bash
296
+ # Liberica (tenant employee login)
297
+ barista liberica auth login <env> <tenant> <username> <password>
298
+ barista liberica auth login # interactive prompt
299
+
300
+ # Arabica (member login — no tenant needed)
301
+ barista arabica auth login <env> <account> <password>
302
+ barista arabica auth login # interactive prompt
303
+ barista arabica auth register # register new member account
304
+
305
+ # Check / logout
306
+ barista auth status
307
+ barista auth logout --service liberica --env prod-cn
308
+ ```
309
+
310
+ **Common login traps:**
311
+ - Email usernames must use positional args (`barista liberica auth login dev sh my@email.com pass`), not `--username`
312
+ - Liberica = tenant username + password; Arabica = account + password (no tenant)
313
+
314
+ ### Multi-Tenant Library Usage
315
+
316
+ For library consumers (bots, scripts) that need to call **multiple tenants in the same process**, two patterns are supported.
317
+
318
+ #### Pattern A — serial via `configManager.withContext`
319
+
320
+ ```typescript
321
+ import { configManager } from '@newpeak/barista-cli/core/config/manager';
322
+ import { apiClient } from '@newpeak/barista-cli/core/api/client';
323
+
324
+ // 串行调用不同租户(每段结束后自动还原默认 context)
325
+ await configManager.withContext(
326
+ { tenant: 'tenant-a', environment: 'env-x' },
327
+ () => apiClient.listTeamTasks({ status: 'PROCESSING' })
328
+ );
329
+
330
+ await configManager.withContext(
331
+ { tenant: 'tenant-b', environment: 'env-x' },
332
+ () => apiClient.listTeamTasks({ status: 'PROCESSING' })
333
+ );
334
+ ```
335
+
336
+ `Partial<Context>` means you can override only the fields that differ (e.g. just `tenant`); other fields fall back to your current config defaults. Exception-safe (`try/finally`) so failed inner calls do not leak overrides.
337
+
338
+ #### Pattern B — true parallel via `Promise.all`
339
+
340
+ Every `apiClient.METHOD(env, tenant, ...args)` already takes `(environment, tenant, …)` positionally, with `createAPIClient()` creating a fresh axios instance per call. That means `Promise.all` against N tenants **just works** — each concurrent call gets its own baseURL + its own token:
341
+
342
+ ```typescript
343
+ import { apiClient } from '@newpeak/barista-cli/core/api/client';
344
+
345
+ // 真并行:每个请求走自己的 baseURL + Authorization,互不干扰
346
+ const [tasksA, tasksB, tasksC] = await Promise.all([
347
+ apiClient.listTeamTasks('dev', 'tenant-a', { status: 'PROCESSING' }),
348
+ apiClient.listTeamTasks('dev', 'tenant-b', { status: 'PROCESSING' }),
349
+ apiClient.listTeamTasks('prod-cn', 'tenant-c', { status: 'PROCESSING' }),
350
+ ]);
351
+ ```
352
+
353
+ Combine both patterns when needed — `withContext` for command-style code that reads `configManager.getCurrentContext()`, direct positional args for parallel-safe `Promise.all`.
354
+
355
+ > Both patterns rely on `tokenManager.getToken({service, environment, tenant})` being keyed by all three fields — which it is. Tokens for different tenants are cached and fetched independently.
356
+
357
+ > ⚠️ tenant / environment must be provided by the caller at runtime. Do not hardcode specific tenant names or environment names in code, examples, or tests (only the input-validation whitelist in `ConfigManager.setEnvironment` may list legal env values).
358
+
359
+ ---
360
+
361
+ ## ❓ Troubleshooting
362
+
363
+ ### Auth Failures
364
+
365
+ ```bash
366
+ barista auth status # check token status by env
367
+ barista liberica auth login dev tenant user pass # re-authenticate
368
+ barista context show # verify env + tenant
369
+ ```
370
+
371
+ ### API Errors
372
+
373
+ ```bash
374
+ barista liberica sales-orders list --json # always --json for error codes
375
+ ```
376
+
377
+ | Error | Meaning | Fix |
378
+ |-------|---------|-----|
379
+ | `B0301` | Token expired | Re-login |
380
+ | `A958001` | Wrong tenant (teams) | `barista context use-tenant <correct>` then retry |
381
+ | `B0001` | Date format error | Dates must be epoch ms (use `Date.now()`), not `"YYYY-MM-DD"` |
382
+ | `A0900006` | Email username via `--username` | Use positional args instead |
383
+ | `A1506` | teams issue close needs assignee | Use `update --status CLOSED --assign-to <id>` |
384
+
385
+ ---
386
+
387
+ ## 📚 Related Projects
388
+
389
+ | Project | Description |
390
+ |---------|-------------|
391
+ | ☕ Liberica Backend | Production management SaaS backend |
392
+ | 🖥️ Liberica Frontend | Production management web UI |
393
+ | 📱 Liberica Mobile | Production management mobile app |
394
+ | 🛒 Arabica Backend | Online subscription SaaS backend |
395
+ | 🌐 Arabica Frontend | Online subscription web UI |
396
+
397
+ ---
398
+
399
+ ## 📄 License
400
+
401
+ [MIT](LICENSE) © Newpeak Technology
@@ -2,11 +2,39 @@ import { Config, Context, Environment, Service } from '../../types/index.js';
2
2
  declare class ConfigManager {
3
3
  private config;
4
4
  private configPath;
5
+ /**
6
+ * 一次性 context override 栈,供 `withContext()` 在「同进程串行多租户」场景下使用。
7
+ * ⚠️ tenant / environment 必须由调用方在运行时提供,代码/示例/测试禁止出现具体租户名/环境名字面量。
8
+ */
9
+ private overrideStack;
5
10
  constructor();
6
11
  load(): Promise<void>;
7
12
  save(): Promise<void>;
8
13
  getConfig(): Config;
9
14
  getCurrentContext(): Context;
15
+ /**
16
+ * 推入一次性 Context override 到栈顶,影响后续 `getCurrentContext()` 与依赖它的调用
17
+ * (apiClient / tokenManager / 任意读 ctx 的代码)。
18
+ *
19
+ * ⚠️ 调用方必须 `popOverride()` 复原(或使用 `withContext()` 自动管理)。栈深度任意,先进后出。
20
+ */
21
+ pushOverride(ctx: Partial<Context>): void;
22
+ /**
23
+ * 弹出栈顶 override。无 override 时为 no-op;栈深度永不变负。
24
+ */
25
+ popOverride(): void;
26
+ /**
27
+ * 在 override 上下文里执行 `fn`;异常路径保证弹栈(try/finally)。
28
+ *
29
+ * 用法:库消费者同进程串行调多个 tenant:
30
+ * const ctxA = { tenant: '...', environment: '...' };
31
+ * await configManager.withContext(ctxA, () => apiClient.listX(params));
32
+ */
33
+ withContext<T>(ctx: Partial<Context>, fn: () => Promise<T>): Promise<T>;
34
+ /**
35
+ * 当前 override 栈深度(测试用)。库消费者不应依赖。
36
+ */
37
+ getOverrideStackDepth(): number;
10
38
  setEnvironment(env: Environment): Promise<void>;
11
39
  setTenant(tenant: string): Promise<void>;
12
40
  setService(service: Service): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0D7E,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;;IAQrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,SAAS,IAAI,MAAM;IAOnB,iBAAiB,IAAI,OAAO;IAWtB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;CAcvF;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0D7E,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B;;;OAGG;IACH,OAAO,CAAC,aAAa,CAA0B;;IAQzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,SAAS,IAAI,MAAM;IAOnB,iBAAiB,IAAI,OAAO;IAmB5B;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAOzC;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;;;;;OAMG;IACG,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAS7E;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAIzB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;CAcvF;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -60,6 +60,11 @@ const DEFAULT_CONFIG = {
60
60
  class ConfigManager {
61
61
  config = null;
62
62
  configPath;
63
+ /**
64
+ * 一次性 context override 栈,供 `withContext()` 在「同进程串行多租户」场景下使用。
65
+ * ⚠️ tenant / environment 必须由调用方在运行时提供,代码/示例/测试禁止出现具体租户名/环境名字面量。
66
+ */
67
+ overrideStack = [];
63
68
  constructor() {
64
69
  const homeDir = os.homedir();
65
70
  const baristaDir = path.join(homeDir, '.barista');
@@ -105,12 +110,60 @@ class ConfigManager {
105
110
  if (!this.config) {
106
111
  throw new Error('Config not loaded');
107
112
  }
113
+ const top = this.overrideStack[this.overrideStack.length - 1];
114
+ if (top) {
115
+ return {
116
+ environment: top.environment ?? this.config.defaults.env,
117
+ service: top.service ?? this.config.defaults.service,
118
+ tenant: top.tenant ?? this.config.defaults.tenant,
119
+ };
120
+ }
108
121
  return {
109
122
  environment: this.config.defaults.env,
110
123
  service: this.config.defaults.service,
111
124
  tenant: this.config.defaults.tenant,
112
125
  };
113
126
  }
127
+ /**
128
+ * 推入一次性 Context override 到栈顶,影响后续 `getCurrentContext()` 与依赖它的调用
129
+ * (apiClient / tokenManager / 任意读 ctx 的代码)。
130
+ *
131
+ * ⚠️ 调用方必须 `popOverride()` 复原(或使用 `withContext()` 自动管理)。栈深度任意,先进后出。
132
+ */
133
+ pushOverride(ctx) {
134
+ if (!this.config) {
135
+ throw new Error('Config not loaded');
136
+ }
137
+ this.overrideStack.push(ctx);
138
+ }
139
+ /**
140
+ * 弹出栈顶 override。无 override 时为 no-op;栈深度永不变负。
141
+ */
142
+ popOverride() {
143
+ this.overrideStack.pop();
144
+ }
145
+ /**
146
+ * 在 override 上下文里执行 `fn`;异常路径保证弹栈(try/finally)。
147
+ *
148
+ * 用法:库消费者同进程串行调多个 tenant:
149
+ * const ctxA = { tenant: '...', environment: '...' };
150
+ * await configManager.withContext(ctxA, () => apiClient.listX(params));
151
+ */
152
+ async withContext(ctx, fn) {
153
+ this.pushOverride(ctx);
154
+ try {
155
+ return await fn();
156
+ }
157
+ finally {
158
+ this.popOverride();
159
+ }
160
+ }
161
+ /**
162
+ * 当前 override 栈深度(测试用)。库消费者不应依赖。
163
+ */
164
+ getOverrideStackDepth() {
165
+ return this.overrideStack.length;
166
+ }
114
167
  async setEnvironment(env) {
115
168
  if (!this.config) {
116
169
  throw new Error('Config not loaded');
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newpeak/barista-cli",
3
- "version": "0.2.277",
3
+ "version": "0.2.279",
4
4
  "description": "AI Tools CLI for Liberica and Arabica services",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_metadata": {
3
- "generatedAt": "2026-10-14T13:19:54.328Z",
3
+ "generatedAt": "2026-10-15T04:02:28.726Z",
4
4
  "source": "src/commands/",
5
5
  "generator": "src/skills/barista-cli/scripts/generate.ts"
6
6
  },
@@ -1,5 +1,5 @@
1
1
  # ★ 自动生成。修改源码后重新生成:npm run generate-skills-data
2
- # ★ 生成时间: 2026-10-14T13:19:54.347Z
2
+ # ★ 生成时间: 2026-10-15T04:02:28.751Z
3
3
 
4
4
  global:
5
5
  # ── 全局 ──