openbase-coder 0.1.2__tar.gz → 0.1.4__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 (116) hide show
  1. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/PKG-INFO +33 -21
  2. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/README.md +32 -20
  3. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/_version.py +2 -2
  4. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/node.py +33 -1
  5. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/setup.py +79 -1
  6. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/asgi.py +4 -4
  7. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/authentication.py +2 -1
  8. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/livekit.py +13 -14
  9. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/apps.py +0 -2
  10. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/middleware.py +1 -0
  11. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/serializers.py +0 -1
  12. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/boilersync.py +0 -1
  13. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/installation.py +0 -1
  14. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/.gitignore +0 -0
  15. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/LICENSE +0 -0
  16. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/__init__.py +0 -0
  17. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/__main__.py +0 -0
  18. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cartesia_voice_catalog.py +0 -0
  19. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/__init__.py +0 -0
  20. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/auth.py +0 -0
  21. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/boilersync.py +0 -0
  22. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/bootstrap.py +0 -0
  23. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/claude_chrome.py +0 -0
  24. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/codex_sync.py +0 -0
  25. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/computer_use.py +0 -0
  26. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/doctor.py +0 -0
  27. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/local_server.py +0 -0
  28. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/plugins.py +0 -0
  29. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/restart.py +0 -0
  30. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/routines.py +0 -0
  31. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/server.py +0 -0
  32. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/services.py +0 -0
  33. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/super_agent_name.py +0 -0
  34. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/user.py +0 -0
  35. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli/utils.py +0 -0
  36. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/cli_helpers.py +0 -0
  37. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/__init__.py +0 -0
  38. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/jwt_validation.py +0 -0
  39. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/proxy.py +0 -0
  40. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/serializers.py +0 -0
  41. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/settings.py +0 -0
  42. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/token_manager.py +0 -0
  43. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/urls.py +0 -0
  44. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/viewsets.py +0 -0
  45. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/config/wsgi.py +0 -0
  46. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/dispatcher_config.py +0 -0
  47. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/entrypoint/manage.py +0 -0
  48. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/errors.py +0 -0
  49. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/__init__.py +0 -0
  50. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/codex_app_client.py +0 -0
  51. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/codex_thread_state.py +0 -0
  52. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/codex_transport.py +0 -0
  53. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/codex_turns.py +0 -0
  54. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/speech_formatter.py +0 -0
  55. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_agent/speech_replacements.py +0 -0
  56. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_announcer.py +0 -0
  57. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_start_announcer.py +0 -0
  58. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_voice_history.py +0 -0
  59. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/livekit_voice_route.py +0 -0
  60. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/logging.py +0 -0
  61. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/__init__.py +0 -0
  62. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/apps.py +0 -0
  63. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/mcp.py +0 -0
  64. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/models.py +0 -0
  65. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/projects.py +0 -0
  66. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/session_manager.py +0 -0
  67. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/mcp/thread_import.py +0 -0
  68. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/multi_config.py +0 -0
  69. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/__init__.py +0 -0
  70. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/agents_md.py +0 -0
  71. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/approvals.py +0 -0
  72. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/auth.py +0 -0
  73. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/brain_readiness.py +0 -0
  74. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/common.py +0 -0
  75. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/consumers.py +0 -0
  76. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/diagnostics.py +0 -0
  77. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/livekit.py +0 -0
  78. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/migrations/0001_initial.py +0 -0
  79. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/migrations/0002_remove_cron_models.py +0 -0
  80. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/migrations/__init__.py +0 -0
  81. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/models.py +0 -0
  82. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/plugins_tools.py +0 -0
  83. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/projects.py +0 -0
  84. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/reports.py +0 -0
  85. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/routines.py +0 -0
  86. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/routing.py +0 -0
  87. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/services_views.py +0 -0
  88. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/skills.py +0 -0
  89. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/thread_cache.py +0 -0
  90. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/thread_metadata.py +0 -0
  91. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/threads.py +0 -0
  92. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/urls.py +0 -0
  93. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/openbase_coder_cli_app/views.py +0 -0
  94. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/paths.py +0 -0
  95. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/__init__.py +0 -0
  96. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/api.py +0 -0
  97. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/console.py +0 -0
  98. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/install.py +0 -0
  99. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/manager.py +0 -0
  100. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/models.py +0 -0
  101. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/skills.py +0 -0
  102. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/sources.py +0 -0
  103. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/spec.py +0 -0
  104. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/plugins/store.py +0 -0
  105. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/__init__.py +0 -0
  106. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/console_settings.py +0 -0
  107. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/definitions.py +0 -0
  108. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/launchctl_tools.py +0 -0
  109. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/launchd.py +0 -0
  110. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/openbase_services.py +0 -0
  111. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/registry.py +0 -0
  112. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/restart.py +0 -0
  113. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/tailnet_devices.py +1 -1
  114. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/uv_tools.py +0 -0
  115. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/openbase_coder_cli/services/voice_warning.py +0 -0
  116. {openbase_coder-0.1.2 → openbase_coder-0.1.4}/pyproject.toml +2 -2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openbase-coder
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: OpenBase Coder CLI with embedded server
5
5
  Project-URL: Repository, https://github.com/openbase-community/openbase-coder
