tianxincode 1.0.0
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.
- package/LICENSE +201 -0
- package/README.md +57 -0
- package/dist/api/api.types.d.ts +350 -0
- package/dist/api/api.types.d.ts.map +1 -0
- package/dist/api/api.types.js +12 -0
- package/dist/api/api.types.js.map +1 -0
- package/dist/api/chat.routes.d.ts +26 -0
- package/dist/api/chat.routes.d.ts.map +1 -0
- package/dist/api/chat.routes.js +275 -0
- package/dist/api/chat.routes.js.map +1 -0
- package/dist/api/config.routes.d.ts +10 -0
- package/dist/api/config.routes.d.ts.map +1 -0
- package/dist/api/config.routes.js +150 -0
- package/dist/api/config.routes.js.map +1 -0
- package/dist/api/db.routes.d.ts +12 -0
- package/dist/api/db.routes.d.ts.map +1 -0
- package/dist/api/db.routes.js +108 -0
- package/dist/api/db.routes.js.map +1 -0
- package/dist/api/files.routes.d.ts +14 -0
- package/dist/api/files.routes.d.ts.map +1 -0
- package/dist/api/files.routes.js +220 -0
- package/dist/api/files.routes.js.map +1 -0
- package/dist/api/filesystem.routes.d.ts +10 -0
- package/dist/api/filesystem.routes.d.ts.map +1 -0
- package/dist/api/filesystem.routes.js +181 -0
- package/dist/api/filesystem.routes.js.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +25 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/lsp.d.ts +5 -0
- package/dist/api/lsp.d.ts.map +1 -0
- package/dist/api/lsp.js +103 -0
- package/dist/api/lsp.js.map +1 -0
- package/dist/api/projects.routes.d.ts +18 -0
- package/dist/api/projects.routes.d.ts.map +1 -0
- package/dist/api/projects.routes.js +306 -0
- package/dist/api/projects.routes.js.map +1 -0
- package/dist/api/session.routes.d.ts +18 -0
- package/dist/api/session.routes.d.ts.map +1 -0
- package/dist/api/session.routes.js +186 -0
- package/dist/api/session.routes.js.map +1 -0
- package/dist/api/skills.routes.d.ts +6 -0
- package/dist/api/skills.routes.d.ts.map +1 -0
- package/dist/api/skills.routes.js +54 -0
- package/dist/api/skills.routes.js.map +1 -0
- package/dist/cli/args.d.ts +49 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +77 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.types.d.ts +22 -0
- package/dist/cli/cli.types.d.ts.map +1 -0
- package/dist/cli/cli.types.js +5 -0
- package/dist/cli/cli.types.js.map +1 -0
- package/dist/cli/commands.d.ts +30 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +263 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/components/App.d.ts +34 -0
- package/dist/components/App.d.ts.map +1 -0
- package/dist/components/App.js +639 -0
- package/dist/components/App.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/tx.config.d.ts +31 -0
- package/dist/config/tx.config.d.ts.map +1 -0
- package/dist/config/tx.config.js +29 -0
- package/dist/config/tx.config.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/lsp/client.d.ts +55 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +252 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/downloader.d.ts +17 -0
- package/dist/lsp/downloader.d.ts.map +1 -0
- package/dist/lsp/downloader.js +302 -0
- package/dist/lsp/downloader.js.map +1 -0
- package/dist/lsp/index.d.ts +13 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +30 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/launch.d.ts +17 -0
- package/dist/lsp/launch.d.ts.map +1 -0
- package/dist/lsp/launch.js +69 -0
- package/dist/lsp/launch.js.map +1 -0
- package/dist/lsp/manager.d.ts +19 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +251 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/server.d.ts +11 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +302 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/sql.d.ts +11 -0
- package/dist/lsp/sql.d.ts.map +1 -0
- package/dist/lsp/sql.js +23 -0
- package/dist/lsp/sql.js.map +1 -0
- package/dist/lsp/types.d.ts +58 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +13 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/modules/ai/ai.service.d.ts +182 -0
- package/dist/modules/ai/ai.service.d.ts.map +1 -0
- package/dist/modules/ai/ai.service.js +280 -0
- package/dist/modules/ai/ai.service.js.map +1 -0
- package/dist/modules/ai/ai.types.d.ts +54 -0
- package/dist/modules/ai/ai.types.d.ts.map +1 -0
- package/dist/modules/ai/ai.types.js +2 -0
- package/dist/modules/ai/ai.types.js.map +1 -0
- package/dist/modules/ai/index.d.ts +6 -0
- package/dist/modules/ai/index.d.ts.map +1 -0
- package/dist/modules/ai/index.js +5 -0
- package/dist/modules/ai/index.js.map +1 -0
- package/dist/modules/ai/openai.provider.d.ts +138 -0
- package/dist/modules/ai/openai.provider.d.ts.map +1 -0
- package/dist/modules/ai/openai.provider.js +279 -0
- package/dist/modules/ai/openai.provider.js.map +1 -0
- package/dist/modules/ai/react/index.d.ts +5 -0
- package/dist/modules/ai/react/index.d.ts.map +1 -0
- package/dist/modules/ai/react/index.js +4 -0
- package/dist/modules/ai/react/index.js.map +1 -0
- package/dist/modules/ai/react/prompt/role.txt +51 -0
- package/dist/modules/ai/react/react.parser.d.ts +75 -0
- package/dist/modules/ai/react/react.parser.d.ts.map +1 -0
- package/dist/modules/ai/react/react.parser.js +278 -0
- package/dist/modules/ai/react/react.parser.js.map +1 -0
- package/dist/modules/ai/react/react.prompts.d.ts +26 -0
- package/dist/modules/ai/react/react.prompts.d.ts.map +1 -0
- package/dist/modules/ai/react/react.prompts.js +180 -0
- package/dist/modules/ai/react/react.prompts.js.map +1 -0
- package/dist/modules/ai/react/react.types.d.ts +47 -0
- package/dist/modules/ai/react/react.types.d.ts.map +1 -0
- package/dist/modules/ai/react/react.types.js +2 -0
- package/dist/modules/ai/react/react.types.js.map +1 -0
- package/dist/modules/ai/react.agent.d.ts +40 -0
- package/dist/modules/ai/react.agent.d.ts.map +1 -0
- package/dist/modules/ai/react.agent.js +136 -0
- package/dist/modules/ai/react.agent.js.map +1 -0
- package/dist/modules/ai/summarizer/index.d.ts +4 -0
- package/dist/modules/ai/summarizer/index.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/index.js +3 -0
- package/dist/modules/ai/summarizer/index.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.d.ts +15 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.js +47 -0
- package/dist/modules/ai/summarizer/summarizer.prompts.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.service.d.ts +24 -0
- package/dist/modules/ai/summarizer/summarizer.service.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.service.js +153 -0
- package/dist/modules/ai/summarizer/summarizer.service.js.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.types.d.ts +21 -0
- package/dist/modules/ai/summarizer/summarizer.types.d.ts.map +1 -0
- package/dist/modules/ai/summarizer/summarizer.types.js +5 -0
- package/dist/modules/ai/summarizer/summarizer.types.js.map +1 -0
- package/dist/modules/config/config.service.d.ts +32 -0
- package/dist/modules/config/config.service.d.ts.map +1 -0
- package/dist/modules/config/config.service.js +163 -0
- package/dist/modules/config/config.service.js.map +1 -0
- package/dist/modules/config/config.types.d.ts +44 -0
- package/dist/modules/config/config.types.d.ts.map +1 -0
- package/dist/modules/config/config.types.js +21 -0
- package/dist/modules/config/config.types.js.map +1 -0
- package/dist/modules/config/index.d.ts +10 -0
- package/dist/modules/config/index.d.ts.map +1 -0
- package/dist/modules/config/index.js +10 -0
- package/dist/modules/config/index.js.map +1 -0
- package/dist/modules/context/context.service.d.ts +46 -0
- package/dist/modules/context/context.service.d.ts.map +1 -0
- package/dist/modules/context/context.service.js +216 -0
- package/dist/modules/context/context.service.js.map +1 -0
- package/dist/modules/context/context.types.d.ts +30 -0
- package/dist/modules/context/context.types.d.ts.map +1 -0
- package/dist/modules/context/context.types.js +5 -0
- package/dist/modules/context/context.types.js.map +1 -0
- package/dist/modules/context/index.d.ts +10 -0
- package/dist/modules/context/index.d.ts.map +1 -0
- package/dist/modules/context/index.js +10 -0
- package/dist/modules/context/index.js.map +1 -0
- package/dist/modules/db/db.service.d.ts +97 -0
- package/dist/modules/db/db.service.d.ts.map +1 -0
- package/dist/modules/db/db.service.js +387 -0
- package/dist/modules/db/db.service.js.map +1 -0
- package/dist/modules/db/db.types.d.ts +8 -0
- package/dist/modules/db/db.types.d.ts.map +1 -0
- package/dist/modules/db/db.types.js +7 -0
- package/dist/modules/db/db.types.js.map +1 -0
- package/dist/modules/db/index.d.ts +10 -0
- package/dist/modules/db/index.d.ts.map +1 -0
- package/dist/modules/db/index.js +9 -0
- package/dist/modules/db/index.js.map +1 -0
- package/dist/modules/logger/index.d.ts +2 -0
- package/dist/modules/logger/index.d.ts.map +1 -0
- package/dist/modules/logger/index.js +2 -0
- package/dist/modules/logger/index.js.map +1 -0
- package/dist/modules/logger/logger.d.ts +26 -0
- package/dist/modules/logger/logger.d.ts.map +1 -0
- package/dist/modules/logger/logger.js +57 -0
- package/dist/modules/logger/logger.js.map +1 -0
- package/dist/modules/memory/index.d.ts +9 -0
- package/dist/modules/memory/index.d.ts.map +1 -0
- package/dist/modules/memory/index.js +9 -0
- package/dist/modules/memory/index.js.map +1 -0
- package/dist/modules/memory/memory.service.d.ts +191 -0
- package/dist/modules/memory/memory.service.d.ts.map +1 -0
- package/dist/modules/memory/memory.service.js +282 -0
- package/dist/modules/memory/memory.service.js.map +1 -0
- package/dist/modules/memory/memory.types.d.ts +13 -0
- package/dist/modules/memory/memory.types.d.ts.map +1 -0
- package/dist/modules/memory/memory.types.js +5 -0
- package/dist/modules/memory/memory.types.js.map +1 -0
- package/dist/modules/session/index.d.ts +9 -0
- package/dist/modules/session/index.d.ts.map +1 -0
- package/dist/modules/session/index.js +9 -0
- package/dist/modules/session/index.js.map +1 -0
- package/dist/modules/session/session.service.d.ts +252 -0
- package/dist/modules/session/session.service.d.ts.map +1 -0
- package/dist/modules/session/session.service.js +406 -0
- package/dist/modules/session/session.service.js.map +1 -0
- package/dist/modules/session/session.types.d.ts +34 -0
- package/dist/modules/session/session.types.d.ts.map +1 -0
- package/dist/modules/session/session.types.js +5 -0
- package/dist/modules/session/session.types.js.map +1 -0
- package/dist/modules/skill/index.d.ts +8 -0
- package/dist/modules/skill/index.d.ts.map +1 -0
- package/dist/modules/skill/index.js +7 -0
- package/dist/modules/skill/index.js.map +1 -0
- package/dist/modules/skill/skill.service.d.ts +72 -0
- package/dist/modules/skill/skill.service.d.ts.map +1 -0
- package/dist/modules/skill/skill.service.js +283 -0
- package/dist/modules/skill/skill.service.js.map +1 -0
- package/dist/modules/skill/skill.tool.d.ts +19 -0
- package/dist/modules/skill/skill.tool.d.ts.map +1 -0
- package/dist/modules/skill/skill.tool.js +92 -0
- package/dist/modules/skill/skill.tool.js.map +1 -0
- package/dist/modules/skill/skill.txt +18 -0
- package/dist/modules/skill/skill.types.d.ts +40 -0
- package/dist/modules/skill/skill.types.d.ts.map +1 -0
- package/dist/modules/skill/skill.types.js +6 -0
- package/dist/modules/skill/skill.types.js.map +1 -0
- package/dist/modules/skill/skills.manager.d.ts +30 -0
- package/dist/modules/skill/skills.manager.d.ts.map +1 -0
- package/dist/modules/skill/skills.manager.js +182 -0
- package/dist/modules/skill/skills.manager.js.map +1 -0
- package/dist/modules/tools/builtin/bash.d.ts +3 -0
- package/dist/modules/tools/builtin/bash.d.ts.map +1 -0
- package/dist/modules/tools/builtin/bash.js +124 -0
- package/dist/modules/tools/builtin/bash.js.map +1 -0
- package/dist/modules/tools/builtin/bash.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/bash.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/bash.tool.js +52 -0
- package/dist/modules/tools/builtin/bash.tool.js.map +1 -0
- package/dist/modules/tools/builtin/bash.txt +81 -0
- package/dist/modules/tools/builtin/code_search.d.ts +3 -0
- package/dist/modules/tools/builtin/code_search.d.ts.map +1 -0
- package/dist/modules/tools/builtin/code_search.js +85 -0
- package/dist/modules/tools/builtin/code_search.js.map +1 -0
- package/dist/modules/tools/builtin/code_search.txt +18 -0
- package/dist/modules/tools/builtin/edit-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/edit-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/edit-file.tool.js +58 -0
- package/dist/modules/tools/builtin/edit-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/edit_file.d.ts +3 -0
- package/dist/modules/tools/builtin/edit_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/edit_file.js +69 -0
- package/dist/modules/tools/builtin/edit_file.js.map +1 -0
- package/dist/modules/tools/builtin/edit_file.txt +10 -0
- package/dist/modules/tools/builtin/glob.d.ts +3 -0
- package/dist/modules/tools/builtin/glob.d.ts.map +1 -0
- package/dist/modules/tools/builtin/glob.js +84 -0
- package/dist/modules/tools/builtin/glob.js.map +1 -0
- package/dist/modules/tools/builtin/glob.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/glob.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/glob.tool.js +81 -0
- package/dist/modules/tools/builtin/glob.tool.js.map +1 -0
- package/dist/modules/tools/builtin/glob.txt +10 -0
- package/dist/modules/tools/builtin/grep.d.ts +3 -0
- package/dist/modules/tools/builtin/grep.d.ts.map +1 -0
- package/dist/modules/tools/builtin/grep.js +93 -0
- package/dist/modules/tools/builtin/grep.js.map +1 -0
- package/dist/modules/tools/builtin/grep.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/grep.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/grep.tool.js +96 -0
- package/dist/modules/tools/builtin/grep.tool.js.map +1 -0
- package/dist/modules/tools/builtin/grep.txt +12 -0
- package/dist/modules/tools/builtin/index.d.ts +8 -0
- package/dist/modules/tools/builtin/index.d.ts.map +1 -0
- package/dist/modules/tools/builtin/index.js +88 -0
- package/dist/modules/tools/builtin/index.js.map +1 -0
- package/dist/modules/tools/builtin/lsp.d.ts +7 -0
- package/dist/modules/tools/builtin/lsp.d.ts.map +1 -0
- package/dist/modules/tools/builtin/lsp.js +125 -0
- package/dist/modules/tools/builtin/lsp.js.map +1 -0
- package/dist/modules/tools/builtin/lsp.txt +19 -0
- package/dist/modules/tools/builtin/memory.d.ts +3 -0
- package/dist/modules/tools/builtin/memory.d.ts.map +1 -0
- package/dist/modules/tools/builtin/memory.js +76 -0
- package/dist/modules/tools/builtin/memory.js.map +1 -0
- package/dist/modules/tools/builtin/memory.txt +36 -0
- package/dist/modules/tools/builtin/read-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/read-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/read-file.tool.js +46 -0
- package/dist/modules/tools/builtin/read-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/read_file.d.ts +3 -0
- package/dist/modules/tools/builtin/read_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/read_file.js +99 -0
- package/dist/modules/tools/builtin/read_file.js.map +1 -0
- package/dist/modules/tools/builtin/read_file.txt +15 -0
- package/dist/modules/tools/builtin/todo_read.d.ts +6 -0
- package/dist/modules/tools/builtin/todo_read.d.ts.map +1 -0
- package/dist/modules/tools/builtin/todo_read.js +24 -0
- package/dist/modules/tools/builtin/todo_read.js.map +1 -0
- package/dist/modules/tools/builtin/todo_read.txt +14 -0
- package/dist/modules/tools/builtin/todo_write.d.ts +6 -0
- package/dist/modules/tools/builtin/todo_write.d.ts.map +1 -0
- package/dist/modules/tools/builtin/todo_write.js +45 -0
- package/dist/modules/tools/builtin/todo_write.js.map +1 -0
- package/dist/modules/tools/builtin/todo_write.txt +46 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts +3 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts.map +1 -0
- package/dist/modules/tools/builtin/web_fetch.js +51 -0
- package/dist/modules/tools/builtin/web_fetch.js.map +1 -0
- package/dist/modules/tools/builtin/web_fetch.txt +15 -0
- package/dist/modules/tools/builtin/web_search.d.ts +3 -0
- package/dist/modules/tools/builtin/web_search.d.ts.map +1 -0
- package/dist/modules/tools/builtin/web_search.js +99 -0
- package/dist/modules/tools/builtin/web_search.js.map +1 -0
- package/dist/modules/tools/builtin/web_search.txt +16 -0
- package/dist/modules/tools/builtin/write-file.tool.d.ts +6 -0
- package/dist/modules/tools/builtin/write-file.tool.d.ts.map +1 -0
- package/dist/modules/tools/builtin/write-file.tool.js +38 -0
- package/dist/modules/tools/builtin/write-file.tool.js.map +1 -0
- package/dist/modules/tools/builtin/write_file.d.ts +3 -0
- package/dist/modules/tools/builtin/write_file.d.ts.map +1 -0
- package/dist/modules/tools/builtin/write_file.js +46 -0
- package/dist/modules/tools/builtin/write_file.js.map +1 -0
- package/dist/modules/tools/builtin/write_file.txt +9 -0
- package/dist/modules/tools/index.d.ts +11 -0
- package/dist/modules/tools/index.d.ts.map +1 -0
- package/dist/modules/tools/index.js +10 -0
- package/dist/modules/tools/index.js.map +1 -0
- package/dist/modules/tools/tool.service.d.ts +207 -0
- package/dist/modules/tools/tool.service.d.ts.map +1 -0
- package/dist/modules/tools/tool.service.js +331 -0
- package/dist/modules/tools/tool.service.js.map +1 -0
- package/dist/modules/tools/tool.types.d.ts +39 -0
- package/dist/modules/tools/tool.types.d.ts.map +1 -0
- package/dist/modules/tools/tool.types.js +5 -0
- package/dist/modules/tools/tool.types.js.map +1 -0
- package/dist/web/index.d.ts +10 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +20 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/web.service.d.ts +95 -0
- package/dist/web/web.service.d.ts.map +1 -0
- package/dist/web/web.service.js +396 -0
- package/dist/web/web.service.js.map +1 -0
- package/package.json +57 -0
- package/web/dist/assets/Layout-Bb76CGAL.js +1 -0
- package/web/dist/assets/element-icons-B-tDfklg.woff +0 -0
- package/web/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
- package/web/dist/assets/index-DQRR0ggU.js +199 -0
- package/web/dist/assets/index-KTH-myBB.css +1 -0
- package/web/dist/index.html +14 -0
- package/web/index.html +13 -0
- package/web/package.json +24 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Manager
|
|
3
|
+
* 按照 skill-guide.md 规范实现
|
|
4
|
+
*/
|
|
5
|
+
import { Skill, AvailableSkill } from './skill.types.js';
|
|
6
|
+
export declare class SkillsManager {
|
|
7
|
+
private skills;
|
|
8
|
+
private searchPaths;
|
|
9
|
+
private permissions;
|
|
10
|
+
private gitRoot;
|
|
11
|
+
constructor(cwd?: string);
|
|
12
|
+
private initSearchPaths;
|
|
13
|
+
private findGitRoot;
|
|
14
|
+
setPermissions(permissions: Record<string, 'allow' | 'deny' | 'ask'>): void;
|
|
15
|
+
loadAll(): Promise<void>;
|
|
16
|
+
private loadDir;
|
|
17
|
+
loadSkill(filePath: string): Promise<Skill | null>;
|
|
18
|
+
private parseSkill;
|
|
19
|
+
private validateName;
|
|
20
|
+
private checkPermission;
|
|
21
|
+
private matchPattern;
|
|
22
|
+
getSkill(name: string): Skill | undefined;
|
|
23
|
+
getAllSkills(): Skill[];
|
|
24
|
+
getAvailableSkills(): AvailableSkill[];
|
|
25
|
+
has(name: string): boolean;
|
|
26
|
+
getSearchPaths(): string[];
|
|
27
|
+
getGitRoot(): string | null;
|
|
28
|
+
}
|
|
29
|
+
export declare const skillsManager: SkillsManager;
|
|
30
|
+
//# sourceMappingURL=skills.manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.manager.d.ts","sourceRoot":"","sources":["../../../src/modules/skill/skills.manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,KAAK,EAAkC,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,OAAO,CAAuB;gBAE1B,GAAG,CAAC,EAAE,MAAM;IAIxB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,WAAW;IAcnB,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI;IAOrE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAQhB,OAAO;IAkBf,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA+BxD,OAAO,CAAC,UAAU;IAyClB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,YAAY;IAMpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIzC,YAAY,IAAI,KAAK,EAAE;IAIvB,kBAAkB,IAAI,cAAc,EAAE;IAStC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,cAAc,IAAI,MAAM,EAAE;IAI1B,UAAU,IAAI,MAAM,GAAG,IAAI;CAG5B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Manager
|
|
3
|
+
* 按照 skill-guide.md 规范实现
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as yaml from 'js-yaml';
|
|
8
|
+
export class SkillsManager {
|
|
9
|
+
constructor(cwd) {
|
|
10
|
+
this.skills = new Map();
|
|
11
|
+
this.searchPaths = [];
|
|
12
|
+
this.permissions = [];
|
|
13
|
+
this.gitRoot = null;
|
|
14
|
+
this.initSearchPaths(cwd || process.cwd());
|
|
15
|
+
}
|
|
16
|
+
initSearchPaths(cwd) {
|
|
17
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
18
|
+
this.gitRoot = this.findGitRoot(cwd);
|
|
19
|
+
const basePath = this.gitRoot || cwd;
|
|
20
|
+
this.searchPaths = [
|
|
21
|
+
path.join(basePath, '.txcode', 'skills'),
|
|
22
|
+
path.join(basePath, '.claude', 'skills'),
|
|
23
|
+
path.join(basePath, '.agents', 'skills'),
|
|
24
|
+
path.join(home, '.txcode', 'skills'),
|
|
25
|
+
path.join(home, '.claude', 'skills'),
|
|
26
|
+
path.join(home, '.agents', 'skills'),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
findGitRoot(startPath) {
|
|
30
|
+
let currentPath = startPath;
|
|
31
|
+
while (currentPath !== path.dirname(currentPath)) {
|
|
32
|
+
const gitPath = path.join(currentPath, '.git');
|
|
33
|
+
if (fs.existsSync(gitPath)) {
|
|
34
|
+
return currentPath;
|
|
35
|
+
}
|
|
36
|
+
currentPath = path.dirname(currentPath);
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
setPermissions(permissions) {
|
|
41
|
+
this.permissions = Object.entries(permissions).map(([pattern, action]) => ({
|
|
42
|
+
pattern,
|
|
43
|
+
action,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
async loadAll() {
|
|
47
|
+
this.skills.clear();
|
|
48
|
+
for (const searchPath of this.searchPaths) {
|
|
49
|
+
await this.loadDir(searchPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async loadDir(dir) {
|
|
53
|
+
if (!fs.existsSync(dir))
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
if (entry.isDirectory()) {
|
|
59
|
+
const skillPath = path.join(dir, entry.name, 'SKILL.md');
|
|
60
|
+
if (fs.existsSync(skillPath)) {
|
|
61
|
+
await this.loadSkill(skillPath);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// 忽略无权访问的目录
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async loadSkill(filePath) {
|
|
71
|
+
try {
|
|
72
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
73
|
+
const skill = this.parseSkill(content, filePath);
|
|
74
|
+
if (skill) {
|
|
75
|
+
if (!this.validateName(skill.name)) {
|
|
76
|
+
console.warn(`Invalid skill name: ${skill.name} in ${filePath}`);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const dirName = path.basename(path.dirname(filePath));
|
|
80
|
+
if (skill.name !== dirName) {
|
|
81
|
+
console.warn(`Skill name "${skill.name}" does not match directory name "${dirName}"`);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const permission = this.checkPermission(skill.name);
|
|
85
|
+
if (permission === 'deny') {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
this.skills.set(skill.name, skill);
|
|
89
|
+
}
|
|
90
|
+
return skill;
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
console.warn(`Failed to load skill from ${filePath}:`, e);
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
parseSkill(content, filePath) {
|
|
98
|
+
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
99
|
+
if (!frontmatterMatch) {
|
|
100
|
+
const dirName = path.basename(path.dirname(filePath));
|
|
101
|
+
return {
|
|
102
|
+
name: dirName,
|
|
103
|
+
description: content.substring(0, 1024),
|
|
104
|
+
content: content,
|
|
105
|
+
rawContent: content,
|
|
106
|
+
filePath,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const frontmatterStr = frontmatterMatch[1];
|
|
110
|
+
const rawContent = frontmatterMatch[2].trim();
|
|
111
|
+
try {
|
|
112
|
+
const metadata = yaml.load(frontmatterStr);
|
|
113
|
+
if (!metadata.name) {
|
|
114
|
+
console.warn(`Skill missing name in ${filePath}`);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
name: metadata.name,
|
|
119
|
+
description: metadata.description || '',
|
|
120
|
+
license: metadata.license,
|
|
121
|
+
compatibility: metadata.compatibility,
|
|
122
|
+
metadata: metadata.metadata,
|
|
123
|
+
content: content,
|
|
124
|
+
rawContent: rawContent,
|
|
125
|
+
filePath,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
console.warn(`Failed to parse frontmatter in ${filePath}:`, e);
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
validateName(name) {
|
|
134
|
+
if (!name || name.length > 64)
|
|
135
|
+
return false;
|
|
136
|
+
if (name.startsWith('-') || name.endsWith('-'))
|
|
137
|
+
return false;
|
|
138
|
+
if (name.includes('--'))
|
|
139
|
+
return false;
|
|
140
|
+
const regex = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
141
|
+
return regex.test(name);
|
|
142
|
+
}
|
|
143
|
+
checkPermission(name) {
|
|
144
|
+
for (const perm of this.permissions) {
|
|
145
|
+
if (this.matchPattern(name, perm.pattern)) {
|
|
146
|
+
return perm.action;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return 'allow';
|
|
150
|
+
}
|
|
151
|
+
matchPattern(name, pattern) {
|
|
152
|
+
if (pattern === '*')
|
|
153
|
+
return true;
|
|
154
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
155
|
+
return regex.test(name);
|
|
156
|
+
}
|
|
157
|
+
getSkill(name) {
|
|
158
|
+
return this.skills.get(name);
|
|
159
|
+
}
|
|
160
|
+
getAllSkills() {
|
|
161
|
+
return Array.from(this.skills.values());
|
|
162
|
+
}
|
|
163
|
+
getAvailableSkills() {
|
|
164
|
+
return this.getAllSkills()
|
|
165
|
+
.filter(skill => this.checkPermission(skill.name) !== 'deny')
|
|
166
|
+
.map(s => ({
|
|
167
|
+
name: s.name,
|
|
168
|
+
description: s.description,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
has(name) {
|
|
172
|
+
return this.skills.has(name);
|
|
173
|
+
}
|
|
174
|
+
getSearchPaths() {
|
|
175
|
+
return [...this.searchPaths];
|
|
176
|
+
}
|
|
177
|
+
getGitRoot() {
|
|
178
|
+
return this.gitRoot;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export const skillsManager = new SkillsManager();
|
|
182
|
+
//# sourceMappingURL=skills.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.manager.js","sourceRoot":"","sources":["../../../src/modules/skill/skills.manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/bash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAA;AAyBhE,eAAO,MAAM,QAAQ,EAAE,IA4GtB,CAAA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const DEFAULT_TIMEOUT = 120000;
|
|
5
|
+
const MAX_BYTES = 50 * 1024;
|
|
6
|
+
const MAX_LINES = 2000;
|
|
7
|
+
function getShell() {
|
|
8
|
+
if (process.platform === 'win32') {
|
|
9
|
+
const gitPath = spawn('where', ['git'], { shell: true }).stdout.toString().trim();
|
|
10
|
+
if (gitPath) {
|
|
11
|
+
const bashPath = path.join(path.dirname(gitPath), '..', 'bin', 'bash.exe');
|
|
12
|
+
try {
|
|
13
|
+
if (fs.statSync(bashPath).isFile()) {
|
|
14
|
+
return bashPath;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch { }
|
|
18
|
+
}
|
|
19
|
+
return process.env.COMSPEC || 'cmd.exe';
|
|
20
|
+
}
|
|
21
|
+
return process.env.SHELL || '/bin/sh';
|
|
22
|
+
}
|
|
23
|
+
export const bashTool = {
|
|
24
|
+
name: 'bash',
|
|
25
|
+
description: '', // 从 description.txt 加载
|
|
26
|
+
parameters: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
command: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: '要执行的命令'
|
|
32
|
+
},
|
|
33
|
+
workdir: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: '工作目录(可选,默认为当前目录)'
|
|
36
|
+
},
|
|
37
|
+
timeout: {
|
|
38
|
+
type: 'number',
|
|
39
|
+
description: '超时时间,毫秒(可选,默认 120000 = 2分钟)'
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: ['command']
|
|
43
|
+
},
|
|
44
|
+
execute: async (params, context) => {
|
|
45
|
+
const { command, workdir, timeout = DEFAULT_TIMEOUT } = params;
|
|
46
|
+
const cwd = workdir || context.workDir || process.cwd();
|
|
47
|
+
let output = '';
|
|
48
|
+
let exited = false;
|
|
49
|
+
const shell = getShell();
|
|
50
|
+
const isWindows = process.platform === 'win32';
|
|
51
|
+
const shellArg = isWindows && shell.endsWith('bash.exe') ? shell : undefined;
|
|
52
|
+
const proc = spawn(command, {
|
|
53
|
+
shell: shellArg || shell,
|
|
54
|
+
cwd,
|
|
55
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
56
|
+
windowsHide: isWindows
|
|
57
|
+
});
|
|
58
|
+
const killTree = () => {
|
|
59
|
+
if (process.platform === 'win32' && proc.pid) {
|
|
60
|
+
spawn('taskkill', ['/pid', String(proc.pid), '/f', '/t'], { stdio: 'ignore', windowsHide: true });
|
|
61
|
+
}
|
|
62
|
+
else if (proc.pid) {
|
|
63
|
+
try {
|
|
64
|
+
process.kill(-proc.pid, 'SIGTERM');
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
proc.kill('SIGTERM');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
proc.stdout?.on('data', (chunk) => {
|
|
72
|
+
output += chunk.toString();
|
|
73
|
+
if (output.length > MAX_BYTES) {
|
|
74
|
+
output = output.slice(0, MAX_BYTES) + '\n\n[output truncated - exceeded ' + MAX_BYTES + ' bytes]';
|
|
75
|
+
killTree();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
proc.stderr?.on('data', (chunk) => {
|
|
79
|
+
output += chunk.toString();
|
|
80
|
+
});
|
|
81
|
+
const abortHandler = () => {
|
|
82
|
+
killTree();
|
|
83
|
+
};
|
|
84
|
+
context.abortSignal?.addEventListener('abort', abortHandler);
|
|
85
|
+
const timeoutTimer = setTimeout(() => {
|
|
86
|
+
output += '\n\n[command timed out after ' + timeout + 'ms]';
|
|
87
|
+
killTree();
|
|
88
|
+
}, timeout);
|
|
89
|
+
try {
|
|
90
|
+
await new Promise((resolve, reject) => {
|
|
91
|
+
proc.on('exit', (code) => {
|
|
92
|
+
exited = true;
|
|
93
|
+
clearTimeout(timeoutTimer);
|
|
94
|
+
context.abortSignal?.removeEventListener('abort', abortHandler);
|
|
95
|
+
resolve();
|
|
96
|
+
});
|
|
97
|
+
proc.on('error', (err) => {
|
|
98
|
+
exited = true;
|
|
99
|
+
clearTimeout(timeoutTimer);
|
|
100
|
+
context.abortSignal?.removeEventListener('abort', abortHandler);
|
|
101
|
+
reject(err);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
output,
|
|
109
|
+
error: err.message
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const lines = output.split('\n').length;
|
|
113
|
+
if (lines > MAX_LINES) {
|
|
114
|
+
const truncated = output.split('\n').slice(0, MAX_LINES).join('\n');
|
|
115
|
+
output = truncated + '\n\n[output truncated - exceeded ' + MAX_LINES + ' lines]';
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
output: output || '命令执行成功(无输出)',
|
|
120
|
+
metadata: { exitCode: proc.exitCode }
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.tool.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/bash.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,eAAO,MAAM,QAAQ,EAAE,IAqDtB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash 命令执行工具
|
|
3
|
+
*/
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
export const bashTool = {
|
|
6
|
+
name: 'execute_bash',
|
|
7
|
+
description: '执行 shell 命令。支持 git、npm、ls 等常见命令。',
|
|
8
|
+
parameters: {
|
|
9
|
+
type: 'object',
|
|
10
|
+
properties: {
|
|
11
|
+
command: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
description: '要执行的命令',
|
|
14
|
+
},
|
|
15
|
+
workdir: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description: '工作目录(可选)',
|
|
18
|
+
},
|
|
19
|
+
timeout: {
|
|
20
|
+
type: 'number',
|
|
21
|
+
description: '超时时间(毫秒,可选,默认 120000)',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
required: ['command'],
|
|
25
|
+
},
|
|
26
|
+
execute: async (params) => {
|
|
27
|
+
const { command, workdir, timeout = 120000 } = params;
|
|
28
|
+
const forbidden = ['rm -rf /', 'sudo', 'chmod 777', '> /dev/sd'];
|
|
29
|
+
if (forbidden.some(f => command.includes(f))) {
|
|
30
|
+
return `错误: 禁止执行的命令`;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const result = execSync(command, {
|
|
34
|
+
cwd: workdir,
|
|
35
|
+
timeout,
|
|
36
|
+
encoding: 'utf-8',
|
|
37
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
38
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
39
|
+
});
|
|
40
|
+
return result.trim() || '命令执行成功(无输出)';
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const stderr = error.stderr?.toString() || '';
|
|
44
|
+
const stdout = error.stdout?.toString() || '';
|
|
45
|
+
if (stderr) {
|
|
46
|
+
return `命令执行错误:\n${stderr}`;
|
|
47
|
+
}
|
|
48
|
+
return `错误: ${error.message}`;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=bash.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.tool.js","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/bash.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,kCAAkC;IAC/C,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,QAAQ;aACtB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,UAAU;aACxB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uBAAuB;aACrC;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,OAAO,EAAE,KAAK,EAAE,MAIf,EAAmB,EAAE;QACpB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;QAEtD,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACjE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;gBAC/B,GAAG,EAAE,OAAO;gBACZ,OAAO;gBACP,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;gBAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,aAAa,CAAC;QACxC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAE9C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,YAAY,MAAM,EAAE,CAAC;YAC9B,CAAC;YACD,OAAO,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
在持久化 shell 会话中执行 bash 命令,支持可选超时,确保正确的处理和安全措施。
|
|
2
|
+
|
|
3
|
+
所有命令默认在 ${directory} 执行。如需在其他目录运行命令,使用 `workdir` 参数。**禁止使用 `cd <目录> && <命令>` 模式**,应该使用 `workdir` 参数代替。
|
|
4
|
+
|
|
5
|
+
**重要**:此工具仅用于终端操作如 git、npm、docker 等。**禁止**用于文件操作(读取、写入、编辑、搜索文件)——请使用专用工具。
|
|
6
|
+
|
|
7
|
+
## 执行前验证
|
|
8
|
+
|
|
9
|
+
1. **目录验证**:
|
|
10
|
+
- 如果命令会创建新目录或文件,先用 `ls` 验证父目录存在
|
|
11
|
+
- 例如:运行 "mkdir foo/bar" 前,先用 `ls foo` 确认 "foo" 存在
|
|
12
|
+
|
|
13
|
+
2. **命令执行**:
|
|
14
|
+
- 包含空格的路径必须用双引号包裹
|
|
15
|
+
- 正确示例:`mkdir "/Users/name/My Documents"`
|
|
16
|
+
- 错误示例:`mkdir /Users/name/My Documents`(会失败)
|
|
17
|
+
- 确保正确引用后执行命令
|
|
18
|
+
|
|
19
|
+
## 使用说明
|
|
20
|
+
|
|
21
|
+
- `command` 参数是必需的
|
|
22
|
+
- 可选超时时间(毫秒),默认 120000ms(2分钟)
|
|
23
|
+
- 请用 5-10 个字写清楚命令作用的描述
|
|
24
|
+
- 如果输出超过 ${maxLines} 行或 ${maxBytes} 字节,会被截断并保存到文件
|
|
25
|
+
- 可以用 Read 的 offset/limit 读取特定部分,或用 Grep 搜索全部内容
|
|
26
|
+
- **禁止**使用 `head`、`tail` 等命令限制输出
|
|
27
|
+
|
|
28
|
+
**禁止使用 bash 执行以下操作**,请使用专用工具:
|
|
29
|
+
- 文件搜索:用 Glob(不用 find 或 ls)
|
|
30
|
+
- 内容搜索:用 Grep(不用 grep 或 rg)
|
|
31
|
+
- 读取文件:用 Read(不用 cat/head/tail)
|
|
32
|
+
- 编辑文件:用 Edit(不用 sed/awk)
|
|
33
|
+
- 写入文件:用 Write(不用 echo >/cat <<EOF)
|
|
34
|
+
- 输出文本:直接输出(不用 echo/printf)
|
|
35
|
+
|
|
36
|
+
**多命令执行**:
|
|
37
|
+
- 独立命令可以并行执行多个 Bash 调用
|
|
38
|
+
- 顺序依赖的命令用 `&&` 链接(如 `git add . && git commit -m "message" && git push`)
|
|
39
|
+
- 不关心前置结果时用 `;` 分隔
|
|
40
|
+
- **禁止**使用换行符分隔命令(在引号字符串中除外)
|
|
41
|
+
|
|
42
|
+
## Git 提交规范
|
|
43
|
+
|
|
44
|
+
**何时创建提交**:只有用户明确要求时才创建提交。不确定时先询问。
|
|
45
|
+
|
|
46
|
+
**Git 安全协议**:
|
|
47
|
+
- 禁止强制推送(push --force)或硬重置
|
|
48
|
+
- 禁止跳过 hooks(--no-verify、--no-gpg-sign 等)
|
|
49
|
+
- 禁止强制推送到 main/master
|
|
50
|
+
- 禁止 `git commit --amend`,**仅当**同时满足以下条件时才可使用:
|
|
51
|
+
(1) 用户明确要求,或提交成功但 pre-commit hook 自动修改了文件
|
|
52
|
+
(2) HEAD 提交是由你创建的(验证:`git log -1 --format='%an %ae'`)
|
|
53
|
+
(3) 提交**尚未**推送到远程(验证:`git status` 显示 "Your branch is ahead")
|
|
54
|
+
- **关键**:如果提交失败或被 hook 拒绝,**禁止 amend**——修复问题后创建新提交
|
|
55
|
+
- **关键**:如果已推送到远程,**禁止 amend**(除非用户明确要求,需要 force push)
|
|
56
|
+
|
|
57
|
+
**创建提交的步骤**:
|
|
58
|
+
1. 并行执行 `git status`、`git diff`、`git log` 查看状态和提交风格
|
|
59
|
+
2. 分析所有变更内容,起草 1-2 句话的提交信息(聚焦"为什么"而非"做了什么")
|
|
60
|
+
3. 并行执行:添加文件到暂存区 → 创建提交 → 运行 `git status` 验证
|
|
61
|
+
4. 如果提交失败,修复问题后创建新提交(不要 amend)
|
|
62
|
+
|
|
63
|
+
**注意事项**:
|
|
64
|
+
- 禁止使用交互式 git 命令(如 `git rebase -i` 或 `git add -i`)
|
|
65
|
+
- 除非用户明确要求,不要推送到远程
|
|
66
|
+
- 没有变更时不创建空提交
|
|
67
|
+
|
|
68
|
+
## 创建 Pull Request
|
|
69
|
+
|
|
70
|
+
使用 Bash 工具的 `gh` 命令处理所有 GitHub 相关任务(issues、PRs、checks、releases)。收到 GitHub URL 时用 gh 命令获取所需信息。
|
|
71
|
+
|
|
72
|
+
**创建 PR 的步骤**:
|
|
73
|
+
1. 并行执行了解当前分支状态:`git status`、`git diff`、`git log` 和 `git diff [base-branch]...HEAD`
|
|
74
|
+
2. 分析所有将包含在 PR 中的变更(不是只有最新提交,是**所有**提交),起草 PR 摘要
|
|
75
|
+
3. 并行执行:需要时创建新分支 → 需要时推送 → 使用 `gh pr create` 创建 PR
|
|
76
|
+
|
|
77
|
+
**注意**:不要使用 TodoWrite 或 Task 工具。完成后返回 PR URL。
|
|
78
|
+
|
|
79
|
+
## 其他常用操作
|
|
80
|
+
|
|
81
|
+
- 查看 PR 评论:`gh api repos/foo/bar/pulls/123/comments`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code_search.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/code_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAA;AAkChE,eAAO,MAAM,cAAc,EAAE,IAiF5B,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const API_CONFIG = {
|
|
2
|
+
BASE_URL: 'https://mcp.exa.ai',
|
|
3
|
+
ENDPOINTS: {
|
|
4
|
+
CONTEXT: '/mcp',
|
|
5
|
+
},
|
|
6
|
+
DEFAULT_TOKENS: 5000,
|
|
7
|
+
TIMEOUT: 30000,
|
|
8
|
+
};
|
|
9
|
+
export const codeSearchTool = {
|
|
10
|
+
name: 'code_search',
|
|
11
|
+
description: '',
|
|
12
|
+
parameters: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
query: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description: '搜索查询字符串,用于查找 APIs、库和 SDK 的相关上下文。例如:React useState hook examples、Python pandas dataframe filtering、Express.js middleware'
|
|
18
|
+
},
|
|
19
|
+
tokens: {
|
|
20
|
+
type: 'number',
|
|
21
|
+
description: '返回的 token 数量(可选,1000-50000,默认 5000)。根据需要调整上下文量 - 特定问题用较低值,全面文档用较高值'
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
required: ['query']
|
|
25
|
+
},
|
|
26
|
+
execute: async (params, context) => {
|
|
27
|
+
const codeRequest = {
|
|
28
|
+
jsonrpc: '2.0',
|
|
29
|
+
id: 1,
|
|
30
|
+
method: 'tools/call',
|
|
31
|
+
params: {
|
|
32
|
+
name: 'get_code_context_exa',
|
|
33
|
+
arguments: {
|
|
34
|
+
query: params.query,
|
|
35
|
+
tokensNum: params.tokens || API_CONFIG.DEFAULT_TOKENS,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const timeoutTimer = setTimeout(() => {
|
|
40
|
+
throw new Error('Code search request timed out');
|
|
41
|
+
}, API_CONFIG.TIMEOUT);
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch(`${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.CONTEXT}`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
accept: 'application/json, text/event-stream',
|
|
47
|
+
'content-type': 'application/json',
|
|
48
|
+
},
|
|
49
|
+
body: JSON.stringify(codeRequest),
|
|
50
|
+
signal: context.abortSignal,
|
|
51
|
+
});
|
|
52
|
+
clearTimeout(timeoutTimer);
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const errorText = await response.text();
|
|
55
|
+
return { success: false, output: '', error: `Code search error (${response.status}): ${errorText}` };
|
|
56
|
+
}
|
|
57
|
+
const responseText = await response.text();
|
|
58
|
+
const lines = responseText.split('\n');
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
if (line.startsWith('data: ')) {
|
|
61
|
+
const data = JSON.parse(line.substring(6));
|
|
62
|
+
if (data.result && data.result.content && data.result.content.length > 0) {
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
output: data.result.content[0].text,
|
|
66
|
+
metadata: { query: params.query, tokens: params.tokens || API_CONFIG.DEFAULT_TOKENS },
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
success: true,
|
|
73
|
+
output: '未找到代码片段或文档。请尝试其他查询,或更具体地说明库/框架名称。',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
clearTimeout(timeoutTimer);
|
|
78
|
+
if (err.message === 'Code search request timed out') {
|
|
79
|
+
return { success: false, output: '', error: '代码搜索请求超时' };
|
|
80
|
+
}
|
|
81
|
+
return { success: false, output: '', error: err.message };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=code_search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code_search.js","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/code_search.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG;IACjB,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM;KAChB;IACD,cAAc,EAAE,IAAI;IACpB,OAAO,EAAE,KAAK;CACN,CAAA;AAyBV,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,EAAE;IACf,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yHAAyH;aACvI;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oEAAoE;aAClF;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;IACD,OAAO,EAAE,KAAK,EAAE,MAA0C,EAAE,OAAoB,EAAuB,EAAE;QACvG,MAAM,WAAW,GAAmB;YAClC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,IAAI,EAAE,sBAAsB;gBAC5B,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,cAAc;iBACtD;aACF;SACF,CAAA;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAClD,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;gBACpF,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,MAAM,EAAE,qCAAqC;oBAC7C,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;gBACjC,MAAM,EAAE,OAAO,CAAC,WAAW;aAC5B,CAAC,CAAA;YAEF,YAAY,CAAC,YAAY,CAAC,CAAA;YAE1B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,EAAE,CAAA;YACtG,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAE1C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC3D,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzE,OAAO;4BACL,OAAO,EAAE,IAAI;4BACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;4BACnC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE;yBACtF,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,mCAAmC;aAC5C,CAAA;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,YAAY,CAAC,YAAY,CAAC,CAAA;YAC1B,IAAI,GAAG,CAAC,OAAO,KAAK,+BAA+B,EAAE,CAAC;gBACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;YAC1D,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;QAC3D,CAAC;IACH,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
使用 Exa Code API 搜索编程相关的代码和上下文。
|
|
2
|
+
|
|
3
|
+
**功能**:
|
|
4
|
+
- 为任何编程任务提供最高质量和最新鲜的上下文
|
|
5
|
+
- 提供库、SDK 和 API 的全面代码示例、文档和 API 参考
|
|
6
|
+
- 用于任何编程相关问题
|
|
7
|
+
- 优化用于查找特定编程模式和解决方案
|
|
8
|
+
|
|
9
|
+
**使用说明**:
|
|
10
|
+
- 可调整的 token 数量(1000-50000)用于聚焦或全面的结果
|
|
11
|
+
- 默认 5000 tokens 为大多数查询提供平衡的上下文
|
|
12
|
+
- 特定问题用较低值,全面文档用较高值
|
|
13
|
+
- 支持关于框架、库、API 和编程概念的查询
|
|
14
|
+
|
|
15
|
+
**示例**:
|
|
16
|
+
- 'React useState hook examples'
|
|
17
|
+
- 'Python pandas dataframe filtering'
|
|
18
|
+
- 'Express.js middleware'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-file.tool.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/builtin/edit-file.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,eAAO,MAAM,YAAY,EAAE,IA4D1B,CAAC"}
|