markdown-os 0.7.2__tar.gz → 0.7.3__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 (58) hide show
  1. {markdown_os-0.7.2 → markdown_os-0.7.3}/PKG-INFO +1 -1
  2. markdown_os-0.7.3/markdown_os.spec +149 -0
  3. {markdown_os-0.7.2 → markdown_os-0.7.3}/pyproject.toml +1 -1
  4. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_desktop.py +12 -0
  5. markdown_os-0.7.2/markdown_os.spec +0 -113
  6. {markdown_os-0.7.2 → markdown_os-0.7.3}/.github/workflows/desktop-release.yml +0 -0
  7. {markdown_os-0.7.2 → markdown_os-0.7.3}/.github/workflows/publish.yml +0 -0
  8. {markdown_os-0.7.2 → markdown_os-0.7.3}/.gitignore +0 -0
  9. {markdown_os-0.7.2 → markdown_os-0.7.3}/.python-version +0 -0
  10. {markdown_os-0.7.2 → markdown_os-0.7.3}/AGENTS.md +0 -0
  11. {markdown_os-0.7.2 → markdown_os-0.7.3}/CLAUDE.md +0 -0
  12. {markdown_os-0.7.2 → markdown_os-0.7.3}/LICENSE +0 -0
  13. {markdown_os-0.7.2 → markdown_os-0.7.3}/README.md +0 -0
  14. {markdown_os-0.7.2 → markdown_os-0.7.3}/docs/plans/feature-001-pdf-export.md +0 -0
  15. {markdown_os-0.7.2 → markdown_os-0.7.3}/docs/plans/feature-002-file-operations.md +0 -0
  16. {markdown_os-0.7.2 → markdown_os-0.7.3}/docs/plans/feature-003-focus-mode.md +0 -0
  17. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/__init__.py +0 -0
  18. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/cli.py +0 -0
  19. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/desktop.py +0 -0
  20. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/directory_handler.py +0 -0
  21. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/file_handler.py +0 -0
  22. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/server.py +0 -0
  23. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/css/styles.css +0 -0
  24. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/css/themes.css +0 -0
  25. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/favicon.svg +0 -0
  26. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/index.html +0 -0
  27. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/dialogs.js +0 -0
  28. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/editor.js +0 -0
  29. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/file-tree.js +0 -0
  30. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/focus-mode.js +0 -0
  31. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/pdf-export.js +0 -0
  32. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/search.js +0 -0
  33. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/shared-utils.js +0 -0
  34. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/tabs.js +0 -0
  35. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/theme.js +0 -0
  36. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/toc.js +0 -0
  37. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/websocket.js +0 -0
  38. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/wysiwyg-toolbar.js +0 -0
  39. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/wysiwyg.js +0 -0
  40. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/welcome.html +0 -0
  41. {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/templates/example_template.md +0 -0
  42. {markdown_os-0.7.2 → markdown_os-0.7.3}/scripts/build_desktop.py +0 -0
  43. {markdown_os-0.7.2 → markdown_os-0.7.3}/scripts/download_vendor.py +0 -0
  44. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/demo-frame.html +0 -0
  45. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/downloads.html +0 -0
  46. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/favicon.svg +0 -0
  47. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/images/hero-screenshot.png +0 -0
  48. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/index.html +0 -0
  49. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/styles.css +0 -0
  50. {markdown_os-0.7.2 → markdown_os-0.7.3}/site/themes.css +0 -0
  51. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_cli.py +0 -0
  52. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_directory_handler.py +0 -0
  53. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_file_handler.py +0 -0
  54. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_frontend_navigation_sync.py +0 -0
  55. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_server.py +0 -0
  56. {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_version.py +0 -0
  57. {markdown_os-0.7.2 → markdown_os-0.7.3}/uv.lock +0 -0
  58. {markdown_os-0.7.2 → markdown_os-0.7.3}/vercel.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: markdown-os
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: Developer-focused markdown editor served from a local CLI.
5
5
  Project-URL: Homepage, https://github.com/elena-cabrera/markdown-os
6
6
  Project-URL: Repository, https://github.com/elena-cabrera/markdown-os
@@ -0,0 +1,149 @@
1
+ # -*- mode: python ; coding: utf-8 -*-
2
+ """PyInstaller spec for building Markdown-OS desktop application.
3
+
4
+ Usage:
5
+ # First download vendor assets
6
+ python scripts/download_vendor.py
7
+
8
+ # Then build
9
+ pyinstaller markdown_os.spec
10
+ """
11
+
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs
16
+
17
+ block_cipher = None
18
+
19
+ # Paths
20
+ ROOT = Path(SPECPATH)
21
+ PACKAGE_DIR = ROOT / "markdown_os"
22
+ STATIC_DIR = PACKAGE_DIR / "static"
23
+ TEMPLATES_DIR = PACKAGE_DIR / "templates"
24
+
25
+ hiddenimports = [
26
+ "markdown_os",
27
+ "markdown_os.cli",
28
+ "markdown_os.server",
29
+ "markdown_os.file_handler",
30
+ "markdown_os.directory_handler",
31
+ "fastapi",
32
+ "uvicorn",
33
+ "uvicorn.logging",
34
+ "uvicorn.loops",
35
+ "uvicorn.loops.auto",
36
+ "uvicorn.protocols",
37
+ "uvicorn.protocols.http",
38
+ "uvicorn.protocols.http.auto",
39
+ "uvicorn.protocols.websockets",
40
+ "uvicorn.protocols.websockets.auto",
41
+ "uvicorn.lifespan",
42
+ "uvicorn.lifespan.on",
43
+ "watchdog",
44
+ "watchdog.observers",
45
+ "portalocker",
46
+ "webview",
47
+ "pydantic",
48
+ ]
49
+
50
+ binaries = []
51
+ datas = [
52
+ (str(STATIC_DIR), "markdown_os/static"),
53
+ (str(TEMPLATES_DIR), "markdown_os/templates"),
54
+ ]
55
+ upx_enabled = True
56
+ upx_exclude = []
57
+
58
+ if sys.platform == "win32":
59
+ # pywebview's Windows backend imports pythonnet/clr_loader dynamically and
60
+ # ships extra .NET / WebView2 DLLs that need to be collected explicitly.
61
+ hiddenimports += [
62
+ "clr",
63
+ "pythonnet",
64
+ "clr_loader",
65
+ "webview.platforms.winforms",
66
+ ]
67
+ binaries += collect_dynamic_libs("pythonnet")
68
+ binaries += collect_dynamic_libs("clr_loader")
69
+ binaries += collect_dynamic_libs("webview")
70
+ datas += collect_data_files("pythonnet", include_py_files=False)
71
+ datas += collect_data_files("clr_loader", include_py_files=False)
72
+ datas += collect_data_files("webview", include_py_files=False)
73
+
74
+ # UPX can corrupt pythonnet / WebView2 managed assemblies in the frozen
75
+ # Windows app, which then triggers runtime loader failures.
76
+ upx_enabled = False
77
+ upx_exclude = [
78
+ "Python.Runtime.dll",
79
+ "Microsoft.Web.WebView2.Core.dll",
80
+ "Microsoft.Web.WebView2.WinForms.dll",
81
+ "WebBrowserInterop.x64.dll",
82
+ "WebBrowserInterop.x86.dll",
83
+ ]
84
+
85
+ a = Analysis(
86
+ [str(PACKAGE_DIR / "desktop.py")],
87
+ pathex=[str(ROOT)],
88
+ binaries=binaries,
89
+ datas=datas,
90
+ hiddenimports=hiddenimports,
91
+ hookspath=[],
92
+ hooksconfig={},
93
+ runtime_hooks=[],
94
+ excludes=[],
95
+ win_no_prefer_redirects=False,
96
+ win_private_assemblies=False,
97
+ cipher=block_cipher,
98
+ noarchive=False,
99
+ )
100
+
101
+ pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
102
+
103
+ exe = EXE(
104
+ pyz,
105
+ a.scripts,
106
+ [],
107
+ exclude_binaries=True,
108
+ name="Markdown-OS",
109
+ debug=False,
110
+ bootloader_ignore_signals=False,
111
+ strip=False,
112
+ upx=upx_enabled,
113
+ console=False,
114
+ icon=None, # Set to .ico (Windows) or .icns (macOS) path when available
115
+ )
116
+
117
+ coll = COLLECT(
118
+ exe,
119
+ a.binaries,
120
+ a.zipfiles,
121
+ a.datas,
122
+ strip=False,
123
+ upx=upx_enabled,
124
+ upx_exclude=upx_exclude,
125
+ name="Markdown-OS",
126
+ )
127
+
128
+ # macOS app bundle
129
+ if sys.platform == "darwin":
130
+ app = BUNDLE(
131
+ coll,
132
+ name="Markdown-OS.app",
133
+ icon=None, # Set to .icns path when available
134
+ bundle_identifier="com.markdown-os.app",
135
+ info_plist={
136
+ "CFBundleName": "Markdown-OS",
137
+ "CFBundleDisplayName": "Markdown-OS",
138
+ "CFBundleShortVersionString": "0.5.0",
139
+ "CFBundleVersion": "0.5.0",
140
+ "NSHighResolutionCapable": True,
141
+ "CFBundleDocumentTypes": [
142
+ {
143
+ "CFBundleTypeName": "Markdown Document",
144
+ "CFBundleTypeExtensions": ["md", "markdown"],
145
+ "CFBundleTypeRole": "Editor",
146
+ }
147
+ ],
148
+ },
149
+ )
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "markdown-os"
3
- version = "0.7.2"
3
+ version = "0.7.3"
4
4
  description = "Developer-focused markdown editor served from a local CLI."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -220,3 +220,15 @@ def test_desktop_api_open_path_empty_folder(tmp_path: Path) -> None:
220
220
  result = api.open_path(str(tmp_path))
221
221
  assert "error" in result
222
222
  assert "no markdown" in result["error"].lower()
223
+
224
+
225
+ def test_windows_desktop_spec_collects_pythonnet_runtime() -> None:
226
+ """Windows PyInstaller spec includes pythonnet/webview runtime assets."""
227
+ spec_text = Path("markdown_os.spec").read_text(encoding="utf-8")
228
+
229
+ assert 'collect_dynamic_libs("pythonnet")' in spec_text
230
+ assert 'collect_data_files("pythonnet", include_py_files=False)' in spec_text
231
+ assert '"clr"' in spec_text
232
+ assert '"webview.platforms.winforms"' in spec_text
233
+ assert 'upx_enabled = False' in spec_text
234
+ assert '"Python.Runtime.dll"' in spec_text
@@ -1,113 +0,0 @@
1
- # -*- mode: python ; coding: utf-8 -*-
2
- """PyInstaller spec for building Markdown-OS desktop application.
3
-
4
- Usage:
5
- # First download vendor assets
6
- python scripts/download_vendor.py
7
-
8
- # Then build
9
- pyinstaller markdown_os.spec
10
- """
11
-
12
- import sys
13
- from pathlib import Path
14
-
15
- block_cipher = None
16
-
17
- # Paths
18
- ROOT = Path(SPECPATH)
19
- PACKAGE_DIR = ROOT / "markdown_os"
20
- STATIC_DIR = PACKAGE_DIR / "static"
21
- TEMPLATES_DIR = PACKAGE_DIR / "templates"
22
-
23
- a = Analysis(
24
- [str(PACKAGE_DIR / "desktop.py")],
25
- pathex=[str(ROOT)],
26
- binaries=[],
27
- datas=[
28
- (str(STATIC_DIR), "markdown_os/static"),
29
- (str(TEMPLATES_DIR), "markdown_os/templates"),
30
- ],
31
- hiddenimports=[
32
- "markdown_os",
33
- "markdown_os.cli",
34
- "markdown_os.server",
35
- "markdown_os.file_handler",
36
- "markdown_os.directory_handler",
37
- "fastapi",
38
- "uvicorn",
39
- "uvicorn.logging",
40
- "uvicorn.loops",
41
- "uvicorn.loops.auto",
42
- "uvicorn.protocols",
43
- "uvicorn.protocols.http",
44
- "uvicorn.protocols.http.auto",
45
- "uvicorn.protocols.websockets",
46
- "uvicorn.protocols.websockets.auto",
47
- "uvicorn.lifespan",
48
- "uvicorn.lifespan.on",
49
- "watchdog",
50
- "watchdog.observers",
51
- "portalocker",
52
- "webview",
53
- "pydantic",
54
- ],
55
- hookspath=[],
56
- hooksconfig={},
57
- runtime_hooks=[],
58
- excludes=[],
59
- win_no_prefer_redirects=False,
60
- win_private_assemblies=False,
61
- cipher=block_cipher,
62
- noarchive=False,
63
- )
64
-
65
- pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
66
-
67
- exe = EXE(
68
- pyz,
69
- a.scripts,
70
- [],
71
- exclude_binaries=True,
72
- name="Markdown-OS",
73
- debug=False,
74
- bootloader_ignore_signals=False,
75
- strip=False,
76
- upx=True,
77
- console=False,
78
- icon=None, # Set to .ico (Windows) or .icns (macOS) path when available
79
- )
80
-
81
- coll = COLLECT(
82
- exe,
83
- a.binaries,
84
- a.zipfiles,
85
- a.datas,
86
- strip=False,
87
- upx=True,
88
- upx_exclude=[],
89
- name="Markdown-OS",
90
- )
91
-
92
- # macOS app bundle
93
- if sys.platform == "darwin":
94
- app = BUNDLE(
95
- coll,
96
- name="Markdown-OS.app",
97
- icon=None, # Set to .icns path when available
98
- bundle_identifier="com.markdown-os.app",
99
- info_plist={
100
- "CFBundleName": "Markdown-OS",
101
- "CFBundleDisplayName": "Markdown-OS",
102
- "CFBundleShortVersionString": "0.5.0",
103
- "CFBundleVersion": "0.5.0",
104
- "NSHighResolutionCapable": True,
105
- "CFBundleDocumentTypes": [
106
- {
107
- "CFBundleTypeName": "Markdown Document",
108
- "CFBundleTypeExtensions": ["md", "markdown"],
109
- "CFBundleTypeRole": "Editor",
110
- }
111
- ],
112
- },
113
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes