@stilero/bankan 1.0.4 → 1.0.6

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 CHANGED
@@ -75,7 +75,8 @@ Ban Kan starts a local server, opens your browser automatically, and serves the
75
75
  - One AI CLI tool:
76
76
  - claude
77
77
  - codex
78
- - Native build tools for node-pty
78
+
79
+ Native build tools may be needed only if `node-pty` has to compile during install.
79
80
 
80
81
  macOS: Xcode Command Line Tools
81
82
  Linux: build-essential
@@ -92,15 +93,17 @@ bankan
92
93
 
93
94
  2. Complete the setup wizard
94
95
 
95
- 3. Add one or more local repositories
96
+ 3. Configure agent CLIs in `Settings -> Implementation` and `Settings -> Review` as needed
97
+
98
+ 4. Add one or more repositories in `Settings -> General -> Repositories`
96
99
 
97
- 4. Create a task in the dashboard
100
+ 5. Create a task in the dashboard
98
101
 
99
- 5. Approve the generated plan
102
+ 6. Approve the generated plan
100
103
 
101
- 6. Watch agents implement and review the change
104
+ 7. Watch agents implement and review the change
102
105
 
103
- 7. Optionally create a pull request
106
+ 8. Optionally create a pull request
104
107
 
105
108
  ---
106
109
 
@@ -339,7 +342,7 @@ Useful scripts:
339
342
 
340
343
  - `npm run build` – build client bundle
341
344
  - `npm run dev` – run server + Vite client
342
- - `npm run setup` – interactive setup wizard
345
+ - `npm run setup` – interactive setup wizard for local runtime config
343
346
  - `npm run install:all` – install all dependencies
344
347
 
345
348
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stilero/bankan",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "type": "module",
5
5
  "description": "Run AI coding agents like a Kanban board. Plan, implement, review and ship code using parallel AI agents across your local repositories.",
6
6
  "license": "MIT",
package/scripts/setup.js CHANGED
@@ -102,20 +102,23 @@ async function main() {
102
102
  console.log(`\n ${red('⚠')} Neither claude nor codex CLI found. At least one is required.\n`);
103
103
  }
104
104
 