6
6
  Project-URL: Issues, https://github.com/openbase-community/openbase-coder/issues
@@ -87,25 +87,35 @@ runtime.
87
87
  - macOS for full setup and launchd service management
88
88
  - Python 3.13+
89
89
  - Git
90
- - `uv` recommended for install and local development
90
+ - `uv` for the recommended install/setup flow and local development
91
91
  - Node package tooling for the bundled console build
92
92
  - `livekit-server` on `PATH` for voice services
93
93
 
94
- ## Install
94
+ ## Quick Start
95
95
 
96
- With `uv`:
96
+ Recommended one-line setup with `uvx`:
97
97
 
98
98
  ```bash
99
- uv tool install openbase-coder
99
+ uvx --python 3.13 openbase-coder setup
100
100
  ```
101
101
 
102
- With `pipx`:
102
+ This runs the latest published `openbase-coder` package in an isolated `uv`
103
+ tool environment and starts the normal first-time setup flow.
104
+
105
+ For a persistent command on your `PATH` after setup, install with `uv tool`:
106
+
107
+ ```bash
108
+ uv tool install --python 3.13 openbase-coder
109
+ openbase-coder setup
110
+ ```
111
+
112
+ `pipx` is also supported when you already manage Python tools that way:
103
113
 
104
114
  ```bash
105
- pipx install openbase-coder
115
+ pipx install --python python3.13 openbase-coder
106
116
  ```
107
117
 
108
- Verify the install:
118
+ Verify a persistent install:
109
119
 
110
120
  ```bash
111
121
  openbase-coder --version
@@ -113,7 +123,7 @@ openbase-coder --version
113
123
 
114
124
  ## First-Time Setup
115
125
 
116
- Run:
126
+ If you already installed the persistent `openbase-coder` command, run:
117
127
 
118
128
  ```bash
119
129
  openbase-coder setup
@@ -127,8 +137,8 @@ used by voice sessions.
127
137
  After setup, check the local runtime:
128
138
 
129
139
  ```bash
130
- openbase-coder doctor
131
- openbase-coder services status
140
+ uvx --python 3.13 openbase-coder doctor
141
+ uvx --python 3.13 openbase-coder services status
132
142
  ```
133
143
 
134
144
  ## Run The Server
@@ -136,28 +146,30 @@ openbase-coder services status
136
146
  For foreground development:
137
147
 
138
148
  ```bash
139
- openbase-coder server --host 0.0.0.0 --port 7999
149
+ uvx --python 3.13 openbase-coder server --host 0.0.0.0 --port 7999
140
150
  ```
141
151
 
142
152
  For normal macOS background operation:
143
153
 
144
154
  ```bash
145
- openbase-coder services start
146
- openbase-coder services status
155
+ uvx --python 3.13 openbase-coder services start
156
+ uvx --python 3.13 openbase-coder services status
147
157
  ```
