@klevar/portal-cli 0.1.7 → 0.1.9

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
@@ -41,8 +41,13 @@ npx @klevar/portal-cli clients create --name "Stefan" --email "stefan@example.de
41
41
  npx @klevar/portal-cli projects create <clientId> --name "Idealo" --externalRef "idealo:ksh.de"
42
42
  npx @klevar/portal-cli metrics push --external_ref "idealo:ksh.de" --source_ref "run:33" --snapshot_date "2026-04-12" --metrics '{"score":88}'
43
43
  npx @klevar/portal-cli portal me --portal-token "<client-token>"
44
+ npx @klevar/portal-cli portal search --query "maintenance" --portal-token "<client-token>"
45
+ npx @klevar/portal-cli portal tasks <projectId> --portal-token "<client-token>"
46
+ npx @klevar/portal-cli clients get <clientId> --json --compact
44
47
  ```
45
48
 
49
+ `portal my-tasks` lists requests submitted by the client across projects. `portal tasks <projectId>` lists the tasks shown on that project detail page, including admin-created project tasks that are visible in the client portal.
50
+
46
51
  ## Capacity And Usage
47
52
 
48
53
  Capacity commands manage included allowances for a project or client. They are not timesheets.
@@ -56,6 +56,7 @@ export declare const COMMAND_GROUPS: {
56
56
  path: string;
57
57
  auth: "apiKey";
58
58
  description: string;
59
+ queryParams: string[];
59
60
  };
60
61
  };
61
62
  clients: {
@@ -614,6 +615,12 @@ export declare const COMMAND_GROUPS: {
614
615
  auth: "portalToken";
615
616
  description: string;
616
617
  };
618
+ 'portal.tasks': {
619
+ method: "GET";
620
+ path: string;
621
+ auth: "portalToken";
622
+ description: string;
623
+ };
617
624
  'portal.tasks.create': {
618
625
  method: "POST";
619
626
  path: string;
@@ -61,6 +61,12 @@ export declare const portalCommands: {
61
61
  auth: "portalToken";
62
62
  description: string;
63
63
  };
64
+ 'portal.tasks': {
65
+ method: "GET";
66
+ path: string;
67
+ auth: "portalToken";
68
+ description: string;
69
+ };
64
70
  'portal.tasks.create': {
65
71
  method: "POST";
66
72
  path: string;
@@ -7,8 +7,9 @@ export const portalCommands = {
7
7
  'portal.updates': { method: 'GET', path: '/api/portal/projects/:id/updates', auth: 'portalToken', description: 'List portal project updates' },
8
8
  'portal.comments.list': { method: 'GET', path: '/api/portal/projects/:id/updates/:updateId/comments', auth: 'portalToken', description: 'List portal update comments' },
9
9
  'portal.comments.create': { method: 'POST', path: '/api/portal/projects/:id/updates/:updateId/comments', auth: 'portalToken', description: 'Create portal update comment', body: ['content'] },
10
- 'portal.search': { method: 'GET', path: '/api/portal/search', auth: 'portalToken', description: 'Search portal content', queryParams: ['q'] },
11
- 'portal.my-tasks': { method: 'GET', path: '/api/portal/tasks/mine', auth: 'portalToken', description: 'List my portal tasks' },
10
+ 'portal.search': { method: 'GET', path: '/api/portal/search', auth: 'portalToken', description: 'Search portal content', queryParams: ['q|query'] },
11
+ 'portal.my-tasks': { method: 'GET', path: '/api/portal/tasks/mine', auth: 'portalToken', description: 'List client-submitted portal requests' },
12
+ 'portal.tasks': { method: 'GET', path: '/api/portal/projects/:id/tasks', auth: 'portalToken', description: 'List portal project tasks' },
12
13
  'portal.tasks.create': { method: 'POST', path: '/api/portal/projects/:id/tasks', auth: 'portalToken', description: 'Create portal task', body: ['title', 'description', 'priority'] },
13
14
  'portal.tasks.delete': { method: 'DELETE', path: '/api/portal/projects/:id/tasks/:taskId', auth: 'portalToken', description: 'Delete portal task' },
14
15
  'portal.tasks.list': { method: 'GET', path: '/api/portal/projects/:id/tasks', auth: 'portalToken', description: 'List portal tasks' },
@@ -1 +1 @@
1
- {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../commands/portal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../commands/portal.ts"],"names":[],"mappings":"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"}
@@ -53,5 +53,6 @@ export declare const systemCommands: {
53
53
  path: string;
54
54
  auth: "apiKey";
55
55
  description: string;
56
+ queryParams: string[];
56
57
  };
57
58
  };
@@ -6,7 +6,7 @@ export const systemCommands = {
6
6
  'tenant.info': { method: 'GET', path: '/api/tenants/me', auth: 'apiKey', description: 'Show tenant metadata' },
7
7
  dashboard: { method: 'GET', path: '/api/admin/dashboard', auth: 'apiKey', description: 'Show dashboard stats' },
8
8
  'dashboard.stats': { method: 'GET', path: '/api/admin/dashboard', auth: 'apiKey', description: 'Show dashboard stats' },
9
- search: { method: 'GET', path: '/api/admin/search', auth: 'apiKey', description: 'Search admin content', queryParams: ['q'] },
10
- 'search.admin': { method: 'GET', path: '/api/admin/search', auth: 'apiKey', description: 'Search admin content' },
9
+ search: { method: 'GET', path: '/api/admin/search', auth: 'apiKey', description: 'Search admin content', queryParams: ['q|query'] },
10
+ 'search.admin': { method: 'GET', path: '/api/admin/search', auth: 'apiKey', description: 'Search admin content', queryParams: ['q|query'] },
11
11
  };
12
12
  //# sourceMappingURL=system.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../../commands/system.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC3F,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACpG,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;IACxG,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC3G,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC9G,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC/G,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACvH,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE;IAC7H,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;CAC3F,CAAC"}
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../commands/system.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC3F,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACpG,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;IACxG,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC3G,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC9G,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC/G,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACvH,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE;IACnI,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE;CACrH,CAAC"}
@@ -65,6 +65,8 @@ let PORTAL_TOKEN =
65
65
  process.env.PORTAL_PORTAL_TOKEN ||
66
66
  envFile.PORTAL_TOKEN ||
67
67
  envFile.PORTAL_PORTAL_TOKEN;
68
+ let OUTPUT_JSON = false;
69
+ let COMPACT_JSON = false;
68
70
 
69
71
  function requireApiKey() {
70
72
  if (!API_KEY) {
@@ -306,9 +308,21 @@ function helpFlag(commandKey, field) {
306
308
  return hint ? `--${field} ${hint}` : `--${field}`;
307
309
  }
308
310
 
311
+ function helpQueryFlag(field) {
312
+ const aliases = field.split('|');
313
+ if (aliases.length > 1) {
314
+ return aliases.map((alias) => `--${alias}`).join('|');
315
+ }
316
+ return `--${field}`;
317
+ }
318
+
309
319
  // ── Output Formatting ───────────────────────────────────────────
310
320
 
311
321
  function formatOutput(data, commandKey) {
322
+ if (OUTPUT_JSON) {
323
+ console.log(COMPACT_JSON ? JSON.stringify(data) : JSON.stringify(data, null, 2));
324
+ return;
325
+ }
312
326
  if (!data) { console.log('Done.'); return; }
313
327
 
314
328
  // Special formatting for known responses
@@ -580,7 +594,16 @@ function formatOutput(data, commandKey) {
580
594
  // Create responses — formatted instead of raw JSON
581
595
  if (data.client) {
582
596
  const c = data.client;
583
- console.log(`Client created: ${c.name} [${c.status}] [${c.id}]`);
597
+ if (commandKey === 'clients.go-live') {
598
+ console.log(`Client go-live completed: ${c.name} [${c.status}] [${c.id}]`);
599
+ console.log(' Client notifications enabled.');
600
+ } else if (commandKey === 'clients.mute') {
601
+ console.log(`Client notifications muted: ${c.name} [${c.status}] [${c.id}]`);
602
+ } else if (commandKey === 'clients.update') {
603
+ console.log(`Client updated: ${c.name} [${c.status}] [${c.id}]`);
604
+ } else {
605
+ console.log(`Client created: ${c.name} [${c.status}] [${c.id}]`);
606
+ }
584
607
  if (c.portalSlug) console.log(` Portal: /c/${c.portalSlug}?token=${c.portalToken}`);
585
608
  return;
586
609
  }
@@ -655,13 +678,15 @@ if (!resource || resource === 'help' || resource === '--help') {
655
678
  for (const [key, cmd] of Object.entries(COMMANDS)) {
656
679
  const [res, act] = key.includes('.') ? key.split('.') : [key, ''];
657
680
  if (!grouped[res]) grouped[res] = [];
658
- grouped[res].push({ key, action: act, desc: (cmd.description || cmd.desc), body: cmd.body });
681
+ grouped[res].push({ key, action: act, desc: (cmd.description || cmd.desc), body: cmd.body, queryParams: cmd.queryParams });
659
682
  }
660
683
  for (const [res, cmds] of Object.entries(grouped)) {
661
684
  console.log(`\n ${res}:`);
662
685
  for (const c of cmds) {
663
- const bodyHint = c.body ? ` [${c.body.map(b => helpFlag(c.key, b)).join(' ')}]` : '';
664
- console.log(` ${c.action || '(default)'} — ${c.desc}${bodyHint}`);
686
+ const bodyHint = c.body ? c.body.map(b => helpFlag(c.key, b)) : [];
687
+ const queryHint = c.queryParams ? c.queryParams.map(q => helpQueryFlag(q)) : [];
688
+ const flagHint = [...bodyHint, ...queryHint];
689
+ console.log(` ${c.action || '(default)'} — ${c.desc}${flagHint.length ? ` [${flagHint.join(' ')}]` : ''}`);
665
690
  }
666
691
  }
667
692
  console.log(`\nConfig: PORTAL_API_URL, PORTAL_API_KEY, PORTAL_TOKEN (or ~/.klevar/portal.env)`);
@@ -672,7 +697,7 @@ if (!resource || resource === 'help' || resource === '--help') {
672
697
  // Resolve command key — handle single-word commands (e.g. "search <term>")
673
698
  let commandKey = action ? `${resource}.${action}` : resource;
674
699
  let cmd = COMMANDS[commandKey];
675
- if (!cmd && action && rest[0]) {
700
+ if (action && rest[0]) {
676
701
  const nestedKey = `${resource}.${action}.${rest[0]}`;
677
702
  if (COMMANDS[nestedKey]) {
678
703
  commandKey = nestedKey;
@@ -701,6 +726,8 @@ if (flags['portal-token']) process.env.PORTAL_TOKEN = flags['portal-token'];
701
726
  if (flags['api-url']) BASE_URL = flags['api-url'];
702
727
  if (flags['api-key']) API_KEY = flags['api-key'];
703
728
  if (flags['portal-token']) PORTAL_TOKEN = flags['portal-token'];
729
+ OUTPUT_JSON = flags.json === 'true';
730
+ COMPACT_JSON = flags.compact === 'true';
704
731
  const id = positional[0];
705
732
 
706
733
  // Interpolate path
@@ -725,7 +752,10 @@ if (cmd.queryParams || cmd.fixedQuery) {
725
752
  params.set(key, value);
726
753
  }
727
754
  for (const key of cmd.queryParams || []) {
728
- if (flags[key]) params.set(key, flags[key]);
755
+ const aliases = key.split('|');
756
+ const canonical = aliases[0];
757
+ const value = aliases.map((alias) => flags[alias]).find((candidate) => candidate !== undefined);
758
+ if (value !== undefined) params.set(canonical, value);
729
759
  }
730
760
  const qs = params.toString();
731
761
  if (qs) path += (path.includes('?') ? '&' : '?') + qs;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@klevar/portal-cli",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "First-class npm CLI for the Klevar Client Management Portal",
5
5
  "type": "module",
6
6
  "bin": {