windcode 0.1.0__tar.gz → 0.1.1__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 (164) hide show
  1. {windcode-0.1.0 → windcode-0.1.1}/PKG-INFO +1 -1
  2. {windcode-0.1.0 → windcode-0.1.1}/pyproject.toml +1 -1
  3. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/__init__.py +1 -1
  4. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/app.py +16 -3
  5. {windcode-0.1.0 → windcode-0.1.1}/uv.lock +1 -1
  6. {windcode-0.1.0 → windcode-0.1.1}/.github/workflows/publish.yml +0 -0
  7. {windcode-0.1.0 → windcode-0.1.1}/.gitignore +0 -0
  8. {windcode-0.1.0 → windcode-0.1.1}/.python-version +0 -0
  9. {windcode-0.1.0 → windcode-0.1.1}/.windcode/config.toml.example +0 -0
  10. {windcode-0.1.0 → windcode-0.1.1}/.windcode/skills/code-review/SKILL.md +0 -0
  11. {windcode-0.1.0 → windcode-0.1.1}/.windcode/skills/code-review/agents/openai.yaml +0 -0
  12. {windcode-0.1.0 → windcode-0.1.1}/AGENTS.md +0 -0
  13. {windcode-0.1.0 → windcode-0.1.1}/LICENSE +0 -0
  14. {windcode-0.1.0 → windcode-0.1.1}/README.md +0 -0
  15. {windcode-0.1.0 → windcode-0.1.1}/assets/image.png +0 -0
  16. {windcode-0.1.0 → windcode-0.1.1}/assets/image1.png +0 -0
  17. {windcode-0.1.0 → windcode-0.1.1}/assets/image2.png +0 -0
  18. {windcode-0.1.0 → windcode-0.1.1}/assets/image3.png +0 -0
  19. {windcode-0.1.0 → windcode-0.1.1}/assets/image4.png +0 -0
  20. {windcode-0.1.0 → windcode-0.1.1}/examples/01_stateful_chat.py +0 -0
  21. {windcode-0.1.0 → windcode-0.1.1}/examples/02_custom_tool.py +0 -0
  22. {windcode-0.1.0 → windcode-0.1.1}/examples/03_multi_agent.py +0 -0
  23. {windcode-0.1.0 → windcode-0.1.1}/examples/04_mcp_tools.py +0 -0
  24. {windcode-0.1.0 → windcode-0.1.1}/examples/05_skill.py +0 -0
  25. {windcode-0.1.0 → windcode-0.1.1}/examples/06_stream_and_cancel.py +0 -0
  26. {windcode-0.1.0 → windcode-0.1.1}/examples/07_bash_approval.py +0 -0
  27. {windcode-0.1.0 → windcode-0.1.1}/examples/README.md +0 -0
  28. {windcode-0.1.0 → windcode-0.1.1}/examples/skills/release_notes/SKILL.md +0 -0
  29. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/__main__.py +0 -0
  30. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/auth/__init__.py +0 -0
  31. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/auth/store.py +0 -0
  32. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/cli.py +0 -0
  33. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/config/__init__.py +0 -0
  34. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/config/loader.py +0 -0
  35. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/config/models.py +0 -0
  36. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/config/writer.py +0 -0
  37. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/context/__init__.py +0 -0
  38. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/context/compactor.py +0 -0
  39. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/context/estimator.py +0 -0
  40. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/context/truncation.py +0 -0
  41. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/__init__.py +0 -0
  42. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/errors.py +0 -0
  43. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/events.py +0 -0
  44. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/messages.py +0 -0
  45. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/models.py +0 -0
  46. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/subagents.py +0 -0
  47. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/domain/tools.py +0 -0
  48. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/__init__.py +0 -0
  49. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/commands.py +0 -0
  50. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/discovery.py +0 -0
  51. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/events.py +0 -0
  52. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/hooks/__init__.py +0 -0
  53. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/hooks/dispatcher.py +0 -0
  54. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/hooks/executor.py +0 -0
  55. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/hooks/loader.py +0 -0
  56. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/hooks/models.py +0 -0
  57. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/mcp/__init__.py +0 -0
  58. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/mcp/adapter.py +0 -0
  59. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/mcp/catalog.py +0 -0
  60. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/mcp/client.py +0 -0
  61. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/mcp/runtime.py +0 -0
  62. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/mcp/tools.py +0 -0
  63. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/models.py +0 -0
  64. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/paths.py +0 -0
  65. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/plugins/__init__.py +0 -0
  66. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/plugins/installer.py +0 -0
  67. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/plugins/manifest.py +0 -0
  68. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/runtime.py +0 -0
  69. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/service.py +0 -0
  70. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/skills/__init__.py +0 -0
  71. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/skills/loader.py +0 -0
  72. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/skills/parser.py +0 -0
  73. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/skills/tools.py +0 -0
  74. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/snapshot.py +0 -0
  75. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/extensions/state.py +0 -0
  76. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/instructions/__init__.py +0 -0
  77. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/instructions/loader.py +0 -0
  78. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/__init__.py +0 -0
  79. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/extraction.py +0 -0
  80. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/models.py +0 -0
  81. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/refiner.py +0 -0
  82. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/security.py +0 -0
  83. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/service.py +0 -0
  84. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/memory/store.py +0 -0
  85. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/observability/__init__.py +0 -0
  86. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/observability/redaction.py +0 -0
  87. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/observability/trace.py +0 -0
  88. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/policy/__init__.py +0 -0
  89. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/policy/engine.py +0 -0
  90. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/policy/models.py +0 -0
  91. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/__init__.py +0 -0
  92. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/_utils.py +0 -0
  93. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/anthropic.py +0 -0
  94. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/base.py +0 -0
  95. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/catalog.py +0 -0
  96. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/errors.py +0 -0
  97. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/openai_compat.py +0 -0
  98. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/openai_responses.py +0 -0
  99. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/providers/registry.py +0 -0
  100. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/__init__.py +0 -0
  101. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/control.py +0 -0
  102. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/event_bus.py +0 -0
  103. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/loop.py +0 -0
  104. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/prompts.py +0 -0
  105. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/report.py +0 -0
  106. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/retry.py +0 -0
  107. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/scheduler.py +0 -0
  108. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/__init__.py +0 -0
  109. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/approvals.py +0 -0
  110. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/budgets.py +0 -0
  111. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/coordinator.py +0 -0
  112. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/factory.py +0 -0
  113. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/roles.py +0 -0
  114. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/runtime/subagents/verification.py +0 -0
  115. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sandbox/__init__.py +0 -0
  116. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sandbox/bwrap.py +0 -0
  117. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sdk.py +0 -0
  118. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sessions/__init__.py +0 -0
  119. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sessions/artifacts.py +0 -0
  120. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sessions/models.py +0 -0
  121. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sessions/store.py +0 -0
  122. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/sessions/tree.py +0 -0
  123. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/__init__.py +0 -0
  124. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/apply_patch.py +0 -0
  125. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/ask_user.py +0 -0
  126. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/builtins.py +0 -0
  127. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/edit_file.py +0 -0
  128. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/filesystem.py +0 -0
  129. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/glob.py +0 -0
  130. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/grep.py +0 -0
  131. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/memory.py +0 -0
  132. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/read_file.py +0 -0
  133. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/registry.py +0 -0
  134. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/shell.py +0 -0
  135. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/subagents/__init__.py +0 -0
  136. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/subagents/cancel.py +0 -0
  137. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/subagents/integrate.py +0 -0
  138. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/subagents/list.py +0 -0
  139. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/subagents/spawn.py +0 -0
  140. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/subagents/wait.py +0 -0
  141. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tools/write_file.py +0 -0
  142. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/__init__.py +0 -0
  143. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/commands.py +0 -0
  144. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/permission_display.py +0 -0
  145. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/styles.tcss +0 -0
  146. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/__init__.py +0 -0
  147. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/approval.py +0 -0
  148. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/command_menu.py +0 -0
  149. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/extensions.py +0 -0
  150. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/input.py +0 -0
  151. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/memory.py +0 -0
  152. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/messages.py +0 -0
  153. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/models.py +0 -0
  154. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/question.py +0 -0
  155. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/sessions.py +0 -0
  156. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/status.py +0 -0
  157. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/subagents.py +0 -0
  158. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/tools.py +0 -0
  159. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/tui/widgets/welcome.py +0 -0
  160. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/types.py +0 -0
  161. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/worktrees/__init__.py +0 -0
  162. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/worktrees/git.py +0 -0
  163. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/worktrees/manager.py +0 -0
  164. {windcode-0.1.0 → windcode-0.1.1}/src/windcode/worktrees/models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: windcode
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: A safe, extensible terminal coding agent
5
5
  Project-URL: Homepage, https://github.com/tingfeng347/windcode
