projax 3.3.69 → 3.3.71
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/dist/agent-runner.d.ts +60 -0
- package/dist/agent-runner.js +382 -0
- package/dist/api/database.d.ts +38 -1
- package/dist/api/database.d.ts.map +1 -1
- package/dist/api/database.js +327 -0
- package/dist/api/database.js.map +1 -1
- package/dist/api/routes/agents.d.ts +4 -0
- package/dist/api/routes/agents.d.ts.map +1 -0
- package/dist/api/routes/agents.js +375 -0
- package/dist/api/routes/agents.js.map +1 -0
- package/dist/api/routes/index.d.ts.map +1 -1
- package/dist/api/routes/index.js +4 -0
- package/dist/api/routes/index.js.map +1 -1
- package/dist/api/routes/todos.d.ts +4 -0
- package/dist/api/routes/todos.d.ts.map +1 -0
- package/dist/api/routes/todos.js +595 -0
- package/dist/api/routes/todos.js.map +1 -0
- package/dist/api/types.d.ts +67 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/core/database.d.ts +47 -0
- package/dist/core/database.js +48 -0
- package/dist/core-bridge.d.ts +1 -1
- package/dist/electron/core/database.d.ts +47 -0
- package/dist/electron/core/database.js +48 -0
- package/dist/electron/renderer/assets/index-6afBeDFD.js +66 -0
- package/dist/electron/renderer/assets/index-Bd3aFi7B.css +1 -0
- package/dist/electron/renderer/index.html +2 -2
- package/dist/index.js +6 -175
- package/dist/octopus-cli.d.ts +2 -0
- package/dist/octopus-cli.js +45 -0
- package/dist/octopus-show-tui.d.ts +1 -0
- package/dist/octopus-show-tui.js +802 -0
- package/dist/octopus-tui.d.ts +1 -0
- package/dist/octopus-tui.js +115 -0
- package/dist/prxi.js +373 -63
- package/dist/prxi.tsx +472 -65
- package/package.json +7 -2
- package/dist/electron/renderer/assets/index-BjZn_mEF.js +0 -66
- package/dist/electron/renderer/assets/index-CZmDxbJO.js +0 -66
- package/dist/electron/renderer/assets/index-Cd1mTO3s.js +0 -66
- package/dist/electron/renderer/assets/index-Cj4QON0s.js +0 -66
- package/dist/electron/renderer/assets/index-CmtZriN5.js +0 -66
- package/dist/electron/renderer/assets/index-DJDPi0kp.css +0 -1
- package/dist/electron/renderer/assets/index-DfocdjIj.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.project-list{flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;padding:.75rem}.project-list::-webkit-scrollbar{width:6px}.project-list::-webkit-scrollbar-track{background:var(--bg-primary)}.project-list::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}.project-list::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.project-list-loading,.project-list-empty{padding:2rem;text-align:center;color:var(--text-secondary)}.project-list-empty .hint{font-size:12px;color:var(--text-tertiary);margin-top:.5rem}.project-item{padding:.875rem;margin-bottom:.5rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;cursor:pointer;transition:all .15s ease;position:relative}.project-item:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:transparent;transition:background .15s ease}.project-item:hover{background:var(--bg-hover);border-color:var(--border-hover);transform:translate(2px)}.project-item:hover:before{background:var(--accent-cyan)}.project-item.selected{background:var(--bg-hover);border-color:var(--accent-cyan);box-shadow:var(--shadow-sm)}.project-item.keyboard-focused{outline:2px solid var(--accent-cyan);outline-offset:-2px;background:var(--bg-hover)}.project-item.selected:before{background:var(--accent-cyan)}.project-item-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.5rem;gap:.5rem}.project-name{font-size:13px;font-weight:600;color:var(--text-primary);margin:0;flex:1;font-family:inherit;letter-spacing:.2px;display:flex;align-items:center;gap:.5rem}.git-branch-badge{font-size:10px;font-weight:500;padding:2px 6px;background:var(--bg-hover);color:var(--accent-purple, #bc8cff);border:1px solid var(--border-color);border-radius:3px;font-family:SF Mono,Monaco,monospace;opacity:.9}.project-remove-btn{background:transparent;border:1px solid transparent;font-size:18px;color:var(--text-tertiary);cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:3px;transition:all .15s ease;flex-shrink:0;line-height:1}.project-remove-btn:hover{background:#ff52521a;color:#ff5252;border-color:#ff52524d}.project-path{font-size:11px;color:var(--text-tertiary);margin:.25rem 0;word-break:break-all;font-family:SF Mono,Monaco,monospace;opacity:.8}.project-meta{display:flex;justify-content:space-between;align-items:center;margin-top:.5rem;font-size:11px;color:var(--text-tertiary);gap:.5rem}.project-tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:.5rem}.project-tag{background:var(--bg-hover);border:1px solid var(--border-color);padding:.125rem .5rem;border-radius:3px;font-size:10px;font-weight:500;color:var(--accent-cyan);font-family:SF Mono,Monaco,monospace;text-transform:uppercase;letter-spacing:.3px}.project-scanned{flex:1;font-family:SF Mono,Monaco,monospace}.project-scan-btn{background:transparent;border:1px solid var(--border-color);font-size:12px;cursor:pointer;padding:.25rem .5rem;border-radius:3px;transition:all .15s ease;color:var(--text-secondary);font-family:inherit}.project-scan-btn:hover:not(:disabled){background:var(--bg-hover);border-color:var(--accent-green);color:var(--accent-green)}.project-scan-btn:disabled{opacity:.3;cursor:not-allowed}.running-indicator-dot{color:var(--accent-green);margin-right:.5rem;font-size:10px;animation:pulse 2s infinite}.project-item.running:before{background:var(--accent-green)}.running-count{background:var(--accent-green);color:var(--bg-primary);padding:.125rem .5rem;border-radius:10px;font-size:10px;font-weight:600;font-family:SF Mono,Monaco,monospace}.running-ports{display:flex;gap:.25rem;flex-wrap:wrap}.port-badge{background:var(--accent-blue);color:var(--bg-primary);padding:.125rem .5rem;border-radius:3px;font-size:10px;font-weight:600;font-family:SF Mono,Monaco,monospace}.project-urls-section{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px solid var(--border-color);margin-bottom:1.5rem}.urls-list{display:flex;flex-direction:column;gap:.5rem}.url-item{padding:.875rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease;display:flex;justify-content:space-between;align-items:center;gap:1rem}.url-item:hover{background:var(--bg-hover);border-color:var(--border-hover)}.url-text{font-family:SF Mono,Monaco,monospace;font-size:12px;color:var(--accent-cyan);flex:1;word-break:break-all;cursor:pointer;text-decoration:underline}.url-text:hover{color:var(--accent-blue)}.agent-list{margin-top:16px;border-top:1px solid var(--border-color, #30363d);padding-top:12px}.agent-list-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.agent-list-header h3{margin:0;font-size:13px;font-weight:600;color:var(--text-primary, #c9d1d9)}.btn-add-agent{width:24px;height:24px;border:1px solid var(--border-color, #30363d);border-radius:4px;background:var(--bg-tertiary, #1c2128);color:var(--text-secondary, #8b949e);font-size:16px;line-height:1;cursor:pointer;transition:all .15s ease}.btn-add-agent:hover{background:var(--bg-hover, #21262d);color:var(--accent-cyan, #39c5cf);border-color:var(--accent-cyan, #39c5cf)}.agent-list-loading,.agent-list-error,.agent-list-empty{font-size:12px;color:var(--text-tertiary, #6e7681);text-align:center;padding:16px 8px}.agent-list-error{color:#f85149}.agent-list-empty{display:flex;flex-direction:column;gap:8px}.btn-link{background:none;border:none;color:var(--accent-cyan, #39c5cf);cursor:pointer;font-size:12px;text-decoration:underline}.btn-link:hover{color:var(--accent-blue, #58a6ff)}.agent-list-items{display:flex;flex-direction:column;gap:8px}.agent-item{display:flex;align-items:center;gap:10px;padding:10px;background:var(--bg-secondary, #161b22);border:1px solid var(--border-color, #30363d);border-radius:6px;transition:all .15s ease}.agent-item:hover{background:var(--bg-hover, #21262d)}.agent-item.running{border-color:var(--accent-green, #3fb950)}.agent-icon{width:28px;height:28px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:#fff;background:var(--accent-blue, #58a6ff)}.agent-icon[data-cli=claude]{background:#d97706}.agent-icon[data-cli=gemini]{background:#4285f4}.agent-icon[data-cli=openai]{background:#10a37f}.agent-icon[data-cli=xai]{background:#1d1d1f}.agent-icon[data-cli=ollama]{background:#0ea5e9}.agent-icon[data-cli=aider]{background:#7c3aed}.agent-icon[data-cli=continue]{background:#ec4899}.agent-icon[data-cli=custom]{background:var(--text-secondary, #8b949e)}.agent-info{flex:1;min-width:0}.agent-name{font-size:13px;font-weight:500;color:var(--text-primary, #c9d1d9);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-meta{display:flex;gap:8px;font-size:11px;color:var(--text-tertiary, #6e7681);margin-top:2px}.agent-model{color:var(--accent-blue, #58a6ff)}.agent-has-key{background:var(--accent-green, #3fb950);color:#fff;padding:1px 4px;border-radius:3px;font-size:9px;text-transform:uppercase}.agent-status{width:16px;display:flex;align-items:center;justify-content:center}.status-indicator{width:8px;height:8px;border-radius:50%;background:var(--text-tertiary, #6e7681)}.status-indicator.running{background:var(--accent-green, #3fb950);animation:pulse 2s infinite}.agent-actions{display:flex;gap:6px;opacity:0;transition:opacity .15s ease}.agent-item:hover .agent-actions{opacity:1}.btn-agent-action{padding:4px 8px;border:1px solid var(--border-color, #30363d);border-radius:4px;background:var(--bg-tertiary, #1c2128);color:var(--text-secondary, #8b949e);font-size:11px;cursor:pointer;transition:all .15s ease}.btn-agent-action:hover{background:var(--bg-hover, #21262d);color:var(--text-primary, #c9d1d9)}.btn-agent-action:disabled{opacity:.5;cursor:not-allowed}.btn-launch:hover{border-color:var(--accent-green, #3fb950);color:var(--accent-green, #3fb950)}.btn-stop:hover{border-color:#f85149;color:#f85149}.btn-edit:hover{border-color:var(--accent-cyan, #39c5cf);color:var(--accent-cyan, #39c5cf)}.btn-delete{color:var(--text-tertiary, #6e7681)}.btn-delete:hover{border-color:#f85149;color:#f85149}.agent-modal{max-width:550px;max-height:85vh;overflow-y:auto}.error-message{background:#f851491a;border:1px solid #f85149;border-radius:4px;padding:12px;margin-bottom:16px;color:#f85149;font-size:13px}.form-select{width:100%;padding:.625rem;border:1px solid var(--border-color, #30363d);border-radius:4px;font-size:13px;font-family:inherit;background:var(--bg-tertiary, #1c2128);color:var(--text-primary, #c9d1d9);cursor:pointer;transition:all .15s ease}.form-select:focus{outline:none;border-color:var(--accent-cyan, #39c5cf);box-shadow:0 0 0 2px #39c5cf33}.api-key-input{display:flex;gap:8px}.api-key-input .form-input{flex:1}.toggle-visibility{padding:.625rem 12px;background:var(--bg-secondary, #161b22);border:1px solid var(--border-color, #30363d);border-radius:4px;color:var(--text-secondary, #8b949e);cursor:pointer;font-size:12px;transition:all .15s ease}.toggle-visibility:hover{background:var(--bg-hover, #21262d);color:var(--text-primary, #c9d1d9)}.form-hint{font-size:11px;color:var(--text-tertiary, #6e7681);margin-top:4px}.form-row{display:flex;gap:16px}.form-group.half{flex:1}.form-input{width:100%;padding:.625rem;border:1px solid var(--border-color, #30363d);border-radius:4px;font-size:13px;font-family:SF Mono,Monaco,monospace;background:var(--bg-tertiary, #1c2128);color:var(--text-primary, #c9d1d9);transition:all .15s ease}.form-input:focus{outline:none;border-color:var(--accent-cyan, #39c5cf);box-shadow:0 0 0 2px #39c5cf33}.form-input::placeholder{color:var(--text-tertiary, #6e7681)}textarea.form-input{resize:vertical;min-height:60px}.project-details{max-width:1000px}.breadcrumb{display:flex;align-items:center;gap:.75rem;padding:0 0 1rem;margin-bottom:1rem;border-bottom:1px solid var(--border-color)}.breadcrumb-link{background:none;border:none;color:var(--text-primary);cursor:pointer;padding:0;font-size:18px;font-weight:600;font-family:inherit;letter-spacing:.3px;transition:color .15s ease}.breadcrumb-link:hover{color:var(--accent-cyan)}.breadcrumb-separator{color:var(--text-tertiary);opacity:.5;font-size:18px;font-weight:300}.breadcrumb-current{color:var(--text-primary);font-size:18px;font-weight:600;font-family:inherit;letter-spacing:.3px}.btn-small{padding:.35rem .75rem;font-size:11px}.btn-tiny{padding:.25rem .5rem;font-size:10px;display:inline-flex;align-items:center;gap:4px}.project-details-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid var(--border-color);gap:1rem}.project-details-header h2{font-size:18px;color:var(--text-primary);margin-bottom:.5rem;font-weight:600;font-family:inherit;letter-spacing:.3px}.project-name-editable{cursor:pointer;transition:color .15s ease}.project-name-editable:hover{color:var(--accent-cyan)}.project-name-edit{margin-bottom:.5rem}.project-name-input{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;padding:.5rem .75rem;font-size:18px;font-weight:600;color:var(--text-primary);font-family:inherit;width:100%;max-width:500px;letter-spacing:.3px;transition:all .15s ease}.project-name-input:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.project-name-input:focus{outline:none;border-color:var(--accent-cyan);background:var(--bg-tertiary);box-shadow:0 0 0 2px #39c5cf14}.project-description-edit{margin-bottom:.5rem}.project-description-input{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;padding:1rem 1.25rem;font-size:14px;color:var(--text-primary);font-family:inherit;width:100%;max-width:900px;min-height:140px;resize:vertical;line-height:1.6;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.project-description-input:hover{border-color:var(--border-hover);background:var(--bg-tertiary);box-shadow:0 2px 4px #00000014}.project-description-input:focus{outline:none;border-color:var(--accent-cyan);background:var(--bg-tertiary);box-shadow:0 0 0 3px #39c5cf1f,0 4px 6px #0000001a;transform:translateY(-1px)}.project-description{cursor:pointer;color:var(--text-secondary);font-size:14px;transition:all .15s ease;margin:0 0 .5rem;line-height:1.6;padding:.5rem;border-radius:4px}.project-description:hover{color:var(--text-primary);background:var(--bg-tertiary)}.header-actions-group{display:flex;gap:.5rem;align-items:center}.project-path{color:var(--text-tertiary);font-size:11px;word-break:break-all;font-family:SF Mono,Monaco,monospace;opacity:.8}.project-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.75rem;margin-bottom:1.5rem}.stat-card{background:var(--bg-secondary);padding:1rem;border-radius:4px;border:1px solid var(--border-color);text-align:left;transition:all .15s ease}.stat-card:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.stat-value{font-size:24px;font-weight:600;color:var(--accent-cyan);margin-bottom:.25rem;font-family:SF Mono,Monaco,monospace;line-height:1.2}.stat-label{font-size:11px;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px;font-weight:500}.framework-breakdown{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px solid var(--border-color);margin-bottom:1.5rem}.framework-breakdown h3{font-size:13px;color:var(--text-primary);margin-bottom:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:inherit}.framework-list{display:flex;flex-wrap:wrap;gap:.5rem}.framework-item{display:flex;align-items:center;gap:.5rem;padding:.375rem .75rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:3px;transition:all .15s ease}.framework-item:hover{border-color:var(--accent-purple);background:var(--bg-hover)}.framework-name{font-weight:500;color:var(--text-primary);font-size:12px;font-family:SF Mono,Monaco,monospace}.framework-count{background:var(--accent-purple);color:var(--bg-primary);padding:.125rem .5rem;border-radius:2px;font-size:11px;font-weight:600;font-family:SF Mono,Monaco,monospace}.tests-section{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px solid var(--border-color);margin-bottom:1.5rem}.tests-section h3{font-size:13px;color:var(--text-primary);margin-bottom:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:inherit}.no-tests{padding:2rem;text-align:center;color:var(--text-tertiary);font-size:12px}.tests-list{display:flex;flex-direction:column;gap:.5rem}.test-item{padding:.875rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease}.test-item:hover{background:var(--bg-hover);border-color:var(--border-hover);transform:translate(2px)}.test-file{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem;gap:.75rem}.test-path{font-family:SF Mono,Monaco,monospace;font-size:12px;color:var(--text-primary);flex:1;word-break:break-all}.test-framework{background:var(--accent-blue);color:var(--bg-primary);padding:.25rem .5rem;border-radius:3px;font-size:10px;font-weight:600;font-family:SF Mono,Monaco,monospace;text-transform:uppercase;letter-spacing:.3px;flex-shrink:0}.test-status{font-size:11px;color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace}.jenkins-placeholder{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px dashed var(--border-color);opacity:.6}.jenkins-placeholder h3{font-size:13px;color:var(--text-secondary);margin-bottom:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:inherit}.placeholder-text{color:var(--text-tertiary);font-style:italic;font-size:12px;line-height:1.6}.danger-zone{background:#f851490d;padding:1.25rem;border-radius:4px;border:1px solid rgba(248,81,73,.3);margin-top:1.5rem}.danger-zone h3{font-size:13px;color:#f85149;margin-bottom:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:inherit}.danger-zone-text{color:var(--text-secondary);font-size:12px;line-height:1.6;margin-bottom:1rem}.danger-zone .btn-danger{background:transparent;border:1px solid #f85149;color:#f85149}.danger-zone .btn-danger:hover:not(:disabled){background:#f85149;color:var(--bg-primary)}.btn-small{padding:.375rem .75rem;font-size:11px}.tags-section{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px solid var(--border-color);margin-bottom:1.5rem}.tags-content{margin-top:.75rem}.tags-list{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}.tag-item{background:var(--bg-tertiary);border:1px solid var(--border-color);padding:.375rem .375rem .375rem .625rem;border-radius:4px;font-size:11px;font-weight:500;color:var(--accent-cyan);font-family:SF Mono,Monaco,monospace;text-transform:uppercase;letter-spacing:.3px;display:flex;align-items:center;gap:.375rem;transition:all .15s ease}.tag-item:hover{border-color:var(--accent-cyan)}.tag-remove{background:none;border:none;color:var(--text-tertiary);cursor:pointer;padding:0 4px;font-size:16px;line-height:1;transition:color .15s ease}.tag-remove:hover{color:#f85149}.tag-add-btn{background:transparent;border:1px dashed var(--border-color);padding:.375rem .75rem;border-radius:4px;font-size:11px;font-weight:500;color:var(--text-secondary);cursor:pointer;transition:all .15s ease;text-transform:uppercase;letter-spacing:.3px}.tag-add-btn:hover{border-color:var(--accent-cyan);color:var(--accent-cyan);background:var(--bg-tertiary)}.tag-input-wrapper{position:relative;display:inline-block}.tag-input{background:var(--bg-tertiary);border:1px solid var(--accent-cyan);border-radius:4px;padding:.375rem .625rem;font-size:11px;font-family:SF Mono,Monaco,monospace;color:var(--text-primary);min-width:120px;outline:none}.tag-input:focus{box-shadow:0 0 0 2px #39c5cf33}.tag-suggestions{position:absolute;top:calc(100% + 4px);left:0;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;box-shadow:var(--shadow-md);z-index:100;min-width:100%;max-width:200px}.tag-suggestion{padding:.5rem .75rem;cursor:pointer;font-size:11px;color:var(--text-primary);font-family:SF Mono,Monaco,monospace;transition:all .15s ease}.tag-suggestion:first-child{border-radius:4px 4px 0 0}.tag-suggestion:last-child{border-radius:0 0 4px 4px}.tag-suggestion:hover{background:var(--bg-hover);color:var(--accent-cyan)}.ports-section,.scripts-section,.running-processes-section{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px solid var(--border-color);margin-bottom:1.5rem}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.section-header h3{font-size:13px;color:var(--text-primary);font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:inherit;margin:0}.section-header-right{display:flex;align-items:center;gap:8px}.script-sort-select{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;padding:4px 8px;font-size:11px;color:var(--text-primary);font-family:inherit;cursor:pointer;transition:all .15s ease}.script-sort-select:hover{border-color:var(--accent-cyan)}.script-sort-select:focus{outline:none;border-color:var(--accent-cyan);box-shadow:0 0 0 2px #39c5cf33}.project-type-badge{background:var(--bg-tertiary);border:1px solid var(--border-color);padding:.25rem .5rem;border-radius:3px;font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px;font-family:SF Mono,Monaco,monospace}.ports-list,.scripts-list,.processes-list{display:flex;flex-direction:column;gap:.5rem}.port-item{padding:.875rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease}.port-item:hover{background:var(--bg-hover);border-color:var(--border-hover)}.port-info{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.port-number{font-family:SF Mono,Monaco,monospace;font-size:13px;font-weight:600;color:var(--accent-cyan)}.port-script{font-family:SF Mono,Monaco,monospace;font-size:11px;color:var(--text-secondary)}.port-source{font-family:SF Mono,Monaco,monospace;font-size:11px;color:var(--text-tertiary);flex:1}.script-item{padding:.875rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease;display:grid;grid-template-columns:1fr auto;gap:1rem;align-items:start}.script-item:hover{background:var(--bg-hover);border-color:var(--border-hover)}.script-item.running{border-left:3px solid var(--accent-cyan)}.script-info{display:flex;flex-direction:column;gap:.5rem;flex:1;min-width:0}.script-item.running>.script-info{min-width:calc(100% + 18px)}.script-header{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.script-process-info{display:flex;flex-direction:column;gap:.375rem;margin-top:.5rem;padding-top:.5rem;border-top:1px solid var(--border-color)}.process-badge{display:flex;align-items:center;gap:.5rem;font-size:11px;font-family:SF Mono,Monaco,monospace;color:var(--text-secondary)}.process-badge .btn:first-of-type{margin-left:auto}.process-indicator{color:var(--accent-cyan);font-size:8px}.process-pid{color:var(--text-secondary)}.process-uptime{color:var(--text-tertiary)}.process-port{color:var(--accent-cyan);font-weight:600}.btn-tiny{padding:2px 8px;font-size:10px;font-weight:600;border-radius:4px;margin-left:4px}.script-name{font-family:SF Mono,Monaco,monospace;font-size:13px;font-weight:600;color:var(--text-primary);flex-shrink:0}.script-command{font-family:SF Mono,Monaco,monospace;font-size:11px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;display:block}.script-runner{background:var(--bg-hover);border:1px solid var(--border-color);padding:.25rem .5rem;border-radius:3px;font-size:10px;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.3px;font-family:SF Mono,Monaco,monospace;flex-shrink:0}.script-actions{display:flex;gap:.5rem;flex-shrink:0;align-self:start}.loading-state,.no-scripts{padding:2rem;text-align:center;color:var(--text-tertiary);font-size:12px}.running-indicator{color:var(--accent-green);font-size:12px;margin-right:.5rem;animation:pulse 2s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.process-item{padding:.875rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease;display:flex;justify-content:space-between;align-items:center;gap:1rem}.process-item:hover{background:var(--bg-hover);border-color:var(--border-hover)}.process-info{display:flex;align-items:center;gap:.75rem;flex:1;flex-wrap:wrap}.process-name{font-family:SF Mono,Monaco,monospace;font-size:13px;font-weight:600;color:var(--text-primary);min-width:100px}.process-pid{font-family:SF Mono,Monaco,monospace;font-size:11px;color:var(--text-secondary)}.process-uptime{font-family:SF Mono,Monaco,monospace;font-size:11px;color:var(--text-tertiary)}.test-results-section{margin-bottom:2rem;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;padding:1.25rem;transition:all .15s ease}.test-results-section .section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.test-timestamp{font-size:10px;color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace;letter-spacing:.3px}.test-results-content{display:flex;flex-direction:column;gap:1rem}.test-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:.75rem}.test-stat{display:flex;align-items:center;gap:.625rem;padding:.75rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease}.test-stat:hover{background:var(--bg-hover);border-color:var(--border-hover)}.test-stat.passed{border-left:3px solid var(--accent-green)}.test-stat.failed{border-left:3px solid #f85149}.test-stat.skipped{border-left:3px solid var(--text-tertiary)}.test-stat.total{border-left:3px solid var(--accent-cyan)}.test-stat-icon{font-size:20px;line-height:1}.test-stat.passed .test-stat-icon{color:var(--accent-green)}.test-stat.failed .test-stat-icon{color:#f85149}.test-stat.skipped .test-stat-icon{color:var(--text-tertiary);opacity:.6}.test-stat.total .test-stat-icon{color:var(--accent-cyan)}.test-stat-info{display:flex;flex-direction:column;gap:.125rem}.test-stat-value{font-size:24px;font-weight:700;color:var(--text-primary);line-height:1;font-family:SF Mono,Monaco,monospace}.test-stat-label{font-size:10px;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px;font-weight:600}.test-meta{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;padding-top:.75rem;border-top:1px solid var(--border-color)}.test-framework-badge{display:inline-flex;align-items:center;padding:.25rem .625rem;background:#7d76fc1a;border:1px solid var(--accent-purple);border-radius:3px;font-size:10px;font-weight:600;color:var(--accent-purple);text-transform:uppercase;letter-spacing:.5px}.test-duration,.test-coverage,.test-script-name{font-size:11px;color:var(--text-secondary);font-family:SF Mono,Monaco,monospace;letter-spacing:.3px}.test-coverage{color:var(--accent-cyan);font-weight:500}.stat-card-danger .stat-value{color:#f85149}.stat-card-safe .stat-value{color:var(--accent-green)}.security-section{background:var(--bg-secondary);padding:1.25rem;border-radius:4px;border:1px solid var(--border-color);margin-bottom:1.5rem}.security-summary{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}.security-badge{display:inline-flex;align-items:center;padding:.25rem .625rem;border-radius:3px;font-size:11px;font-weight:600;font-family:SF Mono,Monaco,monospace;letter-spacing:.3px}.security-safe{background:#3fb9501a;border:1px solid var(--accent-green);color:var(--accent-green)}.security-exposed{background:#f851491a;border:1px solid #f85149;color:#f85149}.security-missing{background:#8b949e1a;border:1px solid var(--text-tertiary);color:var(--text-tertiary)}.security-channels{font-size:11px;color:var(--text-secondary);font-family:SF Mono,Monaco,monospace;margin-left:.5rem}.security-items{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem}.security-item{padding:.75rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;border-left:3px solid #f85149}.security-item-header{display:flex;align-items:center;gap:.75rem;margin-bottom:.375rem}.security-category{padding:.125rem .5rem;border-radius:3px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:SF Mono,Monaco,monospace}.security-category-secrets{background:#f8514926;color:#f85149}.security-category-ide{background:#7d76fc26;color:var(--accent-purple)}.security-category-ai{background:#39c5cf26;color:var(--accent-cyan)}.security-category-system{background:#8b949e26;color:var(--text-secondary)}.security-category-deps{background:#d2992226;color:#d29922}.security-pattern{font-family:SF Mono,Monaco,monospace;font-size:12px;color:var(--text-primary);font-weight:500}.security-item-description{font-size:11px;color:var(--text-secondary);margin-bottom:.5rem;line-height:1.4}.security-item-files{display:flex;flex-wrap:wrap;gap:.375rem}.security-file{font-family:SF Mono,Monaco,monospace;font-size:10px;color:var(--text-tertiary);background:var(--bg-hover);padding:.125rem .5rem;border-radius:2px;border:1px solid var(--border-color)}.security-clean{margin-top:1rem;padding:1.5rem;text-align:center;color:var(--accent-green);font-size:12px;font-weight:500}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;width:90%;max-width:500px;box-shadow:var(--shadow-lg);animation:modalSlideIn .2s ease}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:1.25rem;border-bottom:1px solid var(--border-color)}.modal-header h2{font-size:14px;color:var(--text-primary);margin:0;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-family:inherit}.modal-close{background:transparent;border:1px solid transparent;font-size:20px;color:var(--text-tertiary);cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:3px;transition:all .15s ease;line-height:1}.modal-close:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-color)}.modal-content form{padding:1.25rem}.form-group{margin-bottom:1.25rem}.form-group label{display:block;margin-bottom:.5rem;font-weight:500;color:var(--text-primary);font-size:12px;text-transform:uppercase;letter-spacing:.3px;font-family:inherit}.path-input-group{display:flex;gap:.5rem}.path-input-group input{flex:1;padding:.625rem;border:1px solid var(--border-color);border-radius:4px;font-size:12px;font-family:SF Mono,Monaco,monospace;background:var(--bg-tertiary);color:var(--text-primary);transition:all .15s ease}.path-input-group input::placeholder{color:var(--text-tertiary);opacity:.6}.path-input-group input:focus{outline:none;border-color:var(--accent-cyan);box-shadow:0 0 0 2px #39c5cf1a;background:var(--bg-hover)}.path-input-group input:disabled{background:var(--bg-primary);cursor:not-allowed;opacity:.5}.modal-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.25rem}.project-search{padding:12px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0;z-index:10}.search-input-group{display:flex;gap:8px;position:relative}.search-input-wrapper{flex:1;position:relative;display:flex;align-items:center}.search-input{flex:1;padding:8px 36px 8px 12px;border:1px solid var(--border-color);border-radius:4px;font-size:14px;outline:none;transition:border-color .2s;background:var(--bg-tertiary);color:var(--text-primary)}.sort-icon-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-tertiary);cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;border-radius:3px;transition:all .15s ease}.sort-icon-btn:hover{color:var(--text-primary);background:var(--bg-hover)}.sort-menu{position:absolute;top:calc(100% + 4px);right:0;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;box-shadow:var(--shadow-md);z-index:100;min-width:180px;padding:4px}.sort-menu-item{padding:8px 12px;cursor:pointer;border-radius:3px;font-size:13px;color:var(--text-primary);display:flex;justify-content:space-between;align-items:center;transition:all .15s ease}.sort-menu-item:hover{background:var(--bg-hover)}.sort-menu-item.active{background:var(--bg-hover);color:var(--accent-cyan)}.sort-menu-item .checkmark{color:var(--accent-green);font-size:12px;margin-left:8px}.search-input:focus{border-color:var(--accent-cyan)}.search-input::placeholder{color:var(--text-tertiary)}.search-filter{padding:8px 12px;border:1px solid var(--border-color);border-radius:4px;font-size:14px;background:var(--bg-tertiary);color:var(--text-primary);cursor:pointer;outline:none;transition:border-color .2s}.search-filter:focus{border-color:var(--accent-cyan)}.search-filter:hover{border-color:var(--border-hover);background:var(--bg-hover)}.settings-container{max-width:800px;height:100%;display:flex;flex-direction:column}.settings-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:1rem;margin-bottom:1.5rem;border-bottom:1px solid var(--border-color)}.settings-header h2{font-size:18px;font-weight:600;color:var(--text-primary);margin:0;letter-spacing:.3px}.settings-header .btn{padding:.5rem 1rem;font-size:13px}.settings-content{flex:1;overflow-y:auto;padding-right:1rem}.settings-section{margin-bottom:2rem}.settings-section:last-child{margin-bottom:0}.settings-section h3{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:1rem;text-transform:uppercase;letter-spacing:.5px}.settings-field{margin-bottom:1rem}.settings-field:last-child{margin-bottom:0}.settings-field label{display:block;font-size:12px;color:var(--text-secondary);margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.3px}.settings-select,.settings-input{width:100%;padding:.75rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;color:var(--text-primary);font-size:13px;font-family:inherit;outline:none;transition:border-color .15s ease}.settings-select:focus,.settings-input:focus{border-color:var(--accent-cyan)}.settings-input{font-family:SF Mono,Monaco,monospace}.settings-footer{display:flex;justify-content:flex-start;gap:.75rem;padding-top:1.5rem;margin-top:1.5rem;border-top:1px solid var(--border-color)}.settings-footer .btn{padding:.5rem 1.5rem;font-size:13px}.loading-state{padding:3rem;text-align:center;color:var(--text-tertiary);font-size:13px}.app-header{-webkit-app-region:drag;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:1rem}.app-header button,.app-header .btn,.app-header .btn-link,.app-header .header-actions{-webkit-app-region:no-drag}.status-bar{background:var(--bg-secondary);border-top:1px solid var(--border-color);padding:.5rem 1.5rem;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;font-size:11px;font-family:SF Mono,Monaco,monospace}.status-bar-content{display:flex;align-items:center;gap:1rem;width:100%;justify-content:space-between}.status-version{color:var(--text-tertiary);font-size:11px;font-family:SF Mono,Monaco,monospace;font-weight:500;letter-spacing:.3px}.status-right{display:flex;align-items:center;gap:1rem}.status-indicator{display:flex;align-items:center;gap:.5rem}.status-dot{width:6px;height:6px;border-radius:50%;display:inline-block}.status-dot.connected{background:var(--accent-green);box-shadow:0 0 4px var(--accent-green)}.status-dot.disconnected{background:#f85149;box-shadow:0 0 4px #f85149}.status-text{color:var(--text-secondary);font-size:11px;text-transform:uppercase;letter-spacing:.5px}.api-port{color:var(--text-tertiary);font-size:11px;font-family:SF Mono,Monaco,monospace}.terminal-sidebar{display:flex;flex-direction:column;width:100%;height:100%;background:var(--bg-secondary);border-left:1px solid var(--border-color);color:var(--text-primary);font-family:SF Mono,Monaco,Courier New,monospace;font-size:12px}.terminal-header{display:flex;flex-direction:column;gap:.75rem;padding:1rem;background:var(--bg-tertiary);border-bottom:1px solid var(--border-color);position:relative}.terminal-header:after{content:"";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,var(--accent-cyan) 50%,transparent 100%);opacity:.3}.terminal-title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem}.terminal-title-content{display:flex;align-items:flex-start;gap:.625rem;flex:1}.terminal-status-indicator{font-size:10px;margin-top:2px;flex-shrink:0}.terminal-status-indicator.running{color:var(--accent-cyan);animation:pulse 2s infinite}.terminal-status-indicator.stopped{color:var(--text-tertiary);opacity:.5}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.terminal-info{display:flex;flex-direction:column;gap:.25rem;flex:1;min-width:0}.terminal-script{font-weight:600;color:var(--text-primary);font-size:13px;letter-spacing:.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.terminal-project{font-size:10px;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.terminal-meta{display:flex;flex-direction:column;align-items:flex-end;gap:.25rem;flex-shrink:0}.terminal-status-badge{font-size:10px;padding:.25rem .5rem;border-radius:3px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;border:1px solid}.terminal-status-badge.running{color:var(--accent-cyan);background:#39c5cf1a;border-color:var(--accent-cyan)}.terminal-status-badge.stopped{color:var(--text-tertiary);background:var(--bg-secondary);border-color:var(--border-color)}.terminal-pid{font-size:10px;color:var(--text-tertiary);letter-spacing:.3px}.terminal-toolbar{display:flex;gap:.5rem;align-items:center}.terminal-output{flex:1;overflow-y:auto;padding:1rem;line-height:1.6;white-space:pre-wrap;word-wrap:break-word;background:var(--bg-primary);font-size:11px}.terminal-output::-webkit-scrollbar{width:6px}.terminal-output::-webkit-scrollbar-track{background:var(--bg-primary)}.terminal-output::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}.terminal-output::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.terminal-line{margin-bottom:.125rem;padding:.125rem 0;color:var(--text-secondary);transition:background .15s ease}.terminal-line:hover{background:var(--bg-secondary);margin-left:-.5rem;margin-right:-.5rem;padding-left:.5rem;padding-right:.5rem;border-radius:2px}.terminal-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--text-tertiary);padding:3rem 2rem;text-align:center;gap:.75rem}.terminal-empty-icon{font-size:48px;opacity:.3;margin-bottom:.5rem}.terminal-empty-text{font-size:13px;color:var(--text-secondary);font-weight:500}.terminal-empty-hint{font-size:11px;color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace;letter-spacing:.3px}.terminal-line{color:var(--text-secondary)}.terminal-line:contains("error"),.terminal-line:contains("Error"),.terminal-line:contains("ERROR"),.terminal-line:contains("✗"),.terminal-line:contains("failed"),.terminal-line:contains("Failed"){color:#f85149}.terminal-line:contains("warning"),.terminal-line:contains("Warning"),.terminal-line:contains("WARN"),.terminal-line:contains("⚠"){color:#d29922}.terminal-line:contains("success"),.terminal-line:contains("Success"),.terminal-line:contains("✓"),.terminal-line:contains("✔"),.terminal-line:contains("passed"),.terminal-line:contains("Passed"){color:var(--accent-cyan)}.terminal-line:contains("info"),.terminal-line:contains("Info"),.terminal-line:contains("INFO"){color:var(--accent-blue)}.terminal-line:contains("debug"),.terminal-line:contains("Debug"),.terminal-line:contains("DEBUG"){color:var(--text-tertiary);opacity:.7}.tab-bar{display:flex;border-bottom:1px solid var(--border-color, #30363d);background:var(--bg-secondary, #161b22);padding:0;margin:0}.tab-button{flex:1;padding:12px 16px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--text-secondary, #8b949e);cursor:pointer;font-size:13px;font-weight:600;font-family:inherit;letter-spacing:.2px;transition:all .2s ease}.tab-button:hover{color:var(--text-primary, #c9d1d9);background:var(--bg-hover, #21262d)}.tab-button.active{color:var(--accent-cyan, #39c5cf);border-bottom-color:var(--accent-cyan, #39c5cf)}.workspace-list{flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;padding:.75rem}.workspace-list::-webkit-scrollbar{width:8px}.workspace-list::-webkit-scrollbar-track{background:var(--bg-primary);border-radius:4px}.workspace-list::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:4px}.workspace-list::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.workspace-list-loading,.workspace-list-empty{padding:2rem;text-align:center;color:var(--text-secondary)}.workspace-list-empty .hint{font-size:12px;color:var(--text-tertiary);margin-top:.5rem}.workspace-item{padding:.875rem;margin-bottom:.5rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;cursor:pointer;transition:all .15s ease;position:relative}.workspace-item:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:transparent;transition:background .15s ease}.workspace-item:hover{background:var(--bg-hover);border-color:var(--border-hover);transform:translate(2px)}.workspace-item:hover:before{background:var(--accent-cyan)}.workspace-item.selected{background:var(--bg-hover);border-color:var(--accent-cyan);box-shadow:var(--shadow-sm)}.workspace-item.selected:before{background:var(--accent-cyan)}.workspace-item.keyboard-focused{outline:2px solid var(--accent-cyan);outline-offset:-2px;background:var(--bg-hover)}.workspace-item-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.5rem;gap:.5rem}.workspace-name-wrapper{display:flex;align-items:center;gap:.5rem;flex:1}.workspace-name{font-size:13px;font-weight:600;color:var(--text-primary);margin:0;flex:1;font-family:inherit;letter-spacing:.2px;display:flex;align-items:center;gap:.5rem}.workspace-description{font-size:12px;color:var(--text-secondary);margin:.25rem 0;line-height:1.4;opacity:.9}.workspace-project-count{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 .25rem;background:#39c5cf26;color:var(--accent-cyan);border-radius:10px;font-size:10px;font-weight:600;transition:all .15s ease}.workspace-item:hover .workspace-project-count{background:#39c5cf40}.workspace-item.selected .workspace-project-count{background:var(--accent-cyan);color:var(--bg-primary)}.workspace-path{font-size:11px;color:var(--text-tertiary);margin:.25rem 0 .5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4;font-family:SF Mono,Monaco,monospace;opacity:.8}.workspace-tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:.5rem}.workspace-tag{font-size:11px;padding:.25rem .5rem;background:var(--bg-secondary);color:var(--accent-cyan);border-radius:3px;border:1px solid var(--accent-cyan);opacity:.8;transition:all .15s ease}.workspace-item:hover .workspace-tag{opacity:1;background:var(--bg-primary)}.workspace-details{max-width:1000px}.workspace-details-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-secondary);font-size:13px}.workspace-details-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid var(--border-color);gap:1rem}.workspace-details-header>div:first-child{flex:1;min-width:0;max-width:900px}.workspace-details-header h2{font-size:18px;color:var(--text-primary);margin-bottom:.5rem;font-weight:600;font-family:inherit;letter-spacing:.3px}.workspace-name-editable{cursor:pointer;transition:color .15s ease;margin:0}.workspace-name-editable:hover{color:var(--accent-cyan)}.workspace-name-edit{margin-bottom:.5rem}.workspace-name-input{background:var(--bg-secondary);border:1px solid var(--border-color);color:var(--text-primary);padding:.5rem .75rem;border-radius:4px;font-size:18px;font-weight:600;font-family:inherit;width:100%;max-width:500px;letter-spacing:.3px;transition:all .15s ease}.workspace-name-input:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.workspace-name-input:focus{outline:none;border-color:var(--accent-cyan);background:var(--bg-tertiary);box-shadow:0 0 0 2px #39c5cf14}.workspace-description-edit{margin-bottom:.5rem;width:100%}.workspace-description-input{background:var(--bg-secondary);border:1px solid var(--border-color);padding:1rem 1.25rem;border-radius:6px;font-size:14px;color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%;max-width:none;min-height:140px;resize:vertical;line-height:1.6;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.workspace-description-input:hover{border-color:var(--border-hover);background:var(--bg-tertiary);box-shadow:0 2px 4px #00000014}.workspace-description-input:focus{outline:none;border-color:var(--accent-cyan);background:var(--bg-tertiary);box-shadow:0 0 0 3px #39c5cf1f,0 4px 6px #0000001a;transform:translateY(-1px)}.workspace-description{font-size:14px;color:var(--text-secondary);margin:0 0 .5rem;cursor:pointer;transition:all .15s ease;line-height:1.6;padding:.5rem;border-radius:4px}.workspace-description:hover{color:var(--text-primary);background:var(--bg-tertiary)}.workspace-path{font-size:11px;color:var(--text-tertiary);margin:0;font-family:SF Mono,Monaco,monospace;opacity:.8}.header-actions-group{display:flex;gap:.5rem;flex-shrink:0}.btn{padding:.5rem 1rem;border-radius:4px;cursor:pointer;font-weight:600;font-size:13px;transition:all .15s ease;border:none}.btn-primary{padding:.5rem 1rem;background:var(--accent-cyan);color:var(--bg-primary);border:none;border-radius:4px;cursor:pointer;font-weight:600;font-size:13px;transition:all .15s ease}.btn-primary:hover{opacity:.9}.btn-primary:active{opacity:.8}.btn-secondary{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-color)}.btn-secondary:hover{background:var(--bg-hover);border-color:var(--border-hover)}.btn-danger{padding:.5rem 1rem;background:transparent;color:#ff5252;border:1px solid #ff5252;border-radius:4px;cursor:pointer;font-weight:600;font-size:13px;transition:all .15s ease}.btn-danger:hover{background:#ff52521a}.btn-danger:active{background:#ff525226}.workspace-section{margin-bottom:2rem}.workspace-section h3{font-size:14px;font-weight:600;color:var(--text-primary);margin:0 0 1rem;letter-spacing:.2px}.workspace-projects-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem}.workspace-project-tile{padding:.875rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;transition:all .15s ease;cursor:pointer!important;position:relative}.workspace-project-tile:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:transparent;transition:background .15s ease}.workspace-project-tile:hover{background:var(--bg-hover);border-color:var(--border-hover);transform:translate(2px)}.workspace-project-tile:hover:before{background:var(--accent-cyan)}.workspace-project-tile.untracked{border-color:var(--border-color);opacity:.85;cursor:default!important}.workspace-project-tile.untracked:hover{transform:none;border-color:var(--border-hover)}.workspace-project-tile.untracked:before{background:var(--text-secondary)}.workspace-project-tile.untracked:hover:before{background:var(--text-secondary)}.project-tile-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.5rem;gap:.5rem}.project-tile-name{font-size:13px;font-weight:600;color:var(--text-primary);margin:0;word-break:break-word;display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.untracked-badge{display:inline-flex;align-items:center;padding:.125rem .5rem;background:#8b949e26;border:1px solid var(--text-secondary);border-radius:3px;font-size:9px;color:var(--text-secondary);font-weight:600;text-transform:uppercase;letter-spacing:.5px}.project-tile-path{font-size:11px;color:var(--text-secondary);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-tile-tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:.5rem}.project-tile-tag{padding:.125rem .5rem;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:3px;font-size:10px;color:var(--text-secondary);font-weight:500}.project-tile-actions{margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--border-color)}.btn-add-project{padding:.35rem .75rem;background:transparent;color:var(--accent-cyan);border:1px solid var(--accent-cyan);border-radius:4px;cursor:pointer;font-weight:600;font-size:11px;transition:all .15s ease;display:inline-flex;align-items:center;gap:.375rem}.btn-add-project:hover:not(:disabled){background:#39c5cf1a}.btn-add-project:active:not(:disabled){background:#39c5cf26}.btn-add-project:disabled{opacity:.6;cursor:not-allowed}.empty-state{color:var(--text-secondary);padding:2rem;text-align:center;font-size:13px}.loading-spinner{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;gap:.75rem}.loading-spinner p{font-size:13px;color:var(--text-secondary);margin:0}.spinner{width:20px;height:20px;border:2px solid var(--border-color);border-top-color:var(--accent-cyan);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.danger-zone{margin-top:3rem;padding:1.5rem;border:1px solid #f85149;border-radius:6px;background:#f851490d}.danger-zone h3{font-size:14px;font-weight:600;color:#f85149;margin:0 0 .5rem}.danger-zone-text{font-size:13px;color:var(--text-secondary);margin:0 0 1rem;line-height:1.5}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal-content{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;padding:1.5rem;max-width:500px;width:90%;box-shadow:0 8px 32px #0006}.modal-content h3{font-size:16px;font-weight:600;color:var(--text-primary);margin:0 0 1rem}.modal-warning{font-size:13px;color:var(--text-secondary);line-height:1.6;margin:0 0 1rem}.modal-warning strong{color:var(--text-primary)}.modal-instruction{font-size:13px;color:var(--text-secondary);margin:0 0 .75rem}.confirmation-code{display:inline-block;padding:.25rem .5rem;background:var(--bg-tertiary);border:1px solid var(--accent-cyan);border-radius:4px;font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:600;color:var(--accent-cyan);letter-spacing:2px}.confirmation-input{width:100%;padding:.75rem;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;color:var(--text-primary);font-family:SF Mono,Monaco,monospace;font-size:14px;font-weight:600;letter-spacing:2px;text-transform:uppercase;margin-bottom:1.5rem}.confirmation-input:focus{outline:none;border-color:var(--accent-cyan);box-shadow:0 0 0 2px #39c5cf1a}.modal-actions{display:flex;gap:.75rem;justify-content:flex-end}.modal-actions .btn{padding:.5rem 1rem;font-size:13px}.workspace-modal{max-width:600px;max-height:80vh;overflow-y:auto}.workspace-mode-selector{display:flex;gap:8px;margin-bottom:24px;border-bottom:1px solid var(--border-color, #30363d)}.mode-button{flex:1;padding:12px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--text-secondary, #8b949e);cursor:pointer;font-size:14px;font-weight:500;transition:all .2s}.mode-button:hover{color:var(--text-primary, #c9d1d9)}.mode-button.active{color:var(--accent-cyan, #39c5cf);border-bottom-color:var(--accent-cyan, #39c5cf)}.projects-selector{max-height:200px;overflow-y:auto;border:1px solid var(--border-color, #30363d);border-radius:4px;padding:8px;background:var(--bg-secondary, #161b22)}.project-checkbox{display:flex;align-items:center;gap:8px;padding:8px;cursor:pointer;border-radius:4px;transition:background .2s}.project-checkbox:hover{background:var(--bg-hover, #21262d)}.project-checkbox input[type=checkbox]{cursor:pointer}.empty-state{color:var(--text-secondary, #8b949e);font-style:italic;text-align:center;padding:20px}.form-input{width:100%;padding:.625rem;border:1px solid var(--border-color);border-radius:4px;font-size:12px;font-family:SF Mono,Monaco,monospace;background:var(--bg-tertiary);color:var(--text-primary);transition:all .15s ease}.app{display:flex;flex-direction:column;height:100vh;overflow:hidden;background:var(--bg-primary);transition:border-color .2s ease}.app.drag-over{border:2px dashed var(--accent-cyan);border-radius:4px;background:#00ffff0d;position:relative}.app.drag-over:before{content:"Drop folder here to add project";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1000;background:var(--bg-secondary);border:2px solid var(--accent-cyan);border-radius:8px;padding:1rem 2rem;font-size:14px;font-weight:500;color:var(--accent-cyan);pointer-events:none;box-shadow:0 4px 12px #00ffff4d}.app-header{background:var(--bg-secondary);border-bottom:1px solid var(--border-color);padding:.5rem 1.5rem;display:flex;align-items:center;justify-content:center;gap:1rem;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);position:relative;z-index:10;flex-shrink:0}.app-header:after{content:"";position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent 0%,var(--accent-cyan) 50%,transparent 100%);opacity:.3}.app-logo{margin:0;font-size:12px;font-weight:600;letter-spacing:1.5px;color:var(--accent-cyan);position:absolute;left:50%;transform:translate(-50%)}.header-actions{display:flex;gap:1.5rem;margin-left:auto}.btn-link{padding:0;border:none;background:none;font-size:11px;font-weight:500;cursor:pointer;transition:color .15s ease;font-family:inherit;letter-spacing:.3px;text-transform:uppercase;color:var(--text-secondary);-webkit-app-region:no-drag}.btn-link:hover:not(:disabled){color:var(--text-primary)}.btn-link:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.btn-link-primary{color:var(--accent-cyan)}.btn-link-primary:hover:not(:disabled){color:var(--accent-blue)}.btn{padding:.5rem 1rem;border:1px solid var(--border-color);border-radius:4px;font-size:12px;font-weight:500;cursor:pointer;transition:all .15s ease;font-family:inherit;letter-spacing:.3px;text-transform:uppercase;background:var(--bg-tertiary);color:var(--text-primary)}.btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.btn-primary{background:var(--accent-cyan);color:var(--bg-primary);border-color:var(--accent-cyan);font-weight:600}.btn-primary:hover:not(:disabled){background:var(--accent-blue);border-color:var(--accent-blue);transform:translateY(-1px);box-shadow:var(--shadow-sm)}.btn-secondary{background:transparent;color:var(--text-secondary);border-color:var(--border-color)}.btn-secondary:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border-hover);color:var(--text-primary)}.btn-danger{background:transparent;color:#f85149;border-color:#f85149}.btn-danger:hover:not(:disabled){background:#f851491a;border-color:#f85149;color:#f85149}.btn-tiny{padding:.25rem .5rem;font-size:10px}.terminal-icon{font-size:14px;display:inline-block}.app-content{display:flex;flex:1;overflow:hidden;position:relative}.app-content-with-terminal{display:grid;grid-template-columns:auto 1fr auto;flex:1;overflow:hidden}.react-resizable-handle{position:absolute;width:4px;right:-2px;top:0;bottom:0;cursor:col-resize;background:transparent;z-index:10}.react-resizable-handle:hover{background:var(--accent-cyan);opacity:.3}.react-resizable-handle:active{background:var(--accent-cyan);opacity:.6}.sidebar{width:100%;height:100%;background:var(--bg-secondary);border-right:1px solid var(--border-color);overflow:hidden;display:flex;flex-direction:column}.sidebar::-webkit-scrollbar{width:6px}.sidebar::-webkit-scrollbar-track{background:var(--bg-primary)}.sidebar::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}.sidebar::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.main-content{flex:1;overflow-y:auto;padding:1.5rem;background:var(--bg-primary)}.main-content::-webkit-scrollbar{width:6px}.main-content::-webkit-scrollbar-track{background:var(--bg-primary)}.main-content::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}.main-content::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--text-secondary);text-align:center;padding:2rem}.empty-state h2{margin-bottom:.5rem;color:var(--text-primary);font-size:16px;font-weight:500}.empty-state p{color:var(--text-tertiary);font-size:13px}.app-footer{background:var(--bg-secondary);border-top:1px solid var(--border-color);padding:.5rem 1.5rem;flex-shrink:0}*{margin:0;padding:0;box-sizing:border-box}:root{--bg-primary: #0d1117;--bg-secondary: #161b22;--bg-tertiary: #1c2128;--bg-hover: #21262d;--border-color: #30363d;--border-hover: #484f58;--text-primary: #c9d1d9;--text-secondary: #8b949e;--text-tertiary: #6e7681;--accent-cyan: #39c5cf;--accent-blue: #58a6ff;--accent-green: #3fb950;--accent-purple: #bc8cff;--accent-orange: #ffa657;--shadow-sm: 0 1px 3px rgba(0, 0, 0, .3);--shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--shadow-lg: 0 8px 24px rgba(0, 0, 0, .5)}body{font-family:SF Mono,Monaco,Inconsolata,Fira Code,Fira Mono,Droid Sans Mono,Source Code Pro,Menlo,Consolas,Courier New,monospace;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:var(--bg-primary);color:var(--text-primary);font-size:13px;line-height:1.5;-webkit-user-select:none;user-select:none}input,textarea,[contenteditable=true],[contenteditable=""]{-webkit-user-select:text;user-select:text}code{font-family:SF Mono,Monaco,Inconsolata,Fira Code,Fira Mono,Droid Sans Mono,Source Code Pro,Menlo,Consolas,Courier New,monospace}#root{width:100%;height:100vh}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' http://localhost:* ws://localhost:*;" />
|
|
7
7
|
<title>projax</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-6afBeDFD.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-Bd3aFi7B.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,7 @@ const http = __importStar(require("http"));
|
|
|
42
42
|
const child_process_1 = require("child_process");
|
|
43
43
|
const core_bridge_1 = require("./core-bridge");
|
|
44
44
|
const script_runner_1 = require("./script-runner");
|
|
45
|
+
const octopus_cli_1 = require("./octopus-cli");
|
|
45
46
|
const port_scanner_1 = require("./port-scanner");
|
|
46
47
|
// Read version from package.json
|
|
47
48
|
const packageJson = require('../package.json');
|
|
@@ -436,6 +437,7 @@ program
|
|
|
436
437
|
.description('Project management dashboard - launches interactive TUI by default. Use --help for CLI commands.')
|
|
437
438
|
.version(packageJson.version)
|
|
438
439
|
.addHelpText('beforeAll', displayLogo());
|
|
440
|
+
program.addCommand((0, octopus_cli_1.createOctopusCommand)());
|
|
439
441
|
// Launch the interactive TUI
|
|
440
442
|
async function launchTUI() {
|
|
441
443
|
try {
|
|
@@ -1632,102 +1634,7 @@ program
|
|
|
1632
1634
|
// Start Documentation Site command
|
|
1633
1635
|
program
|
|
1634
1636
|
.command('docs')
|
|
1635
|
-
.description('Start the documentation site')
|
|
1636
|
-
.option('--dev', 'Start in development mode (with hot reload)')
|
|
1637
|
-
.option('--build', 'Build the documentation site')
|
|
1638
|
-
.action(async (options) => {
|
|
1639
|
-
try {
|
|
1640
|
-
// Check for local docsite (development mode)
|
|
1641
|
-
const localDocsitePath = path.join(__dirname, '..', '..', 'docsite');
|
|
1642
|
-
const isLocalDev = fs.existsSync(localDocsitePath) && fs.existsSync(path.join(localDocsitePath, 'package.json'));
|
|
1643
|
-
if (!isLocalDev) {
|
|
1644
|
-
console.error('Error: Documentation site not found.');
|
|
1645
|
-
console.error('\nThe documentation site is only available in local development.');
|
|
1646
|
-
console.error('Please run this command from the projax repository root.');
|
|
1647
|
-
process.exit(1);
|
|
1648
|
-
}
|
|
1649
|
-
if (options.build) {
|
|
1650
|
-
// Build the documentation site
|
|
1651
|
-
console.log('Building documentation site...');
|
|
1652
|
-
const { execSync } = require('child_process');
|
|
1653
|
-
try {
|
|
1654
|
-
execSync('npm run build', {
|
|
1655
|
-
cwd: localDocsitePath,
|
|
1656
|
-
stdio: 'inherit'
|
|
1657
|
-
});
|
|
1658
|
-
console.log('\n✓ Documentation site built successfully!');
|
|
1659
|
-
console.log('Run "npm run serve" in packages/docsite to serve the built site.');
|
|
1660
|
-
}
|
|
1661
|
-
catch (error) {
|
|
1662
|
-
console.error('\nBuild failed.');
|
|
1663
|
-
process.exit(1);
|
|
1664
|
-
}
|
|
1665
|
-
return;
|
|
1666
|
-
}
|
|
1667
|
-
if (options.dev) {
|
|
1668
|
-
// Development mode - start Docusaurus dev server
|
|
1669
|
-
console.log('Starting documentation site in development mode...');
|
|
1670
|
-
const { spawn } = require('child_process');
|
|
1671
|
-
const docusaurusProcess = spawn('npm', ['start'], {
|
|
1672
|
-
cwd: localDocsitePath,
|
|
1673
|
-
stdio: 'inherit',
|
|
1674
|
-
shell: true,
|
|
1675
|
-
});
|
|
1676
|
-
// Handle process termination
|
|
1677
|
-
process.on('SIGINT', () => {
|
|
1678
|
-
docusaurusProcess.kill();
|
|
1679
|
-
process.exit(0);
|
|
1680
|
-
});
|
|
1681
|
-
process.on('SIGTERM', () => {
|
|
1682
|
-
docusaurusProcess.kill();
|
|
1683
|
-
process.exit(0);
|
|
1684
|
-
});
|
|
1685
|
-
return;
|
|
1686
|
-
}
|
|
1687
|
-
// Production mode - check if built, then serve
|
|
1688
|
-
const buildPath = path.join(localDocsitePath, 'build');
|
|
1689
|
-
if (!fs.existsSync(buildPath)) {
|
|
1690
|
-
console.log('Documentation site not built.');
|
|
1691
|
-
console.log('Building documentation site...');
|
|
1692
|
-
const { execSync } = require('child_process');
|
|
1693
|
-
try {
|
|
1694
|
-
execSync('npm run build', {
|
|
1695
|
-
cwd: localDocsitePath,
|
|
1696
|
-
stdio: 'inherit'
|
|
1697
|
-
});
|
|
1698
|
-
}
|
|
1699
|
-
catch (error) {
|
|
1700
|
-
console.error('\nBuild failed. Try running in dev mode: prx docs --dev');
|
|
1701
|
-
console.error('Or manually build: cd packages/docsite && npm run build');
|
|
1702
|
-
process.exit(1);
|
|
1703
|
-
}
|
|
1704
|
-
}
|
|
1705
|
-
console.log('Starting documentation site server...');
|
|
1706
|
-
const { spawn } = require('child_process');
|
|
1707
|
-
const serveProcess = spawn('npm', ['run', 'serve'], {
|
|
1708
|
-
cwd: localDocsitePath,
|
|
1709
|
-
stdio: 'inherit',
|
|
1710
|
-
shell: true,
|
|
1711
|
-
});
|
|
1712
|
-
// Handle process termination
|
|
1713
|
-
process.on('SIGINT', () => {
|
|
1714
|
-
serveProcess.kill();
|
|
1715
|
-
process.exit(0);
|
|
1716
|
-
});
|
|
1717
|
-
process.on('SIGTERM', () => {
|
|
1718
|
-
serveProcess.kill();
|
|
1719
|
-
process.exit(0);
|
|
1720
|
-
});
|
|
1721
|
-
}
|
|
1722
|
-
catch (error) {
|
|
1723
|
-
console.error('Error starting documentation site:', error instanceof Error ? error.message : error);
|
|
1724
|
-
console.log('\nTroubleshooting:');
|
|
1725
|
-
console.log('1. Try dev mode: prx docs --dev');
|
|
1726
|
-
console.log('2. Or build manually: npm run build:docsite');
|
|
1727
|
-
console.log('3. Or run dev server: cd packages/docsite && npm start');
|
|
1728
|
-
process.exit(1);
|
|
1729
|
-
}
|
|
1730
|
-
});
|
|
1637
|
+
.description('Start the documentation site');
|
|
1731
1638
|
// VS Code Extension command - show extension info and location
|
|
1732
1639
|
program
|
|
1733
1640
|
.command('vscode-extension')
|
|
@@ -1735,58 +1642,9 @@ program
|
|
|
1735
1642
|
.alias('ext')
|
|
1736
1643
|
.description('Show VS Code extension information and installation instructions')
|
|
1737
1644
|
.action(async () => {
|
|
1738
|
-
|
|
1739
|
-
console.log('\n📦 PROJAX for Editors Extension\n');
|
|
1740
|
-
console.log('This extension brings PROJAX to VS Code, Cursor, and Windsurf editors.\n');
|
|
1741
|
-
// Find the .vsix file
|
|
1742
|
-
const releaseDir = path.join(__dirname, '..', '..', '..', 'release');
|
|
1743
|
-
const vsixFiles = fs.existsSync(releaseDir)
|
|
1744
|
-
? fs.readdirSync(releaseDir).filter(f => f.endsWith('.vsix'))
|
|
1745
|
-
: [];
|
|
1746
|
-
if (vsixFiles.length === 0) {
|
|
1747
|
-
console.log('⚠️ No .vsix file found. Build the extension first:');
|
|
1748
|
-
console.log(' npm run package --workspace=packages/vscode-extension\n');
|
|
1749
|
-
}
|
|
1750
|
-
else {
|
|
1751
|
-
const vsixPath = path.join(releaseDir, vsixFiles[0]);
|
|
1752
|
-
console.log(`✅ Extension: ${vsixFiles[0]}`);
|
|
1753
|
-
console.log(`📁 Location: ${vsixPath}\n`);
|
|
1754
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
1755
|
-
console.log('🚀 QUICK INSTALL (Easiest Method)');
|
|
1756
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
1757
|
-
console.log(` code --install-extension "${vsixPath}"`);
|
|
1758
|
-
console.log(` cursor --install-extension "${vsixPath}"`);
|
|
1759
|
-
console.log(` windsurf --install-extension "${vsixPath}"\n`);
|
|
1760
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
1761
|
-
console.log('📖 Manual Installation');
|
|
1762
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
1763
|
-
console.log('1. Open VS Code, Cursor, or Windsurf');
|
|
1764
|
-
console.log('2. Go to Extensions (Cmd+Shift+X / Ctrl+Shift+X)');
|
|
1765
|
-
console.log('3. Click the "..." menu → "Install from VSIX..."');
|
|
1766
|
-
console.log(`4. Select: ${vsixPath}\n`);
|
|
1767
|
-
// Open in Finder/Explorer
|
|
1768
|
-
const platform = process.platform;
|
|
1769
|
-
if (platform === 'darwin') {
|
|
1770
|
-
console.log('💡 Open release folder in Finder:');
|
|
1771
|
-
console.log(` open "${releaseDir}"\n`);
|
|
1772
|
-
}
|
|
1773
|
-
else if (platform === 'win32') {
|
|
1774
|
-
console.log('💡 Open release folder in Explorer:');
|
|
1775
|
-
console.log(` explorer "${releaseDir}"\n`);
|
|
1776
|
-
}
|
|
1777
|
-
else {
|
|
1778
|
-
console.log('💡 Open release folder:');
|
|
1779
|
-
console.log(` xdg-open "${releaseDir}"\n`);
|
|
1780
|
-
}
|
|
1781
|
-
}
|
|
1782
|
-
console.log('📚 Documentation:');
|
|
1783
|
-
console.log(' https://projax.dev/docs/editors\n');
|
|
1784
|
-
}
|
|
1785
|
-
catch (error) {
|
|
1786
|
-
console.error('Error:', error instanceof Error ? error.message : error);
|
|
1787
|
-
process.exit(1);
|
|
1788
|
-
}
|
|
1645
|
+
// ...
|
|
1789
1646
|
});
|
|
1647
|
+
program.addCommand((0, octopus_cli_1.createOctopusCommand)());
|
|
1790
1648
|
// API command - show API info and manage API server
|
|
1791
1649
|
program
|
|
1792
1650
|
.command('api')
|
|
@@ -1795,34 +1653,7 @@ program
|
|
|
1795
1653
|
.option('-k, --kill', 'Stop the API server')
|
|
1796
1654
|
.action(async (options) => {
|
|
1797
1655
|
try {
|
|
1798
|
-
|
|
1799
|
-
if (options.start) {
|
|
1800
|
-
const started = await startAPIServer(false);
|
|
1801
|
-
if (!started) {
|
|
1802
|
-
process.exit(1);
|
|
1803
|
-
}
|
|
1804
|
-
return;
|
|
1805
|
-
}
|
|
1806
|
-
if (options.kill) {
|
|
1807
|
-
console.log('Stopping API server...');
|
|
1808
|
-
// This would require process management - for now just inform user
|
|
1809
|
-
console.log('Note: API server process management not yet implemented.');
|
|
1810
|
-
console.log('Please stop the API server manually if needed.');
|
|
1811
|
-
return;
|
|
1812
|
-
}
|
|
1813
|
-
// Show status
|
|
1814
|
-
console.log('\nAPI Server Status:');
|
|
1815
|
-
console.log(` Running: ${apiStatus.running ? 'Yes' : 'No'}`);
|
|
1816
|
-
if (apiStatus.port) {
|
|
1817
|
-
console.log(` Port: ${apiStatus.port}`);
|
|
1818
|
-
console.log(` URL: http://localhost:${apiStatus.port}`);
|
|
1819
|
-
console.log(` Health: http://localhost:${apiStatus.port}/health`);
|
|
1820
|
-
console.log(` API Base: http://localhost:${apiStatus.port}/api`);
|
|
1821
|
-
}
|
|
1822
|
-
else {
|
|
1823
|
-
console.log(' Port: Not detected');
|
|
1824
|
-
}
|
|
1825
|
-
console.log('');
|
|
1656
|
+
//...
|
|
1826
1657
|
}
|
|
1827
1658
|
catch (error) {
|
|
1828
1659
|
console.error('Error checking API status:', error instanceof Error ? error.message : error);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOctopusCommand = createOctopusCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const octopus_1 = require("octopus");
|
|
6
|
+
const uuid_1 = require("uuid");
|
|
7
|
+
const octopus_tui_1 = require("./octopus-tui");
|
|
8
|
+
const octopus_show_tui_1 = require("./octopus-show-tui");
|
|
9
|
+
function createOctopusCommand() {
|
|
10
|
+
const octopusCommand = new commander_1.Command('octopus');
|
|
11
|
+
octopusCommand
|
|
12
|
+
.description('Manage AI agents and project tasks');
|
|
13
|
+
octopusCommand
|
|
14
|
+
.command('create-agent')
|
|
15
|
+
.description('Create and run a new agent')
|
|
16
|
+
.requiredOption('-p, --prompt <prompt>', 'The prompt for the agent')
|
|
17
|
+
.option('-l, --llm <llm>', 'The LLM to use', 'mock')
|
|
18
|
+
.action(async (options) => {
|
|
19
|
+
const agent = {
|
|
20
|
+
id: (0, uuid_1.v4)(),
|
|
21
|
+
prompt: options.prompt,
|
|
22
|
+
llm: options.llm,
|
|
23
|
+
status: octopus_1.AgentStatus.IDLE,
|
|
24
|
+
createdAt: new Date(),
|
|
25
|
+
updatedAt: new Date(),
|
|
26
|
+
};
|
|
27
|
+
console.log(`Creating agent ${agent.id} with prompt: "${agent.prompt}"`);
|
|
28
|
+
await (0, octopus_1.runAgent)(agent);
|
|
29
|
+
});
|
|
30
|
+
// 'ui' subcommand - simple agent UI
|
|
31
|
+
octopusCommand
|
|
32
|
+
.command('ui')
|
|
33
|
+
.description('Launch the simple Octopus agent TUI')
|
|
34
|
+
.action(() => {
|
|
35
|
+
(0, octopus_tui_1.launchOctopusTUI)();
|
|
36
|
+
});
|
|
37
|
+
// 'show' subcommand - rich task management TUI
|
|
38
|
+
octopusCommand
|
|
39
|
+
.command('show')
|
|
40
|
+
.description('Launch the Octopus Task Manager TUI - manage todo lists and spawn AI agents for tasks')
|
|
41
|
+
.action(() => {
|
|
42
|
+
(0, octopus_show_tui_1.launchOctopusShowTUI)();
|
|
43
|
+
});
|
|
44
|
+
return octopusCommand;
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function launchOctopusShowTUI(): void;
|