| <!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μ κ° νλ©΄λ³ λ©λ΄ ꡬ쑰, μκ°μ μ‘°μλ² λ° κΈ°λ₯μ μμΈ μ€λͺ
λ§€λ΄μΌ"> |
| |
| |
| <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"> |
| |
| |
| <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 { |
| 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; |
| } |
| |
| |
| #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"> |
| |
| |
| <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> |
|
|
| |
| <main id="content-container"> |
|
|
| |
| <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 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 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 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 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 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 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 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 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> |
| |
| 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; |
| } |
| }); |
| }); |
| |
| |
| const themeToggle = document.getElementById('theme-toggle'); |
| themeToggle.addEventListener('click', () => { |
| document.body.classList.toggle('light-theme'); |
| }); |
| </script> |
| </body> |
| </html> |
|
|