6
6
  Project-URL: Repository, https://github.com/tingfeng347/windcode
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "windcode"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  description = "A safe, extensible terminal coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -3,4 +3,4 @@
3
3
  from windcode.sdk import Windcode
4
4
 
5
5
  __all__ = ["Windcode"]
6
- __version__ = "0.1.0"
6
+ __version__ = "0.1.1"
@@ -122,6 +122,13 @@ class WindcodeApp(App[None]):
122
122
  return provider.model
123
123
  return "按配置"
124
124
 
125
+ def _model_setup_message(self) -> str | None:
126
+ if self.client.transport_registry.aliases:
127
+ return None
128
+ if self.config.providers:
129
+ return "模型 Provider 尚未连接, 请检查 API Key 或重新配置 Provider"
130
+ return "尚未配置模型 Provider, 请先连接模型后再开始任务"
131
+
125
132
  def _make_banner(self) -> RichText:
126
133
  banner = RichText()
127
134
  banner.append("▣ ", style="bold color(75)")
@@ -172,6 +179,8 @@ class WindcodeApp(App[None]):
172
179
  self.set_class(self.size.width < 60, "narrow")
173
180
  self.query_one("#chat-input", ChatInput).focus()
174
181
  self._update_status("loading MCP" if self.client.required_mcp_loading else "idle")
