diff --git a/Dockerfile.desktop b/Dockerfile.desktop
index 84850d36d4c483804b112c25e892e7fb40514c66..4489c910022b63234b66006a14438f9e177fc3d1 100644
--- a/Dockerfile.desktop
+++ b/Dockerfile.desktop
@@ -23,10 +23,8 @@ RUN chown deadlock setup_trace.py
 COPY recorder-out deadlock/
 COPY .gitignore_recorder deadlock/.gitignore
 
-
-
 COPY start.desktop.sh .
-RUN chmod 504 deadlock/ -R
+RUN chmod 500 /deadlock/recorder.js
 RUN chmod 500 start.desktop.sh
 
 RUN mkdir /project && mkdir /tmp/.ssh && mkdir /home/deadlock/mission
diff --git a/deadlock-plugins/deadlock-extension/.vscode/launch.json b/deadlock-plugins/deadlock-extension/.vscode/launch.json
index 4f8bc2e8d2f1f4b8aa1ec80a3f2397f818b097ad..fd9b761149d6e5972331e8ccec39c32f413c91b4 100644
--- a/deadlock-plugins/deadlock-extension/.vscode/launch.json
+++ b/deadlock-plugins/deadlock-extension/.vscode/launch.json
@@ -13,6 +13,17 @@
       "outFiles": ["${workspaceFolder}/dist/**/*.js"],
       "preLaunchTask": "${defaultBuildTask}"
     },
+    {
+      "name": "Run Extension in test mode",
+      "type": "extensionHost",
+      "request": "launch",
+      "env": {
+        "DL_MOUNT_EXTENSION": "true"
+      },
+      "args": ["--extensionDevelopmentPath=${workspaceFolder}"],
+      "outFiles": ["${workspaceFolder}/dist/**/*.js"],
+      "preLaunchTask": "${defaultBuildTask}"
+    },
     {
       "name": "Extension Tests",
       "type": "extensionHost",
diff --git a/deadlock-plugins/deadlock-extension/package-lock.json b/deadlock-plugins/deadlock-extension/package-lock.json
index 9a9aebbbf75b76c12b20a97b079548747d9f5f01..f2892bfbc53240cd27ea173e1779d5207e90d3a5 100644
--- a/deadlock-plugins/deadlock-extension/package-lock.json
+++ b/deadlock-plugins/deadlock-extension/package-lock.json
@@ -8,6 +8,7 @@
       "name": "deadlock-coding",
       "version": "0.1.10",
       "dependencies": {
+        "@types/yaml": "^1.9.7",
         "@vscode/webview-ui-toolkit": "^1.0.0",
         "async": "^3.2.2",
         "axios": "^0.27.2",
@@ -17,7 +18,8 @@
         "marked": "^4.0.6",
         "node-fetch": "^2.6.7",
         "reflect-metadata": "^0.1.13",
-        "simple-git": "^3.7.0"
+        "simple-git": "^3.7.0",
+        "yaml": "^2.1.1"
       },
       "devDependencies": {
         "@babel/preset-typescript": "^7.17.12",
@@ -54,6 +56,19 @@
         "vscode": ">=1.66.0"
       }
     },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.1.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
     "node_modules/@babel/code-frame": {
       "version": "7.12.11",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
@@ -764,6 +779,28 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
+    "node_modules/@eslint/eslintrc/node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
     "node_modules/@humanwhocodes/config-array": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
@@ -800,6 +837,28 @@
         "node": ">=8"
       }
     },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
     "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -1734,6 +1793,15 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/yaml": {
+      "version": "1.9.7",
+      "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz",
+      "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==",
+      "deprecated": "This is a stub types definition. yaml provides its own type definitions, so you do not need this installed.",
+      "dependencies": {
+        "yaml": "*"
+      }
+    },
     "node_modules/@types/yargs": {
       "version": "17.0.10",
       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz",
@@ -2381,13 +2449,10 @@
       "dev": true
     },
     "node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
     },
     "node_modules/array-flatten": {
       "version": "2.1.2",
@@ -3960,6 +4025,15 @@
         "node": ">=4"
       }
     },
+    "node_modules/eslint/node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
     "node_modules/eslint/node_modules/eslint-visitor-keys": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
@@ -3969,6 +4043,19 @@
         "node": ">=10"
       }
     },
