ba-kit-cli 2.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 (80) hide show
  1. package/README.md +160 -0
  2. package/bin/ba-kit.js +2 -0
  3. package/dist/commands/cache.d.ts +8 -0
  4. package/dist/commands/cache.d.ts.map +1 -0
  5. package/dist/commands/cache.js +43 -0
  6. package/dist/commands/cache.js.map +1 -0
  7. package/dist/commands/completion.d.ts +9 -0
  8. package/dist/commands/completion.d.ts.map +1 -0
  9. package/dist/commands/completion.js +172 -0
  10. package/dist/commands/completion.js.map +1 -0
  11. package/dist/commands/init.d.ts +6 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +142 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/restore.d.ts +6 -0
  16. package/dist/commands/restore.d.ts.map +1 -0
  17. package/dist/commands/restore.js +168 -0
  18. package/dist/commands/restore.js.map +1 -0
  19. package/dist/commands/status.d.ts +6 -0
  20. package/dist/commands/status.d.ts.map +1 -0
  21. package/dist/commands/status.js +154 -0
  22. package/dist/commands/status.js.map +1 -0
  23. package/dist/commands/update.d.ts +6 -0
  24. package/dist/commands/update.d.ts.map +1 -0
  25. package/dist/commands/update.js +300 -0
  26. package/dist/commands/update.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +120 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/cache.d.ts +50 -0
  32. package/dist/lib/cache.d.ts.map +1 -0
  33. package/dist/lib/cache.js +152 -0
  34. package/dist/lib/cache.js.map +1 -0
  35. package/dist/lib/config.d.ts +25 -0
  36. package/dist/lib/config.d.ts.map +1 -0
  37. package/dist/lib/config.js +67 -0
  38. package/dist/lib/config.js.map +1 -0
  39. package/dist/lib/copier.d.ts +10 -0
  40. package/dist/lib/copier.d.ts.map +1 -0
  41. package/dist/lib/copier.js +79 -0
  42. package/dist/lib/copier.js.map +1 -0
  43. package/dist/lib/differ.d.ts +16 -0
  44. package/dist/lib/differ.d.ts.map +1 -0
  45. package/dist/lib/differ.js +51 -0
  46. package/dist/lib/differ.js.map +1 -0
  47. package/dist/lib/downloader.d.ts +11 -0
  48. package/dist/lib/downloader.d.ts.map +1 -0
  49. package/dist/lib/downloader.js +110 -0
  50. package/dist/lib/downloader.js.map +1 -0
  51. package/dist/lib/hasher.d.ts +18 -0
  52. package/dist/lib/hasher.d.ts.map +1 -0
  53. package/dist/lib/hasher.js +54 -0
  54. package/dist/lib/hasher.js.map +1 -0
  55. package/dist/lib/manifest.d.ts +30 -0
  56. package/dist/lib/manifest.d.ts.map +1 -0
  57. package/dist/lib/manifest.js +72 -0
  58. package/dist/lib/manifest.js.map +1 -0
  59. package/dist/types.d.ts +91 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +21 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/utils/constants.d.ts +13 -0
  64. package/dist/utils/constants.d.ts.map +1 -0
  65. package/dist/utils/constants.js +38 -0
  66. package/dist/utils/constants.js.map +1 -0
  67. package/dist/utils/errors.d.ts +60 -0
  68. package/dist/utils/errors.d.ts.map +1 -0
  69. package/dist/utils/errors.js +99 -0
  70. package/dist/utils/errors.js.map +1 -0
  71. package/dist/utils/logger.d.ts +43 -0
  72. package/dist/utils/logger.d.ts.map +1 -0
  73. package/dist/utils/logger.js +107 -0
  74. package/dist/utils/logger.js.map +1 -0
  75. package/dist/utils/prompts.d.ts +18 -0
  76. package/dist/utils/prompts.d.ts.map +1 -0
  77. package/dist/utils/prompts.js +63 -0
  78. package/dist/utils/prompts.js.map +1 -0
  79. package/man/ba-kit.1 +194 -0
  80. package/package.json +77 -0
