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
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # ba-kit-cli
2
+
3
+ CLI tool for scaffolding [BA-Kit](https://github.com/anthropics/ba-kit) into your projects.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g ba-kit-cli
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Initialize BA-Kit
14
+
15
+ ```bash
16
+ # Initialize in current directory
17
+ ba-kit init
18
+
19
+ # Initialize in specific directory
20
+ ba-kit init ./my-project
21
+
22
+ # Force overwrite existing installation
23
+ ba-kit init --force
24
+
25
+ # Use specific branch
26
+ ba-kit init --branch develop
27
+ ```
28
+
29
+ ### Check Status
30
+
31
+ ```bash
32
+ # Show installation status
33
+ ba-kit status
34
+
35
+ # Check for remote updates
36
+ ba-kit status --remote
37
+ ```
38
+
39
+ ### Update BA-Kit
40
+
41
+ ```bash
42
+ # Interactive update with conflict resolution
43
+ ba-kit update
44
+
45
+ # Auto-accept non-conflicting updates
46
+ ba-kit update --yes
47
+
48
+ # Preview changes without applying
49
+ ba-kit update --dry-run
50
+ ```
51
+
52
+ ### Restore Modified Files
53
+
54
+ ```bash
55
+ # Interactive file selection
56
+ ba-kit restore
57
+
58
+ # Restore specific file
59
+ ba-kit restore skills/core/planning.md
60
+
61
+ # Restore all modified files
62
+ ba-kit restore --all
63
+
64
+ # Skip confirmation
65
+ ba-kit restore --all --yes
66
+ ```
67
+
68
+ ## Commands
69
+
70
+ | Command | Description |
71
+ |---------|-------------|
72
+ | `init [path]` | Initialize BA-Kit in current or specified directory |
73
+ | `status` | Show BA-Kit installation status |
74
+ | `update` | Update BA-Kit to latest version |
75
+ | `restore [file]` | Restore modified files to original |
76
+
77
+ ## Options
78
+
79
+ ### Global
80
+
81
+ | Option | Description |
82
+ |--------|-------------|
83
+ | `-V, --version` | Display version |
84
+ | `-h, --help` | Display help |
85
+
86
+ ### init
87
+
88
+ | Option | Description |
89
+ |--------|-------------|
90
+ | `-f, --force` | Overwrite existing .agent/ folder |
91
+ | `-b, --branch <branch>` | Branch to use (default: main) |
92
+ | `-l, --local <path>` | Use local ba-kit source |
93
+
94
+ ### update
95
+
96
+ | Option | Description |
97
+ |--------|-------------|
98
+ | `-y, --yes` | Auto-accept non-conflicting updates |
99
+ | `--dry-run` | Show changes without applying |
100
+ | `-l, --local <path>` | Use local ba-kit source |
101
+
102
+ ### status
103
+
104
+ | Option | Description |
105
+ |--------|-------------|
106
+ | `--remote` | Check against remote for updates |
107
+
108
+ ### restore
109
+
110
+ | Option | Description |
111
+ |--------|-------------|
112
+ | `-a, --all` | Restore all modified files |
113
+ | `-y, --yes` | Skip confirmation prompt |
114
+ | `-l, --local <path>` | Use local ba-kit source |
115
+
116
+ ## How It Works
117
+
118
+ BA-Kit CLI uses a manifest-based approach to track files:
119
+
120
+ 1. **Init**: Downloads BA-Kit from GitHub, copies files to `.agent/`, creates manifest with SHA-256 hashes
121
+ 2. **Status**: Compares current file hashes against manifest to detect modifications
122
+ 3. **Update**: Downloads latest version, detects conflicts between local changes and upstream updates
123
+ 4. **Restore**: Downloads original files and restores modified files with automatic backups
124
+
125
+ ### Manifest
126
+
127
+ The manifest file (`.agent/.ba-kit-manifest.json`) tracks:
128
+ - Installed version
129
+ - Branch used
130
+ - File hashes (original and current)
131
+ - Installation/update timestamps
132
+
133
+ ### Conflict Resolution
134
+
135
+ When both local and upstream files have changed, the update command offers:
136
+ - **Keep local**: Preserve your modifications
137
+ - **Overwrite**: Accept upstream changes
138
+ - **View diff**: Compare changes side-by-side
139
+ - **Backup & overwrite**: Save local copy before updating
140
+
141
+ ## Development
142
+
143
+ ```bash
144
+ # Clone the repo
145
+ git clone https://github.com/anthropics/ba-kit-cli.git
146
+ cd ba-kit-cli
147
+
148
+ # Install dependencies
149
+ npm install
150
+
151
+ # Link for local development
152
+ npm link
153
+
154
+ # Test with local ba-kit source
155
+ ba-kit init --local /path/to/ba-kit
156
+ ```
157
+
158
+ ## License
159
+
160
+ MIT
package/bin/ba-kit.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
@@ -0,0 +1,8 @@
1
+ export interface CacheOptions {
2
+ clear?: boolean;
3
+ }
4
+ /**
5
+ * Manage ba-kit download cache
6
+ */
7
+ export declare function cache(options: CacheOptions): Promise<void>;
8
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhE"}
@@ -0,0 +1,43 @@
1
+ import { log } from '../utils/logger.js';
2
+ import { clearCache, getCacheStats } from '../lib/cache.js';
3
+ /**
4
+ * Manage ba-kit download cache
5
+ */
6
+ export async function cache(options) {
7
+ if (options.clear) {
8
+ await clearCache();
9
+ log.success('Cache cleared');
10
+ return;
11
+ }
12
+ // Show cache info using cache manager
13
+ const stats = await getCacheStats();
14
+ console.log('');
15
+ log.info(`Location: ${stats.location}`);
16
+ log.info(`Entries: ${stats.entries}`);
17
+ log.info(`Size: ${formatBytes(stats.totalSize)}`);
18
+ if (stats.files.length > 0) {
19
+ console.log('');
20
+ log.dim('Cached tarballs:');
21
+ for (const file of stats.files) {
22
+ log.dim(` ${file.name} (${formatBytes(file.size)}, ${file.age})`);
23
+ }
24
+ }
25
+ console.log('');
26
+ if (stats.entries > 0) {
27
+ log.dim('Run `ba-kit cache --clear` to clear the cache');
28
+ }
29
+ else {
30
+ log.dim('Cache is empty');
31
+ }
32
+ }
33
+ /**
34
+ * Format bytes to human-readable string
35
+ */
36
+ function formatBytes(bytes) {
37
+ if (bytes < 1024)
38
+ return `${bytes} B`;
39
+ if (bytes < 1024 * 1024)
40
+ return `${(bytes / 1024).toFixed(1)} KB`;
41
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
42
+ }
43
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAe,MAAM,iBAAiB,CAAC;AAMzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAqB;IAC/C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,UAAU,EAAE,CAAC;QACnB,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,sCAAsC;IACtC,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxC,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEtD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shell completion scripts for ba-kit CLI
3
+ */
4
+ export type Shell = 'bash' | 'zsh' | 'fish';
5
+ /**
6
+ * Output shell completion script
7
+ */
8
+ export declare function completion(shell: Shell): void;
9
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+IH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CA0B7C"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Shell completion scripts for ba-kit CLI
3
+ */
4
+ const BASH_COMPLETION = `
5
+ _ba_kit_completion() {
6
+ local cur="\${COMP_WORDS[COMP_CWORD]}"
7
+ local commands="init update status restore completion cache help"
8
+
9
+ if [ "\${COMP_CWORD}" -eq 1 ]; then
10
+ COMPREPLY=( $(compgen -W "\${commands}" -- "\${cur}") )
11
+ else
12
+ case "\${COMP_WORDS[1]}" in
13
+ init)
14
+ COMPREPLY=( $(compgen -W "--force --branch --local --help" -- "\${cur}") )
15
+ ;;
16
+ update)
17
+ COMPREPLY=( $(compgen -W "--yes --dry-run --local --help" -- "\${cur}") )
18
+ ;;
19
+ status)
20
+ COMPREPLY=( $(compgen -W "--remote --help" -- "\${cur}") )
21
+ ;;
22
+ restore)
23
+ COMPREPLY=( $(compgen -W "--all --yes --local --help" -- "\${cur}") )
24
+ ;;
25
+ cache)
26
+ COMPREPLY=( $(compgen -W "--clear --help" -- "\${cur}") )
27
+ ;;
28
+ esac
29
+ fi
30
+ }
31
+ complete -F _ba_kit_completion ba-kit
32
+ `;
33
+ const ZSH_COMPLETION = `
34
+ #compdef ba-kit
35
+
36
+ _ba-kit() {
37
+ local -a commands
38
+ commands=(
39
+ 'init:Initialize BA-Kit in current or specified directory'
40
+ 'update:Update BA-Kit to latest version'
41
+ 'status:Show BA-Kit installation status'
42
+ 'restore:Restore modified files to original'
43
+ 'completion:Generate shell completion script'
44
+ 'cache:Manage download cache'
45
+ 'help:Display help for command'
46
+ )
47
+
48
+ _arguments -C \\
49
+ '-v[Enable verbose output]' \\
50
+ '--verbose[Enable verbose output]' \\
51
+ '-q[Suppress non-essential output]' \\
52
+ '--quiet[Suppress non-essential output]' \\
53
+ '--json[Output in JSON format]' \\
54
+ '1: :->command' \\
55
+ '*:: :->args'
56
+
57
+ case $state in
58
+ command)
59
+ _describe 'command' commands
60
+ ;;
61
+ args)
62
+ case $words[1] in
63
+ init)
64
+ _arguments \\
65
+ '-f[Overwrite existing .agent/ folder]' \\
66
+ '--force[Overwrite existing .agent/ folder]' \\
67
+ '-b[Branch to use]:branch:' \\
68
+ '--branch[Branch to use]:branch:' \\
69
+ '-l[Use local ba-kit source]:path:_files -/' \\
70
+ '--local[Use local ba-kit source]:path:_files -/' \\
71
+ '1:path:_files -/'
72
+ ;;
73
+ update)
74
+ _arguments \\
75
+ '-y[Auto-accept non-conflicting updates]' \\
76
+ '--yes[Auto-accept non-conflicting updates]' \\
77
+ '--dry-run[Show changes without applying]' \\
78
+ '-l[Use local ba-kit source]:path:_files -/' \\
79
+ '--local[Use local ba-kit source]:path:_files -/'
80
+ ;;
81
+ status)
82
+ _arguments \\
83
+ '--remote[Check against remote for updates]'
84
+ ;;
85
+ restore)
86
+ _arguments \\
87
+ '-a[Restore all modified files]' \\
88
+ '--all[Restore all modified files]' \\
89
+ '-y[Skip confirmation prompt]' \\
90
+ '--yes[Skip confirmation prompt]' \\
91
+ '-l[Use local ba-kit source]:path:_files -/' \\
92
+ '--local[Use local ba-kit source]:path:_files -/'
93
+ ;;
94
+ cache)
95
+ _arguments \\
96
+ '--clear[Clear the download cache]'
97
+ ;;
98
+ esac
99
+ ;;
100
+ esac
101
+ }
102
+
103
+ _ba-kit
104
+ `;
105
+ const FISH_COMPLETION = `
106
+ complete -c ba-kit -f
107
+
108
+ # Global options
109
+ complete -c ba-kit -s v -l verbose -d 'Enable verbose output'
110
+ complete -c ba-kit -s q -l quiet -d 'Suppress non-essential output'
111
+ complete -c ba-kit -l json -d 'Output in JSON format'
112
+
113
+ # Commands
114
+ complete -c ba-kit -n '__fish_use_subcommand' -a 'init' -d 'Initialize BA-Kit'
115
+ complete -c ba-kit -n '__fish_use_subcommand' -a 'update' -d 'Update BA-Kit'
116
+ complete -c ba-kit -n '__fish_use_subcommand' -a 'status' -d 'Show status'
117
+ complete -c ba-kit -n '__fish_use_subcommand' -a 'restore' -d 'Restore files'
118
+ complete -c ba-kit -n '__fish_use_subcommand' -a 'completion' -d 'Generate completions'
119
+ complete -c ba-kit -n '__fish_use_subcommand' -a 'cache' -d 'Manage cache'
120
+
121
+ # init options
122
+ complete -c ba-kit -n '__fish_seen_subcommand_from init' -s f -l force -d 'Overwrite existing'
123
+ complete -c ba-kit -n '__fish_seen_subcommand_from init' -s b -l branch -d 'Branch to use'
124
+ complete -c ba-kit -n '__fish_seen_subcommand_from init' -s l -l local -d 'Local source'
125
+
126
+ # update options
127
+ complete -c ba-kit -n '__fish_seen_subcommand_from update' -s y -l yes -d 'Auto-accept'
128
+ complete -c ba-kit -n '__fish_seen_subcommand_from update' -l dry-run -d 'Preview only'
129
+ complete -c ba-kit -n '__fish_seen_subcommand_from update' -s l -l local -d 'Local source'
130
+
131
+ # status options
132
+ complete -c ba-kit -n '__fish_seen_subcommand_from status' -l remote -d 'Check remote'
133
+
134
+ # restore options
135
+ complete -c ba-kit -n '__fish_seen_subcommand_from restore' -s a -l all -d 'Restore all'
136
+ complete -c ba-kit -n '__fish_seen_subcommand_from restore' -s y -l yes -d 'Skip confirm'
137
+ complete -c ba-kit -n '__fish_seen_subcommand_from restore' -s l -l local -d 'Local source'
138
+
139
+ # cache options
140
+ complete -c ba-kit -n '__fish_seen_subcommand_from cache' -l clear -d 'Clear cache'
141
+ `;
142
+ /**
143
+ * Output shell completion script
144
+ */
145
+ export function completion(shell) {
146
+ switch (shell) {
147
+ case 'bash':
148
+ console.log(BASH_COMPLETION.trim());
149
+ break;
150
+ case 'zsh':
151
+ console.log(ZSH_COMPLETION.trim());
152
+ break;
153
+ case 'fish':
154
+ console.log(FISH_COMPLETION.trim());
155
+ break;
156
+ default:
157
+ console.error(`Unknown shell: ${shell}`);
158
+ console.error('Supported shells: bash, zsh, fish');
159
+ console.error('');
160
+ console.error('Usage:');
161
+ console.error(' # Bash');
162
+ console.error(' ba-kit completion bash >> ~/.bashrc');
163
+ console.error('');
164
+ console.error(' # Zsh');
165
+ console.error(' ba-kit completion zsh > ~/.zsh/completions/_ba-kit');
166
+ console.error('');
167
+ console.error(' # Fish');
168
+ console.error(' ba-kit completion fish > ~/.config/fish/completions/ba-kit.fish');
169
+ process.exit(1);
170
+ }
171
+ }
172
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BvB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEtB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCvB,CAAC;AAIF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,KAAK;YACR,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { InitOptions } from '../types.js';
2
+ /**
3
+ * Initialize BA-Kit in project
4
+ */
5
+ export declare function init(targetPath: string | undefined, options: InitOptions): Promise<void>;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,wBAAsB,IAAI,CACxB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA2Hf"}
@@ -0,0 +1,142 @@
1
+ import { join, resolve } from 'path';
2
+ import { rename, mkdir, access, stat, constants, readFile } from 'fs/promises';
3
+ import { log, spinner } from '../utils/logger.js';
4
+ import { CONFIG } from '../utils/constants.js';
5
+ import { agentDirExists, copyBaKitFiles } from '../lib/copier.js';
6
+ import { downloadBaKit, cleanupDownload } from '../lib/downloader.js';
7
+ import { createManifest, writeManifest } from '../lib/manifest.js';
8
+ import { confirmOverwrite } from '../utils/prompts.js';
9
+ /**
10
+ * Initialize BA-Kit in project
11
+ */
12
+ export async function init(targetPath, options) {
13
+ const projectPath = resolve(targetPath || process.cwd());
14
+ const branch = options.branch || CONFIG.DEFAULT_BRANCH;
15
+ // Validate target path exists and is writable
16
+ try {
17
+ const s = await stat(projectPath);
18
+ if (!s.isDirectory()) {
19
+ log.error(`${projectPath} is not a directory.`);
20
+ process.exit(1);
21
+ }
22
+ }
23
+ catch {
24
+ log.error(`${projectPath} does not exist.`);
25
+ process.exit(1);
26
+ }
27
+ try {
28
+ await access(projectPath, constants.W_OK);
29
+ }
30
+ catch {
31
+ log.error(`Cannot write to ${projectPath}. Check permissions.`);
32
+ process.exit(1);
33
+ }
34
+ log.info(`Initializing BA-Kit in ${projectPath}`);
35
+ // Check if .agent already exists
36
+ if (await agentDirExists(projectPath)) {
37
+ if (!options.force) {
38
+ const shouldContinue = await confirmOverwrite();
39
+ if (!shouldContinue) {
40
+ log.warn('Aborted. Use --force to overwrite existing installation.');
41
+ process.exit(1);
42
+ }
43
+ }
44
+ // Backup existing .agent
45
+ const backupPath = join(projectPath, CONFIG.BACKUP_DIR, `.agent-${Date.now()}`);
46
+ await mkdir(join(projectPath, CONFIG.BACKUP_DIR), { recursive: true });
47
+ await rename(join(projectPath, CONFIG.AGENT_DIR), backupPath);
48
+ log.dim(`Backed up existing .agent/ to ${CONFIG.BACKUP_DIR}/`);
49
+ }
50
+ let extractedPath;
51
+ let version;
52
+ let needsCleanup = true;
53
+ // Use local source if specified, otherwise download from GitHub
54
+ if (options.local) {
55
+ // Use local ba-kit source for testing
56
+ const localSpinner = spinner('Using local BA-Kit source...').start();
57
+ try {
58
+ extractedPath = resolve(options.local);
59
+ const s = await stat(extractedPath);
60
+ if (!s.isDirectory()) {
61
+ throw new Error('Local source must be a directory');
62
+ }
63
+ version = await getLocalVersion(extractedPath);
64
+ needsCleanup = false;
65
+ localSpinner.succeed(`Using local BA-Kit v${version}`);
66
+ }
67
+ catch (error) {
68
+ localSpinner.fail('Failed to use local source');
69
+ log.error(error.message);
70
+ process.exit(1);
71
+ }
72
+ }
73
+ else {
74
+ // Download ba-kit from GitHub
75
+ const downloadSpinner = spinner('Downloading BA-Kit from GitHub...').start();
76
+ try {
77
+ const result = await downloadBaKit(branch, projectPath);
78
+ extractedPath = result.extractedPath;
79
+ version = result.version;
80
+ downloadSpinner.succeed(`Downloaded BA-Kit v${version}`);
81
+ }
82
+ catch (error) {
83
+ downloadSpinner.fail('Failed to download BA-Kit');
84
+ log.error(error.message);
85
+ process.exit(1);
86
+ }
87
+ }
88
+ // Copy files
89
+ const copySpinner = spinner('Copying files to .agent/...').start();
90
+ let fileEntries;
91
+ try {
92
+ fileEntries = await copyBaKitFiles(extractedPath, projectPath);
93
+ const fileCount = Object.keys(fileEntries).length;
94
+ copySpinner.succeed(`Copied ${fileCount} files to .agent/`);
95
+ }
96
+ catch (error) {
97
+ copySpinner.fail('Failed to copy files');
98
+ log.error(error.message);
99
+ process.exit(1);
100
+ }
101
+ // Create manifest
102
+ const manifestSpinner = spinner('Creating manifest...').start();
103
+ try {
104
+ const manifest = createManifest(version, branch, fileEntries);
105
+ await writeManifest(projectPath, manifest);
106
+ manifestSpinner.succeed('Created .agent/.ba-kit.json');
107
+ }
108
+ catch (error) {
109
+ manifestSpinner.fail('Failed to create manifest');
110
+ log.error(error.message);
111
+ process.exit(1);
112
+ }
113
+ // Cleanup (only for downloaded files)
114
+ if (needsCleanup) {
115
+ await cleanupDownload(extractedPath);
116
+ }
117
+ // Success
118
+ console.log('');
119
+ log.success('BA-Kit initialized successfully!');
120
+ console.log('');
121
+ log.dim('Next steps:');
122
+ log.dim(' 1. Review files in .agent/');
123
+ log.dim(' 2. Add AGENT.MD reference to your AI config');
124
+ log.dim(' 3. Run `ba-kit status` to check installation');
125
+ console.log('');
126
+ }
127
+ /**
128
+ * Get version from local ba-kit source
129
+ */
130
+ async function getLocalVersion(path) {
131
+ try {
132
+ const changelog = await readFile(join(path, 'CHANGELOG.md'), 'utf8');
133
+ const match = changelog.match(/##\s+\[?v?(\d+\.\d+\.\d+)/);
134
+ if (match)
135
+ return match[1];
136
+ }
137
+ catch {
138
+ // ignore
139
+ }
140
+ return 'local';
141
+ }
142
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RestoreOptions } from '../types.js';
2
+ /**
3
+ * Restore modified files to original
4
+ */
5
+ export declare function restore(file: string | undefined, options: RestoreOptions): Promise<void>;
6
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAoJf"}