@nogataka/smart-edit 0.1.0 → 1.0.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/LICENSE +0 -1
- package/README.md +143 -66
- package/dist/cli.js +2 -2
- package/dist/devtools/generate_prompt_factory.js +5 -5
- package/dist/index.d.ts +33 -34
- package/dist/index.js +33 -34
- package/dist/interprompt/multilang_prompt.js +2 -2
- package/dist/interprompt/prompt_factory.js +2 -2
- package/dist/interprompt/util/class_decorators.d.ts +1 -1
- package/dist/interprompt/util/class_decorators.js +1 -1
- package/dist/{serena → smart-edit}/agent.d.ts +20 -20
- package/dist/{serena → smart-edit}/agent.js +43 -43
- package/dist/{serena → smart-edit}/analytics.d.ts +1 -1
- package/dist/{serena → smart-edit}/analytics.js +3 -3
- package/dist/smart-edit/cli.d.ts +9 -0
- package/dist/{serena → smart-edit}/cli.js +49 -99
- package/dist/{serena → smart-edit}/code_editor.d.ts +7 -7
- package/dist/{serena → smart-edit}/config/context_mode.d.ts +13 -13
- package/dist/{serena → smart-edit}/config/context_mode.js +12 -12
- package/dist/{serena/config/serena_config.d.ts → smart-edit/config/smart_edit_config.d.ts} +14 -14
- package/dist/{serena/config/serena_config.js → smart-edit/config/smart_edit_config.js} +31 -31
- package/dist/smart-edit/constants.d.ts +18 -0
- package/dist/smart-edit/constants.js +27 -0
- package/dist/{serena → smart-edit}/dashboard.d.ts +3 -3
- package/dist/{serena → smart-edit}/dashboard.js +10 -10
- package/dist/{serena → smart-edit}/gui_log_viewer.js +6 -6
- package/dist/{serena → smart-edit}/mcp.d.ts +40 -40
- package/dist/{serena → smart-edit}/mcp.js +38 -38
- package/dist/{serena → smart-edit}/project.d.ts +7 -7
- package/dist/{serena → smart-edit}/project.js +18 -18
- package/dist/{serena → smart-edit}/prompt_factory.d.ts +3 -3
- package/dist/{serena → smart-edit}/prompt_factory.js +1 -1
- package/dist/{serena → smart-edit}/resources/config/contexts/codex.yml +2 -2
- package/dist/{serena → smart-edit}/resources/config/contexts/context.template.yml +1 -1
- package/dist/{serena → smart-edit}/resources/config/contexts/ide-assistant.yml +2 -2
- package/dist/{serena → smart-edit}/resources/config/modes/mode.template.yml +1 -1
- package/dist/{serena → smart-edit}/resources/config/prompt_templates/simple_tool_outputs.yml +1 -1
- package/dist/smart-edit/resources/dashboard/dashboard.js +13 -0
- package/dist/smart-edit/resources/dashboard/index.css +1 -0
- package/dist/smart-edit/resources/dashboard/index.html +13 -0
- package/dist/{serena → smart-edit}/resources/project.template.yml +6 -6
- package/dist/{serena/resources/serena_config.template.yml → smart-edit/resources/smart_edit_config.template.yml} +14 -14
- package/dist/{serena → smart-edit}/symbol.d.ts +7 -7
- package/dist/{serena → smart-edit}/symbol.js +2 -2
- package/dist/{serena → smart-edit}/text_utils.js +2 -2
- package/dist/{serena → smart-edit}/tools/config_tools.d.ts +1 -1
- package/dist/{serena → smart-edit}/tools/config_tools.js +6 -6
- package/dist/{serena → smart-edit}/tools/memory_tools.d.ts +4 -4
- package/dist/{serena → smart-edit}/tools/memory_tools.js +5 -5
- package/dist/{serena → smart-edit}/tools/tools_base.d.ts +15 -15
- package/dist/{serena → smart-edit}/tools/tools_base.js +7 -7
- package/dist/{serena → smart-edit}/util/exception.d.ts +2 -2
- package/dist/{serena → smart-edit}/util/exception.js +2 -2
- package/dist/{serena → smart-edit}/util/file_system.js +3 -3
- package/dist/{serena → smart-edit}/util/git.js +3 -3
- package/dist/{serena → smart-edit}/util/inspection.d.ts +3 -3
- package/dist/{serena → smart-edit}/util/inspection.js +3 -3
- package/dist/{serena → smart-edit}/util/logging.d.ts +6 -6
- package/dist/{serena → smart-edit}/util/logging.js +7 -7
- package/dist/{serena → smart-edit}/util/shell.js +1 -1
- package/dist/smart-edit/version.d.ts +1 -0
- package/dist/{serena → smart-edit}/version.js +3 -3
- package/dist/{solidlsp → smart-lsp}/language_servers/autoload.js +1 -1
- package/dist/smart-lsp/language_servers/bash_language_server.d.ts +10 -0
- package/dist/{solidlsp → smart-lsp}/language_servers/bash_language_server.js +8 -8
- package/dist/{solidlsp → smart-lsp}/language_servers/clangd_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/clangd_language_server.js +9 -9
- package/dist/{solidlsp → smart-lsp}/language_servers/clojure_lsp.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/clojure_lsp.js +9 -9
- package/dist/{solidlsp → smart-lsp}/language_servers/common.d.ts +2 -2
- package/dist/{solidlsp → smart-lsp}/language_servers/common.js +1 -1
- package/dist/{solidlsp → smart-lsp}/language_servers/csharp_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/csharp_language_server.js +12 -12
- package/dist/smart-lsp/language_servers/dart_language_server.d.ts +10 -0
- package/dist/{solidlsp → smart-lsp}/language_servers/dart_language_server.js +13 -13
- package/dist/{solidlsp → smart-lsp}/language_servers/eclipse_jdtls.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/eclipse_jdtls.js +12 -12
- package/dist/{solidlsp → smart-lsp}/language_servers/erlang_language_server.d.ts +3 -3
- package/dist/{solidlsp → smart-lsp}/language_servers/erlang_language_server.js +6 -6
- package/dist/{solidlsp → smart-lsp}/language_servers/gopls.d.ts +3 -3
- package/dist/{solidlsp → smart-lsp}/language_servers/gopls.js +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/intelephense.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/intelephense.js +11 -11
- package/dist/{solidlsp → smart-lsp}/language_servers/jedi_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/jedi_server.js +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/kotlin_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/kotlin_language_server.js +9 -9
- package/dist/{solidlsp → smart-lsp}/language_servers/lua_ls.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/lua_ls.js +10 -10
- package/dist/{solidlsp → smart-lsp}/language_servers/nixd_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/nixd_language_server.js +7 -7
- package/dist/{solidlsp → smart-lsp}/language_servers/pyright_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/pyright_server.js +3 -3
- package/dist/{solidlsp → smart-lsp}/language_servers/r_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/r_language_server.js +5 -5
- package/dist/smart-lsp/language_servers/ruby_common.d.ts +10 -0
- package/dist/{solidlsp → smart-lsp}/language_servers/ruby_common.js +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/ruby_lsp.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/ruby_lsp.js +10 -10
- package/dist/{solidlsp → smart-lsp}/language_servers/rust_analyzer.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/rust_analyzer.js +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/solargraph.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/solargraph.js +10 -10
- package/dist/{solidlsp → smart-lsp}/language_servers/sourcekit_lsp.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/sourcekit_lsp.js +7 -7
- package/dist/{solidlsp → smart-lsp}/language_servers/terraform_ls.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/terraform_ls.js +14 -14
- package/dist/{solidlsp → smart-lsp}/language_servers/typescript_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/typescript_language_server.js +11 -11
- package/dist/{solidlsp → smart-lsp}/language_servers/vts_language_server.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/vts_language_server.js +10 -10
- package/dist/{solidlsp → smart-lsp}/language_servers/zls.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/language_servers/zls.js +6 -6
- package/dist/{solidlsp → smart-lsp}/ls.d.ts +25 -25
- package/dist/{solidlsp → smart-lsp}/ls.js +19 -19
- package/dist/{solidlsp → smart-lsp}/ls_config.d.ts +0 -5
- package/dist/{solidlsp → smart-lsp}/ls_config.js +0 -5
- package/dist/{solidlsp → smart-lsp}/ls_exceptions.d.ts +1 -1
- package/dist/{solidlsp → smart-lsp}/ls_exceptions.js +2 -2
- package/dist/{solidlsp → smart-lsp}/ls_handler.d.ts +7 -7
- package/dist/{solidlsp → smart-lsp}/ls_handler.js +12 -12
- package/dist/{solidlsp → smart-lsp}/ls_request.d.ts +4 -4
- package/dist/{solidlsp → smart-lsp}/ls_request.js +3 -3
- package/package.json +17 -3
- package/dist/serena/agno.d.ts +0 -111
- package/dist/serena/agno.js +0 -278
- package/dist/serena/cli.d.ts +0 -9
- package/dist/serena/constants.d.ts +0 -18
- package/dist/serena/constants.js +0 -27
- package/dist/serena/resources/dashboard/dashboard.js +0 -816
- package/dist/serena/resources/dashboard/index.html +0 -312
- package/dist/serena/resources/dashboard/jquery.min.js +0 -3
- package/dist/serena/version.d.ts +0 -1
- package/dist/solidlsp/language_servers/bash_language_server.d.ts +0 -10
- package/dist/solidlsp/language_servers/dart_language_server.d.ts +0 -10
- package/dist/solidlsp/language_servers/ruby_common.d.ts +0 -10
- /package/dist/{serena → smart-edit}/code_editor.js +0 -0
- /package/dist/{serena → smart-edit}/generated/generated_prompt_factory.d.ts +0 -0
- /package/dist/{serena → smart-edit}/generated/generated_prompt_factory.js +0 -0
- /package/dist/{serena → smart-edit}/gui_log_viewer.d.ts +0 -0
- /package/dist/{serena → smart-edit}/resources/config/contexts/agent.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/contexts/chatgpt.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/contexts/desktop-app.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/contexts/oaicompat-agent.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/internal_modes/jetbrains.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/modes/editing.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/modes/interactive.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/modes/no-onboarding.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/modes/onboarding.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/modes/one-shot.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/modes/planning.yml +0 -0
- /package/dist/{serena → smart-edit}/resources/config/prompt_templates/system_prompt.yml +0 -0
- /package/dist/{serena/resources/dashboard/serena-icon-16.svg → smart-edit/resources/dashboard/smart-edit-icon-16.svg} +0 -0
- /package/dist/{serena/resources/dashboard/serena-icon-32.svg → smart-edit/resources/dashboard/smart-edit-icon-32.svg} +0 -0
- /package/dist/{serena/resources/dashboard/serena-icon-48.svg → smart-edit/resources/dashboard/smart-edit-icon-48.svg} +0 -0
- /package/dist/{serena/resources/dashboard/serena-logs-dark-mode.svg → smart-edit/resources/dashboard/smart-edit-logs-dark-mode.svg} +0 -0
- /package/dist/{serena/resources/dashboard/serena-logs.svg → smart-edit/resources/dashboard/smart-edit-logs.svg} +0 -0
- /package/dist/{serena → smart-edit}/text_utils.d.ts +0 -0
- /package/dist/{serena → smart-edit}/tools/cmd_tools.d.ts +0 -0
- /package/dist/{serena → smart-edit}/tools/cmd_tools.js +0 -0
- /package/dist/{serena → smart-edit}/tools/file_tools.d.ts +0 -0
- /package/dist/{serena → smart-edit}/tools/file_tools.js +0 -0
- /package/dist/{serena → smart-edit}/tools/index.d.ts +0 -0
- /package/dist/{serena → smart-edit}/tools/index.js +0 -0
- /package/dist/{serena → smart-edit}/tools/symbol_tools.d.ts +0 -0
- /package/dist/{serena → smart-edit}/tools/symbol_tools.js +0 -0
- /package/dist/{serena → smart-edit}/tools/workflow_tools.d.ts +0 -0
- /package/dist/{serena → smart-edit}/tools/workflow_tools.js +0 -0
- /package/dist/{serena → smart-edit}/util/class_decorators.d.ts +0 -0
- /package/dist/{serena → smart-edit}/util/class_decorators.js +0 -0
- /package/dist/{serena → smart-edit}/util/file_system.d.ts +0 -0
- /package/dist/{serena → smart-edit}/util/general.d.ts +0 -0
- /package/dist/{serena → smart-edit}/util/general.js +0 -0
- /package/dist/{serena → smart-edit}/util/git.d.ts +0 -0
- /package/dist/{serena → smart-edit}/util/shell.d.ts +0 -0
- /package/dist/{serena → smart-edit}/util/thread.d.ts +0 -0
- /package/dist/{serena → smart-edit}/util/thread.js +0 -0
- /package/dist/{solidlsp → smart-lsp}/language_servers/autoload.d.ts +0 -0
- /package/dist/{solidlsp → smart-lsp}/ls_types.d.ts +0 -0
- /package/dist/{solidlsp → smart-lsp}/ls_types.js +0 -0
- /package/dist/{solidlsp → smart-lsp}/lsp_protocol_handler/server.d.ts +0 -0
- /package/dist/{solidlsp → smart-lsp}/lsp_protocol_handler/server.js +0 -0
- /package/dist/{solidlsp → smart-lsp}/util/subprocess_util.d.ts +0 -0
- /package/dist/{solidlsp → smart-lsp}/util/subprocess_util.js +0 -0
- /package/dist/{solidlsp → smart-lsp}/util/zip.d.ts +0 -0
- /package/dist/{solidlsp → smart-lsp}/util/zip.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg-primary: #f2f2f2;--bg-secondary: #ffffff;--text-primary: #1a1a1a;--text-secondary: #3d3d3d;--text-muted: #777;--border-color: #cfcfcf;--btn-primary: #2b2b2b;--btn-hover: #1e1e1e;--btn-disabled: #9c9c9c;--btn-text: #f5f5f5;--shadow: 0 2px 4px rgba(0, 0, 0, .12);--tool-highlight: #e5e5e5;--tool-highlight-text: #1a1a1a;--log-debug: #888;--log-info: #1a1a1a;--log-warning: #454545;--log-error: #111111;--stats-header: #ebebeb;--sidebar-width: 240px;--sidebar-width-collapsed: 64px;--topbar-height: 56px;--content-padding: 24px;--card-bg: var(--bg-secondary);--card-border-radius: 12px;--card-shadow: 0 2px 8px rgba(0, 0, 0, .08);--card-shadow-hover: 0 4px 16px rgba(0, 0, 0, .12);--card-padding: 20px;--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 16px;--spacing-lg: 24px;--spacing-xl: 32px;--font-size-xs: 11px;--font-size-sm: 13px;--font-size-base: 14px;--font-size-lg: 16px;--font-size-xl: 20px;--font-size-2xl: 24px;--status-success: #22c55e;--status-warning: #f59e0b;--status-error: #ef4444;--status-info: #3b82f6;--input-bg: var(--bg-primary);--input-border: var(--border-color);--input-focus-border: #3b82f6;--input-focus-ring: rgba(59, 130, 246, .3);--nav-item-hover: rgba(0, 0, 0, .04);--nav-item-active: rgba(59, 130, 246, .1);--nav-item-active-border: #3b82f6;--transition-fast: .15s ease;--transition-normal: .2s ease;--transition-slow: .3s ease}[data-theme=dark]{--bg-primary: #121212;--bg-secondary: #1e1e1e;--text-primary: #f1f1f1;--text-secondary: #d0d0d0;--text-muted: #9a9a9a;--border-color: #2c2c2c;--btn-primary: #ededed;--btn-hover: #d6d6d6;--btn-disabled: #4a4a4a;--btn-text: #111111;--shadow: 0 2px 4px rgba(0, 0, 0, .4);--tool-highlight: #2a2a2a;--tool-highlight-text: #f1f1f1;--log-debug: #a0a0a0;--log-info: #f1f1f1;--log-warning: #c7c7c7;--log-error: #ffffff;--stats-header: #262626;--card-bg: var(--bg-secondary);--card-shadow: 0 2px 8px rgba(0, 0, 0, .3);--card-shadow-hover: 0 4px 16px rgba(0, 0, 0, .4);--input-bg: #1a1a1a;--nav-item-hover: rgba(255, 255, 255, .04);--nav-item-active: rgba(59, 130, 246, .15)}*{box-sizing:border-box}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji";margin:0;padding:0;background-color:var(--bg-primary);color:var(--text-primary);transition:background-color .3s ease,color .3s ease;overflow:hidden;height:100vh}#root{height:100%}.header{text-align:center;margin-bottom:20px;font-size:1.5rem;font-weight:700}.log-container{background-color:var(--bg-primary);border:1px solid var(--border-color);border-radius:8px;height:100%;min-height:400px;overflow-y:auto;overflow-x:auto;padding:var(--spacing-md);white-space:pre-wrap;font-size:12px;line-height:1.5;color:var(--text-primary);font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;transition:background-color .3s ease,border-color .3s ease,color .3s ease}.log-card{height:calc(100vh - var(--topbar-height) - var(--content-padding) * 2 - var(--spacing-md))}.controls{display:flex;align-items:center;gap:var(--spacing-sm);flex-wrap:wrap}.btn{background-color:var(--btn-primary);color:var(--btn-text);border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .3s ease}.btn:hover{background-color:var(--btn-hover)}.btn:disabled{background-color:var(--btn-disabled);color:var(--text-muted);cursor:not-allowed}.theme-toggle{display:flex;align-items:center;gap:5px;background-color:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;padding:6px 12px;cursor:pointer;transition:background-color .3s ease,border-color .3s ease}.theme-toggle:hover{background-color:var(--border-color)}.theme-toggle .icon{font-size:16px}.log-debug{color:var(--log-debug)}.log-info{color:var(--log-info)}.log-warning{color:var(--log-warning);font-weight:600}.log-error{color:var(--log-error);font-weight:700}.log-default{color:var(--log-info)}.tool-name{background-color:var(--tool-highlight);color:var(--tool-highlight-text);font-weight:700;padding:0 2px;border-radius:2px}.loading{text-align:center;color:var(--text-muted);font-style:italic}.error-message{color:var(--log-error);text-align:center;margin:10px 0}.charts-container{display:flex;flex-wrap:wrap;gap:15px;justify-content:space-between;max-width:1400px;margin:0 auto}.chart-group{flex:1;min-width:280px;max-width:320px;text-align:center}.chart-wide{flex:0 0 100%;min-width:100%;margin-top:10px}.chart-group h3{margin:0 0 10px;color:var(--text-secondary)}.stats-summary{margin:0 auto;border-collapse:collapse;background:var(--bg-secondary);border-radius:5px;overflow:hidden;box-shadow:var(--shadow);transition:background-color .3s ease,box-shadow .3s ease}.stats-summary th,.stats-summary td{padding:10px 20px;text-align:left;border-bottom:1px solid var(--border-color);color:var(--text-primary);transition:border-color .3s ease,color .3s ease}.stats-summary th{background-color:var(--stats-header);font-weight:700;transition:background-color .3s ease}.stats-summary tr:last-child td{border-bottom:none}@media(max-width:768px){.charts-container{flex-direction:column}.chart-group,.chart-wide{min-width:auto;max-width:none}.controls{flex-direction:column;gap:5px}}.main-layout{display:flex;height:100vh;overflow:hidden}.sidebar{width:var(--sidebar-width);height:100%;background-color:var(--bg-secondary);border-right:1px solid var(--border-color);display:flex;flex-direction:column;transition:width var(--transition-normal);flex-shrink:0;overflow:hidden}.sidebar.collapsed{width:var(--sidebar-width-collapsed)}.sidebar-header{height:var(--topbar-height);display:flex;align-items:center;justify-content:space-between;padding:0 var(--spacing-md);border-bottom:1px solid var(--border-color);flex-shrink:0}.sidebar-logo{display:flex;align-items:center;gap:var(--spacing-sm);font-weight:600;font-size:var(--font-size-lg);color:var(--text-primary);white-space:nowrap;overflow:hidden}.sidebar-logo-icon{width:28px;height:28px;flex-shrink:0}.sidebar.collapsed .sidebar-logo-text{display:none}.sidebar-toggle{background:none;border:none;cursor:pointer;padding:var(--spacing-xs);border-radius:4px;color:var(--text-secondary);display:flex;align-items:center;justify-content:center;transition:background-color var(--transition-fast)}.sidebar-toggle:hover{background-color:var(--nav-item-hover)}.sidebar-nav{flex:1;padding:var(--spacing-md) var(--spacing-sm);overflow-y:auto}.nav-item{display:flex;align-items:center;gap:var(--spacing-md);padding:var(--spacing-sm) var(--spacing-md);border-radius:8px;cursor:pointer;color:var(--text-secondary);transition:all var(--transition-fast);margin-bottom:var(--spacing-xs);border:none;background:none;width:100%;text-align:left;font-size:var(--font-size-base)}.nav-item:hover{background-color:var(--nav-item-hover);color:var(--text-primary)}.nav-item.active{background-color:var(--nav-item-active);color:var(--nav-item-active-border);font-weight:500}.nav-item-icon{width:20px;height:20px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.nav-item-label{white-space:nowrap;overflow:hidden}.sidebar.collapsed .nav-item-label{display:none}.sidebar.collapsed .nav-item{justify-content:center;padding:var(--spacing-sm)}.sidebar-footer{padding:var(--spacing-md) var(--spacing-sm);border-top:1px solid var(--border-color)}.shutdown-btn{color:var(--status-error)!important}.shutdown-btn:hover{background-color:#ef44441a!important;color:var(--status-error)!important}.main-content{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.topbar{height:var(--topbar-height);background-color:var(--bg-secondary);border-bottom:1px solid var(--border-color);display:flex;align-items:center;justify-content:space-between;padding:0 var(--content-padding);flex-shrink:0}.topbar-left{display:flex;align-items:center;gap:var(--spacing-md)}.topbar-title{font-size:var(--font-size-lg);font-weight:600;color:var(--text-primary)}.topbar-subtitle{font-size:var(--font-size-sm);color:var(--text-muted)}.topbar-right{display:flex;align-items:center;gap:var(--spacing-md)}.connection-indicator{display:flex;align-items:center;gap:var(--spacing-xs);font-size:var(--font-size-sm);color:var(--text-muted)}.connection-dot{width:8px;height:8px;border-radius:50%;background-color:var(--status-error)}.connection-dot.streaming{background-color:var(--status-success);animation:pulse 2s infinite}.connection-dot.polling{background-color:var(--status-warning)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.content-area{flex:1;overflow-y:auto;padding:var(--content-padding);background-color:var(--bg-primary)}.card{background-color:var(--card-bg);border-radius:var(--card-border-radius);box-shadow:var(--card-shadow);padding:var(--card-padding);transition:box-shadow var(--transition-fast)}.card:hover{box-shadow:var(--card-shadow-hover)}.card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-md)}.card-title{font-size:var(--font-size-lg);font-weight:600;color:var(--text-primary);margin:0}.card-subtitle{font-size:var(--font-size-sm);color:var(--text-muted);margin:var(--spacing-xs) 0 0 0}.card-actions{display:flex;gap:var(--spacing-sm)}.card-body{color:var(--text-primary)}@media(max-width:768px){.sidebar{position:fixed;left:0;top:0;z-index:100;transform:translate(-100%);transition:transform var(--transition-normal)}.sidebar.open{transform:translate(0)}.sidebar-backdrop{position:fixed;inset:0;background-color:#00000080;z-index:99;opacity:0;visibility:hidden;transition:opacity var(--transition-normal)}.sidebar-backdrop.visible{opacity:1;visibility:visible}.topbar{padding:0 var(--spacing-md)}.content-area{padding:var(--spacing-md)}.mobile-menu-btn{display:flex;background:none;border:none;cursor:pointer;padding:var(--spacing-xs);color:var(--text-primary)}}@media(min-width:769px){.mobile-menu-btn,.sidebar-backdrop{display:none}}.log-panel{display:flex;flex-direction:column;gap:var(--spacing-md);height:100%}.log-panel-header{display:flex;flex-direction:column;gap:var(--spacing-md);margin-bottom:var(--spacing-md)}.log-panel-controls{display:flex;align-items:center;gap:var(--spacing-sm)}.log-panel-content{flex:1;min-height:0}@media(max-width:768px){.log-panel-header{gap:var(--spacing-sm)}}.stats-panel{display:flex;flex-direction:column;gap:var(--spacing-lg)}.stats-panel-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--spacing-md)}.stats-panel-actions{display:flex;gap:var(--spacing-sm)}.stats-estimator{font-size:var(--font-size-sm);color:var(--text-muted)}.stats-empty{text-align:center;padding:var(--spacing-xl);color:var(--text-muted)}.stats-empty p{margin:0}.stats-empty-hint{font-size:var(--font-size-sm);margin-top:var(--spacing-sm)!important}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--spacing-md)}.metric-card{background-color:var(--card-bg);border-radius:var(--card-border-radius);box-shadow:var(--card-shadow);padding:var(--card-padding);transition:box-shadow var(--transition-fast)}.metric-card:hover{box-shadow:var(--card-shadow-hover)}.metric-card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-sm)}.metric-card-title{font-size:var(--font-size-sm);color:var(--text-muted);font-weight:500}.metric-card-icon{color:var(--text-muted)}.metric-card-value{font-size:var(--font-size-2xl);font-weight:700;color:var(--text-primary);line-height:1.2}.metric-card-footer{display:flex;align-items:center;justify-content:space-between;margin-top:var(--spacing-sm)}.metric-card-subtitle{font-size:var(--font-size-xs);color:var(--text-muted)}.metric-card-trend{font-size:var(--font-size-xs);font-weight:600;padding:2px 6px;border-radius:4px}.metric-card-trend.up{color:var(--status-success);background-color:#22c55e1a}.metric-card-trend.down{color:var(--status-error);background-color:#ef44441a}.metric-card-trend.neutral{color:var(--text-muted);background-color:var(--nav-item-hover)}.live-counter{font-variant-numeric:tabular-nums}.stats-charts-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:var(--spacing-lg)}.stats-charts-row{width:100%}.pie-charts-row{display:flex;gap:var(--spacing-lg);justify-content:center;flex-wrap:wrap}.pie-chart-item{flex:1;min-width:250px;max-width:350px}.chart-container{position:relative;width:100%}.chart-empty{display:flex;align-items:center;justify-content:center;height:200px;color:var(--text-muted);font-style:italic}@media(max-width:768px){.metrics-grid{grid-template-columns:repeat(2,1fr)}.stats-charts-grid{grid-template-columns:1fr}.pie-charts-row{flex-direction:column;align-items:center}.pie-chart-item{max-width:none;width:100%}}.session-panel{display:flex;flex-direction:column;gap:var(--spacing-lg)}.session-panel-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:var(--spacing-lg);flex-wrap:wrap;gap:var(--spacing-md)}.session-panel-title{font-size:var(--font-size-lg);font-weight:600;color:var(--text-primary);margin:0}.session-panel-subtitle{font-size:var(--font-size-sm);color:var(--text-muted);margin:var(--spacing-xs) 0 0 0}.session-panel-actions{display:flex;gap:var(--spacing-sm)}.session-list{display:flex;flex-direction:column;gap:var(--spacing-md)}.session-list-empty{text-align:center;padding:var(--spacing-xl);color:var(--text-muted)}.session-list-empty p{margin:0}.session-list-empty-hint{font-size:var(--font-size-sm);margin-top:var(--spacing-sm)!important}.session-item{background-color:var(--bg-primary);border:1px solid var(--border-color);border-radius:8px;padding:var(--spacing-md);transition:border-color var(--transition-fast)}.session-item:hover{border-color:var(--text-muted)}.session-item-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:var(--spacing-sm)}.session-item-info{display:flex;flex-direction:column;gap:2px}.session-item-date{font-size:var(--font-size-base);font-weight:600;color:var(--text-primary)}.session-item-time{font-size:var(--font-size-sm);color:var(--text-muted)}.session-item-duration{font-size:var(--font-size-sm);color:var(--text-secondary);background-color:var(--nav-item-hover);padding:2px 8px;border-radius:4px}.session-item-project{font-size:var(--font-size-sm);color:var(--text-secondary);margin-bottom:var(--spacing-sm)}.session-item-stats{display:flex;gap:var(--spacing-lg);margin-bottom:var(--spacing-sm)}.session-stat{display:flex;flex-direction:column;gap:2px}.session-stat-label{font-size:var(--font-size-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.session-stat-value{font-size:var(--font-size-base);font-weight:600;color:var(--text-primary);font-variant-numeric:tabular-nums}.session-item-actions{display:flex;gap:var(--spacing-sm);justify-content:flex-end}.session-action-btn{display:flex;align-items:center;gap:4px;padding:6px 12px;font-size:var(--font-size-sm);color:var(--text-secondary);background:none;border:1px solid var(--border-color);border-radius:4px;cursor:pointer;transition:all var(--transition-fast)}.session-action-btn:hover{color:var(--text-primary);border-color:var(--text-muted);background-color:var(--nav-item-hover)}.btn-danger{background-color:transparent;color:var(--status-error);border:1px solid var(--status-error)}.btn-danger:hover{background-color:var(--status-error);color:#fff}.export-btn{display:flex;align-items:center}@media(max-width:768px){.session-panel-header{flex-direction:column;align-items:stretch}.session-panel-actions{justify-content:flex-end}.session-item-stats{flex-wrap:wrap;gap:var(--spacing-md)}}.dashboard-overview{display:flex;flex-direction:column;gap:var(--spacing-lg)}.welcome-section{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--spacing-md)}.welcome-content{flex:1}.welcome-title{font-size:var(--font-size-xl);font-weight:600;color:var(--text-primary);margin:0 0 var(--spacing-xs) 0}.welcome-description{font-size:var(--font-size-base);color:var(--text-secondary);margin:0}.connection-badge{flex-shrink:0}.connection-status{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:20px;font-size:var(--font-size-sm);font-weight:500}.connection-status:before{content:"";width:8px;height:8px;border-radius:50%}.connection-status.streaming{background-color:#22c55e1a;color:var(--status-success)}.connection-status.streaming:before{background-color:var(--status-success);animation:pulse 2s infinite}.connection-status.polling{background-color:#f59e0b1a;color:var(--status-warning)}.connection-status.polling:before{background-color:var(--status-warning)}.connection-status.disconnected{background-color:#ef44441a;color:var(--status-error)}.connection-status.disconnected:before{background-color:var(--status-error)}.quick-nav-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:var(--spacing-md)}.quick-nav-card{display:flex;align-items:center;gap:var(--spacing-md);padding:var(--spacing-md);background-color:var(--bg-primary);border:1px solid var(--border-color);border-radius:8px;cursor:pointer;transition:all var(--transition-fast);text-align:left;width:100%}.quick-nav-card:hover{border-color:var(--input-focus-border);background-color:var(--nav-item-active)}.quick-nav-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:8px;background-color:var(--nav-item-active);color:var(--input-focus-border);flex-shrink:0}.quick-nav-content{flex:1;min-width:0}.quick-nav-title{font-size:var(--font-size-base);font-weight:600;color:var(--text-primary);margin:0}.quick-nav-description{font-size:var(--font-size-sm);color:var(--text-muted);margin:4px 0 0}.quick-nav-arrow{color:var(--text-muted);flex-shrink:0;transition:transform var(--transition-fast)}.quick-nav-card:hover .quick-nav-arrow{transform:translate(4px);color:var(--input-focus-border)}@media(max-width:768px){.welcome-section{flex-direction:column}.quick-nav-grid{grid-template-columns:1fr}}.search-input-wrapper{position:relative;display:flex;align-items:center}.search-input-icon{position:absolute;left:12px;color:var(--text-muted);pointer-events:none;display:flex;align-items:center}.search-input{width:100%;padding:8px 36px;border:1px solid var(--input-border);border-radius:6px;background-color:var(--input-bg);color:var(--text-primary);font-size:var(--font-size-sm);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.search-input:focus{outline:none;border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--input-focus-ring)}.search-input::placeholder{color:var(--text-muted)}.search-input-clear{position:absolute;right:8px;display:flex;align-items:center;justify-content:center;padding:4px;border:none;background:none;color:var(--text-muted);cursor:pointer;border-radius:4px;transition:color var(--transition-fast),background-color var(--transition-fast)}.search-input-clear:hover{color:var(--text-primary);background-color:var(--nav-item-hover)}.dropdown{position:relative;display:inline-block;min-width:140px}.dropdown-trigger{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;border:1px solid var(--input-border);border-radius:6px;background-color:var(--input-bg);color:var(--text-primary);font-size:var(--font-size-sm);cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.dropdown-trigger:hover{border-color:var(--text-muted)}.dropdown-trigger:focus{outline:none;border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--input-focus-ring)}.dropdown-text{flex:1;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-arrow{display:flex;align-items:center;margin-left:8px;color:var(--text-muted);transition:transform var(--transition-fast)}.dropdown-arrow.open{transform:rotate(180deg)}.dropdown-menu{position:absolute;top:100%;left:0;right:0;margin-top:4px;padding:4px;border:1px solid var(--border-color);border-radius:6px;background-color:var(--bg-secondary);box-shadow:var(--card-shadow);z-index:100;max-height:240px;overflow-y:auto}.dropdown-clear{display:block;width:100%;padding:6px 8px;border:none;background:none;color:var(--status-info);font-size:var(--font-size-xs);text-align:left;cursor:pointer;border-bottom:1px solid var(--border-color);margin-bottom:4px}.dropdown-clear:hover{text-decoration:underline}.dropdown-options{display:flex;flex-direction:column;gap:2px}.dropdown-option{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;cursor:pointer;transition:background-color var(--transition-fast)}.dropdown-option:hover{background-color:var(--nav-item-hover)}.dropdown-option input[type=checkbox],.dropdown-option input[type=radio]{margin:0;accent-color:var(--input-focus-border)}.dropdown-option-label{font-size:var(--font-size-sm);color:var(--text-primary)}.log-filter-bar{display:flex;align-items:center;gap:var(--spacing-md);flex-wrap:wrap}.log-filter-search{flex:1;min-width:200px;max-width:300px}.log-filter-dropdowns{display:flex;align-items:center;gap:var(--spacing-sm)}.log-filter-clear{padding:8px 12px;font-size:var(--font-size-sm)}.icon-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid var(--input-border);border-radius:6px;background-color:var(--input-bg);color:var(--text-secondary);cursor:pointer;transition:all var(--transition-fast)}.icon-btn:hover{border-color:var(--text-muted);color:var(--text-primary);background-color:var(--nav-item-hover)}.icon-btn:disabled{opacity:.5;cursor:not-allowed}.reload-btn.spinning svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.filter-stats{display:flex;align-items:center;gap:var(--spacing-sm);font-size:var(--font-size-sm);color:var(--text-muted)}.filter-stats-count{font-weight:600;color:var(--text-primary)}@media(max-width:768px){.log-filter-bar{flex-direction:column;align-items:stretch}.log-filter-search{max-width:none}.log-filter-dropdowns{flex-wrap:wrap}.dropdown{flex:1;min-width:120px}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Smart Edit Dashboard</title>
|
|
7
|
+
<script type="module" crossorigin src="/dashboard/dashboard.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/dashboard/index.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -28,7 +28,7 @@ read_only: false
|
|
|
28
28
|
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
|
|
29
29
|
# * `create_text_file`: Creates/overwrites a file in the project directory.
|
|
30
30
|
# * `delete_lines`: Deletes a range of lines within a file.
|
|
31
|
-
# * `delete_memory`: Deletes a memory from
|
|
31
|
+
# * `delete_memory`: Deletes a memory from Smart-Edit's project-specific memory store.
|
|
32
32
|
# * `execute_shell_command`: Executes a shell command.
|
|
33
33
|
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
|
|
34
34
|
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
|
|
@@ -42,22 +42,22 @@ read_only: false
|
|
|
42
42
|
# * `insert_at_line`: Inserts content at a given line in a file.
|
|
43
43
|
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
|
|
44
44
|
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
|
|
45
|
-
# * `list_memories`: Lists memories in
|
|
45
|
+
# * `list_memories`: Lists memories in Smart-Edit's project-specific memory store.
|
|
46
46
|
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
|
|
47
47
|
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
|
|
48
48
|
# * `read_file`: Reads a file within the project directory.
|
|
49
|
-
# * `read_memory`: Reads the memory with the given name from
|
|
50
|
-
# * `remove_project`: Removes a project from the
|
|
49
|
+
# * `read_memory`: Reads the memory with the given name from Smart-Edit's project-specific memory store.
|
|
50
|
+
# * `remove_project`: Removes a project from the Smart-Edit configuration.
|
|
51
51
|
# * `replace_lines`: Replaces a range of lines within a file with new content.
|
|
52
52
|
# * `replace_symbol_body`: Replaces the full definition of a symbol.
|
|
53
|
-
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through
|
|
53
|
+
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Smart-Edit happen.
|
|
54
54
|
# * `search_for_pattern`: Performs a search for a pattern in the project.
|
|
55
55
|
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
|
|
56
56
|
# * `switch_modes`: Activates modes by providing a list of their names
|
|
57
57
|
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
|
|
58
58
|
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
|
|
59
59
|
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
|
|
60
|
-
# * `write_memory`: Writes a named memory (for future reference) to
|
|
60
|
+
# * `write_memory`: Writes a named memory (for future reference) to Smart-Edit's project-specific memory store.
|
|
61
61
|
excluded_tools: []
|
|
62
62
|
|
|
63
63
|
# initial prompt for the project. It will always be given to the LLM upon activating the project
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
gui_log_window: False
|
|
2
|
-
# whether to open a graphical window with
|
|
2
|
+
# whether to open a graphical window with Smart-Edit's logs.
|
|
3
3
|
# This is mainly supported on Windows and (partly) on Linux; not available on macOS.
|
|
4
4
|
# If you want to see the logs in a web browser, use the `web_dashboard` option instead.
|
|
5
5
|
# Limitations: doesn't seem to work with the community version of Claude Desktop for Linux
|
|
@@ -9,35 +9,35 @@ gui_log_window: False
|
|
|
9
9
|
# especially when using the agno playground, since the tool calls are not always shown,
|
|
10
10
|
# and the input params are never shown in the agno UI.
|
|
11
11
|
# When used as MCP server for Claude Desktop, the logs are primarily for troubleshooting.
|
|
12
|
-
# Note: unfortunately, the various entities starting the
|
|
12
|
+
# Note: unfortunately, the various entities starting the Smart-Edit server or agent do so in
|
|
13
13
|
# mysterious ways, often starting multiple instances of the process without shutting down
|
|
14
14
|
# previous instances. This can lead to multiple log windows being opened, and only the last
|
|
15
|
-
# window being updated. Since we can't control how agno or Claude Desktop start
|
|
15
|
+
# window being updated. Since we can't control how agno or Claude Desktop start Smart-Edit,
|
|
16
16
|
# we have to live with this limitation for now.
|
|
17
17
|
|
|
18
18
|
web_dashboard: True
|
|
19
|
-
# whether to open the
|
|
20
|
-
# shows
|
|
19
|
+
# whether to open the Smart-Edit web dashboard (which will be accessible through your web browser) that
|
|
20
|
+
# shows Smart-Edit's current session logs - as an alternative to the GUI log window which
|
|
21
21
|
# is supported on all platforms.
|
|
22
22
|
|
|
23
23
|
web_dashboard_open_on_launch: True
|
|
24
|
-
# whether to open a browser window with the web dashboard when
|
|
24
|
+
# whether to open a browser window with the web dashboard when Smart-Edit starts (provided that web_dashboard
|
|
25
25
|
# is enabled). If set to False, you can still open the dashboard manually by navigating to
|
|
26
|
-
# http://localhost:24282/dashboard/ in your web browser
|
|
26
|
+
# http://localhost:24282/dashboard/ in your web browser.
|
|
27
27
|
# If you have multiple instances running, a higher port will be used; try port 24283, 24284, etc.
|
|
28
28
|
|
|
29
29
|
log_level: 20
|
|
30
30
|
# the minimum log level for the GUI log window and the dashboard (10 = debug, 20 = info, 30 = warning, 40 = error)
|
|
31
31
|
|
|
32
32
|
trace_lsp_communication: False
|
|
33
|
-
# whether to trace the communication between
|
|
33
|
+
# whether to trace the communication between Smart-Edit and the language servers.
|
|
34
34
|
# This is useful for debugging language server issues.
|
|
35
35
|
|
|
36
36
|
ls_specific_settings: {}
|
|
37
37
|
# Added on 23.08.2025
|
|
38
38
|
# Advanced configuration option allowing to configure language server implementation specific options. Maps the language
|
|
39
39
|
# (same entry as in project.yml) to the options.
|
|
40
|
-
# Have a look at the docstring of the constructors of the LS implementations within
|
|
40
|
+
# Have a look at the docstring of the constructors of the LS implementations within smart-lsp (e.g., for C# or PHP) to see which options are available.
|
|
41
41
|
# No documentation on options means no options are available.
|
|
42
42
|
#
|
|
43
43
|
|
|
@@ -51,9 +51,9 @@ included_optional_tools: []
|
|
|
51
51
|
# list of optional tools (which are disabled by default) to be included
|
|
52
52
|
|
|
53
53
|
jetbrains: False
|
|
54
|
-
# whether to enable JetBrains mode and use tools based on the
|
|
54
|
+
# whether to enable JetBrains mode and use tools based on the Smart-Edit JetBrains IDE plugin
|
|
55
55
|
# instead of language server-based tools
|
|
56
|
-
# NOTE: The plugin is yet unreleased. This is for
|
|
56
|
+
# NOTE: The plugin is yet unreleased. This is for Smart-Edit developers only.
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
default_max_tool_answer_chars: 150000
|
|
@@ -73,13 +73,13 @@ token_count_estimator: TIKTOKEN_GPT4O
|
|
|
73
73
|
# and rate limits may apply.
|
|
74
74
|
|
|
75
75
|
|
|
76
|
-
# MANAGED BY
|
|
76
|
+
# MANAGED BY SMART-EDIT, KEEP AT THE BOTTOM OF THE YAML AND DON'T EDIT WITHOUT NEED
|
|
77
77
|
# The list of registered projects.
|
|
78
|
-
# To add a project, within a chat, simply ask
|
|
78
|
+
# To add a project, within a chat, simply ask Smart-Edit to "activate the project /path/to/project" or,
|
|
79
79
|
# if the project was previously added, "activate the project <project name>".
|
|
80
80
|
# By default, the project's name will be the name of the directory containing the project, but you may change it
|
|
81
81
|
# by editing the (auto-generated) project configuration file `/path/project/project/.smart-edit/project.yml` file.
|
|
82
82
|
# If you want to maintain full control of the project configuration, create the project.yml file manually and then
|
|
83
|
-
# instruct
|
|
83
|
+
# instruct Smart-Edit to activate the project by its path for first-time activation.
|
|
84
84
|
# NOTE: Make sure there are no name collisions in the names of registered projects.
|
|
85
85
|
projects: []
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { SmartEditAgent } from './agent.js';
|
|
2
|
+
import type { SmartLanguageServer, ReferenceInSymbol, UnifiedSymbolInformation } from '../smart-lsp/ls.js';
|
|
3
3
|
export interface LspPosition {
|
|
4
4
|
line: number;
|
|
5
5
|
character: number;
|
|
@@ -167,11 +167,11 @@ export interface FindSymbolOptions {
|
|
|
167
167
|
export declare class LanguageServerSymbolRetriever {
|
|
168
168
|
private _langServer;
|
|
169
169
|
private readonly agent;
|
|
170
|
-
constructor(langServer:
|
|
171
|
-
setLanguageServer(langServer:
|
|
172
|
-
set_language_server(langServer:
|
|
173
|
-
getLanguageServer():
|
|
174
|
-
get_language_server():
|
|
170
|
+
constructor(langServer: SmartLanguageServer, agent?: SmartEditAgent | null);
|
|
171
|
+
setLanguageServer(langServer: SmartLanguageServer): void;
|
|
172
|
+
set_language_server(langServer: SmartLanguageServer): void;
|
|
173
|
+
getLanguageServer(): SmartLanguageServer;
|
|
174
|
+
get_language_server(): SmartLanguageServer;
|
|
175
175
|
findByName(namePath: string, options?: FindSymbolOptions): LanguageServerSymbol[];
|
|
176
176
|
find_by_name(namePath: string, includeBody?: boolean, includeKinds?: number[] | SymbolKind[], excludeKinds?: number[] | SymbolKind[], substringMatching?: boolean, withinRelativePath?: string | null): LanguageServerSymbol[];
|
|
177
177
|
getDocumentSymbols(relativePath: string): LanguageServerSymbol[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
3
|
-
const { logger } =
|
|
2
|
+
import { createSmartEditLogger } from './util/logging.js';
|
|
3
|
+
const { logger } = createSmartEditLogger({ name: 'smart-edit.symbol', emitToConsole: false, level: 'info' });
|
|
4
4
|
export var SymbolKind;
|
|
5
5
|
(function (SymbolKind) {
|
|
6
6
|
SymbolKind[SymbolKind["File"] = 1] = "File";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
const { logger: log } =
|
|
3
|
+
import { createSmartEditLogger } from './util/logging.js';
|
|
4
|
+
const { logger: log } = createSmartEditLogger({ name: 'smart-edit.text_utils' });
|
|
5
5
|
export var LineType;
|
|
6
6
|
(function (LineType) {
|
|
7
7
|
LineType["MATCH"] = "match";
|
|
@@ -23,7 +23,7 @@ export declare class ActivateProjectTool extends Tool {
|
|
|
23
23
|
}
|
|
24
24
|
export declare class RemoveProjectTool extends Tool {
|
|
25
25
|
static readonly markers: Set<"does-not-require-active-project" | "optional">;
|
|
26
|
-
static readonly description = "Removes a project from the
|
|
26
|
+
static readonly description = "Removes a project from the Smart-Edit configuration.";
|
|
27
27
|
static readonly inputSchema: z.ZodObject<{
|
|
28
28
|
project_name: z.ZodString;
|
|
29
29
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { SmartEditAgentMode } from '../config/context_mode.js';
|
|
3
3
|
import { Tool, ToolMarkerDoesNotRequireActiveProject, ToolMarkerOptional } from './tools_base.js';
|
|
4
4
|
function stringifyUnknown(value, fallback = 'unknown') {
|
|
5
5
|
if (value === undefined || value === null) {
|
|
@@ -112,7 +112,7 @@ export class ActivateProjectTool extends Tool {
|
|
|
112
112
|
`Created and activated a new project with name '${projectName}' at ${activeProject.projectRoot}, language: ${language}. ` +
|
|
113
113
|
"You can activate this project later by name.\n";
|
|
114
114
|
if (projectYamlPath) {
|
|
115
|
-
result += `The project's
|
|
115
|
+
result += `The project's Smart-Edit configuration is in ${projectYamlPath}. In particular, you may want to edit the project name and the initial prompt.`;
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
else {
|
|
@@ -134,14 +134,14 @@ export class ActivateProjectTool extends Tool {
|
|
|
134
134
|
}
|
|
135
135
|
export class RemoveProjectTool extends Tool {
|
|
136
136
|
static markers = new Set([ToolMarkerDoesNotRequireActiveProject, ToolMarkerOptional]);
|
|
137
|
-
static description = 'Removes a project from the
|
|
137
|
+
static description = 'Removes a project from the Smart-Edit configuration.';
|
|
138
138
|
static inputSchema = z.object({
|
|
139
139
|
project_name: z.string().min(1, 'project_name must not be empty')
|
|
140
140
|
});
|
|
141
141
|
async apply(args) {
|
|
142
|
-
const config = this.agent.
|
|
142
|
+
const config = this.agent.smartEditConfig;
|
|
143
143
|
if (typeof config.removeProject !== 'function') {
|
|
144
|
-
throw new Error('Removing projects is not supported by the active
|
|
144
|
+
throw new Error('Removing projects is not supported by the active Smart-Edit configuration.');
|
|
145
145
|
}
|
|
146
146
|
await Promise.resolve(config.removeProject.call(config, args.project_name));
|
|
147
147
|
return `Successfully removed project '${args.project_name}' from configuration.`;
|
|
@@ -154,7 +154,7 @@ export class SwitchModesTool extends Tool {
|
|
|
154
154
|
modes: z.array(z.string().min(1, 'mode name must not be empty')).min(1, 'at least one mode must be provided')
|
|
155
155
|
});
|
|
156
156
|
async apply(args) {
|
|
157
|
-
const modeInstances = args.modes.map((modeName) =>
|
|
157
|
+
const modeInstances = args.modes.map((modeName) => SmartEditAgentMode.load(modeName));
|
|
158
158
|
await Promise.resolve(this.agent.setModes(modeInstances));
|
|
159
159
|
let result = `Successfully activated modes: ${modeInstances.map((mode) => mode.name).join(', ')}` + '\n';
|
|
160
160
|
result += modeInstances.map((mode) => mode.prompt).join('\n') + '\n';
|
|
@@ -11,7 +11,7 @@ interface MemoryNameInput {
|
|
|
11
11
|
}
|
|
12
12
|
export declare class WriteMemoryTool extends Tool {
|
|
13
13
|
static readonly markers: Set<"can-edit">;
|
|
14
|
-
static readonly description = "Writes a named markdown memory entry to
|
|
14
|
+
static readonly description = "Writes a named markdown memory entry to Smart-Edit's project-specific memory store.";
|
|
15
15
|
static readonly inputSchema: z.ZodObject<{
|
|
16
16
|
memory_name: z.ZodString;
|
|
17
17
|
content: z.ZodString;
|
|
@@ -28,7 +28,7 @@ export declare class WriteMemoryTool extends Tool {
|
|
|
28
28
|
apply(args: WriteMemoryInput): Promise<string>;
|
|
29
29
|
}
|
|
30
30
|
export declare class ReadMemoryTool extends Tool {
|
|
31
|
-
static readonly description = "Reads the content of a memory file from
|
|
31
|
+
static readonly description = "Reads the content of a memory file from Smart-Edit's project-specific memory store.";
|
|
32
32
|
static readonly inputSchema: z.ZodObject<{
|
|
33
33
|
memory_file_name: z.ZodString;
|
|
34
34
|
max_answer_chars: z.ZodOptional<z.ZodNumber>;
|
|
@@ -42,12 +42,12 @@ export declare class ReadMemoryTool extends Tool {
|
|
|
42
42
|
apply(args: MemoryNameInput): Promise<string>;
|
|
43
43
|
}
|
|
44
44
|
export declare class ListMemoriesTool extends Tool {
|
|
45
|
-
static readonly description = "Lists the available memories in
|
|
45
|
+
static readonly description = "Lists the available memories in Smart-Edit's project-specific memory store as a JSON array.";
|
|
46
46
|
apply(_args?: Record<string, unknown>): Promise<string>;
|
|
47
47
|
}
|
|
48
48
|
export declare class DeleteMemoryTool extends Tool {
|
|
49
49
|
static readonly markers: Set<"can-edit">;
|
|
50
|
-
static readonly description = "Deletes a memory file from
|
|
50
|
+
static readonly description = "Deletes a memory file from Smart-Edit's project-specific memory store.";
|
|
51
51
|
static readonly inputSchema: z.ZodObject<{
|
|
52
52
|
memory_file_name: z.ZodString;
|
|
53
53
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -73,7 +73,7 @@ async function callDeleteMemory(manager, name) {
|
|
|
73
73
|
}
|
|
74
74
|
export class WriteMemoryTool extends Tool {
|
|
75
75
|
static markers = new Set([ToolMarkerCanEdit]);
|
|
76
|
-
static description = "Writes a named markdown memory entry to
|
|
76
|
+
static description = "Writes a named markdown memory entry to Smart-Edit's project-specific memory store.";
|
|
77
77
|
static inputSchema = z.object({
|
|
78
78
|
memory_name: z.string().min(1, 'memory_name must not be empty'),
|
|
79
79
|
content: z.string(),
|
|
@@ -87,7 +87,7 @@ export class WriteMemoryTool extends Tool {
|
|
|
87
87
|
const { memory_name, content, max_answer_chars = -1 } = args;
|
|
88
88
|
let limit = max_answer_chars;
|
|
89
89
|
if (limit === -1) {
|
|
90
|
-
limit = this.agent.
|
|
90
|
+
limit = this.agent.smartEditConfig.defaultMaxToolAnswerChars;
|
|
91
91
|
}
|
|
92
92
|
if (limit <= 0) {
|
|
93
93
|
throw new Error(`max_answer_chars must be positive or -1; got ${limit}`);
|
|
@@ -100,7 +100,7 @@ export class WriteMemoryTool extends Tool {
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
export class ReadMemoryTool extends Tool {
|
|
103
|
-
static description = "Reads the content of a memory file from
|
|
103
|
+
static description = "Reads the content of a memory file from Smart-Edit's project-specific memory store.";
|
|
104
104
|
static inputSchema = z.object({
|
|
105
105
|
memory_file_name: z.string().min(1, 'memory_file_name must not be empty'),
|
|
106
106
|
max_answer_chars: z
|
|
@@ -115,7 +115,7 @@ export class ReadMemoryTool extends Tool {
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
export class ListMemoriesTool extends Tool {
|
|
118
|
-
static description = "Lists the available memories in
|
|
118
|
+
static description = "Lists the available memories in Smart-Edit's project-specific memory store as a JSON array.";
|
|
119
119
|
async apply(_args = {}) {
|
|
120
120
|
const memories = await callListMemories(this.memoriesManager);
|
|
121
121
|
return JSON.stringify(memories);
|
|
@@ -123,7 +123,7 @@ export class ListMemoriesTool extends Tool {
|
|
|
123
123
|
}
|
|
124
124
|
export class DeleteMemoryTool extends Tool {
|
|
125
125
|
static markers = new Set([ToolMarkerCanEdit]);
|
|
126
|
-
static description = "Deletes a memory file from
|
|
126
|
+
static description = "Deletes a memory file from Smart-Edit's project-specific memory store.";
|
|
127
127
|
static inputSchema = z.object({
|
|
128
128
|
memory_file_name: z.string().min(1, 'memory_file_name must not be empty')
|
|
129
129
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type ZodTypeAny } from 'zod';
|
|
2
|
-
import type {
|
|
3
|
-
import type { Language } from '../../
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
2
|
+
import type { SmartEditAgentMode } from '../config/context_mode.js';
|
|
3
|
+
import type { Language } from '../../smart-lsp/ls_config.js';
|
|
4
|
+
import type { SmartEditPromptFactory } from '../prompt_factory.js';
|
|
5
|
+
import type { SmartLanguageServer } from '../../smart-lsp/ls.js';
|
|
6
6
|
import type { LanguageServerSymbolRetriever } from '../symbol.js';
|
|
7
7
|
import type { LanguageServerCodeEditor } from '../code_editor.js';
|
|
8
8
|
import type { LinesRead } from '../agent.js';
|
|
@@ -14,7 +14,7 @@ export declare const ToolMarkerOptional: "optional";
|
|
|
14
14
|
export declare const ToolMarkerSymbolicRead: "symbolic-read";
|
|
15
15
|
export declare const ToolMarkerSymbolicEdit: "symbolic-edit";
|
|
16
16
|
export type ToolMarker = typeof ToolMarkerCanEdit | typeof ToolMarkerDoesNotRequireActiveProject | typeof ToolMarkerOptional | typeof ToolMarkerSymbolicRead | typeof ToolMarkerSymbolicEdit;
|
|
17
|
-
export interface
|
|
17
|
+
export interface SmartEditConfigLike {
|
|
18
18
|
defaultMaxToolAnswerChars: number;
|
|
19
19
|
toolTimeout: number;
|
|
20
20
|
projectNames: string[];
|
|
@@ -34,7 +34,7 @@ export interface ProjectLike {
|
|
|
34
34
|
isNewlyCreated?: boolean;
|
|
35
35
|
pathToProjectYml?: () => string;
|
|
36
36
|
}
|
|
37
|
-
export type PromptFactoryLike =
|
|
37
|
+
export type PromptFactoryLike = SmartEditPromptFactory;
|
|
38
38
|
export interface MemoriesManagerLike {
|
|
39
39
|
listMemories(): string[] | Promise<string[]> | Iterable<unknown> | Promise<Iterable<unknown>>;
|
|
40
40
|
list_memories?(): string[] | Promise<string[]> | Iterable<unknown> | Promise<Iterable<unknown>>;
|
|
@@ -46,7 +46,7 @@ export interface MemoriesManagerLike {
|
|
|
46
46
|
delete_memory?(name: string): string | Promise<string>;
|
|
47
47
|
}
|
|
48
48
|
export type LinesReadLike = LinesRead;
|
|
49
|
-
export type LanguageServerLike =
|
|
49
|
+
export type LanguageServerLike = SmartLanguageServer;
|
|
50
50
|
export type CodeEditorLike = LanguageServerCodeEditor;
|
|
51
51
|
export type LanguageServerSymbolRetrieverLike = LanguageServerSymbolRetriever;
|
|
52
52
|
export interface IssueTaskMetadata {
|
|
@@ -57,10 +57,10 @@ export interface AgentTaskHandle<T> {
|
|
|
57
57
|
timeout?: number;
|
|
58
58
|
}): Promise<T>;
|
|
59
59
|
}
|
|
60
|
-
export interface
|
|
60
|
+
export interface SmartEditAgentLike {
|
|
61
61
|
readonly promptFactory: PromptFactoryLike;
|
|
62
62
|
readonly memoriesManager: MemoriesManagerLike | null;
|
|
63
|
-
readonly
|
|
63
|
+
readonly smartEditConfig: SmartEditConfigLike;
|
|
64
64
|
readonly languageServer: LanguageServerLike | null;
|
|
65
65
|
readonly linesRead: LinesReadLike | null;
|
|
66
66
|
getProjectRoot(): string;
|
|
@@ -72,7 +72,7 @@ export interface SerenaAgentLike {
|
|
|
72
72
|
isLanguageServerRunning(): boolean;
|
|
73
73
|
resetLanguageServer(): void | Promise<void>;
|
|
74
74
|
activateProjectFromPathOrName(project: string): Promise<ProjectLike>;
|
|
75
|
-
setModes(modes:
|
|
75
|
+
setModes(modes: SmartEditAgentMode[]): void | Promise<void>;
|
|
76
76
|
getCurrentConfigOverview(): string | Promise<string>;
|
|
77
77
|
createLanguageServerSymbolRetriever(): LanguageServerSymbolRetrieverLike;
|
|
78
78
|
createCodeEditor(): CodeEditorLike;
|
|
@@ -91,10 +91,10 @@ export interface ToolExecutionOptions {
|
|
|
91
91
|
catchExceptions?: boolean;
|
|
92
92
|
maxAnswerChars?: number;
|
|
93
93
|
}
|
|
94
|
-
export type ToolClass<T extends Tool = Tool> = (new (agent:
|
|
94
|
+
export type ToolClass<T extends Tool = Tool> = (new (agent: SmartEditAgentLike) => T) & typeof Tool;
|
|
95
95
|
export declare abstract class Component {
|
|
96
|
-
protected readonly agent:
|
|
97
|
-
constructor(agent:
|
|
96
|
+
protected readonly agent: SmartEditAgentLike;
|
|
97
|
+
constructor(agent: SmartEditAgentLike);
|
|
98
98
|
getProjectRoot(): string;
|
|
99
99
|
protected get promptFactory(): PromptFactoryLike;
|
|
100
100
|
protected get memoriesManager(): MemoriesManagerLike;
|
|
@@ -129,13 +129,13 @@ declare class EditedFileContextImpl {
|
|
|
129
129
|
private readonly absolutePath;
|
|
130
130
|
private readonly originalContent;
|
|
131
131
|
private updatedContent;
|
|
132
|
-
constructor(relativePath: string, agent:
|
|
132
|
+
constructor(relativePath: string, agent: SmartEditAgentLike);
|
|
133
133
|
getOriginalContent(): string;
|
|
134
134
|
setUpdatedContent(content: string): void;
|
|
135
135
|
commit(): Promise<void>;
|
|
136
136
|
}
|
|
137
137
|
export declare class EditedFileContext {
|
|
138
|
-
static use<T>(relativePath: string, agent:
|
|
138
|
+
static use<T>(relativePath: string, agent: SmartEditAgentLike, handler: (context: EditedFileContextImpl) => Promise<T> | T): Promise<T>;
|
|
139
139
|
}
|
|
140
140
|
declare class ToolRegistryImpl {
|
|
141
141
|
private readonly toolMap;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import {
|
|
4
|
+
import { createSmartEditLogger } from '../util/logging.js';
|
|
5
5
|
import { singleton } from '../util/class_decorators.js';
|
|
6
|
-
const { logger: log } =
|
|
6
|
+
const { logger: log } = createSmartEditLogger({ name: 'smart-edit.tools.base' });
|
|
7
7
|
export function assertIsBufferEncoding(value) {
|
|
8
8
|
if (!Buffer.isEncoding(value)) {
|
|
9
9
|
throw new Error(`Unsupported file encoding '${value}'`);
|
|
@@ -42,7 +42,7 @@ function describeError(error) {
|
|
|
42
42
|
return String(error);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
function
|
|
45
|
+
function isSmartLspTerminationError(error) {
|
|
46
46
|
if (typeof error !== 'object' || error === null) {
|
|
47
47
|
return false;
|
|
48
48
|
}
|
|
@@ -144,7 +144,7 @@ export class Tool extends Component {
|
|
|
144
144
|
_limitLength(result, maxAnswerChars) {
|
|
145
145
|
let limit = maxAnswerChars;
|
|
146
146
|
if (limit === -1 || limit === undefined || limit === null) {
|
|
147
|
-
limit = this.agent.
|
|
147
|
+
limit = this.agent.smartEditConfig.defaultMaxToolAnswerChars;
|
|
148
148
|
}
|
|
149
149
|
if (limit <= 0) {
|
|
150
150
|
throw new Error(`Must be positive or the default (-1), got: maxAnswerChars=${limit}`);
|
|
@@ -178,7 +178,7 @@ export class Tool extends Component {
|
|
|
178
178
|
if (!this.hasMarker(ToolMarkerDoesNotRequireActiveProject)) {
|
|
179
179
|
const activeProject = this.agent.getActiveProject();
|
|
180
180
|
if (!activeProject) {
|
|
181
|
-
const projects = this.agent.
|
|
181
|
+
const projects = this.agent.smartEditConfig.projectNames;
|
|
182
182
|
return [
|
|
183
183
|
`Error: No active project. Ask the user to provide the project path or to select a project from this list of known projects:`,
|
|
184
184
|
projects.join(', ') || '(none)'
|
|
@@ -195,7 +195,7 @@ export class Tool extends Component {
|
|
|
195
195
|
result = typeof output === 'string' ? output : String(output);
|
|
196
196
|
}
|
|
197
197
|
catch (error) {
|
|
198
|
-
if (
|
|
198
|
+
if (isSmartLspTerminationError(error)) {
|
|
199
199
|
log.error(`Language server terminated while executing tool (${describeError(error)}). Restarting the language server and retrying ...`);
|
|
200
200
|
await Promise.resolve(this.agent.resetLanguageServer());
|
|
201
201
|
const retryOutput = await Promise.resolve(applyFn(validatedArgs));
|
|
@@ -234,7 +234,7 @@ export class Tool extends Component {
|
|
|
234
234
|
}
|
|
235
235
|
};
|
|
236
236
|
const future = this.agent.issueTask(task, { name: this.constructor.name });
|
|
237
|
-
return future.result({ timeout: this.agent.
|
|
237
|
+
return future.result({ timeout: this.agent.smartEditConfig.toolTimeout });
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
240
|
class EditedFileContextImpl {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SmartEditLogger } from './logging.js';
|
|
2
2
|
export interface ShowFatalExceptionOptions {
|
|
3
|
-
logger?:
|
|
3
|
+
logger?: SmartEditLogger;
|
|
4
4
|
printToStderr?: boolean;
|
|
5
5
|
}
|
|
6
6
|
export declare function evaluateHeadlessEnvironment(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, release: string, fileExists: (path: string) => boolean): boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import os from 'node:os';
|
|
3
|
-
import {
|
|
4
|
-
const { logger: consoleLogger } =
|
|
3
|
+
import { createSmartEditLogger } from './logging.js';
|
|
4
|
+
const { logger: consoleLogger } = createSmartEditLogger({ level: 'debug' });
|
|
5
5
|
export function evaluateHeadlessEnvironment(env, platform, release, fileExists) {
|
|
6
6
|
if (platform === 'win32') {
|
|
7
7
|
return false;
|
|
@@ -2,11 +2,11 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { performance } from 'node:perf_hooks';
|
|
4
4
|
import ignore from 'ignore';
|
|
5
|
-
import {
|
|
6
|
-
const { logger: fileSystemLogger } =
|
|
5
|
+
import { createSmartEditLogger } from './logging.js';
|
|
6
|
+
const { logger: fileSystemLogger } = createSmartEditLogger({
|
|
7
7
|
level: 'debug',
|
|
8
8
|
emitToConsole: false,
|
|
9
|
-
name: '
|
|
9
|
+
name: 'SmartEditFileSystem'
|
|
10
10
|
});
|
|
11
11
|
export function scanDirectory(targetPath, recursive = false, relativeTo, isIgnoredDir, isIgnoredFile) {
|
|
12
12
|
const ignoreDir = isIgnoredDir ?? (() => false);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createSmartEditLogger } from './logging.js';
|
|
2
2
|
import { subprocessCheckOutput } from './shell.js';
|
|
3
|
-
const { logger: gitLogger } =
|
|
3
|
+
const { logger: gitLogger } = createSmartEditLogger({
|
|
4
4
|
level: 'debug',
|
|
5
5
|
emitToConsole: false,
|
|
6
|
-
name: '
|
|
6
|
+
name: 'SmartEditGit'
|
|
7
7
|
});
|
|
8
8
|
export async function getGitStatus(options = {}) {
|
|
9
9
|
try {
|
|
@@ -6,7 +6,7 @@ export interface RegisterSubclassOptions {
|
|
|
6
6
|
base?: Constructor<unknown>;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* サブクラスをレジストリに登録します。
|
|
9
|
+
* サブクラスをレジストリに登録します。
|
|
10
10
|
* 各クラス定義側からこの関数を呼び出して静的メタデータを構築します。
|
|
11
11
|
*/
|
|
12
12
|
export declare function registerSubclass<T>(derived: Constructor<T>, options?: RegisterSubclassOptions): void;
|
|
@@ -30,8 +30,8 @@ export interface DetermineLanguageOptions {
|
|
|
30
30
|
languages?: Iterable<LanguageInput>;
|
|
31
31
|
includeExperimental?: boolean;
|
|
32
32
|
}
|
|
33
|
-
type LanguageInput = ProgrammingLanguageDefinition |
|
|
34
|
-
interface
|
|
33
|
+
type LanguageInput = ProgrammingLanguageDefinition | SmartLanguageLike;
|
|
34
|
+
interface SmartLanguageLike {
|
|
35
35
|
toString(): string;
|
|
36
36
|
getSourceFnMatcher?: () => unknown;
|
|
37
37
|
getSourceFilenameMatcher?: () => unknown;
|
|
@@ -2,7 +2,7 @@ import path from 'node:path';
|
|
|
2
2
|
import { findAllNonIgnoredFiles } from './file_system.js';
|
|
3
3
|
const subclassRegistry = new Map();
|
|
4
4
|
/**
|
|
5
|
-
* サブクラスをレジストリに登録します。
|
|
5
|
+
* サブクラスをレジストリに登録します。
|
|
6
6
|
* 各クラス定義側からこの関数を呼び出して静的メタデータを構築します。
|
|
7
7
|
*/
|
|
8
8
|
export function registerSubclass(derived, options) {
|
|
@@ -141,7 +141,7 @@ function normalizeLanguageInput(input, includeExperimental) {
|
|
|
141
141
|
experimental: input.experimental ?? false
|
|
142
142
|
};
|
|
143
143
|
}
|
|
144
|
-
if (
|
|
144
|
+
if (isSmartLanguageLike(input)) {
|
|
145
145
|
const experimental = typeof input.isExperimental === 'function' ? input.isExperimental() : false;
|
|
146
146
|
if (!includeExperimental && experimental) {
|
|
147
147
|
return undefined;
|
|
@@ -208,7 +208,7 @@ function isProgrammingLanguageDefinition(value) {
|
|
|
208
208
|
candidate.matcher !== null &&
|
|
209
209
|
typeof candidate.matcher.isRelevantFilename === 'function');
|
|
210
210
|
}
|
|
211
|
-
function
|
|
211
|
+
function isSmartLanguageLike(value) {
|
|
212
212
|
if (!value || typeof value !== 'object') {
|
|
213
213
|
return false;
|
|
214
214
|
}
|