@@ -0,0 +1,11 @@
1
+ import type { DownloadResult } from '../types.js';
2
+ /**
3
+ * Download and extract ba-kit tarball from GitHub
4
+ * Uses caching with ETag support to minimize network requests
5
+ */
6
+ export declare function downloadBaKit(branch: string, destDir: string): Promise<DownloadResult>;
7
+ /**
8
+ * Cleanup extracted files
9
+ */
10
+ export declare function cleanupDownload(extractPath: string): Promise<void>;
11
+ //# sourceMappingURL=downloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/lib/downloader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CAwCzB;AAoED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE"}
@@ -0,0 +1,110 @@
1
+ import { mkdir, rm, readdir, readFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { extract } from 'tar';
4
+ import { tmpdir } from 'os';
5
+ import { CONFIG } from '../utils/constants.js';
6
+ import { getCached, setCached, getEtag } from './cache.js';
7
+ import { log } from '../utils/logger.js';
8
+ /**
9
+ * Download and extract ba-kit tarball from GitHub
10
+ * Uses caching with ETag support to minimize network requests
11
+ */
12
+ export async function downloadBaKit(branch, destDir) {
13
+ // Check cache first
14
+ const cached = await getCached(branch);
15
+ if (cached) {
16
+ log.debug(`Using cached version ${cached.version}`);
17
+ const extractedPath = await extractTarball(cached.tarballPath, destDir);
18
+ return { extractedPath, version: cached.version };
19
+ }
20
+ const url = `https://github.com/${CONFIG.REPO_OWNER}/${CONFIG.REPO_NAME}/archive/refs/heads/${branch}.tar.gz`;
21
+ // Build headers for conditional request
22
+ const headers = {};
23
+ const etag = await getEtag(branch);
24
+ if (etag) {
25
+ headers['If-None-Match'] = etag;
26
+ }
27
+ // Download tarball
28
+ log.debug(`Fetching ${url}`);
29
+ const response = await fetch(url, { headers });
30
+ if (!response.ok) {
31
+ throw new Error(`Failed to download: ${response.status} ${response.statusText}`);
32
+ }
33
+ // Get response as buffer
34
+ const tarballBuffer = Buffer.from(await response.arrayBuffer());
35
+ // Extract version from response or CHANGELOG
36
+ const tempPath = await extractTarballFromBuffer(tarballBuffer, destDir);
37
+ const version = await getVersion(tempPath);
38
+ // Cache the tarball
39
+ const newEtag = response.headers.get('etag') ?? undefined;
40
+ const lastModified = response.headers.get('last-modified') ?? undefined;
41
+ await setCached(branch, version, tarballBuffer, newEtag, lastModified);
42
+ log.debug(`Cached tarball for branch ${branch}`);
43
+ return { extractedPath: tempPath, version };
44
+ }
45
+ /**
46
+ * Extract tarball from file path
47
+ */
48
+ async function extractTarball(tarballPath, destDir) {
49
+ const extractPath = join(destDir, '.ba-kit-extract');
50
+ await mkdir(extractPath, { recursive: true });
51
+ await extract({
52
+ file: tarballPath,
53
+ cwd: extractPath,
54
+ });
55
+ // Find extracted folder
56
+ const contents = await readdir(extractPath);
57
+ const extractedFolder = contents.find(f => f.startsWith('ba-kit'));
58
+ if (!extractedFolder) {
59
+ throw new Error('Could not find extracted ba-kit folder');
60
+ }
61
+ return join(extractPath, extractedFolder);
62
+ }
63
+ /**
64
+ * Extract tarball from buffer (for fresh downloads)
65
+ */
66
+ async function extractTarballFromBuffer(buffer, destDir) {
67
+ const extractPath = join(destDir, '.ba-kit-extract');
68
+ await mkdir(extractPath, { recursive: true });
69
+ // Write buffer to temp file and extract
70
+ const { writeFile } = await import('fs/promises');
71
+ const tempTar = join(tmpdir(), `ba-kit-${Date.now()}.tar.gz`);
72
+ await writeFile(tempTar, buffer);
73
+ await extract({
74
+ file: tempTar,
75
+ cwd: extractPath,
76
+ });
77
+ // Cleanup temp file
78
+ await rm(tempTar, { force: true });
79
+ // Find extracted folder
80
+ const contents = await readdir(extractPath);
81
+ const extractedFolder = contents.find(f => f.startsWith('ba-kit'));
82
+ if (!extractedFolder) {
83
+ throw new Error('Could not find extracted ba-kit folder');
84
+ }
85
+ return join(extractPath, extractedFolder);
86
+ }
87
+ /**
88
+ * Extract version from ba-kit CHANGELOG
89
+ */
90
+ async function getVersion(path) {
91
+ try {
92
+ const changelog = await readFile(join(path, 'CHANGELOG.md'), 'utf8');
93
+ const match = changelog.match(/##\s+\[?v?(\d+\.\d+\.\d+)/);
94
+ if (match)
95
+ return match[1];
96
+ }
97
+ catch {
98
+ // ignore
99
+ }
100
+ return 'unknown';
101
+ }
102
+ /**
103
+ * Cleanup extracted files
104
+ */
105
+ export async function cleanupDownload(extractPath) {
106
+ // Go up one level to get the .ba-kit-extract folder
107
+ const parentDir = join(extractPath, '..');
108
+ await rm(parentDir, { recursive: true, force: true });
109
+ }
110
+ //# sourceMappingURL=downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/lib/downloader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Generate SHA-256 hash of file contents
3
+ */
4
+ export declare function hashFile(filePath: string): Promise<string>;
5
+ /**
6
+ * Hash multiple files in parallel for better performance
7
+ * Returns a Map of filePath -> hash
8
+ */
9
+ export declare function hashFilesParallel(filePaths: string[]): Promise<Map<string, string>>;
10
+ /**
11
+ * Generate SHA-256 hash of string content
12
+ */
13
+ export declare function hashContent(content: string): string;
14
+ /**
15
+ * Compare two hashes
16
+ */
17
+ export declare function hashesMatch(hash1: string, hash2: string): boolean;
18
+ //# sourceMappingURL=hasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../src/lib/hasher.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0B9B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,54 @@
1
+ import { createHash } from 'crypto';
2
+ import { readFile } from 'fs/promises';
3
+ import { cpus } from 'os';
4
+ // Limit parallel operations based on CPU count
5
+ const PARALLEL_LIMIT = Math.max(cpus().length - 1, 2);
6
+ /**
7
+ * Generate SHA-256 hash of file contents
8
+ */
9
+ export async function hashFile(filePath) {
10
+ const content = await readFile(filePath);
11
+ const hash = createHash('sha256').update(content).digest('hex');
12
+ return `sha256:${hash}`;
13
+ }
14
+ /**
15
+ * Hash multiple files in parallel for better performance
16
+ * Returns a Map of filePath -> hash
17
+ */
18
+ export async function hashFilesParallel(filePaths) {
19
+ const results = new Map();
20
+ // Process in chunks to avoid overwhelming the system
21
+ for (let i = 0; i < filePaths.length; i += PARALLEL_LIMIT) {
22
+ const chunk = filePaths.slice(i, i + PARALLEL_LIMIT);
23
+ const promises = chunk.map(async (path) => {
24
+ try {
25
+ const hash = await hashFile(path);
26
+ return { path, hash, error: null };
27
+ }
28
+ catch (error) {
29
+ return { path, hash: null, error };
30
+ }
31
+ });
32
+ const chunkResults = await Promise.all(promises);
33
+ for (const { path, hash } of chunkResults) {
34
+ if (hash) {
35
+ results.set(path, hash);
36
+ }
37
+ }
38
+ }
39
+ return results;
40
+ }
41
+ /**
42
+ * Generate SHA-256 hash of string content
43
+ */
44
+ export function hashContent(content) {
45
+ const hash = createHash('sha256').update(content).digest('hex');
46
+ return `sha256:${hash}`;
47
+ }
48
+ /**
49
+ * Compare two hashes
50
+ */
51
+ export function hashesMatch(hash1, hash2) {
52
+ return hash1 === hash2;
53
+ }
54
+ //# sourceMappingURL=hasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../src/lib/hasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,+CAA+C;AAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,UAAU,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,qDAAqD;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEjD,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;YAC1C,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,UAAU,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAa;IACtD,OAAO,KAAK,KAAK,KAAK,CAAC;AACzB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Manifest, ManifestFile } from '../types.js';
2
+ /**
3
+ * Get manifest file path
4
+ */
5
+ export declare function getManifestPath(basePath: string): string;
6
+ /**
7
+ * Check if manifest exists
8
+ */
9
+ export declare function manifestExists(basePath: string): Promise<boolean>;
10
+ /**
11
+ * Read manifest from disk
12
+ */
13
+ export declare function readManifest(basePath: string): Promise<Manifest>;
14
+ /**
15
+ * Write manifest to disk
16
+ */
17
+ export declare function writeManifest(basePath: string, manifest: Manifest): Promise<void>;
18
+ /**
19
+ * Create new manifest object
20
+ */
21
+ export declare function createManifest(version: string, branch: string, files: Record<string, ManifestFile>): Manifest;
22
+ /**
23
+ * Update manifest with new file hashes
24
+ */
25
+ export declare function updateManifest(manifest: Manifest, updates: Record<string, ManifestFile>): Manifest;
26
+ /**
27
+ * Get file status from manifest entry
28
+ */
29
+ export declare function getFileStatus(fileEntry: ManifestFile | undefined): 'unchanged' | 'modified' | 'deleted' | 'added';
30
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGtE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAClC,QAAQ,CASV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GACpC,QAAQ,CASV;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,YAAY,GAAG,SAAS,GAClC,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAIhD"}
@@ -0,0 +1,72 @@
1
+ import { readFile, writeFile, access } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { CONFIG } from '../utils/constants.js';
4
+ /**
5
+ * Get manifest file path
6
+ */
7
+ export function getManifestPath(basePath) {
8
+ return join(basePath, CONFIG.AGENT_DIR, CONFIG.MANIFEST_FILE);
9
+ }
10
+ /**
11
+ * Check if manifest exists
12
+ */
13
+ export async function manifestExists(basePath) {
14
+ try {
15
+ await access(getManifestPath(basePath));
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /**
23
+ * Read manifest from disk
24
+ */
25
+ export async function readManifest(basePath) {
26
+ const content = await readFile(getManifestPath(basePath), 'utf8');
27
+ return JSON.parse(content);
28
+ }
29
+ /**
30
+ * Write manifest to disk
31
+ */
32
+ export async function writeManifest(basePath, manifest) {
33
+ const content = JSON.stringify(manifest, null, 2);
34
+ await writeFile(getManifestPath(basePath), content, 'utf8');
35
+ }
36
+ /**
37
+ * Create new manifest object
38
+ */
39
+ export function createManifest(version, branch, files) {
40
+ return {
41
+ version,
42
+ source: `github:${CONFIG.REPO_OWNER}/${CONFIG.REPO_NAME}`,
43
+ branch,
44
+ installed_at: new Date().toISOString(),
45
+ updated_at: new Date().toISOString(),
46
+ files,
47
+ };
48
+ }
49
+ /**
50
+ * Update manifest with new file hashes
51
+ */
52
+ export function updateManifest(manifest, updates) {
53
+ return {
54
+ ...manifest,
55
+ updated_at: new Date().toISOString(),
56
+ files: {
57
+ ...manifest.files,
58
+ ...updates,
59
+ },
60
+ };
61
+ }
62
+ /**
63
+ * Get file status from manifest entry
64
+ */
65
+ export function getFileStatus(fileEntry) {
66
+ if (!fileEntry)
67
+ return 'added';
68
+ if (fileEntry.original_hash === fileEntry.current_hash)
69
+ return 'unchanged';
70
+ return 'modified';
71
+ }
72
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,QAAkB;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,MAAc,EACd,KAAmC;IAEnC,OAAO;QACL,OAAO;QACP,MAAM,EAAE,UAAU,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE;QACzD,MAAM;QACN,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAqC;IAErC,OAAO;QACL,GAAG,QAAQ;QACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,KAAK,EAAE;YACL,GAAG,QAAQ,CAAC,KAAK;YACjB,GAAG,OAAO;SACX;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAmC;IAEnC,IAAI,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC;IAC/B,IAAI,SAAS,CAAC,aAAa,KAAK,SAAS,CAAC,YAAY;QAAE,OAAO,WAAW,CAAC;IAC3E,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * File entry in manifest
4
+ */
5
+ export declare const ManifestFileSchema: z.ZodObject<{
6
+ original_hash: z.ZodString;
7
+ current_hash: z.ZodOptional<z.ZodString>;
8
+ source_path: z.ZodString;
9
+ }, z.core.$strip>;
10
+ export type ManifestFile = z.infer<typeof ManifestFileSchema>;
11
+ /**
12
+ * Full manifest schema
13
+ */
14
+ export declare const ManifestSchema: z.ZodObject<{
15
+ version: z.ZodString;
16
+ source: z.ZodString;
17
+ branch: z.ZodString;
18
+ installed_at: z.ZodString;
19
+ updated_at: z.ZodString;
20
+ files: z.ZodRecord<z.ZodString, z.ZodObject<{
21
+ original_hash: z.ZodString;
22
+ current_hash: z.ZodOptional<z.ZodString>;
23
+ source_path: z.ZodString;
24
+ }, z.core.$strip>>;
25
+ }, z.core.$strip>;
26
+ export type Manifest = z.infer<typeof ManifestSchema>;
27
+ /**
28
+ * Command options
29
+ */
30
+ export interface InitOptions {
31
+ force?: boolean;
32
+ branch?: string;
33
+ local?: string;
34
+ }
35
+ export interface UpdateOptions {
36
+ yes?: boolean;
37
+ dryRun?: boolean;
38
+ local?: string;
39
+ }
40
+ export interface StatusOptions {
41
+ remote?: boolean;
42
+ }
43
+ export interface RestoreOptions {
44
+ all?: boolean;
45
+ yes?: boolean;
46
+ local?: string;
47
+ }
48
+ /**
49
+ * Change action types for update command
50
+ */
51
+ export type ChangeAction = 'skip' | 'update' | 'new' | 'conflict';
52
+ export interface Change {
53
+ path: string;
54
+ sourcePath?: string;
55
+ action: ChangeAction;
56
+ localHash?: string;
57
+ remoteHash?: string;
58
+ }
59
+ /**
60
+ * Download result
61
+ */
62
+ export interface DownloadResult {
63
+ extractedPath: string;
64
+ version: string;
65
+ }
66
+ /**
67
+ * File analysis result
68
+ */
69
+ export interface FileAnalysis {
70
+ path: string;
71
+ status: 'unchanged' | 'modified' | 'deleted' | 'added';
72
+ }
73
+ /**
74
+ * Logger interface
75
+ */
76
+ export interface Logger {
77
+ info: (msg: string) => void;
78
+ success: (msg: string) => void;
79
+ warn: (msg: string) => void;
80
+ error: (msg: string) => void;
81
+ dim: (msg: string) => void;
82
+ debug?: (msg: string) => void;
83
+ json?: <T>(data: T) => void;
84
+ }
85
+ /**
86
+ * Cache command options
87
+ */
88
+ export interface CacheOptions {
89
+ clear?: boolean;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;iBAOzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;AAElE,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * File entry in manifest
4
+ */
5
+ export const ManifestFileSchema = z.object({
6
+ original_hash: z.string(),
7
+ current_hash: z.string().optional(),
8
+ source_path: z.string(),
9
+ });
10
+ /**
11
+ * Full manifest schema
12
+ */
13
+ export const ManifestSchema = z.object({
14
+ version: z.string(),
15
+ source: z.string(),
16
+ branch: z.string(),
17
+ installed_at: z.string(),
18
+ updated_at: z.string(),
19
+ files: z.record(z.string(), ManifestFileSchema),
20
+ });
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC;CAChD,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface Config {
2
+ REPO_OWNER: string;
3
+ REPO_NAME: string;
4
+ DEFAULT_BRANCH: string;
5
+ AGENT_DIR: string;
6
+ MANIFEST_FILE: string;
7
+ BACKUP_DIR: string;
8
+ CACHE_DIR: string;
9
+ FILE_MAP: Record<string, string>;
10
+ EXCLUDE: string[];
11
+ }
12
+ export declare const CONFIG: Config;
13
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,MAAM,EAAE,MAqCpB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ export const CONFIG = {
4
+ // GitHub source
5
+ REPO_OWNER: 'anthropics',
6
+ REPO_NAME: 'ba-kit',
7
+ DEFAULT_BRANCH: 'main',
8
+ // Local paths
9
+ AGENT_DIR: '.agent',
10
+ MANIFEST_FILE: '.ba-kit.json',
11
+ BACKUP_DIR: '.ba-kit-backup',
12
+ CACHE_DIR: join(homedir(), '.cache', 'ba-kit'),
13
+ // File mapping: source → target
14
+ FILE_MAP: {
15
+ '.agent/workflows': 'workflows',
16
+ 'core': 'skills/core',
17
+ 'specialized': 'skills/specialized',
18
+ 'templates': 'skills/templates',
19
+ 'advanced': 'skills/advanced',
20
+ 'AGENT.MD': 'AGENT.MD',
21
+ },
22
+ // Files to exclude
23
+ EXCLUDE: [
24
+ 'README.md',
25
+ 'README.vi.md',
26
+ 'CHANGELOG.md',
27
+ 'RELEASE_NOTES.md',
28
+ 'QUICK-START.md',
29
+ 'USAGE-GUIDE.md',
30
+ 'USAGE-GUIDE.vi.md',
31
+ 'USER-GUIDE-BY-PERSONA.md',
32
+ 'LICENSE',
33
+ '.gitignore',
34
+ 'assets',
35
+ 'plans',
36
+ ],
37
+ };
38
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,gBAAgB;IAChB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,QAAQ;IACnB,cAAc,EAAE,MAAM;IAEtB,cAAc;IACd,SAAS,EAAE,QAAQ;IACnB,aAAa,EAAE,cAAc;IAC7B,UAAU,EAAE,gBAAgB;IAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAE9C,gCAAgC;IAChC,QAAQ,EAAE;QACR,kBAAkB,EAAE,WAAW;QAC/B,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,oBAAoB;QACnC,WAAW,EAAE,kBAAkB;QAC/B,UAAU,EAAE,iBAAiB;QAC7B,UAAU,EAAE,UAAU;KACvB;IAED,mBAAmB;IACnB,OAAO,EAAE;QACP,WAAW;QACX,cAAc;QACd,cAAc;QACd,kBAAkB;QAClB,gBAAgB;QAChB,gBAAgB;QAChB,mBAAmB;QACnB,0BAA0B;QAC1B,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,OAAO;KACR;CACF,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { Logger } from '../types.js';
2
+ /**
3
+ * Standardized exit codes
4
+ */
5
+ export declare const EXIT_CODES: {
6
+ readonly SUCCESS: 0;
7
+ readonly ERROR: 1;
8
+ readonly USAGE_ERROR: 2;
9
+ readonly NOT_INSTALLED: 3;
10
+ readonly NETWORK_ERROR: 4;
11
+ readonly CONFLICT: 5;
12
+ };
13
+ export type ExitCode = typeof EXIT_CODES[keyof typeof EXIT_CODES];
14
+ /**
15
+ * Exit with code and optional message
16
+ */
17
+ export declare function exit(code: ExitCode, log: Logger, message?: string): never;
18
+ /**
19
+ * Base error class for BA-Kit CLI
20
+ */
21
+ export declare class BaKitError extends Error {
22
+ code: string;
23
+ exitCode: ExitCode;
24
+ constructor(message: string, code?: string, exitCode?: ExitCode);
25
+ }
26
+ /**
27
+ * Error for when BA-Kit is not installed in the project
28
+ */
29
+ export declare class NotInstalledError extends BaKitError {
30
+ constructor(message?: string);
31
+ }
32
+ /**
33
+ * Error for when BA-Kit is already installed
34
+ */
35
+ export declare class AlreadyInstalledError extends BaKitError {
36
+ constructor(message?: string);
37
+ }
38
+ /**
39
+ * Error for network/download failures
40
+ */
41
+ export declare class DownloadError extends BaKitError {
42
+ constructor(message?: string);
43
+ }
44
+ /**
45
+ * Error for manifest issues
46
+ */
47
+ export declare class ManifestError extends BaKitError {
48
+ constructor(message?: string);
49
+ }
50
+ /**
51
+ * Error for file operation failures
52
+ */
53
+ export declare class FileOperationError extends BaKitError {
54
+ constructor(message?: string);
55
+ }
56
+ /**
57
+ * Handle error and exit with appropriate code
58
+ */
59
+ export declare function handleError(error: unknown, log: Logger): never;
60
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAElE;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAGzE;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;gBAGjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAwB,EAC9B,QAAQ,GAAE,QAA2B;CAOxC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;gBACnC,OAAO,GAAE,MAAyD;CAI/E;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,UAAU;gBACvC,OAAO,GAAE,MAA8D;CAIpF;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,OAAO,GAAE,MAAiD;CAIvE;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;gBAC/B,OAAO,GAAE,MAA8C;CAIpE;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,GAAE,MAAiC;CAIvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAiB9D"}