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.
- package/README.md +160 -0
- package/bin/ba-kit.js +2 -0
- package/dist/commands/cache.d.ts +8 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +43 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/completion.d.ts +9 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +172 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +142 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/restore.d.ts +6 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +168 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +154 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +300 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache.d.ts +50 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +152 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/config.d.ts +25 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +67 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/copier.d.ts +10 -0
- package/dist/lib/copier.d.ts.map +1 -0
- package/dist/lib/copier.js +79 -0
- package/dist/lib/copier.js.map +1 -0
- package/dist/lib/differ.d.ts +16 -0
- package/dist/lib/differ.d.ts.map +1 -0
- package/dist/lib/differ.js +51 -0
- package/dist/lib/differ.js.map +1 -0
- package/dist/lib/downloader.d.ts +11 -0
- package/dist/lib/downloader.d.ts.map +1 -0
- package/dist/lib/downloader.js +110 -0
- package/dist/lib/downloader.js.map +1 -0
- package/dist/lib/hasher.d.ts +18 -0
- package/dist/lib/hasher.d.ts.map +1 -0
- package/dist/lib/hasher.js +54 -0
- package/dist/lib/hasher.js.map +1 -0
- package/dist/lib/manifest.d.ts +30 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +72 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/constants.d.ts +13 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +38 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errors.d.ts +60 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +99 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +43 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +107 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompts.d.ts +18 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +63 -0
- package/dist/utils/prompts.js.map +1 -0
- package/man/ba-kit.1 +194 -0
- 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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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"}
|