105
- // Check native build tools
106
- const platform = process.platform;
107
- if (platform === 'darwin') {
108
- try {
109
- execSync('xcode-select -p', { stdio: 'pipe' });
110
- console.log(` ${green('✓')} Xcode command line tools`);
111
- } catch {
112
- console.log(` ${yellow('')} Xcode CLI tools missing ${dim('(xcode-select --install)')}`);
113
- }
114
- } else if (platform === 'linux') {
115
- if (checkCommand('cc')) {
116
- console.log(` ${green('')} C compiler`);
117
- } else {
118
- console.log(` ${yellow('')} C compiler missing ${dim('(apt install build-essential)')}`);
105
+ if (!IS_PACKAGED_RUNTIME) {
106
+ console.log(` ${dim('Note: native build tools may be needed if npm has to compile node-pty during install.')}`);
107
+
108
+ const platform = process.platform;
109
+ if (platform === 'darwin') {
110
+ try {
111
+ execSync('xcode-select -p', { stdio: 'pipe' });
112
+ console.log(` ${green('')} Xcode command line tools available`);
113
+ } catch {
114
+ console.log(` ${yellow('⚠')} Xcode CLI tools not found ${dim('(only needed if node-pty builds from source: xcode-select --install)')}`);
115
+ }
116
+ } else if (platform === 'linux') {
117
+ if (checkCommand('cc')) {
118
+ console.log(` ${green('')} C compiler available`);
119
+ } else {
120
+ console.log(` ${yellow('⚠')} C compiler not found ${dim('(only needed if node-pty builds from source: apt install build-essential)')}`);
121
+ }
119
122
  }
120
123
  }
121
124
 
@@ -127,58 +130,20 @@ async function main() {
127
130
 
128
131
  // Step 3: Project Config
129
132
  console.log(bold(' Project Configuration\n'));
130
-
131
- const reposHint = existing.REPOS ? dim(` (${existing.REPOS}), Enter to keep`) : '';
132
- const reposAnswer = await ask(` REPOS (comma-separated git repo paths)${reposHint}: `);
133
- if (reposAnswer.trim()) {
134
- config.REPOS = reposAnswer.trim();
135
- }
136
-
137
- if (config.REPOS) {
138
- const repoPaths = config.REPOS.split(',').map(s => s.trim()).filter(Boolean);
139
- for (const repoPath of repoPaths) {
140
- try {
141
- execSync(`git -C "${repoPath}" rev-parse HEAD`, { stdio: 'pipe' });
142
- console.log(` ${green('✓')} ${repoPath} — valid git repo`);
143
- } catch {
144
- console.log(` ${yellow('⚠')} ${repoPath} — not a git repo or no commits yet`);
145
- }
146
- }
147
- }
148
-
149
- const ghRepoHint = existing.GITHUB_REPO ? dim(` (${existing.GITHUB_REPO}), Enter to keep`) : dim(' (optional, owner/repo)');
150
- const ghRepoAnswer = await ask(` GITHUB_REPO${ghRepoHint}: `);
151
- if (ghRepoAnswer.trim()) config.GITHUB_REPO = ghRepoAnswer.trim();
152
-
153
- const ghTokenHint = existing.GITHUB_TOKEN ? dim(' (already set, Enter to keep)') : dim(' (optional)');
154
- const ghTokenAnswer = await ask(` GITHUB_TOKEN${ghTokenHint}: `);
155
- if (ghTokenAnswer.trim()) config.GITHUB_TOKEN = ghTokenAnswer.trim();
156
-
133
+ console.log(` ${dim('Repositories are configured in the app under Settings → General → Repositories.')}`);
134
+ console.log(` ${dim('Use the workspace folder in Settings to choose where task workspaces are created.')}`);
157
135
  console.log('');
158
136
 
159
- // Step 5: Agent Config
160
- console.log(bold(' Agent Configuration\n'));
161
-
162
- const imp1Default = existing.IMPLEMENTOR_1_CLI || 'claude';
163
- const imp1Answer = await ask(` IMPLEMENTOR_1_CLI ${dim(`[${imp1Default}]`)}: `);
164
- config.IMPLEMENTOR_1_CLI = imp1Answer.trim() || imp1Default;
165
-
166
- const imp2Default = existing.IMPLEMENTOR_2_CLI || 'codex';
167
- const imp2Answer = await ask(` IMPLEMENTOR_2_CLI ${dim(`[${imp2Default}]`)}: `);
168
- config.IMPLEMENTOR_2_CLI = imp2Answer.trim() || imp2Default;
137
+ // Step 4: Runtime Config
138
+ console.log(bold(' Runtime Configuration\n'));
139
+ console.log(` ${dim('Agent CLI selection is configured in the app under Settings.')}`);
140
+ console.log('');
169
141
 
170
142
  config.PORT = existing.PORT || '3001';
171
143
 
172
- console.log('');
173
-
174
- // Step 6: Write .env.local
144
+ // Step 5: Write .env.local
175
145
  mkdirSync(runtimePaths.dataDir, { recursive: true });
176
146
  const envLines = [
177
- `REPOS=${config.REPOS || ''}`,
178
- `GITHUB_REPO=${config.GITHUB_REPO || ''}`,
179
- `GITHUB_TOKEN=${config.GITHUB_TOKEN || ''}`,
180
- `IMPLEMENTOR_1_CLI=${config.IMPLEMENTOR_1_CLI || 'claude'}`,
181
- `IMPLEMENTOR_2_CLI=${config.IMPLEMENTOR_2_CLI || 'codex'}`,
182
147
  `PORT=${config.PORT}`,
183
148
  ];
184
149
  writeFileSync(ENV_FILE, envLines.join('\n') + '\n');
@@ -193,7 +158,7 @@ async function main() {
193
158
  return;
194
159
  }
195
160
 
196
- // Step 7: Install Dependencies
161
+ // Step 6: Install Dependencies
197
162
  console.log(bold(' Installing dependencies...\n'));
198
163
 
199
164
  const installSteps = [
@@ -212,7 +177,7 @@ async function main() {
212
177
  }
213
178
  }
214
179
 
215
- // Step 8: Success
180
+ // Step 7: Success
216
181
  console.log('');
217
182
  console.log(green(bold(' ✓ Setup complete!')));
218
183
  console.log('');
@@ -220,6 +185,7 @@ async function main() {
220
185
  console.log(cyan(' npm start'));
221
186
  console.log('');
222
187
  console.log(` Then open: ${cyan('http://localhost:5173')}`);
188
+ console.log(` Configure repositories in ${cyan('Settings → General → Repositories')}.`);
223
189
  console.log('');
224
190
 
225
191
  rl.close();
@@ -28,8 +28,6 @@ function get(key, fallback = '') {
28
28
  const config = {
29
29
  PORT: parseInt(get('PORT', '3001'), 10),
30
30
  REPOS: get('REPOS').split(',').map(s => s.trim()).filter(Boolean),
31
- IMPLEMENTOR_1_CLI: get('IMPLEMENTOR_1_CLI', 'claude'),
32
- IMPLEMENTOR_2_CLI: get('IMPLEMENTOR_2_CLI', 'codex'),
33
31
  ROOT_DIR: runtimePaths.rootDir,
34
32
  DATA_DIR: runtimePaths.dataDir,
35
33
  CLIENT_DIST_DIR: runtimePaths.clientDistDir,
@@ -38,6 +36,11 @@ const config = {
38
36
  PACKAGED_RUNTIME: runtimePaths.packaged,
39
37
  };
40
38
 
39
+ function getLegacyImplementorCli() {
40
+ const legacyCli = get('IMPLEMENTOR_1_CLI', '');
41
+ return legacyCli === 'claude' || legacyCli === 'codex' ? legacyCli : 'claude';
42
+ }
43
+
41
44
  const DEFAULT_PROMPTS = {
42
45
  planning: `Plan Mode Instructions
43
46
 
@@ -105,7 +108,7 @@ export function getDefaults() {
105
108
  workspaceRoot: DEFAULT_WORKSPACES_DIR,
106
109
  agents: {
107
110
  planners: { max: 4, cli: 'claude' },
108
- implementors: { max: 8, cli: config.IMPLEMENTOR_1_CLI },
111
+ implementors: { max: 8, cli: getLegacyImplementorCli() },
109
112
  reviewers: { max: 4, cli: 'claude' },
110
113
  },
111
114
  prompts: { ...DEFAULT_PROMPTS },