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.
- qi_coding_agent-0.1.0/.github/workflows/publish.yml +115 -0
- qi_coding_agent-0.1.0/.gitignore +35 -0
- qi_coding_agent-0.1.0/.pi-lens.json +11 -0
- qi_coding_agent-0.1.0/LICENSE +21 -0
- qi_coding_agent-0.1.0/PKG-INFO +151 -0
- qi_coding_agent-0.1.0/README.md +121 -0
- qi_coding_agent-0.1.0/design/PLAN.md +218 -0
- qi_coding_agent-0.1.0/design/agent-config-design.md +301 -0
- qi_coding_agent-0.1.0/design/bash-allowlist.md +214 -0
- qi_coding_agent-0.1.0/design/development.md +178 -0
- qi_coding_agent-0.1.0/design/dispatcher.md +101 -0
- qi_coding_agent-0.1.0/design/extensions-design.md +365 -0
- qi_coding_agent-0.1.0/design/internals.md +136 -0
- qi_coding_agent-0.1.0/design/overview.md +131 -0
- qi_coding_agent-0.1.0/design/pi-alignment.md +358 -0
- qi_coding_agent-0.1.0/design/plugins.md +81 -0
- qi_coding_agent-0.1.0/design/web.md +2762 -0
- qi_coding_agent-0.1.0/docs/cli.md +188 -0
- qi_coding_agent-0.1.0/docs/compaction.md +148 -0
- qi_coding_agent-0.1.0/docs/configuration.md +89 -0
- qi_coding_agent-0.1.0/docs/containerization.md +80 -0
- qi_coding_agent-0.1.0/docs/docs.json +1 -0
- qi_coding_agent-0.1.0/docs/environment-variables.md +47 -0
- qi_coding_agent-0.1.0/docs/extensions.md +382 -0
- qi_coding_agent-0.1.0/docs/how-qi-works.md +93 -0
- qi_coding_agent-0.1.0/docs/index.md +61 -0
- qi_coding_agent-0.1.0/docs/json.md +112 -0
- qi_coding_agent-0.1.0/docs/keybindings.md +83 -0
- qi_coding_agent-0.1.0/docs/models.md +138 -0
- qi_coding_agent-0.1.0/docs/packages.md +155 -0
- qi_coding_agent-0.1.0/docs/providers.md +288 -0
- qi_coding_agent-0.1.0/docs/quickstart.md +109 -0
- qi_coding_agent-0.1.0/docs/security.md +69 -0
- qi_coding_agent-0.1.0/docs/session-format.md +299 -0
- qi_coding_agent-0.1.0/docs/sessions.md +127 -0
- qi_coding_agent-0.1.0/docs/settings.md +138 -0
- qi_coding_agent-0.1.0/docs/skills.md +124 -0
- qi_coding_agent-0.1.0/docs/slash-commands.md +55 -0
- qi_coding_agent-0.1.0/docs/themes.md +78 -0
- qi_coding_agent-0.1.0/docs/tui.md +109 -0
- qi_coding_agent-0.1.0/docs/usage.md +112 -0
- qi_coding_agent-0.1.0/examples/agents/README.md +50 -0
- qi_coding_agent-0.1.0/examples/agents/code-analyst/agent.md +23 -0
- qi_coding_agent-0.1.0/examples/agents/code-analyst/assets/review-rules.md +7 -0
- qi_coding_agent-0.1.0/examples/agents/code-analyst/mcp.json +8 -0
- qi_coding_agent-0.1.0/examples/agents/code-analyst/skills/code-review-checklist/SKILL.md +15 -0
- qi_coding_agent-0.1.0/examples/agents/code-reviewer/agent.md +35 -0
- qi_coding_agent-0.1.0/examples/agents/data-analyst/agent.md +32 -0
- qi_coding_agent-0.1.0/examples/agents/doc-writer/agent.md +34 -0
- qi_coding_agent-0.1.0/examples/agents/doc-writer/assets/doc-style.md +10 -0
- qi_coding_agent-0.1.0/examples/agents/general/agent.md +14 -0
- qi_coding_agent-0.1.0/examples/agents/test-runner/agent.md +35 -0
- qi_coding_agent-0.1.0/examples/agents/writer/agent.md +22 -0
- qi_coding_agent-0.1.0/examples/extensions/README.md +22 -0
- qi_coding_agent-0.1.0/examples/extensions/hello/README.md +44 -0
- qi_coding_agent-0.1.0/examples/extensions/hello/extension.py +83 -0
- qi_coding_agent-0.1.0/extensions/qi-agents/README.md +160 -0
- qi_coding_agent-0.1.0/extensions/qi-agents/pyproject.toml +22 -0
- qi_coding_agent-0.1.0/extensions/qi-agents/qi_agents/__init__.py +106 -0
- qi_coding_agent-0.1.0/extensions/qi-agents/qi_agents/discovery.py +133 -0
- qi_coding_agent-0.1.0/extensions/qi-agents/qi_agents/subagent.py +296 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/README.md +172 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/pyproject.toml +19 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/__init__.py +271 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/client.py +404 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/config.py +231 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/direct.py +88 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/proxy.py +244 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/role.py +191 -0
- qi_coding_agent-0.1.0/extensions/qi-mcp/qi_mcp/servers.py +234 -0
- qi_coding_agent-0.1.0/extensions/qi-web/README.md +66 -0
- qi_coding_agent-0.1.0/extensions/qi-web/pyproject.toml +19 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/__init__.py +24 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/agui.py +402 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/app.py +856 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/browse.py +85 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/files.py +230 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/schemas.py +380 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/security.py +73 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/serve.py +188 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/state.py +127 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/static/assets/index-96aT_6NK.js +20 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/static/assets/index-DePFgopp.css +1 -0
- qi_coding_agent-0.1.0/extensions/qi-web/qi_web/static/index.html +14 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/index.html +13 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/package-lock.json +2584 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/package.json +38 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/scripts/check-design.mjs +200 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/scripts/check-dsh-tokens.mjs +344 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/App.tsx +1157 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/client.test.ts +97 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/client.ts +381 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/contract.test.ts +134 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/api/types.ts +487 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/commands.tsx +163 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/AgentMenu.tsx +177 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/CommandMenu.tsx +157 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ConfirmDialog.tsx +68 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/DirPicker.tsx +168 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Dock.tsx +412 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/FilePanel.tsx +386 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ModelMenu.test.ts +28 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ModelMenu.tsx +211 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/ProjectMenu.tsx +141 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Rail.tsx +371 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/RowMenu.tsx +165 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Rows.tsx +577 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/Settings.tsx +815 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/SidebarSection.tsx +126 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/components/icons.tsx +527 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/main.tsx +14 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/cjk.ts +100 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/markdown.test.ts +121 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/parse.ts +29 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/markdown/render.tsx +324 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/projects.test.ts +265 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/projects.ts +233 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/route.test.ts +46 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/route.ts +40 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/stats.test.ts +115 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/stats.ts +85 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/turn.test.ts +422 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/state/turn.ts +736 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/theme/app.css +3268 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/theme/theme.ts +23 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/theme/tokens.css +659 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/src/vite-env.d.ts +5 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/tsconfig.json +19 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/vite.config.ts +22 -0
- qi_coding_agent-0.1.0/extensions/qi-web/ui/vitest.config.ts +15 -0
- qi_coding_agent-0.1.0/pyproject.toml +58 -0
- qi_coding_agent-0.1.0/pyrightconfig.json +22 -0
- qi_coding_agent-0.1.0/scripts/check_versions.py +72 -0
- qi_coding_agent-0.1.0/scripts/e2e_ui_model.py +392 -0
- qi_coding_agent-0.1.0/scripts/prune_empty_sessions.py +152 -0
- qi_coding_agent-0.1.0/src/qi_agent/__init__.py +18 -0
- qi_coding_agent-0.1.0/src/qi_agent/abort.py +40 -0
- qi_coding_agent-0.1.0/src/qi_agent/auth.py +216 -0
- qi_coding_agent-0.1.0/src/qi_agent/cli.py +2178 -0
- qi_coding_agent-0.1.0/src/qi_agent/compaction.py +475 -0
- qi_coding_agent-0.1.0/src/qi_agent/config.py +409 -0
- qi_coding_agent-0.1.0/src/qi_agent/export_html.py +95 -0
- qi_coding_agent-0.1.0/src/qi_agent/extensions.py +2267 -0
- qi_coding_agent-0.1.0/src/qi_agent/llm.py +609 -0
- qi_coding_agent-0.1.0/src/qi_agent/loader.py +299 -0
- qi_coding_agent-0.1.0/src/qi_agent/model_catalog.py +108 -0
- qi_coding_agent-0.1.0/src/qi_agent/models.py +103 -0
- qi_coding_agent-0.1.0/src/qi_agent/packages.py +430 -0
- qi_coding_agent-0.1.0/src/qi_agent/paths.py +242 -0
- qi_coding_agent-0.1.0/src/qi_agent/pep723.py +74 -0
- qi_coding_agent-0.1.0/src/qi_agent/presets.py +293 -0
- qi_coding_agent-0.1.0/src/qi_agent/prompt.py +150 -0
- qi_coding_agent-0.1.0/src/qi_agent/registry.py +485 -0
- qi_coding_agent-0.1.0/src/qi_agent/runner.py +584 -0
- qi_coding_agent-0.1.0/src/qi_agent/runtime.py +1940 -0
- qi_coding_agent-0.1.0/src/qi_agent/session.py +739 -0
- qi_coding_agent-0.1.0/src/qi_agent/settings.py +501 -0
- qi_coding_agent-0.1.0/src/qi_agent/share.py +111 -0
- qi_coding_agent-0.1.0/src/qi_agent/system_prompt.py +278 -0
- qi_coding_agent-0.1.0/src/qi_agent/theme.py +389 -0
- qi_coding_agent-0.1.0/src/qi_agent/themes/dark.json +90 -0
- qi_coding_agent-0.1.0/src/qi_agent/themes/light.json +89 -0
- qi_coding_agent-0.1.0/src/qi_agent/titling.py +90 -0
- qi_coding_agent-0.1.0/src/qi_agent/tools/__init__.py +349 -0
- qi_coding_agent-0.1.0/src/qi_agent/tools/shell.py +276 -0
- qi_coding_agent-0.1.0/src/qi_agent/trust.py +106 -0
- qi_coding_agent-0.1.0/src/qi_agent/tui.py +6224 -0
- qi_coding_agent-0.1.0/src/qi_agent/workspaces.py +116 -0
- qi_coding_agent-0.1.0/tests/conftest.py +110 -0
- qi_coding_agent-0.1.0/tests/test_branch_summary_prompt.py +137 -0
- qi_coding_agent-0.1.0/tests/test_browse.py +77 -0
- qi_coding_agent-0.1.0/tests/test_cli_init.py +338 -0
- qi_coding_agent-0.1.0/tests/test_cli_install.py +236 -0
- qi_coding_agent-0.1.0/tests/test_cli_pi_alignment.py +399 -0
- qi_coding_agent-0.1.0/tests/test_cli_run.py +248 -0
- qi_coding_agent-0.1.0/tests/test_cli_tool_flags.py +296 -0
- qi_coding_agent-0.1.0/tests/test_compaction.py +515 -0
- qi_coding_agent-0.1.0/tests/test_compaction_events.py +180 -0
- qi_coding_agent-0.1.0/tests/test_config.py +181 -0
- qi_coding_agent-0.1.0/tests/test_config_resources.py +214 -0
- qi_coding_agent-0.1.0/tests/test_contract_p0.py +531 -0
- qi_coding_agent-0.1.0/tests/test_docs_injection.py +201 -0
- qi_coding_agent-0.1.0/tests/test_doctor_extensions.py +108 -0
- qi_coding_agent-0.1.0/tests/test_example_extension.py +139 -0
- qi_coding_agent-0.1.0/tests/test_export_html.py +112 -0
- qi_coding_agent-0.1.0/tests/test_extension_alignment.py +563 -0
- qi_coding_agent-0.1.0/tests/test_extension_bus.py +418 -0
- qi_coding_agent-0.1.0/tests/test_extension_cli_commands.py +209 -0
- qi_coding_agent-0.1.0/tests/test_extension_commands.py +414 -0
- qi_coding_agent-0.1.0/tests/test_extension_deps.py +169 -0
- qi_coding_agent-0.1.0/tests/test_extension_entry_points.py +100 -0
- qi_coding_agent-0.1.0/tests/test_extension_events.py +332 -0
- qi_coding_agent-0.1.0/tests/test_extension_exclusions.py +135 -0
- qi_coding_agent-0.1.0/tests/test_extension_flags.py +412 -0
- qi_coding_agent-0.1.0/tests/test_extension_interop.py +262 -0
- qi_coding_agent-0.1.0/tests/test_extension_messages.py +269 -0
- qi_coding_agent-0.1.0/tests/test_extension_model.py +312 -0
- qi_coding_agent-0.1.0/tests/test_extension_resolvers.py +209 -0
- qi_coding_agent-0.1.0/tests/test_extension_run_agent.py +277 -0
- qi_coding_agent-0.1.0/tests/test_extension_runner_events.py +330 -0
- qi_coding_agent-0.1.0/tests/test_extension_session.py +270 -0
- qi_coding_agent-0.1.0/tests/test_extension_tools.py +243 -0
- qi_coding_agent-0.1.0/tests/test_extension_ui.py +391 -0
- qi_coding_agent-0.1.0/tests/test_extensions.py +395 -0
- qi_coding_agent-0.1.0/tests/test_interrupt.py +480 -0
- qi_coding_agent-0.1.0/tests/test_litellm_offline.py +80 -0
- qi_coding_agent-0.1.0/tests/test_missing_extension_hints.py +147 -0
- qi_coding_agent-0.1.0/tests/test_model_catalog.py +306 -0
- qi_coding_agent-0.1.0/tests/test_model_thinking_levels.py +156 -0
- qi_coding_agent-0.1.0/tests/test_package_resource_toggle.py +156 -0
- qi_coding_agent-0.1.0/tests/test_packages.py +121 -0
- qi_coding_agent-0.1.0/tests/test_pep723.py +109 -0
- qi_coding_agent-0.1.0/tests/test_presets.py +403 -0
- qi_coding_agent-0.1.0/tests/test_prune_empty_sessions.py +172 -0
- qi_coding_agent-0.1.0/tests/test_qi_agents_extension.py +441 -0
- qi_coding_agent-0.1.0/tests/test_qi_mcp_config.py +434 -0
- qi_coding_agent-0.1.0/tests/test_qi_mcp_direct.py +339 -0
- qi_coding_agent-0.1.0/tests/test_qi_mcp_http.py +183 -0
- qi_coding_agent-0.1.0/tests/test_qi_mcp_proxy.py +435 -0
- qi_coding_agent-0.1.0/tests/test_qi_mcp_role.py +290 -0
- qi_coding_agent-0.1.0/tests/test_qi_mcp_stdio.py +577 -0
- qi_coding_agent-0.1.0/tests/test_runner_core.py +100 -0
- qi_coding_agent-0.1.0/tests/test_session_model_entries.py +504 -0
- qi_coding_agent-0.1.0/tests/test_session_store.py +378 -0
- qi_coding_agent-0.1.0/tests/test_session_tree.py +260 -0
- qi_coding_agent-0.1.0/tests/test_settings_skills.py +555 -0
- qi_coding_agent-0.1.0/tests/test_share.py +155 -0
- qi_coding_agent-0.1.0/tests/test_shell.py +305 -0
- qi_coding_agent-0.1.0/tests/test_skill_commands.py +72 -0
- qi_coding_agent-0.1.0/tests/test_streaming.py +499 -0
- qi_coding_agent-0.1.0/tests/test_system_prompt.py +314 -0
- qi_coding_agent-0.1.0/tests/test_theme.py +130 -0
- qi_coding_agent-0.1.0/tests/test_thinking.py +590 -0
- qi_coding_agent-0.1.0/tests/test_thinking_budgets.py +114 -0
- qi_coding_agent-0.1.0/tests/test_titling.py +209 -0
- qi_coding_agent-0.1.0/tests/test_tool_execution_mode.py +207 -0
- qi_coding_agent-0.1.0/tests/test_trust_scope.py +290 -0
- qi_coding_agent-0.1.0/tests/test_tui_extension_render.py +456 -0
- qi_coding_agent-0.1.0/tests/test_tui_model_restore.py +143 -0
- qi_coding_agent-0.1.0/tests/test_tui_smoke.py +276 -0
- qi_coding_agent-0.1.0/tests/test_tui_style.py +3028 -0
- qi_coding_agent-0.1.0/tests/test_web_api.py +1108 -0
- qi_coding_agent-0.1.0/tests/test_web_extensions_api.py +336 -0
- qi_coding_agent-0.1.0/tests/test_web_files.py +250 -0
- qi_coding_agent-0.1.0/tests/test_workspaces.py +86 -0
- 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,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))。
|