148
158
 
149
159
  ## Common Commands
150
160
 
151
161
  ```bash
152
- openbase-coder setup
153
- openbase-coder doctor
154
- openbase-coder login
155
- openbase-coder services status
156
- openbase-coder services logs django-cli
157
- openbase-coder plugins list
158
- openbase-coder bootstrap --help
162
+ uvx --python 3.13 openbase-coder setup
163
+ uvx --python 3.13 openbase-coder doctor
164
+ uvx --python 3.13 openbase-coder login
165
+ uvx --python 3.13 openbase-coder services status
166
+ uvx --python 3.13 openbase-coder services logs django-cli
167
+ uvx --python 3.13 openbase-coder plugins list
168
+ uvx --python 3.13 openbase-coder bootstrap --help
159
169
  ```
160
170
 
171
+ If you installed with `uv tool`, omit `uvx --python 3.13` from those commands.
172
+
161
173
  ## Documentation
162
174
 
163
175
  - [Getting Started](docs/getting-started.md)
@@ -27,25 +27,35 @@ runtime.
27
27
  - macOS for full setup and launchd service management
28
28
  - Python 3.13+
29
29
  - Git
30
- - `uv` recommended for install and local development
30
+ - `uv` for the recommended install/setup flow and local development
31
31
  - Node package tooling for the bundled console build
32
32
  - `livekit-server` on `PATH` for voice services
33
33
 
34
- ## Install
34
+ ## Quick Start
35
35
 
36
- With `uv`:
36
+ Recommended one-line setup with `uvx`:
37
37
 
38
38
  ```bash
39
- uv tool install openbase-coder
39
+ uvx --python 3.13 openbase-coder setup
40
40
  ```
41
41
 
42
- With `pipx`:
42
+ This runs the latest published `openbase-coder` package in an isolated `uv`
43
+ tool environment and starts the normal first-time setup flow.
44
+
45
+ For a persistent command on your `PATH` after setup, install with `uv tool`:
46
+
47
+ ```bash
48
+ uv tool install --python 3.13 openbase-coder
49
+ openbase-coder setup
50
+ ```
51
+
52
+ `pipx` is also supported when you already manage Python tools that way:
43
53
 
44
54
  ```bash
45
- pipx install openbase-coder
55
+ pipx install --python python3.13 openbase-coder
46
56
  ```
47
57
 
48
- Verify the install:
58
+ Verify a persistent install:
49
59
 
50
60
  ```bash
51
61
  openbase-coder --version
@@ -53,7 +63,7 @@ openbase-coder --version
53
63
 
54
64
  ## First-Time Setup
55
65
 
56
- Run:
66
+ If you already installed the persistent `openbase-coder` command, run:
57
67
 
58
68
  ```bash
59
69
  openbase-coder setup
@@ -67,8 +77,8 @@ used by voice sessions.
67
77
  After setup, check the local runtime:
68
78
 
69
79
  ```bash
70
- openbase-coder doctor
71
- openbase-coder services status
80
+ uvx --python 3.13 openbase-coder doctor
81
+ uvx --python 3.13 openbase-coder services status
72
82
  ```
73
83
 
74
84
  ## Run The Server
@@ -76,28 +86,30 @@ openbase-coder services status
76
86
  For foreground development:
77
87
 
78
88
  ```bash
79
- openbase-coder server --host 0.0.0.0 --port 7999
89
+ uvx --python 3.13 openbase-coder server --host 0.0.0.0 --port 7999
80
90
  ```
81
91
 
82
92
  For normal macOS background operation:
83
93
 
84
94
  ```bash
85
- openbase-coder services start
86
- openbase-coder services status
95
+ uvx --python 3.13 openbase-coder services start
96
+ uvx --python 3.13 openbase-coder services status
87
97
  ```
88
98
 
89
99
  ## Common Commands
90
100
 
