@deerdesign/deertools 1.2.26 → 1.2.31

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
@@ -19,14 +19,6 @@ Log in once from your computer, and grant your AI coding agent (Antigravity, Cur
19
19
 
20
20
  ---
21
21
 
22
- ## 📊 Prezentacja dla Zespołu IT
23
-
24
- Dedykowana prezentacja architektoniczna i wdrożeniowa dla zespołów deweloperskich i DevOps:
25
- - 🌐 **[Slajdy interaktywne HTML (Reveal.js)](./docs/prezentacja-it-deertools.html)** — uruchom w dowolnej przeglądarce (`Space` / strzałki do nawigacji, `Esc` do widoku miniatur kafelkowych, `Cmd+P` do druku/eksportu PDF).
26
- - 📝 **[Wersja tekstowa Markdown](./docs/prezentacja-it-deertools.md)** — do szybkiego czytania bezpośrednio w GitHubie.
27
-
28
- ---
29
-
30
22
  ## Installation
31
23
 
32
24
  Requires **Node.js ≥ 18**. Zero runtime dependencies.
@@ -140,14 +132,14 @@ deertools doctor --json
140
132
  deertools completion install # automatically configures ~/.zshrc or ~/.bashrc
141
133
 
142
134
  # 3. BaseLinker Hub & MCP Proxy:
143
- deertools baselinker auth <X-BLToken> # Zapisz token w credentials.json
144
- deertools baselinker test # Sprawdź połączenie i listę katalogów
145
- deertools baselinker serve --port 3456 # Uruchom lokalny dashboard Web UI + MCP SSE
146
- deertools baselinker mcp # Mostek MCP stdio (Cursor / Claude Desktop)
147
- deertools baselinker sync-schema # Pobierz 204 metod z api.baselinker.com
148
- deertools baselinker search "relations" # Wyszukaj metody i schematy parametrów
149
- deertools baselinker call getOrders # Bezpośrednie wywołanie API z terminala
150
- deertools baselinker catalog search 105 "dąb" # Wyszukaj produkty w katalogu BaseLinkera
135
+ deertools baselinker auth <X-BLToken> # Save BaseLinker token to credentials.json
136
+ deertools baselinker test # Test authorization and list product catalogs
137
+ deertools baselinker serve --port 3456 # Launch local Web UI dashboard + MCP SSE server
138
+ deertools baselinker mcp # Stdio MCP bridge (Cursor / Claude Desktop)
139
+ deertools baselinker sync-schema # Download and refresh 204 API methods from api.baselinker.com
140
+ deertools baselinker search "relations" # Search BaseLinker methods and parameter schemas
141
+ deertools baselinker call getOrders # Direct API method execution from terminal
142
+ deertools baselinker catalog search 105 "oak" # Search products in BaseLinker catalog
151
143
 
152
144
  # 4. Local Stdio MCP Bridge (for Claude Desktop, Ollama, local LLM tools):
153
145
  deertools mcp serve
@@ -161,33 +153,34 @@ deertools profile list
161
153
  deertools profile use staging
162
154
 
163
155
  # 7. AI Agent Skills (DeerSkills Hub):
164
- deertools skill list # Wyświetl listę skilli ze statusem zainstalowania w projekcie
165
- deertools skill sync # Jedna komenda: instaluje brakujące i aktualizuje obecne skille zespołu
166
- deertools skill install --all # To samo co skill sync (pełna synchronizacja zespołu)
167
- deertools skill install deer-kosztorys # Zainstaluj konkretny skill w ~/.gemini/antigravity/skills lub .agents
156
+ deertools skill list # View list of skills with installation status across agents
157
+ deertools skill sync # Pull and update skills from Hub (protects local changes)
158
+ deertools sync --push # Full two-way sync: pull updates + push newer local skills to Hub
159
+ deertools skill install --all # Alias for skill sync (full team synchronization)
160
+ deertools skill install deer-kosztorys # Install specific skill to detected AI agent environments
168
161
  deertools skill install deer-kosztorys --version 1.0.0
169
- deertools skill search "kosztorys" # Wyszukaj skille po nazwie, tagu lub opisie
170
- deertools skill push ./my-skill # Opublikuj nową wersję z automatycznym skanerem sekretów
171
- deertools skill push ./my-skill --tags "wycena, kosztorys, marże" # Dodaj tagi przy publikacji
172
- deertools skill push ./my-skill --team architekci # Publikacja bezpośrednio do zespołu
173
- deertools skill share my-skill --team architekci # Udostępnij skill dla wskazanego zespołu
174
- deertools skill share my-skill --private # Cofnij udostępnienie (tylko dla autora)
175
- deertools skill update deer-kosztorys # Zaktualizuj zainstalowany skill do najnowszej wersji
176
- deertools skill update # Zaktualizuj wszystkie zainstalowane skille
177
- deertools skill promote my-skill # Zgłoś wniosek do admina o nominację do globalnego katalogu
178
-
179
- # 8. Team Management (Konfiguracja Zespołów):
180
- deertools team list # Lista zespołów, liczba członków i skilli
181
- deertools team members architekci # Członkowie i role w zespole architekci
182
- deertools team add architekci jan@deer.pl # Dodaj członka do zespołu (rola member)
183
- deertools team add architekci ewa@deer.pl --role lead # Dodaj lidera zespołu
184
- deertools team remove architekci jan@deer.pl # Usuń członka z zespołu
185
- deertools team create "Projektanci Wnętrz" --slug projektanci # Utwórz nowy zespół
162
+ deertools skill search "pricing" # Search skills by keyword, tag, or description
163
+ deertools skill push ./my-skill # Publish new version with automated secret scanning
164
+ deertools skill push ./my-skill --tags "pricing, margins, design" # Attach tags upon publish
165
+ deertools skill push ./my-skill --team architects # Publish directly to specific team space
166
+ deertools skill share my-skill --team architects # Share private skill with team members
167
+ deertools skill share my-skill --private # Revoke sharing (private to author only)
168
+ deertools skill update deer-kosztorys # Update installed skill to latest Hub version
169
+ deertools skill update # Update all installed skills across agents
170
+ deertools skill promote my-skill # Submit promotion request to company-wide global registry
171
+
172
+ # 8. Team Management:
173
+ deertools team list # List teams, member counts, and assigned skills
174
+ deertools team members architects # List members and roles in the architects team
175
+ deertools team add architects john@deer.pl # Add user to team (member role)
176
+ deertools team add architects eva@deer.pl --role lead # Add team lead
177
+ deertools team remove architects john@deer.pl # Remove member from team
178
+ deertools team create "Interior Designers" --slug designers # Create new organization team
186
179
 
187
180
  # 9. AI Agent MCP Registry & Configuration:
188
- deertools mcp list # Lista dostępnych serwerów MCP w ekosystemie
189
- deertools mcp config # Wygeneruj konfigurację JSON dla Cursor, Claude, Antigravity
190
- deertools mcp install # Automatycznie dopisz konfigurację do narzędzi AI
181
+ deertools mcp list # List available MCP servers across the ecosystem
182
+ deertools mcp config # Generate Remote MCP JSON config for Cursor, Claude, Antigravity
183
+ deertools mcp install # Automatically write MCP config to local AI agents
191
184
  ```
192
185
 
193
186
  ---
@@ -219,28 +212,28 @@ deertools mcp install # Automatycznie dopisz konfiguracj
219
212
 
220
213
  ## DeerSkills Hub & MCP Ecosystem
221
214
 
222
- **DeerSkills Hub** (`https://skills.deergroup.pl`) to centralna platforma dystrybucji, wersjonowania i zarządzania umiejętnościami agentów AI (Skills) oraz serwerami MCP w ekosystemie Deer Design:
223
-
224
- 1. **Trzypoziomowa Struktura Uprawnień i Widoczności**:
225
- - **Oficjalne Skille Firmowe (`global`)**: Zweryfikowane narzędzia firmowe, widoczne dla wszystkich pracowników w organizacji, instalowane domyślnie.
226
- - **Skille Zespołowe (`team`)**: Dedykowane dla konkretnego zespołu (np. Architekci, Doradcy Klienta, Kosztorysy, Logistyka, IT-Dev). Widoczne i instalowalne **wyłącznie** przez członków danego zespołu. Zespoły i role są w pełni konfigurowalne przez `deertools team` oraz portal Web.
227
- - **Prywatne Skille Użytkownika (`user`)**: Każdy pracownik publikuje pod własną przestrzenią `@uzytkownik/nazwa-skilla`. Są w 100% prywatne (niewidoczne dla innych), dopóki autor nie zdecyduje się ich udostępnić swojemu zespołowi (`deertools skill share --team <slug>`) lub zgłosić do publikacji globalnej (`deertools skill promote`).
228
- 2. **Automatyczny Skaner Sekretów**:
229
- - Każde wywołanie `deertools skill push` automatycznie skanuje pliki skilla w poszukiwaniu niebezpiecznych tokenów (`deer_*_live_`, `ghp_`, `sk-`, `X-BLToken`, haseł).
230
- - Próba wysłania niezanominizowanych kluczy kończy się natychmiastową blokadą z kodem błędu i listą wykrytych linii.
231
- 3. **Wersjonowanie SemVer i Wizualny Diff**:
232
- - Zmiany są wersjonowane (`1.0.0` -> `1.0.1` -> `1.1.0`).
233
- - W portalu Web dostępny jest interaktywny widok Side-by-Side Diff porównujący wersje.
234
- - CLI wspiera flagę `--bump patch|minor|major` przy publikacji.
235
- 4. **Śledzenie Zależności (`.deertools-lock.json`)**:
236
- - Zainstalowane skille są rejestrowane w pliku blokady z sumą kontrolną SHA-256 i zainstalowaną wersją.
237
- - `deertools doctor` automatycznie wykrywa nieaktualne skille i proponuje aktualizację przez `deertools skill update`.
238
- 5. **Ścieżka Awansu ("Nominuj do Globalnych")**:
239
- - Użytkownicy mogą promować swoje prywatne lub zespołowe skille do oficjalnego katalogu firmowego komendą `deertools skill promote <slug>`.
240
- - Administrator weryfikuje zgłoszenie w panelu `/settings` i zatwierdza jednym kliknięciem.
241
- 6. **Integracja z Narzędziami AI (Cursor / Antigravity / Claude)**:
242
- - DeerSkills udostępnia własny serwer MCP (`https://skills.deergroup.pl/functions/v1/skills-mcp`) implementujący specyfikację MCP 2024-11-05.
243
- - Narzędzia: `hub_search_skills`, `hub_get_skill`, `hub_publish_skill_version`, `hub_list_mcp_servers`, `hub_get_ecosystem_products`.
215
+ **DeerSkills Hub** (`https://skills.deergroup.pl`) is the central platform for distributing, versioning, and managing AI Agent Skills and MCP servers across the Deer Design ecosystem:
216
+
217
+ 1. **Three-Tier Scope & Permission Model**:
218
+ - **Company-Wide Official Skills (`global`)**: Verified organization-wide tools, visible to all employees, installed by default during agent initialization.
219
+ - **Team-Scoped Skills (`team`)**: Dedicated to specific functional teams (e.g., Architects, Sales Advisors, Estimators, Logistics, IT-Dev). Visible and installable **strictly** by members of that team. Teams and roles are fully configurable via `deertools team` and the web portal.
220
+ - **User Private Skills (`user`)**: Every employee can publish in their personal namespace `@username/skill-slug`. These remain 100% private until the author explicitly shares them with their team (`deertools skill share --team <slug>`) or submits them for global promotion (`deertools skill promote`).
221
+ 2. **Automated Secret Scanner**:
222
+ - Every `deertools skill push` runs a comprehensive regex scanner for live tokens and API keys (`deer_*_live_`, `ghp_`, `sk-`, `X-BLToken`, passwords).
223
+ - Any unredacted secrets trigger an immediate safety halt with specific line citations, preventing credential leakage before upload.
224
+ 3. **SemVer Versioning & Visual Diff**:
225
+ - All revisions follow Semantic Versioning (`1.0.0` -> `1.0.1` -> `1.1.0`).
226
+ - The web portal features an interactive side-by-side visual diff comparing file trees and `SKILL.md` content between releases.
227
+ - CLI supports `--bump patch|minor|major` or explicit version flags.
228
+ 4. **Dependency Tracking (`.deertools-lock.json`)**:
229
+ - Installed skills are tracked locally in `.deertools-lock.json` with SHA-256 integrity checksums and installed timestamps.
230
+ - `deertools doctor` and `deertools skill check` detect outdated skills and prompt for automated updates.
231
+ 5. **Promotion Pipeline ("Nominate to Global")**:
232
+ - Authors can promote individual or team skills to the official company catalog via `deertools skill promote <slug>`.
233
+ - Administrators review peer requests in the management dashboard and approve with one click.
234
+ 6. **AI Agent Tooling Integration (Cursor / Antigravity / Claude)**:
235
+ - DeerSkills Hub exposes a dedicated Remote MCP server (`https://skills.deergroup.pl/functions/v1/skills-mcp`) compliant with the MCP 2024-11-05 standard.
236
+ - Tools include: `hub_search_skills`, `hub_get_skill`, `hub_publish_skill_version`, `hub_list_mcp_servers`, `hub_get_ecosystem_products`.
244
237
 
245
238
  ---
246
239
 
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@deerdesign/deertools",
3
- "version": "1.2.26",
3
+ "version": "1.2.31",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
8
- "description": "DeerTools CLI: logowanie z laptopa i dostęp agenta AI do API produktów DeerTools (Kosztorys, Katalog, Dostawy, Supplier Hub, RenderMind)",
8
+ "description": "DeerTools CLI: Developer authentication and AI agent access for DeerTools product APIs (Estimate, Catalog, Deliveries, Supplier Hub, RenderMind, DeerSkills)",
9
9
  "bin": {
10
10
  "deertools": "bin/deertools.js",
11
11
  "deer": "bin/deertools.js"
@@ -13,7 +13,8 @@
13
13
  "main": "./src/cli.js",
14
14
  "scripts": {
15
15
  "start": "node ./bin/deertools.js",
16
- "test": "node --test"
16
+ "test": "node --test",
17
+ "install:local": "mkdir -p ~/.local/share/deertools && rsync -av --delete ./ ~/.local/share/deertools/ --exclude node_modules --exclude .git && ln -sf ~/.local/share/deertools/bin/deertools.js ~/.local/bin/deertools && ln -sf ~/.local/share/deertools/bin/deertools.js ~/.local/bin/deer"
17
18
  },
18
19
  "keywords": [
19
20
  "deerdesign",
@@ -1,32 +1,29 @@
1
1
  'use strict';
2
2
  const { getClient } = require('./baselinker/client');
3
3
  const { getBaseLinkerToken, saveBaseLinkerToken } = require('./credentials');
4
- const { startBaseLinkerServer } = require('./baselinker/ui');
5
4
  const { runBaseLinkerMcpServer } = require('./baselinker/mcp-server');
6
- const { syncSchema, searchMethods, loadSchemas } = require('./baselinker/crawler');
7
- const { handleCatalogToolCall } = require('./baselinker/catalog-tools');
8
- const { formatTable, c } = require('./formatters');
5
+ const { syncSchema } = require('./baselinker/crawler');
6
+ const { c } = require('./formatters');
9
7
 
10
8
  async function cmdBaseLinker(pos, flags) {
11
9
  const sub = pos.shift() || 'help';
12
10
 
13
11
  if (sub === 'help') {
14
12
  process.stdout.write(`
15
- DeerTools BaseLinker — MCP Proxy, Hub & Catalog Engine
13
+ DeerTools BaseLinker — Autoryzacja i Mostek MCP (deer-baselinker)
16
14
 
17
- Komendy:
15
+ Komendy administracyjne CLI:
16
+ deertools login baselinker Logowanie przez przeglądarkę i zapis tokenu w credentials.json.
18
17
  deertools baselinker auth [token] Zapisuje token API BaseLinker (X-BLToken) w credentials.json.
19
18
  deertools baselinker test Testuje połączenie z BaseLinker API i pobiera listę katalogów.
20
- deertools baselinker serve [--port 3456] Uruchamia lokalny serwer Web UI z dashboardem i proxy MCP SSE.
21
- deertools baselinker mcp [--all] Uruchamia serwer MCP stdio dla Cursor / Claude Desktop.
22
- deertools baselinker sync-schema Pobiera i aktualizuje bazę wszystkich 204 metod z api.baselinker.com.
23
- deertools baselinker search <fraza> Przeszukuje bazę 204 metod BaseLinkera i zwraca ich parametry.
24
- deertools baselinker call <metoda> [json] Wywołuje dowolną metodę BaseLinkera bezpośrednio z terminala.
25
- deertools baselinker catalog search <id> Wyszukuje produkty w katalogu BaseLinker.
26
- deertools baselinker catalog get <inv> <p> Pobiera pełne dane produktu (w tym relacje, cechy, galerię).
27
-
28
- Zmienne środowiskowe:
29
- BASELINKER_TOKEN lub BL_TOKEN Klucz API BaseLinkera (ma pierwszeństwo przed plikiem).
19
+ deertools baselinker mcp [--all] Uruchamia serwer MCP stdio dla Cursor / Antigravity / Claude Desktop.
20
+ deertools baselinker sync-schema Aktualizuje lokalną bazę schematów metod z api.baselinker.com.
21
+
22
+ Zgodnie ze standardem architektonicznym DeerTools CLI:
23
+ - Operacje biznesowe i katalogowe wykonuje Agent AI wyłącznie przez serwer MCP (deer-baselinker):
24
+ * bl_catalog_search_products, bl_catalog_get_product, bl_catalog_create_or_update_product
25
+ * bl_catalog_set_descriptions_and_features, bl_catalog_manage_images, bl_catalog_set_relations
26
+ * bl_catalog_categories, bl_catalog_manufacturers, bl_catalog_tags, bl_search_methods, bl_call_api
30
27
  `);
31
28
  return;
32
29
  }
@@ -46,7 +43,6 @@ Zmienne środowiskowe:
46
43
  saveBaseLinkerToken(token);
47
44
  process.stdout.write(`${c.green}✓ Zapisano token BaseLinker w credentials.json (uprawnienia 0600).${c.reset}\n`);
48
45
 
49
- // Szybki test
50
46
  process.stdout.write('Testowanie autoryzacji...\n');
51
47
  const client = getClient(token);
52
48
  const test = await client.testConnection();
@@ -61,7 +57,7 @@ Zmienne środowiskowe:
61
57
  if (sub === 'test') {
62
58
  const token = getBaseLinkerToken();
63
59
  if (!token) {
64
- throw new Error('Brak zapisanego tokenu BaseLinker. Wpisz: deertools baselinker auth <token>');
60
+ throw new Error('Brak zapisanego tokenu BaseLinker. Wpisz: deertools login baselinker');
65
61
  }
66
62
  const client = getClient(token);
67
63
  process.stdout.write('Testowanie połączenia z https://api.baselinker.com/connector.php...\n');
@@ -82,13 +78,6 @@ Zmienne środowiskowe:
82
78
  return;
83
79
  }
84
80
 
85
- if (sub === 'serve') {
86
- const port = parseInt(flags.port || 3456, 10);
87
- startBaseLinkerServer(port);
88
- // Trzymaj proces przy życiu
89
- return new Promise(() => {});
90
- }
91
-
92
81
  if (sub === 'mcp') {
93
82
  runBaseLinkerMcpServer({ mode: flags.all ? 'all' : 'catalog' });
94
83
  return;
@@ -103,75 +92,13 @@ Zmienne środowiskowe:
103
92
  return;
104
93
  }
105
94
 
106
- if (sub === 'search') {
107
- const q = pos.join(' ');
108
- const results = searchMethods(q);
109
- if (flags.json) {
110
- process.stdout.write(JSON.stringify(results, null, 2) + '\n');
111
- return;
112
- }
113
- process.stdout.write(`\nZnaleziono ${results.length} metod pasujących do „${q}”:\n\n`);
114
- for (const r of results.slice(0, 15)) {
115
- process.stdout.write(`${c.bold}${c.cyan}${r.name}${c.reset} [${r.category}]\n`);
116
- process.stdout.write(` ${(r.description || '').slice(0, 100)}...\n`);
117
- if (r.parameters && Object.keys(r.parameters).length > 0) {
118
- process.stdout.write(` Parametry: ${Object.keys(r.parameters).join(', ')}\n`);
119
- }
120
- process.stdout.write('\n');
121
- }
122
- return;
123
- }
124
-
125
- if (sub === 'call') {
126
- const method = pos.shift();
127
- if (!method) throw new Error('Podaj nazwę metody: deertools baselinker call <metoda> [json]');
128
- let params = {};
129
- if (pos[0]) {
130
- try { params = JSON.parse(pos.join(' ')); } catch (e) {
131
- throw new Error('Nieprawidłowy JSON parametrów: ' + e.message);
132
- }
133
- }
134
- const client = getClient();
135
- const result = await client.call(method, params);
136
- process.stdout.write(JSON.stringify(result, null, 2) + '\n');
137
- return;
138
- }
139
-
140
- if (sub === 'catalog') {
141
- const catSub = pos.shift() || 'search';
142
- if (catSub === 'search') {
143
- const invId = parseInt(pos.shift() || flags.inventory || 0, 10);
144
- const query = pos.join(' ') || flags.query || '';
145
- if (!invId) throw new Error('Podaj inventory_id: deertools baselinker catalog search <inventory_id> [query]');
146
- const res = await handleCatalogToolCall('bl_catalog_search_products', {
147
- inventory_id: invId,
148
- filter_name: query
149
- });
150
- if (flags.json) {
151
- process.stdout.write(JSON.stringify(res, null, 2) + '\n');
152
- return;
153
- }
154
- const products = res.products ? Object.values(res.products) : [];
155
- process.stdout.write(`\nZnaleziono ${products.length} produktów w katalogu ID ${invId}:\n\n`);
156
- for (const p of products.slice(0, 20)) {
157
- process.stdout.write(`- [ID ${p.id || p.product_id}] SKU: ${p.sku || '-'} | EAN: ${p.ean || '-'} | ${p.name}\n`);
158
- }
159
- return;
160
- }
161
-
162
- if (catSub === 'get') {
163
- const invId = parseInt(pos.shift() || flags.inventory, 10);
164
- const prodId = parseInt(pos.shift() || flags.product, 10);
165
- if (!invId || !prodId) throw new Error('Użycie: deertools baselinker catalog get <inventory_id> <product_id>');
166
- const product = await handleCatalogToolCall('bl_catalog_get_product', {
167
- inventory_id: invId,
168
- product_id: prodId,
169
- include_relations: true,
170
- include_channels_media: true
171
- });
172
- process.stdout.write(JSON.stringify(product, null, 2) + '\n');
173
- return;
174
- }
95
+ if (sub === 'catalog' || sub === 'call' || sub === 'search' || sub === 'serve') {
96
+ const err = new Error(
97
+ `Zgodnie z architekturą DeerTools CLI wywołania domenowe („deertools baselinker ${sub}”) w terminalu są zablokowane. ` +
98
+ `Użyj natywnych narzędzi serwera MCP „deer-baselinker” (bl_catalog_search_products, bl_catalog_get_product, bl_search_methods, bl_call_api).`
99
+ );
100
+ err.exitCode = 2;
101
+ throw err;
175
102
  }
176
103
 
177
104
  throw new Error(`Nieznana podkomenda baselinker: ${sub}. Wpisz "deertools baselinker help".`);
package/src/cli.js CHANGED
@@ -1,6 +1,13 @@
1
1
  'use strict';
2
2
  const c = require('./commands');
3
3
 
4
+ const BOOLEAN_FLAGS = new Set([
5
+ 'write', 'json', 'raw', 'no-open', 'push', 'auto-push', 'force',
6
+ 'all', 'all-agents', 'global', 'private', 'shared', 'unshare',
7
+ 'major', 'minor', 'patch', 'help', 'version', 'own', 'user', 'own-space',
8
+ 'admin', 'ro', 'rw', 'interactive', 'select', 'dry-run', 'verbose'
9
+ ]);
10
+
4
11
  function parseArgs(argv) {
5
12
  const pos = [];
6
13
  const flags = {};
@@ -12,7 +19,7 @@ function parseArgs(argv) {
12
19
  let val = eq === -1 ? undefined : a.slice(eq + 1);
13
20
  if (val === undefined) {
14
21
  const next = argv[i + 1];
15
- if (next !== undefined && !next.startsWith('--') && !['write', 'json', 'raw', 'no-open'].includes(key)) { val = next; i++; } else val = true;
22
+ if (next !== undefined && !next.startsWith('--') && !BOOLEAN_FLAGS.has(key)) { val = next; i++; } else val = true;
16
23
  }
17
24
  if (flags[key] === undefined) flags[key] = val;
18
25
  else flags[key] = [].concat(flags[key], val);
@@ -30,14 +37,28 @@ async function main(argv) {
30
37
  }
31
38
 
32
39
  const table = {
33
- login: c.cmdLogin, logout: c.cmdLogout, whoami: c.cmdWhoami, docs: c.cmdDocs,
34
- endpoints: c.cmdEndpoints, api: c.cmdApi, skill: c.cmdSkill,
40
+ login: c.cmdLogin,
41
+ logout: c.cmdLogout,
42
+ whoami: c.cmdWhoami,
43
+ skill: c.cmdSkill,
35
44
  sync: (pos, flags) => c.cmdSkill(['sync', ...pos], flags),
36
- agent: c.cmdAgent, agents: c.cmdAgent,
37
- team: c.cmdTeam, teams: c.cmdTeam,
38
- mcp: c.cmdMcp, doctor: c.cmdDoctor, audit: c.cmdAudit, profile: c.cmdProfile,
39
- completion: c.cmdCompletion, baselinker: c.cmdBaseLinker,
45
+ agent: c.cmdAgent,
46
+ agents: c.cmdAgent,
47
+ team: c.cmdTeam,
48
+ teams: c.cmdTeam,
49
+ mcp: c.cmdMcp,
50
+ doctor: c.cmdDoctor,
51
+ audit: c.cmdAudit,
52
+ profile: c.cmdProfile,
53
+ completion: c.cmdCompletion,
54
+ baselinker: c.cmdBaseLinker,
55
+ rendermind: c.cmdRenderMind,
56
+ supplier: c.cmdSupplier,
40
57
  update: require('./updater').cmdUpdate,
58
+ // Bezpiecznik architektoniczny: blokada bezpośrednich wywołań REST API z CLI
59
+ api: () => c.cmdBlockedDomain('api'),
60
+ endpoints: () => c.cmdBlockedDomain('endpoints'),
61
+ docs: () => c.cmdBlockedDomain('docs'),
41
62
  };
42
63
 
43
64
  if (pos.length === 0 && !flags.help && !flags.version && process.stdout.isTTY) {
@@ -64,8 +85,8 @@ async function main(argv) {
64
85
  return code;
65
86
  };
66
87
 
88
+ if (cmd === '--version' || cmd === 'version' || flags.version || flags.v) { process.stdout.write(`${require('../package.json').version}\n`); return finish(0); }
67
89
  if (cmd === 'help' || cmd === '--help' || flags.help) { process.stdout.write(c.HELP); return finish(0); }
68
- if (cmd === '--version' || cmd === 'version' || flags.version) { process.stdout.write(`${require('../package.json').version}\n`); return finish(0); }
69
90
  if (!table[cmd]) { process.stderr.write(`Nieznana komenda „${cmd}”.\n${c.HELP}`); return finish(2); }
70
91
  try {
71
92
  await table[cmd](pos, flags);