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,99 @@
1
+ /**
2
+ * Standardized exit codes
3
+ */
4
+ export const EXIT_CODES = {
5
+ SUCCESS: 0,
6
+ ERROR: 1,
7
+ USAGE_ERROR: 2,
8
+ NOT_INSTALLED: 3,
9
+ NETWORK_ERROR: 4,
10
+ CONFLICT: 5,
11
+ };
12
+ /**
13
+ * Exit with code and optional message
14
+ */
15
+ export function exit(code, log, message) {
16
+ if (message)
17
+ log.error(message);
18
+ process.exit(code);
19
+ }
20
+ /**
21
+ * Base error class for BA-Kit CLI
22
+ */
23
+ export class BaKitError extends Error {
24
+ code;
25
+ exitCode;
26
+ constructor(message, code = 'UNKNOWN_ERROR', exitCode = EXIT_CODES.ERROR) {
27
+ super(message);
28
+ this.name = 'BaKitError';
29
+ this.code = code;
30
+ this.exitCode = exitCode;
31
+ }
32
+ }
33
+ /**
34
+ * Error for when BA-Kit is not installed in the project
35
+ */
36
+ export class NotInstalledError extends BaKitError {
37
+ constructor(message = 'Not a BA-Kit project. Run `ba-kit init` first.') {
38
+ super(message, 'NOT_INSTALLED', EXIT_CODES.NOT_INSTALLED);
39
+ this.name = 'NotInstalledError';
40
+ }
41
+ }
42
+ /**
43
+ * Error for when BA-Kit is already installed
44
+ */
45
+ export class AlreadyInstalledError extends BaKitError {
46
+ constructor(message = 'BA-Kit already installed. Use --force to overwrite.') {
47
+ super(message, 'ALREADY_INSTALLED', EXIT_CODES.ERROR);
48
+ this.name = 'AlreadyInstalledError';
49
+ }
50
+ }
51
+ /**
52
+ * Error for network/download failures
53
+ */
54
+ export class DownloadError extends BaKitError {
55
+ constructor(message = 'Failed to download BA-Kit from GitHub.') {
56
+ super(message, 'DOWNLOAD_ERROR', EXIT_CODES.NETWORK_ERROR);
57
+ this.name = 'DownloadError';
58
+ }
59
+ }
60
+ /**
61
+ * Error for manifest issues
62
+ */
63
+ export class ManifestError extends BaKitError {
64
+ constructor(message = 'Invalid or corrupted manifest file.') {
65
+ super(message, 'MANIFEST_ERROR', EXIT_CODES.ERROR);
66
+ this.name = 'ManifestError';
67
+ }
68
+ }
69
+ /**
70
+ * Error for file operation failures
71
+ */
72
+ export class FileOperationError extends BaKitError {
73
+ constructor(message = 'File operation failed.') {
74
+ super(message, 'FILE_OPERATION_ERROR', EXIT_CODES.ERROR);
75
+ this.name = 'FileOperationError';
76
+ }
77
+ }
78
+ /**
79
+ * Handle error and exit with appropriate code
80
+ */
81
+ export function handleError(error, log) {
82
+ if (error instanceof BaKitError) {
83
+ log.error(error.message);
84
+ if (process.env.DEBUG) {
85
+ console.error(error.stack);
86
+ }
87
+ process.exit(error.exitCode);
88
+ }
89
+ // Unknown error
90
+ log.error('An unexpected error occurred.');
91
+ if (process.env.DEBUG) {
92
+ console.error(error);
93
+ }
94
+ else {
95
+ log.dim('Run with DEBUG=1 for more details.');
96
+ }
97
+ process.exit(EXIT_CODES.ERROR);
98
+ }
99
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type Ora } from 'ora';
2
+ /**
3
+ * Logger options for verbosity control
4
+ */
5
+ export interface LoggerOptions {
6
+ verbose?: boolean;
7
+ quiet?: boolean;
8
+ json?: boolean;
9
+ }
10
+ /**
11
+ * Set global logger options
12
+ */
13
+ export declare function setLoggerOptions(options: LoggerOptions): void;
14
+ /**
15
+ * Get current logger options
16
+ */
17
+ export declare function getLoggerOptions(): LoggerOptions;
18
+ /**
19
+ * Logger with verbosity support
20
+ */
21
+ export declare const log: {
22
+ info: (msg: string) => void;
23
+ success: (msg: string) => void;
24
+ warn: (msg: string) => void;
25
+ error: (msg: string) => void;
26
+ dim: (msg: string) => void;
27
+ debug: (msg: string) => void;
28
+ json: <T>(data: T) => void;
29
+ };
30
+ /**
31
+ * Create a spinner (respects quiet/json modes)
32
+ */
33
+ export declare function spinner(text: string): Ora;
34
+ type FileStatus = 'unchanged' | 'modified' | 'deleted' | 'added' | 'conflict';
35
+ /**
36
+ * Table utilities for status display
37
+ */
38
+ export declare const table: {
39
+ header: (text: string) => void;
40
+ row: (status: FileStatus, file: string) => void;
41
+ };
42
+ export {};
43
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED;;GAEG;AACH,eAAO,MAAM,GAAG;gBACF,MAAM,KAAG,IAAI;mBAKV,MAAM,KAAG,IAAI;gBAKhB,MAAM,KAAG,IAAI;iBAKZ,MAAM,KAAG,IAAI;eAQf,MAAM,KAAG,IAAI;iBAKX,MAAM,KAAG,IAAI;WAKnB,CAAC,QAAQ,CAAC,KAAG,IAAI;CAKzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAmBzC;AAED,KAAK,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,KAAK;mBACD,MAAM,KAAG,IAAI;kBAKd,UAAU,QAAQ,MAAM,KAAG,IAAI;CAW9C,CAAC"}
@@ -0,0 +1,107 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ let globalOptions = {};
4
+ /**
5
+ * Set global logger options
6
+ */
7
+ export function setLoggerOptions(options) {
8
+ globalOptions = options;
9
+ }
10
+ /**
11
+ * Get current logger options
12
+ */
13
+ export function getLoggerOptions() {
14
+ return globalOptions;
15
+ }
16
+ /**
17
+ * Logger with verbosity support
18
+ */
19
+ export const log = {
20
+ info: (msg) => {
21
+ if (globalOptions.json)
22
+ return;
23
+ if (!globalOptions.quiet)
24
+ console.log(chalk.blue('ℹ'), msg);
25
+ },
26
+ success: (msg) => {
27
+ if (globalOptions.json)
28
+ return;
29
+ console.log(chalk.green('✓'), msg);
30
+ },
31
+ warn: (msg) => {
32
+ if (globalOptions.json)
33
+ return;
34
+ console.log(chalk.yellow('⚠'), msg);
35
+ },
36
+ error: (msg) => {
37
+ if (globalOptions.json) {
38
+ console.error(JSON.stringify({ error: msg }));
39
+ }
40
+ else {
41
+ console.error(chalk.red('✗'), msg);
42
+ }
43
+ },
44
+ dim: (msg) => {
45
+ if (globalOptions.json)
46
+ return;
47
+ if (!globalOptions.quiet)
48
+ console.log(chalk.dim(msg));
49
+ },
50
+ debug: (msg) => {
51
+ if (globalOptions.json)
52
+ return;
53
+ if (globalOptions.verbose)
54
+ console.log(chalk.gray('[debug]'), msg);
55
+ },
56
+ json: (data) => {
57
+ if (globalOptions.json) {
58
+ console.log(JSON.stringify(data, null, 2));
59
+ }
60
+ },
61
+ };
62
+ /**
63
+ * Create a spinner (respects quiet/json modes)
64
+ */
65
+ export function spinner(text) {
66
+ if (globalOptions.quiet || globalOptions.json) {
67
+ // Return a no-op spinner
68
+ const noop = () => noopSpinner;
69
+ const noopSpinner = {
70
+ start: noop,
71
+ stop: noop,
72
+ succeed: noop,
73
+ fail: noop,
74
+ warn: noop,
75
+ info: noop,
76
+ stopAndPersist: noop,
77
+ clear: noop,
78
+ render: noop,
79
+ frame: noop,
80
+ };
81
+ return noopSpinner;
82
+ }
83
+ return ora({ text, spinner: 'dots' });
84
+ }
85
+ /**
86
+ * Table utilities for status display
87
+ */
88
+ export const table = {
89
+ header: (text) => {
90
+ if (globalOptions.json)
91
+ return;
92
+ console.log(chalk.bold.underline(text));
93
+ },
94
+ row: (status, file) => {
95
+ if (globalOptions.json)
96
+ return;
97
+ const icons = {
98
+ unchanged: chalk.dim('○'),
99
+ modified: chalk.yellow('✎'),
100
+ deleted: chalk.red('✗'),
101
+ added: chalk.green('+'),
102
+ conflict: chalk.red('⚡'),
103
+ };
104
+ console.log(` ${icons[status] || '?'} ${file}`);
105
+ },
106
+ };
107
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type ConflictAction = 'keep' | 'overwrite' | 'diff' | 'backup';
2
+ /**
3
+ * Confirm overwrite of existing .agent/ folder
4
+ */
5
+ export declare function confirmOverwrite(): Promise<boolean>;
6
+ /**
7
+ * Prompt for conflict resolution
8
+ */
9
+ export declare function promptConflict(filePath: string): Promise<ConflictAction>;
10
+ /**
11
+ * Select files to restore
12
+ */
13
+ export declare function selectFilesToRestore(files: string[]): Promise<string[]>;
14
+ /**
15
+ * Confirm restore action
16
+ */
17
+ export declare function confirmRestore(count: number): Promise<boolean>;
18
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtE;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAUzD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAe9E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAU7E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE"}
@@ -0,0 +1,63 @@
1
+ import inquirer from 'inquirer';
2
+ /**
3
+ * Confirm overwrite of existing .agent/ folder
4
+ */
5
+ export async function confirmOverwrite() {
6
+ const { confirm } = await inquirer.prompt([
7
+ {
8
+ type: 'confirm',
9
+ name: 'confirm',
10
+ message: '.agent/ folder already exists. Overwrite? (backup will be created)',
11
+ default: false,
12
+ },
13
+ ]);
14
+ return confirm;
15
+ }
16
+ /**
17
+ * Prompt for conflict resolution
18
+ */
19
+ export async function promptConflict(filePath) {
20
+ const { action } = await inquirer.prompt([
21
+ {
22
+ type: 'list',
23
+ name: 'action',
24
+ message: `Conflict: ${filePath}`,
25
+ choices: [
26
+ { name: 'Keep yours (skip update)', value: 'keep' },
27
+ { name: 'Use upstream (overwrite)', value: 'overwrite' },
28
+ { name: 'View diff', value: 'diff' },
29
+ { name: 'Backup & update', value: 'backup' },
30
+ ],
31
+ },
32
+ ]);
33
+ return action;
34
+ }
35
+ /**
36
+ * Select files to restore
37
+ */
38
+ export async function selectFilesToRestore(files) {
39
+ const { selected } = await inquirer.prompt([
40
+ {
41
+ type: 'checkbox',
42
+ name: 'selected',
43
+ message: 'Select files to restore:',
44
+ choices: files.map(f => ({ name: f, value: f })),
45
+ },
46
+ ]);
47
+ return selected;
48
+ }
49
+ /**
50
+ * Confirm restore action
51
+ */
52
+ export async function confirmRestore(count) {
53
+ const { confirm } = await inquirer.prompt([
54
+ {
55
+ type: 'confirm',
56
+ name: 'confirm',
57
+ message: `Restore ${count} file(s) to original? (backups will be created)`,
58
+ default: false,
59
+ },
60
+ ]);
61
+ return confirm;
62
+ }
63
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAIhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;QAC9D;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,oEAAoE;YAC7E,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA6B;QACnE;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,aAAa,QAAQ,EAAE;YAChC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE;gBACnD,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,WAAW,EAAE;gBACxD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;gBACpC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE;aAC7C;SACF;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAe;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;QACjE;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,0BAA0B;YACnC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SACjD;KACF,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;QAC9D;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,WAAW,KAAK,iDAAiD;YAC1E,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/man/ba-kit.1 ADDED
@@ -0,0 +1,194 @@
1
+ .TH BA-KIT 1 "January 2026" "ba-kit-cli" "User Commands"
2
+
3
+ .SH NAME
4
+ ba-kit \- CLI tool for scaffolding BA-Kit into projects
5
+
6
+ .SH SYNOPSIS
7
+ .B ba-kit
8
+ [\fIOPTIONS\fR]
9
+ .IR COMMAND
10
+ [\fICOMMAND_OPTIONS\fR]
11
+
12
+ .SH DESCRIPTION
13
+ ba-kit is a command-line tool for initializing, updating, and managing
14
+ BA-Kit installations in your projects. It uses manifest-based tracking
15
+ to detect changes and handle updates gracefully.
16
+
17
+ .SH GLOBAL OPTIONS
18
+ .TP
19
+ .BR \-V ", " \-\-version
20
+ Display version number
21
+
22
+ .TP
23
+ .BR \-v ", " \-\-verbose
24
+ Enable verbose output
25
+
26
+ .TP
27
+ .BR \-q ", " \-\-quiet
28
+ Suppress non-essential output
29
+
30
+ .TP
31
+ .BR \-\-json
32
+ Output in JSON format
33
+
34
+ .TP
35
+ .BR \-h ", " \-\-help
36
+ Display help message
37
+
38
+ .SH COMMANDS
39
+
40
+ .SS init [path]
41
+ Initialize BA-Kit in the current or specified directory.
42
+
43
+ Options:
44
+ .RS
45
+ .TP
46
+ .BR \-f ", " \-\-force
47
+ Overwrite existing .agent/ folder
48
+ .TP
49
+ .BR \-b ", " \-\-branch " " \fIBRANCH\fR
50
+ Branch to use (default: main)
51
+ .TP
52
+ .BR \-l ", " \-\-local " " \fIPATH\fR
53
+ Use local ba-kit source instead of GitHub
54
+ .RE
55
+
56
+ .SS status
57
+ Show BA-Kit installation status.
58
+
59
+ Options:
60
+ .RS
61
+ .TP
62
+ .BR \-\-remote
63
+ Check against remote for updates
64
+ .RE
65
+
66
+ .SS update
67
+ Update BA-Kit to the latest version.
68
+
69
+ Options:
70
+ .RS
71
+ .TP
72
+ .BR \-y ", " \-\-yes
73
+ Auto-accept non-conflicting updates
74
+ .TP
75
+ .BR \-\-dry-run
76
+ Show changes without applying
77
+ .TP
78
+ .BR \-l ", " \-\-local " " \fIPATH\fR
79
+ Use local ba-kit source
80
+ .RE
81
+
82
+ .SS restore [file]
83
+ Restore modified files to their original state.
84
+
85
+ Options:
86
+ .RS
87
+ .TP
88
+ .BR \-a ", " \-\-all
89
+ Restore all modified files
90
+ .TP
91
+ .BR \-y ", " \-\-yes
92
+ Skip confirmation prompt
93
+ .TP
94
+ .BR \-l ", " \-\-local " " \fIPATH\fR
95
+ Use local ba-kit source
96
+ .RE
97
+
98
+ .SS completion <shell>
99
+ Generate shell completion script.
100
+
101
+ Arguments:
102
+ .RS
103
+ .TP
104
+ .I shell
105
+ Shell type: bash, zsh, or fish
106
+ .RE
107
+
108
+ .SS cache
109
+ Manage download cache.
110
+
111
+ Options:
112
+ .RS
113
+ .TP
114
+ .BR \-\-clear
115
+ Clear the cache
116
+ .RE
117
+
118
+ .SH FILES
119
+ .TP
120
+ .I .agent/.ba-kit.json
121
+ Manifest file tracking installed files and versions
122
+
123
+ .TP
124
+ .I .ba-kitrc
125
+ Project-level configuration file
126
+
127
+ .TP
128
+ .I ~/.config/ba-kit/config.json
129
+ Global configuration file
130
+
131
+ .TP
132
+ .I ~/.cache/ba-kit/
133
+ Download cache directory
134
+
135
+ .SH EXIT STATUS
136
+ .TP
137
+ .B 0
138
+ Success
139
+ .TP
140
+ .B 1
141
+ General error
142
+ .TP
143
+ .B 2
144
+ Usage error
145
+ .TP
146
+ .B 3
147
+ Not installed error
148
+ .TP
149
+ .B 4
150
+ Network error
151
+ .TP
152
+ .B 5
153
+ Conflict error
154
+
155
+ .SH EXAMPLES
156
+ .PP
157
+ Initialize BA-Kit in current directory:
158
+ .RS
159
+ .B ba-kit init
160
+ .RE
161
+
162
+ .PP
163
+ Update with automatic acceptance:
164
+ .RS
165
+ .B ba-kit update --yes
166
+ .RE
167
+
168
+ .PP
169
+ Check status against remote:
170
+ .RS
171
+ .B ba-kit status --remote
172
+ .RE
173
+
174
+ .PP
175
+ Restore all modified files:
176
+ .RS
177
+ .B ba-kit restore --all --yes
178
+ .RE
179
+
180
+ .PP
181
+ Generate zsh completions:
182
+ .RS
183
+ .B ba-kit completion zsh >> ~/.zshrc
184
+ .RE
185
+
186
+ .SH SEE ALSO
187
+ .BR npm (1),
188
+ .BR node (1)
189
+
190
+ .SH BUGS
191
+ Report bugs at https://github.com/anthropics/ba-kit-cli/issues
192
+
193
+ .SH AUTHOR
194
+ Anthropic <https://anthropic.com>
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "ba-kit-cli",
3
+ "version": "2.0.0",
4
+ "description": "CLI tool for scaffolding BA-Kit into projects",
5
+ "type": "module",
6
+ "bin": {
7
+ "ba-kit": "./bin/ba-kit.js"
8
+ },
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "man": "./man/ba-kit.1",
12
+ "files": [
13
+ "bin",
14
+ "dist",
15
+ "man",
16
+ "README.md"
17
+ ],
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ },
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "clean": "rm -rf dist",
24
+ "dev": "tsx src/index.ts",
25
+ "man": "tsx scripts/generate-man.ts",
26
+ "prepublishOnly": "npm run clean && npm run build && npm run man && npm test",
27
+ "release": "tsx scripts/release.ts",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "test:coverage": "vitest run --coverage",
31
+ "lint": "tsc --noEmit",
32
+ "link": "npm link"
33
+ },
34
+ "keywords": [
35
+ "ba-kit",
36
+ "business-analysis",
37
+ "requirements",
38
+ "scaffolding",
39
+ "cli",
40
+ "ai-agent",
41
+ "claude",
42
+ "anthropic"
43
+ ],
44
+ "author": "Anthropic",
45
+ "license": "MIT",
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/anthropics/ba-kit-cli.git"
49
+ },
50
+ "bugs": {
51
+ "url": "https://github.com/anthropics/ba-kit-cli/issues"
52
+ },
53
+ "homepage": "https://github.com/anthropics/ba-kit-cli#readme",
54
+ "publishConfig": {
55
+ "access": "public",
56
+ "registry": "https://registry.npmjs.org/"
57
+ },
58
+ "dependencies": {
59
+ "chalk": "^5.6.2",
60
+ "commander": "^14.0.2",
61
+ "diff": "^8.0.2",
62
+ "inquirer": "^13.1.0",
63
+ "ora": "^9.0.0",
64
+ "tar": "^7.5.2",
65
+ "zod": "^4.3.5"
66
+ },
67
+ "devDependencies": {
68
+ "@types/diff": "^7.0.2",
69
+ "@types/inquirer": "^9.0.7",
70
+ "@types/node": "^25.0.3",
71
+ "@types/tar": "^6.1.13",
72
+ "@vitest/coverage-v8": "^4.0.16",
73
+ "tsx": "^4.21.0",
74
+ "typescript": "^5.9.3",
75
+ "vitest": "^4.0.16"
76
+ }
77
+ }