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.
Files changed (512) hide show
  1. {illusion_code-0.2.1 → illusion_code-0.2.2}/PKG-INFO +1 -1
  2. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/extensions.md +208 -0
  3. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/project-files.md +44 -0
  4. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/package-lock.json +2 -2
  5. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/package.json +1 -1
  6. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/App.tsx +6 -0
  7. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/version.ts +1 -1
  8. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/package-lock.json +2 -2
  9. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/package.json +1 -1
  10. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/version.ts +1 -1
  11. {illusion_code-0.2.1 → illusion_code-0.2.2}/pyproject.toml +1 -1
  12. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/__init__.py +1 -1
  13. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/misc.py +47 -10
  14. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/rules.py +12 -1
  15. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/i18n.py +5 -0
  16. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/loader.py +20 -1
  17. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/config.py +16 -0
  18. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/manager.py +49 -6
  19. illusion_code-0.2.2/src/illusion/permissions/__init__.py +73 -0
  20. illusion_code-0.2.2/src/illusion/permissions/loader.py +85 -0
  21. illusion_code-0.2.2/src/illusion/permissions/schemas.py +40 -0
  22. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/loader.py +11 -0
  23. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/claudemd.py +15 -6
  24. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/context.py +43 -28
  25. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/loader.py +88 -8
  26. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/backend_host.py +65 -7
  27. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/web/ws_host.py +49 -2
  28. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/utils/ripgrep.py +12 -4
  29. illusion_code-0.2.2/tests/test_hooks/test_loader_permissions.py +85 -0
  30. illusion_code-0.2.2/tests/test_mcp/test_config_permissions.py +71 -0
  31. illusion_code-0.2.2/tests/test_memory/test_manager_permissions.py +131 -0
  32. illusion_code-0.2.2/tests/test_permissions/test_loader.py +121 -0
  33. illusion_code-0.2.2/tests/test_permissions/test_project_permissions.py +58 -0
  34. illusion_code-0.2.2/tests/test_plugins/test_loader_permissions.py +68 -0
  35. illusion_code-0.2.2/tests/test_prompts/test_claudemd_permissions.py +77 -0
  36. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_skills/test_loader.py +19 -0
  37. illusion_code-0.2.2/tests/test_skills/test_loader_permissions.py +61 -0
  38. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_ripgrep.py +3 -0
  39. illusion_code-0.2.1/src/illusion/permissions/__init__.py +0 -39
  40. {illusion_code-0.2.1 → illusion_code-0.2.2}/.github/workflows/publish.yml +0 -0
  41. {illusion_code-0.2.1 → illusion_code-0.2.2}/.gitignore +0 -0
  42. {illusion_code-0.2.1 → illusion_code-0.2.2}/.python-version +0 -0
  43. {illusion_code-0.2.1 → illusion_code-0.2.2}/LICENSE +0 -0
  44. {illusion_code-0.2.1 → illusion_code-0.2.2}/README.md +0 -0
  45. {illusion_code-0.2.1 → illusion_code-0.2.2}/README.zh-CN.md +0 -0
  46. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/architecture.md +0 -0
  47. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/channels.md +0 -0
  48. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/commands.md +0 -0
  49. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/extensions.md +0 -0
  50. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/getting-started.md +0 -0
  51. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/introduction.md +0 -0
  52. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/project-files.md +0 -0
  53. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/en/settings.md +0 -0
  54. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/images/IllusionCode.png +0 -0
  55. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/images/image1.png +0 -0
  56. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/images/image2.png +0 -0
  57. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/architecture.md +0 -0
  58. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/channels.md +0 -0
  59. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/commands.md +0 -0
  60. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/getting-started.md +0 -0
  61. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/introduction.md +0 -0
  62. {illusion_code-0.2.1 → illusion_code-0.2.2}/docs/zh-CN/settings.md +0 -0
  63. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/build.mjs +0 -0
  64. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/CommandPicker.tsx +0 -0
  65. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/Composer.tsx +0 -0
  66. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ComposerController.tsx +0 -0
  67. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ConversationView.tsx +0 -0
  68. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/Footer.tsx +0 -0
  69. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/MarkdownContent.tsx +0 -0
  70. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/MarkdownTable.tsx +0 -0
  71. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ModalHost.tsx +0 -0
  72. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/MultilineTextInput.tsx +0 -0
  73. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/PromptInput.tsx +0 -0
  74. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/SelectModal.tsx +0 -0
  75. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/SidePanel.tsx +0 -0
  76. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/Spinner.tsx +0 -0
  77. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/StatusBar.tsx +0 -0
  78. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/SwarmPanel.tsx +0 -0
  79. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/TodoPanel.tsx +0 -0
  80. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/ToolCallDisplay.tsx +0 -0
  81. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/TranscriptPane.tsx +0 -0
  82. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/components/WelcomeBanner.tsx +0 -0
  83. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useAnimationFrame.ts +0 -0
  84. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useBackendSession.ts +0 -0
  85. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useBlink.ts +0 -0
  86. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/hooks/useTerminalSize.ts +0 -0
  87. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/i18n.ts +0 -0
  88. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/index.tsx +0 -0
  89. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/theme/ThemeContext.tsx +0 -0
  90. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/theme/builtinThemes.ts +0 -0
  91. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/ToolInterface.ts +0 -0
  92. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/AgentTool.ts +0 -0
  93. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/BashTool.ts +0 -0
  94. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/CronTool.ts +0 -0
  95. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/EditTool.ts +0 -0
  96. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/GenericTool.ts +0 -0
  97. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/LspTool.ts +0 -0
  98. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/McpTool.ts +0 -0
  99. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/NotebookTool.ts +0 -0
  100. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/PlanTool.ts +0 -0
  101. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/ReadTool.ts +0 -0
  102. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/SearchTool.ts +0 -0
  103. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/SkillTool.ts +0 -0
  104. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/TaskTool.ts +0 -0
  105. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/WebTool.ts +0 -0
  106. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/WorktreeTool.ts +0 -0
  107. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/implementations/WriteTool.ts +0 -0
  108. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/tools/registry.ts +0 -0
  109. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/types.ts +0 -0
  110. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/utils/markdown.ts +0 -0
  111. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/src/utils/thinking.ts +0 -0
  112. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/terminal/tsconfig.json +0 -0
  113. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/index.html +0 -0
  114. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/postcss.config.js +0 -0
  115. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/App.tsx +0 -0
  116. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/ChatArea.tsx +0 -0
  117. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/MessageBubble.tsx +0 -0
  118. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/ModalCard.tsx +0 -0
  119. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/PromptInput.tsx +0 -0
  120. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/RightPanel.tsx +0 -0
  121. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/Sidebar.tsx +0 -0
  122. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/TodoPanel.tsx +0 -0
  123. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/Toolbar.tsx +0 -0
  124. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/components/WelcomeScreen.tsx +0 -0
  125. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/hooks/useWebSocketSession.ts +0 -0
  126. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/i18n.ts +0 -0
  127. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/index.css +0 -0
  128. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/main.tsx +0 -0
  129. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/remarkSuperscript.ts +0 -0
  130. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/types/protocol.ts +0 -0
  131. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/src/vite-env.d.ts +0 -0
  132. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/tailwind.config.js +0 -0
  133. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/tsconfig.json +0 -0
  134. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/tsconfig.node.json +0 -0
  135. {illusion_code-0.2.1 → illusion_code-0.2.2}/frontend/web/vite.config.ts +0 -0
  136. {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/build_frontend.py +0 -0
  137. {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/hatch_build.py +0 -0
  138. {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/publish.py +0 -0
  139. {illusion_code-0.2.1 → illusion_code-0.2.2}/scripts/sync_version.py +0 -0
  140. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/__main__.py +0 -0
  141. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/__init__.py +0 -0
  142. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/client.py +0 -0
  143. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/codex_client.py +0 -0
  144. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/compat.py +0 -0
  145. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/effort.py +0 -0
  146. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/errors.py +0 -0
  147. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/openai_client.py +0 -0
  148. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/provider.py +0 -0
  149. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/registry.py +0 -0
  150. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/api/usage.py +0 -0
  151. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/__init__.py +0 -0
  152. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/codex_oauth.py +0 -0
  153. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/copilot.py +0 -0
  154. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/external.py +0 -0
  155. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/flows.py +0 -0
  156. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/manager.py +0 -0
  157. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/auth/storage.py +0 -0
  158. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/__init__.py +0 -0
  159. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/manager.py +0 -0
  160. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/session_runner.py +0 -0
  161. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/types.py +0 -0
  162. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/bridge/work_secret.py +0 -0
  163. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/__init__.py +0 -0
  164. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/base.py +0 -0
  165. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/base_commands.py +0 -0
  166. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/config.py +0 -0
  167. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/__init__.py +0 -0
  168. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/adapter.py +0 -0
  169. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/commands.py +0 -0
  170. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/messaging.py +0 -0
  171. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/session_map.py +0 -0
  172. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/feishu/ws_client.py +0 -0
  173. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/pid.py +0 -0
  174. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/__init__.py +0 -0
  175. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/adapter.py +0 -0
  176. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/api.py +0 -0
  177. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/commands.py +0 -0
  178. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/session_map.py +0 -0
  179. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/qq/ws_client.py +0 -0
  180. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/serve.py +0 -0
  181. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/tools/__init__.py +0 -0
  182. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/tools/feishu_doc.py +0 -0
  183. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/tools/feishu_drive.py +0 -0
  184. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/__init__.py +0 -0
  185. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/adapter.py +0 -0
  186. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/commands.py +0 -0
  187. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/ilink_api.py +0 -0
  188. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/channels/weixin/session_map.py +0 -0
  189. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/cli.py +0 -0
  190. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/__init__.py +0 -0
  191. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/auth.py +0 -0
  192. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/bridge.py +0 -0
  193. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/context.py +0 -0
  194. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/git.py +0 -0
  195. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/helpers.py +0 -0
  196. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/__init__.py +0 -0
  197. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/__init__.py +0 -0
  198. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/architecture.py +0 -0
  199. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/conventions.py +0 -0
  200. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/dependencies.py +0 -0
  201. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/analysis/key_modules.py +0 -0
  202. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/__init__.py +0 -0
  203. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/lsp_symbols.py +0 -0
  204. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/readme.py +0 -0
  205. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/extraction/scanner.py +0 -0
  206. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/__init__.py +0 -0
  207. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/claudemd.py +0 -0
  208. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/illusionmd.py +0 -0
  209. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/memory_template.py +0 -0
  210. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/rules.py +0 -0
  211. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/generation/sections.py +0 -0
  212. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/orchestrator.py +0 -0
  213. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/init/types.py +0 -0
  214. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/mcp.py +0 -0
  215. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/memory.py +0 -0
  216. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/model.py +0 -0
  217. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/plugin.py +0 -0
  218. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/registry.py +0 -0
  219. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/sandbox.py +0 -0
  220. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/session.py +0 -0
  221. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/settings.py +0 -0
  222. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/commands/types.py +0 -0
  223. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/__init__.py +0 -0
  224. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/paths.py +0 -0
  225. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/plan_file.py +0 -0
  226. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/config/settings.py +0 -0
  227. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/coordinator/__init__.py +0 -0
  228. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/coordinator/agent_definitions.py +0 -0
  229. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/coordinator/coordinator_mode.py +0 -0
  230. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/__init__.py +0 -0
  231. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/cost_tracker.py +0 -0
  232. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/messages.py +0 -0
  233. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/query.py +0 -0
  234. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/query_engine.py +0 -0
  235. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/engine/stream_events.py +0 -0
  236. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/__init__.py +0 -0
  237. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/events.py +0 -0
  238. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/executor.py +0 -0
  239. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/hot_reload.py +0 -0
  240. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/register_hooks.py +0 -0
  241. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/schemas.py +0 -0
  242. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/session_hooks.py +0 -0
  243. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/types.py +0 -0
  244. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/hooks/utils.py +0 -0
  245. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/__init__.py +0 -0
  246. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/client.py +0 -0
  247. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/mcp/types.py +0 -0
  248. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/__init__.py +0 -0
  249. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/memdir.py +0 -0
  250. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/paths.py +0 -0
  251. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/scan.py +0 -0
  252. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/search.py +0 -0
  253. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/memory/types.py +0 -0
  254. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/output_styles/__init__.py +0 -0
  255. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/output_styles/loader.py +0 -0
  256. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/permissions/checker.py +0 -0
  257. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/permissions/modes.py +0 -0
  258. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/platforms.py +0 -0
  259. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/__init__.py +0 -0
  260. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/installer.py +0 -0
  261. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/options.py +0 -0
  262. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/schemas.py +0 -0
  263. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/plugins/types.py +0 -0
  264. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/__init__.py +0 -0
  265. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/environment.py +0 -0
  266. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/prompts/system_prompt.py +0 -0
  267. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/__init__.py +0 -0
  268. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/adapter.py +0 -0
  269. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/__init__.py +0 -0
  270. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/base.py +0 -0
  271. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/linux.py +0 -0
  272. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/macos.py +0 -0
  273. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/platforms/windows.py +0 -0
  274. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/proxy/__init__.py +0 -0
  275. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/proxy/env_vars.py +0 -0
  276. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/runtime.py +0 -0
  277. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/symlink_protection.py +0 -0
  278. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/utils.py +0 -0
  279. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/sandbox/violation_store.py +0 -0
  280. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/__init__.py +0 -0
  281. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/__init__.py +0 -0
  282. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/auto_compact.py +0 -0
  283. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/compact_core.py +0 -0
  284. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/compact_prompt.py +0 -0
  285. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/constants.py +0 -0
  286. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/message_ops.py +0 -0
  287. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/microcompact.py +0 -0
  288. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/models.py +0 -0
  289. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/compact/token_utils.py +0 -0
  290. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/cron.py +0 -0
  291. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/cron_scheduler.py +0 -0
  292. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/file_history.py +0 -0
  293. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/__init__.py +0 -0
  294. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/client.py +0 -0
  295. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/config.py +0 -0
  296. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/manager.py +0 -0
  297. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/lsp/types.py +0 -0
  298. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/session_storage.py +0 -0
  299. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/services/token_estimation.py +0 -0
  300. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/__init__.py +0 -0
  301. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/__init__.py +0 -0
  302. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/batch.md +0 -0
  303. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/debug.md +0 -0
  304. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/loop.md +0 -0
  305. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/remember.md +0 -0
  306. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/simplify.md +0 -0
  307. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/skillify.md +0 -0
  308. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/stuck.md +0 -0
  309. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/update-config.md +0 -0
  310. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/bundled/content/verify.md +0 -0
  311. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/registry.py +0 -0
  312. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/skills/types.py +0 -0
  313. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/state/__init__.py +0 -0
  314. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/state/app_state.py +0 -0
  315. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/state/store.py +0 -0
  316. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/__init__.py +0 -0
  317. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/agent_executor.py +0 -0
  318. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/in_process.py +0 -0
  319. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/subprocess_backend.py +0 -0
  320. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/team_helpers.py +0 -0
  321. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/types.py +0 -0
  322. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/swarm/worktree.py +0 -0
  323. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/__init__.py +0 -0
  324. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/local_agent_task.py +0 -0
  325. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/local_shell_task.py +0 -0
  326. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/manager.py +0 -0
  327. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/stop_task.py +0 -0
  328. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tasks/types.py +0 -0
  329. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/__init__.py +0 -0
  330. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/agent_tool.py +0 -0
  331. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/ask_user_question_tool.py +0 -0
  332. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/base.py +0 -0
  333. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/bash_tool.py +0 -0
  334. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/config_tool.py +0 -0
  335. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/cron_tool.py +0 -0
  336. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/enter_plan_mode_tool.py +0 -0
  337. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/enter_worktree_tool.py +0 -0
  338. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/exit_plan_mode_tool.py +0 -0
  339. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/exit_worktree_tool.py +0 -0
  340. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/file_edit_tool.py +0 -0
  341. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/file_read_tool.py +0 -0
  342. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/file_write_tool.py +0 -0
  343. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/glob_tool.py +0 -0
  344. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/grep_tool.py +0 -0
  345. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/list_mcp_resources_tool.py +0 -0
  346. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/lsp_formatters.py +0 -0
  347. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/lsp_schemas.py +0 -0
  348. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/lsp_tool.py +0 -0
  349. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/mcp_auth_tool.py +0 -0
  350. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/mcp_tool.py +0 -0
  351. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/notebook_edit_tool.py +0 -0
  352. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/powershell_tool.py +0 -0
  353. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/read_mcp_resource_tool.py +0 -0
  354. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/repl_tool.py +0 -0
  355. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/send_message_tool.py +0 -0
  356. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/shell_common.py +0 -0
  357. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/skill_tool.py +0 -0
  358. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/sleep_tool.py +0 -0
  359. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/structured_output_tool.py +0 -0
  360. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_create_tool.py +0 -0
  361. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_get_tool.py +0 -0
  362. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_list_tool.py +0 -0
  363. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_output_tool.py +0 -0
  364. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_stop_tool.py +0 -0
  365. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/task_update_tool.py +0 -0
  366. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/team_create_tool.py +0 -0
  367. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/team_delete_tool.py +0 -0
  368. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/todo_write_tool.py +0 -0
  369. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/tool_search_tool.py +0 -0
  370. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/web_fetch_tool.py +0 -0
  371. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/tools/web_search_tool.py +0 -0
  372. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/__init__.py +0 -0
  373. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/app.py +0 -0
  374. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/input.py +0 -0
  375. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/output.py +0 -0
  376. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/permission_dialog.py +0 -0
  377. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/permission_store.py +0 -0
  378. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/protocol.py +0 -0
  379. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/react_launcher.py +0 -0
  380. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/runtime.py +0 -0
  381. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/textual_app.py +0 -0
  382. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/web/__init__.py +0 -0
  383. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/ui/web/server.py +0 -0
  384. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/utils/__init__.py +0 -0
  385. {illusion_code-0.2.1 → illusion_code-0.2.2}/src/illusion/utils/shell.py +0 -0
  386. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/__init__.py +0 -0
  387. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_anthropic_client.py +0 -0
  388. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_client.py +0 -0
  389. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_codex_client.py +0 -0
  390. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_effort.py +0 -0
  391. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_fallback/346/217/220/347/244/272.py" +0 -0
  392. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/api/test_openai_client.py +0 -0
  393. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/__init__.py +0 -0
  394. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/__init__.py +0 -0
  395. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/test_adapter.py +0 -0
  396. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/test_commands.py +0 -0
  397. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/feishu/test_session_map.py +0 -0
  398. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_base.py +0 -0
  399. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_base_commands.py +0 -0
  400. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_config.py +0 -0
  401. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_pid.py +0 -0
  402. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/test_tool_registration.py +0 -0
  403. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/tools/__init__.py +0 -0
  404. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/tools/test_feishu_doc.py +0 -0
  405. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/tools/test_feishu_drive.py +0 -0
  406. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/__init__.py +0 -0
  407. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_adapter.py +0 -0
  408. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_config.py +0 -0
  409. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_ilink_api.py +0 -0
  410. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/channels/weixin/test_session_map.py +0 -0
  411. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/__init__.py +0 -0
  412. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_claudemd.py +0 -0
  413. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_orchestrator.py +0 -0
  414. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_scanner.py +0 -0
  415. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/init/test_sections.py +0 -0
  416. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/commands/test_effort_command.py +0 -0
  417. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/config/test_i18n.py +0 -0
  418. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/config/test_settings.py +0 -0
  419. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/conftest.py +0 -0
  420. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/engine/test_query_engine.py +0 -0
  421. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/fixtures/fake_mcp_server.py +0 -0
  422. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/integration/test_effort_integration.py +0 -0
  423. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_client.py +0 -0
  424. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_config.py +0 -0
  425. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_manager.py +0 -0
  426. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/services/lsp/test_lsp_types.py +0 -0
  427. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/__init__.py +0 -0
  428. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_client.py +0 -0
  429. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_codex_client.py +0 -0
  430. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_compat.py +0 -0
  431. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_api/test_openai_client.py +0 -0
  432. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_auth/test_external.py +0 -0
  433. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_bridge/test_core.py +0 -0
  434. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_bridge/test_session_flow.py +0 -0
  435. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/__init__.py +0 -0
  436. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/test_cli.py +0 -0
  437. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/test_command_flows.py +0 -0
  438. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_commands/test_registry.py +0 -0
  439. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_config/__init__.py +0 -0
  440. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_config/test_paths.py +0 -0
  441. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_config/test_settings.py +0 -0
  442. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_coordinator/test_agent_definitions.py +0 -0
  443. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_coordinator/test_coordinator_mode.py +0 -0
  444. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/__init__.py +0 -0
  445. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/test_media_block.py +0 -0
  446. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/test_query_engine.py +0 -0
  447. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_engine/test_tool_result_media.py +0 -0
  448. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_hooks/__init__.py +0 -0
  449. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_hooks/test_executor.py +0 -0
  450. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_hooks_skills_plugins_real.py +0 -0
  451. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_mcp/__init__.py +0 -0
  452. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_mcp/test_integration.py +0 -0
  453. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_mcp/test_stdio_flow.py +0 -0
  454. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_memory/__init__.py +0 -0
  455. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_memory/test_memdir.py +0 -0
  456. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_merged_prs_on_autoagent.py +0 -0
  457. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_permissions/__init__.py +0 -0
  458. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_permissions/test_checker.py +0 -0
  459. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_platforms.py +0 -0
  460. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_plugins/__init__.py +0 -0
  461. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_plugins/test_lifecycle_flow.py +0 -0
  462. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_plugins/test_loader.py +0 -0
  463. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/__init__.py +0 -0
  464. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/test_claudemd.py +0 -0
  465. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/test_environment.py +0 -0
  466. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_prompts/test_system_prompt.py +0 -0
  467. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_qq_channel.py +0 -0
  468. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_real_large_tasks.py +0 -0
  469. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_adapter.py +0 -0
  470. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_config_schema.py +0 -0
  471. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_platform_linux.py +0 -0
  472. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_platform_macos.py +0 -0
  473. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_platform_windows.py +0 -0
  474. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_proxy_env_vars.py +0 -0
  475. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_runtime.py +0 -0
  476. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_symlink_protection.py +0 -0
  477. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_utils.py +0 -0
  478. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_sandbox/test_violation_store.py +0 -0
  479. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_scripts/test_sync_version.py +0 -0
  480. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_compact.py +0 -0
  481. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_cron.py +0 -0
  482. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_cron_scheduler.py +0 -0
  483. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_services/test_session_storage.py +0 -0
  484. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/__init__.py +0 -0
  485. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_agent_executor.py +0 -0
  486. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_imports.py +0 -0
  487. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_in_process.py +0 -0
  488. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_types.py +0 -0
  489. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_swarm/test_worktree.py +0 -0
  490. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tasks/test_manager.py +0 -0
  491. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/__init__.py +0 -0
  492. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_agent_tool.py +0 -0
  493. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_core_tools.py +0 -0
  494. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_file_read_media.py +0 -0
  495. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_glob_tool.py +0 -0
  496. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_grep_tool.py +0 -0
  497. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_integration.py +0 -0
  498. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_integration_flows.py +0 -0
  499. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_mcp_auth_tool.py +0 -0
  500. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_shell_common.py +0 -0
  501. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_task_tools.py +0 -0
  502. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_team_tools.py +0 -0
  503. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_tools/test_web_fetch_tool.py +0 -0
  504. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/__init__.py +0 -0
  505. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_modes.py +0 -0
  506. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_permission_store.py +0 -0
  507. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_react_backend.py +0 -0
  508. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_react_launcher.py +0 -0
  509. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_ui/test_textual_app.py +0 -0
  510. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_untested_features.py +0 -0
  511. {illusion_code-0.2.1 → illusion_code-0.2.2}/tests/test_utils/test_shell.py +0 -0
  512. {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.1
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.1",
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.1",
9
+ "version": "0.2.2",
10
10
  "dependencies": {
11
11
  "chalk": "^5.6.2",
12
12
  "ink": "^5.1.0",
@@ -24,5 +24,5 @@
24
24
  "tsx": "^4.19.2",
25
25
  "typescript": "^5.7.3"
26
26
  },
27
- "version": "0.2.1"
27
+ "version": "0.2.2"
28
28
  }
@@ -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'});
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  /** 当前版本号 */
9
- export const VERSION = '0.2.1';
9
+ export const VERSION = '0.2.2';
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@illusion/web",
3
- "version": "0.2.1",
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.1",
9
+ "version": "0.2.2",
10
10
  "dependencies": {
11
11
  "highlight.js": "^11.11.0",
12
12
  "react": "^18.3.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@illusion/web",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  /** 当前版本号 */
9
- export const VERSION = '0.2.1';
9
+ export const VERSION = '0.2.2';
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "illusion-code"
7
- version = "0.2.1"
7
+ version = "0.2.2"
8
8
  description = "Open-source Python port of Claude Code - an AI-powered CLI coding assistant"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -23,4 +23,4 @@ IllusionCode 是一个 AI 驱动的编程助手,提供交互式会话和命令
23
23
 
24
24
  from __future__ import annotations
25
25
 
26
- __version__ = "0.2.1"
26
+ __version__ = "0.2.2"
@@ -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
- lines = ["Available skills:"]
120
- for skill in skills:
121
- source = f" [{skill.source}]"
122
- lines.append(f"- {skill.name}{source}: {skill.description}")
123
- return CommandResult(message="\n".join(lines))
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
- rule_files = sorted(rules_dir.glob("*.md"))
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: # 没有匹配