+    "node_modules/eslint/node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
     "node_modules/espree": {
       "version": "7.3.1",
       "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
@@ -6508,19 +6595,6 @@
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
-    "node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
     "node_modules/jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -6775,12 +6849,6 @@
         "markdown-it": "bin/markdown-it.js"
       }
     },
-    "node_modules/markdown-it/node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
-    },
     "node_modules/markdown-it/node_modules/entities": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
@@ -8592,7 +8660,7 @@
     "node_modules/sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
       "dev": true
     },
     "node_modules/stack-utils": {
@@ -9998,6 +10066,14 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "node_modules/yaml": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz",
+      "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/yargs": {
       "version": "17.5.1",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
@@ -10606,6 +10682,27 @@
         "js-yaml": "^3.13.1",
         "minimatch": "^3.0.4",
         "strip-json-comments": "^3.1.1"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "dev": true,
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+          "dev": true,
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        }
       }
     },
     "@humanwhocodes/config-array": {
@@ -10638,6 +10735,25 @@
         "resolve-from": "^5.0.0"
       },
       "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "dev": true,
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+          "dev": true,
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        },
         "resolve-from": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -11108,6 +11224,12 @@
       "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
       "dev": true
     },
+    "@types/async": {
+      "version": "3.2.13",
+      "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.13.tgz",
+      "integrity": "sha512-7Q3awrhnvm89OzfsmqeqRQh8mh+8Pxfgq1UvSAn2nWQ5y/F3+NrbIF0RbkWq8+5dY99ozgap2b3DNBNwjLVOxw==",
+      "dev": true
+    },
     "@types/babel__core": {
       "version": "7.1.19",
       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
@@ -11464,6 +11586,14 @@
         "@types/node": "*"
       }
     },
+    "@types/yaml": {
+      "version": "1.9.7",
+      "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz",
+      "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==",
+      "requires": {
+        "yaml": "*"
+      }
+    },
     "@types/yargs": {
       "version": "17.0.10",
       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz",
@@ -11951,13 +12081,10 @@
       "dev": true
     },
     "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
     },
     "array-flatten": {
       "version": "2.1.2",
@@ -13134,11 +13261,30 @@
         "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "dev": true,
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
         "eslint-visitor-keys": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
           "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
           "dev": true
+        },
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+          "dev": true,
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
         }
       }
     },
@@ -15107,16 +15253,6 @@
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
-    "js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -15318,12 +15454,6 @@
         "uc.micro": "^1.0.5"
       },
       "dependencies": {
-        "argparse": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-          "dev": true
-        },
         "entities": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
@@ -16713,7 +16843,7 @@
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
       "dev": true
     },
     "stack-utils": {
@@ -17743,6 +17873,11 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "yaml": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz",
+      "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw=="
+    },
     "yargs": {
       "version": "17.5.1",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
diff --git a/deadlock-plugins/deadlock-extension/package.json b/deadlock-plugins/deadlock-extension/package.json
index 9f7b6810a8690bcd59f19b5f446a42e5729acbe4..55c12b9f7360887cc0b9274f646f205b31e263b6 100644
--- a/deadlock-plugins/deadlock-extension/package.json
+++ b/deadlock-plugins/deadlock-extension/package.json
@@ -62,6 +62,13 @@
           "id": "help",
           "name": "Help",
           "visibility": "visible"
+        },
+        {
+          "id": "commandTree",
+          "name": "Commands",
+          "icon": "media/dep.svg",
+          "contextualTitle": "Deadlock",
+          "when": "deadlock.showCommands"
         }
       ]
     },
