illusion-code 0.2.1__tar.gz → 0.2.2__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.
- {illusion_code-0.2.1 → illusion_code-0.2.2}/PKG-INFO +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/extensions.md +208 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/project-files.md +44 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/package-lock.json +2 -2
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/package.json +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/App.tsx +6 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/version.ts +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/package-lock.json +2 -2
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/package.json +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/version.ts +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/pyproject.toml +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/__init__.py +1 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/misc.py +47 -10
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/rules.py +12 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/i18n.py +5 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/loader.py +20 -1
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/config.py +16 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/manager.py +49 -6
- illusion_code-0.2.2/src/illusion/permissions/__init__.py +73 -0
- illusion_code-0.2.2/src/illusion/permissions/loader.py +85 -0
- illusion_code-0.2.2/src/illusion/permissions/schemas.py +40 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/loader.py +11 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/claudemd.py +15 -6
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/context.py +43 -28
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/loader.py +88 -8
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/backend_host.py +65 -7
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/web/ws_host.py +49 -2
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/utils/ripgrep.py +12 -4
- illusion_code-0.2.2/tests/test_hooks/test_loader_permissions.py +85 -0
- illusion_code-0.2.2/tests/test_mcp/test_config_permissions.py +71 -0
- illusion_code-0.2.2/tests/test_memory/test_manager_permissions.py +131 -0
- illusion_code-0.2.2/tests/test_permissions/test_loader.py +121 -0
- illusion_code-0.2.2/tests/test_permissions/test_project_permissions.py +58 -0
- illusion_code-0.2.2/tests/test_plugins/test_loader_permissions.py +68 -0
- illusion_code-0.2.2/tests/test_prompts/test_claudemd_permissions.py +77 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_skills/test_loader.py +19 -0
- illusion_code-0.2.2/tests/test_skills/test_loader_permissions.py +61 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_ripgrep.py +3 -0
- illusion_code-0.2.1/src/illusion/permissions/__init__.py +0 -39
- {illusion_code-0.2.1 → illusion_code-0.2.2}/.github/workflows/publish.yml +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/.gitignore +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/.python-version +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/LICENSE +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/README.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/README.zh-CN.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/architecture.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/channels.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/commands.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/extensions.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/getting-started.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/introduction.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/project-files.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/settings.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/images/IllusionCode.png +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/images/image1.png +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/images/image2.png +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/architecture.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/channels.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/commands.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/getting-started.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/introduction.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/settings.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/build.mjs +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/Composer.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ComposerController.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ConversationView.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/Footer.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ModalHost.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/PromptInput.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/SelectModal.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/SidePanel.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/Spinner.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/StatusBar.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useBlink.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/i18n.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/index.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/registry.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/types.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/utils/markdown.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/utils/thinking.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/tsconfig.json +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/index.html +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/postcss.config.js +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/App.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/ChatArea.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/MessageBubble.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/ModalCard.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/PromptInput.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/RightPanel.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/Sidebar.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/TodoPanel.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/Toolbar.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/hooks/useWebSocketSession.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/i18n.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/index.css +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/main.tsx +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/remarkSuperscript.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/types/protocol.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/vite-env.d.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/tailwind.config.js +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/tsconfig.json +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/tsconfig.node.json +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/vite.config.ts +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/build_frontend.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/hatch_build.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/publish.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/sync_version.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/__main__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/codex_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/compat.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/effort.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/errors.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/openai_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/provider.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/registry.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/usage.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/codex_oauth.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/copilot.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/external.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/flows.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/manager.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/storage.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/manager.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/session_runner.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/work_secret.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/base.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/base_commands.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/config.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/commands.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/messaging.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/session_map.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/ws_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/pid.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/api.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/commands.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/session_map.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/ws_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/serve.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/tools/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/tools/feishu_doc.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/tools/feishu_drive.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/commands.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/ilink_api.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/session_map.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/cli.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/auth.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/bridge.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/context.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/git.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/helpers.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/architecture.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/conventions.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/dependencies.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/key_modules.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/readme.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/scanner.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/claudemd.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/illusionmd.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/memory_template.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/rules.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/sections.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/orchestrator.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/mcp.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/memory.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/model.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/plugin.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/registry.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/sandbox.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/session.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/settings.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/paths.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/plan_file.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/settings.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/coordinator/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/coordinator/agent_definitions.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/coordinator/coordinator_mode.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/cost_tracker.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/messages.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/query.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/query_engine.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/stream_events.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/events.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/executor.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/hot_reload.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/register_hooks.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/schemas.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/session_hooks.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/utils.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/memdir.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/paths.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/scan.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/search.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/output_styles/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/output_styles/loader.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/permissions/checker.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/permissions/modes.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/platforms.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/installer.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/options.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/schemas.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/environment.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/system_prompt.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/base.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/linux.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/macos.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/windows.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/proxy/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/proxy/env_vars.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/runtime.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/symlink_protection.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/utils.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/violation_store.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/auto_compact.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/compact_core.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/compact_prompt.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/constants.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/message_ops.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/microcompact.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/models.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/token_utils.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/cron.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/cron_scheduler.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/file_history.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/config.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/manager.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/session_storage.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/token_estimation.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/batch.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/debug.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/loop.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/remember.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/simplify.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/skillify.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/stuck.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/update-config.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/verify.md +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/registry.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/state/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/state/app_state.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/state/store.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/agent_executor.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/in_process.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/subprocess_backend.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/team_helpers.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/worktree.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/local_agent_task.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/local_shell_task.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/manager.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/stop_task.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/agent_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/ask_user_question_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/base.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/bash_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/config_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/cron_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/enter_worktree_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/exit_plan_mode_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/exit_worktree_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/file_edit_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/file_read_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/file_write_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/glob_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/grep_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/lsp_formatters.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/lsp_schemas.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/lsp_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/mcp_auth_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/mcp_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/notebook_edit_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/powershell_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/repl_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/send_message_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/shell_common.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/skill_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/sleep_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/structured_output_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_create_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_get_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_list_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_output_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_stop_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_update_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/team_create_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/team_delete_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/todo_write_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/tool_search_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/web_fetch_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/web_search_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/app.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/input.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/output.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/permission_dialog.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/permission_store.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/protocol.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/react_launcher.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/runtime.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/textual_app.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/web/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/web/server.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/utils/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/utils/shell.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_anthropic_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_codex_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_effort.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_openai_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/test_adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/test_commands.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/test_session_map.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_base.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_base_commands.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_config.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_pid.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_tool_registration.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/tools/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/tools/test_feishu_doc.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/tools/test_feishu_drive.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_config.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_ilink_api.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_session_map.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_claudemd.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_orchestrator.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_scanner.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_sections.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/test_effort_command.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/config/test_i18n.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/config/test_settings.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/conftest.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/engine/test_query_engine.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/fixtures/fake_mcp_server.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/integration/test_effort_integration.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_config.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_manager.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_codex_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_compat.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_openai_client.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_auth/test_external.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_bridge/test_core.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_bridge/test_session_flow.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/test_cli.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/test_command_flows.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/test_registry.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_config/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_config/test_paths.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_config/test_settings.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_coordinator/test_agent_definitions.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_coordinator/test_coordinator_mode.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/test_media_block.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/test_query_engine.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/test_tool_result_media.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_hooks/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_hooks/test_executor.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_hooks_skills_plugins_real.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_mcp/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_mcp/test_integration.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_mcp/test_stdio_flow.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_memory/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_memory/test_memdir.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_merged_prs_on_autoagent.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_permissions/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_permissions/test_checker.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_platforms.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_plugins/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_plugins/test_lifecycle_flow.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_plugins/test_loader.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/test_claudemd.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/test_environment.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/test_system_prompt.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_qq_channel.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_real_large_tasks.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_adapter.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_config_schema.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_platform_linux.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_platform_macos.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_platform_windows.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_proxy_env_vars.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_runtime.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_symlink_protection.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_utils.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_violation_store.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_scripts/test_sync_version.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_compact.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_cron.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_cron_scheduler.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_session_storage.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_agent_executor.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_imports.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_in_process.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_types.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_worktree.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tasks/test_manager.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_agent_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_core_tools.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_file_read_media.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_glob_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_grep_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_integration.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_integration_flows.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_mcp_auth_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_shell_common.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_task_tools.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_team_tools.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_web_fetch_tool.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/__init__.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_modes.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_permission_store.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_react_backend.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_react_launcher.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_textual_app.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_untested_features.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_utils/test_shell.py +0 -0
- {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/ui/test_backend_host.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: illusion-code
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Open-source Python port of Claude Code - an AI-powered CLI coding assistant
|
|
5
5
|
Project-URL: Homepage, https://github.com/YunTaiHua/illusion-code
|
|
6
6
|
Project-URL: Repository, https://github.com/YunTaiHua/illusion-code
|
|
@@ -433,3 +433,211 @@ hooks:
|
|
|
433
433
|
- 钩子事件:`src/illusion/hooks/events.py`
|
|
434
434
|
- 钩子 schema:`src/illusion/hooks/schemas.py`
|
|
435
435
|
- 钩子类型:`src/illusion/hooks/types.py`
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## 插件配置
|
|
440
|
+
|
|
441
|
+
### 全局启用/禁用
|
|
442
|
+
|
|
443
|
+
在 `~/.illusion/settings.json` 的 `enabled_plugins` 字段中控制:
|
|
444
|
+
|
|
445
|
+
```json
|
|
446
|
+
{
|
|
447
|
+
"enabled_plugins": {
|
|
448
|
+
"plugin-name": true, // 启用
|
|
449
|
+
"plugin-name": false // 禁用
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### 项目级禁用
|
|
455
|
+
|
|
456
|
+
在 `<project>/.illusion/permissions.json` 的 `denied_plugins` 字段中控制:
|
|
457
|
+
|
|
458
|
+
```json
|
|
459
|
+
{
|
|
460
|
+
"denied_plugins": ["plugin-name"] // 禁用特定插件
|
|
461
|
+
"denied_plugins": ["*"] // 禁用所有插件
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### 优先级
|
|
466
|
+
|
|
467
|
+
项目级 `denied_plugins` > 全局 `enabled_plugins` > 默认值
|
|
468
|
+
|
|
469
|
+
### 源码参考
|
|
470
|
+
|
|
471
|
+
- 插件加载器:`src/illusion/plugins/loader.py`
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## MCP 服务器配置
|
|
476
|
+
|
|
477
|
+
### 全局启用/禁用
|
|
478
|
+
|
|
479
|
+
在 MCP 服务器配置中添加 `enabled` 字段:
|
|
480
|
+
|
|
481
|
+
```json
|
|
482
|
+
{
|
|
483
|
+
"mcp_servers": {
|
|
484
|
+
"server-name": {
|
|
485
|
+
"type": "stdio",
|
|
486
|
+
"command": "python",
|
|
487
|
+
"args": ["server.py"],
|
|
488
|
+
"enabled": false // 禁用此服务器
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### 项目级禁用
|
|
495
|
+
|
|
496
|
+
在 `<project>/.illusion/permissions.json` 的 `denied_mcp_servers` 字段中控制:
|
|
497
|
+
|
|
498
|
+
```json
|
|
499
|
+
{
|
|
500
|
+
"denied_mcp_servers": ["server-name"] // 禁用特定服务器
|
|
501
|
+
"denied_mcp_servers": ["*"] // 禁用所有服务器
|
|
502
|
+
}
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
### 优先级
|
|
506
|
+
|
|
507
|
+
项目级 `denied_mcp_servers` > 全局 `enabled` 字段 > 默认值
|
|
508
|
+
|
|
509
|
+
### 源码参考
|
|
510
|
+
|
|
511
|
+
- MCP 配置加载器:`src/illusion/mcp/config.py`
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## 记忆系统配置
|
|
516
|
+
|
|
517
|
+
### 全局启用/禁用
|
|
518
|
+
|
|
519
|
+
在 `~/.illusion/settings.json` 的 `memory.enabled` 字段中控制:
|
|
520
|
+
|
|
521
|
+
```json
|
|
522
|
+
{
|
|
523
|
+
"memory": {
|
|
524
|
+
"enabled": false // 禁用记忆功能
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### 项目级禁用
|
|
530
|
+
|
|
531
|
+
在 `<project>/.illusion/permissions.json` 的 `denied_memory` 字段中控制:
|
|
532
|
+
|
|
533
|
+
```json
|
|
534
|
+
{
|
|
535
|
+
"denied_memory": true // 禁用记忆功能
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### 优先级
|
|
540
|
+
|
|
541
|
+
项目级 `denied_memory` > 全局 `memory.enabled` > 默认值
|
|
542
|
+
|
|
543
|
+
### 源码参考
|
|
544
|
+
|
|
545
|
+
- 记忆管理器:`src/illusion/memory/manager.py`
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## Skills 配置
|
|
550
|
+
|
|
551
|
+
### 加载来源
|
|
552
|
+
|
|
553
|
+
Skills 可以从以下位置加载:
|
|
554
|
+
- 内置 skills(`src/illusion/skills/bundled/`)
|
|
555
|
+
- 用户 skills(`~/.illusion/skills/`)
|
|
556
|
+
- 项目级 skills(`<project>/.illusion/skills/`)
|
|
557
|
+
- 插件 skills(插件的 `skills/` 目录)
|
|
558
|
+
|
|
559
|
+
### 项目级禁用
|
|
560
|
+
|
|
561
|
+
在 `<project>/.illusion/permissions.json` 的 `denied_skills` 字段中控制:
|
|
562
|
+
|
|
563
|
+
```json
|
|
564
|
+
{
|
|
565
|
+
"denied_skills": ["skill-name"] // 禁用特定 skill
|
|
566
|
+
"denied_skills": ["*"] // 禁用所有 skills
|
|
567
|
+
}
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### 源码参考
|
|
571
|
+
|
|
572
|
+
- Skills 加载器:`src/illusion/skills/loader.py`
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## Hooks 配置
|
|
577
|
+
|
|
578
|
+
### 加载来源
|
|
579
|
+
|
|
580
|
+
Hooks 可以从以下位置加载:
|
|
581
|
+
- 全局 `settings.json` 的 `hooks` 字段
|
|
582
|
+
- 插件的 `hooks.json` 文件
|
|
583
|
+
|
|
584
|
+
### 项目级禁用
|
|
585
|
+
|
|
586
|
+
在 `<project>/.illusion/permissions.json` 的 `denied_hooks` 字段中控制:
|
|
587
|
+
|
|
588
|
+
```json
|
|
589
|
+
{
|
|
590
|
+
"denied_hooks": ["PreToolUse"] // 禁用特定事件的 hooks
|
|
591
|
+
"denied_hooks": ["*"] // 禁用所有 hooks
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### 源码参考
|
|
596
|
+
|
|
597
|
+
- Hooks 加载器:`src/illusion/hooks/loader.py`
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
## Commands 配置
|
|
602
|
+
|
|
603
|
+
### 命令类型
|
|
604
|
+
|
|
605
|
+
IllusionCode 的斜杠命令分为两类:
|
|
606
|
+
|
|
607
|
+
1. **内置命令**:如 `/help`、`/model`、`/skills` 等,硬编码注册,不可禁用
|
|
608
|
+
2. **插件命令**:通过插件的 `commands/` 或 `skills/` 目录提供,遵循插件的启用/禁用规则
|
|
609
|
+
|
|
610
|
+
### 插件命令的启用/禁用
|
|
611
|
+
|
|
612
|
+
- 通过 `enabled_plugins` 控制插件整体启用/禁用
|
|
613
|
+
- 通过 `denied_plugins` 项目级禁用插件
|
|
614
|
+
- 插件禁用后,其提供的所有命令都会被禁用
|
|
615
|
+
|
|
616
|
+
### 源码参考
|
|
617
|
+
|
|
618
|
+
- 命令注册表:`src/illusion/commands/registry.py`
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## Rules 配置
|
|
623
|
+
|
|
624
|
+
### 加载来源
|
|
625
|
+
|
|
626
|
+
Rules 从以下位置加载:
|
|
627
|
+
- `.claude/rules/*.md`
|
|
628
|
+
- `.illusion/rules/*.md`
|
|
629
|
+
|
|
630
|
+
### 项目级禁用
|
|
631
|
+
|
|
632
|
+
在 `<project>/.illusion/permissions.json` 的 `denied_rules` 字段中控制:
|
|
633
|
+
|
|
634
|
+
```json
|
|
635
|
+
{
|
|
636
|
+
"denied_rules": ["rule-name"] // 禁用特定 rule
|
|
637
|
+
"denied_rules": ["*"] // 禁用所有 rules
|
|
638
|
+
}
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
### 源码参考
|
|
642
|
+
|
|
643
|
+
- Rules 发现逻辑:`src/illusion/prompts/claudemd.py`
|
|
@@ -119,3 +119,47 @@ metadata:
|
|
|
119
119
|
- 路径解析:`src/illusion/memory/paths.py`
|
|
120
120
|
- 加载逻辑:`src/illusion/memory/memdir.py`
|
|
121
121
|
- 管理功能:`src/illusion/memory/manager.py`
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 项目级权限配置 (permissions.json)
|
|
126
|
+
|
|
127
|
+
项目级 `permissions.json` 文件位于 `<project>/.illusion/permissions.json`,用于控制该项目的权限和禁用开关。
|
|
128
|
+
|
|
129
|
+
### 配置示例
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"always_allow_tools": ["read_file", "grep"],
|
|
134
|
+
"denied_tools": ["bash"],
|
|
135
|
+
"denied_skills": ["dangerous-skill"],
|
|
136
|
+
"denied_hooks": ["PreToolUse"],
|
|
137
|
+
"denied_plugins": ["unwanted-plugin"],
|
|
138
|
+
"denied_mcp_servers": ["external-server"],
|
|
139
|
+
"denied_memory": false
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 配置字段说明
|
|
144
|
+
|
|
145
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
146
|
+
|------|------|--------|------|
|
|
147
|
+
| `always_allow_tools` | list | `[]` | 始终允许的工具列表 |
|
|
148
|
+
| `denied_tools` | list | `[]` | 始终拒绝的工具列表 |
|
|
149
|
+
| `denied_skills` | list | `[]` | 禁用的 skill 名称列表,`["*"]` 表示全部禁用 |
|
|
150
|
+
| `denied_hooks` | list | `[]` | 禁用的 hook 事件列表,`["*"]` 表示全部禁用 |
|
|
151
|
+
| `denied_plugins` | list | `[]` | 禁用的插件名称列表,`["*"]` 表示全部禁用 |
|
|
152
|
+
| `denied_mcp_servers` | list | `[]` | 禁用的 MCP 服务器名称列表,`["*"]` 表示全部禁用 |
|
|
153
|
+
| `denied_memory` | bool | `false` | 是否禁用 memory 功能 |
|
|
154
|
+
| `denied_rules` | list | `[]` | 禁用的规则名称列表,`["*"]` 表示全部禁用 |
|
|
155
|
+
|
|
156
|
+
### 优先级规则
|
|
157
|
+
|
|
158
|
+
1. 项目级 `permissions.json` — 最高优先级
|
|
159
|
+
2. 全局 `settings.json` — 次优先级
|
|
160
|
+
3. 默认值 — 最低优先级
|
|
161
|
+
|
|
162
|
+
### 源码参考
|
|
163
|
+
|
|
164
|
+
- 权限加载器:`src/illusion/permissions/loader.py`
|
|
165
|
+
- 权限数据类:`src/illusion/permissions/schemas.py`
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@illusion/terminal",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@illusion/terminal",
|
|
9
|
-
"version": "0.2.
|
|
9
|
+
"version": "0.2.2",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"chalk": "^5.6.2",
|
|
12
12
|
"ink": "^5.1.0",
|
|
@@ -340,6 +340,12 @@ function AppInner({config}: {config: FrontendConfig}): React.JSX.Element {
|
|
|
340
340
|
return true;
|
|
341
341
|
}
|
|
342
342
|
|
|
343
|
+
// /skills → 显示技能选择器
|
|
344
|
+
if (trimmed === '/skills') {
|
|
345
|
+
session.sendRequest({type: 'select_command', command: 'skills'});
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
|
|
343
349
|
// /context → 显示上下文管理选择器
|
|
344
350
|
if (trimmed === '/context') {
|
|
345
351
|
session.sendRequest({type: 'select_command', command: 'context'});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@illusion/web",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@illusion/web",
|
|
9
|
-
"version": "0.2.
|
|
9
|
+
"version": "0.2.2",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"highlight.js": "^11.11.0",
|
|
12
12
|
"react": "^18.3.1",
|
|
@@ -107,20 +107,57 @@ async def reload_plugins_handler(_: str, context: CommandContext) -> CommandResu
|
|
|
107
107
|
|
|
108
108
|
async def skills_handler(args: str, context: CommandContext) -> CommandResult:
|
|
109
109
|
"""列出或显示可用技能"""
|
|
110
|
+
from illusion.skills.loader import get_user_skills_dir, get_project_skills_dir
|
|
111
|
+
|
|
110
112
|
skill_registry = load_skill_registry(context.cwd)
|
|
111
|
-
if args:
|
|
112
|
-
skill = skill_registry.get(args)
|
|
113
|
-
if skill is None:
|
|
114
|
-
return CommandResult(message=f"Skill not found: {args}")
|
|
115
|
-
return CommandResult(message=skill.content)
|
|
116
113
|
skills = skill_registry.list_skills()
|
|
114
|
+
|
|
117
115
|
if not skills:
|
|
118
116
|
return CommandResult(message="No skills available.")
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
117
|
+
|
|
118
|
+
tokens = args.strip().split()
|
|
119
|
+
|
|
120
|
+
# /skills — 列出所有技能
|
|
121
|
+
if not tokens:
|
|
122
|
+
user_skills_dir = get_user_skills_dir()
|
|
123
|
+
project_skills_dir = get_project_skills_dir(context.cwd)
|
|
124
|
+
lines = ["Available skills:", ""]
|
|
125
|
+
if user_skills_dir.exists():
|
|
126
|
+
lines.append(f"User skills directory: {user_skills_dir}")
|
|
127
|
+
if project_skills_dir.exists():
|
|
128
|
+
lines.append(f"Project skills directory: {project_skills_dir}")
|
|
129
|
+
lines.append("")
|
|
130
|
+
for i, skill in enumerate(skills, 1):
|
|
131
|
+
source = f" [{skill.source}]"
|
|
132
|
+
first_line = skill.description.split("\n", 1)[0][:60] if skill.description else "(empty)"
|
|
133
|
+
lines.append(f" {i}. {skill.name}{source} — {first_line}")
|
|
134
|
+
lines.append("")
|
|
135
|
+
lines.append("Usage: /skills <name|number> — view a specific skill")
|
|
136
|
+
return CommandResult(message="\n".join(lines))
|
|
137
|
+
|
|
138
|
+
# /skills <name|number> — 显示指定技能内容
|
|
139
|
+
target = tokens[0]
|
|
140
|
+
selected = None
|
|
141
|
+
|
|
142
|
+
# 按序号查找
|
|
143
|
+
try:
|
|
144
|
+
idx = int(target) - 1
|
|
145
|
+
if 0 <= idx < len(skills):
|
|
146
|
+
selected = skills[idx]
|
|
147
|
+
except ValueError:
|
|
148
|
+
pass
|
|
149
|
+
|
|
150
|
+
# 按名称查找
|
|
151
|
+
if selected is None:
|
|
152
|
+
for skill in skills:
|
|
153
|
+
if skill.name.lower() == target.lower():
|
|
154
|
+
selected = skill
|
|
155
|
+
break
|
|
156
|
+
|
|
157
|
+
if selected is None:
|
|
158
|
+
return CommandResult(message=f"Skill not found: {target}. Use /skills to list available skills.")
|
|
159
|
+
|
|
160
|
+
return CommandResult(message=selected.content)
|
|
124
161
|
|
|
125
162
|
|
|
126
163
|
async def files_handler(args: str, context: CommandContext) -> CommandResult:
|
|
@@ -14,8 +14,19 @@ async def rules_handler(args: str, context: CommandContext) -> CommandResult:
|
|
|
14
14
|
"""规则命令处理器"""
|
|
15
15
|
from illusion.skills.loader import get_project_rules_dir
|
|
16
16
|
|
|
17
|
+
# 加载项目级权限配置
|
|
18
|
+
from illusion.permissions.loader import load_project_permissions, is_rules_disabled, filter_rules_by_permissions
|
|
19
|
+
project_permissions = load_project_permissions(context.cwd)
|
|
20
|
+
|
|
21
|
+
# 检查是否禁用所有 rules
|
|
22
|
+
if is_rules_disabled(project_permissions):
|
|
23
|
+
return CommandResult(message="All rules are disabled")
|
|
24
|
+
|
|
17
25
|
rules_dir = get_project_rules_dir(context.cwd)
|
|
18
|
-
|
|
26
|
+
all_rule_files = sorted(rules_dir.glob("*.md"))
|
|
27
|
+
|
|
28
|
+
# 过滤掉被禁用的 rules
|
|
29
|
+
rule_files = filter_rules_by_permissions(all_rule_files, project_permissions)
|
|
19
30
|
|
|
20
31
|
if not rule_files:
|
|
21
32
|
return CommandResult(message=f"No rules found in {rules_dir}")
|
|
@@ -528,6 +528,7 @@ _COMMAND_SUBSTITUTIONS: list[tuple[str, str | Any]] = [
|
|
|
528
528
|
# 技能
|
|
529
529
|
(r"^Skill not found: (.+)$", r"未找到技能:\1"),
|
|
530
530
|
# 规则
|
|
531
|
+
(r"^All rules are disabled$", r"所有规则已被禁用"),
|
|
531
532
|
(r"^No rules found in (.+)$", r"在 \1 中未找到规则"),
|
|
532
533
|
(r"^Rule not found: (.+)\. Use /rules to list available rules\.$", r"未找到规则:\1。使用 /rules 查看可用规则。"),
|
|
533
534
|
# 状态行(多行消息的逐行翻译)
|
|
@@ -553,6 +554,10 @@ _COMMAND_SUBSTITUTIONS: list[tuple[str, str | Any]] = [
|
|
|
553
554
|
(r"^Bridge summary:$", r"Bridge 摘要:"),
|
|
554
555
|
(r"^Reloaded plugins:$", r"已重新加载插件:"),
|
|
555
556
|
(r"^Available skills:$", r"可用技能:"),
|
|
557
|
+
(r"^User skills directory: (.+)$", r"用户技能目录:\1"),
|
|
558
|
+
(r"^Project skills directory: (.+)$", r"项目技能目录:\1"),
|
|
559
|
+
(r"^Usage: /skills <name|number> — view a specific skill$", r"用法:/skills <名称|序号> — 查看指定技能"),
|
|
560
|
+
(r"^Skill not found: (.+)\. Use /skills to list available skills\.$", r"未找到技能:\1。使用 /skills 查看可用技能。"),
|
|
556
561
|
(r"^Rules directory: (.+)$", r"规则目录:\1"),
|
|
557
562
|
# 前缀行(doctor, privacy-settings, bridge, login, stats, permissions 等)
|
|
558
563
|
(r"^- backend host: available$", r"- 后端宿主:可用"),
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
11
|
from collections import defaultdict
|
|
12
|
+
from pathlib import Path
|
|
12
13
|
from typing import Any
|
|
13
14
|
|
|
14
15
|
from illusion.hooks.events import HookEvent
|
|
@@ -85,7 +86,7 @@ def _normalize_hooks_value(value: Any) -> list[HookMatcherDefinition]:
|
|
|
85
86
|
return result
|
|
86
87
|
|
|
87
88
|
|
|
88
|
-
def load_hook_registry(settings: Any, plugins: Any = None) -> HookRegistry:
|
|
89
|
+
def load_hook_registry(settings: Any, plugins: Any = None, cwd: str | Path | None = None) -> HookRegistry:
|
|
89
90
|
"""从设置对象加载钩子注册表。
|
|
90
91
|
|
|
91
92
|
事件名必须是 PascalCase(如 PreToolUse)。
|
|
@@ -93,11 +94,24 @@ def load_hook_registry(settings: Any, plugins: Any = None) -> HookRegistry:
|
|
|
93
94
|
"""
|
|
94
95
|
registry = HookRegistry()
|
|
95
96
|
|
|
97
|
+
# 加载项目级权限配置
|
|
98
|
+
from illusion.permissions.loader import load_project_permissions
|
|
99
|
+
project_permissions = load_project_permissions(cwd) if cwd else None
|
|
100
|
+
|
|
101
|
+
# 检查是否禁用所有 hooks
|
|
102
|
+
if project_permissions and "*" in project_permissions.denied_hooks:
|
|
103
|
+
return registry
|
|
104
|
+
|
|
96
105
|
for raw_event, hooks_value in settings.hooks.items():
|
|
97
106
|
try:
|
|
98
107
|
event = HookEvent(str(raw_event))
|
|
99
108
|
except ValueError:
|
|
100
109
|
continue
|
|
110
|
+
|
|
111
|
+
# 检查是否禁用特定事件的 hooks
|
|
112
|
+
if project_permissions and event.value in project_permissions.denied_hooks:
|
|
113
|
+
continue
|
|
114
|
+
|
|
101
115
|
for matcher_def in _normalize_hooks_value(hooks_value):
|
|
102
116
|
registry.register(event, matcher_def)
|
|
103
117
|
|
|
@@ -109,6 +123,11 @@ def load_hook_registry(settings: Any, plugins: Any = None) -> HookRegistry:
|
|
|
109
123
|
event = HookEvent(str(raw_event))
|
|
110
124
|
except ValueError:
|
|
111
125
|
continue
|
|
126
|
+
|
|
127
|
+
# 检查是否禁用特定事件的 hooks
|
|
128
|
+
if project_permissions and event.value in project_permissions.denied_hooks:
|
|
129
|
+
continue
|
|
130
|
+
|
|
112
131
|
for matcher_def in _normalize_hooks_value(hooks_value):
|
|
113
132
|
registry.register(event, matcher_def)
|
|
114
133
|
|
|
@@ -117,6 +117,14 @@ def load_mcp_server_configs(settings, plugins: list[LoadedPlugin], cwd: str | Pa
|
|
|
117
117
|
>>> for name, config in configs.items():
|
|
118
118
|
... print(f"{name}: {config}")
|
|
119
119
|
"""
|
|
120
|
+
# 加载项目级权限配置
|
|
121
|
+
from illusion.permissions.loader import load_project_permissions
|
|
122
|
+
project_permissions = load_project_permissions(cwd) if cwd else None
|
|
123
|
+
|
|
124
|
+
# 检查是否禁用所有 MCP 服务器
|
|
125
|
+
if project_permissions and "*" in project_permissions.denied_mcp_servers:
|
|
126
|
+
return {}
|
|
127
|
+
|
|
120
128
|
# 从全局设置中获取 MCP 服务器配置(跳过已禁用的服务器)
|
|
121
129
|
servers = {name: cfg for name, cfg in settings.mcp_servers.items()
|
|
122
130
|
if getattr(cfg, "enabled", True)}
|
|
@@ -137,4 +145,12 @@ def load_mcp_server_configs(settings, plugins: list[LoadedPlugin], cwd: str | Pa
|
|
|
137
145
|
continue
|
|
138
146
|
# 使用 "插件名:服务器名" 格式作为键,避免与全局设置冲突
|
|
139
147
|
servers.setdefault(f"{plugin.manifest.name}:{name}", config)
|
|
148
|
+
|
|
149
|
+
# 过滤掉被禁用的 MCP 服务器
|
|
150
|
+
if project_permissions:
|
|
151
|
+
servers = {
|
|
152
|
+
name: cfg for name, cfg in servers.items()
|
|
153
|
+
if name not in project_permissions.denied_mcp_servers
|
|
154
|
+
}
|
|
155
|
+
|
|
140
156
|
return servers
|
|
@@ -28,30 +28,66 @@ from re import sub
|
|
|
28
28
|
from illusion.memory.paths import get_memory_entrypoint, get_project_memory_dir
|
|
29
29
|
|
|
30
30
|
|
|
31
|
+
def is_memory_enabled(cwd: str | Path) -> bool:
|
|
32
|
+
"""检查记忆功能是否启用
|
|
33
|
+
|
|
34
|
+
检查项目级权限配置中的 denied_memory 字段。
|
|
35
|
+
如果 denied_memory 为 True,则禁用记忆功能。
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
cwd: 当前工作目录
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
bool: 记忆功能是否启用
|
|
42
|
+
"""
|
|
43
|
+
from illusion.permissions.loader import load_project_permissions
|
|
44
|
+
project_permissions = load_project_permissions(cwd)
|
|
45
|
+
|
|
46
|
+
# 检查项目级权限配置
|
|
47
|
+
if project_permissions.denied_memory:
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
# 检查全局配置
|
|
51
|
+
from illusion.config.settings import load_settings
|
|
52
|
+
settings = load_settings()
|
|
53
|
+
return settings.memory.enabled
|
|
54
|
+
|
|
55
|
+
|
|
31
56
|
def list_memory_files(cwd: str | Path) -> list[Path]:
|
|
32
57
|
"""列出项目的所有记忆markdown文件
|
|
33
|
-
|
|
58
|
+
|
|
34
59
|
Args:
|
|
35
60
|
cwd: 当前工作目录
|
|
36
|
-
|
|
61
|
+
|
|
37
62
|
Returns:
|
|
38
63
|
list[Path]: 排序后的记忆文件路径列表
|
|
39
64
|
"""
|
|
65
|
+
# 检查记忆功能是否启用
|
|
66
|
+
if not is_memory_enabled(cwd):
|
|
67
|
+
return []
|
|
68
|
+
|
|
40
69
|
memory_dir = get_project_memory_dir(cwd) # 获取记忆目录
|
|
41
70
|
return sorted(path for path in memory_dir.glob("*.md")) # 返回排序后的文件列表
|
|
42
71
|
|
|
43
72
|
|
|
44
73
|
def add_memory_entry(cwd: str | Path, title: str, content: str) -> Path:
|
|
45
74
|
"""创建记忆文件并添加到MEMORY.md索引
|
|
46
|
-
|
|
75
|
+
|
|
47
76
|
Args:
|
|
48
77
|
cwd: 当前工作目录
|
|
49
78
|
title: 记忆标题
|
|
50
79
|
content: 记忆内容
|
|
51
|
-
|
|
80
|
+
|
|
52
81
|
Returns:
|
|
53
82
|
Path: 创建的记忆文件路径
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
RuntimeError: 记忆功能被禁用时抛出
|
|
54
86
|
"""
|
|
87
|
+
# 检查记忆功能是否启用
|
|
88
|
+
if not is_memory_enabled(cwd):
|
|
89
|
+
raise RuntimeError("Memory is disabled by project permissions")
|
|
90
|
+
|
|
55
91
|
memory_dir = get_project_memory_dir(cwd) # 获取记忆目录
|
|
56
92
|
slug = sub(r"[^a-zA-Z0-9]+", "_", title.strip().lower()).strip("_") or "memory" # 转换为slug
|
|
57
93
|
path = memory_dir / f"{slug}.md" # 构建文件路径
|
|
@@ -67,14 +103,21 @@ def add_memory_entry(cwd: str | Path, title: str, content: str) -> Path:
|
|
|
67
103
|
|
|
68
104
|
def remove_memory_entry(cwd: str | Path, name: str) -> bool:
|
|
69
105
|
"""删除记忆文件及其在MEMORY.md中的索引条目
|
|
70
|
-
|
|
106
|
+
|
|
71
107
|
Args:
|
|
72
108
|
cwd: 当前工作目录
|
|
73
109
|
name: 记忆文件名称 (不带.md扩展名)
|
|
74
|
-
|
|
110
|
+
|
|
75
111
|
Returns:
|
|
76
112
|
bool: 是否成功删除
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
RuntimeError: 记忆功能被禁用时抛出
|
|
77
116
|
"""
|
|
117
|
+
# 检查记忆功能是否启用
|
|
118
|
+
if not is_memory_enabled(cwd):
|
|
119
|
+
raise RuntimeError("Memory is disabled by project permissions")
|
|
120
|
+
|
|
78
121
|
memory_dir = get_project_memory_dir(cwd) # 获取记忆目录
|
|
79
122
|
matches = [path for path in memory_dir.glob("*.md") if path.stem == name or path.name == name] # 查找匹配文件
|
|
80
123
|
if not matches: # 没有匹配
|