@kittl/cli 0.0.1 → 0.0.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/LICENSE +201 -0
- package/README.md +15 -105
- package/bin/dev.js +97 -0
- package/dist/chunk-2OOJ3TW4.js +143 -0
- package/dist/chunk-2OOJ3TW4.js.map +1 -0
- package/dist/chunk-3BPIJLS7.js +51 -0
- package/dist/chunk-3BPIJLS7.js.map +1 -0
- package/dist/chunk-EKU4DKQK.js +20 -0
- package/dist/chunk-EKU4DKQK.js.map +1 -0
- package/dist/{chunk-4ISWSLZ5.js → chunk-K4OFK7AL.js} +3 -3
- package/dist/chunk-K4OFK7AL.js.map +1 -0
- package/dist/chunk-SUQB7HN4.js +102 -0
- package/dist/chunk-SUQB7HN4.js.map +1 -0
- package/dist/{chunk-JGD3QFQS.js → chunk-YUKLWJFM.js} +326 -71
- package/dist/chunk-YUKLWJFM.js.map +1 -0
- package/dist/commands/app/init.js +726 -0
- package/dist/commands/app/init.js.map +1 -0
- package/dist/commands/app/release.js +125 -0
- package/dist/commands/app/release.js.map +1 -0
- package/dist/commands/app/update.js +45 -0
- package/dist/commands/app/update.js.map +1 -0
- package/dist/commands/app/upload.js +404 -5
- package/dist/commands/app/upload.js.map +1 -1
- package/dist/commands/auth/login.js +13 -68
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +1 -1
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/whoami.js +2 -2
- package/dist/commands/whoami.js +2 -2
- package/oclif.manifest.json +196 -0
- package/package.json +18 -27
- package/dist/chunk-4ISWSLZ5.js.map +0 -1
- package/dist/chunk-JGD3QFQS.js.map +0 -1
- package/dist/commands/app/create.js +0 -16
- package/dist/commands/app/create.js.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// src/ui/hooks/useTerminalWidth.ts
|
|
2
|
+
import { useStdout } from "ink";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
function useTerminalWidth() {
|
|
5
|
+
const { stdout } = useStdout();
|
|
6
|
+
const [width, setWidth] = useState(() => stdout.columns ?? 80);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const onResize = () => setWidth(stdout.columns ?? 80);
|
|
9
|
+
stdout.on("resize", onResize);
|
|
10
|
+
return () => {
|
|
11
|
+
stdout.off("resize", onResize);
|
|
12
|
+
};
|
|
13
|
+
}, [stdout]);
|
|
14
|
+
return width;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
useTerminalWidth
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=chunk-EKU4DKQK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/hooks/useTerminalWidth.ts"],"sourcesContent":["import { useStdout } from 'ink';\nimport { useEffect, useState } from 'react';\n\nexport function useTerminalWidth(): number {\n const { stdout } = useStdout();\n const [width, setWidth] = useState(() => stdout.columns ?? 80);\n\n useEffect(() => {\n const onResize = () => setWidth(stdout.columns ?? 80);\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n return width;\n}\n"],"mappings":";AAAA,SAAS,iBAAiB;AAC1B,SAAS,WAAW,gBAAgB;AAE7B,SAAS,mBAA2B;AACzC,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,MAAM,OAAO,WAAW,EAAE;AAE7D,YAAU,MAAM;AACd,UAAM,WAAW,MAAM,SAAS,OAAO,WAAW,EAAE;AACpD,WAAO,GAAG,UAAU,QAAQ;AAC5B,WAAO,MAAM;AACX,aAAO,IAAI,UAAU,QAAQ;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseCommand
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YUKLWJFM.js";
|
|
4
4
|
|
|
5
5
|
// src/commands/auth/whoami.ts
|
|
6
6
|
import { jwtDecode } from "jwt-decode";
|
|
@@ -11,7 +11,7 @@ var AuthWhoAmI = class _AuthWhoAmI extends BaseCommand {
|
|
|
11
11
|
const session = await this.ensureAuthenticated();
|
|
12
12
|
if (!session.idToken) {
|
|
13
13
|
this.error(
|
|
14
|
-
`No ID token found in session. Run \`${this.config.bin} auth
|
|
14
|
+
`No ID token found in session. Run \`${this.config.bin} auth login\` again.`,
|
|
15
15
|
{ exit: 2 }
|
|
16
16
|
);
|
|
17
17
|
}
|
|
@@ -26,4 +26,4 @@ var AuthWhoAmI = class _AuthWhoAmI extends BaseCommand {
|
|
|
26
26
|
export {
|
|
27
27
|
AuthWhoAmI
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-K4OFK7AL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/auth/whoami.ts"],"sourcesContent":["import { jwtDecode } from 'jwt-decode';\nimport type { IDToken } from 'openid-client';\nimport { BaseCommand } from '../../core/core.command';\n\nexport default class AuthWhoAmI extends BaseCommand {\n public static override description =\n 'Show authenticated Kittl account details';\n\n public async run(): Promise<void> {\n await this.parse(AuthWhoAmI);\n\n const session = await this.ensureAuthenticated();\n\n if (!session.idToken) {\n this.error(\n `No ID token found in session. Run \\`${this.config.bin} auth login\\` again.`,\n { exit: 2 },\n );\n }\n\n const claims = jwtDecode<IDToken>(session.idToken);\n const email = claims.email ?? 'unknown';\n const name =\n claims.name ?? claims.preferred_username ?? claims.sub ?? 'unknown';\n\n this.log(`Name: ${name}`);\n this.log(`Email: ${email}`);\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,iBAAiB;AAI1B,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAuB,cACrB;AAAA,EAEF,MAAa,MAAqB;AAChC,UAAM,KAAK,MAAM,WAAU;AAE3B,UAAM,UAAU,MAAM,KAAK,oBAAoB;AAE/C,QAAI,CAAC,QAAQ,SAAS;AACpB,WAAK;AAAA,QACH,uCAAuC,KAAK,OAAO,GAAG;AAAA,QACtD,EAAE,MAAM,EAAE;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,SAAS,UAAmB,QAAQ,OAAO;AACjD,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,OACJ,OAAO,QAAQ,OAAO,sBAAsB,OAAO,OAAO;AAE5D,SAAK,IAAI,SAAS,IAAI,EAAE;AACxB,SAAK,IAAI,UAAU,KAAK,EAAE;AAAA,EAC5B;AACF;","names":[]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatZodErrorSummary
|
|
3
|
+
} from "./chunk-2OOJ3TW4.js";
|
|
4
|
+
import {
|
|
5
|
+
parseJsonObjectFromFile
|
|
6
|
+
} from "./chunk-YUKLWJFM.js";
|
|
7
|
+
|
|
8
|
+
// src/services/extensions.service.ts
|
|
9
|
+
import { z as z2 } from "zod";
|
|
10
|
+
|
|
11
|
+
// src/core/schemas/extension-manifest.ts
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
var extensionScopeSchema = z.enum([
|
|
14
|
+
"design:state:read",
|
|
15
|
+
"design:state:write",
|
|
16
|
+
"uploads:create",
|
|
17
|
+
"fonts:create",
|
|
18
|
+
"uploads:global:read",
|
|
19
|
+
"ai:credit:spend",
|
|
20
|
+
"workspace:state:read",
|
|
21
|
+
"workspace:state:write"
|
|
22
|
+
]);
|
|
23
|
+
var oauthProviderSchema = z.object({
|
|
24
|
+
authorizationUrl: z.string().min(1),
|
|
25
|
+
clientId: z.string().min(1),
|
|
26
|
+
scope: z.string().min(1).optional(),
|
|
27
|
+
accessType: z.string().min(1).optional(),
|
|
28
|
+
tokenUrl: z.string().min(1),
|
|
29
|
+
customFieldMappings: z.record(z.string(), z.unknown()).optional()
|
|
30
|
+
}).strict();
|
|
31
|
+
var extensionManifestSchema = z.object({
|
|
32
|
+
$schema: z.string().min(1).optional(),
|
|
33
|
+
//needs sign-off on each release.
|
|
34
|
+
displayName: z.string().min(1),
|
|
35
|
+
icon: z.string().min(1),
|
|
36
|
+
tagline: z.string().min(1),
|
|
37
|
+
installPage: z.object({
|
|
38
|
+
description: z.string().min(1),
|
|
39
|
+
coverImage: z.string().min(1),
|
|
40
|
+
termsAndConditionsLink: z.string().min(1),
|
|
41
|
+
privacyPolicyLink: z.string().min(1)
|
|
42
|
+
}).strict(),
|
|
43
|
+
config: z.object({
|
|
44
|
+
scopes: z.array(extensionScopeSchema),
|
|
45
|
+
embed: z.object({
|
|
46
|
+
mainAppPanel: z.object({
|
|
47
|
+
path: z.string().min(1)
|
|
48
|
+
}).strict(),
|
|
49
|
+
scriptRunner: z.object({
|
|
50
|
+
path: z.string().min(1)
|
|
51
|
+
}).strict().optional()
|
|
52
|
+
}).strict(),
|
|
53
|
+
appDevelopment: z.object({
|
|
54
|
+
local: z.object({
|
|
55
|
+
requireHTTPS: z.boolean().optional(),
|
|
56
|
+
port: z.number().int().min(1).max(65535).optional()
|
|
57
|
+
}).strict()
|
|
58
|
+
}).strict().optional(),
|
|
59
|
+
oauthProviders: z.record(z.string(), oauthProviderSchema).optional()
|
|
60
|
+
}).strict()
|
|
61
|
+
}).strict();
|
|
62
|
+
|
|
63
|
+
// src/services/extensions.service.ts
|
|
64
|
+
var createExtensionVersionResponseSchema = z2.object({
|
|
65
|
+
success: z2.literal(true),
|
|
66
|
+
result: z2.object({
|
|
67
|
+
extensionVersionId: z2.string()
|
|
68
|
+
})
|
|
69
|
+
});
|
|
70
|
+
async function createExtensionDraftVersion(client, extensionId, manifestFilePath) {
|
|
71
|
+
const rawObject = await parseJsonObjectFromFile(manifestFilePath);
|
|
72
|
+
const manifestParsed = extensionManifestSchema.safeParse(rawObject);
|
|
73
|
+
if (!manifestParsed.success) {
|
|
74
|
+
throw new Error(
|
|
75
|
+
`Invalid manifest.json (${manifestFilePath}): ${formatZodErrorSummary(manifestParsed.error)}`
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
const { $schema: _schema, ...manifest } = manifestParsed.data;
|
|
79
|
+
const path = `/extensions/${extensionId}/versions`;
|
|
80
|
+
const { data } = await client.post(path, { manifest });
|
|
81
|
+
const parsed = createExtensionVersionResponseSchema.parse(data);
|
|
82
|
+
return parsed.result.extensionVersionId;
|
|
83
|
+
}
|
|
84
|
+
var readyForReviewResponseSchema = z2.object({
|
|
85
|
+
success: z2.literal(true),
|
|
86
|
+
result: z2.object({
|
|
87
|
+
extensionVersionId: z2.string(),
|
|
88
|
+
status: z2.literal("READY_FOR_REVIEW")
|
|
89
|
+
})
|
|
90
|
+
});
|
|
91
|
+
async function markExtensionDraftReadyForReview(client, extensionId) {
|
|
92
|
+
const path = `/extensions/${extensionId}/versions/review/ready`;
|
|
93
|
+
const { data } = await client.post(path, {});
|
|
94
|
+
const parsed = readyForReviewResponseSchema.parse(data);
|
|
95
|
+
return parsed.result;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export {
|
|
99
|
+
createExtensionDraftVersion,
|
|
100
|
+
markExtensionDraftReadyForReview
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=chunk-SUQB7HN4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/extensions.service.ts","../src/core/schemas/extension-manifest.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios';\nimport { z } from 'zod';\nimport { formatZodErrorSummary } from '../core/error';\nimport { extensionManifestSchema } from '../core/schemas/extension-manifest';\nimport { parseJsonObjectFromFile } from '../core/utils';\n\nconst createExtensionVersionResponseSchema = z.object({\n success: z.literal(true),\n result: z.object({\n extensionVersionId: z.string(),\n }),\n});\n\n/**\n * POST /extensions/{extensionId}/versions : reads `manifestFilePath`, validates\n * manifest JSON, then POSTs `{ manifest }` to create or update the draft version.\n */\nexport async function createExtensionDraftVersion(\n client: AxiosInstance,\n extensionId: string,\n manifestFilePath: string,\n): Promise<string> {\n const rawObject = await parseJsonObjectFromFile(manifestFilePath);\n const manifestParsed = extensionManifestSchema.safeParse(rawObject);\n if (!manifestParsed.success) {\n throw new Error(\n `Invalid manifest.json (${manifestFilePath}): ${formatZodErrorSummary(manifestParsed.error)}`,\n );\n }\n const { $schema: _schema, ...manifest } = manifestParsed.data;\n const path = `/extensions/${extensionId}/versions`;\n const { data } = await client.post(path, { manifest });\n const parsed = createExtensionVersionResponseSchema.parse(data);\n return parsed.result.extensionVersionId;\n}\n\nconst readyForReviewResponseSchema = z.object({\n success: z.literal(true),\n result: z.object({\n extensionVersionId: z.string(),\n status: z.literal('READY_FOR_REVIEW'),\n }),\n});\n\nexport type ExtensionReadyForReviewResult = z.infer<\n typeof readyForReviewResponseSchema\n>['result'];\n\n/**\n * POST /extensions/{extensionId}/versions/review/ready : moves the current draft\n * version to READY_FOR_REVIEW.\n */\nexport async function markExtensionDraftReadyForReview(\n client: AxiosInstance,\n extensionId: string,\n): Promise<ExtensionReadyForReviewResult> {\n const path = `/extensions/${extensionId}/versions/review/ready`;\n const { data } = await client.post(path, {});\n const parsed = readyForReviewResponseSchema.parse(data);\n return parsed.result;\n}\n","import { z } from 'zod';\n\n/**\n * Shape of `manifest.json`.\n * Keep in sync with def in @kittl/mono://src/controllers/extensions.controller/schemas.ts.\n */\nconst extensionScopeSchema = z.enum([\n 'design:state:read',\n 'design:state:write',\n 'uploads:create',\n 'fonts:create',\n 'uploads:global:read',\n 'ai:credit:spend',\n 'workspace:state:read',\n 'workspace:state:write',\n]);\n\n/**\n * Provider-specific OAuth configuration.\n */\nconst oauthProviderSchema = z\n .object({\n authorizationUrl: z.string().min(1),\n clientId: z.string().min(1),\n scope: z.string().min(1).optional(),\n accessType: z.string().min(1).optional(),\n tokenUrl: z.string().min(1),\n customFieldMappings: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n/**\n * Full extension manifest schema used by the CLI when validating draft uploads.\n */\nexport const extensionManifestSchema = z\n .object({\n $schema: z.string().min(1).optional(),\n //needs sign-off on each release.\n displayName: z.string().min(1),\n icon: z.string().min(1),\n tagline: z.string().min(1),\n installPage: z\n .object({\n description: z.string().min(1),\n coverImage: z.string().min(1),\n termsAndConditionsLink: z.string().min(1),\n privacyPolicyLink: z.string().min(1),\n })\n .strict(),\n config: z\n .object({\n scopes: z.array(extensionScopeSchema),\n embed: z\n .object({\n mainAppPanel: z\n .object({\n path: z.string().min(1),\n })\n .strict(),\n scriptRunner: z\n .object({\n path: z.string().min(1),\n })\n .strict()\n .optional(),\n })\n .strict(),\n appDevelopment: z\n .object({\n local: z\n .object({\n requireHTTPS: z.boolean().optional(),\n port: z.number().int().min(1).max(65535).optional(),\n })\n .strict(),\n })\n .strict()\n .optional(),\n oauthProviders: z.record(z.string(), oauthProviderSchema).optional(),\n })\n .strict(),\n })\n .strict();\n\nexport type ExtensionManifest = z.infer<typeof extensionManifestSchema>;\n"],"mappings":";;;;;;;;AACA,SAAS,KAAAA,UAAS;;;ACDlB,SAAS,SAAS;AAMlB,IAAM,uBAAuB,EAAE,KAAK;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKD,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,qBAAqB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAClE,CAAC,EACA,OAAO;AAKH,IAAM,0BAA0B,EACpC,OAAO;AAAA,EACN,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAEpC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,aAAa,EACV,OAAO;AAAA,IACN,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5B,wBAAwB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACxC,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrC,CAAC,EACA,OAAO;AAAA,EACV,QAAQ,EACL,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,oBAAoB;AAAA,IACpC,OAAO,EACJ,OAAO;AAAA,MACN,cAAc,EACX,OAAO;AAAA,QACN,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACxB,CAAC,EACA,OAAO;AAAA,MACV,cAAc,EACX,OAAO;AAAA,QACN,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACxB,CAAC,EACA,OAAO,EACP,SAAS;AAAA,IACd,CAAC,EACA,OAAO;AAAA,IACV,gBAAgB,EACb,OAAO;AAAA,MACN,OAAO,EACJ,OAAO;AAAA,QACN,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,QACnC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,SAAS;AAAA,MACpD,CAAC,EACA,OAAO;AAAA,IACZ,CAAC,EACA,OAAO,EACP,SAAS;AAAA,IACZ,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAAA,EACrE,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;;;AD5EV,IAAM,uCAAuCC,GAAE,OAAO;AAAA,EACpD,SAASA,GAAE,QAAQ,IAAI;AAAA,EACvB,QAAQA,GAAE,OAAO;AAAA,IACf,oBAAoBA,GAAE,OAAO;AAAA,EAC/B,CAAC;AACH,CAAC;AAMD,eAAsB,4BACpB,QACA,aACA,kBACiB;AACjB,QAAM,YAAY,MAAM,wBAAwB,gBAAgB;AAChE,QAAM,iBAAiB,wBAAwB,UAAU,SAAS;AAClE,MAAI,CAAC,eAAe,SAAS;AAC3B,UAAM,IAAI;AAAA,MACR,0BAA0B,gBAAgB,MAAM,sBAAsB,eAAe,KAAK,CAAC;AAAA,IAC7F;AAAA,EACF;AACA,QAAM,EAAE,SAAS,SAAS,GAAG,SAAS,IAAI,eAAe;AACzD,QAAM,OAAO,eAAe,WAAW;AACvC,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,EAAE,SAAS,CAAC;AACrD,QAAM,SAAS,qCAAqC,MAAM,IAAI;AAC9D,SAAO,OAAO,OAAO;AACvB;AAEA,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EAC5C,SAASA,GAAE,QAAQ,IAAI;AAAA,EACvB,QAAQA,GAAE,OAAO;AAAA,IACf,oBAAoBA,GAAE,OAAO;AAAA,IAC7B,QAAQA,GAAE,QAAQ,kBAAkB;AAAA,EACtC,CAAC;AACH,CAAC;AAUD,eAAsB,iCACpB,QACA,aACwC;AACxC,QAAM,OAAO,eAAe,WAAW;AACvC,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,CAAC,CAAC;AAC3C,QAAM,SAAS,6BAA6B,MAAM,IAAI;AACtD,SAAO,OAAO;AAChB;","names":["z","z"]}
|