opalacoder 0.1.6__tar.gz → 0.1.17__tar.gz

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.
Files changed (96) hide show
  1. {opalacoder-0.1.6 → opalacoder-0.1.17}/PKG-INFO +17 -14
  2. {opalacoder-0.1.6 → opalacoder-0.1.17}/README.md +15 -13
  3. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/src/App.jsx +96 -1
  4. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/__init__.py +1 -1
  5. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/cli.py +12 -10
  6. opalacoder-0.1.6/opalacoder/gui/assets/index-nW4YtdWC.js → opalacoder-0.1.17/opalacoder/gui/assets/index-FS_uvdys.js +52 -48
  7. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/gui/index.html +1 -1
  8. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/ide_server.py +55 -0
  9. {opalacoder-0.1.6 → opalacoder-0.1.17}/pyproject.toml +2 -1
  10. {opalacoder-0.1.6 → opalacoder-0.1.17}/requirements.txt +1 -0
  11. {opalacoder-0.1.6 → opalacoder-0.1.17}/.claude/rules/RULES.md +0 -0
  12. {opalacoder-0.1.6 → opalacoder-0.1.17}/.claude/settings.json +0 -0
  13. {opalacoder-0.1.6 → opalacoder-0.1.17}/.github/workflows/publish.yml +0 -0
  14. {opalacoder-0.1.6 → opalacoder-0.1.17}/.gitignore +0 -0
  15. {opalacoder-0.1.6 → opalacoder-0.1.17}/AGENTS.md +0 -0
  16. {opalacoder-0.1.6 → opalacoder-0.1.17}/CLAUDE.md +0 -0
  17. {opalacoder-0.1.6 → opalacoder-0.1.17}/GEMINI.md +0 -0
  18. {opalacoder-0.1.6 → opalacoder-0.1.17}/agents.yaml +0 -0
  19. {opalacoder-0.1.6 → opalacoder-0.1.17}/config.yaml +0 -0
  20. {opalacoder-0.1.6 → opalacoder-0.1.17}/debug/scratch_tail.py +0 -0
  21. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/analysis_results.md +0 -0
  22. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/figs/logotipo.png +0 -0
  23. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/paper_memplan.md +0 -0
  24. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/skills-plugin-system.md +0 -0
  25. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/01-arquitetura.md +0 -0
  26. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/02-memgpt-orquestrador.md +0 -0
  27. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/03-skill-implement-feature.md +0 -0
  28. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/04-memoria.md +0 -0
  29. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/05-vcs-sombra.md +0 -0
  30. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/06-skills-e-plugins.md +0 -0
  31. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/07-configuracao.md +0 -0
  32. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/08-ide.md +0 -0
  33. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/09-ide-projectcreationinterface.md +0 -0
  34. {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/README.md +0 -0
  35. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/index.html +0 -0
  36. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/package-lock.json +0 -0
  37. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/package.json +0 -0
  38. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/src/index.css +0 -0
  39. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/src/main.jsx +0 -0
  40. {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/vite.config.js +0 -0
  41. {opalacoder-0.1.6 → opalacoder-0.1.17}/main.py +0 -0
  42. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/agent_stdin.py +0 -0
  43. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/agents.py +0 -0
  44. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/api_keys.py +0 -0
  45. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/archival.py +0 -0
  46. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/cli_commands.py +0 -0
  47. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/code_index.py +0 -0
  48. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/config.py +0 -0
  49. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/copy_gui.py +0 -0
  50. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/embeddings.py +0 -0
  51. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/gui/assets/index-JnX7gh-E.css +0 -0
  52. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/i18n.py +0 -0
  53. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/memgpt_runtime.py +0 -0
  54. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/orchestrator.py +0 -0
  55. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/planner.py +0 -0
  56. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/plugins/__init__.py +0 -0
  57. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/plugins/html_css_js_tools.py +0 -0
  58. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/project.py +0 -0
  59. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/session.py +0 -0
  60. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/skills.py +0 -0
  61. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/structured.py +0 -0
  62. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/terminal.py +0 -0
  63. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/terminal_manager.py +0 -0
  64. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/tools.py +0 -0
  65. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/vcs.py +0 -0
  66. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/vector_index.py +0 -0
  67. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/workflow_orchestrator.py +0 -0
  68. {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/workflow_tools.py +0 -0
  69. {opalacoder-0.1.6 → opalacoder-0.1.17}/pytest.ini +0 -0
  70. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/chat-orchestrator/SKILL.md +0 -0
  71. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/command-line/SKILL.md +0 -0
  72. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/command-line/scripts/command_executor.py +0 -0
  73. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/html-css-js/SKILL.md +0 -0
  74. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/html-css-js/scripts/check_contracts.py +0 -0
  75. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/implement-feature/SKILL.md +0 -0
  76. {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/implement-feature/scripts/run_workflow.py +0 -0
  77. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_agent_config.py +0 -0
  78. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_agent_stdin.py +0 -0
  79. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_code_index_integration.py +0 -0
  80. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_command_line_skill.py +0 -0
  81. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_complexity_evaluator.py +0 -0
  82. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_context_guard.py +0 -0
  83. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_file_delete.py +0 -0
  84. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_i18n_coverage.py +0 -0
  85. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_implement_feature_script.py +0 -0
  86. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_memgpt_runtime.py +0 -0
  87. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_model_commands.py +0 -0
  88. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_planner_oracle_live.py +0 -0
  89. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_planner_output.py +0 -0
  90. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_project_store.py +0 -0
  91. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_refinement_loop.py +0 -0
  92. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_search_bugs.py +0 -0
  93. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_skills_directory_loader.py +0 -0
  94. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_unhashable_dict_bug.py +0 -0
  95. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_verification_strategies.py +0 -0
  96. {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_workflow_pipeline.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opalacoder
3
- Version: 0.1.6
3
+ Version: 0.1.17
4
4
  Summary: Autonomous coding agent with interactive planning and modular execution
5
5
  Project-URL: Homepage, https://github.com/gilzamir/OpalaCoder
6
6
  Project-URL: Bug Tracker, https://github.com/gilzamir/OpalaCoder/issues
@@ -19,6 +19,7 @@ Requires-Dist: pyqt6>=6.0.0
19
19
  Requires-Dist: python-dotenv>=1.0.0
20
20
  Requires-Dist: pywebview>=4.0
21
21
  Requires-Dist: pyyaml>=6.0
22
+ Requires-Dist: qtpy>=2.4.0
22
23
  Requires-Dist: rich>=13.0.0
23
24
  Requires-Dist: tree-sitter-language-pack>=1.8.0
24
25
  Requires-Dist: tree-sitter>=0.25.0
@@ -58,7 +59,7 @@ OpalaCoder features an integrated desktop GUI built using React, Vite, and `pywe
58
59
  - **Integrated Terminal**: Includes a real-time xterm.js terminal with shell/PTY integration for running and inspecting commands natively.
59
60
  - **Git Source Control Sidebar**: A dedicated panel that tracks file modifications (color-coded as Modified/Untracked/Deleted) and provides a commit interface.
60
61
  - **Global Settings Panel**: Customize the editor font size, tab size, and word wrapping, with dynamic toggle support for Light and Dark themes.
61
- - **About Tab**: Version tracking (currently `0.1.6 alfa`), licensing, and developer details in the settings panel.
62
+ - **About Tab**: Version tracking (currently `0.1.17 alfa`), licensing, and developer details in the settings panel.
62
63
 
63
64
  ### 6. Persistent Projects and CLI Commands
64
65
 
@@ -157,24 +158,26 @@ OPALA_MODEL=ollama/ministral-3:14b
157
158
 
158
159
  OpalaCoder supports three main execution modes:
159
160
 
160
- ### 1. Interactive CLI REPL (Default)
161
- Starts the standard CLI terminal planner/execution loop:
161
+ ### 1. Web-Based IDE GUI (Default)
162
+ Launches the integrated React desktop application. It opens as a local app window (via `pywebview`) or falls back to your web browser:
162
163
  ```bash
163
164
  source .env/bin/activate
164
- python main.py # default (plan mode)
165
- python main.py --mode auto # run without interruptions
166
- python main.py --mode edit # confirm sensitive operations
167
- python main.py --model ollama/gemma4 # override model
168
- python main.py --db /path/to/db # custom database path
169
- python main.py --version
170
- python main.py --help
165
+ python main.py # Launches GUI by default
166
+ # or explicitly:
167
+ python main.py --gui
171
168
  ```
172
169
 
173
- ### 2. Web-Based IDE GUI
174
- Launches the integrated React desktop application. It opens as a local app window (via `pywebview`) or falls back to your web browser:
170
+ ### 2. Interactive CLI REPL
171
+ Starts the standard CLI terminal planner/execution loop:
175
172
  ```bash
176
173
  source .env/bin/activate
177
- python main.py --gui
174
+ python main.py --cli # Activates CLI REPL mode
175
+ python main.py --cli --mode auto # run without interruptions
176
+ python main.py --cli --mode edit # confirm sensitive operations
177
+ python main.py --cli --model ollama/gemma4 # override model
178
+ python main.py --db /path/to/db # custom database path
179
+ python main.py --version
180
+ python main.py --help
178
181
  ```
179
182
 
180
183
  ### 3. Stdin/Stdout JSON Protocol Server
@@ -30,7 +30,7 @@ OpalaCoder features an integrated desktop GUI built using React, Vite, and `pywe
30
30
  - **Integrated Terminal**: Includes a real-time xterm.js terminal with shell/PTY integration for running and inspecting commands natively.
31
31
  - **Git Source Control Sidebar**: A dedicated panel that tracks file modifications (color-coded as Modified/Untracked/Deleted) and provides a commit interface.
32
32
  - **Global Settings Panel**: Customize the editor font size, tab size, and word wrapping, with dynamic toggle support for Light and Dark themes.
33
- - **About Tab**: Version tracking (currently `0.1.6 alfa`), licensing, and developer details in the settings panel.
33
+ - **About Tab**: Version tracking (currently `0.1.17 alfa`), licensing, and developer details in the settings panel.
34
34
 
35
35
  ### 6. Persistent Projects and CLI Commands
36
36
 
@@ -129,24 +129,26 @@ OPALA_MODEL=ollama/ministral-3:14b
129
129
 
130
130
  OpalaCoder supports three main execution modes:
131
131
 
132
- ### 1. Interactive CLI REPL (Default)
133
- Starts the standard CLI terminal planner/execution loop:
132
+ ### 1. Web-Based IDE GUI (Default)
133
+ Launches the integrated React desktop application. It opens as a local app window (via `pywebview`) or falls back to your web browser:
134
134
  ```bash
135
135
  source .env/bin/activate
136
- python main.py # default (plan mode)
137
- python main.py --mode auto # run without interruptions
138
- python main.py --mode edit # confirm sensitive operations
139
- python main.py --model ollama/gemma4 # override model
140
- python main.py --db /path/to/db # custom database path
141
- python main.py --version
142
- python main.py --help
136
+ python main.py # Launches GUI by default
137
+ # or explicitly:
138
+ python main.py --gui
143
139
  ```
144
140
 
145
- ### 2. Web-Based IDE GUI
146
- Launches the integrated React desktop application. It opens as a local app window (via `pywebview`) or falls back to your web browser:
141
+ ### 2. Interactive CLI REPL
142
+ Starts the standard CLI terminal planner/execution loop:
147
143
  ```bash
148
144
  source .env/bin/activate
149
- python main.py --gui
145
+ python main.py --cli # Activates CLI REPL mode
146
+ python main.py --cli --mode auto # run without interruptions
147
+ python main.py --cli --mode edit # confirm sensitive operations
148
+ python main.py --cli --model ollama/gemma4 # override model
149
+ python main.py --db /path/to/db # custom database path
150
+ python main.py --version
151
+ python main.py --help
150
152
  ```
151
153
 
152
154
  ### 3. Stdin/Stdout JSON Protocol Server
@@ -77,6 +77,11 @@ export default function App() {
77
77
  const [commitMessage, setCommitMessage] = useState('');
78
78
  const [isCommitting, setIsCommitting] = useState(false);
79
79
 
80
+ // Optional Dependencies States
81
+ const [isInstallingDeps, setIsInstallingDeps] = useState(false);
82
+ const [installDepsStatus, setInstallDepsStatus] = useState('');
83
+ const [installDepsLog, setInstallDepsLog] = useState('');
84
+
80
85
 
81
86
  const terminalRef = useRef(null);
82
87
  const terminalInstanceRef = useRef(null);
@@ -400,6 +405,56 @@ export default function App() {
400
405
  }
401
406
  };
402
407
 
408
+ const handleInstallOptionalDeps = async () => {
409
+ if (isInstallingDeps) return;
410
+ setIsInstallingDeps(true);
411
+ setInstallDepsStatus('Instalando...');
412
+ setInstallDepsLog('Iniciando pip install...\n');
413
+ try {
414
+ const response = await fetch('/api/settings/install-dependencies', {
415
+ method: 'POST'
416
+ });
417
+ if (!response.ok) {
418
+ throw new Error('Falha ao iniciar instalação');
419
+ }
420
+
421
+ const reader = response.body.getReader();
422
+ const decoder = new TextDecoder('utf-8');
423
+ let buffer = '';
424
+
425
+ while (true) {
426
+ const { value, done } = await reader.read();
427
+ if (done) break;
428
+
429
+ buffer += decoder.decode(value, { stream: true });
430
+ const lines = buffer.split('\n');
431
+ buffer = lines.pop();
432
+
433
+ for (const line of lines) {
434
+ if (!line.trim()) continue;
435
+ try {
436
+ const data = JSON.parse(line.trim());
437
+ if (data.output) {
438
+ setInstallDepsLog(prev => prev + data.output);
439
+ }
440
+ if (data.status === 'success') {
441
+ setInstallDepsStatus('Instalado com Sucesso!');
442
+ } else if (data.status === 'error') {
443
+ setInstallDepsStatus('Erro na Instalação');
444
+ }
445
+ } catch (e) {
446
+ // Ignore formatting/chunk parsing errors
447
+ }
448
+ }
449
+ }
450
+ } catch (err) {
451
+ setInstallDepsStatus('Falha ao conectar');
452
+ setInstallDepsLog(prev => prev + `\nErro: ${err.message}\n`);
453
+ } finally {
454
+ setIsInstallingDeps(false);
455
+ }
456
+ };
457
+
403
458
 
404
459
  const handleSelectProject = (proj) => {
405
460
  setActiveProject(proj);
@@ -1814,12 +1869,52 @@ export default function App() {
1814
1869
  <option value="off">Desativado (Off)</option>
1815
1870
  </select>
1816
1871
  </div>
1872
+
1873
+ {/* Optional Dependencies */}
1874
+ <div className="flex flex-col" style={{ gap: '6px', borderTop: '1px solid var(--vscode-border)', paddingTop: '12px', marginTop: '6px' }}>
1875
+ <label className="vscode-sidebar-section-title" style={{ padding: 0 }}>Dependências Opcionais</label>
1876
+ <span style={{ fontSize: '11px', color: '#888888', lineHeight: '1.4' }}>
1877
+ Instale recursos extras (Local Embeddings, PyTorch, CUDA, etc.) que otimizam o processamento off-line.
1878
+ </span>
1879
+ <button
1880
+ type="button"
1881
+ className="vscode-button"
1882
+ disabled={isInstallingDeps}
1883
+ onClick={handleInstallOptionalDeps}
1884
+ style={{ width: '100%', marginTop: '6px' }}
1885
+ >
1886
+ {isInstallingDeps ? 'Instalando...' : 'Instalar Recursos Opcionais'}
1887
+ </button>
1888
+ {installDepsStatus && (
1889
+ <span style={{ fontSize: '11px', fontWeight: 'bold', color: installDepsStatus.includes('Erro') || installDepsStatus.includes('Falha') ? '#f48771' : '#73c991', marginTop: '4px' }}>
1890
+ Status: {installDepsStatus}
1891
+ </span>
1892
+ )}
1893
+ {installDepsLog && (
1894
+ <textarea
1895
+ readOnly
1896
+ value={installDepsLog}
1897
+ style={{
1898
+ width: '100%',
1899
+ height: '80px',
1900
+ marginTop: '8px',
1901
+ fontSize: '10px',
1902
+ fontFamily: 'monospace',
1903
+ background: '#151515',
1904
+ color: '#89d4a5',
1905
+ border: '1px solid var(--vscode-border)',
1906
+ padding: '6px',
1907
+ resize: 'none'
1908
+ }}
1909
+ />
1910
+ )}
1911
+ </div>
1817
1912
  </>
1818
1913
  ) : (
1819
1914
  <div style={{ display: 'flex', flexDirection: 'column', gap: '14px', color: '#cccccc' }}>
1820
1915
  <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
1821
1916
  <span className="vscode-sidebar-section-title" style={{ padding: 0 }}>Versão</span>
1822
- <span style={{ fontSize: '13px', fontWeight: 'bold', color: '#ffffff' }}>0.1.6 alfa</span>
1917
+ <span style={{ fontSize: '13px', fontWeight: 'bold', color: '#ffffff' }}>0.1.17 alfa</span>
1823
1918
  </div>
1824
1919
  <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
1825
1920
  <span className="vscode-sidebar-section-title" style={{ padding: 0 }}>Autor</span>
@@ -1,2 +1,2 @@
1
1
  """OpalaCoder – AI coding agent with session management and modular execution."""
2
- __version__ = "0.1.6"
2
+ __version__ = "0.1.17"
@@ -213,7 +213,8 @@ def build_parser() -> argparse.ArgumentParser:
213
213
  parser.add_argument("--list-projects", action="store_true", help="List all projects and exit")
214
214
  parser.add_argument("--debug", action="store_true")
215
215
  parser.add_argument("--stdin", action="store_true", help="Start agent server in stdin/stdout mode")
216
- parser.add_argument("--gui", action="store_true", help="Start agent server with React Web GUI")
216
+ parser.add_argument("--gui", action="store_true", help="Start agent server with React Web GUI (Default)")
217
+ parser.add_argument("--cli", action="store_true", help="Start in interactive CLI REPL mode")
217
218
  return parser
218
219
 
219
220
 
@@ -232,16 +233,9 @@ def main() -> None:
232
233
  start_stdin_server()
233
234
  sys.exit(0)
234
235
 
235
- if getattr(args, "gui", False):
236
- from .ide_server import start_gui_server
237
- start_gui_server(host="127.0.0.1", port=3000)
238
- sys.exit(0)
239
-
240
- T.print_banner(version=__version__, mode=args.mode)
241
-
242
236
  store = ProjectStore(db_path=args.db)
243
237
 
244
- if args.list_projects:
238
+ if getattr(args, "list_projects", False):
245
239
  projects = store.list_projects()
246
240
  if not projects:
247
241
  T.info("No projects found.")
@@ -255,7 +249,7 @@ def main() -> None:
255
249
  )
256
250
  sys.exit(0)
257
251
 
258
- if args.delete:
252
+ if getattr(args, "delete", False):
259
253
  if store.exists(args.delete):
260
254
  store.delete(args.delete)
261
255
  T.success(f"Project '{args.delete}' deleted.")
@@ -263,6 +257,14 @@ def main() -> None:
263
257
  T.error(f"Project '{args.delete}' not found.")
264
258
  sys.exit(0)
265
259
 
260
+ # Default to launching the GUI server unless --cli is explicitly passed
261
+ if not getattr(args, "cli", False):
262
+ from .ide_server import start_gui_server
263
+ start_gui_server(host="127.0.0.1", port=3000)
264
+ sys.exit(0)
265
+
266
+ T.print_banner(version=__version__, mode=args.mode)
267
+
266
268
  try:
267
269
  project = asyncio.run(startup_menu(store, args))
268
270
  asyncio.run(repl_loop(project, store, max_retries=args.max_retries))