@tzurp/openapi-skills 1.2.5

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.
Files changed (83) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +230 -0
  3. package/bin/openapi-skills +4 -0
  4. package/dist/cli.d.ts +37 -0
  5. package/dist/cli.js +1646 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client-schema-builder.d.ts +35 -0
  8. package/dist/client-schema-builder.js +268 -0
  9. package/dist/client-schema-builder.js.map +1 -0
  10. package/dist/helper/base64url-json.d.ts +3 -0
  11. package/dist/helper/base64url-json.js +28 -0
  12. package/dist/helper/base64url-json.js.map +1 -0
  13. package/dist/helper/dotNotation.d.ts +3 -0
  14. package/dist/helper/dotNotation.js +34 -0
  15. package/dist/helper/dotNotation.js.map +1 -0
  16. package/dist/helper/endpoint-filter.d.ts +16 -0
  17. package/dist/helper/endpoint-filter.js +165 -0
  18. package/dist/helper/endpoint-filter.js.map +1 -0
  19. package/dist/helper/endpoint-utils.d.ts +2 -0
  20. package/dist/helper/endpoint-utils.js +10 -0
  21. package/dist/helper/endpoint-utils.js.map +1 -0
  22. package/dist/helper/error-codes.d.ts +27 -0
  23. package/dist/helper/error-codes.js +116 -0
  24. package/dist/helper/error-codes.js.map +1 -0
  25. package/dist/helper/error-formatter.d.ts +46 -0
  26. package/dist/helper/error-formatter.js +72 -0
  27. package/dist/helper/error-formatter.js.map +1 -0
  28. package/dist/helper/get-operation-filter.d.ts +17 -0
  29. package/dist/helper/get-operation-filter.js +26 -0
  30. package/dist/helper/get-operation-filter.js.map +1 -0
  31. package/dist/helper/graphql.d.ts +40 -0
  32. package/dist/helper/graphql.js +967 -0
  33. package/dist/helper/graphql.js.map +1 -0
  34. package/dist/helper/http-client.d.ts +28 -0
  35. package/dist/helper/http-client.js +90 -0
  36. package/dist/helper/http-client.js.map +1 -0
  37. package/dist/helper/json-updater.d.ts +17 -0
  38. package/dist/helper/json-updater.js +195 -0
  39. package/dist/helper/json-updater.js.map +1 -0
  40. package/dist/helper/logger.d.ts +13 -0
  41. package/dist/helper/logger.js +56 -0
  42. package/dist/helper/logger.js.map +1 -0
  43. package/dist/helper/output-size.d.ts +5 -0
  44. package/dist/helper/output-size.js +7 -0
  45. package/dist/helper/output-size.js.map +1 -0
  46. package/dist/helper/parameter-schema.d.ts +14 -0
  47. package/dist/helper/parameter-schema.js +36 -0
  48. package/dist/helper/parameter-schema.js.map +1 -0
  49. package/dist/helper/paths.d.ts +11 -0
  50. package/dist/helper/paths.js +47 -0
  51. package/dist/helper/paths.js.map +1 -0
  52. package/dist/helper/prompt-delete.d.ts +1 -0
  53. package/dist/helper/prompt-delete.js +13 -0
  54. package/dist/helper/prompt-delete.js.map +1 -0
  55. package/dist/helper/request-artifacts.d.ts +14 -0
  56. package/dist/helper/request-artifacts.js +60 -0
  57. package/dist/helper/request-artifacts.js.map +1 -0
  58. package/dist/helper/request-preparation.d.ts +23 -0
  59. package/dist/helper/request-preparation.js +85 -0
  60. package/dist/helper/request-preparation.js.map +1 -0
  61. package/dist/helper/sanitizer.d.ts +1 -0
  62. package/dist/helper/sanitizer.js +17 -0
  63. package/dist/helper/sanitizer.js.map +1 -0
  64. package/dist/helper/update-check.d.ts +1 -0
  65. package/dist/helper/update-check.js +36 -0
  66. package/dist/helper/update-check.js.map +1 -0
  67. package/dist/index.d.ts +50 -0
  68. package/dist/index.js +163 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/install-skill.d.ts +5 -0
  71. package/dist/install-skill.js +139 -0
  72. package/dist/install-skill.js.map +1 -0
  73. package/dist/parser.d.ts +12 -0
  74. package/dist/parser.js +393 -0
  75. package/dist/parser.js.map +1 -0
  76. package/dist/validate-response.d.ts +47 -0
  77. package/dist/validate-response.js +1017 -0
  78. package/dist/validate-response.js.map +1 -0
  79. package/package.json +63 -0
  80. package/skill-templates/SKILL.md +204 -0
  81. package/skill-templates/create-endpoint-test.md +413 -0
  82. package/skill-templates/http-client.md +141 -0
  83. package/skill-templates/write-client-code.md +219 -0
