qi-coding-agent 0.1.0__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 (246) hide show
  1. qi_coding_agent-0.1.0/.github/workflows/publish.yml +115 -0
  2. qi_coding_agent-0.1.0/.gitignore +35 -0
  3. qi_coding_agent-0.1.0/.pi-lens.json +11 -0
  4. qi_coding_agent-0.1.0/LICENSE +21 -0
  5. qi_coding_agent-0.1.0/PKG-INFO +151 -0
  6. qi_coding_agent-0.1.0/README.md +121 -0
  7. qi_coding_agent-0.1.0/design/PLAN.md +218 -0
  8. qi_coding_agent-0.1.0/design/agent-config-design.md +301 -0
  9. qi_coding_agent-0.1.0/design/bash-allowlist.md +214 -0
  10. qi_coding_agent-0.1.0/design/development.md +178 -0
  11. qi_coding_agent-0.1.0/design/dispatcher.md +101 -0
  12. qi_coding_agent-0.1.0/design/extensions-design.md +365 -0
  13. qi_coding_agent-0.1.0/design/internals.md +136 -0
  14. qi_coding_agent-0.1.0/design/overview.md +131 -0
  15. qi_coding_agent-0.1.0/design/pi-alignment.md +358 -0
  16. qi_coding_agent-0.1.0/design/plugins.md +81 -0
  17. qi_coding_agent-0.1.0/design/web.md +2762 -0
  18. qi_coding_agent-0.1.0/docs/cli.md +188 -0
  19. qi_coding_agent-0.1.0/docs/compaction.md +148 -0
  20. qi_coding_agent-0.1.0/docs/configuration.md +89 -0
  21. qi_coding_agent-0.1.0/docs/containerization.md +80 -0
  22. qi_coding_agent-0.1.0/docs/docs.json +1 -0
  23. qi_coding_agent-0.1.0/docs/environment-variables.md +47 -0
  24. qi_coding_agent-0.1.0/docs/extensions.md +382 -0
  25. qi_coding_agent-0.1.0/docs/how-qi-works.md +93 -0
  26. qi_coding_agent-0.1.0/docs/index.md +61 -0
  27. qi_coding_agent-0.1.0/docs/json.md +112 -0
  28. qi_coding_agent-0.1.0/docs/keybindings.md +83 -0
  29. qi_coding_agent-0.1.0/docs/models.md +138 -0
  30. qi_coding_agent-0.1.0/docs/packages.md +155 -0
  31. qi_coding_agent-0.1.0/docs/providers.md +288 -0
  32. qi_coding_agent-0.1.0/docs/quickstart.md +109 -0
  33. qi_coding_agent-0.1.0/docs/security.md +69 -0
  34. qi_coding_agent-0.1.0/docs/session-format.md +299 -0
  35. qi_coding_agent-0.1.0/docs/sessions.md +127 -0
  36. qi_coding_agent-0.1.0/docs/settings.md +138 -0
  37. qi_coding_agent-0.1.0/docs/skills.md +124 -0
  38. qi_coding_agent-0.1.0/docs/slash-commands.md +55 -0
  39. qi_coding_agent-0.1.0/docs/themes.md +78 -0
  40. qi_coding_agent-0.1.0/docs/tui.md +109 -0
  41. qi_coding_agent-0.1.0/docs/usage.md +112 -0
  42. qi_coding_agent-0.1.0/examples/agents/README.md +50 -0
  43. qi_coding_agent-0.1.0/examples/agents/code-analyst/agent.md +23 -0
  44. qi_coding_agent-0.1.0/examples/agents/code-analyst/assets/review-rules.md +7 -0
  45. qi_coding_agent-0.1.0/examples/agents/code-analyst/mcp.json +8 -0
  46. qi_coding_agent-0.1.0/examples/agents/code-analyst/skills/code-review-checklist/SKILL.md +15 -0
  47. qi_coding_agent-0.1.0/examples/agents/code-reviewer/agent.md +35 -0
  48. qi_coding_agent-0.1.0/examples/agents/data-analyst/agent.md +32 -0
  49. qi_coding_agent-0.1.0/examples/agents/doc-writer/agent.md +34 -0
  50. qi_coding_agent-0.1.0/examples/agents/doc-writer/assets/doc-style.md +10 -0
  51. qi_coding_agent-0.1.0/examples/agents/general/agent.md +14 -0
  52. qi_coding_agent-0.1.0/examples/agents/test-runner/agent.md +35 -0
  53. qi_coding_agent-0.1.0/examples/agents/writer/agent.md +22 -0
  54. qi_coding_agent-0.1.0/examples/extensions/README.md +22 -0
  55. qi_coding_agent-0.1.0/examples/extensions/hello/README.md +44 -0
  56. qi_coding_agent-0.1.0/examples/extensions/hello/extension.py +83 -0
  57. qi_coding_agent-0.1.0/extensions/qi-agents/README.md +160 -0
  58. qi_coding_agent-0.1.0/extensions/qi-agents/pyproject.toml +22 -0
  59. qi_coding_agent-0.1.0/extensions/qi-agents/qi_agents/__init__.py +106 -0
  60. qi_coding_agent-0.1.0/extensions/qi-agents/qi_agents/discovery.py +133 -0
  61. qi_coding_agent-0.1.0/extensions/qi-agents/qi_agents/subagent.py +296 -0
  62. qi_coding_agent-0.1.0/extensions/qi-mcp/README.md +172 -0
  63. qi_coding_agent-0.1.0/extensions/qi-mcp/pyproject.toml +19 -0
  64. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/__init__.py +271 -0
  65. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/client.py +404 -0
  66. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/config.py +231 -0
  67. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/direct.py +88 -0
  68. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/proxy.py +244 -0
  69. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/role.py +191 -0
  70. qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/servers.py +234 -0
  71. qi_coding_agent-0.1.0/extensions/qi-web/README.md +66 -0
  72. qi_coding_agent-0.1.0/extensions/qi-web/pyproject.toml +19 -0
  73. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/__init__.py +24 -0
  74. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/agui.py +402 -0
  75. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/app.py +856 -0
  76. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/browse.py +85 -0
  77. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/files.py +230 -0
  78. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/schemas.py +380 -0
  79. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/security.py +73 -0
  80. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/serve.py +188 -0
  81. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/state.py +127 -0
  82. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/static/assets/index-96aT_6NK.js +20 -0
  83. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/static/assets/index-DePFgopp.css +1 -0
  84. qi_coding_agent-0.1.0/extensions/qi-web/qi_web/static/index.html +14 -0
  85. qi_coding_agent-0.1.0/extensions/qi-web/ui/index.html +13 -0
  86. qi_coding_agent-0.1.0/extensions/qi-web/ui/package-lock.json +2584 -0
  87. qi_coding_agent-0.1.0/extensions/qi-web/ui/package.json +38 -0
  88. qi_coding_agent-0.1.0/extensions/qi-web/ui/scripts/check-design.mjs +200 -0
  89. qi_coding_agent-0.1.0/extensions/qi-web/ui/scripts/check-dsh-tokens.mjs +344 -0
  90. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/App.tsx +1157 -0
  91. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/client.test.ts +97 -0
  92. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/client.ts +381 -0
  93. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/contract.test.ts +134 -0
  94. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/types.ts +487 -0
  95. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/commands.tsx +163 -0
  96. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/AgentMenu.tsx +177 -0
  97. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/CommandMenu.tsx +157 -0
  98. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ConfirmDialog.tsx +68 -0
  99. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/DirPicker.tsx +168 -0
  100. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Dock.tsx +412 -0
  101. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/FilePanel.tsx +386 -0
  102. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ModelMenu.test.ts +28 -0
  103. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ModelMenu.tsx +211 -0
  104. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ProjectMenu.tsx +141 -0
  105. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Rail.tsx +371 -0
  106. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/RowMenu.tsx +165 -0
  107. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Rows.tsx +577 -0
  108. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Settings.tsx +815 -0
  109. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/SidebarSection.tsx +126 -0
  110. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/icons.tsx +527 -0
  111. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/main.tsx +14 -0
  112. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/cjk.ts +100 -0
  113. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/markdown.test.ts +121 -0
  114. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/parse.ts +29 -0
  115. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/render.tsx +324 -0
  116. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/projects.test.ts +265 -0
  117. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/projects.ts +233 -0
  118. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/route.test.ts +46 -0
  119. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/route.ts +40 -0
  120. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/stats.test.ts +115 -0
  121. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/stats.ts +85 -0
  122. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/turn.test.ts +422 -0
  123. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/turn.ts +736 -0
  124. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/theme/app.css +3268 -0
  125. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/theme/theme.ts +23 -0
  126. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/theme/tokens.css +659 -0
  127. qi_coding_agent-0.1.0/extensions/qi-web/ui/src/vite-env.d.ts +5 -0
  128. qi_coding_agent-0.1.0/extensions/qi-web/ui/tsconfig.json +19 -0
  129. qi_coding_agent-0.1.0/extensions/qi-web/ui/vite.config.ts +22 -0
  130. qi_coding_agent-0.1.0/extensions/qi-web/ui/vitest.config.ts +15 -0
  131. qi_coding_agent-0.1.0/pyproject.toml +58 -0
  132. qi_coding_agent-0.1.0/pyrightconfig.json +22 -0
  133. qi_coding_agent-0.1.0/scripts/check_versions.py +72 -0
  134. qi_coding_agent-0.1.0/scripts/e2e_ui_model.py +392 -0
  135. qi_coding_agent-0.1.0/scripts/prune_empty_sessions.py +152 -0
  136. qi_coding_agent-0.1.0/src/qi_agent/__init__.py +18 -0
  137. qi_coding_agent-0.1.0/src/qi_agent/abort.py +40 -0
  138. qi_coding_agent-0.1.0/src/qi_agent/auth.py +216 -0
  139. qi_coding_agent-0.1.0/src/qi_agent/cli.py +2178 -0
  140. qi_coding_agent-0.1.0/src/qi_agent/compaction.py +475 -0
  141. qi_coding_agent-0.1.0/src/qi_agent/config.py +409 -0
  142. qi_coding_agent-0.1.0/src/qi_agent/export_html.py +95 -0
  143. qi_coding_agent-0.1.0/src/qi_agent/extensions.py +2267 -0
  144. qi_coding_agent-0.1.0/src/qi_agent/llm.py +609 -0
  145. qi_coding_agent-0.1.0/src/qi_agent/loader.py +299 -0
  146. qi_coding_agent-0.1.0/src/qi_agent/model_catalog.py +108 -0
  147. qi_coding_agent-0.1.0/src/qi_agent/models.py +103 -0
  148. qi_coding_agent-0.1.0/src/qi_agent/packages.py +430 -0
  149. qi_coding_agent-0.1.0/src/qi_agent/paths.py +242 -0
  150. qi_coding_agent-0.1.0/src/qi_agent/pep723.py +74 -0
  151. qi_coding_agent-0.1.0/src/qi_agent/presets.py +293 -0
  152. qi_coding_agent-0.1.0/src/qi_agent/prompt.py +150 -0
  153. qi_coding_agent-0.1.0/src/qi_agent/registry.py +485 -0
  154. qi_coding_agent-0.1.0/src/qi_agent/runner.py +584 -0
  155. qi_coding_agent-0.1.0/src/qi_agent/runtime.py +1940 -0
  156. qi_coding_agent-0.1.0/src/qi_agent/session.py +739 -0
  157. qi_coding_agent-0.1.0/src/qi_agent/settings.py +501 -0
  158. qi_coding_agent-0.1.0/src/qi_agent/share.py +111 -0
  159. qi_coding_agent-0.1.0/src/qi_agent/system_prompt.py +278 -0
  160. qi_coding_agent-0.1.0/src/qi_agent/theme.py +389 -0
  161. qi_coding_agent-0.1.0/src/qi_agent/themes/dark.json +90 -0
  162. qi_coding_agent-0.1.0/src/qi_agent/themes/light.json +89 -0
  163. qi_coding_agent-0.1.0/src/qi_agent/titling.py +90 -0
  164. qi_coding_agent-0.1.0/src/qi_agent/tools/__init__.py +349 -0
  165. qi_coding_agent-0.1.0/src/qi_agent/tools/shell.py +276 -0
  166. qi_coding_agent-0.1.0/src/qi_agent/trust.py +106 -0
  167. qi_coding_agent-0.1.0/src/qi_agent/tui.py +6224 -0
  168. qi_coding_agent-0.1.0/src/qi_agent/workspaces.py +116 -0
  169. qi_coding_agent-0.1.0/tests/conftest.py +110 -0
  170. qi_coding_agent-0.1.0/tests/test_branch_summary_prompt.py +137 -0
  171. qi_coding_agent-0.1.0/tests/test_browse.py +77 -0
  172. qi_coding_agent-0.1.0/tests/test_cli_init.py +338 -0
  173. qi_coding_agent-0.1.0/tests/test_cli_install.py +236 -0
  174. qi_coding_agent-0.1.0/tests/test_cli_pi_alignment.py +399 -0
  175. qi_coding_agent-0.1.0/tests/test_cli_run.py +248 -0
  176. qi_coding_agent-0.1.0/tests/test_cli_tool_flags.py +296 -0
  177. qi_coding_agent-0.1.0/tests/test_compaction.py +515 -0
  178. qi_coding_agent-0.1.0/tests/test_compaction_events.py +180 -0
  179. qi_coding_agent-0.1.0/tests/test_config.py +181 -0
  180. qi_coding_agent-0.1.0/tests/test_config_resources.py +214 -0
  181. qi_coding_agent-0.1.0/tests/test_contract_p0.py +531 -0
  182. qi_coding_agent-0.1.0/tests/test_docs_injection.py +201 -0
  183. qi_coding_agent-0.1.0/tests/test_doctor_extensions.py +108 -0
  184. qi_coding_agent-0.1.0/tests/test_example_extension.py +139 -0
  185. qi_coding_agent-0.1.0/tests/test_export_html.py +112 -0
  186. qi_coding_agent-0.1.0/tests/test_extension_alignment.py +563 -0
  187. qi_coding_agent-0.1.0/tests/test_extension_bus.py +418 -0
  188. qi_coding_agent-0.1.0/tests/test_extension_cli_commands.py +209 -0
  189. qi_coding_agent-0.1.0/tests/test_extension_commands.py +414 -0
  190. qi_coding_agent-0.1.0/tests/test_extension_deps.py +169 -0
  191. qi_coding_agent-0.1.0/tests/test_extension_entry_points.py +100 -0
  192. qi_coding_agent-0.1.0/tests/test_extension_events.py +332 -0
  193. qi_coding_agent-0.1.0/tests/test_extension_exclusions.py +135 -0
  194. qi_coding_agent-0.1.0/tests/test_extension_flags.py +412 -0
  195. qi_coding_agent-0.1.0/tests/test_extension_interop.py +262 -0
  196. qi_coding_agent-0.1.0/tests/test_extension_messages.py +269 -0
  197. qi_coding_agent-0.1.0/tests/test_extension_model.py +312 -0
  198. qi_coding_agent-0.1.0/tests/test_extension_resolvers.py +209 -0
  199. qi_coding_agent-0.1.0/tests/test_extension_run_agent.py +277 -0
  200. qi_coding_agent-0.1.0/tests/test_extension_runner_events.py +330 -0
  201. qi_coding_agent-0.1.0/tests/test_extension_session.py +270 -0
  202. qi_coding_agent-0.1.0/tests/test_extension_tools.py +243 -0
  203. qi_coding_agent-0.1.0/tests/test_extension_ui.py +391 -0
  204. qi_coding_agent-0.1.0/tests/test_extensions.py +395 -0
  205. qi_coding_agent-0.1.0/tests/test_interrupt.py +480 -0
  206. qi_coding_agent-0.1.0/tests/test_litellm_offline.py +80 -0
  207. qi_coding_agent-0.1.0/tests/test_missing_extension_hints.py +147 -0
  208. qi_coding_agent-0.1.0/tests/test_model_catalog.py +306 -0
  209. qi_coding_agent-0.1.0/tests/test_model_thinking_levels.py +156 -0
  210. qi_coding_agent-0.1.0/tests/test_package_resource_toggle.py +156 -0
  211. qi_coding_agent-0.1.0/tests/test_packages.py +121 -0
  212. qi_coding_agent-0.1.0/tests/test_pep723.py +109 -0
  213. qi_coding_agent-0.1.0/tests/test_presets.py +403 -0
  214. qi_coding_agent-0.1.0/tests/test_prune_empty_sessions.py +172 -0
  215. qi_coding_agent-0.1.0/tests/test_qi_agents_extension.py +441 -0
  216. qi_coding_agent-0.1.0/tests/test_qi_mcp_config.py +434 -0
  217. qi_coding_agent-0.1.0/tests/test_qi_mcp_direct.py +339 -0
  218. qi_coding_agent-0.1.0/tests/test_qi_mcp_http.py +183 -0
  219. qi_coding_agent-0.1.0/tests/test_qi_mcp_proxy.py +435 -0
  220. qi_coding_agent-0.1.0/tests/test_qi_mcp_role.py +290 -0
  221. qi_coding_agent-0.1.0/tests/test_qi_mcp_stdio.py +577 -0
  222. qi_coding_agent-0.1.0/tests/test_runner_core.py +100 -0
  223. qi_coding_agent-0.1.0/tests/test_session_model_entries.py +504 -0
  224. qi_coding_agent-0.1.0/tests/test_session_store.py +378 -0
  225. qi_coding_agent-0.1.0/tests/test_session_tree.py +260 -0
  226. qi_coding_agent-0.1.0/tests/test_settings_skills.py +555 -0
  227. qi_coding_agent-0.1.0/tests/test_share.py +155 -0
  228. qi_coding_agent-0.1.0/tests/test_shell.py +305 -0
  229. qi_coding_agent-0.1.0/tests/test_skill_commands.py +72 -0
  230. qi_coding_agent-0.1.0/tests/test_streaming.py +499 -0
  231. qi_coding_agent-0.1.0/tests/test_system_prompt.py +314 -0
  232. qi_coding_agent-0.1.0/tests/test_theme.py +130 -0
  233. qi_coding_agent-0.1.0/tests/test_thinking.py +590 -0
  234. qi_coding_agent-0.1.0/tests/test_thinking_budgets.py +114 -0
  235. qi_coding_agent-0.1.0/tests/test_titling.py +209 -0
  236. qi_coding_agent-0.1.0/tests/test_tool_execution_mode.py +207 -0
  237. qi_coding_agent-0.1.0/tests/test_trust_scope.py +290 -0
  238. qi_coding_agent-0.1.0/tests/test_tui_extension_render.py +456 -0
  239. qi_coding_agent-0.1.0/tests/test_tui_model_restore.py +143 -0
  240. qi_coding_agent-0.1.0/tests/test_tui_smoke.py +276 -0
  241. qi_coding_agent-0.1.0/tests/test_tui_style.py +3028 -0
  242. qi_coding_agent-0.1.0/tests/test_web_api.py +1108 -0
  243. qi_coding_agent-0.1.0/tests/test_web_extensions_api.py +336 -0
  244. qi_coding_agent-0.1.0/tests/test_web_files.py +250 -0
  245. qi_coding_agent-0.1.0/tests/test_workspaces.py +86 -0
  246. qi_coding_agent-0.1.0/uv.lock +1926 -0