182
+ if setup_message := self._model_setup_message():
183
+ self.query_one("#welcome-view", WelcomeView).show_notice(setup_message)
175
184
  if self.client.required_mcp_loading:
176
185
  self.query_one("#welcome-view", WelcomeView).start_mcp_loading()
177
186
  self.run_worker(self._load_required_mcp(), group="mcp-startup", exclusive=True)
@@ -188,7 +197,7 @@ class WindcodeApp(App[None]):
188
197
  return
189
198
  self.query_one("#welcome-view", WelcomeView).stop_mcp_loading()
190
199
  self._update_status("idle")
191
- await self._show_system_message("MCP 服务已加载")
200
+ await self._show_system_message(self._model_setup_message() or "MCP 服务已加载")
192
201
 
193
202
  def on_resize(self, event: events.Resize) -> None:
194
203
  self.set_class(event.size.width < 60, "narrow")
@@ -230,7 +239,7 @@ class WindcodeApp(App[None]):
230
239
  await self._show_system_message("没有可复制的内容", error=True)
231
240
  return
232
241
  try:
233
- await self.copy_to_clipboard(text)
242
+ self.copy_to_clipboard(text)
234
243
  preview = text.replace("\n", " ")[:60]
235
244
  await self._show_system_message(
236
245
  f"已复制到剪贴板: {preview}{'...' if len(text) > 60 else ''}"
@@ -458,6 +467,10 @@ class WindcodeApp(App[None]):
458
467
  await self._start_prompt(value)
459
468
 
460
469
  async def _start_prompt(self, value: str) -> None:
470
+ if setup_message := self._model_setup_message():
471
+ await self._show_system_message(setup_message, error=True)
472
+ await self._open_provider_manager()
473
+ return
461
474
  if self.handle is not None and not self.handle.done:
462
475
  self.prompt_queue.append(value)
463
476
  self._update_status(f"运行中 · 队列 {len(self.prompt_queue)}")
@@ -1006,7 +1019,7 @@ class WindcodeApp(App[None]):
1006
1019
  # If the user has selected text, copy it first instead of canceling.
1007
1020
  selected = self.screen.get_selected_text()
1008
1021
  if selected:
1009
- await self.copy_to_clipboard(selected)
1022
+ self.copy_to_clipboard(selected)
1010
1023
  self.screen.clear_selection()
1011
1024
  return
1012
1025
  if self.handle is not None and not self.handle.done:
@@ -1498,7 +1498,7 @@ wheels = [
1498
1498
 
1499
1499
  [[package]]
1500
1500
  name = "windcode"
1501
- version = "0.1.0"
1501
+ version = "0.1.1"
1502
1502
  source = { editable = "." }
1503
1503
  dependencies = [
1504
1504
  { name = "aiohttp" },
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
File without changes
File without changes
File without changes
File without changes