91
101
  ```bash
92
- openbase-coder setup
93
- openbase-coder doctor
94
- openbase-coder login
95
- openbase-coder services status
96
- openbase-coder services logs django-cli
97
- openbase-coder plugins list
98
- openbase-coder bootstrap --help
102
+ uvx --python 3.13 openbase-coder setup
103
+ uvx --python 3.13 openbase-coder doctor
104
+ uvx --python 3.13 openbase-coder login
105
+ uvx --python 3.13 openbase-coder services status
106
+ uvx --python 3.13 openbase-coder services logs django-cli
107
+ uvx --python 3.13 openbase-coder plugins list
108
+ uvx --python 3.13 openbase-coder bootstrap --help
99
109
  ```
100
110
 
111
+ If you installed with `uv tool`, omit `uvx --python 3.13` from those commands.
112
+
101
113
  ## Documentation
102
114
 
103
115
  - [Getting Started](docs/getting-started.md)
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.2'
22
- __version_tuple__ = version_tuple = (0, 1, 2)
21
+ __version__ = version = '0.1.4'
22
+ __version_tuple__ = version_tuple = (0, 1, 4)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -16,9 +16,15 @@ def run_workspace_package_command(workspace_dir: Path, package_dir: Path, *args:
16
16
  return False
17
17
 
18
18
  executable, command_prefix = package_manager
19
+ command_args = _normalize_package_manager_args(
20
+ executable,
21
+ workspace_dir,
22
+ args,
23
+ )
19
24
  subprocess.run(
20
- [executable, *command_prefix, *args],
25
+ [executable, *command_prefix, *command_args],
21
26
  cwd=str(package_dir),
27
+ env=_package_manager_env(executable, command_args),
22
28
  check=True,
23
29
  )
24
30
  return True
@@ -81,3 +87,29 @@ def _which_node_binary(name: str) -> str | None:
81
87
  return str(candidate)
82
88
 
83
89
  return None
90
+
91
+
92
+ def _normalize_package_manager_args(
93
+ executable: str,
94
+ workspace_dir: Path,
95
+ args: tuple[str, ...],
96
+ ) -> tuple[str, ...]:
97
+ """Avoid mutating or validating partial install-set lockfiles with pnpm."""
98
+ if (
99
+ Path(executable).name == "pnpm"
100
+ and args == ("install",)
101
+ and (workspace_dir / "pnpm-lock.yaml").is_file()
102
+ ):
103
+ return ("install", "--no-lockfile", "--shamefully-hoist")
104
+
105
+ return args
106
+
107
+
108
+ def _package_manager_env(
109
+ executable: str,
110
+ args: tuple[str, ...],
111
+ ) -> dict[str, str] | None:
112
+ if Path(executable).name == "pnpm" and args and args[0] == "install":
113
+ return {**os.environ, "CI": "true"}
114
+
115
+ return None
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  import platform
4
5
  import secrets
5
6
  import shlex
@@ -141,8 +142,10 @@ def _clone_workspace(workspace_dir: str) -> None:
141
142
  ws = Path(workspace_dir)
142
143
  if ws.exists() and (ws / ".git").is_dir():
143
144
  click.echo(f"Workspace already exists at {ws}, pulling latest...")
144
- subprocess.run(["git", "-C", str(ws), "pull", "--ff-only"], check=True)
145
+ _update_existing_workspace(ws)
146
+ _remove_managed_repo_symlinks(ws)
145
147
  _multi_sync(ws)
148
+ _update_install_set_repos(ws)
146
149
  return
147
150
 
148
151
  click.echo(f"Cloning workspace to {ws}...")
@@ -151,6 +154,81 @@ def _clone_workspace(workspace_dir: str) -> None:
151
154
  check=True,
152
155
  )
153
156
  _multi_sync(ws)