@@ -0,0 +1,115 @@
1
+ name: publish
2
+
3
+ # 发布四个 distribution:qi-coding-agent(core)+ qi-mcp / qi-agents / qi-web。
4
+ # 锁步同版本;先构建校验,再按目标索引发布。
5
+ #
6
+ # 触发:
7
+ # - push tag `v*` → 发布到 PyPI(正式)
8
+ # - workflow_dispatch → 手选 testpypi / pypi(试跑用 testpypi)
9
+ #
10
+ # `packages` 默认只发 core(qi-coding-agent)。要连三个官方扩展一起发,把它切成 `all` ——
11
+ # 那要求 PyPI 上四个发行名都配好了 trusted publisher(扩展还没发时就保持 core)。
12
+ #
13
+ # 首次发布前要在 PyPI / TestPyPI 各配一次 **Trusted Publisher**(不需要 API token):
14
+ # Owner: viewnah · Repository: qi · Workflow: publish.yml · Environment: pypi(或 testpypi)
15
+ # 本文件用 OIDC(id-token)发布,所以两个 job 都声明了 `environment`。
16
+
17
+ on:
18
+ workflow_dispatch:
19
+ inputs:
20
+ target:
21
+ description: 发布到哪个索引
22
+ type: choice
23
+ options: [testpypi, pypi]
24
+ default: testpypi
25
+ packages:
26
+ description: 发哪些包(core = 只发 qi-coding-agent;all = 连三个官方扩展)
27
+ type: choice
28
+ options: [core, all]
29
+ default: core
30
+ push:
31
+ tags: ["v*"]
32
+
33
+ permissions:
34
+ contents: read
35
+
36
+ jobs:
37
+ build:
38
+ name: 校验 + 构建
39
+ runs-on: ubuntu-latest
40
+ steps:
41
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
42
+ with:
43
+ persist-credentials: false # 构建阶段用不到 git 凭证,别把它写进产物
44
+
45
+ - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
46
+ with:
47
+ enable-cache: false # 发布 job 不开缓存(缓存投毒在这里代价最高)
48
+
49
+ - name: 版本一致性(发 core 时只核 core;发 all 时要求四个锁步;tag 触发时顺带核 tag)
50
+ env:
51
+ TAG: ${{ github.ref_type == 'tag' && github.ref_name || '' }}
52
+ PACKAGES: ${{ inputs.packages || 'core' }}
53
+ run: |
54
+ if [ "$PACKAGES" = "all" ]; then
55
+ python3 scripts/check_versions.py
56
+ else
57
+ python3 scripts/check_versions.py --only core
58
+ fi
59
+
60
+ - name: 构建(按 packages 选择)
61
+ env:
62
+ PACKAGES: ${{ inputs.packages || 'core' }}
63
+ run: |
64
+ uv build --out-dir dist
65
+ if [ "$PACKAGES" = "all" ]; then
66
+ uv build extensions/qi-mcp --out-dir dist
67
+ uv build extensions/qi-agents --out-dir dist
68
+ uv build extensions/qi-web --out-dir dist
69
+ fi
70
+
71
+ - name: 产物清单
72
+ run: ls -l dist
73
+
74
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
75
+ with:
76
+ name: dist
77
+ path: dist/
78
+
79
+ publish-testpypi:
80
+ name: 发布到 TestPyPI
81
+ needs: build
82
+ if: github.event_name == 'workflow_dispatch' && inputs.target == 'testpypi'
83
+ runs-on: ubuntu-latest
84
+ environment: testpypi
85
+ permissions:
86
+ id-token: write # OIDC 信任发布,不用 token
87
+ steps:
88
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
89
+ with:
90
+ name: dist
91
+ path: dist
92
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
93
+ with:
94
+ repository-url: https://test.pypi.org/legacy/
95
+ packages-dir: dist/
96
+ skip-existing: true # 重跑同一版本不炸
97
+
98
+ publish-pypi:
99
+ name: 发布到 PyPI
100
+ needs: build
101
+ if: >-
102
+ github.ref_type == 'tag' ||
103
+ (github.event_name == 'workflow_dispatch' && inputs.target == 'pypi')
104
+ runs-on: ubuntu-latest
105
+ environment: pypi
106
+ permissions:
107
+ id-token: write
108
+ steps:
109
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
110
+ with:
111
+ name: dist
112
+ path: dist
113
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
114
+ with:
115
+ packages-dir: dist/
@@ -0,0 +1,35 @@
1
+ # qi 运行时产物
2
+ .venv/
3
+ __pycache__/
4
+ *.py[cod]
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ .pytest_cache/
9
+ .python-version
10
+
11
+ # 运行时配置/数据(不入库;agent 样例在 examples/agents/)
12
+ .qi/
13
+
14
+ # qi-web 前端构建产物(generated:先 `cd web && npm run build` 再打包)
15
+ # 不纳入版本控制;缺失时 `qi web` 会提示去构建,而不是给一个坏页面
16
+ src/qi_agent/web/static/
17
+
18
+ # 已有忽略(参考组件)
19
+ sdk/
20
+ data/
21
+
22
+ # pi 自身的运行期目录(tasks 输出等,非源码)
23
+ .pi/
24
+
25
+ # qi-web 前端依赖与构建中间产物
26
+ extensions/qi-web/ui/node_modules/
27
+ extensions/qi-web/ui/dist/
28
+
29
+ # 编辑器配置
30
+ .vscode/
31
+
32
+ # vitest 输出(node 侧测试报告;含绝对路径与时间戳,不入库)。
33
+ # 旧 core web 与 qi-web 扩展两条路径都要盖。
34
+ web/.vitest/
35
+ extensions/qi-web/ui/.vitest/
@@ -0,0 +1,11 @@
1
+ {
2
+ "ignore": [
3
+ "src/qi_agent/web/static/**",
4
+ "extensions/qi-web/ui/node_modules/**",
5
+ "extensions/qi-web/ui/dist/**",
6
+ "**/*.min.js"
7
+ ],
8
+ "format": {
9
+ "enabled": false
10
+ }
11
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 viewnah
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,151 @@
1
+ Metadata-Version: 2.5
2
+ Name: qi-coding-agent
3
+ Version: 0.1.0
4
+ Summary: 编码 agent 框架:单 agent core + 扩展(MCP / 多 agent / web)
5
+ Project-URL: Homepage, https://github.com/viewnah/qi
6
+ Project-URL: Repository, https://github.com/viewnah/qi
7
+ Project-URL: Issues, https://github.com/viewnah/qi/issues
8
+ Project-URL: Documentation, https://github.com/viewnah/qi/tree/dev/docs
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: agent,cli,coding-agent,llm,mcp,tui
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
19
+ Requires-Python: >=3.12
20
+ Requires-Dist: litellm>=1.40
21
+ Requires-Dist: pydantic>=2.10
22
+ Requires-Dist: pyyaml>=6.0
23
+ Requires-Dist: rich>=13.0
24
+ Requires-Dist: textual>=0.80
25
+ Requires-Dist: typer>=0.12
26
+ Provides-Extra: dev
27
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
28
+ Requires-Dist: pytest>=8; extra == 'dev'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # qi
32
+
33
+ **用 Python 写的编码 agent 框架**。给它一个目标和一个工作目录,它会读文件、跑命令、改内容,一步步把任务做完。
34
+
35
+ **core 就是单 agent**:会话(JSONL + 分支树)、工具循环、系统提示词、CLI 与 TUI、压缩、认证都在里面;
36
+ 角色 / MCP / Web 这类增值功能全部走**扩展**,不塞进 core。
37
+
38
+ > **发行名是 `qi-coding-agent`** —— PyPI 上的 `qi-agent` 属于**别的项目**,别装错;
39
+ > import 包名仍是 `qi_agent`、命令仍是 `qi`。现在还没发布,所以以**从源码安装**为主(见下)。
40
+ > `qi-mcp` / `qi-agents` / `qi-web` 是三个独立官方 pip 包,各自带自己的手册。
41
+
42
+ ## 装
43
+
44
+ 前置:**Python ≥ 3.12** 与 [uv](https://docs.astral.sh/uv/)。
45
+
46
+ ```bash
47
+ git clone https://github.com/viewnah/qi.git
48
+ cd qi
49
+ uv sync # 把 qi 装成 editable;`uv run qi …` 直接可用
50
+ uv run qi doctor # 冒烟:配置 / 凭证 / 扩展 / 包声明,一次全报
51
+ ```
52
+
53
+ 官方扩展**按需单独装**(core 不内置、不默认装):
54
+
55
+ ```bash
56
+ pip install -e extensions/qi-agents -e extensions/qi-mcp -e extensions/qi-web
57
+ uv run qi doctor # 「声明了但没装」「装了但没声明」都在这里报出来,并给出装法
58
+ ```
59
+
60
+ **发布之后**(现在还没有)可以直接装发行版,扩展用 `--with` 一次装齐:
61
+
62
+ ```bash
63
+ uv tool install qi-coding-agent # 只装 core
64
+ uv tool install qi-coding-agent --with qi-mcp --with qi-agents
65
+ ```
66
+
67
+ 装法(自家 venv / `uv tool` / 只读解释器)与声明层(`settings.packages`)的差别见
68
+ [docs/packages.md](docs/packages.md)。
69
+
70
+ ## 快速开始
71
+
72
+ ```bash
73
+ uv run qi init # 引导:选 provider → 加模型 → 设为默认(写 models.json + settings.json + auth.json)
74
+ uv run qi init --list-presets # 看内置的预置 provider(国产为主:deepseek / qwen / kimi / glm / minimax …)
75
+ uv run qi init --preset deepseek # 一条命令物化预置并设为默认(只补缺、幂等)
76
+ uv run qi doctor # 校验配置与凭证
77
+ ```
78
+
79
+ 然后三种跑法:
80
+
81
+ ```bash
82
+ uv run qi # 交互界面(裸 qi 就是界面)
83
+ uv run qi "分析这个仓库" # 进界面,并把这句话作为首条消息发出
84
+ uv run qi -p "分析这个仓库" # 无头一次:stdout 只有答案(进度走 stderr)
85
+ uv run qi --mode json "…" # 事件流:一行一个 JSON,喂给上层程序
86
+ ```
87
+
88
+ 不用交互时:
89
+
90
+ ```bash
91
+ uv run qi init -y --provider my-proxy --model my-model \
92
+ --base-url https://my-proxy.internal/v1 --api openai-completions --api-key sk-xxx
93
+ ```
94
+
95
+ **零配置也能跑**:基座提示词在代码里,不写任何配置就是一个能用的单 agent。
96
+ 逐步说明见 [docs/quickstart.md](docs/quickstart.md)。
97
+
98
+ ## 怎么定制
99
+
100
+ | 想做 | 用 | 看 |
101
+ | --- | --- | --- |
102
+ | 改偏好(渲染模式、压缩、思考级别…) | `/settings`、`settings.json` | [设置](docs/settings.md) · [配置](docs/configuration.md) |
103
+ | 换模型 / 接本地模型 / 自建代理 | `models.json`、`qi init --preset` | [选一个模型](docs/models.md) |
104
+ | 给它一份按需加载的检查清单 | 一个含 `SKILL.md` 的目录 | [技能](docs/skills.md) |
105
+ | 加自己的工具 / 命令 / 事件钩子 | `extension.py` 里的 `register(api)` | [写扩展](docs/extensions.md) · [终端 UI 组件](docs/tui.md) |
106
+ | 换配色 | `theme`、`QI_THEME` | [主题](docs/themes.md) |
107
+ | 装 / 声明 / 分发扩展 | `qi install`、`settings.packages` | [扩展的安装与声明](docs/packages.md) |
108
+
109
+ 可跑的样例:[`examples/extensions/hello/`](examples/extensions/hello/) —— 一份 `extension.py` 把主要的面各走一遍。
110
+
111
+ ## 官方扩展
112
+
113
+ | 扩展 | 提供什么 | 手册 |
114
+ | --- | --- | --- |
115
+ | `qi-agents` | 角色(`agent.md`)+ 委派子任务 | [README](extensions/qi-agents/README.md) |
116
+ | `qi-mcp` | MCP server 接入(代理工具 / 直连工具) | [README](extensions/qi-mcp/README.md) |
117
+ | `qi-web` | HTTP 宿主 + 官方 Web UI | [README](extensions/qi-web/README.md) |
118
+
119
+ 装完之后:`qi list` 看装了哪些、`qi doctor` 看声明与实装是否一致。
120
+
121
+ ## 安全
122
+
123
+ 三条要知道的(完整模型见 [docs/security.md](docs/security.md)):
124
+
125
+ - **`bash` 不筛命令**:内置 bash 以 qi 进程权限执行任意命令 —— 所谓"半沙箱"最容易被误当成安全边界。
126
+ 要收紧就用工具白名单(`-t` / `-xt` / `-nt` / `-nbt`、`settings.defaultTools`,或角色 `tools:`),
127
+ 要真边界就**把 qi 放进容器 / VM / 受限用户**([docs/containerization.md](docs/containerization.md))。
128
+ - **扩展就是任意代码,角色正文是仓库控制的提示词**:只装可信来源。项目级 `.qi/extensions/` **未信任不加载**
129
+ (`qi -a` 信任、`-na` 拒绝;没表态时看 `settings.defaultProjectTrust`,`ask` 在无头下保守判不信任)。
130
+ - **凭证三源**:auth store(`~/.qi/agent/auth.json`,0600)→ 约定环境变量 → `models.json` 的 `apiKey` 引用;
131
+ 配置文件与导出包**零明文**([docs/providers.md](docs/providers.md))。
132
+
133
+ ## 文档
134
+
135
+ | 去处 | 内容 |
136
+ | --- | --- |
137
+ | [docs/index.md](docs/index.md) | **手册**:开始 / 指南(运行 · 定制 · 构建)/ 参考 |
138
+ | [docs/how-qi-works.md](docs/how-qi-works.md) | agent loop、上下文、会话、工具、信任 —— 先读这一页 |
139
+ | [design/overview.md](design/overview.md) | 总设计:架构总览、既定决策索引、技术选型、目录布局、安全总原则 |
140
+ | [design/PLAN.md](design/PLAN.md) | 开发计划、阶段表、未决清单 |
141
+ | [design/pi-alignment.md](design/pi-alignment.md) | 与上游 pi 的逐节对照(设计口径,不进手册) |
142
+ | [design/development.md](design/development.md) | 怎么跑源码 / 测试 / 静态检查 / 仓库布局 |
143
+ | [extensions/](extensions/) | 官方扩展与各自的手册 |
144
+ | [examples/](examples/) | 教学样例(不自动加载) |
145
+
146
+ **两轨边界**:`docs/` 写给**使用者与模型**(随 wheel 发布,索引会注入提示词);`design/` 写给**改动者**
147
+ (不进 wheel、不注入提示词)。扩展的手册归**扩展自己**,core 的 `docs/` 只讲机制。
148
+
149
+ ## 许可
150
+
151
+ MIT(见 [LICENSE](LICENSE))。
@@ -0,0 +1,121 @@
1
+ # qi
2
+
3
+ **用 Python 写的编码 agent 框架**。给它一个目标和一个工作目录,它会读文件、跑命令、改内容,一步步把任务做完。
4
+
5
+ **core 就是单 agent**:会话(JSONL + 分支树)、工具循环、系统提示词、CLI 与 TUI、压缩、认证都在里面;
6
+ 角色 / MCP / Web 这类增值功能全部走**扩展**,不塞进 core。
7
+
8
+ > **发行名是 `qi-coding-agent`** —— PyPI 上的 `qi-agent` 属于**别的项目**,别装错;
9
+ > import 包名仍是 `qi_agent`、命令仍是 `qi`。现在还没发布,所以以**从源码安装**为主(见下)。
10
+ > `qi-mcp` / `qi-agents` / `qi-web` 是三个独立官方 pip 包,各自带自己的手册。
11
+
12
+ ## 装
13
+
14
+ 前置:**Python ≥ 3.12** 与 [uv](https://docs.astral.sh/uv/)。
15
+
16
+ ```bash
17
+ git clone https://github.com/viewnah/qi.git
18
+ cd qi
19
+ uv sync # 把 qi 装成 editable;`uv run qi …` 直接可用
20
+ uv run qi doctor # 冒烟:配置 / 凭证 / 扩展 / 包声明,一次全报
21
+ ```
22
+
23
+ 官方扩展**按需单独装**(core 不内置、不默认装):
24
+
25
+ ```bash
26
+ pip install -e extensions/qi-agents -e extensions/qi-mcp -e extensions/qi-web
27
+ uv run qi doctor # 「声明了但没装」「装了但没声明」都在这里报出来,并给出装法
28
+ ```
29
+
30
+ **发布之后**(现在还没有)可以直接装发行版,扩展用 `--with` 一次装齐:
31
+
32
+ ```bash
33
+ uv tool install qi-coding-agent # 只装 core
34
+ uv tool install qi-coding-agent --with qi-mcp --with qi-agents
35
+ ```
36
+
37
+ 装法(自家 venv / `uv tool` / 只读解释器)与声明层(`settings.packages`)的差别见
38
+ [docs/packages.md](docs/packages.md)。
39
+
40
+ ## 快速开始
41
+
42
+ ```bash
43
+ uv run qi init # 引导:选 provider → 加模型 → 设为默认(写 models.json + settings.json + auth.json)
44
+ uv run qi init --list-presets # 看内置的预置 provider(国产为主:deepseek / qwen / kimi / glm / minimax …)
45
+ uv run qi init --preset deepseek # 一条命令物化预置并设为默认(只补缺、幂等)
46
+ uv run qi doctor # 校验配置与凭证
47
+ ```
48
+
49
+ 然后三种跑法:
50
+
51
+ ```bash
52
+ uv run qi # 交互界面(裸 qi 就是界面)
53
+ uv run qi "分析这个仓库" # 进界面,并把这句话作为首条消息发出
54
+ uv run qi -p "分析这个仓库" # 无头一次:stdout 只有答案(进度走 stderr)
55
+ uv run qi --mode json "…" # 事件流:一行一个 JSON,喂给上层程序
56
+ ```
57
+
58
+ 不用交互时:
59
+
60
+ ```bash
61
+ uv run qi init -y --provider my-proxy --model my-model \
62
+ --base-url https://my-proxy.internal/v1 --api openai-completions --api-key sk-xxx
63
+ ```
64
+
65
+ **零配置也能跑**:基座提示词在代码里,不写任何配置就是一个能用的单 agent。
66
+ 逐步说明见 [docs/quickstart.md](docs/quickstart.md)。
67
+
68
+ ## 怎么定制
69
+
70
+ | 想做 | 用 | 看 |
71
+ | --- | --- | --- |
72
+ | 改偏好(渲染模式、压缩、思考级别…) | `/settings`、`settings.json` | [设置](docs/settings.md) · [配置](docs/configuration.md) |
73
+ | 换模型 / 接本地模型 / 自建代理 | `models.json`、`qi init --preset` | [选一个模型](docs/models.md) |
74
+ | 给它一份按需加载的检查清单 | 一个含 `SKILL.md` 的目录 | [技能](docs/skills.md) |
75
+ | 加自己的工具 / 命令 / 事件钩子 | `extension.py` 里的 `register(api)` | [写扩展](docs/extensions.md) · [终端 UI 组件](docs/tui.md) |
76
+ | 换配色 | `theme`、`QI_THEME` | [主题](docs/themes.md) |
77
+ | 装 / 声明 / 分发扩展 | `qi install`、`settings.packages` | [扩展的安装与声明](docs/packages.md) |
78
+
79
+ 可跑的样例:[`examples/extensions/hello/`](examples/extensions/hello/) —— 一份 `extension.py` 把主要的面各走一遍。
80
+
81
+ ## 官方扩展
82
+
83
+ | 扩展 | 提供什么 | 手册 |
84
+ | --- | --- | --- |
85
+ | `qi-agents` | 角色(`agent.md`)+ 委派子任务 | [README](extensions/qi-agents/README.md) |
86
+ | `qi-mcp` | MCP server 接入(代理工具 / 直连工具) | [README](extensions/qi-mcp/README.md) |
87
+ | `qi-web` | HTTP 宿主 + 官方 Web UI | [README](extensions/qi-web/README.md) |
88
+
89
+ 装完之后:`qi list` 看装了哪些、`qi doctor` 看声明与实装是否一致。
90
+
91
+ ## 安全
92
+
93
+ 三条要知道的(完整模型见 [docs/security.md](docs/security.md)):
94
+
95
+ - **`bash` 不筛命令**:内置 bash 以 qi 进程权限执行任意命令 —— 所谓"半沙箱"最容易被误当成安全边界。
96
+ 要收紧就用工具白名单(`-t` / `-xt` / `-nt` / `-nbt`、`settings.defaultTools`,或角色 `tools:`),
97
+ 要真边界就**把 qi 放进容器 / VM / 受限用户**([docs/containerization.md](docs/containerization.md))。
98
+ - **扩展就是任意代码,角色正文是仓库控制的提示词**:只装可信来源。项目级 `.qi/extensions/` **未信任不加载**
99
+ (`qi -a` 信任、`-na` 拒绝;没表态时看 `settings.defaultProjectTrust`,`ask` 在无头下保守判不信任)。
100
+ - **凭证三源**:auth store(`~/.qi/agent/auth.json`,0600)→ 约定环境变量 → `models.json` 的 `apiKey` 引用;
101
+ 配置文件与导出包**零明文**([docs/providers.md](docs/providers.md))。
102
+
103
+ ## 文档
104
+
105
+ | 去处 | 内容 |
106
+ | --- | --- |
107
+ | [docs/index.md](docs/index.md) | **手册**:开始 / 指南(运行 · 定制 · 构建)/ 参考 |
108
+ | [docs/how-qi-works.md](docs/how-qi-works.md) | agent loop、上下文、会话、工具、信任 —— 先读这一页 |
109
+ | [design/overview.md](design/overview.md) | 总设计:架构总览、既定决策索引、技术选型、目录布局、安全总原则 |
110
+ | [design/PLAN.md](design/PLAN.md) | 开发计划、阶段表、未决清单 |
111
+ | [design/pi-alignment.md](design/pi-alignment.md) | 与上游 pi 的逐节对照(设计口径,不进手册) |
112
+ | [design/development.md](design/development.md) | 怎么跑源码 / 测试 / 静态检查 / 仓库布局 |
113
+ | [extensions/](extensions/) | 官方扩展与各自的手册 |
114
+ | [examples/](examples/) | 教学样例(不自动加载) |
115
+
116
+ **两轨边界**:`docs/` 写给**使用者与模型**(随 wheel 发布,索引会注入提示词);`design/` 写给**改动者**
117
+ (不进 wheel、不注入提示词)。扩展的手册归**扩展自己**,core 的 `docs/` 只讲机制。
118
+
119
+ ## 许可
120
+
121
+ MIT(见 [LICENSE](LICENSE))。