@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 +10 -7
- package/package.json +1 -1
- package/scripts/setup.js +27 -61
- package/server/src/config.js +6 -3
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
|
-
|
|
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.
|
|
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
|
-
|
|
100
|
+
5. Create a task in the dashboard
|
|
98
101
|
|
|
99
|
-
|
|
102
|
+
6. Approve the generated plan
|
|
100
103
|
|
|
101
|
-
|
|
104
|
+
7. Watch agents implement and review the change
|
|
102
105
|
|
|
103
|
-
|
|
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.
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
|
160
|
-
console.log(bold('
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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();
|
package/server/src/config.js
CHANGED
|
@@ -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:
|
|
111
|
+
implementors: { max: 8, cli: getLegacyImplementorCli() },
|
|
109
112
|
reviewers: { max: 4, cli: 'claude' },
|
|
110
113
|
},
|
|
111
114
|
prompts: { ...DEFAULT_PROMPTS },
|