@xagent-ai/cli 1.2.2 ā 1.3.1
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/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/release.yml +76 -0
- package/.github/workflows/ci.yml +75 -0
- package/.github/workflows/release.yml +103 -0
- package/.gitmodules +3 -3
- package/README.md +326 -280
- package/README_CN.md +325 -279
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +7 -3
- package/dist/agents.js.map +1 -1
- package/dist/ai-client/factory.d.ts +40 -0
- package/dist/ai-client/factory.d.ts.map +1 -0
- package/dist/ai-client/factory.js +100 -0
- package/dist/ai-client/factory.js.map +1 -0
- package/dist/ai-client/index.d.ts +20 -0
- package/dist/ai-client/index.d.ts.map +1 -0
- package/dist/ai-client/index.js +49 -0
- package/dist/ai-client/index.js.map +1 -0
- package/dist/ai-client/providers/anthropic.d.ts +57 -0
- package/dist/ai-client/providers/anthropic.d.ts.map +1 -0
- package/dist/ai-client/providers/anthropic.js +406 -0
- package/dist/ai-client/providers/anthropic.js.map +1 -0
- package/dist/ai-client/providers/openai.d.ts +57 -0
- package/dist/ai-client/providers/openai.d.ts.map +1 -0
- package/dist/ai-client/providers/openai.js +290 -0
- package/dist/ai-client/providers/openai.js.map +1 -0
- package/dist/ai-client/providers/remote.d.ts +110 -0
- package/dist/ai-client/providers/remote.d.ts.map +1 -0
- package/dist/ai-client/providers/remote.js +352 -0
- package/dist/ai-client/providers/remote.js.map +1 -0
- package/dist/ai-client/registry.d.ts +51 -0
- package/dist/ai-client/registry.d.ts.map +1 -0
- package/dist/ai-client/registry.js +81 -0
- package/dist/ai-client/registry.js.map +1 -0
- package/dist/ai-client/types.d.ts +274 -0
- package/dist/ai-client/types.d.ts.map +1 -0
- package/dist/ai-client/types.js +90 -0
- package/dist/ai-client/types.js.map +1 -0
- package/dist/ai-client-factory.d.ts +62 -0
- package/dist/ai-client-factory.d.ts.map +1 -0
- package/dist/ai-client-factory.js +157 -0
- package/dist/ai-client-factory.js.map +1 -0
- package/dist/auth.d.ts +23 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +164 -174
- package/dist/auth.js.map +1 -1
- package/dist/cancellation.d.ts +5 -4
- package/dist/cancellation.d.ts.map +1 -1
- package/dist/cancellation.js +53 -32
- package/dist/cancellation.js.map +1 -1
- package/dist/checkpoint.d.ts +2 -1
- package/dist/checkpoint.d.ts.map +1 -1
- package/dist/checkpoint.js +39 -6
- package/dist/checkpoint.js.map +1 -1
- package/dist/cli.js +742 -29
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +10 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +62 -25
- package/dist/config.js.map +1 -1
- package/dist/context-compressor.d.ts +82 -18
- package/dist/context-compressor.d.ts.map +1 -1
- package/dist/context-compressor.js +718 -154
- package/dist/context-compressor.js.map +1 -1
- package/dist/conversation.d.ts +1 -1
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +8 -7
- package/dist/conversation.js.map +1 -1
- package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -1
- package/dist/gui-subagent/action-parser/actionParser.js +6 -4
- package/dist/gui-subagent/action-parser/actionParser.js.map +1 -1
- package/dist/gui-subagent/agent/gui-agent.d.ts +39 -2
- package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -1
- package/dist/gui-subagent/agent/gui-agent.js +189 -74
- package/dist/gui-subagent/agent/gui-agent.js.map +1 -1
- package/dist/gui-subagent/index.d.ts +23 -1
- package/dist/gui-subagent/index.d.ts.map +1 -1
- package/dist/gui-subagent/index.js +6 -0
- package/dist/gui-subagent/index.js.map +1 -1
- package/dist/gui-subagent/operator/base-operator.d.ts.map +1 -1
- package/dist/gui-subagent/operator/base-operator.js +0 -1
- package/dist/gui-subagent/operator/base-operator.js.map +1 -1
- package/dist/gui-subagent/operator/computer-operator.d.ts.map +1 -1
- package/dist/gui-subagent/operator/computer-operator.js +31 -8
- package/dist/gui-subagent/operator/computer-operator.js.map +1 -1
- package/dist/gui-subagent/types/actions.d.ts +1 -1
- package/dist/gui-subagent/types/actions.d.ts.map +1 -1
- package/dist/gui-subagent/types/actions.js +0 -1
- package/dist/gui-subagent/types/actions.js.map +1 -1
- package/dist/gui-subagent/types/operator.d.ts +1 -1
- package/dist/gui-subagent/types/operator.d.ts.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/input-processor.d.ts.map +1 -1
- package/dist/input-processor.js +8 -5
- package/dist/input-processor.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/mcp.d.ts +7 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +157 -49
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +3 -3
- package/dist/memory.js.map +1 -1
- package/dist/output-util.d.ts +27 -0
- package/dist/output-util.d.ts.map +1 -0
- package/dist/output-util.js +74 -0
- package/dist/output-util.js.map +1 -0
- package/dist/retry.js +1 -1
- package/dist/retry.js.map +1 -1
- package/dist/ripgrep.d.ts +29 -0
- package/dist/ripgrep.d.ts.map +1 -0
- package/dist/ripgrep.js +294 -0
- package/dist/ripgrep.js.map +1 -0
- package/dist/sdk-output-adapter.d.ts +34 -1
- package/dist/sdk-output-adapter.d.ts.map +1 -1
- package/dist/sdk-output-adapter.js +67 -2
- package/dist/sdk-output-adapter.js.map +1 -1
- package/dist/sdk-session.d.ts.map +1 -1
- package/dist/sdk-session.js +2 -0
- package/dist/sdk-session.js.map +1 -1
- package/dist/session-manager.js +3 -3
- package/dist/session-manager.js.map +1 -1
- package/dist/session.d.ts +116 -6
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +1416 -448
- package/dist/session.js.map +1 -1
- package/dist/shell.d.ts +33 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +126 -0
- package/dist/shell.js.map +1 -0
- package/dist/skill-installer.d.ts +38 -0
- package/dist/skill-installer.d.ts.map +1 -0
- package/dist/skill-installer.js +447 -0
- package/dist/skill-installer.js.map +1 -0
- package/dist/skill-invoker.d.ts +8 -2
- package/dist/skill-invoker.d.ts.map +1 -1
- package/dist/skill-invoker.js +36 -15
- package/dist/skill-invoker.js.map +1 -1
- package/dist/skill-loader.d.ts +8 -3
- package/dist/skill-loader.d.ts.map +1 -1
- package/dist/skill-loader.js +51 -48
- package/dist/skill-loader.js.map +1 -1
- package/dist/skill-manager.d.ts +85 -0
- package/dist/skill-manager.d.ts.map +1 -0
- package/dist/skill-manager.js +341 -0
- package/dist/skill-manager.js.map +1 -0
- package/dist/slash-commands.d.ts +39 -2
- package/dist/slash-commands.d.ts.map +1 -1
- package/dist/slash-commands.js +934 -305
- package/dist/slash-commands.js.map +1 -1
- package/dist/smart-approval.d.ts +20 -1
- package/dist/smart-approval.d.ts.map +1 -1
- package/dist/smart-approval.js +125 -56
- package/dist/smart-approval.js.map +1 -1
- package/dist/system-prompt-generator.d.ts +6 -0
- package/dist/system-prompt-generator.d.ts.map +1 -1
- package/dist/system-prompt-generator.js +86 -36
- package/dist/system-prompt-generator.js.map +1 -1
- package/dist/terminal.d.ts +28 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +82 -0
- package/dist/terminal.js.map +1 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +8 -7
- package/dist/theme.js.map +1 -1
- package/dist/tools.d.ts +38 -7
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +1249 -617
- package/dist/tools.js.map +1 -1
- package/dist/truncate.d.ts +55 -0
- package/dist/truncate.d.ts.map +1 -0
- package/dist/truncate.js +130 -0
- package/dist/truncate.js.map +1 -0
- package/dist/types.d.ts +84 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +49 -0
- package/dist/types.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +28 -36
- package/dist/update.js.map +1 -1
- package/dist/workflow.d.ts +5 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +61 -49
- package/dist/workflow.js.map +1 -1
- package/docs/architecture/mcp-integration-guide.md +304 -194
- package/docs/architecture/overview.md +169 -169
- package/docs/architecture/tool-system-design.md +134 -134
- package/docs/cli/commands.md +349 -238
- package/docs/smart-mode.md +281 -281
- package/docs/third-party-models.md +440 -439
- package/find-skills/SKILL.md +133 -0
- package/package.json +91 -90
- package/scripts/install-ripgrep.js +241 -0
- package/src/agents.ts +7 -3
- package/src/ai-client/factory.ts +116 -0
- package/src/ai-client/index.ts +61 -0
- package/src/ai-client/providers/anthropic.ts +475 -0
- package/src/ai-client/providers/openai.ts +348 -0
- package/src/ai-client/providers/remote.ts +439 -0
- package/src/ai-client/registry.ts +97 -0
- package/src/ai-client/types.ts +364 -0
- package/src/ai-client-factory.ts +204 -0
- package/src/auth.ts +661 -614
- package/src/cancellation.ts +202 -176
- package/src/checkpoint.ts +255 -219
- package/src/cli.ts +1523 -743
- package/src/config.ts +341 -297
- package/src/context-compressor.ts +987 -290
- package/src/conversation.ts +290 -288
- package/src/gui-subagent/action-parser/actionParser.ts +318 -315
- package/src/gui-subagent/action-parser/constants.ts +14 -14
- package/src/gui-subagent/action-parser/index.ts +8 -8
- package/src/gui-subagent/action-parser/types.ts +31 -31
- package/src/gui-subagent/agent/gui-agent.ts +1234 -1089
- package/src/gui-subagent/agent/index.ts +5 -5
- package/src/gui-subagent/index.ts +185 -163
- package/src/gui-subagent/operator/base-operator.ts +244 -245
- package/src/gui-subagent/operator/computer-operator.ts +541 -520
- package/src/gui-subagent/operator/index.ts +6 -6
- package/src/gui-subagent/types/actions.ts +260 -262
- package/src/gui-subagent/types/index.ts +6 -6
- package/src/gui-subagent/types/operator.ts +106 -106
- package/src/gui-subagent/utils.ts +51 -51
- package/src/index.ts +17 -18
- package/src/input-processor.ts +8 -5
- package/src/logger.ts +436 -438
- package/src/mcp.ts +793 -682
- package/src/memory.ts +343 -344
- package/src/output-util.ts +80 -0
- package/src/retry.ts +1 -1
- package/src/ripgrep.ts +370 -0
- package/src/sdk-output-adapter.ts +842 -0
- package/src/sdk-session.ts +62 -0
- package/src/session-manager.ts +308 -308
- package/src/session.ts +1775 -573
- package/src/shell.ts +134 -0
- package/src/skill-installer.ts +518 -0
- package/src/skill-invoker.ts +959 -935
- package/src/skill-loader.ts +501 -496
- package/src/skill-manager.ts +385 -0
- package/src/slash-commands.ts +2189 -1389
- package/src/smart-approval.ts +193 -74
- package/src/system-prompt-generator.ts +91 -36
- package/src/terminal.ts +96 -0
- package/src/theme.ts +739 -738
- package/src/tools.ts +1790 -931
- package/src/truncate.ts +173 -0
- package/src/types.ts +337 -198
- package/src/update.ts +33 -40
- package/src/workflow.ts +521 -508
- package/test/cli-launch.test.ts +279 -0
- package/tsconfig.json +22 -22
- package/vitest.config.ts +21 -19
- package/dist/ai-client.d.ts +0 -86
- package/dist/ai-client.d.ts.map +0 -1
- package/dist/ai-client.js +0 -1372
- package/dist/ai-client.js.map +0 -1
- package/dist/gui-subagent/operator/browser-operator.d.ts +0 -36
- package/dist/gui-subagent/operator/browser-operator.d.ts.map +0 -1
- package/dist/gui-subagent/operator/browser-operator.js +0 -306
- package/dist/gui-subagent/operator/browser-operator.js.map +0 -1
- package/dist/gui-subagent/operator/desktop-operator.d.ts +0 -55
- package/dist/gui-subagent/operator/desktop-operator.d.ts.map +0 -1
- package/dist/gui-subagent/operator/desktop-operator.js +0 -527
- package/dist/gui-subagent/operator/desktop-operator.js.map +0 -1
- package/dist/hook.d.ts +0 -73
- package/dist/hook.d.ts.map +0 -1
- package/dist/hook.js +0 -156
- package/dist/hook.js.map +0 -1
- package/dist/input-history.d.ts +0 -24
- package/dist/input-history.d.ts.map +0 -1
- package/dist/input-history.js +0 -94
- package/dist/input-history.js.map +0 -1
- package/dist/keyboard-manager.d.ts +0 -151
- package/dist/keyboard-manager.d.ts.map +0 -1
- package/dist/keyboard-manager.js +0 -396
- package/dist/keyboard-manager.js.map +0 -1
- package/dist/print-system-prompt.d.ts +0 -2
- package/dist/print-system-prompt.d.ts.map +0 -1
- package/dist/print-system-prompt.js +0 -40
- package/dist/print-system-prompt.js.map +0 -1
- package/dist/remote-ai-client.d.ts +0 -104
- package/dist/remote-ai-client.d.ts.map +0 -1
- package/dist/remote-ai-client.js +0 -552
- package/dist/remote-ai-client.js.map +0 -1
- package/dist/sdk-session-v2.d.ts +0 -13
- package/dist/sdk-session-v2.d.ts.map +0 -1
- package/dist/sdk-session-v2.js +0 -46
- package/dist/sdk-session-v2.js.map +0 -1
- package/dist/test-boundary-conditions.d.ts.map +0 -1
- package/dist/test-boundary-conditions.js.map +0 -1
- package/dist/test-cancellation-fix.d.ts.map +0 -1
- package/dist/test-cancellation-fix.js.map +0 -1
- package/dist/test-input-history.d.ts.map +0 -1
- package/dist/test-input-history.js.map +0 -1
- package/dist/test-interaction-flow.d.ts.map +0 -1
- package/dist/test-interaction-flow.js.map +0 -1
- package/dist/test-quick.d.ts.map +0 -1
- package/dist/test-quick.js.map +0 -1
- package/dist/test-user-interaction.d.ts.map +0 -1
- package/dist/test-user-interaction.js.map +0 -1
- package/dist/tools/edit-diff.d.ts +0 -32
- package/dist/tools/edit-diff.d.ts.map +0 -1
- package/dist/tools/edit-diff.js +0 -185
- package/dist/tools/edit-diff.js.map +0 -1
- package/dist/tools/edit.d.ts +0 -11
- package/dist/tools/edit.d.ts.map +0 -1
- package/dist/tools/edit.js +0 -129
- package/dist/tools/edit.js.map +0 -1
- package/dist/unified-session.d.ts +0 -42
- package/dist/unified-session.d.ts.map +0 -1
- package/dist/unified-session.js +0 -271
- package/dist/unified-session.js.map +0 -1
- package/skills/.claude-plugin/marketplace.json +0 -45
- package/skills/README.md +0 -94
- package/skills/THIRD_PARTY_NOTICES.md +0 -405
- package/skills/skills/algorithmic-art/LICENSE.txt +0 -202
- package/skills/skills/algorithmic-art/SKILL.md +0 -405
- package/skills/skills/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/skills/algorithmic-art/templates/viewer.html +0 -599
- package/skills/skills/brand-guidelines/LICENSE.txt +0 -202
- package/skills/skills/brand-guidelines/SKILL.md +0 -73
- package/skills/skills/canvas-design/LICENSE.txt +0 -202
- package/skills/skills/canvas-design/SKILL.md +0 -130
- package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/skills/doc-coauthoring/SKILL.md +0 -375
- package/skills/skills/docx/LICENSE.txt +0 -30
- package/skills/skills/docx/SKILL.md +0 -197
- package/skills/skills/docx/docx-js.md +0 -350
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/skills/docx/ooxml/scripts/pack.py +0 -159
- package/skills/skills/docx/ooxml/scripts/unpack.py +0 -29
- package/skills/skills/docx/ooxml/scripts/validate.py +0 -69
- package/skills/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
- package/skills/skills/docx/ooxml/scripts/validation/base.py +0 -951
- package/skills/skills/docx/ooxml/scripts/validation/docx.py +0 -274
- package/skills/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
- package/skills/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
- package/skills/skills/docx/ooxml.md +0 -610
- package/skills/skills/docx/scripts/__init__.py +0 -1
- package/skills/skills/docx/scripts/document.py +0 -1276
- package/skills/skills/docx/scripts/templates/comments.xml +0 -3
- package/skills/skills/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/skills/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/skills/docx/scripts/templates/people.xml +0 -3
- package/skills/skills/docx/scripts/utilities.py +0 -374
- package/skills/skills/frontend-design/LICENSE.txt +0 -177
- package/skills/skills/frontend-design/SKILL.md +0 -42
- package/skills/skills/internal-comms/LICENSE.txt +0 -202
- package/skills/skills/internal-comms/SKILL.md +0 -32
- package/skills/skills/internal-comms/examples/3p-updates.md +0 -47
- package/skills/skills/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/skills/internal-comms/examples/faq-answers.md +0 -30
- package/skills/skills/internal-comms/examples/general-comms.md +0 -16
- package/skills/skills/mcp-builder/LICENSE.txt +0 -202
- package/skills/skills/mcp-builder/SKILL.md +0 -236
- package/skills/skills/mcp-builder/reference/evaluation.md +0 -602
- package/skills/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
- package/skills/skills/mcp-builder/reference/node_mcp_server.md +0 -970
- package/skills/skills/mcp-builder/reference/python_mcp_server.md +0 -719
- package/skills/skills/mcp-builder/scripts/connections.py +0 -151
- package/skills/skills/mcp-builder/scripts/evaluation.py +0 -373
- package/skills/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
- package/skills/skills/mcp-builder/scripts/requirements.txt +0 -2
- package/skills/skills/pdf/LICENSE.txt +0 -30
- package/skills/skills/pdf/SKILL.md +0 -294
- package/skills/skills/pdf/forms.md +0 -205
- package/skills/skills/pdf/reference.md +0 -612
- package/skills/skills/pdf/scripts/check_bounding_boxes.py +0 -70
- package/skills/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
- package/skills/skills/pdf/scripts/check_fillable_fields.py +0 -12
- package/skills/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
- package/skills/skills/pdf/scripts/create_validation_image.py +0 -41
- package/skills/skills/pdf/scripts/extract_form_field_info.py +0 -152
- package/skills/skills/pdf/scripts/fill_fillable_fields.py +0 -114
- package/skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
- package/skills/skills/pptx/LICENSE.txt +0 -30
- package/skills/skills/pptx/SKILL.md +0 -484
- package/skills/skills/pptx/html2pptx.md +0 -625
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/skills/pptx/ooxml/schemas/mce/mc.xsd +0 -75
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/skills/pptx/ooxml/scripts/pack.py +0 -159
- package/skills/skills/pptx/ooxml/scripts/unpack.py +0 -29
- package/skills/skills/pptx/ooxml/scripts/validate.py +0 -69
- package/skills/skills/pptx/ooxml/scripts/validation/__init__.py +0 -15
- package/skills/skills/pptx/ooxml/scripts/validation/base.py +0 -951
- package/skills/skills/pptx/ooxml/scripts/validation/docx.py +0 -274
- package/skills/skills/pptx/ooxml/scripts/validation/pptx.py +0 -315
- package/skills/skills/pptx/ooxml/scripts/validation/redlining.py +0 -279
- package/skills/skills/pptx/ooxml.md +0 -427
- package/skills/skills/pptx/scripts/html2pptx.js +0 -979
- package/skills/skills/pptx/scripts/inventory.py +0 -1020
- package/skills/skills/pptx/scripts/rearrange.py +0 -231
- package/skills/skills/pptx/scripts/replace.py +0 -385
- package/skills/skills/pptx/scripts/thumbnail.py +0 -450
- package/skills/skills/skill-creator/LICENSE.txt +0 -202
- package/skills/skills/skill-creator/SKILL.md +0 -356
- package/skills/skills/skill-creator/references/output-patterns.md +0 -82
- package/skills/skills/skill-creator/references/workflows.md +0 -28
- package/skills/skills/skill-creator/scripts/init_skill.py +0 -303
- package/skills/skills/skill-creator/scripts/package_skill.py +0 -110
- package/skills/skills/skill-creator/scripts/quick_validate.py +0 -95
- package/skills/skills/slack-gif-creator/LICENSE.txt +0 -202
- package/skills/skills/slack-gif-creator/SKILL.md +0 -254
- package/skills/skills/slack-gif-creator/core/easing.py +0 -234
- package/skills/skills/slack-gif-creator/core/frame_composer.py +0 -176
- package/skills/skills/slack-gif-creator/core/gif_builder.py +0 -269
- package/skills/skills/slack-gif-creator/core/validators.py +0 -136
- package/skills/skills/slack-gif-creator/requirements.txt +0 -4
- package/skills/skills/theme-factory/LICENSE.txt +0 -202
- package/skills/skills/theme-factory/SKILL.md +0 -59
- package/skills/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/skills/theme-factory/themes/arctic-frost.md +0 -19
- package/skills/skills/theme-factory/themes/botanical-garden.md +0 -19
- package/skills/skills/theme-factory/themes/desert-rose.md +0 -19
- package/skills/skills/theme-factory/themes/forest-canopy.md +0 -19
- package/skills/skills/theme-factory/themes/golden-hour.md +0 -19
- package/skills/skills/theme-factory/themes/midnight-galaxy.md +0 -19
- package/skills/skills/theme-factory/themes/modern-minimalist.md +0 -19
- package/skills/skills/theme-factory/themes/ocean-depths.md +0 -19
- package/skills/skills/theme-factory/themes/sunset-boulevard.md +0 -19
- package/skills/skills/theme-factory/themes/tech-innovation.md +0 -19
- package/skills/skills/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/skills/web-artifacts-builder/SKILL.md +0 -74
- package/skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/skills/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/skills/webapp-testing/LICENSE.txt +0 -202
- package/skills/skills/webapp-testing/SKILL.md +0 -96
- package/skills/skills/webapp-testing/examples/console_logging.py +0 -35
- package/skills/skills/webapp-testing/examples/element_discovery.py +0 -40
- package/skills/skills/webapp-testing/examples/static_html_automation.py +0 -33
- package/skills/skills/webapp-testing/scripts/with_server.py +0 -106
- package/skills/skills/xlsx/LICENSE.txt +0 -30
- package/skills/skills/xlsx/SKILL.md +0 -289
- package/skills/skills/xlsx/recalc.py +0 -178
- package/skills/spec/agent-skills-spec.md +0 -3
- package/skills/template/SKILL.md +0 -6
- package/src/ai-client.ts +0 -1560
- package/src/remote-ai-client.ts +0 -664
- /package/{.eslintrc.js ā .eslintrc.cjs} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
+
import { confirm } from '@clack/prompts';
|
|
3
4
|
import { startInteractiveSession } from './session.js';
|
|
4
5
|
import { getConfigManager } from './config.js';
|
|
5
6
|
import { AuthService, selectAuthType } from './auth.js';
|
|
7
|
+
import { AuthType } from './types.js';
|
|
8
|
+
import { fetchDefaultModels } from './ai-client/providers/remote.js';
|
|
6
9
|
import { getAgentManager } from './agents.js';
|
|
7
10
|
import { getMCPManager } from './mcp.js';
|
|
8
|
-
import {
|
|
11
|
+
import { setConfigProvider } from './logger.js';
|
|
9
12
|
import { icons, colors } from './theme.js';
|
|
10
13
|
import { getCancellationManager } from './cancellation.js';
|
|
11
14
|
import { readFileSync, promises as fs } from 'fs';
|
|
@@ -15,10 +18,26 @@ import { fileURLToPath } from 'url';
|
|
|
15
18
|
// Get current directory
|
|
16
19
|
const __filename = fileURLToPath(import.meta.url);
|
|
17
20
|
const __dirname = dirname(__filename);
|
|
21
|
+
// State file for skill updates (used to notify running xAgent)
|
|
22
|
+
const SKILL_STATE_FILE = '.skill-state.json';
|
|
23
|
+
function getSkillStateFilePath(userSkillsPath) {
|
|
24
|
+
return path.join(userSkillsPath, SKILL_STATE_FILE);
|
|
25
|
+
}
|
|
26
|
+
async function notifySkillUpdate(userSkillsPath) {
|
|
27
|
+
try {
|
|
28
|
+
const stateFilePath = getSkillStateFilePath(userSkillsPath);
|
|
29
|
+
const timestamp = Date.now();
|
|
30
|
+
const state = { lastSkillUpdate: timestamp };
|
|
31
|
+
await fs.writeFile(stateFilePath, JSON.stringify(state, null, 2), 'utf-8');
|
|
32
|
+
console.log(colors.textMuted(' ā¹ļø Skills updated for running xAgent sessions'));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Silent fail - notification is optional
|
|
36
|
+
}
|
|
37
|
+
}
|
|
18
38
|
// Read package.json
|
|
19
39
|
const packageJsonPath = join(__dirname, '../package.json');
|
|
20
40
|
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
21
|
-
const logger = getLogger();
|
|
22
41
|
// Initialize CancellationManager early to set up ESC handler
|
|
23
42
|
getCancellationManager();
|
|
24
43
|
// Set up config provider for logger to read loggerLevel
|
|
@@ -82,12 +101,39 @@ function formatError(error) {
|
|
|
82
101
|
suggestion: 'The configuration file may be corrupted. Please check the file content.'
|
|
83
102
|
};
|
|
84
103
|
}
|
|
104
|
+
// User cancellation - no suggestion needed
|
|
105
|
+
if (errorMessage.includes('cancelled by user') || errorMessage.includes('Operation cancelled')) {
|
|
106
|
+
return {
|
|
107
|
+
message: 'Operation cancelled',
|
|
108
|
+
suggestion: ''
|
|
109
|
+
};
|
|
110
|
+
}
|
|
85
111
|
// Default friendly message
|
|
86
112
|
return {
|
|
87
113
|
message: 'An error occurred',
|
|
88
114
|
suggestion: 'Please try again. If the problem persists, check your configuration.'
|
|
89
115
|
};
|
|
90
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Recursively copy a directory
|
|
119
|
+
*/
|
|
120
|
+
async function copyDirectory(src, dest) {
|
|
121
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
122
|
+
await fs.mkdir(dest, { recursive: true });
|
|
123
|
+
for (const entry of entries) {
|
|
124
|
+
// Skip node_modules to keep dependencies isolated
|
|
125
|
+
// if (entry.name === 'node_modules') continue;
|
|
126
|
+
const srcPath = path.join(src, entry.name);
|
|
127
|
+
const destPath = path.join(dest, entry.name);
|
|
128
|
+
if (entry.isDirectory()) {
|
|
129
|
+
await copyDirectory(srcPath, destPath);
|
|
130
|
+
}
|
|
131
|
+
else if (entry.isFile()) {
|
|
132
|
+
await fs.copyFile(srcPath, destPath);
|
|
133
|
+
}
|
|
134
|
+
// Skip symbolic links for simplicity
|
|
135
|
+
}
|
|
136
|
+
}
|
|
91
137
|
program
|
|
92
138
|
.name('xagent')
|
|
93
139
|
.description('AI-powered command-line assistant')
|
|
@@ -97,7 +143,14 @@ program
|
|
|
97
143
|
.command('start')
|
|
98
144
|
.description('Start the xAgent CLI interactive session')
|
|
99
145
|
.option('--approval-mode <mode>', 'Set approval mode (yolo, accept_edits, plan, default, smart)')
|
|
146
|
+
.option('--sdk', 'Run in SDK mode for programmatic access (stdin/stdout JSON communication)')
|
|
100
147
|
.action(async (options) => {
|
|
148
|
+
// Check if running in SDK mode
|
|
149
|
+
if (options.sdk || process.env.XAGENT_SDK === 'true') {
|
|
150
|
+
const { startSdkSession } = await import('./sdk-session.js');
|
|
151
|
+
await startSdkSession();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
101
154
|
if (options.approvalMode) {
|
|
102
155
|
const { getConfigManager } = await import('./config.js');
|
|
103
156
|
const { ExecutionMode } = await import('./types.js');
|
|
@@ -111,7 +164,7 @@ program
|
|
|
111
164
|
process.exit(1);
|
|
112
165
|
}
|
|
113
166
|
configManager.setApprovalMode(options.approvalMode);
|
|
114
|
-
|
|
167
|
+
configManager.save('global');
|
|
115
168
|
console.log('');
|
|
116
169
|
console.log(colors.success(`ā
Approval mode set to: ${options.approvalMode}`));
|
|
117
170
|
console.log('');
|
|
@@ -130,20 +183,53 @@ program
|
|
|
130
183
|
const authType = await selectAuthType();
|
|
131
184
|
const configManager = getConfigManager();
|
|
132
185
|
configManager.set('selectedAuthType', authType);
|
|
186
|
+
// Get xagentApiBaseUrl from config (respects XAGENT_BASE_URL env var)
|
|
187
|
+
const config = configManager.getAuthConfig();
|
|
133
188
|
const authService = new AuthService({
|
|
134
189
|
type: authType,
|
|
135
190
|
apiKey: '',
|
|
136
191
|
baseUrl: '',
|
|
137
|
-
modelName: ''
|
|
192
|
+
modelName: '',
|
|
193
|
+
xagentApiBaseUrl: config.xagentApiBaseUrl
|
|
138
194
|
});
|
|
139
195
|
const success = await authService.authenticate();
|
|
140
196
|
if (success) {
|
|
141
197
|
const authConfig = authService.getAuthConfig();
|
|
142
|
-
|
|
198
|
+
// Clear modelName for remote mode
|
|
199
|
+
if (authType === AuthType.OAUTH_XAGENT) {
|
|
200
|
+
authConfig.modelName = '';
|
|
201
|
+
}
|
|
202
|
+
configManager.setAuthConfig(authConfig);
|
|
203
|
+
// Set default remote model settings if not already set
|
|
204
|
+
if (authType === AuthType.OAUTH_XAGENT) {
|
|
205
|
+
const webBaseUrl = authConfig.xagentApiBaseUrl || 'https://www.xagent-colife.net';
|
|
206
|
+
let defaultLlmName = '';
|
|
207
|
+
let defaultVlmName = '';
|
|
208
|
+
try {
|
|
209
|
+
console.log(colors.textMuted(' Fetching default models from remote server...'));
|
|
210
|
+
const defaults = await fetchDefaultModels(authConfig.apiKey || '', webBaseUrl);
|
|
211
|
+
if (defaults.llm?.name) {
|
|
212
|
+
defaultLlmName = defaults.llm.name;
|
|
213
|
+
console.log(colors.textMuted(` Default LLM: ${defaults.llm.displayName || defaultLlmName}`));
|
|
214
|
+
}
|
|
215
|
+
if (defaults.vlm?.name) {
|
|
216
|
+
defaultVlmName = defaults.vlm.name;
|
|
217
|
+
console.log(colors.textMuted(` Default VLM: ${defaults.vlm.displayName || defaultVlmName}`));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.log(colors.textMuted(` ā ļø Failed to fetch default models: ${error.message}`));
|
|
222
|
+
console.log(colors.textMuted(' ā ļø Use /model command to select models manually.'));
|
|
223
|
+
}
|
|
224
|
+
configManager.set('remote_llmModelName', defaultLlmName);
|
|
225
|
+
configManager.set('remote_vlmModelName', defaultVlmName);
|
|
226
|
+
configManager.save('global');
|
|
227
|
+
}
|
|
143
228
|
console.log('');
|
|
144
229
|
console.log(colors.success('Authentication configured successfully!'));
|
|
145
230
|
console.log(colors.textMuted('You can now run "xagent start" to begin'));
|
|
146
231
|
console.log('');
|
|
232
|
+
process.exit(0);
|
|
147
233
|
}
|
|
148
234
|
else {
|
|
149
235
|
console.log('');
|
|
@@ -183,6 +269,7 @@ program
|
|
|
183
269
|
console.log('');
|
|
184
270
|
});
|
|
185
271
|
}
|
|
272
|
+
process.exit(0);
|
|
186
273
|
}
|
|
187
274
|
else if (options.add) {
|
|
188
275
|
console.log('');
|
|
@@ -213,53 +300,388 @@ program
|
|
|
213
300
|
});
|
|
214
301
|
program
|
|
215
302
|
.command('mcp')
|
|
216
|
-
.description('Add, list, or remove MCP servers')
|
|
303
|
+
.description('Add, list, get, or remove MCP servers')
|
|
217
304
|
.option('-l, --list', 'List all MCP servers')
|
|
218
|
-
.option('-
|
|
305
|
+
.option('-g, --get <name>', 'Get details of a specific MCP server')
|
|
306
|
+
.option('-a, --add [name]', 'Add a new MCP server (interactive if no name provided)')
|
|
219
307
|
.option('-r, --remove <name>', 'Remove an MCP server')
|
|
220
308
|
.option('--scope <scope>', 'Scope (global or project)', 'global')
|
|
309
|
+
.option('-t, --transport <type>', 'Transport type: stdio, http')
|
|
310
|
+
.option('-c, --command <cmd>', 'Command for stdio transport')
|
|
311
|
+
.option('--args <args>', 'Arguments for stdio transport (comma-separated)')
|
|
312
|
+
.option('-u, --url <url>', 'URL for HTTP transport')
|
|
313
|
+
.option('-k, --token <token>', 'Authentication token (Bearer)')
|
|
314
|
+
.option('--header <headers>', 'Custom headers (can be used multiple times)')
|
|
315
|
+
.option('-y, --yes', 'Skip confirmation')
|
|
221
316
|
.action(async (options) => {
|
|
317
|
+
if (options.help) {
|
|
318
|
+
program.parse(['node', 'mcp', '--help']);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
222
321
|
const configManager = getConfigManager(process.cwd());
|
|
322
|
+
configManager.load(); // Load config from file
|
|
223
323
|
const mcpManager = getMCPManager();
|
|
324
|
+
// Register all MCP servers from config to manager (for --list and --remove)
|
|
325
|
+
const mcpServers = configManager.getMcpServers();
|
|
326
|
+
Object.entries(mcpServers).forEach(([name, config]) => {
|
|
327
|
+
mcpManager.registerServer(name, config);
|
|
328
|
+
});
|
|
224
329
|
if (options.list) {
|
|
225
|
-
const
|
|
226
|
-
|
|
330
|
+
const mcpServers = configManager.getMcpServers();
|
|
331
|
+
const serverNames = Object.keys(mcpServers);
|
|
332
|
+
if (serverNames.length === 0) {
|
|
227
333
|
console.log('');
|
|
228
334
|
console.log(colors.warning('No MCP servers configured'));
|
|
229
|
-
console.log(colors.textMuted('Use
|
|
335
|
+
console.log(colors.textMuted('Use "xagent mcp --add" to add servers'));
|
|
230
336
|
console.log('');
|
|
231
337
|
}
|
|
232
338
|
else {
|
|
339
|
+
console.log(colors.textMuted('Connecting to MCP servers...'));
|
|
340
|
+
for (const name of serverNames) {
|
|
341
|
+
try {
|
|
342
|
+
await mcpManager.connectServer(name);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
// Connection failed, continue with next server
|
|
346
|
+
}
|
|
347
|
+
}
|
|
233
348
|
const separator = icons.separator.repeat(40);
|
|
234
349
|
console.log('');
|
|
235
350
|
console.log(colors.primaryBright(`${icons.tool} MCP Servers`));
|
|
236
351
|
console.log(colors.border(separator));
|
|
237
352
|
console.log('');
|
|
238
|
-
|
|
239
|
-
const
|
|
240
|
-
const
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
console.log(`
|
|
353
|
+
serverNames.forEach((name) => {
|
|
354
|
+
const server = mcpManager.getServer(name);
|
|
355
|
+
const connected = server?.isServerConnected() ? icons.success : icons.error;
|
|
356
|
+
const status = server?.isServerConnected() ? colors.success(connected) : colors.error(connected);
|
|
357
|
+
const toolNames = server?.getToolNames().join(', ') || '';
|
|
358
|
+
console.log(` ${status} ${colors.primaryBright(name)}`);
|
|
359
|
+
console.log(` ${colors.textDim(`Tools: ${toolNames}`)}`);
|
|
244
360
|
console.log('');
|
|
245
361
|
});
|
|
246
362
|
}
|
|
363
|
+
process.exit(0);
|
|
247
364
|
}
|
|
248
|
-
else if (options.
|
|
365
|
+
else if (options.get) {
|
|
366
|
+
const server = mcpManager.getServer(options.get);
|
|
367
|
+
if (!server) {
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log(colors.error(`MCP server '${options.get}' not found`));
|
|
370
|
+
console.log(colors.textMuted('Use "xagent mcp --list" to see all configured servers'));
|
|
371
|
+
console.log('');
|
|
372
|
+
process.exit(1);
|
|
373
|
+
}
|
|
374
|
+
const config = server.config;
|
|
375
|
+
const isConnected = server.isServerConnected();
|
|
376
|
+
const toolNames = server.getToolNames();
|
|
377
|
+
const tools = server.getTools();
|
|
249
378
|
console.log('');
|
|
250
|
-
console.log(colors.
|
|
251
|
-
console.log(colors.
|
|
379
|
+
console.log(colors.primaryBright(`${icons.tool} MCP Server: ${options.get}`));
|
|
380
|
+
console.log(colors.border(icons.separator.repeat(40)));
|
|
252
381
|
console.log('');
|
|
382
|
+
console.log(` ${colors.primaryBright('Status:')} ${isConnected ? colors.success('Connected') : colors.error('Disconnected')}`);
|
|
383
|
+
console.log(` ${colors.primaryBright('Transport:')} ${config.transport || 'stdio'}`);
|
|
384
|
+
if (config.url) {
|
|
385
|
+
console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
|
|
386
|
+
}
|
|
387
|
+
if (config.command) {
|
|
388
|
+
console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
|
|
389
|
+
}
|
|
390
|
+
if (config.headers) {
|
|
391
|
+
console.log(` ${colors.primaryBright('Headers:')} ${JSON.stringify(config.headers)}`);
|
|
392
|
+
}
|
|
393
|
+
console.log(` ${colors.primaryBright('Tools:')} ${toolNames.length > 0 ? toolNames.join(', ') : colors.textMuted('(none)')}`);
|
|
394
|
+
if (tools.length > 0) {
|
|
395
|
+
console.log('');
|
|
396
|
+
console.log(colors.textMuted(' Available tools:'));
|
|
397
|
+
tools.forEach((tool) => {
|
|
398
|
+
console.log(` - ${colors.primaryBright(tool.name)}`);
|
|
399
|
+
if (tool.description) {
|
|
400
|
+
console.log(` ${colors.textDim(tool.description.substring(0, 60))}${tool.description.length > 60 ? '...' : ''}`);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
console.log('');
|
|
405
|
+
process.exit(0);
|
|
406
|
+
}
|
|
407
|
+
else if (options.add !== undefined) {
|
|
408
|
+
// Check if running in non-interactive mode (transport and required params provided)
|
|
409
|
+
const hasTransport = options.transport;
|
|
410
|
+
const hasCommand = options.command;
|
|
411
|
+
const hasUrl = options.url;
|
|
412
|
+
const isNonInteractive = hasTransport && (hasCommand || hasUrl);
|
|
413
|
+
if (isNonInteractive) {
|
|
414
|
+
// Non-interactive mode: use command line arguments
|
|
415
|
+
const name = options.add || `mcp-${options.transport}-${Date.now().toString(36)}`;
|
|
416
|
+
const transport = options.transport;
|
|
417
|
+
const config = {
|
|
418
|
+
transport: transport,
|
|
419
|
+
};
|
|
420
|
+
if (transport === 'stdio') {
|
|
421
|
+
if (!options.command) {
|
|
422
|
+
console.log('');
|
|
423
|
+
console.log(colors.error('Error: --command is required for stdio transport'));
|
|
424
|
+
console.log('');
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
config.command = options.command;
|
|
428
|
+
if (options.args) {
|
|
429
|
+
config.args = options.args.split(',').map((a) => a.trim());
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
else if (transport === 'http') {
|
|
433
|
+
if (!options.url) {
|
|
434
|
+
console.log('');
|
|
435
|
+
console.log(colors.error('Error: --url is required for http transport'));
|
|
436
|
+
console.log('');
|
|
437
|
+
process.exit(1);
|
|
438
|
+
}
|
|
439
|
+
config.url = options.url;
|
|
440
|
+
const headers = {};
|
|
441
|
+
if (options.token) {
|
|
442
|
+
headers['Authorization'] = `Bearer ${options.token}`;
|
|
443
|
+
}
|
|
444
|
+
if (options.header) {
|
|
445
|
+
const headerArray = Array.isArray(options.header) ? options.header : [options.header];
|
|
446
|
+
for (const h of headerArray) {
|
|
447
|
+
const colonIndex = h.indexOf(':');
|
|
448
|
+
if (colonIndex > 0) {
|
|
449
|
+
const key = h.substring(0, colonIndex).trim();
|
|
450
|
+
const value = h.substring(colonIndex + 1).trim();
|
|
451
|
+
headers[key] = value;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (Object.keys(headers).length > 0) {
|
|
456
|
+
config.headers = headers;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
console.log('');
|
|
461
|
+
console.log(colors.error(`Error: Unknown transport type: ${transport}`));
|
|
462
|
+
console.log(colors.textMuted('Valid types: stdio, http'));
|
|
463
|
+
console.log('');
|
|
464
|
+
process.exit(1);
|
|
465
|
+
}
|
|
466
|
+
// Skip confirmation in non-interactive mode
|
|
467
|
+
if (!options.yes) {
|
|
468
|
+
console.log('');
|
|
469
|
+
console.log(colors.textMuted('Server configuration:'));
|
|
470
|
+
console.log(` ${colors.primaryBright('Name:')} ${name}`);
|
|
471
|
+
console.log(` ${colors.primaryBright('Transport:')} ${config.transport}`);
|
|
472
|
+
if (config.command) {
|
|
473
|
+
console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
|
|
474
|
+
}
|
|
475
|
+
if (config.url) {
|
|
476
|
+
console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
|
|
477
|
+
if (config.authToken) {
|
|
478
|
+
console.log(` ${colors.primaryBright('Token:')} [hidden]`);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
console.log('');
|
|
482
|
+
}
|
|
483
|
+
try {
|
|
484
|
+
// Save to config
|
|
485
|
+
configManager.addMcpServer(name, config);
|
|
486
|
+
configManager.save(options.scope);
|
|
487
|
+
// Register with MCP manager
|
|
488
|
+
mcpManager.registerServer(name, config);
|
|
489
|
+
// Try to connect
|
|
490
|
+
let connected = false;
|
|
491
|
+
try {
|
|
492
|
+
await mcpManager.connectServer(name);
|
|
493
|
+
connected = true;
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
console.log(colors.textMuted(` ā ļø Connection failed: ${error.message}`));
|
|
497
|
+
console.log(colors.textMuted(' The server is saved but not connected.'));
|
|
498
|
+
}
|
|
499
|
+
if (connected) {
|
|
500
|
+
console.log('');
|
|
501
|
+
console.log(colors.success(`ā
MCP server '${name}' added and connected successfully`));
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
console.log('');
|
|
505
|
+
console.log(colors.success(`ā
MCP server '${name}' added successfully`));
|
|
506
|
+
}
|
|
507
|
+
console.log('');
|
|
508
|
+
process.exit(0);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
console.log('');
|
|
512
|
+
console.log(colors.error(`Failed to add MCP server: ${error.message}`));
|
|
513
|
+
console.log('');
|
|
514
|
+
process.exit(1);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
// Interactive mode
|
|
519
|
+
const { text, select, confirm } = await import('@clack/prompts');
|
|
520
|
+
const separator = icons.separator.repeat(40);
|
|
521
|
+
console.log('');
|
|
522
|
+
console.log(colors.primaryBright(`${icons.tool} Add MCP Server`));
|
|
523
|
+
console.log(colors.border(separator));
|
|
524
|
+
console.log('');
|
|
525
|
+
// Step 1: Enter server name
|
|
526
|
+
let name = options.add;
|
|
527
|
+
if (!name) {
|
|
528
|
+
name = await text({
|
|
529
|
+
message: 'Enter MCP server name:',
|
|
530
|
+
validate: (value) => {
|
|
531
|
+
if (!value || !value.trim()) {
|
|
532
|
+
return 'Server name is required';
|
|
533
|
+
}
|
|
534
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(value)) {
|
|
535
|
+
return 'Server name must contain only alphanumeric characters, hyphens, and underscores';
|
|
536
|
+
}
|
|
537
|
+
return undefined;
|
|
538
|
+
},
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
// Step 2: Select transport type
|
|
542
|
+
const transport = await select({
|
|
543
|
+
message: 'Select transport type:',
|
|
544
|
+
options: [
|
|
545
|
+
{ value: 'stdio', label: 'Stdio (stdin/stdout)' },
|
|
546
|
+
{ value: 'http', label: 'HTTP (Streamable HTTP)' },
|
|
547
|
+
],
|
|
548
|
+
});
|
|
549
|
+
if (typeof transport === 'symbol') {
|
|
550
|
+
console.log('');
|
|
551
|
+
console.log(colors.textMuted('Cancelled'));
|
|
552
|
+
console.log('');
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
const config = {
|
|
556
|
+
transport: transport,
|
|
557
|
+
};
|
|
558
|
+
if (transport === 'stdio') {
|
|
559
|
+
// Step 3: Enter command
|
|
560
|
+
config.command = await text({
|
|
561
|
+
message: 'Enter command (for stdio transport):',
|
|
562
|
+
validate: (value) => value && value.trim() ? undefined : 'Command is required',
|
|
563
|
+
});
|
|
564
|
+
// Step 4: Enter arguments
|
|
565
|
+
const argsInput = await text({
|
|
566
|
+
message: 'Enter arguments (comma-separated, for stdio transport):',
|
|
567
|
+
defaultValue: '',
|
|
568
|
+
});
|
|
569
|
+
if (argsInput.trim()) {
|
|
570
|
+
config.args = argsInput.split(',').map((a) => a.trim());
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
// Step 3: Enter URL
|
|
575
|
+
let url = '';
|
|
576
|
+
while (!url) {
|
|
577
|
+
url = await text({
|
|
578
|
+
message: 'Enter server URL (for HTTP transport):',
|
|
579
|
+
validate: (value) => {
|
|
580
|
+
if (!value || !value.trim()) {
|
|
581
|
+
return 'URL is required';
|
|
582
|
+
}
|
|
583
|
+
try {
|
|
584
|
+
new URL(value);
|
|
585
|
+
return undefined;
|
|
586
|
+
}
|
|
587
|
+
catch {
|
|
588
|
+
return 'Invalid URL format (e.g., https://example.com)';
|
|
589
|
+
}
|
|
590
|
+
},
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
config.url = url;
|
|
594
|
+
const headers = {};
|
|
595
|
+
// Step 4: Enter auth token (optional)
|
|
596
|
+
const authToken = await text({
|
|
597
|
+
message: 'Enter Bearer token (optional):',
|
|
598
|
+
defaultValue: '',
|
|
599
|
+
});
|
|
600
|
+
if (authToken.trim()) {
|
|
601
|
+
headers['Authorization'] = `Bearer ${authToken}`;
|
|
602
|
+
}
|
|
603
|
+
// Step 5: Enter custom headers (optional)
|
|
604
|
+
const headersInput = await text({
|
|
605
|
+
message: 'Enter custom headers as JSON (optional):',
|
|
606
|
+
defaultValue: '',
|
|
607
|
+
});
|
|
608
|
+
if (headersInput.trim()) {
|
|
609
|
+
try {
|
|
610
|
+
const customHeaders = JSON.parse(headersInput);
|
|
611
|
+
Object.assign(headers, customHeaders);
|
|
612
|
+
}
|
|
613
|
+
catch {
|
|
614
|
+
// Ignore invalid JSON
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
if (Object.keys(headers).length > 0) {
|
|
618
|
+
config.headers = headers;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
// Step 6: Confirm and save
|
|
622
|
+
console.log('');
|
|
623
|
+
console.log(colors.textMuted('Server configuration:'));
|
|
624
|
+
console.log(` ${colors.primaryBright('Name:')} ${name}`);
|
|
625
|
+
console.log(` ${colors.primaryBright('Transport:')} ${config.transport}`);
|
|
626
|
+
if (config.command) {
|
|
627
|
+
console.log(` ${colors.primaryBright('Command:')} ${config.command} ${(config.args || []).join(' ')}`);
|
|
628
|
+
}
|
|
629
|
+
if (config.url) {
|
|
630
|
+
console.log(` ${colors.primaryBright('URL:')} ${config.url}`);
|
|
631
|
+
}
|
|
632
|
+
console.log('');
|
|
633
|
+
const shouldSave = await confirm({
|
|
634
|
+
message: 'Save this MCP server configuration?',
|
|
635
|
+
});
|
|
636
|
+
if (typeof shouldSave === 'symbol' || !shouldSave) {
|
|
637
|
+
console.log('');
|
|
638
|
+
console.log(colors.textMuted('Cancelled'));
|
|
639
|
+
console.log('');
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
try {
|
|
643
|
+
// Save to config
|
|
644
|
+
configManager.addMcpServer(name, config);
|
|
645
|
+
configManager.save(options.scope);
|
|
646
|
+
// Register with MCP manager
|
|
647
|
+
mcpManager.registerServer(name, config);
|
|
648
|
+
// Try to connect
|
|
649
|
+
let connected = false;
|
|
650
|
+
try {
|
|
651
|
+
await mcpManager.connectServer(name);
|
|
652
|
+
connected = true;
|
|
653
|
+
}
|
|
654
|
+
catch (error) {
|
|
655
|
+
console.log(colors.textMuted(` ā ļø Connection failed: ${error.message}`));
|
|
656
|
+
console.log(colors.textMuted(' The server is saved but not connected. Use "/mcp refresh" in interactive mode to retry.'));
|
|
657
|
+
}
|
|
658
|
+
if (connected) {
|
|
659
|
+
console.log('');
|
|
660
|
+
console.log(colors.success(`ā
MCP server '${name}' added and connected successfully`));
|
|
661
|
+
}
|
|
662
|
+
else {
|
|
663
|
+
console.log('');
|
|
664
|
+
console.log(colors.success(`ā
MCP server '${name}' added successfully (not connected)`));
|
|
665
|
+
}
|
|
666
|
+
console.log('');
|
|
667
|
+
}
|
|
668
|
+
catch (error) {
|
|
669
|
+
console.log('');
|
|
670
|
+
console.log(colors.error(`Failed to add MCP server: ${error.message}`));
|
|
671
|
+
console.log('');
|
|
672
|
+
}
|
|
673
|
+
}
|
|
253
674
|
}
|
|
254
675
|
else if (options.remove) {
|
|
255
676
|
try {
|
|
256
677
|
mcpManager.disconnectServer(options.remove);
|
|
257
678
|
const mcpServers = configManager.getMcpServers();
|
|
258
679
|
delete mcpServers[options.remove];
|
|
259
|
-
|
|
680
|
+
configManager.save(options.scope);
|
|
260
681
|
console.log('');
|
|
261
682
|
console.log(colors.success(`MCP server ${options.remove} removed successfully`));
|
|
262
683
|
console.log('');
|
|
684
|
+
process.exit(0);
|
|
263
685
|
}
|
|
264
686
|
catch (error) {
|
|
265
687
|
const { message, suggestion } = formatError(error);
|
|
@@ -267,12 +689,32 @@ program
|
|
|
267
689
|
console.log(colors.error(`Failed to remove MCP server: ${message}`));
|
|
268
690
|
console.log(colors.textMuted(suggestion));
|
|
269
691
|
console.log('');
|
|
692
|
+
process.exit(1);
|
|
270
693
|
}
|
|
271
694
|
}
|
|
272
695
|
else {
|
|
273
696
|
console.log('');
|
|
274
|
-
console.log(colors.warning('Please specify an action: --list, --add, or --remove'));
|
|
697
|
+
console.log(colors.warning('Please specify an action: --list, --get, --add, or --remove'));
|
|
698
|
+
console.log('');
|
|
699
|
+
console.log(colors.textMuted('Usage:'));
|
|
700
|
+
console.log(` ${colors.primaryBright('xagent mcp --list')} ${colors.textMuted('| List all MCP servers')}`);
|
|
701
|
+
console.log(` ${colors.primaryBright('xagent mcp --get <name>')} ${colors.textMuted('| Get MCP server details')}`);
|
|
702
|
+
console.log(` ${colors.primaryBright('xagent mcp --add')} ${colors.textMuted('| Add MCP server (interactive)')}`);
|
|
703
|
+
console.log('');
|
|
704
|
+
console.log(colors.textMuted('Non-interactive examples:'));
|
|
705
|
+
console.log(` ${colors.primaryBright('xagent mcp --add -t stdio -c "npx" --args "-y,@modelcontextprotocol/server-github"')}`);
|
|
706
|
+
console.log(` ${colors.primaryBright('xagent mcp --add -t http -u "https://example.com/mcp" -k "token"')}`);
|
|
275
707
|
console.log('');
|
|
708
|
+
console.log(colors.textMuted('Options:'));
|
|
709
|
+
console.log(` ${colors.primaryBright('-t, --transport')} ${colors.textMuted('Transport: stdio or http')}`);
|
|
710
|
+
console.log(` ${colors.primaryBright('-c, --command')} ${colors.textMuted('Command for stdio transport')}`);
|
|
711
|
+
console.log(` ${colors.primaryBright('--args')} ${colors.textMuted('Arguments (comma-separated)')}`);
|
|
712
|
+
console.log(` ${colors.primaryBright('-u, --url')} ${colors.textMuted('URL for HTTP transport')}`);
|
|
713
|
+
console.log(` ${colors.primaryBright('-k, --token')} ${colors.textMuted('Bearer authentication token')}`);
|
|
714
|
+
console.log(` ${colors.primaryBright('--header')} ${colors.textMuted('Custom header (key:value)')}`);
|
|
715
|
+
console.log(` ${colors.primaryBright('-y, --yes')} ${colors.textMuted('Skip confirmation')}`);
|
|
716
|
+
console.log('');
|
|
717
|
+
process.exit(1);
|
|
276
718
|
}
|
|
277
719
|
});
|
|
278
720
|
program
|
|
@@ -291,6 +733,7 @@ program
|
|
|
291
733
|
console.log(colors.success('Project initialized successfully!'));
|
|
292
734
|
console.log(colors.textMuted('You can now run "xagent start" to begin'));
|
|
293
735
|
console.log('');
|
|
736
|
+
process.exit(0);
|
|
294
737
|
}
|
|
295
738
|
catch (error) {
|
|
296
739
|
const { message, suggestion } = formatError(error);
|
|
@@ -317,6 +760,7 @@ program
|
|
|
317
760
|
console.log(colors.warning('No workflows installed'));
|
|
318
761
|
console.log(colors.textMuted('Use --add to install workflows from the marketplace'));
|
|
319
762
|
console.log('');
|
|
763
|
+
process.exit(0);
|
|
320
764
|
}
|
|
321
765
|
else {
|
|
322
766
|
const separator = icons.separator.repeat(40);
|
|
@@ -330,6 +774,7 @@ program
|
|
|
330
774
|
console.log(` ${colors.textDim(` ${workflow.description}`)}`);
|
|
331
775
|
console.log('');
|
|
332
776
|
});
|
|
777
|
+
process.exit(0);
|
|
333
778
|
}
|
|
334
779
|
}
|
|
335
780
|
else if (options.add) {
|
|
@@ -338,6 +783,7 @@ program
|
|
|
338
783
|
console.log('');
|
|
339
784
|
console.log(colors.success(`Workflow ${options.add} added successfully!`));
|
|
340
785
|
console.log('');
|
|
786
|
+
process.exit(0);
|
|
341
787
|
}
|
|
342
788
|
catch (error) {
|
|
343
789
|
const { message, suggestion } = formatError(error);
|
|
@@ -354,6 +800,7 @@ program
|
|
|
354
800
|
console.log('');
|
|
355
801
|
console.log(colors.success(`Workflow ${options.remove} removed successfully!`));
|
|
356
802
|
console.log('');
|
|
803
|
+
process.exit(0);
|
|
357
804
|
}
|
|
358
805
|
catch (error) {
|
|
359
806
|
const { message, suggestion } = formatError(error);
|
|
@@ -368,6 +815,219 @@ program
|
|
|
368
815
|
console.log('');
|
|
369
816
|
console.log(colors.warning('Please specify an action: --list, --add, or --remove'));
|
|
370
817
|
console.log('');
|
|
818
|
+
process.exit(1);
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
program
|
|
822
|
+
.command('skill')
|
|
823
|
+
.description('Manage skills')
|
|
824
|
+
.option('-l, --list', 'List all installed user skills')
|
|
825
|
+
.option('--add <source>', 'Install a skill (auto-detects local path or remote URL)')
|
|
826
|
+
.option('-r, --remove <skill-id>', 'Remove a user-installed skill')
|
|
827
|
+
.action(async (options) => {
|
|
828
|
+
const { getConfigManager } = await import('./config.js');
|
|
829
|
+
const configManager = getConfigManager();
|
|
830
|
+
const { promises: fs } = await import('fs');
|
|
831
|
+
const pathModule = await import('path');
|
|
832
|
+
const { exec } = await import('child_process');
|
|
833
|
+
const { promisify } = await import('util');
|
|
834
|
+
const os = await import('os');
|
|
835
|
+
const _execAsync = promisify(exec);
|
|
836
|
+
const userSkillsPath = configManager.getUserSkillsPath() || pathModule.join(os.homedir(), '.xagent', 'skills');
|
|
837
|
+
const _userNodeModulesPath = configManager.getUserNodeModulesPath() || pathModule.join(os.homedir(), '.xagent', 'node_modules');
|
|
838
|
+
if (options.add) {
|
|
839
|
+
const separator = icons.separator.repeat(40);
|
|
840
|
+
console.log('');
|
|
841
|
+
console.log(colors.primaryBright(`${icons.tool} Install Skill`));
|
|
842
|
+
console.log(colors.border(separator));
|
|
843
|
+
console.log('');
|
|
844
|
+
const source = options.add.trim();
|
|
845
|
+
const { installSkill } = await import('./skill-installer.js');
|
|
846
|
+
const { parseSource } = await import('./skill-installer.js');
|
|
847
|
+
// Auto-detect if source is local or remote
|
|
848
|
+
const parsed = parseSource(source);
|
|
849
|
+
const isLocal = parsed.type === 'local';
|
|
850
|
+
if (isLocal) {
|
|
851
|
+
// Local installation
|
|
852
|
+
const sourcePath = pathModule.resolve(source);
|
|
853
|
+
const skillName = pathModule.basename(sourcePath);
|
|
854
|
+
const destPath = pathModule.join(userSkillsPath, skillName);
|
|
855
|
+
try {
|
|
856
|
+
// Check if source exists
|
|
857
|
+
await fs.access(sourcePath);
|
|
858
|
+
// Check if SKILL.md exists
|
|
859
|
+
const skillMdPath = pathModule.join(sourcePath, 'SKILL.md');
|
|
860
|
+
try {
|
|
861
|
+
await fs.access(skillMdPath);
|
|
862
|
+
}
|
|
863
|
+
catch {
|
|
864
|
+
console.log(colors.error(`SKILL.md not found in ${sourcePath}`));
|
|
865
|
+
console.log(colors.textMuted('Each skill must have a SKILL.md file'));
|
|
866
|
+
console.log('');
|
|
867
|
+
process.exit(1);
|
|
868
|
+
}
|
|
869
|
+
// Check if skill already exists in user skills path
|
|
870
|
+
try {
|
|
871
|
+
await fs.access(destPath);
|
|
872
|
+
console.log(colors.warning(`Skill "${skillName}" already installed`));
|
|
873
|
+
console.log(colors.textMuted(`Use "xagent skill -r ${skillName}" to remove it first`));
|
|
874
|
+
console.log('');
|
|
875
|
+
process.exit(1);
|
|
876
|
+
}
|
|
877
|
+
catch {
|
|
878
|
+
// Doesn't exist, proceed
|
|
879
|
+
}
|
|
880
|
+
// Ensure user skills directory exists
|
|
881
|
+
await fs.mkdir(userSkillsPath, { recursive: true });
|
|
882
|
+
// Copy the skill
|
|
883
|
+
await copyDirectory(sourcePath, destPath);
|
|
884
|
+
console.log('');
|
|
885
|
+
console.log(colors.success(`ā
Skill "${skillName}" installed successfully`));
|
|
886
|
+
console.log(colors.textMuted(` Location: ${destPath}`));
|
|
887
|
+
console.log(colors.textMuted(` Type: Local`));
|
|
888
|
+
console.log('');
|
|
889
|
+
// Notify running xAgent to update system prompt
|
|
890
|
+
await notifySkillUpdate(userSkillsPath);
|
|
891
|
+
console.log('');
|
|
892
|
+
process.exit(0);
|
|
893
|
+
}
|
|
894
|
+
catch (error) {
|
|
895
|
+
const { message, suggestion } = formatError(error);
|
|
896
|
+
console.log(colors.error(`Failed to install skill: ${message}`));
|
|
897
|
+
console.log(colors.textMuted(suggestion));
|
|
898
|
+
console.log('');
|
|
899
|
+
process.exit(1);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
else {
|
|
903
|
+
// Remote installation
|
|
904
|
+
console.log(colors.textMuted(` Source: ${source}`));
|
|
905
|
+
console.log(colors.textMuted(` Type: Remote`));
|
|
906
|
+
console.log('');
|
|
907
|
+
try {
|
|
908
|
+
const result = await installSkill(source);
|
|
909
|
+
if (result.success) {
|
|
910
|
+
console.log(colors.success(`ā
Skill "${result.skillName}" installed successfully`));
|
|
911
|
+
console.log(colors.textMuted(` Location: ${result.skillPath}`));
|
|
912
|
+
console.log('');
|
|
913
|
+
// Notify running xAgent to update system prompt
|
|
914
|
+
await notifySkillUpdate(userSkillsPath);
|
|
915
|
+
console.log(colors.textMuted('Note: Run "xagent start" to use the new skill'));
|
|
916
|
+
console.log('');
|
|
917
|
+
process.exit(0);
|
|
918
|
+
}
|
|
919
|
+
else {
|
|
920
|
+
console.log(colors.error(`Failed to install skill: ${result.error}`));
|
|
921
|
+
console.log('');
|
|
922
|
+
process.exit(1);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
catch (error) {
|
|
926
|
+
const { message, suggestion } = formatError(error);
|
|
927
|
+
console.log(colors.error(`Failed to install skill: ${message}`));
|
|
928
|
+
console.log(colors.textMuted(suggestion));
|
|
929
|
+
console.log('');
|
|
930
|
+
process.exit(1);
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
else if (options.list) {
|
|
935
|
+
const separator = icons.separator.repeat(40);
|
|
936
|
+
console.log('');
|
|
937
|
+
console.log(colors.primaryBright(`${icons.tool} Skills`));
|
|
938
|
+
console.log(colors.border(separator));
|
|
939
|
+
console.log('');
|
|
940
|
+
try {
|
|
941
|
+
const entries = await fs.readdir(userSkillsPath, { withFileTypes: true });
|
|
942
|
+
const skills = entries.filter(e => e.isDirectory());
|
|
943
|
+
if (skills.length === 0) {
|
|
944
|
+
console.log(colors.textMuted('No user skills installed'));
|
|
945
|
+
console.log('');
|
|
946
|
+
return;
|
|
947
|
+
}
|
|
948
|
+
for (const skill of skills) {
|
|
949
|
+
const skillPath = path.join(userSkillsPath, skill.name);
|
|
950
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
951
|
+
try {
|
|
952
|
+
const content = await fs.readFile(skillMdPath, 'utf-8');
|
|
953
|
+
// Simple parsing for name and description
|
|
954
|
+
const nameMatch = content.match(/^name:\s*(.+)$/m);
|
|
955
|
+
const descMatch = content.match(/^description:\s*(.+)$/m);
|
|
956
|
+
const name = nameMatch ? nameMatch[1].trim() : skill.name;
|
|
957
|
+
const description = descMatch ? descMatch[1].trim() : 'No description';
|
|
958
|
+
console.log(` ${colors.primaryBright(`⢠${name}`)}`);
|
|
959
|
+
console.log(` ${colors.textDim(` ${description}`)}`);
|
|
960
|
+
console.log('');
|
|
961
|
+
}
|
|
962
|
+
catch {
|
|
963
|
+
console.log(` ${colors.primaryBright(`⢠${skill.name}`)}`);
|
|
964
|
+
console.log(` ${colors.textDim(` (Missing SKILL.md)`)}`);
|
|
965
|
+
console.log('');
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
console.log(colors.textMuted(`Skills directory: ${userSkillsPath}`));
|
|
969
|
+
console.log('');
|
|
970
|
+
process.exit(0);
|
|
971
|
+
}
|
|
972
|
+
catch {
|
|
973
|
+
console.log(colors.textMuted('No user skills installed'));
|
|
974
|
+
console.log('');
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
else if (options.remove) {
|
|
978
|
+
const skillPath = path.join(userSkillsPath, options.remove);
|
|
979
|
+
// Protect find-skills from deletion
|
|
980
|
+
if (options.remove === 'find-skills') {
|
|
981
|
+
console.log('');
|
|
982
|
+
console.log(colors.error(`Cannot remove protected skill: find-skills`));
|
|
983
|
+
console.log(colors.textMuted('find-skills is a built-in skill that helps you discover and install other skills.'));
|
|
984
|
+
console.log('');
|
|
985
|
+
process.exit(1);
|
|
986
|
+
}
|
|
987
|
+
try {
|
|
988
|
+
await fs.access(skillPath);
|
|
989
|
+
// Verify it's in user skills path (not built-in)
|
|
990
|
+
if (!skillPath.startsWith(userSkillsPath)) {
|
|
991
|
+
console.log('');
|
|
992
|
+
console.log(colors.error(`Cannot remove skill outside user directory: ${options.remove}`));
|
|
993
|
+
console.log('');
|
|
994
|
+
process.exit(1);
|
|
995
|
+
}
|
|
996
|
+
// Remove the skill directory
|
|
997
|
+
await fs.rm(skillPath, { recursive: true, force: true });
|
|
998
|
+
console.log('');
|
|
999
|
+
console.log(colors.success(`ā
Skill ${options.remove} removed successfully`));
|
|
1000
|
+
console.log('');
|
|
1001
|
+
// Notify running xAgent to update system prompt
|
|
1002
|
+
await notifySkillUpdate(userSkillsPath);
|
|
1003
|
+
console.log('');
|
|
1004
|
+
process.exit(0);
|
|
1005
|
+
}
|
|
1006
|
+
catch {
|
|
1007
|
+
console.log('');
|
|
1008
|
+
console.log(colors.error(`Skill not found: ${options.remove}`));
|
|
1009
|
+
console.log('');
|
|
1010
|
+
process.exit(1);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
else {
|
|
1014
|
+
// Show help
|
|
1015
|
+
console.log('');
|
|
1016
|
+
console.log(colors.textMuted('Usage:'));
|
|
1017
|
+
console.log(` ${colors.primaryBright('xagent skill -l')} ${colors.textDim('| List all skills')}`);
|
|
1018
|
+
console.log(` ${colors.primaryBright('xagent skill --add <source>')} ${colors.textDim('| Install skill (auto-detects local or remote)')}`);
|
|
1019
|
+
console.log(` ${colors.primaryBright('xagent skill -r <name>')} ${colors.textDim('| Remove a skill')}`);
|
|
1020
|
+
console.log('');
|
|
1021
|
+
console.log(colors.textMuted('Examples:'));
|
|
1022
|
+
console.log(` ${colors.primaryBright('xagent skill --add ./my-skill')} ${colors.textDim('| Install from local path')}`);
|
|
1023
|
+
console.log(` ${colors.primaryBright('xagent skill --add owner/repo')} ${colors.textDim('| Install from GitHub')}`);
|
|
1024
|
+
console.log(` ${colors.primaryBright('xagent skill --add https://github.com/owner/repo')}`);
|
|
1025
|
+
console.log(` ${colors.primaryBright('xagent skill --add https://docs.example.com/skill.md')}`);
|
|
1026
|
+
console.log('');
|
|
1027
|
+
console.log(colors.textMuted('To install a new skill, use the interactive command:'));
|
|
1028
|
+
console.log(` ${colors.primaryBright('/skill add')}`);
|
|
1029
|
+
console.log('');
|
|
1030
|
+
process.exit(0);
|
|
371
1031
|
}
|
|
372
1032
|
});
|
|
373
1033
|
program
|
|
@@ -393,6 +1053,7 @@ program
|
|
|
393
1053
|
console.log(` ${colors.primaryBright('š Documentation:')} ${colors.primaryBright('https://platform.xagent.cn/cli/')}`);
|
|
394
1054
|
console.log(` ${colors.primaryBright('š» GitHub:')} ${colors.primaryBright('https://github.com/xagent-ai/xagent-cli')}`);
|
|
395
1055
|
console.log('');
|
|
1056
|
+
process.exit(0);
|
|
396
1057
|
});
|
|
397
1058
|
program
|
|
398
1059
|
.command('gui')
|
|
@@ -433,11 +1094,14 @@ program
|
|
|
433
1094
|
console.log('');
|
|
434
1095
|
}
|
|
435
1096
|
const { createGUISubAgent } = await import('./gui-subagent/index.js');
|
|
1097
|
+
// Create ref for tracking first VLM call across loop iterations
|
|
1098
|
+
const isFirstVlmCallRef = { current: true };
|
|
436
1099
|
// Create remoteVlmCaller for remote mode (uses full messages for consistent behavior)
|
|
437
1100
|
let remoteVlmCaller;
|
|
438
1101
|
if (!isLocalMode && authConfig.baseUrl) {
|
|
439
1102
|
const remoteBaseUrl = `${authConfig.baseUrl}/api/agent/vlm`;
|
|
440
|
-
remoteVlmCaller = async (messages, _systemPrompt) => {
|
|
1103
|
+
remoteVlmCaller = async (messages, _systemPrompt, _taskId, isFirstVlmCallRef) => {
|
|
1104
|
+
const status = isFirstVlmCallRef.current ? 'begin' : 'continue';
|
|
441
1105
|
const response = await fetch(remoteBaseUrl, {
|
|
442
1106
|
method: 'POST',
|
|
443
1107
|
headers: {
|
|
@@ -445,7 +1109,9 @@ program
|
|
|
445
1109
|
'Authorization': `Bearer ${authConfig.apiKey || ''}`,
|
|
446
1110
|
},
|
|
447
1111
|
body: JSON.stringify({
|
|
448
|
-
messages
|
|
1112
|
+
messages,
|
|
1113
|
+
taskId: _taskId,
|
|
1114
|
+
status
|
|
449
1115
|
}),
|
|
450
1116
|
});
|
|
451
1117
|
if (!response.ok) {
|
|
@@ -453,14 +1119,17 @@ program
|
|
|
453
1119
|
throw new Error(`Remote VLM error: ${response.status} - ${errorText}`);
|
|
454
1120
|
}
|
|
455
1121
|
const result = await response.json();
|
|
1122
|
+
// Update ref after call so subsequent calls use 'continue'
|
|
1123
|
+
isFirstVlmCallRef.current = false;
|
|
456
1124
|
return result.response || result.content || result.message || '';
|
|
457
1125
|
};
|
|
458
1126
|
}
|
|
459
|
-
const
|
|
1127
|
+
const _guiAgent = await createGUISubAgent({
|
|
460
1128
|
headless: options.headless ?? false,
|
|
461
1129
|
model: isLocalMode ? modelName : undefined,
|
|
462
1130
|
modelBaseUrl: isLocalMode ? baseUrl : undefined,
|
|
463
1131
|
modelApiKey: isLocalMode ? apiKey : undefined,
|
|
1132
|
+
isFirstVlmCallRef,
|
|
464
1133
|
remoteVlmCaller,
|
|
465
1134
|
isLocalMode,
|
|
466
1135
|
});
|
|
@@ -524,7 +1193,7 @@ program
|
|
|
524
1193
|
if (files.length === 0) {
|
|
525
1194
|
console.log(colors.textMuted('No memory files found.'));
|
|
526
1195
|
console.log('');
|
|
527
|
-
|
|
1196
|
+
process.exit(0);
|
|
528
1197
|
}
|
|
529
1198
|
const globalFile = files.find(f => f === 'global.md');
|
|
530
1199
|
const projectFiles = files.filter(f => f.startsWith('project_'));
|
|
@@ -557,7 +1226,7 @@ program
|
|
|
557
1226
|
console.log(colors.textMuted(`Total: ${files.length} memory file(s)`));
|
|
558
1227
|
console.log('');
|
|
559
1228
|
}
|
|
560
|
-
catch
|
|
1229
|
+
catch {
|
|
561
1230
|
console.log(colors.textMuted('No memory files found.'));
|
|
562
1231
|
console.log('');
|
|
563
1232
|
}
|
|
@@ -573,7 +1242,7 @@ program
|
|
|
573
1242
|
if (projectFiles.length === 0) {
|
|
574
1243
|
console.log(colors.textMuted('No project memories to clean.'));
|
|
575
1244
|
console.log('');
|
|
576
|
-
|
|
1245
|
+
process.exit(0);
|
|
577
1246
|
}
|
|
578
1247
|
let cleaned = 0;
|
|
579
1248
|
for (const file of projectFiles) {
|
|
@@ -637,7 +1306,7 @@ program
|
|
|
637
1306
|
if (files.length === 0) {
|
|
638
1307
|
console.log(colors.textMuted('No memory files to clean.'));
|
|
639
1308
|
console.log('');
|
|
640
|
-
|
|
1309
|
+
process.exit(0);
|
|
641
1310
|
}
|
|
642
1311
|
let cleaned = 0;
|
|
643
1312
|
for (const file of files) {
|
|
@@ -670,6 +1339,50 @@ program
|
|
|
670
1339
|
console.log('');
|
|
671
1340
|
}
|
|
672
1341
|
});
|
|
1342
|
+
program
|
|
1343
|
+
.command('update')
|
|
1344
|
+
.description('Check for updates and update xAgent CLI')
|
|
1345
|
+
.action(async () => {
|
|
1346
|
+
const separator = icons.separator.repeat(40);
|
|
1347
|
+
console.log('');
|
|
1348
|
+
console.log(colors.primaryBright(`${icons.rocket} Update Check`));
|
|
1349
|
+
console.log(colors.border(separator));
|
|
1350
|
+
console.log('');
|
|
1351
|
+
try {
|
|
1352
|
+
const { getUpdateManager } = await import('./update.js');
|
|
1353
|
+
const updateManager = getUpdateManager();
|
|
1354
|
+
const versionInfo = await updateManager.checkForUpdates();
|
|
1355
|
+
console.log(` ${icons.info} ${colors.textMuted('Current version:')} ${colors.primaryBright(versionInfo.currentVersion)}`);
|
|
1356
|
+
console.log(` ${icons.code} ${colors.textMuted('Latest version:')} ${colors.primaryBright(versionInfo.latestVersion)}`);
|
|
1357
|
+
console.log('');
|
|
1358
|
+
if (versionInfo.updateAvailable) {
|
|
1359
|
+
console.log(colors.success(` š¦ A new version is available!`));
|
|
1360
|
+
console.log('');
|
|
1361
|
+
if (versionInfo.releaseNotes) {
|
|
1362
|
+
console.log(colors.textMuted(' Release Notes:'));
|
|
1363
|
+
console.log(colors.textDim(` ${versionInfo.releaseNotes}`));
|
|
1364
|
+
console.log('');
|
|
1365
|
+
}
|
|
1366
|
+
const shouldUpdate = await confirm({
|
|
1367
|
+
message: 'Do you want to update now?',
|
|
1368
|
+
});
|
|
1369
|
+
if (shouldUpdate === true) {
|
|
1370
|
+
console.log('');
|
|
1371
|
+
await updateManager.autoUpdate();
|
|
1372
|
+
process.exit(0);
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
else {
|
|
1376
|
+
console.log(colors.success(` ā
You are using the latest version`));
|
|
1377
|
+
console.log('');
|
|
1378
|
+
process.exit(0);
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
catch (error) {
|
|
1382
|
+
console.log(colors.error(` ā Failed to check for updates: ${error.message}`));
|
|
1383
|
+
console.log('');
|
|
1384
|
+
}
|
|
1385
|
+
});
|
|
673
1386
|
program.parse(process.argv);
|
|
674
1387
|
if (!process.argv.slice(2).length) {
|
|
675
1388
|
program.outputHelp();
|
|
@@ -678,7 +1391,7 @@ if (!process.argv.slice(2).length) {
|
|
|
678
1391
|
// Global error handling - prevent crashes from uncaught errors
|
|
679
1392
|
// ============================================================
|
|
680
1393
|
// Handle uncaught promise rejections
|
|
681
|
-
process.on('unhandledRejection', (reason,
|
|
1394
|
+
process.on('unhandledRejection', (reason, _promise) => {
|
|
682
1395
|
console.error('\nā An unexpected error occurred');
|
|
683
1396
|
if (reason instanceof Error) {
|
|
684
1397
|
console.error(` ${reason.message}`);
|