157
+ _update_install_set_repos(ws)
158
+
159
+
160
+ def _update_existing_workspace(ws: Path) -> None:
161
+ if ws.resolve() == DEFAULT_WORKSPACE_DIR.resolve():
162
+ dirty = subprocess.run(
163
+ ["git", "-C", str(ws), "status", "--porcelain"],
164
+ check=True,
165
+ capture_output=True,
166
+ text=True,
167
+ ).stdout.strip()
168
+ if dirty:
169
+ click.echo(
170
+ "Resetting managed install workspace before update; "
171
+ "local generated changes are discarded."
172
+ )
173
+ subprocess.run(["git", "-C", str(ws), "fetch", "origin", "main"], check=True)
174
+ subprocess.run(
175
+ ["git", "-C", str(ws), "reset", "--hard", "origin/main"],
176
+ check=True,
177
+ )
178
+ return
179
+
180
+ subprocess.run(["git", "-C", str(ws), "pull", "--ff-only"], check=True)
181
+
182
+
183
+ def _remove_managed_repo_symlinks(ws: Path) -> None:
184
+ if ws.resolve() != DEFAULT_WORKSPACE_DIR.resolve():
185
+ return
186
+
187
+ for repo_name in _install_set_repo_names(ws):
188
+ repo_path = ws / repo_name
189
+ if repo_path.is_symlink():
190
+ click.echo(f"Removing symlinked install repo at {repo_path}")
191
+ repo_path.unlink()
192
+
193
+
194
+ def _update_install_set_repos(ws: Path) -> None:
195
+ for repo_name in _install_set_repo_names(ws):
196
+ repo_path = ws / repo_name
197
+ if not (repo_path / ".git").exists():
198
+ continue
199
+
200
+ if ws.resolve() == DEFAULT_WORKSPACE_DIR.resolve():
201
+ click.echo(f"Updating managed install repo {repo_name}...")
202
+ subprocess.run(
203
+ ["git", "-C", str(repo_path), "fetch", "origin", "main"],
204
+ check=True,
205
+ )
206
+ subprocess.run(
207
+ ["git", "-C", str(repo_path), "reset", "--hard", "origin/main"],
208
+ check=True,
209
+ )
210
+ else:
211
+ subprocess.run(["git", "-C", str(repo_path), "pull", "--ff-only"], check=True)
212
+
213
+
214
+ def _install_set_repo_names(ws: Path) -> list[str]:
215
+ multi_json_path = ws / "multi.json"
216
+ if not multi_json_path.is_file():
217
+ return []
218
+
219
+ try:
220
+ multi_json = json.loads(multi_json_path.read_text(encoding="utf-8"))
221
+ except (OSError, json.JSONDecodeError):
222
+ return []
223
+
224
+ names = []
225
+ for repo in multi_json.get("repos", []):
226
+ install_sets = repo.get("installSets")
227
+ if install_sets is not None and WORKSPACE_INSTALL_SET not in install_sets:
228
+ continue
229
+ if name := repo.get("name"):
230
+ names.append(name)
231
+ return names
154
232
 
155
233
 
156
234
  def _multi_sync(ws_path: Path) -> None:
@@ -18,11 +18,11 @@ django_asgi_app = get_asgi_application()
18
18
 
19
19
  from channels.routing import ProtocolTypeRouter, URLRouter # noqa: E402
20
20
 
