diff --git a/script/core/command/autoRequire.lua b/script/core/command/autoRequire.lua
index 63ff784e5501d71d744ea3839efe0a43dda5c367..2cb6a8f88dac9051c5fabab1cdfe839120400346 100644
--- a/script/core/command/autoRequire.lua
+++ b/script/core/command/autoRequire.lua
@@ -107,7 +107,6 @@ return function (data)
         return
     end
 
-    local offset, fmt = findInsertOffset(uri)
     local path = furi.decode(target)
     local visiblePaths = rpath.getVisiblePath(path, config.get 'Lua.runtime.path')
     if not visiblePaths or #visiblePaths == 0 then
@@ -122,5 +121,6 @@ return function (data)
         return
     end
 
+    local offset, fmt = findInsertOffset(uri)
     applyAutoRequire(uri, offset, name, result, fmt)
 end
diff --git a/script/utility.lua b/script/utility.lua
index f62c7af3cd5984a3af1d53ce8960f3965fe33161..8d377708c0a506126b341501bcca7fc3b9330f9f 100644
--- a/script/utility.lua
+++ b/script/utility.lua
@@ -17,6 +17,7 @@ local mathRandom   = math.random
 local ioOpen       = io.open
 local utf8Len      = utf8.len
 local getenv       = os.getenv
+local getupvalue   = debug.getupvalue
 local mathHuge     = math.huge
 local inf          = 1 / 0
 local nan          = 0 / 0
@@ -684,4 +685,17 @@ function m.switch()
     return obj
 end
 
+function m.getUpvalue(f, name)
+    for i = 1, 999 do
+        local uname, value = getupvalue(f, i)
+        if not uname then
+            break
+        end
+        if name == uname then
+            return value, true
+        end
+    end
+    return nil, false
+end
+
 return m
diff --git a/script/vm/eachDef.lua b/script/vm/eachDef.lua
index 65cae73e98b3f88c141e8759bd13b5e274624986..2bfad4bf367927bb2301f8460b7458207a761086 100644
--- a/script/vm/eachDef.lua
+++ b/script/vm/eachDef.lua
@@ -1,5 +1,4 @@
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm       = require 'vm.vm'
 local searcher = require 'core.searcher'
 
diff --git a/script/vm/eachRef.lua b/script/vm/eachRef.lua
index 6e008e2a0a27564ebcf9cfdb6a69d215d50c64c7..35425818502464283f889270378ad2233ed7252c 100644
--- a/script/vm/eachRef.lua
+++ b/script/vm/eachRef.lua
@@ -1,5 +1,4 @@
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm       = require 'vm.vm'
 local searcher = require 'core.searcher'
 
diff --git a/script/vm/getDocs.lua b/script/vm/getDocs.lua
index 8ee942d1bb886eee798ce93c40ae17d7754b4682..c0205654240cbd97a10594a08f37b5a3f834b22a 100644
--- a/script/vm/getDocs.lua
+++ b/script/vm/getDocs.lua
@@ -1,7 +1,6 @@
 local files     = require 'files'
 local guide     = require 'parser.guide'
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm        = require 'vm.vm'
 local config    = require 'config'
 local collector = require 'core.collector'
diff --git a/script/vm/getGlobals.lua b/script/vm/getGlobals.lua
index d794a394f9a6064d28a7cc3e97405fc6844c89c6..6dacda43a50f7f6b0471666531232f36ed0c34e3 100644
--- a/script/vm/getGlobals.lua
+++ b/script/vm/getGlobals.lua
@@ -1,7 +1,6 @@
 local collector = require 'core.collector'
 local guide     = require 'parser.guide'
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm        = require 'vm.vm'
 local noder     = require 'core.noder'
 
diff --git a/script/vm/getLibrary.lua b/script/vm/getLibrary.lua
index 1002babba990d0045a315613cba9ba4f0bd433eb..1a8d8ffde41e981082edde4dd31a5ffd13be9a3a 100644
--- a/script/vm/getLibrary.lua
+++ b/script/vm/getLibrary.lua
@@ -1,4 +1,3 @@
----@diagnostic disable-next-line
 ---@class vm
 local vm      = require 'vm.vm'
 
diff --git a/script/vm/getLinks.lua b/script/vm/getLinks.lua
index 8df79dcae7d468f3b697418b0b5babcf5618e8f2..161396f6a61257d5dcc8d88c51248b4c30c131a8 100644
--- a/script/vm/getLinks.lua
+++ b/script/vm/getLinks.lua
@@ -1,6 +1,5 @@
 local guide = require 'parser.guide'
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm    = require 'vm.vm'
 local files = require 'files'
 
diff --git a/script/vm/vm.lua b/script/vm/vm.lua
index f51def71cedb73b1fafde7b87bd7863624a1da0e..6abaaa0e795e5af3d862c038b07f5ada003b6b83 100644
--- a/script/vm/vm.lua
+++ b/script/vm/vm.lua
@@ -13,8 +13,8 @@ local mathHuge       = math.huge
 local weakMT = { __mode = 'kv' }
 
 _ENV = nil
----@diagnostic disable-next-line
----@class vm
+
+---@type vm
 local m = {}
 
 function m.getArgInfo(source)
diff --git a/test.lua b/test.lua
index 70993a702555f4cf84764354d998a9dbaf9b503a..d2e2c38a371821e2b9fc6578a9e10c136bfd9741 100644
--- a/test.lua
+++ b/test.lua
@@ -74,6 +74,7 @@ local function testAll()
     test 'highlight'
     test 'rename'
     test 'signature'
+    test 'command'
     test 'document_symbol'
     test 'code_action'
     test 'type_formatting'
diff --git a/test/command/auto-require.lua b/test/command/auto-require.lua
new file mode 100644
index 0000000000000000000000000000000000000000..94bb5069353db2e995219e3cd65dd8efa634b4b7
--- /dev/null
+++ b/test/command/auto-require.lua
@@ -0,0 +1,36 @@
+local util        = require 'utility'
+local files       = require 'files'
+local autoRequire = require 'core.command.autoRequire'
+local client      = require 'client'
+
+local findInsertOffset = util.getUpvalue(autoRequire, 'findInsertOffset')
+local applyAutoRequire = util.getUpvalue(autoRequire, 'applyAutoRequire')
+
+local originEditText = client.editText
+local EditResult
+
+client.editText = function (uri, edits)
+    EditResult = edits[1]
+end
+
+function TEST(text)
+    return function (name)
+        return function (expect)
+            files.removeAll()
+            files.setText('', text)
+            EditResult = nil
+            local offset, fmt = findInsertOffset('')
+            applyAutoRequire('', offset, name, name, fmt)
+            assert(util.equal(EditResult, expect))
+        end
+    end
+end
+
+-- TODO change to position
+TEST '' 'test' {
+    start  = 0,
+    finish = -1,
+    text   = '\nlocal test = require "test"\n'
+}
+
+client.editText = originEditText
diff --git a/test/command/init.lua b/test/command/init.lua
new file mode 100644
index 0000000000000000000000000000000000000000..85d7f0d89ff0aba423a7b639a7a89e70386b0e09
--- /dev/null
+++ b/test/command/init.lua
@@ -0,0 +1 @@
+require 'command.auto-require'