@autonav/core 1.0.0

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 (142) hide show
  1. package/README.md +115 -0
  2. package/dist/adapter/claude-adapter.d.ts +136 -0
  3. package/dist/adapter/claude-adapter.d.ts.map +1 -0
  4. package/dist/adapter/claude-adapter.js +340 -0
  5. package/dist/adapter/claude-adapter.js.map +1 -0
  6. package/dist/adapter/index.d.ts +7 -0
  7. package/dist/adapter/index.d.ts.map +1 -0
  8. package/dist/adapter/index.js +7 -0
  9. package/dist/adapter/index.js.map +1 -0
  10. package/dist/cli/autonav.d.ts +11 -0
  11. package/dist/cli/autonav.d.ts.map +1 -0
  12. package/dist/cli/autonav.js +79 -0
  13. package/dist/cli/autonav.js.map +1 -0
  14. package/dist/cli/nav-chat.d.ts +3 -0
  15. package/dist/cli/nav-chat.d.ts.map +1 -0
  16. package/dist/cli/nav-chat.js +151 -0
  17. package/dist/cli/nav-chat.js.map +1 -0
  18. package/dist/cli/nav-init.d.ts +3 -0
  19. package/dist/cli/nav-init.d.ts.map +1 -0
  20. package/dist/cli/nav-init.js +366 -0
  21. package/dist/cli/nav-init.js.map +1 -0
  22. package/dist/cli/nav-query.d.ts +3 -0
  23. package/dist/cli/nav-query.d.ts.map +1 -0
  24. package/dist/cli/nav-query.js +217 -0
  25. package/dist/cli/nav-query.js.map +1 -0
  26. package/dist/conversation/App.d.ts +14 -0
  27. package/dist/conversation/App.d.ts.map +1 -0
  28. package/dist/conversation/App.js +229 -0
  29. package/dist/conversation/App.js.map +1 -0
  30. package/dist/conversation/index.d.ts +29 -0
  31. package/dist/conversation/index.d.ts.map +1 -0
  32. package/dist/conversation/index.js +44 -0
  33. package/dist/conversation/index.js.map +1 -0
  34. package/dist/conversation/prompts.d.ts +9 -0
  35. package/dist/conversation/prompts.d.ts.map +1 -0
  36. package/dist/conversation/prompts.js +47 -0
  37. package/dist/conversation/prompts.js.map +1 -0
  38. package/dist/index.d.ts +13 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +24 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/interview/App.d.ts +14 -0
  43. package/dist/interview/App.d.ts.map +1 -0
  44. package/dist/interview/App.js +159 -0
  45. package/dist/interview/App.js.map +1 -0
  46. package/dist/interview/index.d.ts +30 -0
  47. package/dist/interview/index.d.ts.map +1 -0
  48. package/dist/interview/index.js +52 -0
  49. package/dist/interview/index.js.map +1 -0
  50. package/dist/interview/prompts.d.ts +36 -0
  51. package/dist/interview/prompts.d.ts.map +1 -0
  52. package/dist/interview/prompts.js +116 -0
  53. package/dist/interview/prompts.js.map +1 -0
  54. package/dist/pack-installer/github.d.ts +41 -0
  55. package/dist/pack-installer/github.d.ts.map +1 -0
  56. package/dist/pack-installer/github.js +294 -0
  57. package/dist/pack-installer/github.js.map +1 -0
  58. package/dist/pack-installer/index.d.ts +57 -0
  59. package/dist/pack-installer/index.d.ts.map +1 -0
  60. package/dist/pack-installer/index.js +257 -0
  61. package/dist/pack-installer/index.js.map +1 -0
  62. package/dist/plugins/config-schema.d.ts +32 -0
  63. package/dist/plugins/config-schema.d.ts.map +1 -0
  64. package/dist/plugins/config-schema.js +26 -0
  65. package/dist/plugins/config-schema.js.map +1 -0
  66. package/dist/plugins/implementations/file-watcher/index.d.ts +110 -0
  67. package/dist/plugins/implementations/file-watcher/index.d.ts.map +1 -0
  68. package/dist/plugins/implementations/file-watcher/index.js +212 -0
  69. package/dist/plugins/implementations/file-watcher/index.js.map +1 -0
  70. package/dist/plugins/implementations/github/index.d.ts +201 -0
  71. package/dist/plugins/implementations/github/index.d.ts.map +1 -0
  72. package/dist/plugins/implementations/github/index.js +337 -0
  73. package/dist/plugins/implementations/github/index.js.map +1 -0
  74. package/dist/plugins/implementations/slack/index.d.ts +153 -0
  75. package/dist/plugins/implementations/slack/index.d.ts.map +1 -0
  76. package/dist/plugins/implementations/slack/index.js +221 -0
  77. package/dist/plugins/implementations/slack/index.js.map +1 -0
  78. package/dist/plugins/index.d.ts +23 -0
  79. package/dist/plugins/index.d.ts.map +1 -0
  80. package/dist/plugins/index.js +35 -0
  81. package/dist/plugins/index.js.map +1 -0
  82. package/dist/plugins/plugin-manager.d.ts +66 -0
  83. package/dist/plugins/plugin-manager.d.ts.map +1 -0
  84. package/dist/plugins/plugin-manager.js +198 -0
  85. package/dist/plugins/plugin-manager.js.map +1 -0
  86. package/dist/plugins/types.d.ts +102 -0
  87. package/dist/plugins/types.d.ts.map +1 -0
  88. package/dist/plugins/types.js +38 -0
  89. package/dist/plugins/types.js.map +1 -0
  90. package/dist/plugins/utils/security.d.ts +43 -0
  91. package/dist/plugins/utils/security.d.ts.map +1 -0
  92. package/dist/plugins/utils/security.js +115 -0
  93. package/dist/plugins/utils/security.js.map +1 -0
  94. package/dist/query-engine/index.d.ts +10 -0
  95. package/dist/query-engine/index.d.ts.map +1 -0
  96. package/dist/query-engine/index.js +10 -0
  97. package/dist/query-engine/index.js.map +1 -0
  98. package/dist/query-engine/navigator-loader.d.ts +37 -0
  99. package/dist/query-engine/navigator-loader.d.ts.map +1 -0
  100. package/dist/query-engine/navigator-loader.js +167 -0
  101. package/dist/query-engine/navigator-loader.js.map +1 -0
  102. package/dist/query-engine/output-formatter.d.ts +55 -0
  103. package/dist/query-engine/output-formatter.d.ts.map +1 -0
  104. package/dist/query-engine/output-formatter.js +165 -0
  105. package/dist/query-engine/output-formatter.js.map +1 -0
  106. package/dist/query-engine/response-validator.d.ts +55 -0
  107. package/dist/query-engine/response-validator.d.ts.map +1 -0
  108. package/dist/query-engine/response-validator.js +92 -0
  109. package/dist/query-engine/response-validator.js.map +1 -0
  110. package/dist/templates/.gitignore.template +23 -0
  111. package/dist/templates/CLAUDE-pack.md.template +32 -0
  112. package/dist/templates/CLAUDE.md.template +128 -0
  113. package/dist/templates/README.md.template +174 -0
  114. package/dist/templates/config-pack.json.template +16 -0
  115. package/dist/templates/config.json.template +11 -0
  116. package/dist/templates/index.d.ts +22 -0
  117. package/dist/templates/index.d.ts.map +1 -0
  118. package/dist/templates/index.js +32 -0
  119. package/dist/templates/index.js.map +1 -0
  120. package/dist/templates/plugins.json.template +33 -0
  121. package/dist/templates/system-configuration.md.template +66 -0
  122. package/dist/tools/handler.d.ts +20 -0
  123. package/dist/tools/handler.d.ts.map +1 -0
  124. package/dist/tools/handler.js +202 -0
  125. package/dist/tools/handler.js.map +1 -0
  126. package/dist/tools/index.d.ts +10 -0
  127. package/dist/tools/index.d.ts.map +1 -0
  128. package/dist/tools/index.js +10 -0
  129. package/dist/tools/index.js.map +1 -0
  130. package/dist/tools/response.d.ts +30 -0
  131. package/dist/tools/response.d.ts.map +1 -0
  132. package/dist/tools/response.js +68 -0
  133. package/dist/tools/response.js.map +1 -0
  134. package/dist/tools/self-config.d.ts +54 -0
  135. package/dist/tools/self-config.d.ts.map +1 -0
  136. package/dist/tools/self-config.js +84 -0
  137. package/dist/tools/self-config.js.map +1 -0
  138. package/dist/validation/index.d.ts +19 -0
  139. package/dist/validation/index.d.ts.map +1 -0
  140. package/dist/validation/index.js +91 -0
  141. package/dist/validation/index.js.map +1 -0
  142. package/package.json +71 -0