@@ -99,6 +106,7 @@
     "postversion": "git add package*.json && auto-changelog -p && git add CHANGELOG.md && git commit -m \"build: $npm_package_version\""
   },
   "dependencies": {
+    "@types/yaml": "^1.9.7",
     "@vscode/webview-ui-toolkit": "^1.0.0",
     "async": "^3.2.2",
     "axios": "^0.27.2",
@@ -108,7 +116,8 @@
     "marked": "^4.0.6",
     "node-fetch": "^2.6.7",
     "reflect-metadata": "^0.1.13",
-    "simple-git": "^3.7.0"
+    "simple-git": "^3.7.0",
+    "yaml": "^2.1.1"
   },
   "devDependencies": {
     "@babel/preset-typescript": "^7.17.12",
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts
index 29db6bb3c01d7e6616e6f9141c55e5bdbf7c8948..677faea6f2f59105971ffdf5add20a8eb7461224 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts
@@ -5,7 +5,7 @@ export interface DockerfileSpecific {
   'build.args'?: string[];
   'build.target'?: string;
   'build.cacheFrom'?: string;
-  containerEnv?: string;
+  containerEnv?: { [id: string]: string };
   containerUser?: string;
   mounts?: string[];
   workspaceMount?: string;
@@ -18,7 +18,7 @@ export interface Base {
   forwardPorts?: string[];
   portsAttributes?: string[];
   otherPortsAttributes?: string[];
-  remoteEnv?: string;
+  remoteEnv?: { [id: string]: string };
   remoteUser?: string;
   updateRemoteUserUID?: string;
   userEnvProbe?: string;
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
index 4ff26fba8154b8be68bc5d485243e2a934345926..8350f2abb651049db4faeaa6b70f4f84a098742d 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
@@ -17,7 +17,7 @@ export class MissionDevContainer {
   private isInit = false;
   private mounts: string[] = [];
   private readonly dockerImageUrl = 'registry.takima.io/deadlock/deadlock-challenges';
-  private readonly remoteGiteaWorkDir = `/workdir`;
+  private readonly remoteGiteaWorkDir = '/workdir';
 
   private readonly dirs: { missionWorkdir: string; config: string; devcontainer: string; mounted: string };
 
@@ -98,13 +98,21 @@ export class MissionDevContainer {
 
   private createDevContainerFile(options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) {
     const hostMissionDevcontainerFileDir = `${this.dirs.devcontainer}/devcontainer.json`;
-
     const image = `${this.dockerImageUrl}/${this.mission.id}:${this.mission.version}`;
+    let extTarget;
     this.mounts.push(
       `source=${userSshKeyFolderPath},target=/tmp/.ssh,type=bind,consistency=cached,readonly`,
       `source=${this.dirs.config},target=/home/config/,type=bind,consistency=cached,readonly`,
       'source=/etc/hosts,target=/etc/hosts,type=bind,consistency=cached,readonly',
     );
+    if (process.env.DL_MOUNT_EXTENSION === 'true') {
+      const extPath =
+        '/home/takima/Desktop/d-projects/deadlock-desktop/deadlock-plugins/deadlock-extension/deadlock-coding-0.1.10.vsix';
+      extTarget = '/injected-extension/extension.vsix';
+      this.mounts.push(`source=${extPath},target=${extTarget},type=bind`);
+    } else {
+      extTarget = 'Deadlock.deadlock-coding';
+    }
 
     this.addInMountRCs(this.dirs.missionWorkdir, '.bashrc', '.zshrc');
 
@@ -114,7 +122,10 @@ export class MissionDevContainer {
         const devcontainer: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts> = {
           name: `deadlock-${this.mission.id}`,
           image,
-          extensions: ['Deadlock.deadlock-coding'],
+          containerEnv: {
+            WORKDIR: `${remoteMissionDir}`,
+          },
+          extensions: [extTarget],
           remoteUser: 'deadlock',
           mounts: this.mounts,
           userEnvProbe: 'interactiveShell',
diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts
index 15a2cf75af6c192e1a7b833f1c6a3d3919276fcc..e9f353467a38d7ecdf4ce3203fff0ae99666be8d 100644
--- a/deadlock-plugins/deadlock-extension/src/extension.ts
+++ b/deadlock-plugins/deadlock-extension/src/extension.ts
@@ -1,8 +1,10 @@
-import { window, ExtensionContext, workspace } from 'vscode';
+import { window, ExtensionContext, workspace, commands } from 'vscode';
 import Controller from './core/controller';
+import isDocker from './core/utils/isdocker';
 import { extensionError as error } from './recorder/utils/log';
 import { DepNodeProvider } from './theia/deadlockPanel';
 import UserConfigTheia from './theia/userConfigTheia';
+import { CommandTreeProvider } from './view/CommandTree';
 
 export const userConfig = new UserConfigTheia();
 
@@ -13,9 +15,14 @@ export async function activate(context: ExtensionContext) {
 
   const workspaceFolders = workspace.workspaceFolders?.toString() ?? '';
   if (!workspaceFolders) window.showInformationMessage('Pas de répertoires ouverts');
-  const deadlockPanelProvider = new DepNodeProvider(workspaceFolders);
+  const deadlockPanelProvider = new DepNodeProvider();
   window.registerTreeDataProvider('deadlockPanel', deadlockPanelProvider);
-
+  if (isDocker()) {
+    commands.executeCommand('setContext', 'deadlock.showCommands', true);
+    window.registerTreeDataProvider('commandTree', new CommandTreeProvider(context));
+  } else {
+    commands.executeCommand('setContext', 'deadlock.showCommands', false);
+  }
   try {
     await userConfig.init();
   } catch (e) {
diff --git a/deadlock-plugins/deadlock-extension/src/model/challengeYaml.ts b/deadlock-plugins/deadlock-extension/src/model/challengeYaml.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9991fe06f1ed40e07f82ba64ec3e187b9baa60a9
--- /dev/null
+++ b/deadlock-plugins/deadlock-extension/src/model/challengeYaml.ts
@@ -0,0 +1,20 @@
+interface ChallengeYaml {
+  version?: number;
+  name?: string;
+  label?: string;
+  description?: string;
+  level?: 'jedi';
+  type?: 'DESKTOP';
+  xp?: Map<string, number>;
+  desktop?: {
+    scripts: MissionCommand[];
+  };
+}
+
+export interface MissionCommand {
+  name: string;
+  command: string;
+  description?: string;
+}
+
+export default ChallengeYaml;
diff --git a/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts b/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts
index 3c81acd897012f29e75361013e32d6264755d3ae..f8a48cb423f5f66be71746cf96d8a2895190aef4 100644
--- a/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts
+++ b/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts
@@ -9,8 +9,6 @@ export class DepNodeProvider implements TreeDataProvider<Action> {
 
   readonly onDidChangeTreeData: Event<Action | undefined | void> = this._onDidChangeTreeData.event;
 
-  constructor(private workspaceRoot: string) {}
-
   refresh(): void {
     this._onDidChangeTreeData.fire();
   }
diff --git a/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a7e7c5b2a66382c5f0394ac6693310814ab4ad20
--- /dev/null
+++ b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts
@@ -0,0 +1,58 @@
+import isDocker from '../core/utils/isdocker';
+import ChallengeYaml, { MissionCommand as MissionCommandYaml } from '../model/challengeYaml';
+import { parse } from 'yaml';
+import { readFileSync } from 'fs';
+import { commands, ExtensionContext, ThemeColor, ThemeIcon, TreeDataProvider, TreeItem, window } from 'vscode';
+import { extensionLog } from '../recorder/utils/log';
+
+export class CommandTreeProvider implements TreeDataProvider<MissionCommand> {
+  challenge: ChallengeYaml;
+  context: ExtensionContext;
+  constructor(context: ExtensionContext) {
+    this.context = context;
+    if (isDocker()) {
+      this.challenge = parse(readFileSync('/deadlock/challenge.yaml', 'utf8'));
+    } else {
+      this.challenge = {};
+    }
+  }
+
+  getTreeItem(element: MissionCommand): TreeItem {
+    return element;
+  }
+
+  getChildren(element?: MissionCommand): Thenable<MissionCommand[]> {
+    if (element) {
+      return Promise.resolve([]);
+    } else {
+      return Promise.resolve(this.challenge.desktop?.scripts?.map((script) => new MissionCommand(script)) ?? []);
+    }
+  }
+}
+
+class MissionCommand extends TreeItem {
+  missionCommandYaml: MissionCommandYaml;
+  constructor(missionCommandYaml: MissionCommandYaml) {
+    super(missionCommandYaml.name);
+    this.missionCommandYaml = missionCommandYaml;
+    this.tooltip = missionCommandYaml.description;
+    this.description = missionCommandYaml.description;
+    this.iconPath = new ThemeIcon('notebook-execute', new ThemeColor('debugIcon.startForeground'));
+    commands.registerCommand(missionCommandYaml.name, () => {
+      const terminalName = `Deadlock`;
+      extensionLog(JSON.stringify(window.terminals));
+      const terminal =
+        window.terminals.filter((terminal) => terminal.name === terminalName)[0] ??
+        window.createTerminal({
+          cwd: process.env.WORKDIR,
+          name: terminalName,
+        });
+      terminal.sendText(missionCommandYaml.command);
+      terminal.show();
+    });
+    this.command = {
+      title: missionCommandYaml.name,
+      command: missionCommandYaml.name,
+    };
+  }
+}