@@ -0,0 +1,47 @@
1
+ import path from "path";
2
+ import findRoot from "find-root";
3
+ const projectRoot = getProjectRoot();
4
+ export function getSchemaPath(apiName, schemaName) {
5
+ const schemasDir = getSchemasDir(apiName);
6
+ return path.join(schemasDir, `${schemaName}.json`);
7
+ }
8
+ export function getBundledPath(apiName) {
9
+ return path.resolve(projectRoot, ".openapi-skills", apiName, "bundled.json");
10
+ }
11
+ export function getComponentsPath(apiName) {
12
+ return path.resolve(projectRoot, ".openapi-skills", apiName, "components.json");
13
+ }
14
+ export function findRequestResponseDir(apiName, sanitizedOperationId) {
15
+ const schemasDir = getSchemasDir(apiName);
16
+ return path.resolve(schemasDir, sanitizedOperationId);
17
+ }
18
+ export function getSchemasDir(apiName) {
19
+ return path.resolve(projectRoot, ".openapi-skills", apiName, "schemas");
20
+ }
21
+ export function getApiDir(apiName) {
22
+ return path.resolve(projectRoot, ".openapi-skills", apiName);
23
+ }
24
+ export function getConfigPath() {
25
+ return path.resolve(projectRoot, ".openapi-skills", "config.json");
26
+ }
27
+ export function getEndpointsPath(apiName) {
28
+ return path.resolve(projectRoot, ".openapi-skills", apiName, "endpoints.json");
29
+ }
30
+ export function getOperationArtifactPath(apiName, sanitizedOperationId, artifactName) {
31
+ const requestResponseDir = findRequestResponseDir(apiName, sanitizedOperationId);
32
+ const fileName = artifactName === "response-schema" ? "response-schema.json" : `${artifactName}.json`;
33
+ return path.join(requestResponseDir, fileName);
34
+ }
35
+ export function getOpenapiToSkillsDir() {
36
+ return path.resolve(projectRoot, ".openapi-skills");
37
+ }
38
+ export function getProjectRoot() {
39
+ const cwd = process.cwd();
40
+ try {
41
+ return findRoot(cwd);
42
+ }
43
+ catch {
44
+ return cwd;
45
+ }
46
+ }
47
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/helper/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;AAOrC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,UAAkB;IAC/D,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAClF,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,oBAA4B;IAClF,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,oBAA4B,EAAE,YAAwD;IAC9I,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,YAAY,KAAK,iBAAiB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO,CAAC;IACtG,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function promptDeleteConfirmation(apiName: string): Promise<boolean>;
@@ -0,0 +1,13 @@
1
+ import readline from "readline";
2
+ export async function promptDeleteConfirmation(apiName) {
3
+ const prompt = `Are you sure you want to delete ${apiName}? Y/n `;
4
+ return await new Promise(resolve => {
5
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
6
+ rl.question(prompt, answer => {
7
+ rl.close();
8
+ const normalized = answer.trim().toLowerCase();
9
+ resolve(normalized === "y" || normalized === "yes");
10
+ });
11
+ });
12
+ }
13
+ //# sourceMappingURL=prompt-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-delete.js","sourceRoot":"","sources":["../../src/helper/prompt-delete.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAAe;IAC5D,MAAM,MAAM,GAAG,mCAAmC,OAAO,QAAQ,CAAC;IAClE,OAAO,MAAM,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;QAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,OAAO,CAAC,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type OperationArtifactName = "request" | "response" | "response-schema";
2
+ export declare function collectRequestJsonPaths(value: unknown, prefix?: string, out?: Set<string>): Set<string>;
3
+ export declare function collectUpdateRequestKeys(value: unknown, prefix?: string, out?: Set<string>): Set<string>;
4
+ export declare function resolveSelectedArtifact(options: {
5
+ request?: boolean;
6
+ response?: boolean;
7
+ responseSchema?: boolean;
8
+ }): {
9
+ artifactName: OperationArtifactName | undefined;
10
+ error: string;
11
+ } | {
12
+ artifactName: OperationArtifactName;
13
+ error: string | undefined;
14
+ };
@@ -0,0 +1,60 @@
1
+ export function collectRequestJsonPaths(value, prefix = "", out = new Set()) {
2
+ if (prefix) {
3
+ out.add(prefix);
4
+ }
5
+ if (!value || typeof value !== "object") {
6
+ return out;
7
+ }
8
+ if (Array.isArray(value)) {
9
+ for (let index = 0; index < value.length; index++) {
10
+ const childPath = prefix ? `${prefix}.${index}` : `${index}`;
11
+ collectRequestJsonPaths(value[index], childPath, out);
12
+ }
13
+ return out;
14
+ }
15
+ for (const [key, childValue] of Object.entries(value)) {
16
+ const childPath = prefix ? `${prefix}.${key}` : key;
17
+ collectRequestJsonPaths(childValue, childPath, out);
18
+ }
19
+ return out;
20
+ }
21
+ export function collectUpdateRequestKeys(value, prefix = "", out = new Set()) {
22
+ if (!value || typeof value !== "object") {
23
+ return out;
24
+ }
25
+ if (Array.isArray(value)) {
26
+ if (prefix) {
27
+ out.add(prefix);
28
+ }
29
+ return out;
30
+ }
31
+ for (const [key, childValue] of Object.entries(value)) {
32
+ const childPath = prefix ? `${prefix}.${key}` : key;
33
+ if (childValue && typeof childValue === "object" && !Array.isArray(childValue)) {
34
+ collectUpdateRequestKeys(childValue, childPath, out);
35
+ }
36
+ else {
37
+ out.add(childPath);
38
+ }
39
+ }
40
+ return out;
41
+ }
42
+ export function resolveSelectedArtifact(options) {
43
+ const selectedArtifacts = [];
44
+ if (options.request)
45
+ selectedArtifacts.push("request");
46
+ if (options.response)
47
+ selectedArtifacts.push("response");
48
+ if (options.responseSchema)
49
+ selectedArtifacts.push("response-schema");
50
+ if (selectedArtifacts.length !== 1) {
51
+ return {
52
+ artifactName: undefined,
53
+ error: selectedArtifacts.length === 0
54
+ ? "Exactly one of --request, --response, or --response-schema is required."
55
+ : "Only one of --request, --response, or --response-schema can be used at a time.",
56
+ };
57
+ }
58
+ return { artifactName: selectedArtifacts[0], error: undefined };
59
+ }
60
+ //# sourceMappingURL=request-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-artifacts.js","sourceRoot":"","sources":["../../src/helper/request-artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type RequestResponseMetadata = {
2
+ fileCount: number;
3
+ };
4
+ export type PreparedRequestOperation = RequestResponseMetadata & {
5
+ kind: "request-result";
6
+ apiName: string;
7
+ operationId: string;
8
+ sanitizedOperationId: string;
9
+ preparedOnly: true;
10
+ request: null;
11
+ response: null;
12
+ warnings: string[];
13
+ };
14
+ export declare function getRequestResponseMetadata(apiName: string, operationId: string): RequestResponseMetadata;
15
+ export declare function resolveMultiOperationIds(apiName: string, operationIds: string[]): Promise<Array<{
16
+ operationId: string;
17
+ sanitizedOperationId: string;
18
+ }>>;
19
+ export declare function prepareMultiOperationRequests(apiName: string, operationIds: string[], force?: boolean): Promise<{
20
+ operations: PreparedRequestOperation[];
21
+ summaryText: string;
22
+ payload: Record<string, unknown>;
23
+ }>;
@@ -0,0 +1,85 @@
1
+ import fs from "fs-extra";
2
+ import { ensureEndpointSchemaFile } from "../parser.js";
3
+ import { listApis } from "../index.js";
4
+ import { getSanitizedOperationId } from "./endpoint-utils.js";
5
+ import { findRequestResponseDir } from "./paths.js";
6
+ import { prepareRequestTemplate } from "../validate-response.js";
7
+ export function getRequestResponseMetadata(apiName, operationId) {
8
+ const requestResponseDir = findRequestResponseDir(apiName, operationId);
9
+ const fileCount = fs.existsSync(requestResponseDir)
10
+ ? fs.readdirSync(requestResponseDir).length
11
+ : 0;
12
+ return {
13
+ fileCount,
14
+ };
15
+ }
16
+ export async function resolveMultiOperationIds(apiName, operationIds) {
17
+ const seen = new Set();
18
+ const duplicates = new Set();
19
+ for (const operationId of operationIds) {
20
+ if (seen.has(operationId)) {
21
+ duplicates.add(operationId);
22
+ }
23
+ seen.add(operationId);
24
+ }
25
+ if (duplicates.size > 0) {
26
+ throw new Error(`Duplicate operationId(s) are not allowed in prepare-only mode: ${Array.from(duplicates).join(", ")}`);
27
+ }
28
+ const apis = await listApis();
29
+ if (!Array.isArray(apis) || !apis.includes(apiName)) {
30
+ throw new Error(`API '${apiName}' is not installed. Run generate first.`);
31
+ }
32
+ const resolved = [];
33
+ for (const operationId of operationIds) {
34
+ const sanitizedOperationId = await getSanitizedOperationId(apiName, operationId);
35
+ if (!sanitizedOperationId) {
36
+ throw new Error(`OperationId '${operationId}' was not found for API '${apiName}'.`);
37
+ }
38
+ resolved.push({ operationId, sanitizedOperationId });
39
+ }
40
+ return resolved;
41
+ }
42
+ export async function prepareMultiOperationRequests(apiName, operationIds, force = false) {
43
+ const resolvedOperationIds = await resolveMultiOperationIds(apiName, operationIds);
44
+ const operations = [];
45
+ for (const { operationId, sanitizedOperationId } of resolvedOperationIds) {
46
+ await ensureEndpointSchemaFile(apiName, operationId, sanitizedOperationId);
47
+ await prepareRequestTemplate(apiName, sanitizedOperationId, force);
48
+ const metadata = getRequestResponseMetadata(apiName, sanitizedOperationId);
49
+ operations.push({
50
+ kind: "request-result",
51
+ apiName,
52
+ operationId,
53
+ sanitizedOperationId,
54
+ preparedOnly: true,
55
+ request: null,
56
+ response: null,
57
+ warnings: [],
58
+ ...metadata,
59
+ });
60
+ }
61
+ const summaryLines = [
62
+ `Prepared request templates for ${operations.length} operations:`,
63
+ "",
64
+ ...operations.map(operation => ` ✓ ${operation.operationId}`),
65
+ "",
66
+ "No live requests were executed.",
67
+ "Use `openapi-skills request <operationId> --force --update-request ...` with only flattened object dot-notation keys to run each step.",
68
+ ];
69
+ const payload = {
70
+ kind: "request-result",
71
+ apiName,
72
+ preparedOnly: true,
73
+ operationIds,
74
+ summary: summaryLines,
75
+ message: "No live requests were executed.",
76
+ hint: "Use `openapi-skills request <operationId> --force --update-request ...` with only flattened object dot-notation keys to run each step.",
77
+ operations,
78
+ };
79
+ return {
80
+ operations,
81
+ summaryText: summaryLines.join("\n"),
82
+ payload,
83
+ };
84
+ }
85
+ //# sourceMappingURL=request-preparation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-preparation.js","sourceRoot":"","sources":["../../src/helper/request-preparation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function sanitizeOperationPath(name: string): string;
@@ -0,0 +1,17 @@
1
+ export function sanitizeOperationPath(name) {
2
+ const normalized = name
3
+ .normalize("NFKD")
4
+ .replace(/[\\/]/g, "_");
5
+ const segments = normalized.split("_");
6
+ const sanitizedSegments = segments.map(seg => {
7
+ if (seg === "") {
8
+ return "_";
9
+ }
10
+ seg = seg.replace(/\./g, "_");
11
+ seg = seg.replace(/[^a-zA-Z0-9_-]/g, "_");
12
+ seg = seg.replace(/^_+|_+$/g, "");
13
+ return seg || "_";
14
+ });
15
+ return sanitizedSegments.join("_");
16
+ }
17
+ //# sourceMappingURL=sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../src/helper/sanitizer.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAE9C,MAAM,UAAU,GAAG,IAAI;SAClB,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAG5B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEvC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAEzC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACb,OAAO,GAAG,CAAC;QACf,CAAC;QAGD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAG9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAG1C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAGlC,OAAO,GAAG,IAAI,GAAG,CAAC;IACtB,CAAC,CAAC,CAAC;IAGH,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function checkForUpdateOncePerTerminalSession(currentVersion: string): Promise<void>;
@@ -0,0 +1,36 @@
1
+ import fs from "fs-extra";
2
+ import https from "https";
3
+ import os from "os";
4
+ import path from "path";
5
+ import { logger } from "./logger.js";
6
+ export async function checkForUpdateOncePerTerminalSession(currentVersion) {
7
+ try {
8
+ const sessionId = String(process.ppid);
9
+ const sessionFile = path.join(os.tmpdir(), `openapi-skills-session-${sessionId}`);
10
+ if (fs.existsSync(sessionFile))
11
+ return;
12
+ fs.writeFileSync(sessionFile, String(Date.now()));
13
+ const latestVersion = await new Promise((resolve, reject) => {
14
+ https.get("https://registry.npmjs.org/@tzurp/openapi-skills/latest", res => {
15
+ let data = "";
16
+ res.on("data", chunk => (data += chunk));
17
+ res.on("end", () => {
18
+ try {
19
+ const json = JSON.parse(data);
20
+ resolve(json.version);
21
+ }
22
+ catch (error) {
23
+ reject(error);
24
+ }
25
+ });
26
+ }).on("error", reject);
27
+ });
28
+ if (latestVersion && latestVersion !== currentVersion) {
29
+ logger.warn(`UPDATE_AVAILABLE: A newer version of openapi-skills is available → ${latestVersion} (current: ${currentVersion})`);
30
+ logger.warn("Update with: npm install -g @tzurp/openapi-skills");
31
+ }
32
+ }
33
+ catch {
34
+ }
35
+ }
36
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/helper/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,oCAAoC,CAAC,cAAsB;IAC/E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,0BAA0B,SAAS,EAAE,CAAC,CAAC;QAElF,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO;QAEvC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAElD,MAAM,aAAa,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClE,KAAK,CAAC,GAAG,CAAC,yDAAyD,EAAE,GAAG,CAAC,EAAE;gBACzE,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;gBACzC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACjB,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC9B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,aAAa,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,sEAAsE,aAAa,cAAc,cAAc,GAAG,CAAC,CAAC;YAChI,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ type ConfigField = "version" | "baseUrl" | "authHeaders" | "vars";
2
+ type UpdateConfigOptions = {
3
+ version?: string;
4
+ openapiSource?: string;
5
+ schemaType?: "openapi" | "graphql";
6
+ baseUrl?: string;
7
+ auth?: Record<string, string>;
8
+ vars?: Record<string, string>;
9
+ removeApi?: boolean;
10
+ };
11
+ export type DeleteApiResult = {
12
+ ok: true;
13
+ message: string;
14
+ data: {
15
+ removedApi: string;
16
+ };
17
+ } | {
18
+ ok: false;
19
+ error: {
20
+ type: string;
21
+ message: string;
22
+ };
23
+ };
24
+ export interface ApiConfig {
25
+ version?: string;
26
+ openapiSource?: string;
27
+ schemaType?: "openapi" | "graphql";
28
+ baseUrl?: string;
29
+ auth?: {
30
+ headers?: Record<string, string>;
31
+ };
32
+ vars?: Record<string, string>;
33
+ }
34
+ export interface ConfigType {
35
+ apis: Record<string, ApiConfig>;
36
+ }
37
+ export declare function loadConfig(): Promise<ConfigType>;
38
+ export declare function ensureConfig(): Promise<void>;
39
+ export declare function updateConfig(apiName: string, options?: UpdateConfigOptions): Promise<void>;
40
+ export declare function deleteApi(apiName: string): Promise<DeleteApiResult>;
41
+ export declare function getConfigValue(apiName: string, key: ConfigField): Promise<string | [string, string][] | Record<string, string> | undefined>;
42
+ export declare function listEndpoints(apiName: string): Promise<Array<Record<string, any>>>;
43
+ export declare function listApis(): Promise<string[]>;
44
+ export type ApiNotFoundResult = {
45
+ kind: "api-not-found";
46
+ apiName: string;
47
+ message: string;
48
+ };
49
+ export declare function getApiNotFoundResult(apiName: string): Promise<ApiNotFoundResult | null>;
50
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,163 @@
1
+ import { readFile } from "fs/promises";
2
+ import path from "path";
3
+ import fs from "fs-extra";
4
+ import { updateJsonFile } from "./helper/json-updater.js";
5
+ import { getApiDir, getConfigPath, getEndpointsPath, getOpenapiToSkillsDir } from "./helper/paths.js";
6
+ const openapiSkillsDir = getOpenapiToSkillsDir();
7
+ const configPath = getConfigPath();
8
+ export async function loadConfig() {
9
+ return await fs.readJSON(configPath);
10
+ }
11
+ export async function ensureConfig() {
12
+ await fs.ensureDir(openapiSkillsDir);
13
+ if (!(await fs.pathExists(configPath))) {
14
+ const defaultConfig = {
15
+ apis: {}
16
+ };
17
+ await fs.writeJson(configPath, defaultConfig, { spaces: 2 });
18
+ }
19
+ }
20
+ function isPlainObject(value) {
21
+ return typeof value === "object" && value !== null && !Array.isArray(value);
22
+ }
23
+ export async function updateConfig(apiName, options = {}) {
24
+ if (typeof apiName !== "string" || apiName.trim().length === 0) {
25
+ throw new Error("API name is required.");
26
+ }
27
+ const { baseUrl, auth, vars, version, openapiSource, schemaType, removeApi } = options;
28
+ const updates = {};
29
+ if (removeApi) {
30
+ if (!(await fs.pathExists(configPath))) {
31
+ throw new Error("Config file not found.");
32
+ }
33
+ const config = await loadConfig();
34
+ if (!isPlainObject(config) || !isPlainObject(config.apis)) {
35
+ throw new Error("Invalid config file.");
36
+ }
37
+ if (!(apiName in config.apis)) {
38
+ throw new Error(`API '${apiName}' not found`);
39
+ }
40
+ delete config.apis[apiName];
41
+ await fs.writeJson(configPath, config, { spaces: 2 });
42
+ return;
43
+ }
44
+ await ensureConfig();
45
+ if (auth !== undefined) {
46
+ updates[`apis.${apiName}.auth.headers`] = auth;
47
+ }
48
+ if (vars !== undefined) {
49
+ for (const [key, value] of Object.entries(vars)) {
50
+ updates[`apis.${apiName}.vars.${key}`] = value;
51
+ }
52
+ }
53
+ if (version !== undefined) {
54
+ updates[`apis.${apiName}.version`] = version;
55
+ }
56
+ if (openapiSource !== undefined) {
57
+ let normalizedOpenapiSource = openapiSource;
58
+ try {
59
+ new URL(openapiSource);
60
+ }
61
+ catch {
62
+ normalizedOpenapiSource = path.normalize(openapiSource);
63
+ }
64
+ updates[`apis.${apiName}.openapiSource`] = normalizedOpenapiSource;
65
+ }
66
+ if (baseUrl !== undefined) {
67
+ updates[`apis.${apiName}.baseUrl`] = baseUrl;
68
+ }
69
+ if (schemaType !== undefined) {
70
+ updates[`apis.${apiName}.schemaType`] = schemaType;
71
+ }
72
+ if (Object.keys(updates).length === 0)
73
+ return;
74
+ await updateJsonFile(configPath, updates, 2);
75
+ }
76
+ function toDeleteApiError(error) {
77
+ const message = error instanceof Error ? error.message : String(error);
78
+ if (/config/i.test(message)) {
79
+ return { type: "ConfigError", message };
80
+ }
81
+ if (/permission|EACCES|EPERM/i.test(message)) {
82
+ return { type: "DirectoryDeletionError", message };
83
+ }
84
+ return { type: "DeleteApiError", message };
85
+ }
86
+ export async function deleteApi(apiName) {
87
+ if (typeof apiName !== "string" || apiName.trim().length === 0) {
88
+ return {
89
+ ok: false,
90
+ error: { type: "InvalidApiName", message: "API name is required." },
91
+ };
92
+ }
93
+ try {
94
+ const apiNames = await listApis();
95
+ if (!apiNames.includes(apiName)) {
96
+ return {
97
+ ok: false,
98
+ error: { type: "ApiNotFound", message: `API '${apiName}' is not installed.` },
99
+ };
100
+ }
101
+ await updateConfig(apiName, { removeApi: true });
102
+ const apiDir = getApiDir(apiName);
103
+ await fs.remove(apiDir);
104
+ return {
105
+ ok: true,
106
+ message: `API ${apiName} removed successfully`,
107
+ data: { removedApi: apiName },
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ ok: false,
113
+ error: toDeleteApiError(error),
114
+ };
115
+ }
116
+ }
117
+ export async function getConfigValue(apiName, key) {
118
+ const config = await loadConfig();
119
+ const api = config.apis[apiName];
120
+ if (!api) {
121
+ throw new Error(`API '${apiName}' not found`);
122
+ }
123
+ switch (key) {
124
+ case "version":
125
+ return api.version ?? "unknown";
126
+ case "baseUrl":
127
+ return api.baseUrl;
128
+ case "authHeaders":
129
+ return api.auth?.headers ?? {};
130
+ case "vars":
131
+ return Object.entries(api.vars ?? {});
132
+ }
133
+ }
134
+ export async function listEndpoints(apiName) {
135
+ try {
136
+ const endpoints = await readFile(getEndpointsPath(apiName), "utf-8");
137
+ return JSON.parse(endpoints);
138
+ }
139
+ catch (error) {
140
+ if (error instanceof SyntaxError) {
141
+ throw new Error(`Failed to parse endpoints.json: Invalid JSON format. ${error.message}`);
142
+ }
143
+ else {
144
+ throw new Error(`Failed to read endpoints.json: ${error instanceof Error ? error.message : String(error)}`);
145
+ }
146
+ }
147
+ }
148
+ export async function listApis() {
149
+ const config = await loadConfig();
150
+ return Object.keys(config.apis) || [];
151
+ }
152
+ export async function getApiNotFoundResult(apiName) {
153
+ const apiNames = await listApis().catch(() => []);
154
+ if (apiNames.includes(apiName)) {
155
+ return null;
156
+ }
157
+ return {
158
+ kind: "api-not-found",
159
+ apiName,
160
+ message: `No API named '${apiName}' found. If it is not a misspelling please generate it first with: openapi-skills generate <openapi-source> [options].`,
161
+ };
162
+ }
163
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAgB,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEtG,MAAM,gBAAgB,GAAG,qBAAqB,EAAE,CAAC;AACjD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AAuCnC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,YAAY;IAEhC,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAGrC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,aAAa,GAAe;YAChC,IAAI,EAAE,EAAE;SACT,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,OAAO,GAAwB,EAAE;IACnF,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACvF,MAAM,OAAO,GAAY,EAAE,CAAC;IAE5B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,aAAa,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,YAAY,EAAE,CAAC;IACrB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,QAAQ,OAAO,eAAe,CAAC,GAAG,IAAI,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,QAAQ,OAAO,SAAS,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QACjD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,QAAQ,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC;IAC/C,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,uBAAuB,GAAG,aAAa,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,QAAQ,OAAO,gBAAgB,CAAC,GAAG,uBAAuB,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,QAAQ,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC;IAC/C,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,QAAQ,OAAO,aAAa,CAAC,GAAG,UAAU,CAAC;IACrD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9C,MAAM,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uBAAuB,EAAE;SACpE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,OAAO,qBAAqB,EAAE;aAC9E,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAExB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,OAAO,OAAO,uBAAuB;YAC9C,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;SAC/B,CAAC;IACJ,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,GAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;QAElC,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,OAAO,CAAC;QAErB,KAAK,aAAa;YAChB,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;QAEjC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wDAAwD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,MAAM,QAAQ,GAAG,MAAM,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO;QACP,OAAO,EAAE,iBAAiB,OAAO,wHAAwH;KAC1J,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function promptInstallLocation(rootDir: string, defaultPath: string): Promise<string>;
2
+ export declare function installSkillBundle(srcDir: string, destDir: string): Promise<{
3
+ destDir: string;
4
+ files: string[];
5
+ }>;