lonny-agent 0.2.4 → 0.2.7
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/workflows/ci.yml +21 -0
- package/AGENTS.md +106 -0
- package/CHANGELOG.md +24 -0
- package/README.md +326 -326
- package/dist/agent/__tests__/session-restore.test.d.ts +2 -0
- package/dist/agent/__tests__/session-restore.test.d.ts.map +1 -0
- package/dist/agent/__tests__/session-restore.test.js +260 -0
- package/dist/agent/__tests__/session-restore.test.js.map +1 -0
- package/dist/agent/commands.d.ts +26 -0
- package/dist/agent/commands.d.ts.map +1 -0
- package/dist/agent/commands.js +253 -0
- package/dist/agent/commands.js.map +1 -0
- package/dist/agent/compaction.js +8 -1
- package/dist/agent/compaction.js.map +1 -1
- package/dist/agent/index.d.ts +2 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/llm.d.ts +4 -0
- package/dist/agent/llm.d.ts.map +1 -1
- package/dist/agent/memory.d.ts +12 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +51 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/prompt-builder.d.ts +6 -1
- package/dist/agent/prompt-builder.d.ts.map +1 -1
- package/dist/agent/prompt-builder.js +100 -33
- package/dist/agent/prompt-builder.js.map +1 -1
- package/dist/agent/providers/google.d.ts.map +1 -1
- package/dist/agent/providers/google.js.map +1 -1
- package/dist/agent/providers/openai.d.ts +1 -0
- package/dist/agent/providers/openai.d.ts.map +1 -1
- package/dist/agent/providers/openai.js +59 -6
- package/dist/agent/providers/openai.js.map +1 -1
- package/dist/agent/session-chat.d.ts +3 -0
- package/dist/agent/session-chat.d.ts.map +1 -0
- package/dist/agent/session-chat.js +384 -0
- package/dist/agent/session-chat.js.map +1 -0
- package/dist/agent/session-display.d.ts +29 -0
- package/dist/agent/session-display.d.ts.map +1 -0
- package/dist/agent/session-display.js +179 -0
- package/dist/agent/session-display.js.map +1 -0
- package/dist/agent/session-persistence.d.ts +55 -0
- package/dist/agent/session-persistence.d.ts.map +1 -0
- package/dist/agent/session-persistence.js +101 -0
- package/dist/agent/session-persistence.js.map +1 -0
- package/dist/agent/session-utils.d.ts +5 -0
- package/dist/agent/session-utils.d.ts.map +1 -0
- package/dist/agent/session-utils.js +51 -0
- package/dist/agent/session-utils.js.map +1 -0
- package/dist/agent/session.d.ts +19 -17
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +234 -578
- package/dist/agent/session.js.map +1 -1
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +67 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +7 -1
- package/dist/config/index.js.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/__tests__/bash.test.js +169 -2
- package/dist/tools/__tests__/bash.test.js.map +1 -1
- package/dist/tools/__tests__/edit.test.js +1091 -340
- package/dist/tools/__tests__/edit.test.js.map +1 -1
- package/dist/tools/__tests__/fetch.test.js +1 -1
- package/dist/tools/__tests__/fetch.test.js.map +1 -1
- package/dist/tools/__tests__/glob.test.js +1 -1
- package/dist/tools/__tests__/glob.test.js.map +1 -1
- package/dist/tools/__tests__/grep.test.js +33 -1
- package/dist/tools/__tests__/grep.test.js.map +1 -1
- package/dist/tools/__tests__/ls.test.js +1 -1
- package/dist/tools/__tests__/ls.test.js.map +1 -1
- package/dist/tools/__tests__/read.test.js +1 -1
- package/dist/tools/__tests__/read.test.js.map +1 -1
- package/dist/tools/__tests__/registry.test.js +313 -0
- package/dist/tools/__tests__/registry.test.js.map +1 -1
- package/dist/tools/__tests__/sed.test.d.ts +2 -0
- package/dist/tools/__tests__/sed.test.d.ts.map +1 -0
- package/dist/tools/__tests__/sed.test.js +228 -0
- package/dist/tools/__tests__/sed.test.js.map +1 -0
- package/dist/tools/__tests__/write_plan.test.js +1 -1
- package/dist/tools/__tests__/write_plan.test.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +711 -18
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/codebase/ast/__tests__/ast-edit-demo.d.ts +2 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-demo.d.ts.map +1 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-demo.js +7 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-demo.js.map +1 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-final.d.ts +6 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-final.d.ts.map +1 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-final.js +11 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-final.js.map +1 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-test.d.ts +2 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-test.d.ts.map +1 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-test.js +9 -0
- package/dist/tools/codebase/ast/__tests__/ast-edit-test.js.map +1 -0
- package/dist/tools/codebase/ast/__tests__/integration.test.d.ts +2 -0
- package/dist/tools/codebase/ast/__tests__/integration.test.d.ts.map +1 -0
- package/dist/tools/codebase/ast/__tests__/integration.test.js +415 -0
- package/dist/tools/codebase/ast/__tests__/integration.test.js.map +1 -0
- package/dist/tools/codebase/ast/__tests__/tree-sitter.test.d.ts +2 -0
- package/dist/tools/codebase/ast/__tests__/tree-sitter.test.d.ts.map +1 -0
- package/dist/tools/codebase/ast/__tests__/tree-sitter.test.js +414 -0
- package/dist/tools/codebase/ast/__tests__/tree-sitter.test.js.map +1 -0
- package/dist/tools/codebase/ast/adapter.d.ts +23 -0
- package/dist/tools/codebase/ast/adapter.d.ts.map +1 -0
- package/dist/tools/codebase/ast/adapter.js +11 -0
- package/dist/tools/codebase/ast/adapter.js.map +1 -0
- package/dist/tools/codebase/ast/tools.d.ts +3 -0
- package/dist/tools/codebase/ast/tools.d.ts.map +1 -0
- package/dist/tools/codebase/ast/tools.js +286 -0
- package/dist/tools/codebase/ast/tools.js.map +1 -0
- package/dist/tools/codebase/ast/tree-sitter-adapter.d.ts +3 -0
- package/dist/tools/codebase/ast/tree-sitter-adapter.d.ts.map +1 -0
- package/dist/tools/codebase/ast/tree-sitter-adapter.js +412 -0
- package/dist/tools/codebase/ast/tree-sitter-adapter.js.map +1 -0
- package/dist/tools/codebase/ast/tree-sitter-converters.d.ts +4 -0
- package/dist/tools/codebase/ast/tree-sitter-converters.d.ts.map +1 -0
- package/dist/tools/codebase/ast/tree-sitter-converters.js +447 -0
- package/dist/tools/codebase/ast/tree-sitter-converters.js.map +1 -0
- package/dist/tools/codebase/ast/types.d.ts +103 -0
- package/dist/tools/codebase/ast/types.d.ts.map +1 -0
- package/dist/tools/codebase/ast/types.js +2 -0
- package/dist/tools/codebase/ast/types.js.map +1 -0
- package/dist/tools/codebase/ast/wasm/tree-sitter-python.wasm +0 -0
- package/dist/tools/codebase/ast/wasm/tree-sitter-tsx.wasm +0 -0
- package/dist/tools/codebase/ast/wasm/tree-sitter-typescript.wasm +0 -0
- package/dist/tools/codebase/ast/wasm/tree-sitter.wasm +0 -0
- package/dist/tools/codebase/ast/wasm/web-tree-sitter.wasm +0 -0
- package/dist/tools/codebase/find.d.ts +3 -0
- package/dist/tools/codebase/find.d.ts.map +1 -0
- package/dist/tools/codebase/find.js +61 -0
- package/dist/tools/codebase/find.js.map +1 -0
- package/dist/tools/codebase/glob.d.ts +3 -0
- package/dist/tools/codebase/glob.d.ts.map +1 -0
- package/dist/tools/codebase/glob.js +37 -0
- package/dist/tools/codebase/glob.js.map +1 -0
- package/dist/tools/codebase/grep.d.ts +3 -0
- package/dist/tools/codebase/grep.d.ts.map +1 -0
- package/dist/tools/codebase/grep.js +169 -0
- package/dist/tools/codebase/grep.js.map +1 -0
- package/dist/tools/codebase/ls.d.ts +3 -0
- package/dist/tools/codebase/ls.d.ts.map +1 -0
- package/dist/tools/codebase/ls.js +39 -0
- package/dist/tools/codebase/ls.js.map +1 -0
- package/dist/tools/codebase/read.d.ts +10 -0
- package/dist/tools/codebase/read.d.ts.map +1 -0
- package/dist/tools/codebase/read.js +81 -0
- package/dist/tools/codebase/read.js.map +1 -0
- package/dist/tools/delete_memory.d.ts +3 -0
- package/dist/tools/delete_memory.d.ts.map +1 -0
- package/dist/tools/delete_memory.js +46 -0
- package/dist/tools/delete_memory.js.map +1 -0
- package/dist/tools/edit/diff-compute.d.ts +4 -0
- package/dist/tools/edit/diff-compute.d.ts.map +1 -0
- package/dist/tools/edit/diff-compute.js +18 -0
- package/dist/tools/edit/diff-compute.js.map +1 -0
- package/dist/tools/edit/diff-render.d.ts +18 -0
- package/dist/tools/edit/diff-render.d.ts.map +1 -0
- package/dist/tools/edit/diff-render.js +128 -0
- package/dist/tools/edit/diff-render.js.map +1 -0
- package/dist/tools/edit/edit.d.ts +4 -0
- package/dist/tools/edit/edit.d.ts.map +1 -0
- package/dist/tools/edit/edit.js +440 -0
- package/dist/tools/edit/edit.js.map +1 -0
- package/dist/tools/edit/matcher.d.ts +24 -0
- package/dist/tools/edit/matcher.d.ts.map +1 -0
- package/dist/tools/edit/matcher.js +66 -0
- package/dist/tools/edit/matcher.js.map +1 -0
- package/dist/tools/edit/parser.d.ts +10 -0
- package/dist/tools/edit/parser.d.ts.map +1 -0
- package/dist/tools/edit/parser.js +120 -0
- package/dist/tools/edit/parser.js.map +1 -0
- package/dist/tools/edit/types.d.ts +16 -0
- package/dist/tools/edit/types.d.ts.map +1 -0
- package/dist/tools/edit/types.js +2 -0
- package/dist/tools/edit/types.js.map +1 -0
- package/dist/tools/edit/write_plan.d.ts +5 -0
- package/dist/tools/edit/write_plan.d.ts.map +1 -0
- package/dist/tools/edit/write_plan.js +98 -0
- package/dist/tools/edit/write_plan.js.map +1 -0
- package/dist/tools/edit.d.ts +50 -9
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +394 -159
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/execute/bash/constants.d.ts +24 -0
- package/dist/tools/execute/bash/constants.d.ts.map +1 -0
- package/dist/tools/execute/bash/constants.js +88 -0
- package/dist/tools/execute/bash/constants.js.map +1 -0
- package/dist/tools/execute/bash/errors.d.ts +39 -0
- package/dist/tools/execute/bash/errors.d.ts.map +1 -0
- package/dist/tools/execute/bash/errors.js +249 -0
- package/dist/tools/execute/bash/errors.js.map +1 -0
- package/dist/tools/execute/bash/execution.d.ts +18 -0
- package/dist/tools/execute/bash/execution.d.ts.map +1 -0
- package/dist/tools/execute/bash/execution.js +207 -0
- package/dist/tools/execute/bash/execution.js.map +1 -0
- package/dist/tools/execute/bash/index.d.ts +3 -0
- package/dist/tools/execute/bash/index.d.ts.map +1 -0
- package/dist/tools/execute/bash/index.js +117 -0
- package/dist/tools/execute/bash/index.js.map +1 -0
- package/dist/tools/execute/bash/platform.d.ts +6 -0
- package/dist/tools/execute/bash/platform.d.ts.map +1 -0
- package/dist/tools/execute/bash/platform.js +64 -0
- package/dist/tools/execute/bash/platform.js.map +1 -0
- package/dist/tools/execute/bash/security.d.ts +12 -0
- package/dist/tools/execute/bash/security.d.ts.map +1 -0
- package/dist/tools/execute/bash/security.js +26 -0
- package/dist/tools/execute/bash/security.js.map +1 -0
- package/dist/tools/execute/bash/validation.d.ts +16 -0
- package/dist/tools/execute/bash/validation.d.ts.map +1 -0
- package/dist/tools/execute/bash/validation.js +57 -0
- package/dist/tools/execute/bash/validation.js.map +1 -0
- package/dist/tools/execute/bash.d.ts +3 -0
- package/dist/tools/execute/bash.d.ts.map +1 -0
- package/dist/tools/execute/bash.js +728 -0
- package/dist/tools/execute/bash.js.map +1 -0
- package/dist/tools/execute/git.d.ts +3 -0
- package/dist/tools/execute/git.d.ts.map +1 -0
- package/dist/tools/execute/git.js +183 -0
- package/dist/tools/execute/git.js.map +1 -0
- package/dist/tools/execute/task_complete.d.ts +7 -0
- package/dist/tools/execute/task_complete.d.ts.map +1 -0
- package/dist/tools/execute/task_complete.js +38 -0
- package/dist/tools/execute/task_complete.js.map +1 -0
- package/dist/tools/fetch.d.ts.map +1 -1
- package/dist/tools/fetch.js +2 -0
- package/dist/tools/fetch.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +2 -0
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +2 -0
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +2 -0
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +56 -30
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/install/clawhub.d.ts +26 -0
- package/dist/tools/install/clawhub.d.ts.map +1 -0
- package/dist/tools/install/clawhub.js +182 -0
- package/dist/tools/install/clawhub.js.map +1 -0
- package/dist/tools/install/constants.d.ts +5 -0
- package/dist/tools/install/constants.d.ts.map +1 -0
- package/dist/tools/install/constants.js +5 -0
- package/dist/tools/install/constants.js.map +1 -0
- package/dist/tools/install/install_skill.d.ts +3 -0
- package/dist/tools/install/install_skill.d.ts.map +1 -0
- package/dist/tools/install/install_skill.js +132 -0
- package/dist/tools/install/install_skill.js.map +1 -0
- package/dist/tools/install/npm.d.ts +8 -0
- package/dist/tools/install/npm.d.ts.map +1 -0
- package/dist/tools/install/npm.js +52 -0
- package/dist/tools/install/npm.js.map +1 -0
- package/dist/tools/install/skill-content.d.ts +9 -0
- package/dist/tools/install/skill-content.d.ts.map +1 -0
- package/dist/tools/install/skill-content.js +89 -0
- package/dist/tools/install/skill-content.js.map +1 -0
- package/dist/tools/install_skill.d.ts.map +1 -1
- package/dist/tools/install_skill.js +2 -0
- package/dist/tools/install_skill.js.map +1 -1
- package/dist/tools/list_memory.d.ts +3 -0
- package/dist/tools/list_memory.d.ts.map +1 -0
- package/dist/tools/list_memory.js +55 -0
- package/dist/tools/list_memory.js.map +1 -0
- package/dist/tools/ls.d.ts.map +1 -1
- package/dist/tools/ls.js +2 -0
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/memory/delete_memory.d.ts +3 -0
- package/dist/tools/memory/delete_memory.d.ts.map +1 -0
- package/dist/tools/memory/delete_memory.js +46 -0
- package/dist/tools/memory/delete_memory.js.map +1 -0
- package/dist/tools/memory/list_memory.d.ts +3 -0
- package/dist/tools/memory/list_memory.d.ts.map +1 -0
- package/dist/tools/memory/list_memory.js +55 -0
- package/dist/tools/memory/list_memory.js.map +1 -0
- package/dist/tools/memory/save_memory.d.ts +3 -0
- package/dist/tools/memory/save_memory.d.ts.map +1 -0
- package/dist/tools/memory/save_memory.js +45 -0
- package/dist/tools/memory/save_memory.js.map +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +2 -0
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/registry.d.ts +7 -8
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +114 -46
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/save_memory.d.ts +3 -0
- package/dist/tools/save_memory.d.ts.map +1 -0
- package/dist/tools/save_memory.js +45 -0
- package/dist/tools/save_memory.js.map +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +2 -0
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/sed.d.ts +4 -0
- package/dist/tools/sed.d.ts.map +1 -0
- package/dist/tools/sed.js +121 -0
- package/dist/tools/sed.js.map +1 -0
- package/dist/tools/tree.d.ts +12 -0
- package/dist/tools/tree.d.ts.map +1 -0
- package/dist/tools/tree.js +87 -0
- package/dist/tools/tree.js.map +1 -0
- package/dist/tools/types.d.ts +12 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/web/fetch.d.ts +3 -0
- package/dist/tools/web/fetch.d.ts.map +1 -0
- package/dist/tools/web/fetch.js +49 -0
- package/dist/tools/web/fetch.js.map +1 -0
- package/dist/tools/web/search.d.ts +3 -0
- package/dist/tools/web/search.d.ts.map +1 -0
- package/dist/tools/web/search.js +134 -0
- package/dist/tools/web/search.js.map +1 -0
- package/dist/tools/write_plan.d.ts.map +1 -1
- package/dist/tools/write_plan.js +2 -0
- package/dist/tools/write_plan.js.map +1 -1
- package/dist/tui/commands.d.ts +4 -0
- package/dist/tui/commands.d.ts.map +1 -0
- package/dist/tui/commands.js +118 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/components/colors.d.ts +36 -0
- package/dist/tui/components/colors.d.ts.map +1 -0
- package/dist/tui/components/colors.js +48 -0
- package/dist/tui/components/colors.js.map +1 -0
- package/dist/tui/components/header-bar.d.ts +26 -0
- package/dist/tui/components/header-bar.d.ts.map +1 -0
- package/dist/tui/components/header-bar.js +78 -0
- package/dist/tui/components/header-bar.js.map +1 -0
- package/dist/tui/components/index.d.ts +9 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +9 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/components/landing-screen.d.ts +12 -0
- package/dist/tui/components/landing-screen.d.ts.map +1 -0
- package/dist/tui/components/landing-screen.js +53 -0
- package/dist/tui/components/landing-screen.js.map +1 -0
- package/dist/tui/components/pixel-logo.d.ts +5 -0
- package/dist/tui/components/pixel-logo.d.ts.map +1 -0
- package/dist/tui/components/pixel-logo.js +27 -0
- package/dist/tui/components/pixel-logo.js.map +1 -0
- package/dist/tui/components/plan-utils.d.ts +11 -0
- package/dist/tui/components/plan-utils.d.ts.map +1 -0
- package/dist/tui/components/plan-utils.js +62 -0
- package/dist/tui/components/plan-utils.js.map +1 -0
- package/dist/tui/components/plans-list.d.ts +18 -0
- package/dist/tui/components/plans-list.d.ts.map +1 -0
- package/dist/tui/components/plans-list.js +46 -0
- package/dist/tui/components/plans-list.js.map +1 -0
- package/dist/tui/components/rich-footer.d.ts +29 -0
- package/dist/tui/components/rich-footer.d.ts.map +1 -0
- package/dist/tui/components/rich-footer.js +124 -0
- package/dist/tui/components/rich-footer.js.map +1 -0
- package/dist/tui/components/todo-panel.d.ts +14 -0
- package/dist/tui/components/todo-panel.d.ts.map +1 -0
- package/dist/tui/components/todo-panel.js +83 -0
- package/dist/tui/components/todo-panel.js.map +1 -0
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +14 -7
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/index.d.ts +2 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +99 -505
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/overlays.d.ts +28 -0
- package/dist/tui/overlays.d.ts.map +1 -0
- package/dist/tui/overlays.js +154 -0
- package/dist/tui/overlays.js.map +1 -0
- package/dist/tui/themes.d.ts +5 -0
- package/dist/tui/themes.d.ts.map +1 -0
- package/dist/tui/themes.js +38 -0
- package/dist/tui/themes.js.map +1 -0
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +62 -101
- package/dist/web/index.js.map +1 -1
- package/dist/web/public/app.js +5 -855
- package/dist/web/public/confirm.js +70 -0
- package/dist/web/public/index.html +121 -120
- package/dist/web/public/input.js +107 -0
- package/dist/web/public/messages.js +411 -0
- package/dist/web/public/sidebar.js +82 -0
- package/dist/web/public/state.js +72 -0
- package/dist/web/public/style.css +247 -70
- package/dist/web/public/utils.js +37 -0
- package/dist/web/public/websocket.js +267 -0
- package/dist/web/public/ws.js +19 -0
- package/dist/web/session-bridge.d.ts.map +1 -1
- package/dist/web/session-bridge.js +85 -10
- package/dist/web/session-bridge.js.map +1 -1
- package/docs/ast-tools.md +117 -0
- package/package.json +11 -5
- package/scripts/check-line-count.mjs +53 -0
- package/scripts/copy-ast-wasm.mjs +32 -0
- package/scripts/copy-native.mjs +24 -0
- package/scripts/copy-web.mjs +15 -0
- package/src/agent/__tests__/session-restore.test.ts +284 -0
- package/src/agent/commands.ts +274 -0
- package/src/agent/compaction.ts +9 -2
- package/src/agent/index.ts +7 -2
- package/src/agent/llm.ts +4 -0
- package/src/agent/memory.ts +60 -0
- package/src/agent/prompt-builder.ts +111 -33
- package/src/agent/providers/google.ts +0 -1
- package/src/agent/providers/openai.ts +79 -8
- package/src/agent/session-chat.ts +480 -0
- package/src/agent/session-display.ts +195 -0
- package/src/agent/session-persistence.ts +146 -0
- package/src/agent/session-utils.ts +54 -0
- package/src/agent/session.ts +269 -670
- package/src/cli/index.ts +73 -4
- package/src/config/index.ts +14 -7
- package/src/index.ts +30 -3
- package/src/tools/__tests__/bash.test.ts +188 -2
- package/src/tools/__tests__/edit.test.ts +1216 -356
- package/src/tools/__tests__/fetch.test.ts +1 -1
- package/src/tools/__tests__/glob.test.ts +1 -1
- package/src/tools/__tests__/grep.test.ts +36 -1
- package/src/tools/__tests__/ls.test.ts +1 -1
- package/src/tools/__tests__/read.test.ts +1 -1
- package/src/tools/__tests__/registry.test.ts +332 -0
- package/src/tools/__tests__/write_plan.test.ts +1 -1
- package/src/tools/codebase/ast/__tests__/integration.test.ts +452 -0
- package/src/tools/codebase/ast/__tests__/tree-sitter.test.ts +466 -0
- package/src/tools/codebase/ast/adapter.ts +44 -0
- package/src/tools/codebase/ast/tools.ts +322 -0
- package/src/tools/codebase/ast/tree-sitter-adapter.ts +468 -0
- package/src/tools/codebase/ast/tree-sitter-converters.ts +480 -0
- package/src/tools/codebase/ast/types.ts +102 -0
- package/src/tools/codebase/ast/wasm/tree-sitter-python.wasm +0 -0
- package/src/tools/codebase/ast/wasm/tree-sitter-tsx.wasm +0 -0
- package/src/tools/codebase/ast/wasm/tree-sitter-typescript.wasm +0 -0
- package/src/tools/codebase/ast/wasm/tree-sitter.wasm +0 -0
- package/src/tools/codebase/ast/wasm/web-tree-sitter.wasm +0 -0
- package/src/tools/{find.ts → codebase/find.ts} +4 -2
- package/src/tools/{glob.ts → codebase/glob.ts} +4 -2
- package/src/tools/{grep.ts → codebase/grep.ts} +61 -32
- package/src/tools/{ls.ts → codebase/ls.ts} +4 -2
- package/src/tools/{read.ts → codebase/read.ts} +5 -3
- package/src/tools/edit/diff-compute.ts +21 -0
- package/src/tools/edit/diff-render.ts +145 -0
- package/src/tools/edit/edit.ts +468 -0
- package/src/tools/edit/matcher.ts +70 -0
- package/src/tools/edit/parser.ts +131 -0
- package/src/tools/edit/types.ts +19 -0
- package/src/tools/{write_plan.ts → edit/write_plan.ts} +4 -2
- package/src/tools/execute/bash/constants.ts +93 -0
- package/src/tools/execute/bash/errors.ts +304 -0
- package/src/tools/execute/bash/execution.ts +211 -0
- package/src/tools/execute/bash/index.ts +131 -0
- package/src/tools/execute/bash/platform.ts +65 -0
- package/src/tools/execute/bash/security.ts +28 -0
- package/src/tools/execute/bash/validation.ts +78 -0
- package/src/tools/execute/git.ts +209 -0
- package/src/tools/execute/task_complete.ts +40 -0
- package/src/tools/install/clawhub.ts +222 -0
- package/src/tools/install/constants.ts +4 -0
- package/src/tools/install/install_skill.ts +150 -0
- package/src/tools/install/npm.ts +60 -0
- package/src/tools/install/skill-content.ts +108 -0
- package/src/tools/memory/delete_memory.ts +46 -0
- package/src/tools/memory/list_memory.ts +53 -0
- package/src/tools/memory/save_memory.ts +45 -0
- package/src/tools/registry.ts +121 -50
- package/src/tools/tree.ts +103 -0
- package/src/tools/types.ts +13 -0
- package/src/tools/{fetch.ts → web/fetch.ts} +4 -2
- package/src/tools/{search.ts → web/search.ts} +4 -2
- package/src/tui/commands.ts +135 -0
- package/src/tui/components/colors.ts +52 -0
- package/src/tui/components/header-bar.ts +88 -0
- package/src/tui/components/index.ts +8 -0
- package/src/tui/components/landing-screen.ts +67 -0
- package/src/tui/components/pixel-logo.ts +33 -0
- package/src/tui/components/plan-utils.ts +69 -0
- package/src/tui/components/plans-list.ts +55 -0
- package/src/tui/components/rich-footer.ts +146 -0
- package/src/tui/components/todo-panel.ts +95 -0
- package/src/tui/index.ts +110 -561
- package/src/tui/overlays.ts +203 -0
- package/src/tui/themes.ts +41 -0
- package/src/web/index.ts +66 -107
- package/src/web/public/app.js +5 -855
- package/src/web/public/confirm.js +70 -0
- package/src/web/public/index.html +121 -120
- package/src/web/public/input.js +107 -0
- package/src/web/public/messages.js +411 -0
- package/src/web/public/sidebar.js +82 -0
- package/src/web/public/state.js +72 -0
- package/src/web/public/style.css +247 -70
- package/src/web/public/utils.js +37 -0
- package/src/web/public/websocket.js +267 -0
- package/src/web/public/ws.js +19 -0
- package/src/web/session-bridge.ts +90 -12
- package/.claude/settings.local.json +0 -14
- package/.kilo/plans/1780064105789-mighty-pixel.md +0 -171
- package/.kilo/plans/1780293725888-quick-wizard.md +0 -62
- package/.lonny/plan-web-cwd-status.md +0 -38
- package/AGENT.md +0 -99
- package/src/tools/bash.ts +0 -39
- package/src/tools/edit.ts +0 -554
- package/src/tools/exec.ts +0 -348
- package/src/tools/git.ts +0 -76
- package/src/tools/install_skill.ts +0 -539
- package/src/tui/components.ts +0 -635
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ToolResult } from '../types.js';
|
|
2
|
+
/** Fetch skill info from ClawHub API */
|
|
3
|
+
export declare function fetchClawHubSkillInfo(slug: string): Promise<{
|
|
4
|
+
displayName: string;
|
|
5
|
+
summary: string;
|
|
6
|
+
latestVersion: string;
|
|
7
|
+
} | null>;
|
|
8
|
+
/** Download a ClawHub skill as a ZIP and extract its content */
|
|
9
|
+
export declare function downloadClawHubSkill(slug: string, version?: string): Promise<{
|
|
10
|
+
files: Map<string, string>;
|
|
11
|
+
} | null>;
|
|
12
|
+
/** Extract files from a ZIP buffer */
|
|
13
|
+
export declare function extractZipContent(buffer: Buffer): {
|
|
14
|
+
files: Map<string, string>;
|
|
15
|
+
};
|
|
16
|
+
/** Find the SKILL.md entry in the downloaded files (case-insensitive) */
|
|
17
|
+
export declare function findSkillMdInZip(files: Map<string, string>): string | null;
|
|
18
|
+
/** Normalize a ZIP file path, stripping common root directory */
|
|
19
|
+
export declare function normalizeZipPath(filePath: string, _slug: string): string;
|
|
20
|
+
/** Install a skill from ClawHub */
|
|
21
|
+
export declare function installFromClawHub(cwd: string, slug: string, version: string | undefined, info: {
|
|
22
|
+
displayName: string;
|
|
23
|
+
summary: string;
|
|
24
|
+
latestVersion: string;
|
|
25
|
+
}, input: Record<string, unknown>): Promise<ToolResult>;
|
|
26
|
+
//# sourceMappingURL=clawhub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clawhub.d.ts","sourceRoot":"","sources":["../../../src/tools/install/clawhub.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,wCAAwC;AACxC,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAmBjF;AAED,gEAAgE;AAChE,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBhD;AAED,sCAAsC;AACtC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAYhF;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAe1E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED,mCAAmC;AACnC,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EACrE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC,CA6GrB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
// @ts-expect-error - adm-zip has no types
|
|
4
|
+
import AdmZip from 'adm-zip';
|
|
5
|
+
import { fmtErr } from '../errors.js';
|
|
6
|
+
import { CLAWHUB_API_BASE, SKILLS_DIR } from './constants.js';
|
|
7
|
+
import { generateClawHubSkillContent, sanitizeSkillName } from './skill-content.js';
|
|
8
|
+
/** Fetch skill info from ClawHub API */
|
|
9
|
+
export async function fetchClawHubSkillInfo(slug) {
|
|
10
|
+
try {
|
|
11
|
+
const response = await fetch(`${CLAWHUB_API_BASE}/skills/${encodeURIComponent(slug)}`, {
|
|
12
|
+
headers: { Accept: 'application/json' },
|
|
13
|
+
});
|
|
14
|
+
if (!response.ok)
|
|
15
|
+
return null;
|
|
16
|
+
const data = (await response.json());
|
|
17
|
+
return {
|
|
18
|
+
displayName: data.skill?.displayName || slug,
|
|
19
|
+
summary: data.skill?.summary || '',
|
|
20
|
+
latestVersion: data.latestVersion?.version || 'latest',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Download a ClawHub skill as a ZIP and extract its content */
|
|
28
|
+
export async function downloadClawHubSkill(slug, version) {
|
|
29
|
+
try {
|
|
30
|
+
const versionPath = version ? `/${version}` : '';
|
|
31
|
+
const url = `${CLAWHUB_API_BASE}/download?slug=${encodeURIComponent(slug)}${version ? `&version=${encodeURIComponent(version)}` : ''}`;
|
|
32
|
+
const response = await fetch(url);
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
// Try alternative URL patterns
|
|
35
|
+
const altUrl = `${CLAWHUB_API_BASE}/download/${encodeURIComponent(slug)}${versionPath}`;
|
|
36
|
+
const altResponse = await fetch(altUrl);
|
|
37
|
+
if (!altResponse.ok)
|
|
38
|
+
return null;
|
|
39
|
+
const buffer = await altResponse.arrayBuffer();
|
|
40
|
+
return extractZipContent(Buffer.from(buffer));
|
|
41
|
+
}
|
|
42
|
+
const buffer = await response.arrayBuffer();
|
|
43
|
+
return extractZipContent(Buffer.from(buffer));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Extract files from a ZIP buffer */
|
|
50
|
+
export function extractZipContent(buffer) {
|
|
51
|
+
const zip = new AdmZip(buffer);
|
|
52
|
+
const entries = zip.getEntries();
|
|
53
|
+
const files = new Map();
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
if (!entry.isDirectory) {
|
|
56
|
+
files.set(entry.entryName, entry.getData().toString('utf-8'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { files };
|
|
60
|
+
}
|
|
61
|
+
/** Find the SKILL.md entry in the downloaded files (case-insensitive) */
|
|
62
|
+
export function findSkillMdInZip(files) {
|
|
63
|
+
for (const [filePath] of files) {
|
|
64
|
+
const normalized = filePath.replace(/\\/g, '/').toLowerCase();
|
|
65
|
+
if (normalized.endsWith('/skill.md')) {
|
|
66
|
+
return files.get(filePath) || null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Fallback: check root-level SKILL.md
|
|
70
|
+
for (const [filePath] of files) {
|
|
71
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
72
|
+
if (normalized.toLowerCase() === 'skill.md' || normalized.endsWith('/skill.md')) {
|
|
73
|
+
return files.get(filePath) || null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
/** Normalize a ZIP file path, stripping common root directory */
|
|
79
|
+
export function normalizeZipPath(filePath, _slug) {
|
|
80
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
81
|
+
// Strip leading directory that matches the slug or is a common root
|
|
82
|
+
const parts = normalized.split('/');
|
|
83
|
+
if (parts.length > 1) {
|
|
84
|
+
// Remove the first segment if it's a common root
|
|
85
|
+
// ZIPs from ClawHub often have a root folder like "repo-release-notes/"
|
|
86
|
+
return parts.slice(1).join('/');
|
|
87
|
+
}
|
|
88
|
+
return normalized;
|
|
89
|
+
}
|
|
90
|
+
/** Install a skill from ClawHub */
|
|
91
|
+
export async function installFromClawHub(cwd, slug, version, info, input) {
|
|
92
|
+
const versionToUse = version || info.latestVersion;
|
|
93
|
+
// Download the skill ZIP
|
|
94
|
+
const downloaded = await downloadClawHubSkill(slug, versionToUse);
|
|
95
|
+
if (!downloaded) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
output: '',
|
|
99
|
+
error: `Failed to download ClawHub skill "${slug}" (version ${versionToUse}).`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const skillsDir = path.resolve(cwd, SKILLS_DIR);
|
|
103
|
+
const skillName = sanitizeSkillName(slug);
|
|
104
|
+
const skillFilePath = path.join(skillsDir, `${skillName}.md`);
|
|
105
|
+
const skillDirPath = path.join(skillsDir, skillName);
|
|
106
|
+
// Find the SKILL.md in the ZIP
|
|
107
|
+
const skillMdEntry = findSkillMdInZip(downloaded.files);
|
|
108
|
+
// Also extract supporting files into a subdirectory
|
|
109
|
+
if (skillMdEntry) {
|
|
110
|
+
// Extract all files into skill subdirectory for supporting files
|
|
111
|
+
try {
|
|
112
|
+
fs.mkdirSync(skillDirPath, { recursive: true });
|
|
113
|
+
for (const [filePath, content] of downloaded.files) {
|
|
114
|
+
// Normalize the path: strip common root directory
|
|
115
|
+
const normalizedPath = normalizeZipPath(filePath, slug);
|
|
116
|
+
if (!normalizedPath || normalizedPath === 'SKILL.md')
|
|
117
|
+
continue; // SKILL.md goes to root
|
|
118
|
+
const fullPath = path.join(skillDirPath, normalizedPath);
|
|
119
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
120
|
+
fs.writeFileSync(fullPath, content, 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
// Non-critical: supporting files are optional
|
|
125
|
+
console.warn(`[install_skill] Warning: could not extract all supporting files: ${fmtErr(err)}`);
|
|
126
|
+
}
|
|
127
|
+
// Generate skill file (using the SKILL.md content from the ZIP)
|
|
128
|
+
const description = input.description || info.summary || slug;
|
|
129
|
+
const skillContent = generateClawHubSkillContent(slug, info.displayName, description, skillMdEntry);
|
|
130
|
+
try {
|
|
131
|
+
fs.mkdirSync(skillsDir, { recursive: true });
|
|
132
|
+
fs.writeFileSync(skillFilePath, skillContent, 'utf-8');
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
output: '',
|
|
138
|
+
error: `Failed to write skill file: ${fmtErr(err)}`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// No SKILL.md found in ZIP, generate a wrapper skill
|
|
144
|
+
const description = input.description || info.summary || slug;
|
|
145
|
+
// Collect all extracted content as a markdown reference
|
|
146
|
+
const filesList = Array.from(downloaded.files.keys())
|
|
147
|
+
.map(f => `- ${f}`)
|
|
148
|
+
.join('\n');
|
|
149
|
+
const combinedContent = `## Files in this skill\n\n${filesList}\n\n` +
|
|
150
|
+
Array.from(downloaded.files.entries())
|
|
151
|
+
.map(([name, content]) => `### ${name}\n\n\`\`\`\n${content.slice(0, 2000)}\n\`\`\``)
|
|
152
|
+
.join('\n\n');
|
|
153
|
+
const skillContent = generateClawHubSkillContent(slug, info.displayName, description, combinedContent);
|
|
154
|
+
try {
|
|
155
|
+
fs.mkdirSync(skillsDir, { recursive: true });
|
|
156
|
+
fs.writeFileSync(skillFilePath, skillContent, 'utf-8');
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
return {
|
|
160
|
+
success: false,
|
|
161
|
+
output: '',
|
|
162
|
+
error: `Failed to write skill file: ${fmtErr(err)}`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const relPath = path.relative(cwd, skillFilePath).replace(/\\/g, '/');
|
|
167
|
+
const supportRelPath = skillMdEntry ? path.relative(cwd, skillDirPath).replace(/\\/g, '/') : '';
|
|
168
|
+
let output = `Installed ClawHub skill "${slug}" (v${versionToUse}) and created skill file "${relPath}".`;
|
|
169
|
+
if (supportRelPath) {
|
|
170
|
+
output += `\nSupporting files extracted to "${supportRelPath}/".`;
|
|
171
|
+
}
|
|
172
|
+
output += `
|
|
173
|
+
|
|
174
|
+
The skill instructions will be loaded automatically on the next turn.
|
|
175
|
+
|
|
176
|
+
To verify: use \`read\` on "${relPath}" to see the skill content.`;
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
output,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=clawhub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clawhub.js","sourceRoot":"","sources":["../../../src/tools/install/clawhub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const SKILLS_DIR = ".lonny/skills";
|
|
2
|
+
export declare const NPM_REGISTRY_URL = "https://registry.npmjs.org";
|
|
3
|
+
export declare const CLAWHUB_API_BASE = "https://clawhub.ai/api/v1";
|
|
4
|
+
export declare const CLAWHUB_SITE = "https://clawhub.ai";
|
|
5
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/tools/install/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,kBAAkB,CAAA;AACzC,eAAO,MAAM,gBAAgB,+BAA+B,CAAA;AAC5D,eAAO,MAAM,gBAAgB,8BAA8B,CAAA;AAC3D,eAAO,MAAM,YAAY,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/tools/install/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAA;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAA;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAA;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install_skill.d.ts","sourceRoot":"","sources":["../../../src/tools/install/install_skill.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAA;AAMnD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA4IxD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { fmtErr } from '../errors.js';
|
|
4
|
+
import { fetchClawHubSkillInfo, installFromClawHub } from './clawhub.js';
|
|
5
|
+
import { SKILLS_DIR } from './constants.js';
|
|
6
|
+
import { fetchNpmPackageInfo, runNpmInstall } from './npm.js';
|
|
7
|
+
import { extractUsageGuide, generateSkillContent, sanitizeSkillName } from './skill-content.js';
|
|
8
|
+
export function createInstallSkillTool(cwd) {
|
|
9
|
+
return {
|
|
10
|
+
definition: {
|
|
11
|
+
name: 'install_skill',
|
|
12
|
+
category: 'Install',
|
|
13
|
+
group: 'Skill',
|
|
14
|
+
description: `Install an npm package or ClawHub skill. This tool:
|
|
15
|
+
1. For npm packages: fetches info from npm registry, runs \`npm install\`, creates a skill file
|
|
16
|
+
2. For ClawHub skills: fetches skill metadata from clawhub.ai, downloads the skill bundle, writes SKILL.md
|
|
17
|
+
|
|
18
|
+
After installation, the skill will be automatically loaded on the next conversation turn (the system prompt includes active skills).
|
|
19
|
+
|
|
20
|
+
Use this when you need to use a third-party npm package or install a skill from ClawHub (clawhub.ai).
|
|
21
|
+
|
|
22
|
+
ClawHub skills: pass the skill slug (e.g. \`repo-release-notes\`) as package_name. The tool auto-detects ClawHub skills.`,
|
|
23
|
+
parameters: {
|
|
24
|
+
package_name: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'The npm package name or ClawHub skill slug to install (e.g. "dayjs", "cn-time-parser", "@scope/package", or ClawHub slug like "repo-release-notes")',
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
description: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Optional description of what the package/skill does. If not provided, it will be fetched from the npm registry or ClawHub.',
|
|
32
|
+
required: false,
|
|
33
|
+
},
|
|
34
|
+
usage_guide: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Optional custom usage guide for the AI. If not provided, it will be auto-generated from the readme or ClawHub SKILL.md. Provide this if the auto-generated guide is insufficient.',
|
|
37
|
+
required: false,
|
|
38
|
+
},
|
|
39
|
+
clawhub: {
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
description: "Force ClawHub mode. If true, treats package_name as a ClawHub skill slug. Auto-detected if the package doesn't exist on npm.",
|
|
42
|
+
required: false,
|
|
43
|
+
},
|
|
44
|
+
version: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Optional version for ClawHub skill install (defaults to latest).',
|
|
47
|
+
required: false,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
async execute(input) {
|
|
52
|
+
// ── Auto-correction: if input is a string, wrap it ────────────────
|
|
53
|
+
if (typeof input === 'string') {
|
|
54
|
+
input = { package_name: input };
|
|
55
|
+
}
|
|
56
|
+
const packageName = input.package_name;
|
|
57
|
+
if (!packageName || typeof packageName !== 'string') {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
output: '',
|
|
61
|
+
error: 'package_name is required (string)',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const forceClawHub = input.clawhub === true;
|
|
65
|
+
const version = input.version;
|
|
66
|
+
// ── Auto-detect: try npm first, fall back to ClawHub ──────────────
|
|
67
|
+
const npmInfo = forceClawHub ? null : await fetchNpmPackageInfo(packageName);
|
|
68
|
+
// If npm lookup failed and not forced, try ClawHub
|
|
69
|
+
if (!npmInfo && !forceClawHub) {
|
|
70
|
+
const clawhubInfo = await fetchClawHubSkillInfo(packageName);
|
|
71
|
+
if (clawhubInfo) {
|
|
72
|
+
// It's a ClawHub skill — install from ClawHub
|
|
73
|
+
return installFromClawHub(cwd, packageName, version, clawhubInfo, input);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
output: '',
|
|
78
|
+
error: `"${packageName}" was not found on npm registry nor on ClawHub. Check the name and try again.`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// If forced ClawHub mode
|
|
82
|
+
if (forceClawHub) {
|
|
83
|
+
const clawhubInfo = await fetchClawHubSkillInfo(packageName);
|
|
84
|
+
if (!clawhubInfo) {
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
output: '',
|
|
88
|
+
error: `"${packageName}" was not found on ClawHub.`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return installFromClawHub(cwd, packageName, version, clawhubInfo, input);
|
|
92
|
+
}
|
|
93
|
+
// ── npm package install path ──────────────────────────────────────
|
|
94
|
+
const description = input.description || npmInfo?.description || packageName;
|
|
95
|
+
const readme = npmInfo?.readme || '';
|
|
96
|
+
const installError = await runNpmInstall(cwd, packageName);
|
|
97
|
+
if (installError) {
|
|
98
|
+
return {
|
|
99
|
+
success: false,
|
|
100
|
+
output: '',
|
|
101
|
+
error: `npm install failed: ${installError}`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const usageGuide = input.usage_guide || (readme ? extractUsageGuide(readme) : '');
|
|
105
|
+
const skillContent = generateSkillContent(packageName, description, usageGuide);
|
|
106
|
+
const skillsDir = path.resolve(cwd, SKILLS_DIR);
|
|
107
|
+
const skillName = sanitizeSkillName(packageName);
|
|
108
|
+
const skillFilePath = path.join(skillsDir, `${skillName}.md`);
|
|
109
|
+
try {
|
|
110
|
+
fs.mkdirSync(skillsDir, { recursive: true });
|
|
111
|
+
fs.writeFileSync(skillFilePath, skillContent, 'utf-8');
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
output: '',
|
|
117
|
+
error: `Failed to write skill file: ${fmtErr(err)}`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const relPath = path.relative(cwd, skillFilePath).replace(/\\/g, '/');
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
output: `Installed npm package "${packageName}" and created skill "${relPath}".
|
|
124
|
+
|
|
125
|
+
The package is now a project dependency. The skill file contains usage instructions for the AI and will be loaded automatically on the next turn.
|
|
126
|
+
|
|
127
|
+
To verify: use \`read\` on "${relPath}" to see the skill content.`,
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=install_skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install_skill.js","sourceRoot":"","sources":["../../../src/tools/install/install_skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Fetch package info from npm registry */
|
|
2
|
+
export declare function fetchNpmPackageInfo(packageName: string): Promise<{
|
|
3
|
+
description: string;
|
|
4
|
+
readme: string;
|
|
5
|
+
} | null>;
|
|
6
|
+
/** Run npm install in the project directory */
|
|
7
|
+
export declare function runNpmInstall(cwd: string, packageName: string): Promise<string | null>;
|
|
8
|
+
//# sourceMappingURL=npm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../../src/tools/install/npm.ts"],"names":[],"mappings":"AAGA,2CAA2C;AAC3C,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBzD;AAED,+CAA+C;AAC/C,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgC5F"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as cp from 'node:child_process';
|
|
2
|
+
import { NPM_REGISTRY_URL } from './constants.js';
|
|
3
|
+
/** Fetch package info from npm registry */
|
|
4
|
+
export async function fetchNpmPackageInfo(packageName) {
|
|
5
|
+
try {
|
|
6
|
+
const response = await fetch(`${NPM_REGISTRY_URL}/${encodeURIComponent(packageName)}`, {
|
|
7
|
+
headers: { Accept: 'application/json' },
|
|
8
|
+
});
|
|
9
|
+
if (!response.ok)
|
|
10
|
+
return null;
|
|
11
|
+
const data = (await response.json());
|
|
12
|
+
return {
|
|
13
|
+
description: data.description || '',
|
|
14
|
+
readme: data.readme || '',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Run npm install in the project directory */
|
|
22
|
+
export async function runNpmInstall(cwd, packageName) {
|
|
23
|
+
return new Promise(resolve => {
|
|
24
|
+
const child = cp.spawn('npm', ['install', packageName], {
|
|
25
|
+
cwd,
|
|
26
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
27
|
+
shell: process.platform === 'win32',
|
|
28
|
+
});
|
|
29
|
+
let stderr = '';
|
|
30
|
+
child.stderr?.on('data', (data) => {
|
|
31
|
+
stderr += data.toString();
|
|
32
|
+
});
|
|
33
|
+
const timeout = setTimeout(() => {
|
|
34
|
+
child.kill();
|
|
35
|
+
resolve(`Timed out after 60s. ${stderr.slice(0, 500)}`);
|
|
36
|
+
}, 60_000);
|
|
37
|
+
child.on('close', code => {
|
|
38
|
+
clearTimeout(timeout);
|
|
39
|
+
if (code === 0) {
|
|
40
|
+
resolve(null); // success
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
resolve(stderr.slice(0, 500) || `npm install exited with code ${code}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
child.on('error', err => {
|
|
47
|
+
clearTimeout(timeout);
|
|
48
|
+
resolve(`Failed to start npm install: ${err.message}`);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=npm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../../src/tools/install/npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAAE;YACrF,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QAE7B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAA;QACD,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;SAC1B,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,WAAmB;IAClE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;YACtD,GAAG;YACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,KAAK,CAAC,IAAI,EAAE,CAAA;YACZ,OAAO,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACzD,CAAC,EAAE,MAAM,CAAC,CAAA;QAEV,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YACvB,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAA,CAAC,UAAU;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,gCAAgC,IAAI,EAAE,CAAC,CAAA;YACzE,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YACtB,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Sanitize a package name to a valid skill name (lowercase, digits, hyphens) */
|
|
2
|
+
export declare function sanitizeSkillName(name: string): string;
|
|
3
|
+
/** Generate a usage guide snippet from the readme */
|
|
4
|
+
export declare function extractUsageGuide(readme: string): string;
|
|
5
|
+
/** Generate the skill markdown content (npm package) */
|
|
6
|
+
export declare function generateSkillContent(packageName: string, description: string, usageGuide: string): string;
|
|
7
|
+
/** Generate the skill markdown content (ClawHub skill) */
|
|
8
|
+
export declare function generateClawHubSkillContent(slug: string, displayName: string, summary: string, clawhubContent: string): string;
|
|
9
|
+
//# sourceMappingURL=skill-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-content.d.ts","sourceRoot":"","sources":["../../../src/tools/install/skill-content.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAqCR;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,MAAM,CA4BR"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { CLAWHUB_SITE } from './constants.js';
|
|
2
|
+
/** Sanitize a package name to a valid skill name (lowercase, digits, hyphens) */
|
|
3
|
+
export function sanitizeSkillName(name) {
|
|
4
|
+
return name
|
|
5
|
+
.toLowerCase()
|
|
6
|
+
.replace(/@/g, '')
|
|
7
|
+
.replace(/\//g, '-')
|
|
8
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
9
|
+
.replace(/-+/g, '-')
|
|
10
|
+
.replace(/^-|-$/g, '');
|
|
11
|
+
}
|
|
12
|
+
/** Generate a usage guide snippet from the readme */
|
|
13
|
+
export function extractUsageGuide(readme) {
|
|
14
|
+
// Try to extract code examples from the readme
|
|
15
|
+
const codeBlocks = [];
|
|
16
|
+
const blockRegex = /```(?:js|javascript|ts|typescript|bash)\n([\s\S]*?)```/g;
|
|
17
|
+
let match = blockRegex.exec(readme);
|
|
18
|
+
while (match !== null) {
|
|
19
|
+
const block = match[1].trim();
|
|
20
|
+
if (block.length > 0 && block.length < 1000) {
|
|
21
|
+
codeBlocks.push(block);
|
|
22
|
+
}
|
|
23
|
+
match = blockRegex.exec(readme);
|
|
24
|
+
}
|
|
25
|
+
return codeBlocks.slice(0, 3).join('\n\n');
|
|
26
|
+
}
|
|
27
|
+
/** Generate the skill markdown content (npm package) */
|
|
28
|
+
export function generateSkillContent(packageName, description, usageGuide) {
|
|
29
|
+
const installCmd = `npm install ${packageName}`;
|
|
30
|
+
let content = `---
|
|
31
|
+
name: ${sanitizeSkillName(packageName)}
|
|
32
|
+
description: ${description}
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
# ${packageName}
|
|
36
|
+
|
|
37
|
+
${description}
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
This package is already installed in the project via \`${installCmd}\`.
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
You can import and use this package in your code:
|
|
46
|
+
|
|
47
|
+
\`\`\`typescript
|
|
48
|
+
import ${packageName.replace(/@/, '').replace(/[/-]/g, '_')} from '${packageName}'
|
|
49
|
+
\`\`\`
|
|
50
|
+
`;
|
|
51
|
+
if (usageGuide) {
|
|
52
|
+
content += `\n## Examples\n\n${usageGuide}\n`;
|
|
53
|
+
}
|
|
54
|
+
content += `
|
|
55
|
+
## Notes
|
|
56
|
+
|
|
57
|
+
- This skill was automatically installed. The package is available as a project dependency.
|
|
58
|
+
- Refer to the package's npm page or repository for full documentation.
|
|
59
|
+
`;
|
|
60
|
+
return content;
|
|
61
|
+
}
|
|
62
|
+
/** Generate the skill markdown content (ClawHub skill) */
|
|
63
|
+
export function generateClawHubSkillContent(slug, displayName, summary, clawhubContent) {
|
|
64
|
+
// If the ZIP contains a SKILL.md, use it directly
|
|
65
|
+
// Otherwise, generate a wrapper skill file
|
|
66
|
+
let content = `---
|
|
67
|
+
name: ${sanitizeSkillName(slug)}
|
|
68
|
+
description: ${summary || displayName}
|
|
69
|
+
clawhub: ${slug}
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
# ${displayName}
|
|
73
|
+
|
|
74
|
+
${summary || `ClawHub skill: ${slug}`}
|
|
75
|
+
|
|
76
|
+
`;
|
|
77
|
+
if (clawhubContent) {
|
|
78
|
+
content += `${clawhubContent}\n`;
|
|
79
|
+
}
|
|
80
|
+
content += `
|
|
81
|
+
## Notes
|
|
82
|
+
|
|
83
|
+
- This skill was installed from [ClawHub](${CLAWHUB_SITE}/${slug}).
|
|
84
|
+
- Source: ${CLAWHUB_SITE}/${slug}
|
|
85
|
+
- The skill instructions are loaded automatically on the next turn.
|
|
86
|
+
`;
|
|
87
|
+
return content;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=skill-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-content.js","sourceRoot":"","sources":["../../../src/tools/install/skill-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,+CAA+C;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAG,yDAAyD,CAAA;IAC5E,IAAI,KAAK,GAA2B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3D,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QACD,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC5C,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,WAAmB,EACnB,UAAkB;IAElB,MAAM,UAAU,GAAG,eAAe,WAAW,EAAE,CAAA;IAE/C,IAAI,OAAO,GAAG;QACR,iBAAiB,CAAC,WAAW,CAAC;eACvB,WAAW;;;IAGtB,WAAW;;EAEb,WAAW;;;;yDAI4C,UAAU;;;;;;;SAO1D,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,WAAW;;CAE/E,CAAA;IAEC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,oBAAoB,UAAU,IAAI,CAAA;IAC/C,CAAC;IAED,OAAO,IAAI;;;;;CAKZ,CAAA;IAEC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,2BAA2B,CACzC,IAAY,EACZ,WAAmB,EACnB,OAAe,EACf,cAAsB;IAEtB,kDAAkD;IAClD,2CAA2C;IAC3C,IAAI,OAAO,GAAG;QACR,iBAAiB,CAAC,IAAI,CAAC;eAChB,OAAO,IAAI,WAAW;WAC1B,IAAI;;;IAGX,WAAW;;EAEb,OAAO,IAAI,kBAAkB,IAAI,EAAE;;CAEpC,CAAA;IAEC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,IAAI,GAAG,cAAc,IAAI,CAAA;IAClC,CAAC;IAED,OAAO,IAAI;;;4CAG+B,YAAY,IAAI,IAAI;YACpD,YAAY,IAAI,IAAI;;CAE/B,CAAA;IAEC,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install_skill.d.ts","sourceRoot":"","sources":["../../src/tools/install_skill.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAA;AAqPlD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"install_skill.d.ts","sourceRoot":"","sources":["../../src/tools/install_skill.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAA;AAqPlD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA4IxD"}
|
|
@@ -205,6 +205,8 @@ export function createInstallSkillTool(cwd) {
|
|
|
205
205
|
return {
|
|
206
206
|
definition: {
|
|
207
207
|
name: 'install_skill',
|
|
208
|
+
category: 'Install',
|
|
209
|
+
group: 'Skill',
|
|
208
210
|
description: `Install an npm package or ClawHub skill. This tool:
|
|
209
211
|
1. For npm packages: fetches info from npm registry, runs \`npm install\`, creates a skill file
|
|
210
212
|
2. For ClawHub skills: fetches skill metadata from clawhub.ai, downloads the skill bundle, writes SKILL.md
|