21
- from openbase_coder_cli.openbase_coder_cli_app.middleware import (
22
- TokenAuthMiddleware, # noqa: E402
21
+ from openbase_coder_cli.openbase_coder_cli_app.middleware import ( # noqa: E402
22
+ TokenAuthMiddleware,
23
23
  )
24
- from openbase_coder_cli.openbase_coder_cli_app.routing import (
25
- websocket_urlpatterns, # noqa: E402
24
+ from openbase_coder_cli.openbase_coder_cli_app.routing import ( # noqa: E402
25
+ websocket_urlpatterns,
26
26
  )
27
27
 
28
28
  _inner = ProtocolTypeRouter(
@@ -7,9 +7,10 @@ import logging
7
7
  import httpx
8
8
  from django.conf import settings
9
9
  from django.contrib.auth import get_user_model
10
- from openbase_coder_cli.config.jwt_validation import InvalidTokenError, JWKSValidator
11
10
  from rest_framework import authentication, exceptions
12
11
 
12
+ from openbase_coder_cli.config.jwt_validation import InvalidTokenError, JWKSValidator
13
+
13
14
  logger = logging.getLogger(__name__)
14
15
 
15
16
  _validator: JWKSValidator | None = None
@@ -1688,20 +1688,19 @@ class SpeechFormattingSynthesizeStream:
1688
1688
  if self._buffer:
1689
1689
  spoken_text = format_for_speech(self._buffer)
1690
1690
  final_text = spoken_text or "Technical output omitted, shown on screen."
1691
- if LIVEKIT_VERBOSE_LOGGING:
1692
- logger.info(
1693
- "dispatch_timing stage=tts_stream_flush role=%s voice_id=%s "
1694
- "voice_name=%s flush_count=%d original_len=%d text_len=%d "
1695
- "text_hash=%s text_excerpt=%r",
1696
- self._role,
1697
- self._voice_id or "",
1698
- self._voice_name or "",
1699
- self._flush_count,
1700
- len(self._buffer),
1701
- len(final_text),
1702
- hashlib.sha256(final_text.encode("utf-8")).hexdigest()[:12],
1703
- final_text[:160],
1704
- )
1691
+ logger.info(
1692
+ "dispatch_timing stage=tts_stream_flush role=%s voice_id=%s "
1693
+ "voice_name=%s flush_count=%d original_len=%d text_len=%d "
1694
+ "text_hash=%s text_excerpt=%r",
1695
+ self._role,
1696
+ self._voice_id or "",
1697
+ self._voice_name or "",
1698
+ self._flush_count,
1699
+ len(self._buffer),
1700
+ len(final_text),
1701
+ hashlib.sha256(final_text.encode("utf-8")).hexdigest()[:12],
1702
+ final_text[:160],
1703
+ )
1705
1704
  self._stream.push_text(final_text)
1706
1705
  self._buffer = ""
1707
1706
  elif LIVEKIT_VERBOSE_LOGGING:
@@ -4,8 +4,6 @@ Django app configuration for openbase_coder_cli_app.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- import os
8
-
9
7
  from django.apps import AppConfig
10
8
 
11
9
 
@@ -8,6 +8,7 @@ from urllib.parse import parse_qs
8
8
  import httpx
9
9
  from channels.middleware import BaseMiddleware
10
10
  from django.conf import settings
11
+
11
12
  from openbase_coder_cli.config.jwt_validation import InvalidTokenError, JWKSValidator
12
13
 
13
14
  logger = logging.getLogger(__name__)
@@ -6,7 +6,6 @@ Add your DRF serializers here.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- from openbase_coder_cli.config.serializers import TimestampedModelSerializer
10
9
 
11
10
  # Example serializer - replace with your own serializers
12
11
  # from openbase_coder_cli.openbase_coder_cli_app.models import Item
@@ -9,7 +9,6 @@ from typing import Any
9
9
 
10
10
  from openbase_coder_cli.services.installation import InstallationConfig
11
11
 
12
-
13
12
  BOILERSYNC_TIMEOUT_SECONDS = 30
14
13
 
15
14
 
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  from dataclasses import asdict, dataclass
5
- from pathlib import Path
6
5
 
7
6
  from openbase_coder_cli.paths import INSTALLATION_JSON_PATH
8
7
 
File without changes
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  import json
4
4
  import shutil
5
5
  import subprocess
6
- from dataclasses import dataclass
7
6
  from concurrent.futures import ThreadPoolExecutor
7
+ from dataclasses import dataclass
8
8
  from typing import Any
9
9
 
10
10
  import httpx
@@ -95,10 +95,10 @@ version-file = "openbase_coder_cli/_version.py"
95
95
 
96
96
  [tool.ruff]
97
97
  target-version = "py313"
98
- select = ["E", "F", "I", "B", "W", "C90"]
99
- ignore = ["C901", "E501", "F821"]
100
98
 
101
99
  [tool.ruff.lint]
100
+ select = ["E", "F", "I", "B", "W", "C90"]
101
+ ignore = ["C901", "E501", "F821"]
102
102
  fixable = ["ALL"]
103
103
  unfixable = []
104
104