@@ -0,0 +1,294 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ /**
5
+ * Parse a GitHub folder URL into components
6
+ *
7
+ * Supports formats:
8
+ * - https://github.com/owner/repo/tree/main/path/to/folder
9
+ * - https://github.com/owner/repo/tree/v1.0.0/path/to/folder
10
+ * - github:owner/repo/path/to/folder (defaults to main branch)
11
+ * - github:owner/repo/path/to/folder@v1.0.0
12
+ * - git@github.com:owner/repo/path/to/folder (SSH)
13
+ * - git@github.com:owner/repo/path/to/folder@v1.0.0 (SSH with ref)
14
+ *
15
+ * @param url - GitHub URL to parse
16
+ * @returns Parsed URL components or null if not a valid GitHub URL
17
+ */
18
+ export function parseGitHubUrl(url) {
19
+ // Handle SSH URLs: git@github.com:owner/repo/path/to/folder[@ref]
20
+ if (url.startsWith("git@github.com:")) {
21
+ const sshPart = url.slice(15); // Remove "git@github.com:"
22
+ // Check for @ref suffix (but not in the middle of a path)
23
+ const atIndex = sshPart.lastIndexOf("@");
24
+ let pathPart;
25
+ let ref = "main";
26
+ if (atIndex > 0) {
27
+ pathPart = sshPart.slice(0, atIndex);
28
+ ref = sshPart.slice(atIndex + 1);
29
+ }
30
+ else {
31
+ pathPart = sshPart;
32
+ }
33
+ // Remove .git suffix if present
34
+ pathPart = pathPart.replace(/\.git$/, "");
35
+ // Split into owner/repo/path
36
+ const parts = pathPart.split("/");
37
+ if (parts.length < 2) {
38
+ return null;
39
+ }
40
+ const owner = parts[0];
41
+ const repo = parts[1];
42
+ const folderPath = parts.slice(2).join("/");
43
+ if (!owner || !repo) {
44
+ return null;
45
+ }
46
+ return { owner, repo, ref, path: folderPath, useSsh: true };
47
+ }
48
+ // Handle github: shorthand
49
+ if (url.startsWith("github:")) {
50
+ const shorthand = url.slice(7); // Remove "github:"
51
+ // Check for @ref suffix
52
+ const atIndex = shorthand.lastIndexOf("@");
53
+ let pathPart;
54
+ let ref = "main";
55
+ if (atIndex > 0) {
56
+ pathPart = shorthand.slice(0, atIndex);
57
+ ref = shorthand.slice(atIndex + 1);
58
+ }
59
+ else {
60
+ pathPart = shorthand;
61
+ }
62
+ // Split into owner/repo/path
63
+ const parts = pathPart.split("/");
64
+ if (parts.length < 2) {
65
+ return null;
66
+ }
67
+ const owner = parts[0];
68
+ const repo = parts[1];
69
+ const folderPath = parts.slice(2).join("/");
70
+ if (!owner || !repo) {
71
+ return null;
72
+ }
73
+ return { owner, repo, ref, path: folderPath, useSsh: false };
74
+ }
75
+ // Handle full GitHub URLs
76
+ // https://github.com/owner/repo/tree/ref/path/to/folder
77
+ const treeMatch = url.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)(?:\/(.*))?$/);
78
+ if (treeMatch) {
79
+ const [, owner, repo, ref, folderPath] = treeMatch;
80
+ if (!owner || !repo || !ref) {
81
+ return null;
82
+ }
83
+ return {
84
+ owner,
85
+ repo,
86
+ ref,
87
+ path: folderPath || "",
88
+ useSsh: false,
89
+ };
90
+ }
91
+ // Handle repo root URLs (no tree/ref)
92
+ // https://github.com/owner/repo
93
+ const repoMatch = url.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+)\/?$/);
94
+ if (repoMatch) {
95
+ const [, owner, repo] = repoMatch;
96
+ if (!owner || !repo) {
97
+ return null;
98
+ }
99
+ return {
100
+ owner,
101
+ repo,
102
+ ref: "main",
103
+ path: "",
104
+ useSsh: false,
105
+ };
106
+ }
107
+ return null;
108
+ }
109
+ /**
110
+ * Check if a string is a GitHub URL
111
+ */
112
+ export function isGitHubUrl(url) {
113
+ return (url.startsWith("github:") ||
114
+ url.startsWith("git@github.com:") ||
115
+ url.startsWith("https://github.com/") ||
116
+ url.startsWith("http://github.com/"));
117
+ }
118
+ /**
119
+ * Fetch contents of a GitHub folder using git sparse-checkout (SSH or HTTPS)
120
+ *
121
+ * @param info - Parsed GitHub URL info
122
+ * @param targetDir - Directory to write files to
123
+ * @param onProgress - Optional progress callback
124
+ */
125
+ async function fetchGitHubFolderViaGit(info, targetDir, onProgress) {
126
+ const { owner, repo, ref, path: folderPath, useSsh } = info;
127
+ // Build the git remote URL
128
+ const repoUrl = useSsh
129
+ ? `git@github.com:${owner}/${repo}.git`
130
+ : `https://github.com/${owner}/${repo}.git`;
131
+ onProgress?.(`Cloning via ${useSsh ? "SSH" : "HTTPS"} from ${owner}/${repo}@${ref}`);
132
+ // Create a temp directory for the git clone
133
+ const gitTempDir = fs.mkdtempSync(path.join(targetDir, ".git-clone-"));
134
+ try {
135
+ // Clone with sparse checkout (minimal download)
136
+ execSync(`git clone --depth 1 --filter=blob:none --sparse "${repoUrl}" "${gitTempDir}" --branch "${ref}"`, { stdio: "pipe" });
137
+ // If we have a specific path, use sparse-checkout to get only that folder
138
+ if (folderPath) {
139
+ execSync(`git -C "${gitTempDir}" sparse-checkout set "${folderPath}"`, {
140
+ stdio: "pipe",
141
+ });
142
+ onProgress?.(`Checked out ${folderPath}`);
143
+ }
144
+ else {
145
+ // Get everything
146
+ execSync(`git -C "${gitTempDir}" sparse-checkout disable`, {
147
+ stdio: "pipe",
148
+ });
149
+ }
150
+ // Copy files from the cloned folder to target directory
151
+ const sourceDir = folderPath
152
+ ? path.join(gitTempDir, folderPath)
153
+ : gitTempDir;
154
+ if (!fs.existsSync(sourceDir)) {
155
+ throw new Error(`Path "${folderPath}" not found in repository`);
156
+ }
157
+ // Copy all files except .git
158
+ const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
159
+ for (const entry of entries) {
160
+ if (entry.name === ".git")
161
+ continue;
162
+ const srcPath = path.join(sourceDir, entry.name);
163
+ const destPath = path.join(targetDir, entry.name);
164
+ if (entry.isDirectory()) {
165
+ copyDirectoryRecursive(srcPath, destPath);
166
+ }
167
+ else {
168
+ fs.copyFileSync(srcPath, destPath);
169
+ }
170
+ onProgress?.(`Copied ${entry.name}`);
171
+ }
172
+ }
173
+ finally {
174
+ // Clean up git clone
175
+ fs.rmSync(gitTempDir, { recursive: true, force: true });
176
+ }
177
+ }
178
+ /**
179
+ * Recursively copy a directory
180
+ */
181
+ function copyDirectoryRecursive(src, dest) {
182
+ fs.mkdirSync(dest, { recursive: true });
183
+ const entries = fs.readdirSync(src, { withFileTypes: true });
184
+ for (const entry of entries) {
185
+ const srcPath = path.join(src, entry.name);
186
+ const destPath = path.join(dest, entry.name);
187
+ if (entry.isDirectory()) {
188
+ copyDirectoryRecursive(srcPath, destPath);
189
+ }
190
+ else {
191
+ fs.copyFileSync(srcPath, destPath);
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * Fetch contents of a GitHub folder recursively
197
+ *
198
+ * Uses git sparse-checkout for SSH URLs (or when API fails),
199
+ * otherwise uses GitHub Contents API for HTTPS.
200
+ *
201
+ * @param info - Parsed GitHub URL info
202
+ * @param targetDir - Directory to write files to
203
+ * @param onProgress - Optional progress callback
204
+ */
205
+ export async function fetchGitHubFolder(info, targetDir, onProgress) {
206
+ const { owner, repo, ref, path: folderPath, useSsh } = info;
207
+ // Use git for SSH URLs (required for auth) or if explicitly requested
208
+ if (useSsh) {
209
+ return fetchGitHubFolderViaGit(info, targetDir, onProgress);
210
+ }
211
+ // Try API first for HTTPS (faster for small repos, no git dependency)
212
+ onProgress?.(`Fetching from github.com/${owner}/${repo}/${folderPath || "(root)"}@${ref}`);
213
+ // Use GitHub Contents API
214
+ const apiUrl = folderPath
215
+ ? `https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}?ref=${ref}`
216
+ : `https://api.github.com/repos/${owner}/${repo}/contents?ref=${ref}`;
217
+ await fetchContentsRecursive(apiUrl, targetDir, "", onProgress);
218
+ }
219
+ /**
220
+ * Recursively fetch contents from GitHub API
221
+ */
222
+ async function fetchContentsRecursive(apiUrl, targetDir, relativePath, onProgress) {
223
+ const headers = {
224
+ Accept: "application/vnd.github.v3+json",
225
+ "User-Agent": "autonav-cli",
226
+ };
227
+ // Use GITHUB_TOKEN if available for higher rate limits
228
+ const token = process.env.GITHUB_TOKEN;
229
+ if (token) {
230
+ headers.Authorization = `Bearer ${token}`;
231
+ }
232
+ const response = await fetch(apiUrl, { headers });
233
+ if (!response.ok) {
234
+ if (response.status === 404) {
235
+ throw new Error(`GitHub path not found. Check that the repository, branch, and path exist.`);
236
+ }
237
+ if (response.status === 403) {
238
+ const rateLimitRemaining = response.headers.get("x-ratelimit-remaining");
239
+ if (rateLimitRemaining === "0") {
240
+ throw new Error("GitHub API rate limit exceeded. Set GITHUB_TOKEN environment variable for higher limits.");
241
+ }
242
+ }
243
+ throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
244
+ }
245
+ const rawContents = await response.json();
246
+ // Handle single file response (when path points to a file, not directory)
247
+ if (!Array.isArray(rawContents)) {
248
+ throw new Error("GitHub path is a file, not a directory. Knowledge packs must be directories.");
249
+ }
250
+ const contents = rawContents;
251
+ for (const item of contents) {
252
+ const itemRelativePath = relativePath
253
+ ? `${relativePath}/${item.name}`
254
+ : item.name;
255
+ const targetPath = path.join(targetDir, itemRelativePath);
256
+ if (item.type === "dir") {
257
+ // Create directory and recurse
258
+ fs.mkdirSync(targetPath, { recursive: true });
259
+ // Fetch subdirectory contents
260
+ const subApiUrl = `https://api.github.com/repos/${extractRepoFromUrl(apiUrl)}/contents/${item.path}?ref=${extractRefFromUrl(apiUrl)}`;
261
+ await fetchContentsRecursive(subApiUrl, targetDir, itemRelativePath, onProgress);
262
+ }
263
+ else if (item.type === "file" && item.download_url) {
264
+ // Download file
265
+ const fileResponse = await fetch(item.download_url);
266
+ if (!fileResponse.ok) {
267
+ throw new Error(`Failed to download ${item.path}: ${fileResponse.status}`);
268
+ }
269
+ const content = await fileResponse.text();
270
+ // Ensure parent directory exists
271
+ const parentDir = path.dirname(targetPath);
272
+ if (!fs.existsSync(parentDir)) {
273
+ fs.mkdirSync(parentDir, { recursive: true });
274
+ }
275
+ fs.writeFileSync(targetPath, content);
276
+ onProgress?.(`Downloaded ${itemRelativePath}`);
277
+ }
278
+ }
279
+ }
280
+ /**
281
+ * Extract owner/repo from API URL
282
+ */
283
+ function extractRepoFromUrl(apiUrl) {
284
+ const match = apiUrl.match(/repos\/([^/]+\/[^/]+)/);
285
+ return match?.[1] ?? "";
286
+ }
287
+ /**
288
+ * Extract ref from API URL query string
289
+ */
290
+ function extractRefFromUrl(apiUrl) {
291
+ const match = apiUrl.match(/ref=([^&]+)/);
292
+ return match?.[1] ?? "main";
293
+ }
294
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/pack-installer/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Knowledge pack metadata schema
4
+ */
5
+ declare const PackMetadataSchema: z.ZodObject<{
6
+ name: z.ZodString;
7
+ version: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ name: string;
12
+ version: string;
13
+ description?: string | undefined;
14
+ files?: string[] | undefined;
15
+ }, {
16
+ name: string;
17
+ version: string;
18
+ description?: string | undefined;
19
+ files?: string[] | undefined;
20
+ }>;
21
+ export type PackMetadata = z.infer<typeof PackMetadataSchema>;
22
+ /**
23
+ * Pack installation result
24
+ */
25
+ export interface PackInstallResult {
26
+ metadata: PackMetadata;
27
+ installedFiles: string[];
28
+ systemConfigPath: string | null;
29
+ }
30
+ /**
31
+ * Options for pack installation
32
+ */
33
+ export interface PackInstallOptions {
34
+ packName?: string;
35
+ packServer?: string;
36
+ packFile?: string;
37
+ targetDir: string;
38
+ onProgress?: (message: string) => void;
39
+ }
40
+ /**
41
+ * Install a knowledge pack from a local file
42
+ */
43
+ export declare function installPackFromFile(packFilePath: string, targetDir: string, onProgress?: (message: string) => void): Promise<PackInstallResult>;
44
+ /**
45
+ * Install a knowledge pack from a remote server
46
+ */
47
+ export declare function installPackFromServer(packName: string, targetDir: string, serverUrl?: string, onProgress?: (message: string) => void): Promise<PackInstallResult>;
48
+ /**
49
+ * Install a knowledge pack from a GitHub folder
50
+ */
51
+ export declare function installPackFromGitHub(githubUrl: string, targetDir: string, onProgress?: (message: string) => void): Promise<PackInstallResult>;
52
+ /**
53
+ * Install a knowledge pack based on options
54
+ */
55
+ export declare function installPack(options: PackInstallOptions): Promise<PackInstallResult>;
56
+ export {};
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pack-installer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB;;GAEG;AACH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;EAKtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAOD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,iBAAiB,CAAC,CAqC5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,iBAAiB,CAAC,CAyC5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,iBAAiB,CAAC,CA4C5B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAwB5B"}
@@ -0,0 +1,257 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as tar from "tar";
4
+ import { z } from "zod";
5
+ import { isGitHubUrl, parseGitHubUrl, fetchGitHubFolder, } from "./github.js";
6
+ /**
7
+ * Knowledge pack metadata schema
8
+ */
9
+ const PackMetadataSchema = z.object({
10
+ name: z.string(),
11
+ version: z.string(),
12
+ description: z.string().optional(),
13
+ files: z.array(z.string()).optional(),
14
+ });
15
+ /**
16
+ * Default pack server URL (TBD - will be configured later)
17
+ */
18
+ const DEFAULT_PACK_SERVER = "https://packs.autonav.dev";
19
+ /**
20
+ * Install a knowledge pack from a local file
21
+ */
22
+ export async function installPackFromFile(packFilePath, targetDir, onProgress) {
23
+ onProgress?.(`Extracting pack from ${path.basename(packFilePath)}`);
24
+ // Create temp directory for extraction
25
+ const tempDir = fs.mkdtempSync(path.join(targetDir, ".pack-temp-"));
26
+ try {
27
+ // Extract tarball to temp directory
28
+ await tar.extract({
29
+ file: packFilePath,
30
+ cwd: tempDir,
31
+ });
32
+ // Validate pack structure
33
+ const metadata = validatePackStructure(tempDir);
34
+ onProgress?.(`Validated pack: ${metadata.name} v${metadata.version}`);
35
+ // Install pack files to target directory
36
+ const installedFiles = installPackFiles(tempDir, targetDir, onProgress);
37
+ // Clean up temp directory
38
+ fs.rmSync(tempDir, { recursive: true, force: true });
39
+ return {
40
+ metadata,
41
+ installedFiles,
42
+ systemConfigPath: fs.existsSync(path.join(targetDir, "system-configuration.md"))
43
+ ? "./system-configuration.md"
44
+ : null,
45
+ };
46
+ }
47
+ catch (error) {
48
+ // Clean up on error
49
+ fs.rmSync(tempDir, { recursive: true, force: true });
50
+ throw error;
51
+ }
52
+ }
53
+ /**
54
+ * Install a knowledge pack from a remote server
55
+ */
56
+ export async function installPackFromServer(packName, targetDir, serverUrl, onProgress) {
57
+ const server = serverUrl || DEFAULT_PACK_SERVER;
58
+ const packUrl = `${server}/packs/${packName}/latest`;
59
+ onProgress?.(`Downloading pack from ${server}`);
60
+ try {
61
+ // Download pack (using native fetch)
62
+ const response = await fetch(packUrl);
63
+ if (!response.ok) {
64
+ if (response.status === 404) {
65
+ throw new Error(`Knowledge pack '${packName}' not found on server ${server}`);
66
+ }
67
+ throw new Error(`Failed to download pack: ${response.status} ${response.statusText}`);
68
+ }
69
+ // Save to temp file
70
+ const tempFile = path.join(targetDir, `.pack-${packName}-temp.tar.gz`);
71
+ const buffer = await response.arrayBuffer();
72
+ fs.writeFileSync(tempFile, Buffer.from(buffer));
73
+ onProgress?.(`Downloaded ${(buffer.byteLength / 1024).toFixed(1)} KB`);
74
+ // Install from the downloaded file
75
+ const result = await installPackFromFile(tempFile, targetDir, onProgress);
76
+ // Clean up temp file
77
+ fs.unlinkSync(tempFile);
78
+ return result;
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error) {
82
+ throw new Error(`Failed to install pack from server: ${error.message}`);
83
+ }
84
+ throw error;
85
+ }
86
+ }
87
+ /**
88
+ * Install a knowledge pack from a GitHub folder
89
+ */
90
+ export async function installPackFromGitHub(githubUrl, targetDir, onProgress) {
91
+ const urlInfo = parseGitHubUrl(githubUrl);
92
+ if (!urlInfo) {
93
+ throw new Error(`Invalid GitHub URL: ${githubUrl}\n` +
94
+ `Supported formats:\n` +
95
+ ` - https://github.com/owner/repo/tree/main/path/to/pack\n` +
96
+ ` - github:owner/repo/path/to/pack\n` +
97
+ ` - github:owner/repo/path/to/pack@v1.0.0`);
98
+ }
99
+ // Create temp directory for GitHub download
100
+ const tempDir = fs.mkdtempSync(path.join(targetDir, ".github-pack-temp-"));
101
+ try {
102
+ // Fetch files from GitHub
103
+ await fetchGitHubFolder(urlInfo, tempDir, onProgress);
104
+ // Validate pack structure
105
+ const metadata = validatePackStructure(tempDir);
106
+ onProgress?.(`Validated pack: ${metadata.name} v${metadata.version}`);
107
+ // Install pack files to target directory
108
+ const installedFiles = installPackFiles(tempDir, targetDir, onProgress);
109
+ // Clean up temp directory
110
+ fs.rmSync(tempDir, { recursive: true, force: true });
111
+ return {
112
+ metadata,
113
+ installedFiles,
114
+ systemConfigPath: fs.existsSync(path.join(targetDir, "system-configuration.md"))
115
+ ? "./system-configuration.md"
116
+ : null,
117
+ };
118
+ }
119
+ catch (error) {
120
+ // Clean up on error
121
+ fs.rmSync(tempDir, { recursive: true, force: true });
122
+ throw error;
123
+ }
124
+ }
125
+ /**
126
+ * Install a knowledge pack based on options
127
+ */
128
+ export async function installPack(options) {
129
+ const { packName, packServer, packFile, targetDir, onProgress } = options;
130
+ // Ensure target directory exists
131
+ if (!fs.existsSync(targetDir)) {
132
+ fs.mkdirSync(targetDir, { recursive: true });
133
+ }
134
+ if (packFile) {
135
+ // Install from local file
136
+ if (!fs.existsSync(packFile)) {
137
+ throw new Error(`Pack file not found: ${packFile}`);
138
+ }
139
+ return installPackFromFile(packFile, targetDir, onProgress);
140
+ }
141
+ else if (packName) {
142
+ // Check if it's a GitHub URL
143
+ if (isGitHubUrl(packName)) {
144
+ return installPackFromGitHub(packName, targetDir, onProgress);
145
+ }
146
+ // Install from server
147
+ return installPackFromServer(packName, targetDir, packServer, onProgress);
148
+ }
149
+ else {
150
+ throw new Error("Either packName or packFile must be provided");
151
+ }
152
+ }
153
+ /**
154
+ * Validate pack structure and return metadata
155
+ */
156
+ function validatePackStructure(packDir) {
157
+ // Check for metadata.json
158
+ const metadataPath = path.join(packDir, "metadata.json");
159
+ if (!fs.existsSync(metadataPath)) {
160
+ throw new Error("Invalid pack structure: missing metadata.json. Knowledge packs must include a metadata.json file.");
161
+ }
162
+ // Parse and validate metadata
163
+ const metadataContent = fs.readFileSync(metadataPath, "utf-8");
164
+ let metadata;
165
+ try {
166
+ metadata = JSON.parse(metadataContent);
167
+ }
168
+ catch (error) {
169
+ throw new Error(`Invalid metadata.json: ${error instanceof Error ? error.message : String(error)}`);
170
+ }
171
+ const validationResult = PackMetadataSchema.safeParse(metadata);
172
+ if (!validationResult.success) {
173
+ throw new Error(`Invalid pack metadata: ${validationResult.error.message}`);
174
+ }
175
+ // Check for required files
176
+ const hasSystemConfig = fs.existsSync(path.join(packDir, "system-configuration.md"));
177
+ const hasKnowledge = fs.existsSync(path.join(packDir, "knowledge"));
178
+ if (!hasSystemConfig && !hasKnowledge) {
179
+ throw new Error("Invalid pack structure: must contain either system-configuration.md or knowledge/ directory");
180
+ }
181
+ return validationResult.data;
182
+ }
183
+ /**
184
+ * Install pack files to target directory
185
+ */
186
+ function installPackFiles(packDir, targetDir, onProgress) {
187
+ const installedFiles = [];
188
+ // Copy system-configuration.md if it exists
189
+ const systemConfigPath = path.join(packDir, "system-configuration.md");
190
+ if (fs.existsSync(systemConfigPath)) {
191
+ const targetPath = path.join(targetDir, "system-configuration.md");
192
+ fs.copyFileSync(systemConfigPath, targetPath);
193
+ installedFiles.push("system-configuration.md");
194
+ onProgress?.("Installed system-configuration.md");
195
+ }
196
+ // Copy knowledge directory if it exists
197
+ const knowledgeDir = path.join(packDir, "knowledge");
198
+ if (fs.existsSync(knowledgeDir)) {
199
+ const targetKnowledgeDir = path.join(targetDir, "knowledge");
200
+ copyDirectoryRecursive(knowledgeDir, targetKnowledgeDir);
201
+ // Count files
202
+ const files = countFilesRecursive(targetKnowledgeDir);
203
+ installedFiles.push(...files.map((f) => `knowledge/${f}`));
204
+ onProgress?.(`Installed ${files.length} knowledge file${files.length !== 1 ? "s" : ""}`);
205
+ }
206
+ // Copy plugins.json if it exists
207
+ const pluginsPath = path.join(packDir, "plugins.json");
208
+ if (fs.existsSync(pluginsPath)) {
209
+ const targetPluginsDir = path.join(targetDir, ".claude");
210
+ if (!fs.existsSync(targetPluginsDir)) {
211
+ fs.mkdirSync(targetPluginsDir, { recursive: true });
212
+ }
213
+ const targetPath = path.join(targetPluginsDir, "plugins.json");
214
+ fs.copyFileSync(pluginsPath, targetPath);
215
+ installedFiles.push(".claude/plugins.json");
216
+ onProgress?.("Installed plugins configuration");
217
+ }
218
+ return installedFiles;
219
+ }
220
+ /**
221
+ * Recursively copy directory
222
+ */
223
+ function copyDirectoryRecursive(src, dest) {
224
+ if (!fs.existsSync(dest)) {
225
+ fs.mkdirSync(dest, { recursive: true });
226
+ }
227
+ const entries = fs.readdirSync(src, { withFileTypes: true });
228
+ for (const entry of entries) {
229
+ const srcPath = path.join(src, entry.name);
230
+ const destPath = path.join(dest, entry.name);
231
+ if (entry.isDirectory()) {
232
+ copyDirectoryRecursive(srcPath, destPath);
233
+ }
234
+ else {
235
+ fs.copyFileSync(srcPath, destPath);
236
+ }
237
+ }
238
+ }
239
+ /**
240
+ * Count files recursively in directory
241
+ */
242
+ function countFilesRecursive(dir, relativeTo) {
243
+ const base = relativeTo || dir;
244
+ const files = [];
245
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
246
+ for (const entry of entries) {
247
+ const fullPath = path.join(dir, entry.name);
248
+ if (entry.isDirectory()) {
249
+ files.push(...countFilesRecursive(fullPath, base));
250
+ }
251
+ else {
252
+ files.push(path.relative(base, fullPath));
253
+ }
254
+ }
255
+ return files;
256
+ }
257
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pack-installer/index.ts"],"names":[],"mappings":"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"}