qi-coding-agent 0.2.1__tar.gz → 0.3.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.2.1 → qi_coding_agent-0.3.0}/PKG-INFO +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/PLAN.md +3 -3
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/agent-config-design.md +6 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/extensions-design.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/internals.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/overview.md +4 -4
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/pi-alignment.md +4 -4
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/plugins.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/web.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/configuration.md +10 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/environment-variables.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/extensions.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/how-qi-works.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/models.md +3 -3
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/packages.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/providers.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/security.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/settings.md +10 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/skills.md +6 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-agents/pyproject.toml +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/pyproject.toml +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/pyproject.toml +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/pyproject.toml +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/__init__.py +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/cli.py +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/config.py +3 -3
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/loader.py +6 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/paths.py +37 -8
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/settings.py +1 -1
- qi_coding_agent-0.3.0/tests/test_project_root.py +72 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_system_prompt.py +6 -4
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/.github/workflows/publish.yml +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/.gitignore +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/.pi-lens.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/LICENSE +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/THIRD_PARTY_NOTICES.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/bash-allowlist.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/development.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/design/dispatcher.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/cli.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/compaction.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/containerization.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/docs.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/index.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/json.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/keybindings.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/quickstart.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/session-format.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/sessions.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/slash-commands.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/themes.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/tui.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/docs/usage.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/code-analyst/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/code-analyst/assets/review-rules.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/code-analyst/mcp.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/code-analyst/skills/code-review-checklist/SKILL.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/code-reviewer/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/data-analyst/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/doc-writer/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/doc-writer/assets/doc-style.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/general/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/test-runner/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/agents/writer/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/extensions/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/extensions/hello/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/examples/extensions/hello/extension.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-agents/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-agents/qi_agents/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-agents/qi_agents/discovery.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-agents/qi_agents/subagent.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/client.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/config.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/direct.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/proxy.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/role.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-mcp/qi_mcp/servers.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/agui.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/app.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/browse.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/files.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/schemas.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/security.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/serve.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/state.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/static/assets/index-96aT_6NK.js +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/static/assets/index-DePFgopp.css +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/qi_web/static/index.html +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/index.html +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/package-lock.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/package.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/scripts/check-design.mjs +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/scripts/check-dsh-tokens.mjs +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/App.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/api/client.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/api/client.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/api/contract.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/api/types.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/commands.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/AgentMenu.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/CommandMenu.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/ConfirmDialog.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/DirPicker.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/Dock.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/FilePanel.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/ModelMenu.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/ModelMenu.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/ProjectMenu.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/Rail.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/RowMenu.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/Rows.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/Settings.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/SidebarSection.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/components/icons.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/main.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/markdown/cjk.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/markdown/markdown.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/markdown/parse.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/markdown/render.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/projects.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/projects.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/route.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/route.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/stats.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/stats.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/turn.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/state/turn.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/theme/app.css +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/theme/theme.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/theme/tokens.css +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/src/vite-env.d.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/tsconfig.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/vite.config.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/extensions/qi-web/ui/vitest.config.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/pyrightconfig.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/scripts/check_versions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/scripts/e2e_ui_model.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/scripts/prune_empty_sessions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/abort.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/auth.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/compaction.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/export_html.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/extensions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/llm.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/model_catalog.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/models.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/packages.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/pep723.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/presets.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/prompt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/registry.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/runner.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/runtime.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/session.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/share.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/system_prompt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/theme.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/themes/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/themes/dark.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/themes/light.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/titling.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/tools/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/tools/shell.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/trust.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/tui.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/src/qi_agent/workspaces.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/conftest.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_auth_key.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_branch_summary_prompt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_browse.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_cli_init.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_cli_install.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_cli_pi_alignment.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_cli_run.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_cli_tool_flags.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_compaction.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_compaction_events.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_config.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_config_resources.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_contract_p0.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_docs_injection.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_doctor_extensions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_example_extension.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_export_html.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_alignment.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_bus.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_cli_commands.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_commands.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_deps.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_entry_points.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_events.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_exclusions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_flags.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_interop.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_messages.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_model.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_resolvers.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_run_agent.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_runner_events.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_session.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_tools.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extension_ui.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_extensions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_interrupt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_litellm_offline.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_missing_extension_hints.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_model_catalog.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_model_thinking_levels.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_package_resource_toggle.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_packages.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_pep723.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_presets.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_prune_empty_sessions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_agents_extension.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_mcp_config.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_mcp_direct.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_mcp_http.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_mcp_proxy.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_mcp_role.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_qi_mcp_stdio.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_runner_core.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_session_model_entries.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_session_store.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_session_tree.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_settings_skills.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_share.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_shell.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_skill_commands.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_streaming.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_theme.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_thinking.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_thinking_budgets.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_third_party_notices.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_titling.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_tool_execution_mode.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_trust_scope.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_tui_extension_render.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_tui_model_restore.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_tui_no_model.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_tui_smoke.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_tui_style.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_web_api.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_web_extensions_api.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_web_files.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/tests/test_workspaces.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.3.0}/uv.lock +0 -0
|
@@ -173,10 +173,10 @@ testpaths = ["tests"]
|
|
|
173
173
|
| B9 | agent.md icon | 不进 v1 |
|
|
174
174
|
| B10 | 样例 | examples/ 加 writer + general(演示 auto 多角色) |
|
|
175
175
|
| A7 | 凭证存储 | auth store `~/.qi/agent/auth.json`(0600,git 不跟踪);解析顺序 auth store → 约定 env → models.json `apiKey` 引用;`qi auth login/logout/list` + 只读三件套 `print-api-key` / `print-bearer-token` / `check`(退出码对齐 pi:0/1/2)、`qi init` 引导 |
|
|
176
|
-
| A8 | 全局目录层级 | `~/.qi/agent/` ↔
|
|
176
|
+
| A8 | 全局目录层级 | `~/.qi/agent/` ↔ `<cwd>/.qi` 配对(对齐 pi 的 `~/.pi/agent` ↔ `.pi`);旧扁平布局启动时自动迁移(不覆盖);`QI_AGENT_HOME` = agent 目录、`QI_CONFIG_DIR` = 名字空间根 |
|
|
177
177
|
| A9 | 设置文件 | `settings.json` 两级深合并、数组整体替换;默认模型只属于 settings(`models.json` 里已不读取);字段清单与“仅存储未生效”清单见 [settings.md](../docs/settings.md);`qi config` 读写 |
|
|
178
|
-
| A10 | 顶层技能 | 六级来源(低→高):`~/.agents/skills` → `~/.qi/agent/skills` → user `settings.skills` → 项目 `.agents/skills` 祖先链 → `<
|
|
179
|
-
| A11 | 系统提示词 | 默认基座**代码内**(`system_prompt.py`,按解析后的工具集生成「可用工具 / 指南」+ **手册索引**);`SYSTEM.md` **整体替换**默认基座(项目 > 全局);之后动态追加 `<project_context>`(AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD,全局 +
|
|
178
|
+
| A10 | 顶层技能 | 六级来源(低→高):`~/.agents/skills` → `~/.qi/agent/skills` → user `settings.skills` → 项目 `.agents/skills` 祖先链 → `<cwd>/.qi/skills` → project `settings.skills`;agent 自带者最高;同层同名报错、跳层覆盖;排除项作用于整个发现集 |
|
|
179
|
+
| A11 | 系统提示词 | 默认基座**代码内**(`system_prompt.py`,按解析后的工具集生成「可用工具 / 指南」+ **手册索引**);`SYSTEM.md` **整体替换**默认基座(项目 > 全局);之后动态追加 `<project_context>`(AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD,全局 + 祖先链至文件系统根)→ `<available_skills>` XML(无 `read`/`bash` 则不注入)→ cwd → `--append-system-prompt`。角色层与数据源**不在 core**(归 qi-agents / 提供方扩展)。详见 [configuration.md](../docs/configuration.md) |
|
|
180
180
|
| A12 | 轮次 / 超时 / 中断 | **对齐 pi:runner 里既不设轮次上限,也不套回合级请求超时** —— 循环是 `while True`,退出靠模型不再调工具 / 中止 / 嵌入方谓词 `stop_after`(pi 的 `shouldStopAfterTurn` 同形,默认 `None` = 不限)。**qi 自己从不传谓词**(pi-coding-agent 也从不实现那个钩子):交互式靠 `escape` / 客户端断开,无头靠 `SIGTERM`/`SIGHUP` → `kill_live_children()` + `exit(143/129)`(对齐 pi 的 `killTrackedDetachedChildren`)。请求级超时与重试归 **provider 层**(`settings.json` 的 `retry.provider.timeoutMs` / `maxRetries` → litellm `timeout` / `num_retries`;对齐 pi 的 `getProviderRetrySettings`)。中断是**协作式**(`abort.py` 的 `AbortSignal`):未执行的 tool_call 补“已中断”结果、半截回答照常落盘、照常发 `agent_end`(data 带 `aborted`);TUI `escape` 宽限 3s 后 `cancel_all()` 兜底;硬取消(`CancelledError`,含 SIGINT/ASGI 取消)也先落盘再抛 |
|
|
181
181
|
|
|
182
182
|
### 仍待定(v2 + 实现期)
|
|
@@ -49,7 +49,7 @@ agent 只可能出现在 **3 个位置**,目录名都用 `agents/`:
|
|
|
49
49
|
| --- | --- | --- |
|
|
50
50
|
| 包内置 `qi_agent/builtin/agents/` | 框架自带兜底(仅 `general`),随 wheel 发布 | 最低 |
|
|
51
51
|
| `~/.qi/agent/agents/` | 全局(所有项目可用) | 中 |
|
|
52
|
-
|
|
|
52
|
+
| `<cwd>/.qi/agents/` | 项目私有(跟 cwd 走,可提交共享) | **高** |
|
|
53
53
|
|
|
54
54
|
同名规则:
|
|
55
55
|
|
|
@@ -127,7 +127,7 @@ opening:
|
|
|
127
127
|
| 2 | `~/.qi/agent/skills/` | `qi-global` | 认 |
|
|
128
128
|
| 3 | user `settings.json` 的 `skills[]` | `settings-global` | 认 |
|
|
129
129
|
| 4 | `.agents/skills/`(cwd → git 根,远→近) | `agents-project` | 忽略 |
|
|
130
|
-
| 5 | `<
|
|
130
|
+
| 5 | `<cwd>/.qi/skills/` | `qi-project` | 认 |
|
|
131
131
|
| 6 | project `settings.json` 的 `skills[]` | `settings-project` | 认 |
|
|
132
132
|
|
|
133
133
|
- **agent 自带技能优先级最高**:同名时覆盖顶层 —— 越具体越优先。
|
|
@@ -142,7 +142,7 @@ opening:
|
|
|
142
142
|
## 6. 装载与校验流程
|
|
143
143
|
|
|
144
144
|
```text
|
|
145
|
-
扫 ~/.qi/agent/agents/ 与
|
|
145
|
+
扫 ~/.qi/agent/agents/ 与 <cwd>/.qi/agents/(项目优先,同名警告)
|
|
146
146
|
→ 每个 <name>/ 解析 agent.md:
|
|
147
147
|
frontmatter → AgentConfig(pydantic)
|
|
148
148
|
校验: name==目录名 / description 非空 / tools 存在于 ToolCatalog
|
|
@@ -175,7 +175,7 @@ AgentUnit("code-analyst")
|
|
|
175
175
|
| 来源 | 位置 | 可见性 |
|
|
176
176
|
| --- | --- | --- |
|
|
177
177
|
| 全局 server | `~/.qi/agent/mcp.json`(共享基建,凭证仅 env 引用) | 按 agent 声明绑定 |
|
|
178
|
-
| 项目 server | `<
|
|
178
|
+
| 项目 server | `<cwd>/.qi/mcp.json`(跟项目走,可提交共享) | 按 agent 声明绑定 |
|
|
179
179
|
| 私有 server | agent 目录内 `mcp.json`(拷贝即走) | **仅该 agent**,自动绑定 |
|
|
180
180
|
|
|
181
181
|
三处**同一份格式**(`{"mcpServers": {…}}`),共用一个解析器(`loader.read_mcp_file`)。
|
|
@@ -281,7 +281,7 @@ qi agents import skill:path/to/skill # 包装成私有技能进目标 agent
|
|
|
281
281
|
| agent 形态 | 目录形式 `agents/<name>/`,入口固定 `agent.md` |
|
|
282
282
|
| include 机制 | frontmatter `include: [...]` 拼入 system prompt(显式) |
|
|
283
283
|
| 通用小能力 | 做成**全局代码工具**,不做成技能 |
|
|
284
|
-
| 存放位置 | 3 处:包内置 `qi_agent/builtin/agents/` + `~/.qi/agent/agents/` +
|
|
284
|
+
| 存放位置 | 3 处:包内置 `qi_agent/builtin/agents/` + `~/.qi/agent/agents/` + `<cwd>/.qi/agents/`;无 env 层 |
|
|
285
285
|
| 覆盖规则 | 项目 > 用户 > 内置(静默覆盖,不警告);同层重复报错 |
|
|
286
286
|
| 目录命名 | 隐藏目录 `.qi`(全局 `~/.qi`,项目 `.qi`),对齐 pi 的 `.pi` |
|
|
287
287
|
| 内置内容 | 内置 1 个 `general` 兜底 agent(零配置可执行的前提);**不内置技能**;示例放 `examples/agents/`,不自动加载 |
|
|
@@ -289,7 +289,7 @@ qi agents import skill:path/to/skill # 包装成私有技能进目标 agent
|
|
|
289
289
|
| 无内置技能 | 撤销"内置技能覆盖"问题(H4 moot) |
|
|
290
290
|
| opening 字段 | v1 补充:message(agent 开场白,进会话历史)+ suggestions(UI 层快捷提问,不进历史) |
|
|
291
291
|
| 执行参数 | model / temperature 不进 agent.md;模型归 `models.json` + `settings.json`。轮次不是字段而是**谓词**:`RunnerSettings.stop_after`(pi 的 `shouldStopAfterTurn` 同形,默认 `None` = 不限),**qi 自己不传**(同 pi 定义了却不实现)。请求级超时/重试也不在 agent 层:归 provider SDK(`settings.json` 的 `retry.provider`,见 [settings.md](../docs/settings.md)) |
|
|
292
|
-
| MCP | **v1**:私有 mcp.json 仅本 agent 自动绑定;全局(`~/.qi/agent/mcp.json`)+ 项目(`<
|
|
292
|
+
| MCP | **v1**:私有 mcp.json 仅本 agent 自动绑定;全局(`~/.qi/agent/mcp.json`)+ 项目(`<cwd>/.qi/mcp.json`)两张声明表按 `mcp_servers` 声明绑定,**默认无、显式声明**(凭证敏感);同名项目覆盖全局;凭证仅 env 引用 |
|
|
293
293
|
| 数据源 | 实例在 agent 目录 data_sources.json(私有自动绑定,凭证 env);工具/type 能力由 db 插件提供,装载门控见 [plugins.md](plugins.md) |
|
|
294
294
|
| 导入/导出 | agent 自包含目录;import = 拷贝 + 复用装载校验器预检 + 明文凭证扫描;export 产物可直接 import |
|
|
295
295
|
|
|
@@ -228,7 +228,7 @@ tools = await api.resolveTools("mcp_servers", scope=role_dir) # 新增;没人
|
|
|
228
228
|
- **因此角色的 `tools:` 白名单支持通配**:`tools: read, grep, mcp__github__*` —— 这也是唯一让
|
|
229
229
|
“角色只拿到某个 server 的工具”写得出来的办法(逐条列工具名会在 server 升级后失效)。
|
|
230
230
|
|
|
231
|
-
**作用域三层**(沿用 v1,勿改):全局 `~/.qi/agent/mcp.json` → 项目 `<
|
|
231
|
+
**作用域三层**(沿用 v1,勿改):全局 `~/.qi/agent/mcp.json` → 项目 `<cwd>/.qi/mcp.json`
|
|
232
232
|
(同名覆盖全局)→ **agent 私有** `<agent 目录>/mcp.json`(自动绑定,只本角色可见)。
|
|
233
233
|
|
|
234
234
|
**边界澄清(易混,写下来免得绕回去)** —— 分工不是“谁读那个文件”,而是**“谁知道 `mcp.json`
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
有 `bash`/`powershell` 但没有 `grep`/`find`/`ls` 时给"用 shell 做文件操作",措辞分三种)。
|
|
16
16
|
- 基座来源解析:`loader.resolve_base_prompt()` → `("", "builtin")` 表示用代码内默认;
|
|
17
17
|
项目 > 用户 > 内置,**取第一个非空文件**(空文件/读失败视为未配置)。
|
|
18
|
-
- 项目上下文:`paths.
|
|
18
|
+
- 项目上下文:`paths.context_file_ancestors()`(全局 + 祖先链,**走到文件系统根**,按路径去重),
|
|
19
19
|
每级目录按 `AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD` 取第一个命中。
|
|
20
20
|
- 技能块:只给 name / description / location 的 XML;有 `read` 就说"用 read 读全文",只有 `bash` 就说 bash;
|
|
21
21
|
两者都没有 → 整块不注入。相对路径以 SKILL.md 所在目录为基准解析,并在工具命令里用绝对路径。
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
| `APPEND_SYSTEM.md` | 不实现;追加走 `--append-system-prompt` 或写进 `SYSTEM.md` |
|
|
35
35
|
| 空文件 | 视为未配置,继续向下找;不产生空基座 |
|
|
36
36
|
| 工具清单 | 列**解析后**的工具集(模型可调用全集);不写"你可能还有其他工具" |
|
|
37
|
-
| 项目上下文 | 候选顺序 + 全局/祖先链 +
|
|
37
|
+
| 项目上下文 | 候选顺序 + 全局/祖先链 + 走到文件系统根;空文件跳过;**不需要项目信任** |
|
|
38
38
|
| 技能注入 | XML(含 location);无 `read`/`bash` 则整块不注入 |
|
|
39
39
|
| 自身文档索引 | 由 `docs.json` 生成;两处目录都找不到就整块不注入 |
|
|
40
40
|
| 模板化 | 不做 `{{cwd}}` 之类占位符;动态块由代码追加 |
|
|
@@ -41,7 +41,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
41
41
|
| 概念 | 结论 | 详见 |
|
|
42
42
|
| --- | --- | --- |
|
|
43
43
|
| agent | **内容**:自包含目录 `agents/<name>/`(`agent.md` + `skills/` + `mcp.json`);frontmatter + 正文即 system prompt。**v3 归 qi-agents** | [qi-agents README](../extensions/qi-agents/README.md) |
|
|
44
|
-
| agent 位置 | **2 处**:`~/.qi/agent/agents/` →
|
|
44
|
+
| agent 位置 | **2 处**:`~/.qi/agent/agents/` → `<cwd>/.qi/agents/`(v1 还有"包内置 `general`"那层,P-E4c 删除);项目覆盖全局;同层重复报错 | [agent-config-design.md §3](agent-config-design.md) |
|
|
45
45
|
| agent.md 字段 | **v3 只有 `name` / `description` / `tools` / `model`**;`tools: None` = **继承父**(不是"全部":那会提权)。v1 还有 `display_name` / `keywords` / `include` / `opening` | [agent-config-design.md §4](agent-config-design.md) |
|
|
46
46
|
| 技能 | 私有自动绑定、渐进披露、无内置共享库;同一 agent 内同名报错 | [skills.md](../docs/skills.md) |
|
|
47
47
|
| MCP | 全局 `~/.qi/agent/mcp.json` + 项目 `.qi/mcp.json`(项目覆盖全局)+ 角色私有 `mcp.json`;角色能不能用由它的 `tools:` 里写什么决定(**默认拒绝**) | [qi-mcp README](../extensions/qi-mcp/README.md) |
|
|
@@ -79,7 +79,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
79
79
|
|
|
80
80
|
## 4. 目录布局(运行时)
|
|
81
81
|
|
|
82
|
-
全局侧比项目侧深一层,与 pi 同构:`~/.pi/agent/` ↔
|
|
82
|
+
全局侧比项目侧深一层,与 pi 同构:`~/.pi/agent/` ↔ `<cwd>/.pi/`。全部用户级状态都挂在 `agent/` 下,
|
|
83
83
|
`~/.qi` 本身只是名字空间外壳(`QI_CONFIG_DIR` 可改)。
|
|
84
84
|
|
|
85
85
|
```text
|
|
@@ -96,7 +96,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
96
96
|
├── mcp.json # 全局 MCP 声明 —— 读它的扩展:qi-mcp
|
|
97
97
|
└── sessions/*.jsonl # 会话
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
<cwd>/.qi/ # 项目级 = **当前目录**(对齐 pi 的 `<cwd>/.pi/`;扁平,与 ~/.qi/agent 配对)
|
|
100
100
|
├── settings.json # 覆盖全局(深合并;数组整体替换)
|
|
101
101
|
├── models.json
|
|
102
102
|
├── skills/ agents/ extensions/
|
|
@@ -110,7 +110,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
110
110
|
> `agent/` 与 `extensions/`,只在目标不存在时搬,绝不覆盖。
|
|
111
111
|
>
|
|
112
112
|
> 提示词的两个入口不要混:`SYSTEM.md` **整体替换**默认基座(项目 > 全局 > 代码内默认);
|
|
113
|
-
> `AGENTS.md` / `CLAUDE.md`(全局 `~/.qi/agent/` +
|
|
113
|
+
> `AGENTS.md` / `CLAUDE.md`(全局 `~/.qi/agent/` + cwd 及各级祖先,走到文件系统根)则作为
|
|
114
114
|
> `<project_context>` **追加**。两者与角色层、技能、工作目录的推出顺序见
|
|
115
115
|
> [configuration.md](../docs/configuration.md)。
|
|
116
116
|
|
|
@@ -132,7 +132,7 @@ qi 在这一层**刻意与 pi 保持一致**:字段名、命令名、`/tree` 语
|
|
|
132
132
|
| | pi | qi |
|
|
133
133
|
| --- | --- | --- |
|
|
134
134
|
| 发现规则 | `~/.agents/skills` + 项目 `.agents/skills`(递归、含 SKILL.md 即技能) | 同构(第 1、4 层) |
|
|
135
|
-
| 私有层 | 无 | **多 4 层**:`~/.qi/agent/skills`、`<
|
|
135
|
+
| 私有层 | 无 | **多 4 层**:`~/.qi/agent/skills`、`<cwd>/.qi/skills`、以及两侧 `settings.skills[]` |
|
|
136
136
|
| 注入方式 | `<available_skills>` + 渐进披露 | 同(共用同一形态) |
|
|
137
137
|
| `--skill` / `--no-skills` | 有 | 同,且组合语义一致(`--no-skills` 不影响 `--skill`) |
|
|
138
138
|
| 同层同名 | 报错 | 同 |
|
|
@@ -150,10 +150,10 @@ pi 里其实是两个正交概念:编译进 dist 的**默认 prompt**(代码内
|
|
|
150
150
|
| | pi 0.85.1 | qi v2 |
|
|
151
151
|
| --- | --- | --- |
|
|
152
152
|
| 默认基座 | 代码内字符串 + 运行时拼接 | `src/qi_agent/system_prompt.py`(同样代码内) |
|
|
153
|
-
| 覆盖 | `SYSTEM.md` **整体替换**默认 prompt | 同左(
|
|
153
|
+
| 覆盖 | `SYSTEM.md` **整体替换**默认 prompt | 同左(`<cwd>/.qi/SYSTEM.md` > `~/.qi/agent/SYSTEM.md`) |
|
|
154
154
|
| 追加 | `APPEND_SYSTEM.md` | **不实现**(v1 决策保留;需要时用 `SYSTEM.md` 写全;命令行侧有 `--append-system-prompt`) |
|
|
155
155
|
| 动态块 | 工具清单、条件化 guidelines、`<project_context>`、`<available_skills>`、cwd | 同左;v1 还多过**数据源清单**与**角色层**两项 qi 独有内容,两者随 P-E4c 移出 core(角色层现由 qi-agents 经 `before_agent_start` 注入) |
|
|
156
|
-
| 祖先链边界 | 走到文件系统根 |
|
|
156
|
+
| 祖先链边界 | 走到文件系统根 | **走到文件系统根**(与 pi 一致;`.agents/skills` 那条另止于 git 根) |
|
|
157
157
|
| 自身文档索引 | README/docs/examples 绝对路径 + 12 条指路 | 从 `docs/docs.json` 的 navigation 生成(见 [configuration.md](../docs/configuration.md)) |
|
|
158
158
|
|
|
159
159
|
## 10. 开发与测试(原 `development.md` §7)
|
|
@@ -341,7 +341,7 @@ pi 的 `~/.pi/agent/models-store.json` 不是用户配置,而是**远程模型
|
|
|
341
341
|
| --- | --- |
|
|
342
342
|
| `cli.md` | 头部「参数尽量与 pi 保持一致」;§1/§2/§4/§5/§6 表格的「pi 对齐」整列(逐个开关的命令名/✅ 对照);各单元格里的出处注(`Print response and exit`、`pi --tools`/`-xt`/`-nbt`/`-nt`、`pi -e`、`pi --models`、`pi --api-key`、`pi -ne`/`-nc`、`pi config`、`pi /login` `/logout`、`pi auth print-*`/`check` 的 0/1/2 退出码);§3 `remove`「与 pi 同义」、`update` 默认「pi 同默认」、`--models` 拉远端目录;§4「面板/清单范围与 pi 逐字相同」、`--no-refresh` 为兼容 pi 命令面;§7 `--offline` 对齐 pi 的语义、输出约定与轮次/中断表的 pi 对照(`killTrackedDetachedChildren`、`shouldStopAfterTurn`);§8 二期「pi 能当场换渲染器」 |
|
|
343
343
|
| `how-qi-works.md` | 标题「8 个对齐 pi core tools」;`find` 与 `glob` 的命名分歧(hikqin/pi);`powershell`「pi 同款、参数与 UTF-8 前缀照搬 pi」;shell 解析顺序对齐 pi(`utils/shell.js`、`commandTransport`);`edit` 按 pi 精确编辑;截断策略对齐 pi 的 `output-accumulator`;会话环境变量对齐 `exposeSessionEnvironment`;bash 无过滤「与 pi 取向一致」+ pi `docs/security.md` 引文;`--tools`/`defaultTools` 对齐;`shellPath` 对齐;stdin 对齐 pi 的 `ignore`;容器化路线;文件工具路径限会话目录「与 pi 同为进程权限模型」;真实文件系统「pi 路线」;变更记录「与 pi 对齐」 |
|
|
344
|
-
| `settings.md` | 「文件位置与字段名对齐 pi」;全局/项目配对 `~/.pi/agent/` ↔
|
|
344
|
+
| `settings.md` | 「文件位置与字段名对齐 pi」;全局/项目配对 `~/.pi/agent/` ↔ `<cwd>/.pi/`;数组整体替换「与 pi 一致」;`shellPath`/`skillsEnabled`/`enableSkillCommands`/`editorPaddingX`/`outputPad`/`autocompleteMaxVisible` 的 pi 默认值;`tuiMode`「qi 默认与 pi 不同(pi 默认 regular)」;第二张表的「pi 中的用途」列;`branchSummary`(pi 的 defaults to no summary);`thinkingBudgets`(pi 另有内置默认表);`defaultThinkingLevel`(`DEFAULT_THINKING_LEVEL`);`defaultTools`「pi 同义」;`retry.provider`(`getProviderRetrySettings`,pi 用毫秒);`retry.enabled`/`maxRetryDelayMs`(pi 有回合级退避重试);`extensions`「对齐 pi」 |
|
|
345
345
|
| `configuration.md` | 头部「对齐 pi 的 `core/system-prompt.js`」;「与 pi 的差异(语义)」小节;§3「pi 同款行为」;§4 三处(「不写 pi 那句"你可能还有别的工具"」、pi 的条件化 guidelines、措辞「与 pi 同形」);§5 三处(「对齐 pi」、「pi 会注入空块」、pi 的 `git worktree` 影子去重);§6 三处(「pi 式 XML」×2、「pi 同款」);§6.1 标题「pi 的 `Additional docs`」与「pi 把"主题 → 文件"写死在源码里」;§6.2「pi 的 text or file contents 口径」;§8 决策表(`customPrompt`、`APPEND_SYSTEM.md`、工具清单措辞、XML 形态) |
|
|
346
346
|
| `session-format.md` | `parentSession`「pi 同名字段」;`firstMessage` 回落;`isChanging`;`isSettingsEntry`;`getSessionContextSettings` + `restoredModel`;`hasConfiguredAuth`;`appendModelChange`(只在新会话写);`modelId` 命名差异(pi 驼峰 vs qi `model_id`);`_persist`;`SessionManager` 构造时就 `newSession()` |
|
|
347
347
|
| `tui.md` | §1「逐项对齐 pi」+「以 pi 的 `modes/interactive` 为基线、`theme/*.json` 逐字移植、渲染细节对照过 `user-message.js`/`assistant-message.js`/`tool-execution.js`/`footer.js`/`dynamic-border.js`」;§1.1「与 pi 同名同义,默认相反」+「pi 的默认 `regular`」行;样例里「照搬 pi 句式」;§1.3「命令选择器 = pi 的 `showSelector()`」「`pi_select_text` 的 `SelectList` 版式」「勾选标记是 pi 的 `✓`/空格」;`md*`/`syntax*` 键;已知差异「Textual 与 pi 自研渲染器的边界」「pi 能当场换渲染器」「pi 有 `fullscreenExitOutput`」;§2 命令表里的 `showModelSelector`、`getAvailableSnapshot()`、`→ ✓ 模型 [provider]` 行、「与 pi 的差异:pi 的 `/login` 主要做订阅登录(`auth.oauth`)」、「对齐 pi」;会话树「对齐 pi 的 `id`/`parentId`」+ 整列 pi + 「pi 在加载时迁移」;树键位「pi 的 `app.tree.*`」;压缩「对齐 pi 的 `core/compaction`」「pi 同款底色块」;键位「已对齐 pi;`core/keybindings.js`」+ 整列「pi 的 action」;思考「对齐 pi 的 `thinkingLevel`」「按 pi 的写法显示 `• thinking off`」「pi `DEFAULT_THINKING_LEVEL`」;「匹配 pi 语义」「`ctrl+p` 在 pi 里是切模型」;「尚未对齐」表头「pi 用途」;会话选择器「对齐 pi 的 `SessionSelectorComponent`」「pi 的三档同名同义」「版式与 pi 一致」「pi 的 `firstMessage` 回落」;补全「对齐 pi 的 autocomplete / `handleBashCommand`」「`getArgumentCompletions`」「`select-list.js` 版式」「来源标签是 pi 的口径」;输入层「对齐 pi `pi-tui/components/editor.js`」+ 整列「pi 的 action」「`undo`(pi 不用 `ctrl+z`)」「`kill-ring.js`」;§3「语义对齐 pi」+ 整列 pi + 「与 pi 一致」 |
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
| 通道 | 怎么装 | 装到哪 | 发现机制 | 场景 |
|
|
17
17
|
| --- | --- | --- | --- | --- |
|
|
18
18
|
| **pip 包** | `qi install qi-db-tools`(PyPI / git / 本地) | venv 的 site-packages(环境级) | **entry point 扫描**(`importlib.metadata`,启动时自动发现) | 分发、团队共享、锁依赖 |
|
|
19
|
-
| **本地目录** | 手动放置/复制源码目录 | `~/.qi/plugins/<name>/`(全局)或
|
|
19
|
+
| **本地目录** | 手动放置/复制源码目录 | `~/.qi/plugins/<name>/`(全局)或 `<cwd>/.qi/plugins/<name>/`(项目,需信任) | **目录扫描** | 未发布/私有/本地开发,拷贝即用 |
|
|
20
20
|
|
|
21
21
|
pip 包通过 **entry point** 声明(对齐 pytest/uvicorn 模式),无需维护安装清单:
|
|
22
22
|
|
|
@@ -1620,7 +1620,7 @@ qi 原来把它当"另一个页面"塞进 `work__body`,于是打开设置 = **
|
|
|
1620
1620
|
插件引言是"`~/.qi/agent/plugins/<名>/plugin.py`"。按代码逐条核对
|
|
1621
1621
|
(`paths.py` 的 `top_level_skill_dirs`、`registry.py` 的 `_iter_plugin_loaders`)后改成:
|
|
1622
1622
|
**技能** = `~/.qi/agent/skills/`、项目 `.qi/skills/`、跨工具 `.agents/skills/`;**插件** = 全局
|
|
1623
|
-
`~/.qi/agent/plugins/<名>/plugin.py` 或项目
|
|
1623
|
+
`~/.qi/agent/plugins/<名>/plugin.py` 或项目 `<cwd>/.qi/plugins/<名>/`(需信任)。
|
|
1624
1624
|
|
|
1625
1625
|
#### (3) 验证时撞出来的两个真 bug(都已修)
|
|
1626
1626
|
|
|
@@ -1697,7 +1697,7 @@ npm run build
|
|
|
1697
1697
|
| 来源 | 位置 | 可见性 |
|
|
1698
1698
|
| --- | --- | --- |
|
|
1699
1699
|
| 全局 | `~/.qi/agent/mcp.json` | 按 agent 声明绑定 |
|
|
1700
|
-
| 项目 | `<
|
|
1700
|
+
| 项目 | `<cwd>/.qi/mcp.json` | 按 agent 声明绑定(同名覆盖全局) |
|
|
1701
1701
|
| 私有 | `<agent>/mcp.json` | **仅该 agent**,自动绑定 |
|
|
1702
1702
|
|
|
1703
1703
|
`mcp_servers`(frontmatter)从"解析了但没人用"变成真的绑定规则。两条硬规则:**同名项目覆盖全局**;
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
qi 的配置分**用户级**与**项目级**两层。
|
|
4
4
|
|
|
5
5
|
- 用户级 = **agent 目录**,默认 `~/.qi/agent`(`QI_AGENT_HOME` 可改),所有用户级状态都挂在这里。
|
|
6
|
-
- 项目级 =
|
|
6
|
+
- 项目级 = **当前工作目录(cwd)** 下的 `.qi/`,跟 cwd 走、可提交共享(对齐 pi 的 `.pi/settings.json`)。
|
|
7
|
+
同一仓库的不同子目录各有自己的 `.qi/`;仓库根(`.git`)只用于 `.agents/skills` 的祖先探测。
|
|
7
8
|
|
|
8
9
|
项目级**扩展**要过[项目信任](security.md)才加载;`settings.json` 的普通字段(`sessionDir`、`theme`、
|
|
9
10
|
`defaultTools`…)与文本指令(`AGENTS.md`、技能)**不受门控**。
|
|
@@ -29,6 +30,10 @@ qi 的配置分**用户级**与**项目级**两层。
|
|
|
29
30
|
|
|
30
31
|
## 项目 `.qi` 目录
|
|
31
32
|
|
|
33
|
+
项目级 = **当前工作目录**的 `.qi/`(对齐 pi 的 `.pi/settings.json` = "current directory");
|
|
34
|
+
同一仓库的不同子目录各有一份,从仓库根启动才命中仓库根的 `.qi/`。仓库根(`.git`)只用于
|
|
35
|
+
`.agents/skills` 的祖先探测,不是配置目录。
|
|
36
|
+
|
|
32
37
|
| 路径 | 职责 |
|
|
33
38
|
| --- | --- |
|
|
34
39
|
| `.qi/settings.json` | 项目级设置(键级深合并覆盖用户级) |
|
|
@@ -49,7 +54,10 @@ qi 的配置分**用户级**与**项目级**两层。
|
|
|
49
54
|
AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD
|
|
50
55
|
```
|
|
51
56
|
|
|
52
|
-
顺序 = 用户级 → 项目祖先链**由远到近**(含 cwd)
|
|
57
|
+
顺序 = 用户级 → 项目祖先链**由远到近**(含 cwd),按路径去重;祖先链**走到文件系统根**
|
|
58
|
+
(`/`;Windows 上是盘符根如 `C:\`)—— 对齐 Claude Code / pi 的 `CLAUDE.md` / `AGENTS.md` 探测。
|
|
59
|
+
这样你可以在仓库**之上**放一份 `~/AGENTS.md`(或某个团队目录下的),让下面所有项目都生效;
|
|
60
|
+
而 `.agents/skills` 那条止于 **git 根**(`docs/skills.md`)。
|
|
53
61
|
`AGENTS.override.md` 只在**同一目录**里顶替 `AGENTS.md` / `CLAUDE.md`,不会压掉其它目录的。
|
|
54
62
|
空文件视为未配置。上下文文件的发现**不需要项目信任**。
|
|
55
63
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
> `QI_AGENT_HOME` 指向的是**目录本身**,不是它的父目录 —— 拿它去拼 `agent/settings.json` 会得到
|
|
16
16
|
> `…/agent/agent/settings.json`。这是这个变量最常见的误用。
|
|
17
17
|
|
|
18
|
-
`models.json` 的完整查找顺序是 `QI_AGENT_CONFIG` →
|
|
18
|
+
`models.json` 的完整查找顺序是 `QI_AGENT_CONFIG` → `<cwd>/.qi/models.json` → `~/.qi/agent/models.json`,
|
|
19
19
|
见 [models.md](models.md)。
|
|
20
20
|
|
|
21
21
|
## 注入给 shell 工具的会话变量
|
|
@@ -72,7 +72,7 @@ qi doctor # 诊断:装载失败 / 依赖契约 / 声明不一致
|
|
|
72
72
|
| 通道 | 位置 |
|
|
73
73
|
| --- | --- |
|
|
74
74
|
| 用户级 | `~/.qi/agent/extensions/<名>/extension.py` |
|
|
75
|
-
| 项目级 |
|
|
75
|
+
| 项目级 | `<cwd>/.qi/extensions/<名>/extension.py`(未信任不加载,见下) |
|
|
76
76
|
| 附加路径 | `settings.json` 的 `extensions[]`:每项可以是扩展目录的**父目录**,也可以直接指向**单个扩展目录**;支持 `-<路径>` 排除 |
|
|
77
77
|
| 单次试用 | `qi -e <目录>` / `--extension`(只本进程,`scope=temporary`) |
|
|
78
78
|
| pip 包 | entry point 组 `qi.extensions`,**且必须在 `settings.packages` 里声明**(没声明的装了也不加载 —— 对齐 pi) |
|
|
@@ -336,7 +336,7 @@ api.register_tool(Tool(
|
|
|
336
336
|
- 声明方式:`api.provides_config(kind, types)`;没人提供该种类时**整个种类不装载**(静默跳过);
|
|
337
337
|
- core 侧的一般机制:`api.register_resolver(kind, fn)` / `api.resolve_tools(kind, scope=…)`,
|
|
338
338
|
没人提供 → `[]`;
|
|
339
|
-
- 边界:**只在 scope 目录内**。全局(`~/.qi/agent/`)与项目(
|
|
339
|
+
- 边界:**只在 scope 目录内**。全局(`~/.qi/agent/`)与项目(`<cwd>/.qi/`)那两层的声明表沿用
|
|
340
340
|
按作用域分层的旧规则(它们不是任何 scope 私有的)。
|
|
341
341
|
|
|
342
342
|
## 10. 依赖契约
|
|
@@ -24,7 +24,7 @@ provider 流式返回助手回复(可能包含文本与工具调用)。qi 记录
|
|
|
24
24
|
系统提示词由**基座**加**动态块**拼成:
|
|
25
25
|
|
|
26
26
|
```text
|
|
27
|
-
基座 代码内默认,或被
|
|
27
|
+
基座 代码内默认,或被 <cwd>/.qi/SYSTEM.md / ~/.qi/agent/SYSTEM.md 整体替换
|
|
28
28
|
动态块 项目上下文(AGENTS.md…) → 技能清单 → 手册索引 → 当前工作目录
|
|
29
29
|
```
|
|
30
30
|
|
|
@@ -100,7 +100,7 @@ qi 通过 litellm 调各家模型。provider 与模型定义都在 `models.json`
|
|
|
100
100
|
`qi init` 引导默认模型,三步:**选 provider**(已有 / 预置 `[预置]` / 新建 → Base URL → API 类型 →
|
|
101
101
|
API Key,直接写 `auth.json`)→ **Add Models**(`+ Add a model` / `↻ Refresh model list (GET /models)` /
|
|
102
102
|
`✓ Done` 循环)→ **Activate LLM Model**(写 `defaultProvider` / `defaultModel` 进 `settings.json`)。
|
|
103
|
-
`-l` 写项目
|
|
103
|
+
`-l` 写项目 `<cwd>/.qi/models.json`(否则全局)。
|
|
104
104
|
|
|
105
105
|
```bash
|
|
106
106
|
qi init # 交互式
|
|
@@ -128,10 +128,10 @@ qi init -y --provider deepseek --model deepseek-chat \
|
|
|
128
128
|
|
|
129
129
|
```text
|
|
130
130
|
models.json: $QI_AGENT_CONFIG(env 指定文件,最高)
|
|
131
|
-
→
|
|
131
|
+
→ <cwd>/.qi/models.json
|
|
132
132
|
→ ~/.qi/agent/models.json
|
|
133
133
|
|
|
134
|
-
默认模型:
|
|
134
|
+
默认模型: <cwd>/.qi/settings.json > ~/.qi/agent/settings.json(唯一来源)
|
|
135
135
|
```
|
|
136
136
|
|
|
137
137
|
键级深合并,内层覆盖外层;文件不存在则跳过。provider 按名覆盖,`models` 数组**整体替换**。
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
> **裸 URL 故意不猜名字**:把 `git+https://host/qi-mcp` 读成一个叫 `git` 的包,比认不出更坏。
|
|
46
46
|
> 这种声明会被**原样回显**并提示改成 `名字 @ URL` —— 不静默丢。
|
|
47
47
|
|
|
48
|
-
作用域:用户级 `~/.qi/agent/settings.json` 与项目级 `<
|
|
48
|
+
作用域:用户级 `~/.qi/agent/settings.json` 与项目级 `<cwd>/.qi/settings.json` **都读**,
|
|
49
49
|
同名以**项目**为准(近者胜)。两份**分别解析**而不是合并数组 —— 合并会让一侧的声明落到另一侧的基准上。
|
|
50
50
|
|
|
51
51
|
## 3. 已装扩展从哪来
|
|
@@ -107,7 +107,7 @@ $ qi list
|
|
|
107
107
|
> **两个「作用域」别混**:`来源` 列的 `· env` 说的是**装在哪** —— pip 扩展都装进 qi 的
|
|
108
108
|
> **同一个解释器环境**,所以固定是 `env`(没有“项目一份 / 全局一份”)。`声明` 列才是
|
|
109
109
|
> **哪一级 `settings.packages` 写了它**:`user` = `~/.qi/agent/settings.json`,
|
|
110
|
-
> `project` = `<
|
|
110
|
+
> `project` = `<cwd>/.qi/settings.json`(`qi install -l` 写的就是后者)。
|
|
111
111
|
|
|
112
112
|
声明里有一条装不上、一条认不出,并且同一个包两级都声明时:
|
|
113
113
|
|
|
@@ -281,7 +281,7 @@ qi 自己识别的变量分两类。
|
|
|
281
281
|
|
|
282
282
|
它们由 `Runtime._session_env()` 生成、`merged_env()` 注入,**先删后填**所以不会从父进程继承。细节见 [environment-variables.md](environment-variables.md)。
|
|
283
283
|
|
|
284
|
-
`models.json` 的完整查找顺序是 `QI_AGENT_CONFIG` →
|
|
284
|
+
`models.json` 的完整查找顺序是 `QI_AGENT_CONFIG` → `<cwd>/.qi/models.json` → `~/.qi/agent/models.json`,
|
|
285
285
|
细节见 [models.md](models.md)。
|
|
286
286
|
|
|
287
287
|
> `QI_AGENT_HOME` 指向的是**目录本身**,不是它的父目录 —— 拿它去拼 `agent/settings.json` 会得到
|
|
@@ -34,8 +34,8 @@ qi 能执行任意命令、读写任意文件,而**装进来的扩展就是任
|
|
|
34
34
|
- 判定结果与理由会进启动提示(`qi doctor` 也显示),例如
|
|
35
35
|
`未信任项目(defaultProjectTrust=ask(无 UI;用 -a 信任)):.qi/extensions/ 未加载`。
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
**仍然生效**:项目级技能(`.agents/skills/`、`<
|
|
37
|
+
**未信任时不加载**:`<cwd>/.qi/extensions/` 与项目级 `settings.json` 的 `extensions[]`(只挡项目那一份)。
|
|
38
|
+
**仍然生效**:项目级技能(`.agents/skills/`、`<cwd>/.qi/skills/`)、项目上下文(`AGENTS.md` 等)、
|
|
39
39
|
项目级 settings 的普通字段(`defaultTools`、`theme`…)。细目见 [configuration.md](configuration.md)。
|
|
40
40
|
|
|
41
41
|
## bash 的边界
|
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
## 1. 位置与分层
|
|
7
7
|
|
|
8
8
|
```text
|
|
9
|
-
<
|
|
9
|
+
<cwd>/.qi/settings.json 项目覆盖(可提交共享)
|
|
10
10
|
~/.qi/agent/settings.json 全局
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
**项目级就在当前目录(cwd)的 `.qi/`** —— 对齐 pi 的 `.pi/settings.json`(它的文档写的是
|
|
14
|
+
"Project (current directory)")。仓库根(`.git`)只用来界定 `.agents/skills` 的祖先探测,
|
|
15
|
+
不是配置目录。
|
|
16
|
+
|
|
17
|
+
配对关系:全局比项目深一层(`~/.qi/agent/` ↔ `<cwd>/.qi/`),因为全局侧是
|
|
14
18
|
"全部用户级状态的挂载点"。`QI_AGENT_HOME` 指向的就是全局 agent 目录本身。
|
|
15
19
|
|
|
16
20
|
## 2. 合并规则
|
|
@@ -24,7 +28,7 @@
|
|
|
24
28
|
// ~/.qi/agent/settings.json
|
|
25
29
|
{ "theme": "dark", "compaction": { "enabled": true, "reserveTokens": 16384 } }
|
|
26
30
|
|
|
27
|
-
//
|
|
31
|
+
// <cwd>/.qi/settings.json
|
|
28
32
|
{ "compaction": { "reserveTokens": 8192 } }
|
|
29
33
|
|
|
30
34
|
// 结果:theme=dark, compaction={enabled: true, reserveTokens: 8192}
|
|
@@ -78,13 +82,13 @@
|
|
|
78
82
|
`skills`(以及将来其它资源字段)里的每一条按下列规则解析:
|
|
79
83
|
|
|
80
84
|
- 相对路径 → 相对**该条所在的 settings.json 目录**:`~/.qi/agent/settings.json` 里的
|
|
81
|
-
相对路径相对 `~/.qi/agent
|
|
85
|
+
相对路径相对 `~/.qi/agent`,`<cwd>/.qi/settings.json` 里的相对 `<cwd>/.qi`。
|
|
82
86
|
→ 所以两个作用域各自写 `"skills": ["x"]` 指的是**两个不同的目录**,互不影响。
|
|
83
87
|
- `~` 展开为 home;绝对路径直接用;支持 glob(`*` / `?` / `[`)。
|
|
84
88
|
- 排除项:前缀 `!` 或 `-`;强制纳入:前缀 `+`。
|
|
85
89
|
|
|
86
90
|
同一套语法对 **`extensions`** 也生效(排除项作用于整个发现集)—— 所以内建目录
|
|
87
|
-
(`~/.qi/agent/extensions
|
|
91
|
+
(`~/.qi/agent/extensions/`、`<cwd>/.qi/extensions/`)里扫出来的扩展也能被单独关掉:
|
|
88
92
|
|
|
89
93
|
```jsonc
|
|
90
94
|
{ "extensions": ["-~/.qi/agent/extensions/some-ext"] } // 只关这一个
|
|
@@ -133,6 +137,6 @@ qi config # 看:合并后的设置、来源文件、默认
|
|
|
133
137
|
qi config --json # 机器可读
|
|
134
138
|
qi config --set theme=light # 写全局(JSON 值解析,失败则当字符串)
|
|
135
139
|
qi config --set 'skills=["~/x"]'
|
|
136
|
-
qi config -l --set theme=dark # 写项目 <
|
|
140
|
+
qi config -l --set theme=dark # 写项目 <cwd>/.qi/settings.json
|
|
137
141
|
qi config --unset theme # 删键(支持点号路径,如 compaction.enabled)
|
|
138
142
|
```
|
|
@@ -32,19 +32,19 @@ description: 审代码时按这份清单逐项检查;涉及并发、错误处理
|
|
|
32
32
|
| 2 | `~/.qi/agent/skills/` | `qi-global` | qi 私有,全局 |
|
|
33
33
|
| 3 | user `settings.json` 的 `skills[]` | `settings-global` | 追加路径,相对 `~/.qi/agent` 解析 |
|
|
34
34
|
| 4 | `.agents/skills/`(cwd → git 根,远→近) | `agents-project` | 跨工具,项目级 |
|
|
35
|
-
| 5 | `<
|
|
36
|
-
| 6 | project `settings.json` 的 `skills[]` | `settings-project` | 追加路径,相对 `<
|
|
35
|
+
| 5 | `<cwd>/.qi/skills/` | `qi-project` | qi 私有,项目级 |
|
|
36
|
+
| 6 | project `settings.json` 的 `skills[]` | `settings-project` | 追加路径,相对 `<cwd>/.qi` 解析 |
|
|
37
37
|
|
|
38
38
|
第 1、2、4、5 层的**具体目录**按"跨工具层与 qi 私有层交替"排列(跨工具的 `.agents` 与私有的
|
|
39
|
-
`~/.qi` / `<
|
|
39
|
+
`~/.qi` / `<cwd>/.qi` 各占两层)。跨工具目录(`.agents`)与 qi 私有目录的区别不只是名字:
|
|
40
40
|
**跨工具目录只认 `<name>/SKILL.md` 这种结构,不接受根目录下散着的 `*.md`**(见 §2)。
|
|
41
41
|
|
|
42
42
|
两条容易踩的:
|
|
43
43
|
|
|
44
44
|
- 第 3、6 层的相对路径**各按自己所在的目录解析**(user 的按 `~/.qi/agent`,project 的按
|
|
45
|
-
`<
|
|
45
|
+
`<cwd>/.qi`)。用合并后的配置去解析,会让一侧的路径落到另一侧的基准上。
|
|
46
46
|
- 第 4、5 层是**项目级**(随仓库走)。**注意:项目级技能不受信任门控** —— 未信任的项目里
|
|
47
|
-
`.agents/skills` 与 `<
|
|
47
|
+
`.agents/skills` 与 `<cwd>/.qi/skills` **仍会被装载**。这与项目级*扩展*不同:后者未信任就不扫
|
|
48
48
|
(因为扩展是可执行代码)。界线画在“可执行 vs 文本”上,而技能是文本指令。详见
|
|
49
49
|
[security.md](security.md) §2。
|
|
50
50
|
|
|
@@ -56,7 +56,7 @@ description: 审代码时按这份清单逐项检查;涉及并发、错误处理
|
|
|
56
56
|
被误当成子技能。
|
|
57
57
|
- **没有 `SKILL.md` 的子目录继续向内找** —— 支持分组目录(如 `skills/lang/python/SKILL.md`)。
|
|
58
58
|
- **根目录下带 `description` 的 `*.md` 也算独立技能** —— 但**只对 qi 侧目录生效**
|
|
59
|
-
(`~/.qi/agent/skills`、`<
|
|
59
|
+
(`~/.qi/agent/skills`、`<cwd>/.qi/skills`、以及 `settings.skills[]` 指定的路径与 CLI `--skill`)。
|
|
60
60
|
跨工具的 `.agents/skills` **不开**这一条,以贴合 Agent Skills 标准。子目录里散着的 `*.md`
|
|
61
61
|
一律不算。
|
|
62
62
|
- 一个 `--skill` / `settings.skills[]` 条目**可以直接指向一个 `.md` 文件**,也可以指向目录。
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "qi-coding-agent"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.0"
|
|
8
8
|
description = "编码 agent 框架:单 agent core + 扩展(MCP / 多 agent / web)"
|
|
9
9
|
keywords = ["agent", "coding-agent", "cli", "tui", "llm", "mcp"]
|
|
10
10
|
readme = "README.md"
|
|
@@ -851,7 +851,7 @@ def list_extensions() -> None:
|
|
|
851
851
|
if decl is None:
|
|
852
852
|
mark = "否"
|
|
853
853
|
else:
|
|
854
|
-
# 声明**写在哪一级**(user = `~/.qi/agent/settings.json`;project = `<
|
|
854
|
+
# 声明**写在哪一级**(user = `~/.qi/agent/settings.json`;project = `<cwd>/.qi/settings.json`)
|
|
855
855
|
mark = f"是({' + '.join(decl.scopes)})" if decl.scopes else "是"
|
|
856
856
|
table.add_row(item.name, item.channel, item.version or "—",
|
|
857
857
|
f"{item.origin} · {item.scope}", mark)
|
|
@@ -1488,7 +1488,7 @@ def config_cmd(
|
|
|
1488
1488
|
unset: list[str] = typer.Option(None, "--unset", help="删键(可重复)"),
|
|
1489
1489
|
json_out: bool = typer.Option(False, "--json", help="以 JSON 输出合并后的设置"),
|
|
1490
1490
|
) -> None:
|
|
1491
|
-
"""查看/编辑 settings.json:全局 `~/.qi/agent/` > 项目 `<
|
|
1491
|
+
"""查看/编辑 settings.json:全局 `~/.qi/agent/` > 项目 `<cwd>/.qi/`。"""
|
|
1492
1492
|
scope = "project" if local else "user"
|
|
1493
1493
|
cwd = Path.cwd()
|
|
1494
1494
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"""模型配置 `models.json`(对齐 pi 格式)+ 解析。
|
|
2
2
|
|
|
3
3
|
文件位置(优先级从高到低):
|
|
4
|
-
$QI_AGENT_CONFIG(指定文件)→
|
|
4
|
+
$QI_AGENT_CONFIG(指定文件)→ <cwd>/.qi/models.json → ~/.qi/agent/models.json
|
|
5
5
|
合并:键级深合并,内层覆盖外层;providers 按 provider 名合并。
|
|
6
6
|
|
|
7
7
|
默认模型 `defaultProvider` / `defaultModel` **只属于 settings.json**(对齐 pi):
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
<cwd>/.qi/settings.json > ~/.qi/agent/settings.json
|
|
10
10
|
|
|
11
11
|
models.json 里的这两个键**已不再被读取**(不是"优先级更低",是彻底不参与);
|
|
12
12
|
启动时若发现残留,报错/诊断里会给出可照抄的迁移命令。
|
|
@@ -157,7 +157,7 @@ def default_model_spec(cwd: Path | None = None) -> tuple[str | None, str | None,
|
|
|
157
157
|
|
|
158
158
|
**只从 settings.json 读**(对齐 pi):
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
<cwd>/.qi/settings.json > ~/.qi/agent/settings.json
|
|
161
161
|
|
|
162
162
|
`models.json` 里的 `defaultProvider` / `defaultModel` **不再被读取** ——
|
|
163
163
|
如果旧文件里还留着,`legacy_default_keys()` 会报出来。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""内容装载器(P2):agent 目录发现(两层)、agent.md/技能解析、校验、import。
|
|
2
2
|
|
|
3
3
|
对齐 design/agent-config-design.md §3/§6/§10:
|
|
4
|
-
- 位置: ~/.qi/agents +
|
|
4
|
+
- 位置: ~/.qi/agents + <cwd>/.qi/agents + 包内置 qi_agent/builtin/agents
|
|
5
5
|
- 优先级: 项目 > 用户 > 内置(静默覆盖);同层重复报错
|
|
6
6
|
- 校验: name==目录名 / description 非空 / tools 存在 / include 存在 / 技能同名冲突
|
|
7
7
|
- import: 与装载共用同一校验器;明文凭证扫描
|
|
@@ -160,8 +160,8 @@ def top_level_skill_dirs(cwd: Path | None = None,
|
|
|
160
160
|
2. `~/.qi/agent/skills` qi 全局私有
|
|
161
161
|
3. user settings 的 `skills[]` 追加路径(相对 `~/.qi/agent`)
|
|
162
162
|
4. `.agents/skills`(cwd→git 根,远→近) 跨工具共享(项目,需信任)
|
|
163
|
-
5. `<
|
|
164
|
-
6. project settings 的 `skills[]` 追加路径(相对 `<
|
|
163
|
+
5. `<cwd>/.qi/skills` qi 项目私有
|
|
164
|
+
6. project settings 的 `skills[]` 追加路径(相对 `<cwd>/.qi`)
|
|
165
165
|
|
|
166
166
|
同一标签内的同名技能视为冲突(报错);跨标签同名则高优先级静默覆盖。
|
|
167
167
|
`settings` 参数只为兼容旧调用保留 —— 两个作用域的 `skills[]` 一律从各自的
|
|
@@ -257,8 +257,8 @@ def resolve_base_prompt(cwd: Path | None = None) -> tuple[str, str]:
|
|
|
257
257
|
#
|
|
258
258
|
# 每级目录按候选顺序取**第一个**命中的文件(顺序照搬 pi);全局(agent 目录)在最前,
|
|
259
259
|
# 项目祖先链由远到近追加 —— 近者可覆盖远者的同义约定。
|
|
260
|
-
#
|
|
261
|
-
#
|
|
260
|
+
# **祖先链一路走到文件系统根**(对齐 pi 的 `loadProjectContextFiles`;与 `.agents/skills`
|
|
261
|
+
# 止于 git 根的那条不同),空文件视为未配置。
|
|
262
262
|
|
|
263
263
|
CONTEXT_FILE_NAMES = ("AGENTS.override.md", "AGENTS.md", "AGENTS.MD", "CLAUDE.md", "CLAUDE.MD")
|
|
264
264
|
|
|
@@ -294,6 +294,6 @@ def load_project_context(cwd: Path | None = None) -> list[tuple[Path, str]]:
|
|
|
294
294
|
out.append(found)
|
|
295
295
|
|
|
296
296
|
take(paths.global_home())
|
|
297
|
-
for ancestor in reversed(paths.
|
|
297
|
+
for ancestor in reversed(paths.context_file_ancestors(cwd)): # 远 → 近
|
|
298
298
|
take(ancestor)
|
|
299
299
|
return out
|