harness-bujang 0.4.0 → 0.4.2
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 +4 -4
- package/dist/index.js +12 -48
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,11 +10,11 @@ Install the [Harness-Bujang](https://github.com/bjcho4141/harness-bujang) multi-
|
|
|
10
10
|
# Interactive setup — prompts for language, backend, etc.
|
|
11
11
|
npx harness-bujang init
|
|
12
12
|
|
|
13
|
-
# Non-interactive (CI / scripts) — accept all defaults
|
|
13
|
+
# Non-interactive (CI / scripts) — accept all defaults (Korean agents)
|
|
14
14
|
npx harness-bujang init --yes
|
|
15
15
|
|
|
16
|
-
#
|
|
17
|
-
npx harness-bujang init --lang=
|
|
16
|
+
# English agents (default is Korean from 0.4.2+)
|
|
17
|
+
npx harness-bujang init --lang=en
|
|
18
18
|
|
|
19
19
|
# Different folder, skip the chat-room UI
|
|
20
20
|
npx harness-bujang init --target=./my-app --no-template
|
|
@@ -52,7 +52,7 @@ npx harness-bujang chat --create
|
|
|
52
52
|
npx harness-bujang init [options]
|
|
53
53
|
|
|
54
54
|
Options:
|
|
55
|
-
--lang=<ko|en> Agent language (default:
|
|
55
|
+
--lang=<ko|en> Agent language (default: ko — full 부장 persona)
|
|
56
56
|
--target=<path> Project root (default: .)
|
|
57
57
|
--framework=<name> Override detected framework
|
|
58
58
|
--db=<name> Override detected DB
|
package/dist/index.js
CHANGED
|
@@ -406,10 +406,10 @@ async function runInit(args) {
|
|
|
406
406
|
}
|
|
407
407
|
async function promptInteractive(opts, scan) {
|
|
408
408
|
const lang = await select({
|
|
409
|
-
message: "Agent language",
|
|
409
|
+
message: "Agent language / \uC5D0\uC774\uC804\uD2B8 \uC5B8\uC5B4",
|
|
410
410
|
choices: [
|
|
411
|
-
{ name: "
|
|
412
|
-
{ name: "
|
|
411
|
+
{ name: "\uD55C\uAD6D\uC5B4 \u2014 full \uBD80\uC7A5 persona (Korean)", value: "ko" },
|
|
412
|
+
{ name: "English", value: "en" }
|
|
413
413
|
],
|
|
414
414
|
default: opts.lang
|
|
415
415
|
});
|
|
@@ -431,7 +431,7 @@ async function promptInteractive(opts, scan) {
|
|
|
431
431
|
return { ...opts, lang, chatBackend, installTemplate };
|
|
432
432
|
}
|
|
433
433
|
function parseArgs(args) {
|
|
434
|
-
const lang = getFlag(args, "--lang") ?? "
|
|
434
|
+
const lang = getFlag(args, "--lang") ?? "ko";
|
|
435
435
|
if (!["ko", "en"].includes(lang)) {
|
|
436
436
|
throw new Error(`--lang must be "ko" or "en", got "${lang}"`);
|
|
437
437
|
}
|
|
@@ -1354,17 +1354,18 @@ function render() {
|
|
|
1354
1354
|
}
|
|
1355
1355
|
html += '</div>';
|
|
1356
1356
|
|
|
1357
|
-
//
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
html += '<
|
|
1357
|
+
// Footer \u2014 read-only viewer reminder. The viewer is a monitor for agent
|
|
1358
|
+
// activity; real commands go to Claude Code itself. (Auto-pickup of
|
|
1359
|
+
// principal messages from this viewer is on the roadmap.)
|
|
1360
|
+
html += '<div class="px-4 py-2 bg-white border-t border-gray-200 text-center">';
|
|
1361
|
+
html += '<p class="text-xs text-gray-400">\uC77D\uAE30 \uC804\uC6A9 \uBDF0\uC5B4 \u2014 \uBA85\uB839\uC740 Claude Code \uD130\uBBF8\uB110\uC5D0\uC11C \uBD80\uC7A5\uB2D8\uAED8 \uC9C1\uC811 \uB9D0\uC500\uD558\uC138\uC694</p>';
|
|
1361
1362
|
html += '</div>';
|
|
1362
1363
|
}
|
|
1363
1364
|
html += '</div>';
|
|
1364
1365
|
|
|
1365
1366
|
root.innerHTML = html;
|
|
1366
1367
|
|
|
1367
|
-
// Re-bind handlers
|
|
1368
|
+
// Re-bind room-click handlers (room list).
|
|
1368
1369
|
document.querySelectorAll('[data-room-id]').forEach((el) => {
|
|
1369
1370
|
el.addEventListener('click', () => {
|
|
1370
1371
|
state.selectedRoom = el.getAttribute('data-room-id');
|
|
@@ -1377,43 +1378,6 @@ function render() {
|
|
|
1377
1378
|
});
|
|
1378
1379
|
});
|
|
1379
1380
|
|
|
1380
|
-
const input = document.getElementById('msg-input');
|
|
1381
|
-
const sendBtn = document.getElementById('send-btn');
|
|
1382
|
-
if (input && sendBtn) {
|
|
1383
|
-
const send = async () => {
|
|
1384
|
-
const text = input.value.trim();
|
|
1385
|
-
if (!text) return;
|
|
1386
|
-
input.disabled = true;
|
|
1387
|
-
sendBtn.disabled = true;
|
|
1388
|
-
try {
|
|
1389
|
-
const target = state.selectedRoom === '\uB300\uD45C\uB2D8' ? '\uBD80\uC7A5' : (state.selectedRoom || '\uBD80\uC7A5');
|
|
1390
|
-
await fetch('/api/messages', {
|
|
1391
|
-
method: 'POST',
|
|
1392
|
-
headers: { 'content-type': 'application/json' },
|
|
1393
|
-
body: JSON.stringify({
|
|
1394
|
-
from: '\uB300\uD45C\uB2D8',
|
|
1395
|
-
to: target,
|
|
1396
|
-
type: 'command',
|
|
1397
|
-
message: text,
|
|
1398
|
-
severity: 'info',
|
|
1399
|
-
}),
|
|
1400
|
-
});
|
|
1401
|
-
input.value = '';
|
|
1402
|
-
await refresh();
|
|
1403
|
-
const conv = document.getElementById('conversation');
|
|
1404
|
-
if (conv) conv.scrollTop = conv.scrollHeight;
|
|
1405
|
-
} catch (e) {
|
|
1406
|
-
alert('\uC804\uC1A1 \uC2E4\uD328: ' + e.message);
|
|
1407
|
-
}
|
|
1408
|
-
input.disabled = false;
|
|
1409
|
-
sendBtn.disabled = false;
|
|
1410
|
-
input.focus();
|
|
1411
|
-
};
|
|
1412
|
-
sendBtn.addEventListener('click', send);
|
|
1413
|
-
input.addEventListener('keydown', (e) => { if (e.key === 'Enter') send(); });
|
|
1414
|
-
input.focus();
|
|
1415
|
-
}
|
|
1416
|
-
|
|
1417
1381
|
// Auto-scroll the selected room to the bottom on first render of that room.
|
|
1418
1382
|
const conv = document.getElementById('conversation');
|
|
1419
1383
|
if (conv && conv.dataset.scrolled !== state.selectedRoom) {
|
|
@@ -1871,7 +1835,7 @@ ${c6.bold("Usage:")}
|
|
|
1871
1835
|
npx harness-bujang ${c6.cyan("migrate")} --to=<sqlite|supabase> Move chat data between backends
|
|
1872
1836
|
|
|
1873
1837
|
${c6.bold("Options for init:")}
|
|
1874
|
-
--lang=<ko|en> Agent language (default:
|
|
1838
|
+
--lang=<ko|en> Agent language (default: ko \u2014 full \uBD80\uC7A5 persona)
|
|
1875
1839
|
--chat=<sqlite|supabase> Chat-room backend (default: sqlite \u2014 local file, no setup)
|
|
1876
1840
|
--commit-chat Don't gitignore .harness/ (for solo cross-machine sync via git)
|
|
1877
1841
|
--target=<path> Project root (default: cwd)
|
|
@@ -1948,7 +1912,7 @@ async function main() {
|
|
|
1948
1912
|
break;
|
|
1949
1913
|
case "--version":
|
|
1950
1914
|
case "-v":
|
|
1951
|
-
console.log("0.4.
|
|
1915
|
+
console.log("0.4.2");
|
|
1952
1916
|
break;
|
|
1953
1917
|
case "--help":
|
|
1954
1918
|
case "-h":
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harness-bujang",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Install the Harness-Bujang multi-agent harness into any project — Director, 7 specialist teams, real-time chat-room UI. Korean and English personas. Works with Claude Code, Cursor, Cline, Aider, or any tool that reads .claude/agents/.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|