Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) by argszero · Pull Request #916 · argszero/emrg · GitHub
Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) by argszero · Pull Request #916 · argszero/emrg · GitHub
Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) by argszero · Pull Request #916 · argszero/emrg · GitHub
Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) by argszero · Pull Request #916 · argszero/emrg · GitHub
Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) by argszero · Pull Request #916 · argszero/emrg · GitHub
Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) by argszero · Pull Request #916 · argszero/emrg · GitHub
Skip to content

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34) - #916

Merged
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python
Aug 21, 2026
Merged

emrg: restart-to-apply — install runtime python + PYTHONPATH in packaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34)#916
argszero merged 1 commit into
masterfrom
feature/restart-packaged-python

Conversation

@argszero

Copy link
Copy Markdown
Owner

Restart-to-apply: use the install runtime python + PYTHONPATH in packaged mode

Follow-up to #915 (rant 2026-08-21T12:44:34, GUI "Restart to apply" button).

Bug found during review

The restart flow spawned python -m emrg._stop_all --skip-gui using
_findPython(), which in packaged mode resolves to the host's PATH
python3 — that interpreter has no emrg package importable (the packaged
app's emrg lives in ~/.emrg/install/{source,lib}), so the full-chain stop
would fail with No module named emrg and the relaunch would never happen.

Fix

  • emrg/gui/daemon_client.js: _findInstalledPython() resolves the
    install runtime python exactly like the bin/emrgd launcher
    (bin/python on POSIX; bin/python-dist/python*.exe on Windows, with the
    R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent
    PYTHONPATH="$PREFIX/source:$PREFIX/lib".
  • emrg/gui/main.jsemrg:restartDaemon: in packaged mode spawn the
    install python with PYTHONPATH injected; source mode keeps the repo
    venv python. windowsHide added for the Windows black-window case.
  • emrg/__main__.py: emrg stop gains --skip-gui_stop_all(skip_gui=...),
    so the GUI could also drive the CLI directly (same semantics as
    python -m emrg._stop_all --skip-gui).

Tests / verification

  • tests/test_main.py: +1 — emrg stop --skip-gui parses skip_gui=True.
  • tests/test_installer_stop.py: delegation test updated for the new
    sys.exit(_stop_all(skip_gui=...)) dispatch + --skip-gui flag.
  • renderer.smoke.test.js: restart test extended — asserts
    _findInstalledPython() / _installedPythonPath() are used and present
    in both main.js and daemon_client.js.
  • Local: Python pytest 994 passed + 1 skipped (995 collected, Agent.md
    synced), GUI npm test 257 (249 pass + 8 skipped), node --check on
    main.js + daemon_client.js OK, emrg stop --help shows --skip-gui,
    import + CLI OK.

…ackaged mode; emrg stop --skip-gui (rant 2026-08-21T12:44:34 follow-up)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

Fresh review of the packaged-mode restart fix (rant 2026-08-21T12:44:34 follow-up):

  • Root cause confirmed: _findPython() in packaged mode falls through to PATH python3, which has no emrg importable — python3 -m emrg._stop_all would fail and the relaunch never happen.
  • daemon_client.js: _findInstalledPython() mirrors the bin/emrgd launcher's python resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat); _installedPythonPath() = install/source:install/lib, matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide; source mode unchanged (repo venv).
  • emrg/__main__.py: emrg stop --skip-gui_stop_all(skip_gui=...) — CLI parity with the module path.
  • Tests: +1 CLI parse test, installer delegation test updated, GUI source-level test extended (asserts both helpers present + used). Full local suite green: pytest 994 passed + 1 skipped (995 collected, Agent.md synced), GUI 257 (249+8), node --check OK, emrg stop --help shows --skip-gui, import + CLI OK.

1/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

2nd review (head e0350da, CI test + test-windows PASS on run 32453323985):

  • Fresh local verification on this branch: Python pytest 994 passed + 1 skipped (995 collected, matches Agent.md), GUI npm test 257 (249 pass + 8 skipped), node --check on main.js + daemon_client.js OK, import + CLI OK, emrg stop --help exposes --skip-gui.
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (POSIX bin/python; Windows python-dist\python*.exe with R100 DLL caveat + python.exe fallback); _installedPythonPath() = install/source:install/lib matching the launcher's PYTHONPATH.
  • main.js: packaged mode spawns install python with PYTHONPATH injected + windowsHide on win32; source mode unchanged (repo venv). emrg/__main__.py wires emrg stop --skip-gui_stop_all(skip_gui=...).
  • Tests cover the new paths (CLI parse + installer delegation + GUI source-level). No issues found.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle

3rd consecutive review (head e0350da, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 994 passed + 1 skipped (995 collected, matches Agent.md), emrg stop --help shows --skip-gui, import + CLI OK, GUI npm test 257 (249 pass / 0 fail / 8 skipped).
  • _findInstalledPython() mirrors the bin/emrgd launcher resolution (bin/python on POSIX; python-dist/python*.exe on Windows with the R100 DLL caveat); _installedPythonPath() returns the launcher-equivalent PYTHONPATH (source:lib). restartDaemon uses the install python + PYTHONPATH in packaged mode, repo venv in source mode; windowsHide added.
  • emrg stop --skip-gui → _stop_all(skip_gui=...) keeps the GUI alive to relaunch itself — correct restart-to-apply semantics (rant 12:44:34 follow-up).
  • Tests cover the new flag parsing, the installer-stop delegation, and the packaged-python presence in main.js/daemon_client.js.

3/3.

@argszero
argszero merged commit 2ad350d into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/restart-packaged-python branch August 23, 2026 02:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@argszero