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.
- {opalacoder-0.1.6 → opalacoder-0.1.17}/PKG-INFO +17 -14
- {opalacoder-0.1.6 → opalacoder-0.1.17}/README.md +15 -13
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/src/App.jsx +96 -1
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/__init__.py +1 -1
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/cli.py +12 -10
- opalacoder-0.1.6/opalacoder/gui/assets/index-nW4YtdWC.js → opalacoder-0.1.17/opalacoder/gui/assets/index-FS_uvdys.js +52 -48
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/gui/index.html +1 -1
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/ide_server.py +55 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/pyproject.toml +2 -1
- {opalacoder-0.1.6 → opalacoder-0.1.17}/requirements.txt +1 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/.claude/rules/RULES.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/.claude/settings.json +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/.github/workflows/publish.yml +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/.gitignore +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/AGENTS.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/CLAUDE.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/GEMINI.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/agents.yaml +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/config.yaml +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/debug/scratch_tail.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/analysis_results.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/figs/logotipo.png +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/paper_memplan.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/guide/skills-plugin-system.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/01-arquitetura.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/02-memgpt-orquestrador.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/03-skill-implement-feature.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/04-memoria.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/05-vcs-sombra.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/06-skills-e-plugins.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/07-configuracao.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/08-ide.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/09-ide-projectcreationinterface.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/docs/specs/README.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/index.html +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/package-lock.json +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/package.json +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/src/index.css +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/src/main.jsx +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/gui_src/vite.config.js +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/main.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/agent_stdin.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/agents.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/api_keys.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/archival.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/cli_commands.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/code_index.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/config.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/copy_gui.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/embeddings.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/gui/assets/index-JnX7gh-E.css +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/i18n.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/memgpt_runtime.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/orchestrator.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/planner.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/plugins/__init__.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/plugins/html_css_js_tools.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/project.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/session.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/skills.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/structured.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/terminal.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/terminal_manager.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/tools.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/vcs.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/vector_index.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/workflow_orchestrator.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/opalacoder/workflow_tools.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/pytest.ini +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/chat-orchestrator/SKILL.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/command-line/SKILL.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/command-line/scripts/command_executor.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/html-css-js/SKILL.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/html-css-js/scripts/check_contracts.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/implement-feature/SKILL.md +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/skills/skills_store/implement-feature/scripts/run_workflow.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_agent_config.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_agent_stdin.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_code_index_integration.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_command_line_skill.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_complexity_evaluator.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_context_guard.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_file_delete.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_i18n_coverage.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_implement_feature_script.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_memgpt_runtime.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_model_commands.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_planner_oracle_live.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_planner_output.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_project_store.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_refinement_loop.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_search_bugs.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_skills_directory_loader.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_unhashable_dict_bug.py +0 -0
- {opalacoder-0.1.6 → opalacoder-0.1.17}/tests/test_verification_strategies.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
161
|
-
|
|
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 #
|
|
165
|
-
|
|
166
|
-
python main.py --
|
|
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.
|
|
174
|
-
|
|
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 --
|
|
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.
|
|
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.
|
|
133
|
-
|
|
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 #
|
|
137
|
-
|
|
138
|
-
python main.py --
|
|
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.
|
|
146
|
-
|
|
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 --
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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))
|