@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 +5 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/portal.d.ts +6 -0
- package/dist/commands/portal.js +3 -2
- package/dist/commands/portal.js.map +1 -1
- package/dist/commands/system.d.ts +1 -0
- package/dist/commands/system.js +2 -2
- package/dist/commands/system.js.map +1 -1
- package/dist/lib/legacy-runner.js +36 -6
- package/package.json +1 -1
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.
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -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;
|
package/dist/commands/portal.js
CHANGED
|
@@ -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
|
|
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":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,4BAA4B,EAAE;IACtH,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC9H,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC5H,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC9H,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC9I,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kCAAkC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAC9I,sBAAsB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qDAAqD,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,6BAA6B,EAAE;IACvK,wBAAwB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qDAAqD,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE;IAC9L,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,uBAAuB,EAAE,WAAW,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../commands/portal.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/system.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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 ?
|
|
664
|
-
|
|
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 (
|
|
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
|
-
|
|
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;
|