bada-terminal / menu-guide.html
VanyaJ's picture
Upload menu-guide.html with huggingface_hub
bed421b verified
Raw
History Blame Contribute Delete
27.7 kB
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BADA Terminal β€” Detailed Menu & Functional Specification</title>
<meta name="description" content="BADA Terminal의 각 화면별 메뉴 ꡬ쑰, μ‹œκ°μ  μ‘°μž‘λ²• 및 κΈ°λŠ₯적 상세 μ„€λͺ… 맀뉴얼">
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
<!-- Styling -->
<style>
:root {
--bg: #1e1e2e;
--mantle: #181825;
--crust: #11111b;
--text: #cdd6f4;
--subtext: #a6adc8;
--mauve: #cba6f7;
--blue: #89b4fa;
--lavender: #b4befe;
--green: #a6e3a1;
--yellow: #f9e2af;
--red: #f38ba8;
--peach: #fab387;
--teal: #94e2d5;
--surface0: #313244;
--surface1: #45475a;
--surface2: #585b70;
--overlay0: #6c7086;
--border: rgba(255, 255, 255, 0.06);
--glass-bg: rgba(24, 24, 37, 0.75);
--glass-border: rgba(255, 255, 255, 0.05);
--card-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.3);
--transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
body.light-theme {
--bg: #eff1f5;
--mantle: #e6e9ef;
--crust: #dce0e8;
--text: #4c4f69;
--subtext: #5c5f77;
--mauve: #8839ef;
--blue: #1e66f5;
--lavender: #7287fd;
--green: #40a02b;
--yellow: #df8e1d;
--red: #d20f39;
--peach: #fe640b;
--teal: #179287;
--surface0: #ccd0da;
--surface1: #bcc0cc;
--surface2: #acb0be;
--overlay0: #8c8fa1;
--border: rgba(0, 0, 0, 0.06);
--glass-bg: rgba(230, 233, 239, 0.85);
--glass-border: rgba(0, 0, 0, 0.08);
--card-shadow: 0 8px 24px 0 rgba(0, 0, 0, 0.08);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
width: 100%;
height: 100%;
background-color: var(--bg);
color: var(--text);
font-family: 'Outfit', -apple-system, BlinkMacSystemFont, sans-serif;
overflow: hidden;
transition: background-color 0.3s ease, color 0.3s ease;
}
#app-layout {
display: flex;
width: 100vw;
height: 100vh;
overflow: hidden;
}
/* Sidebar Navigation */
#sidebar {
width: 320px;
height: 100%;
background: var(--mantle);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
flex-shrink: 0;
}
#sidebar-header {
padding: 24px;
border-bottom: 1px solid var(--border);
display: flex;
flex-direction: column;
gap: 12px;
}
.brand-title {
font-size: 20px;
font-weight: 800;
background: linear-gradient(135deg, var(--mauve), var(--lavender));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
letter-spacing: -0.5px;
}
.brand-subtitle {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--subtext);
}
#sidebar-menu {
flex: 1;
overflow-y: auto;
padding: 16px 12px;
}
.menu-group {
margin-bottom: 20px;
}
.menu-group-title {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--overlay0);
padding-left: 12px;
margin-bottom: 8px;
}
.menu-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 8px;
color: var(--subtext);
text-decoration: none;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: var(--transition);
margin-bottom: 2px;
}
.menu-item:hover {
background: var(--surface0);
color: var(--text);
}
.menu-item.active {
background: rgba(203, 166, 247, 0.15);
color: var(--mauve);
font-weight: 600;
}
.menu-item-icon {
font-size: 16px;
width: 20px;
text-align: center;
}
#sidebar-footer {
padding: 16px 20px;
border-top: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
background: var(--crust);
}
.theme-toggle-btn {
background: var(--surface0);
border: 1px solid var(--surface1);
color: var(--text);
width: 32px;
height: 32px;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: var(--transition);
}
.theme-toggle-btn:hover {
background: var(--surface1);
border-color: var(--mauve);
color: var(--mauve);
}
.version-tag {
font-size: 11px;
font-family: 'JetBrains Mono', monospace;
color: var(--overlay0);
background: var(--surface0);
padding: 3px 8px;
border-radius: 4px;
}
/* Main Content */
#content-container {
flex: 1;
height: 100%;
overflow-y: auto;
background: var(--bg);
padding: 40px 60px;
scroll-behavior: smooth;
}
.doc-section {
display: none;
animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
max-width: 900px;
margin: 0 auto;
}
.doc-section.active {
display: block;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.section-header {
margin-bottom: 32px;
border-bottom: 1px solid var(--border);
padding-bottom: 20px;
}
.section-badge {
display: inline-block;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--mauve);
background: rgba(203, 166, 247, 0.12);
padding: 4px 10px;
border-radius: 99px;
margin-bottom: 12px;
}
h1 {
font-size: 32px;
font-weight: 800;
color: var(--text);
letter-spacing: -0.8px;
}
p.section-desc {
font-size: 15px;
color: var(--subtext);
margin-top: 8px;
line-height: 1.5;
}
h2 {
font-size: 20px;
font-weight: 700;
color: var(--text);
margin-top: 36px;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 10px;
}
h2::before {
content: '';
display: inline-block;
width: 4px;
height: 18px;
background: var(--mauve);
border-radius: 2px;
}
ul.doc-list {
list-style-type: none;
margin: 16px 0;
}
ul.doc-list li {
position: relative;
padding-left: 24px;
font-size: 14.5px;
color: var(--subtext);
line-height: 1.7;
margin-bottom: 12px;
}
ul.doc-list li::before {
content: '✦';
position: absolute;
left: 4px;
color: var(--mauve);
font-size: 12px;
}
.callout {
border-left: 4px solid var(--mauve);
background: rgba(203, 166, 247, 0.04);
padding: 18px;
border-radius: 0 8px 8px 0;
margin: 20px 0;
display: flex;
gap: 14px;
}
.callout-icon {
font-size: 20px;
line-height: 1;
}
.callout-content {
flex: 1;
}
.callout-title {
font-size: 14.5px;
font-weight: 700;
color: var(--text);
margin-bottom: 4px;
}
.callout-text {
font-size: 13.5px;
color: var(--subtext);
margin: 0;
line-height: 1.5;
}
.spec-block {
background: var(--mantle);
border: 1px solid var(--border);
border-radius: 12px;
padding: 24px;
margin: 24px 0;
}
.spec-title {
font-size: 16px;
font-weight: 700;
color: var(--text);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.spec-desc {
font-size: 13.5px;
color: var(--subtext);
line-height: 1.6;
}
.shortcut-table {
width: 100%;
border-collapse: collapse;
margin: 16px 0;
}
.shortcut-table th, .shortcut-table td {
border: 1px solid var(--border);
padding: 10px 14px;
font-size: 13.5px;
}
.shortcut-table th {
background: var(--crust);
color: var(--text);
font-weight: 600;
}
.shortcut-key {
font-family: 'JetBrains Mono', monospace;
background: var(--surface0);
color: var(--mauve);
padding: 2px 6px;
border-radius: 4px;
font-weight: 600;
}
</style>
</head>
<body>
<div id="app-layout">
<!-- Sidebar -->
<aside id="sidebar">
<div id="sidebar-header">
<div class="brand-title">πŸ“‹ UI Menu Guide</div>
<div class="brand-subtitle">Functional Specifications</div>
</div>
<nav id="sidebar-menu">
<div class="menu-group">
<div class="menu-group-title">κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€</div>
<div class="menu-item active" data-target="ui-terminal">
<span class="menu-item-icon">πŸ“Ί</span> 터미널 & 메인 μ œμ–΄
</div>
<div class="menu-item" data-target="ui-designer">
<span class="menu-item-icon">πŸ–ŒοΈ</span> μ›Œν¬ν”Œλ‘œμš° λ””μžμ΄λ„ˆ
</div>
<div class="menu-item" data-target="ui-monitor">
<span class="menu-item-icon">πŸ“‘</span> μ›Œν¬ν”Œλ‘œμš° μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°
</div>
</div>
<div class="menu-group">
<div class="menu-group-title">κ³ κΈ‰ κΈ°λŠ₯ λͺ¨λ“ˆ</div>
<div class="menu-item" data-target="ui-scheduler">
<span class="menu-item-icon">πŸ“†</span> 배치 μŠ€μΌ€μ€„λŸ¬ 관리
</div>
<div class="menu-item" data-target="ui-harness">
<span class="menu-item-icon">πŸ›‘οΈ</span> 검증 ν•˜λ„€μŠ€ ν†΅μ œ
</div>
<div class="menu-item" data-target="ui-knowledge">
<span class="menu-item-icon">πŸ’‘</span> 지식 κ·Έλž˜ν”„ & μœ„ν‚€
</div>
<div class="menu-item" data-target="ui-profiles">
<span class="menu-item-icon">πŸ‘€</span> μ—μ΄μ „νŠΈ 및 μ„€μ •
</div>
<div class="menu-item" data-target="ui-loop-builder">
<span class="menu-item-icon">πŸ”„</span> 루프 λΉŒλ” μœ„μžλ“œ
</div>
<div class="menu-item" data-target="ui-loop-dashboard">
<span class="menu-item-icon">πŸ“ˆ</span> 루프 λŒ€μ‹œλ³΄λ“œ & 이λ ₯
</div>
</div>
</nav>
<div id="sidebar-footer">
<button class="theme-toggle-btn" id="theme-toggle">πŸŒ“</button>
<span class="version-tag">UI Spec</span>
</div>
</aside>
<!-- Content -->
<main id="content-container">
<!-- Section: UI Terminal -->
<section id="ui-terminal" class="doc-section active">
<div class="section-header">
<span class="section-badge">Main Console</span>
<h1>터미널 & 메인 μ œμ–΄ λ·°</h1>
<p class="section-desc">μ‚¬μš©μžμ™€ μ—μ΄μ „νŠΈκ°€ μ‰˜ μ„Έμ…˜μ„ μ‹€μ‹œκ°„μœΌλ‘œ μΈν„°λž™μ…˜ν•˜λŠ” μ΅œμƒμœ„ 핡심 μ œμ–΄ ν™”λ©΄μž…λ‹ˆλ‹€.</p>
</div>
<h2>μ‹œκ°μ  ꡬ성 μš”μ†Œ</h2>
<ul class="doc-list">
<li><strong>PTY 가상 터미널 (Xterm.js)</strong>: κΈ€λ‘œλ²Œ μ‰˜ μ„Έμ…˜ 및 둜컬 Claude Code CLI ꡬ동 λ‚΄μš©μ„ 컬러 μ½”λ“œλ‘œ μ˜¨μ „ν•˜κ²Œ 좜λ ₯ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” ν‚€ μž…λ ₯을 톡해 승인 ν˜Ήμ€ ν”„λ‘¬ν”„νŠΈλ₯Ό μˆ˜λ™ μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.</li>
<li><strong>상단 μ—μ΄μ „νŠΈ ν‘œμ‹œ λ°” (Agent Info Bar)</strong>: ꡬ동 쀑인 λ…Έλ“œ μ—μ΄μ „νŠΈμ˜ μ•„μ΄μ½˜, 고유 식별 λͺ…μΉ­(예: <code>omc-autopilot</code>)을 λ…ΈμΆœν•˜λ©° 우츑의 <code>Manage</code> λ²„νŠΌμœΌλ‘œ μ„€μ • ν™”λ©΄μœΌλ‘œ 원클릭 λ§ν¬λ©λ‹ˆλ‹€.</li>
<li><strong>에디터 μΈμŠ€νŽ™ν„° νŒ¨λ„ (Slider Panel)</strong>: 우츑 μ˜μ—­μ— μˆ˜λ‚©λ˜λŠ” μ‚¬μ΄λ“œ νŒ¨λ„λ‘œ, μˆ˜μ •λœ 파일 λͺ©λ‘ νŠΈλ¦¬μ™€ νŠΉμ • μ†ŒμŠ€μ½”λ“œ ν…μŠ€νŠΈμ˜ ν•˜μ΄λΌμ΄νŠΈ μΈμŠ€νŽ™μ…˜ λΈŒλΌμš°μ €(Vditor 포함)λ₯Ό ν† κΈ€ λ…ΈμΆœν•©λ‹ˆλ‹€.</li>
</ul>
<h2>μ£Όμš” 단좕킀 μ œμ–΄</h2>
<table class="shortcut-table">
<thead>
<tr>
<th>κΈ°λŠ₯</th>
<th>단좕킀</th>
<th>μ„€λͺ…</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>에디터 μŠ¬λΌμ΄λ“œ ν† κΈ€</strong></td>
<td><span class="shortcut-key">Ctrl + E</span></td>
<td>우츑의 μ†ŒμŠ€μ½”λ“œ μΈμŠ€νŽ™ν„° νŒ¨λ„μ„ 즉각 μ—΄κ³  λ‹«μŠ΅λ‹ˆλ‹€.</td>
</tr>
<tr>
<td><strong>κ°•μ œ μ·¨μ†Œ (Force Abort)</strong></td>
<td><span class="shortcut-key">Ctrl + Shift + K</span></td>
<td>μž‘λ™ 쀑인 전체 PTY μ„Έμ…˜κ³Ό μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 일괄 κ°•μ œ μ’…λ£Œν•©λ‹ˆλ‹€.</td>
</tr>
<tr>
<td><strong>단좕킀 전체 μ„€λͺ… νŒμ—…</strong></td>
<td><span class="shortcut-key">F1</span></td>
<td>BADA 내뢀에 μ…‹μ—…λœ κΈ€λ‘œλ²Œ 메뉴 단좕킀 μ˜€λ²„λ ˆμ΄ νŒμ—…μ„ ν˜ΈμΆœν•©λ‹ˆλ‹€.</td>
</tr>
</tbody>
</table>
</section>
<!-- Section: UI Designer -->
<section id="ui-designer" class="doc-section">
<div class="section-header">
<span class="section-badge">Workflow Designer</span>
<h1>μ›Œν¬ν”Œλ‘œμš° λ””μžμ΄λ„ˆ</h1>
<p class="section-desc">λ…Έλ“œμ™€ λ°©ν–₯μ„± μ—£μ§€λ₯Ό κ²°ν•©ν•˜μ—¬ 볡합 루프 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ·Έλž˜ν”½ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ €μž‘ν•˜λŠ” μΊ”λ²„μŠ€μž…λ‹ˆλ‹€.</p>
</div>
<h2>μ‹œκ°μ  및 μ‘°μž‘ κΈ°λŠ₯</h2>
<ul class="doc-list">
<li><strong>Cytoscape.js λ“œλ‘œμž‰ λ³΄λ“œ</strong>: μΊ”λ²„μŠ€λ₯Ό 쒌클릭 λ“œλž˜κ·Έν•˜μ—¬ 슀팬(Pan)ν•˜κ³ , 마우슀 휠둜 자유둭게 μΆ•μ†Œ/ν™•λŒ€(Zoom)κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.</li>
<li><strong>λ“œλž˜κ·Έ λ…Έλ“œ 컀λ„₯ν„°</strong>: λ…Έλ“œμ˜ 끝자락 핸듀을 λŒμ–΄λ‹€ λ‹€λ₯Έ λ…Έλ“œλ‘œ λ†“μœΌλ©΄ 성곡(Success), μ‹€νŒ¨(Failure) λ˜λŠ” 쑰건뢀 λ°”μ΄νŒ¨μŠ€ 속성을 κ³ λ₯Ό 수 μžˆλŠ” μ—£μ§€ νŒμ—…μ΄ λ…ΈμΆœλ©λ‹ˆλ‹€.</li>
<li><strong>μ»¨ν…μŠ€νŠΈ 메뉴 (Right-click)</strong>: 빈 μ˜μ—­ 우클릭 μ‹œ μ‹ κ·œ λ…Έλ“œ μΆ”κ°€ νŒμ—…μ΄ 뜨며, λ…Έλ“œ 우클릭 μ‹œ μ‚­μ œ/속성 λ³€κ²½/볡제 μ•‘μ…˜ 메뉴λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.</li>
</ul>
<h2>λ…Έλ“œ μ„ΈλΆ€ 속성 μ œμ–΄</h2>
<div class="spec-block">
<div class="spec-title">βš™οΈ Agent Node 속성 μΉ΄λ“œ</div>
<div class="spec-desc">
ν•΄λ‹Ή λ…Έλ“œλ₯Ό μ‹€ν–‰ν•  μ—μ΄μ „νŠΈμ˜ ν”„λ‘œν•„ ID(예: <code>ralph-agent</code>), μ΅œλŒ€ μž¬μ‹œλ„ 카운트(Max Agent Runs), μ‹€ν–‰ μ œν•œ 격리 μ •μ±…(Git Worktree ν™œμ„±ν™” μ—¬λΆ€)을 μ‹œκ° μΈν„°νŽ˜μ΄μŠ€λ‘œ μ…‹νŒ…ν•©λ‹ˆλ‹€.
</div>
</div>
</section>
<!-- Section: UI Monitor -->
<section id="ui-monitor" class="doc-section">
<div class="section-header">
<span class="section-badge">Real-time Monitor</span>
<h1>μ›Œν¬ν”Œλ‘œμš° μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°</h1>
<p class="section-desc">ꡬ동 쀑인 μ›Œν¬ν”Œλ‘œμš°μ˜ μ‹€ν–‰ λ…Έλ“œ 좔적, μΌμ‹œ 쀑지 및 μ§„ν™” 둜그λ₯Ό λ™μ μœΌλ‘œ κ΄€μΈ‘ν•˜λŠ” ν™”λ©΄μž…λ‹ˆλ‹€.</p>
</div>
<h2>핡심 ν‘œμ‹œ μš”μ†Œ</h2>
<ul class="doc-list">
<li><strong>μ‹€ν–‰ λ…Έλ“œ λ„€μ˜¨ 슀트림 (Neon Highlights)</strong>: ν˜„μž¬ ν™œμ„±ν™”λ˜μ–΄ PTY λͺ…령을 μ§‘ν–‰ν•˜λŠ” λ…Έλ“œλŠ” 주기적으둜 밝게 μ λ©Έν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜ ν…Œλ‘λ¦¬λ₯Ό 두λ₯΄κ³ , μ§„ν–‰λ₯ μ„ λ°±λΆ„μœ¨ λ§‰λŒ€λ‘œ μ˜€λ²„λ ˆμ΄ ν‘œμ‹œν•©λ‹ˆλ‹€.</li>
<li><strong>μ½˜μ†” 둜그 슀트리머 (Consolidated Console)</strong>: ν•΄λ‹Ή μ›Œν¬ν”Œλ‘œμš° 런 파일(<code>.log</code>)을 읽어와 파일 λ³€κ²½ 이벀트λ₯Ό κ°μ§€ν•˜κ³  μ½˜μ†” 창에 κ°œλ³„ 좜λ ₯ μŠ€νŠΈλ¦Όμ„ κ²°ν•©ν•΄ μ‹€μ‹œκ°„ λ Œλ”λ§ν•©λ‹ˆλ‹€.</li>
</ul>
<h2>μ œμ–΄ μ•‘μ…˜ νŒλ„¬ (Control Bar)</h2>
<p>μ‹€ν–‰ μ˜€μž‘λ™ μ§•ν›„ 발견 ν˜Ήμ€ μ˜ˆμ‚° 초과둜 Paused μƒνƒœμ— λ†“μ˜€μ„ λ•Œ λŒ€μ‹œλ³΄λ“œμ—μ„œ μž‘λ™ν•˜λŠ” 물리 μ œμ–΄νŒμž…λ‹ˆλ‹€.</p>
<table>
<thead>
<tr>
<th>μ œμ–΄ λ²„νŠΌ</th>
<th>λ™μž‘ 방식</th>
<th>λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€ 처리</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pause (μΌμ‹œ 쀑지)</strong></td>
<td>μƒνƒœλ₯Ό μ¦‰μ‹œ Paused둜 κ³ μ •</td>
<td>PTY의 μž…λ ₯을 μž„μ‹œ λΈ”λ‘œν‚Ήν•˜κ³  둜그 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹«μŒ</td>
</tr>
<tr>
<td><strong>Resume (재개)</strong></td>
<td>μŠ€μΌ€μ€„ 볡ꡬ 및 μ΄μ–΄ν•˜κΈ°</td>
<td>둜그 FDλ₯Ό append λͺ¨λ“œλ‘œ μƒˆλ‘œ μ—΄κ³  λ‹€μŒ 보λ₯˜ λ…Έλ“œ 트리거</td>
</tr>
<tr>
<td><strong>Kill (κ°•μ œ 파괴)</strong></td>
<td>μ‹€ν–‰ μ¦‰μ‹œ 폭파 정리</td>
<td>슀폰된 λͺ¨λ“  PTY ν”„λ‘œμ„ΈμŠ€λ₯Ό SIGKILLν•˜κ³  브랜치 λ‘€λ°± ν›„ Failed μ’…λ£Œ</td>
</tr>
</tbody>
</table>
</section>
<!-- Section: UI Scheduler -->
<section id="ui-scheduler" class="doc-section">
<div class="section-header">
<span class="section-badge">Batch Scheduler</span>
<h1>배치 μŠ€μΌ€μ€„λŸ¬ 관리 λ·°</h1>
<p class="section-desc">정기적 λΉŒλ“œ 및 μžλ™ν™” 배치λ₯Ό κ΄€λ¦¬ν•˜κ³  순차적 단계λ₯Ό μ„€μ •ν•˜λŠ” μ œμ–΄νŒμž…λ‹ˆλ‹€.</p>
</div>
<h2>μ‹œκ°μ  및 μ‘°μž‘ κΈ°λŠ₯</h2>
<ul class="doc-list">
<li><strong>λΉ„μ£Όμ–Ό μŠ€ν… μ •λ ¬ νŽΈμ§‘κΈ° (Drag-and-Drop Step Reorder)</strong>: κ°œλ³„ 단계 블둝을 λ“œλž˜κ·Έν•˜μ—¬ μˆœμ„œλ₯Ό λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€.</li>
<li><strong>단계별 νƒ€κ²Ÿ μœ ν˜• ꡬ성</strong>:
<br>1) <code>cli</code> μŠ€ν…: 순수 μ‰˜ λͺ…λ Ή.
<br>2) <code>pty_agent</code> μŠ€ν…: 가상 터미널 기동 μ—μ΄μ „νŠΈ.
<br>3) <code>transform</code> μŠ€ν…: JS VM μƒŒλ“œλ°•μŠ€ 데이터 λ³€κ²½ μ½”λ“œ μž…λ ₯ 폼.
<br>4) <code>api</code> μŠ€ν…: Webhook용 URL, Header, Body νŽΈμ§‘κΈ°.
</li>
<li><strong>μŠ€μΌ€μ€„ μ˜ˆμ•½ 게이트 μ§€ν‘œ</strong>: 사전 ν…ŒμŠ€νŠΈ 런 성곡 μ—¬λΆ€λ₯Ό 녹색 방패(Tested OK) λ˜λŠ” 빨간색 κ²½κ³ (Test Required) μ•„μ΄μ½˜μœΌλ‘œ ν•œ λˆˆμ— μ‹œκ°ν™”ν•΄ μ€λ‹ˆλ‹€.</li>
</ul>
</section>
<!-- Section: UI Harness -->
<section id="ui-harness" class="doc-section">
<div class="section-header">
<span class="section-badge">Harness Manager</span>
<h1>검증 ν•˜λ„€μŠ€ ν†΅μ œ λ·°</h1>
<p class="section-desc">둜컬 λΉŒλ“œ 검증을 κ΄€λ¦¬ν•˜κ³ , μ‹€νŒ¨ μ—λŸ¬ 기둝을 톡해 μ—μ΄μ „νŠΈμ˜ μ˜€μž‘λ™ λ‘€λ°± μƒνƒœλ₯Ό ν†΅μ œν•©λ‹ˆλ‹€.</p>
</div>
<h2>μ£Όμš” μ„ΈλΆ€ 속성</h2>
<ul class="doc-list">
<li><strong>ν•˜λ„€μŠ€ 등둝 μΉ΄λ“œ 리슀트</strong>: ν”„λ‘œμ νŠΈλ³„λ‘œ λ“±λ‘λœ ν•˜λ„€μŠ€(예: <code>eslint-test</code>, <code>jest-unit</code>)의 μ»€λ§¨λ“œμ™€ ꡬ동 경둜λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.</li>
<li><strong>μ§„ν™” 이λ ₯ λͺ¨λ‹¬ (Evolution Logs Modal)</strong>: ν•˜λ„€μŠ€ λ…Έλ“œκ°€ μ‹€νŒ¨λ₯Ό μœ λ°œν•  λ•Œλ§ˆλ‹€ λͺ¨μΈ Stack Trace와 μ—λŸ¬ λ¬Έμžμ—΄μ„ μ‹œκ° λ·°μ–΄λ‘œ μΆ”μ ν•˜κ³ , μ—μ΄μ „νŠΈκ°€ 이λ₯Ό μ–΄λ–»κ²Œ ν•™μŠ΅ν•΄ 성곡에 이λ₯΄λ €λŠ”μ§€λ₯Ό νšŒμ°¨λ³„ νƒ­ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ Œλ”λ§ν•©λ‹ˆλ‹€.</li>
<li><strong>μˆ˜λ™ λ‘€λ°± μž‘λ™κΈ°</strong>: μ΅œλŒ€ μ‹œλ„λ₯Ό μ‹€νŒ¨ν–ˆμ„ λ•Œ Gitμ—μ„œ μˆ˜λ™μœΌλ‘œ 볡ꡬ할 λŒ€μƒ 파일과 λ‘€λ°± μŠ€μœ„μΉ˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ œμ–΄ν•  수 μžˆλŠ” μ‘°μž‘κΈ°λ₯Ό νƒ‘μž¬ν–ˆμŠ΅λ‹ˆλ‹€.</li>
</ul>
</section>
<!-- Section: UI Knowledge -->
<section id="ui-knowledge" class="doc-section">
<div class="section-header">
<span class="section-badge">Knowledge base</span>
<h1>지식 κ·Έλž˜ν”„ & μœ„ν‚€ λ·°</h1>
<p class="section-desc">도메인 ν…μŠ€νŠΈμ™€ μ½”λ“œ μ°Έμ‘°κ°€ 그물망 ν˜•νƒœλ‘œ κ²°ν•©λœ μ‹œκ° κ·Έλž˜ν”„ 및 μœ„ν‚€ 에디터 ν™”λ©΄μž…λ‹ˆλ‹€.</p>
</div>
<h2>μ‹œκ°μ  μ‘°μž‘</h2>
<ul class="doc-list">
<li><strong>D3.js νž˜μ§€ν–₯ κ·Έλž˜ν”„ ν† ν΄λ‘œμ§€</strong>: λ…Έλ“œλ₯Ό λ“œλž˜κ·Έν•˜μ—¬ μ€‘μ‹¬μ μœΌλ‘œ κ³ μ •ν•˜κ±°λ‚˜ μ—°κ²° μ—£μ§€ μœ„λ‘œ 마우슀λ₯Ό 올릴 λ•Œ 관계 속성(예: <code>refers_to</code>, <code>calls</code>)이 반투λͺ… ν•˜μ΄λΌμ΄νŠΈλ©λ‹ˆλ‹€.</li>
<li><strong>μœ„ν‚€ 연동 λ§ˆν¬λ‹€μš΄ λΈŒλΌμš°μ €</strong>: νŠΉμ • 지식 λ…Έλ“œλ₯Ό ν΄λ¦­ν•˜λ©΄ 우츑 λ·°μ–΄ μœˆλ„μš°μ— μœ„ν‚€ 에디터가 λ‘œλ“œλ˜μ–΄ 도메인 κ·œμΉ™μ„ 직접 νƒ€μ΄ν•‘ν•˜μ—¬ μ˜μ† μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μž‘μ„±λœ λ£° μΉ΄λ“œλŠ” Claude Code 기동 μ‹œ <code>.clauderules</code> 파일의 RAG μ»¨ν…μŠ€νŠΈλ‘œ μžλ™ μΉ˜ν™˜ μ£Όμž…λ©λ‹ˆλ‹€.</li>
</ul>
</section>
<!-- Section: UI Profiles -->
<section id="ui-profiles" class="doc-section">
<div class="section-header">
<span class="section-badge">Profiles & Settings</span>
<h1>μ—μ΄μ „νŠΈ ν”„λ‘œν•„ 및 ν™˜κ²½μ„€μ •</h1>
<p class="section-desc">μ—μ΄μ „νŠΈ 성격(Persona), μ‚¬μš©ν•  λͺ¨λΈ 규격, BADA 데λͺ¬μ˜ ν¬νŠΈμ™€ μ™ΈλΆ€ API 바인딩을 ν†΅μ œν•©λ‹ˆλ‹€.</p>
</div>
<h2>μ—μ΄μ „νŠΈ ν”„λ‘œν•„ λ§€λ‹ˆμ €</h2>
<ul class="doc-list">
<li><strong>Persona / System Prompt ν…μŠ€νŠΈ 에디터</strong>: μ—μ΄μ „νŠΈμ—κ²Œ 내릴 지침을 λ§ˆν¬λ‹€μš΄ μŠ€νƒ€μΌ μ„œμ‹ λ·°μ–΄λ‘œ μ§€μ •ν•˜κ³  μ €μž₯ν•©λ‹ˆλ‹€.</li>
<li><strong>RAG λ§€ν•‘ ν•„ν„° νƒœκ·Έ</strong>: μ—μ΄μ „νŠΈ ꡬ동 μ‹œ μ§€μ‹λ² μ΄μŠ€ μœ„ν‚€μ—μ„œ RAG μ •λ³΄λ‘œ 바인딩해쀄 λŒ€μƒ νƒœκ·Έλ“€(예: <code>#battery</code>, <code>#security</code>)을 닀쀑 선택 μ½€λ³΄λ°•μŠ€λ‘œ μ„ΈνŒ…ν•©λ‹ˆλ‹€.</li>
</ul>
<h2>BADA 일반 ν™˜κ²½ μ„€μ •</h2>
<p>μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κΈ°λ³Έ μ„€μ • 및 Claude Code CLI λ°”μ΄λ„ˆλ¦¬ μœ„μΉ˜λ₯Ό 직접 μ§€μ •ν•©λ‹ˆλ‹€.</p>
<ul class="doc-list">
<li><strong>ν…Œλ§ˆ λͺ¨λ“œ μ„€μ •</strong>: Dark ν…Œλ§ˆ (Catppuccin Mocha), Light ν…Œλ§ˆ (Catppuccin Latte) μŠ€μœ„μΉ˜.</li>
<li><strong>Claude CLI Binary Path</strong>: κΈ€λ‘œλ²Œ node νŒ¨ν‚€μ§€ 경둜λ₯Ό μž¬λ§€ν•‘ν•˜κ±°λ‚˜ μˆ˜λ™ μ˜€ν”„λΌμΈ λ°”μ΄λ„ˆλ¦¬ μ ˆλŒ€ 경둜λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.</li>
<li><strong>Port & Connection Bridges</strong>: 둜컬 데λͺ¬ 포트번호 및 둜컬 SQLite DB 파일의 μ €μž₯ μ ˆλŒ€ 경둜λ₯Ό ν…μŠ€νŠΈλ°•μŠ€λ‘œ λ³€κ²½ 및 연동 ν…ŒμŠ€νŠΈ(Test Connection) 지원.</li>
</ul>
</section>
<!-- Section: UI Loop Builder -->
<section id="ui-loop-builder" class="doc-section">
<div class="section-header">
<span class="section-badge">Loop Orchestrator</span>
<h1>루프 λΉŒλ” μœ„μžλ“œ (loop-builder.html)</h1>
<p class="section-desc">μžμ—°μ–΄ μž…λ ₯ λ˜λŠ” ν…œν”Œλ¦Ώ 선택을 톡해 Closed-Loop μ—μ΄μ „νŠΈ ꡬ동 λ£° 및 κ°€λ“œλ ˆμΌμ„ 5λ‹¨κ³„λ‘œ μ„€κ³„ν•˜λŠ” ν™”λ©΄μž…λ‹ˆλ‹€.</p>
</div>
<h2>μ‹œκ°μ  및 μ‘°μž‘ κΈ°λŠ₯</h2>
<ul class="doc-list">
<li><strong>5단계 μŠ€ν… μœ„μžλ“œ λ°”</strong>: 상단 ν”„λ‘œκ·Έλ ˆμŠ€ λ°”λ₯Ό 톡해 Goal μ„€μ • βž” κ°€λ“œλ ˆμΌ βž” μ—μ΄μ „νŠΈ βž” ν•˜λ„€μŠ€ βž” μ΅œμ’… κ²€ν†  λ‹¨κ³„λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.</li>
<li><strong>✨ AI Loop Wizard μžλ™ 프리셋 뢄석기</strong>: λͺ©ν‘œν•˜λŠ” λ‚΄μš©(예: "3λ‹¬λŸ¬ λ‚΄μ—μ„œ λΉ λ₯΄κ²Œ npm test 패슀")을 μžμ—°μ–΄λ‘œ μž‘μ„±ν•˜μ—¬ [뢄석 및 μΆ”μ²œ 적용]을 λˆ„λ₯΄λ©΄, μ‹œμŠ€ν…œμ΄ λΆ„μ„ν•˜μ—¬ κ°€λ“œλ ˆμΌ(Max Iterations, Budget λ“±)κ³Ό 격리 유무λ₯Ό μΆ”μ²œν•˜μ—¬ 폼에 μžλ™ λ°˜μ˜ν•©λ‹ˆλ‹€.</li>
<li><strong>동적 쑰건 ν•„λ“œ μ œμ–΄</strong>: Goal Type(파일 유무 검사, μ§€ν‘œ μž„κ³„μΉ˜ 비ꡐ, ν…ŒμŠ€νŠΈ 패슀 λ“±)의 μ’…λ₯˜μ— 맞좰 μ„€μ • μž…λ ₯ μ˜μ—­μ΄ μ• λ‹ˆλ©”μ΄μ…˜κ³Ό ν•¨κ»˜ μœ μ—°ν•˜κ²Œ λ…ΈμΆœλ©λ‹ˆλ‹€.</li>
<li><strong>μ—μ΄μ „νŠΈ Fleet λͺ¨λ“œ ν† κΈ€</strong>: 단일 μ—μ΄μ „νŠΈ 루프와 닀쀑 μ—μ΄μ „νŠΈ νŽΈλŒ€(Maker-Checker)λ₯Ό λ™μ μœΌλ‘œ μ „ν™˜ν•  수 있으며, 이 λ•Œ 각 역할별 νƒ€κ²Ÿ λͺ¨λΈ μ„€μ • κΈ°λŠ₯이 μ—΄λ¦½λ‹ˆλ‹€.</li>
</ul>
</section>
<!-- Section: UI Loop Dashboard -->
<section id="ui-loop-dashboard" class="doc-section">
<div class="section-header">
<span class="section-badge">Loop Monitoring</span>
<h1>루프 λŒ€μ‹œλ³΄λ“œ & 이λ ₯ (loop-dashboard.html / loop-history.html)</h1>
<p class="section-desc">ν˜„μž¬ 싀행쀑인 λ£¨ν”„μ˜ μ„Έμ…˜μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³  과거의 루프 μ‹€ν–‰ 둜그 및 이λ ₯을 νƒμƒ‰ν•©λ‹ˆλ‹€.</p>
</div>
<h2>루프 μ‹€μ‹œκ°„ λŒ€μ‹œλ³΄λ“œ (loop-dashboard.html)</h2>
<ul class="doc-list">
<li><strong>KPI λ©”νŠΈλ¦­ λ³΄λ“œ</strong>: ν˜„μž¬ μ΄ν„°λ ˆμ΄μ…˜ 횟수, 단계, λˆ„μ  토큰 λΉ„μš©, λˆ„μ  μ§„ν–‰μ‹œκ°„ 및 성곡λ₯ μ„ μ‹€μ‹œκ°„ μΉ΄λ“œλ‘œ μš”μ•½ν•©λ‹ˆλ‹€.</li>
<li><strong>κ°€λ‘œ 슀크둀 νƒ€μž„λΌμΈ</strong>: λ§€ μ΄ν„°λ ˆμ΄μ…˜(Iteration 1, Iteration 2...) 별 톡과/반렀 μƒνƒœλ₯Ό ν•œ λˆˆμ— νŒŒμ•…ν•  수 μžˆλŠ” μ‹œκ° νƒ€μž„λΌμΈμ„ λ Œλ”λ§ν•©λ‹ˆλ‹€.</li>
<li><strong>μ‹€μ‹œκ°„ μ›μ‹œ 둜그 & μ˜ˆμ‚° μ†Œλͺ¨ κ²Œμ΄μ§€</strong>: μ—μ΄μ „νŠΈλ“€μ˜ 둜그 μŠ€νŠΈλ¦Όμ„ κ΄€μ°°ν•˜κ³ , μ„€μ •ν•œ 토큰 μ˜ˆμ‚° λŒ€λΉ„ μ‹€μ‹œκ°„ μ˜ˆμ‚° λˆ„μ  λΉ„μš©μ„ λΉ„μ£Όμ–Ό κ²Œμ΄μ§€ 차트둜 μ œκ³΅ν•©λ‹ˆλ‹€.</li>
</ul>
<h2>루프 νžˆμŠ€ν† λ¦¬ λΈŒλΌμš°μ € (loop-history.html)</h2>
<ul class="doc-list">
<li><strong>μ΄ν„°λ ˆμ΄μ…˜ Diff 및 둜그 νƒ­</strong>: κ³Όκ±° λ£¨ν”„λ“€μ˜ 성곡 여뢀와 μ΄ν„°λ ˆμ΄μ…˜λ³„λ‘œ μ†ŒμŠ€ μ½”λ“œμ˜ μ–΄λ–€ 라인이 μˆ˜μ •λ˜μ—ˆλŠ”μ§€ Git Diff 탭을 톡해 즉각적인 수술적 λ¦¬νŒ©ν† λ§ 흔적을 νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.</li>
<li><strong>AI 생성 κ΅ν›ˆ(Retrospective Logs) μš”μ•½</strong>: 루프가 μ™„λ£Œ ν˜Ήμ€ 회둜 차단(Circuit Trip)λ˜μ—ˆμ„ λ•Œ μ—μ΄μ „νŠΈλ“€μ΄ νšλ“ν•œ μš”μ•½ μΈμ‚¬μ΄νŠΈμ™€ μžκ°€ ν•™μŠ΅ 데이터λ₯Ό μ—΄λžŒν•©λ‹ˆλ‹€.</li>
</ul>
</section>
</main>
</div>
<script>
// Navigation switching
const menuItems = document.querySelectorAll('.menu-item');
const sections = document.querySelectorAll('.doc-section');
const content = document.getElementById('content-container');
menuItems.forEach(item => {
item.addEventListener('click', () => {
menuItems.forEach(i => i.classList.remove('active'));
item.classList.add('active');
sections.forEach(s => s.classList.remove('active'));
const target = item.getAttribute('data-target');
const targetSec = document.getElementById(target);
if (targetSec) {
targetSec.classList.add('active');
content.scrollTop = 0;
}
});
});
// Theme toggle
const themeToggle = document.getElementById('theme-toggle');
themeToggle.addEventListener('click', () => {
document.body.classList.toggle('light-theme');
});
</script>
</body>
</html>