diff --git a/deadlock-plugins/deadlock-extension/.vscode/launch.json b/deadlock-plugins/deadlock-extension/.vscode/launch.json
index 5804f9844c910e98a765f602fea35e148b46b57e..fb0ffe18ee854332f33031fc5b847019dbd70a67 100644
--- a/deadlock-plugins/deadlock-extension/.vscode/launch.json
+++ b/deadlock-plugins/deadlock-extension/.vscode/launch.json
@@ -22,7 +22,7 @@
       "env": {
         "DL_MOUNT_EXTENSION": "true",
         // TODO: SETTING: replace with your own extension path
-        "EXTENSION_PATH": "${workspaceFolder}/deadlock-coding-0.1.14.vsix"
+        "EXTENSION_PATH": "${workspaceFolder}/deadlock-coding-0.1.18.vsix"
       },
       "preLaunchTask": "${defaultBuildTask}"
     },
@@ -35,7 +35,7 @@
       "env": {
         "DL_MOUNT_EXTENSION": "true",
         // TODO: SETTING: replace with your own extension path
-        "EXTENSION_PATH": "${workspaceFolder}/deadlock-coding-0.1.14.vsix"
+        "EXTENSION_PATH": "${workspaceFolder}/deadlock-coding-0.1.18.vsix"
       },
       "preLaunchTask": "tasks: build and watch"
     },
diff --git a/deadlock-plugins/deadlock-extension/package-lock.json b/deadlock-plugins/deadlock-extension/package-lock.json
index 10f23c6395922d10878a7ea3309d46fb84a9ae03..edd5752aea6414fd50c3b99074755e01cbd22a68 100644
--- a/deadlock-plugins/deadlock-extension/package-lock.json
+++ b/deadlock-plugins/deadlock-extension/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "deadlock-coding",
-  "version": "0.1.17",
+  "version": "0.1.18",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "deadlock-coding",
-      "version": "0.1.17",
+      "version": "0.1.18",
       "dependencies": {
         "@types/tar": "^6.1.1",
         "@vscode/webview-ui-toolkit": "^1.0.0",
diff --git a/deadlock-plugins/deadlock-extension/package.json b/deadlock-plugins/deadlock-extension/package.json
index d6a8c2717086733eaf0c076b293aeb68673aec4a..468b9d2100574c758a4097050056a43ebad7b167 100644
--- a/deadlock-plugins/deadlock-extension/package.json
+++ b/deadlock-plugins/deadlock-extension/package.json
@@ -1,7 +1,7 @@
 {
   "name": "deadlock-coding",
   "description": "Deadlock Coding",
-  "version": "0.1.17",
+  "version": "0.1.18",
   "publisher": "Deadlock",
   "icon": "media/logo.png",
   "engines": {
diff --git a/deadlock-plugins/deadlock-extension/src/core/api.service.ts b/deadlock-plugins/deadlock-extension/src/core/api.service.ts
index 703db95c00d0b36b28e76c73d6721e11ad07ee2b..ed2bcf2908f4af037e74afcf2aadbea28d55d37d 100644
--- a/deadlock-plugins/deadlock-extension/src/core/api.service.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/api.service.ts
@@ -2,13 +2,13 @@ import axios, { AxiosError, AxiosInstance } from 'axios';
 import { API_QUERY_REFERER, API_URL } from '../config';
 import { GiteaPublicProperties } from '../model/giteaPublicProperties.model';
 import { SshKeyPair } from '../model/sshKeyPair.model';
-import { extensionError as error } from '../recorder/utils/log';
 import { Attempt } from '../model/attempt';
 import Controller from './controller';
 import ExtensionStore from './extensionStore';
 import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection';
 import { MissionUser } from './mission/model/missionUser';
 import UserMission, { User } from './mission/model/userMission';
+import { error } from './utils/log';
 
 export default class ApiService {
   private axiosInstance: AxiosInstance;
diff --git a/deadlock-plugins/deadlock-extension/src/core/config.ts b/deadlock-plugins/deadlock-extension/src/core/config.ts
index 1c3a158013df241eb506d9b66ce540ccfd7fe2fa..ea506147e5e73c9c5acbcf54162a02357c8c26bc 100644
--- a/deadlock-plugins/deadlock-extension/src/core/config.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/config.ts
@@ -4,7 +4,11 @@ import isMissionStarted from './utils/mission.util';
 
 const deadlockConfigPath = join(homedir(), '.deadlock');
 
-export const userSshKeyFolderPath = join(deadlockConfigPath, '.ssh');
+export const deadlockPath = '/deadlock';
+
+export function getSshFolderPath() {
+  return isMissionStarted() ? join(deadlockPath, '.ssh') : join(deadlockConfigPath, '.ssh');
+}
 
 export const DOCS_PATH_IC = `${homedir()}/docs`;
 
@@ -14,9 +18,9 @@ export const GITEA_PATH_IC = '/project';
 
 export const MISSION_PATH_IC = `${homedir()}/mission`;
 
-export const MISSION_FILE_IC = join('/', 'deadlock', 'challenge.yaml');
+export const MISSION_FILE_IC = join(deadlockPath, 'challenge.yaml');
 
-export const DEADLOCK_WORKDIR_PATH = isMissionStarted() ? '/deadlock' : deadlockConfigPath;
+export const DEADLOCK_WORKDIR_PATH = isMissionStarted() ? deadlockPath : deadlockConfigPath;
 
 export const USER_MISSION_PATH = join('/home/config/user-challenge.json');
 
diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts
index 70082bee87eccfa7e4c7e31b1648cf628408ebca..1a91725c3307bd02c0887d43851f6d3968f225e6 100644
--- a/deadlock-plugins/deadlock-extension/src/core/controller.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts
@@ -3,11 +3,10 @@ import { CommandHandler } from './commandHandler';
 import ExtensionStore from './extensionStore';
 import KeycloakOAuth2DeviceFlowConnection from './keycloakOAuth2DeviceFlowConnection';
 import { MissionDevContainer } from './mission/missionDevContainer';
-import { extensionError, extensionLog as log, extensionWarn } from '../recorder/utils/log';
 import { Command, commands, ExtensionContext, Uri, window } from 'vscode';
 import { createSshKeyFiles } from './sshKeyManager';
 import { emptyDirectories, removeFilesOrDirectories } from '../recorder/utils/workdir';
-import { missionWorkdir, userSshKeyFolderPath } from './config';
+import { missionWorkdir, getSshFolderPath } from './config';
 import { hasStatusNumber } from './utils/typeguards';
 import { existsSync, mkdirSync, readdirSync, renameSync, rmSync, writeFileSync } from 'fs';
 import { extract } from 'tar';
@@ -19,6 +18,7 @@ import Mission from '../model/mission';
 import ApiService from './api.service';
 import StartedMissionsView from '../view/startedMissionsView';
 import AuthenticationView from '../view/authenticationView';
+import { error, log, warn } from './utils/log';
 
 export default class Controller {
   private static _instance: Controller;
@@ -73,7 +73,7 @@ export default class Controller {
       });
     } catch (e) {
       window.showErrorMessage(`Une erreur est survenue lors de la récupération de la solution`);
-      extensionError(e);
+      error(e);
     }
   }
 
@@ -109,28 +109,24 @@ export default class Controller {
 
   public async disconnect() {
     try {
-      await removeFilesOrDirectories(`${userSshKeyFolderPath}/id_rsa`, `${userSshKeyFolderPath}/id_rsa.pub`);
+      await removeFilesOrDirectories(`${getSshFolderPath()}/id_rsa`, `${getSshFolderPath()}/id_rsa.pub`);
     } catch (e) {
-      extensionWarn('Could not remove ssh key files');
-      extensionWarn(e);
+      warn('Could not remove ssh key files', e);
     }
     try {
       await emptyDirectories(missionWorkdir);
     } catch (e) {
-      extensionWarn('Could not empty mission workdir');
-      extensionWarn(e);
+      warn('Could not empty mission workdir', e);
     }
     try {
       await ExtensionStore.instance.clear();
     } catch (e) {
-      extensionWarn('Could not clear extension store');
-      extensionWarn(e);
+      warn('Could not clear extension store', e);
     }
     try {
       await clearDevContainers();
     } catch (e) {
-      extensionWarn('Could not clear dev containers');
-      extensionWarn(e);
+      warn('Could not clear dev containers', e);
     }
     AuthenticationView.instance.isAlreadyConnected = false;
   }
@@ -208,7 +204,7 @@ export default class Controller {
         await this.getSolution(missionId, revieweeId);
       } catch (e) {
         window.showErrorMessage(`Une erreur est survenue lors de la récupération de la solution`);
-        extensionError(e);
+        error(e);
       }
     }
 
@@ -218,7 +214,7 @@ export default class Controller {
       await missionDevcontainer.open();
     } catch (e) {
       window.showErrorMessage('Impossible de lancer la mission');
-      extensionError(e);
+      error(e);
     }
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts
index ff52c9b672f7dd3c7a32462fabd53480c1ff21a4..b31e026244c9d049b2e3bc9e57a776a392764222 100644
--- a/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/extensionStore.ts
@@ -1,5 +1,5 @@
 import { SecretStorage } from 'vscode';
-import { extensionLog as log } from '../recorder/utils/log';
+import { log } from './utils/log';
 import Controller from './controller';
 
 export default class ExtensionStore {
diff --git a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
index b7169e6781217a062b7810b739cd1e7fccc667b5..af69a29ab7923af5a5fbd62201da3122e4579141 100644
--- a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
@@ -1,10 +1,10 @@
 import { exec as execCallback } from 'child_process';
 import simpleGit, { SimpleGit, SimpleGitOptions } from 'simple-git';
-import { GITEA_PATH_IC } from './config';
-import { log as customizableLog, error as customizableError } from '../recorder/utils/log';
+import { GITEA_PATH_IC, getSshFolderPath } from './config';
 import { promisify } from 'util';
 import ApiService from './api.service';
 import UserMission from './mission/model/userMission';
+import { error, warn } from './utils/log';
 
 const exec = promisify(execCallback);
 
@@ -21,48 +21,35 @@ export default class GitMission {
     return GitMission._instance;
   }
 
-  private prefix = 'DEADLOCK-RECORDER';
   private git: SimpleGit;
 
   private constructor() {
     const options: Partial<SimpleGitOptions> = {
       baseDir: GITEA_PATH_IC,
       binary: 'git',
-      maxConcurrentProcesses: 2,
+      maxConcurrentProcesses: 1,
     };
 
     this.git = simpleGit(options);
   }
 
-  log(message: any, ...args: any[]) {
-    customizableLog(this.prefix, message, ...args);
-  }
-
-  error(message: any, ...args: any[]) {
-    customizableError(this.prefix, message, ...args);
-  }
-
   async setupSshAgent() {
     try {
       const gitea = await ApiService.instance.getGiteaPublicProperties();
-      await exec(`ssh-add /deadlock/.ssh/id_rsa`);
       await exec(`eval "$(ssh-agent -s)" && ssh-keyscan -p ${gitea.sshPort} -H ${gitea.sshHost} >> ~/.ssh/known_hosts`);
+      await exec(`ssh-add ${getSshFolderPath()}/id_rsa`);
     } catch (err) {
-      this.log(err);
-      if (err instanceof Error) {
-        if (err) {
-          this.error(err.message);
-          throw err;
-        }
-      } else {
-        this.log(`Unhandled error: ${err}`);
-        throw err;
-      }
+      error('Could not add ssh keys', err);
+      throw err;
     }
   }
 
   async forgetSshKeys() {
-    await exec(`ssh-add -d /deadlock/.ssh/id_rsa`);
+    try {
+      await exec(`ssh-add -d ${getSshFolderPath()}/id_rsa`);
+    } catch (err) {
+      warn('Could not remove ssh keys', err);
+    }
   }
 
   async getAuthor(): Promise<string> {
@@ -95,8 +82,8 @@ export default class GitMission {
 
       return Promise.resolve(this);
     } catch (e) {
-      this.error(e);
-      return Promise.reject(e);
+      error('Could not init git', e);
+      throw e;
     }
   }
 
@@ -111,7 +98,8 @@ export default class GitMission {
     try {
       return ((await this.git.remote([])) || '').replace(/(\r\n|\n|\r)/gm, '');
     } catch (e) {
-      this.error(e);
+      error('Could not read remote', e);
+      throw e;
     }
     return '';
   }
@@ -140,8 +128,8 @@ export default class GitMission {
     return this.git.checkout(['-b', branch]);
   }
 
-  createRemoteBranch(branch: Branch = 'master') {
-    return this.git.push(['-u', defaultRemote, branch]);
+  async createRemoteBranch(branch: Branch = 'master') {
+    return await this.git.push(['-u', defaultRemote, branch]);
   }
 
   setUpstream(branch: Branch = 'master') {
diff --git a/deadlock-plugins/deadlock-extension/src/core/keycloakOAuth2DeviceFlowConnection.ts b/deadlock-plugins/deadlock-extension/src/core/keycloakOAuth2DeviceFlowConnection.ts
index dd3adef7ff4d60de6b4d9384d3d05a18eb38aca6..fcd520dc3952471df41edcd80117c486a720da12 100644
--- a/deadlock-plugins/deadlock-extension/src/core/keycloakOAuth2DeviceFlowConnection.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/keycloakOAuth2DeviceFlowConnection.ts
@@ -9,12 +9,12 @@ import {
 } from '../config';
 import { HttpStatusCode } from '../customTypings/HttpStatusCode';
 import { TokenFetchErrorCode } from '../customTypings/KeycloakAPITypes';
-import { extensionError as err, extensionLog as log } from '../recorder/utils/log';
 import ExtensionStore from './extensionStore';
 import { commands, window } from 'vscode';
 import Controller from './controller';
 import isMissionStarted from './utils/mission.util';
 import { CommandHandler } from './commandHandler';
+import { error, log } from './utils/log';
 
 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = REJECT_UNAUTHORIZED ? '1' : '0';
 
@@ -72,14 +72,14 @@ export default class KeycloakOAuth2DeviceFlowConnection {
       }
       case HttpStatusCode.BAD_REQUEST: {
         const badRequestResponse = (await tokenValidationRequestResponse.json()) as FailedAuthenticationResponse;
-        err(`${badRequestResponse.error!}: ${badRequestResponse.error_description}`);
+        error(`${badRequestResponse.error!}: ${badRequestResponse.error_description}`);
         throw new Error(`${badRequestResponse.error}: ${badRequestResponse.error_description}`);
       }
       case HttpStatusCode.UNAUTHORIZED: {
         return Promise.resolve(false);
       }
       default: {
-        err(`Unhandled HTTP status: ${tokenValidationRequestResponseCode}`);
+        error(`Unhandled HTTP status: ${tokenValidationRequestResponseCode}`);
         throw new Error(`Unhandled HTTP status: ${tokenValidationRequestResponseCode}`);
       }
     }
@@ -195,7 +195,7 @@ export default class KeycloakOAuth2DeviceFlowConnection {
         }
 
         default: {
-          err(`Unhandled HTTP status: ${userAuthenticationRequestResponseCode}`);
+          error(`Unhandled HTTP status: ${userAuthenticationRequestResponseCode}`);
           throw new Error(`Unhandled HTTP status: ${userAuthenticationRequestResponseCode}`);
         }
       }
@@ -222,7 +222,7 @@ export default class KeycloakOAuth2DeviceFlowConnection {
             });
           Controller.instance.disconnect();
         }
-        err(`${badRequestResponse.error!}: ${badRequestResponse.error_description}`);
+        error(`${badRequestResponse.error!}: ${badRequestResponse.error_description}`);
         throw new Error('createUserAuthentication: ' + errorCode);
       }
       case TokenFetchErrorCode.authorization_pending: {
@@ -235,7 +235,7 @@ export default class KeycloakOAuth2DeviceFlowConnection {
         break;
       }
       default: {
-        err(`${badRequestResponse.error!}: ${badRequestResponse.error_description}`);
+        error(`${badRequestResponse.error!}: ${badRequestResponse.error_description}`);
         throw new Error(
           `Unhandled error code [ ${badRequestResponse.error!}: ${badRequestResponse.error_description} ]`,
         );
diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
index e99c61a74fe4994fdeb08e4b76ea6cd6f03ba08c..89167834d69f0cb2ed9e0e4c8543cfecbe86e9b2 100644
--- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts
@@ -1,4 +1,4 @@
-import { missionWorkdir, userSshKeyFolderPath } from '../config';
+import { missionWorkdir, getSshFolderPath } from '../config';
 import { Base, DockerfileSpecific, LifecycleScripts, VSCodespecific } from './model/devContainer';
 import { writeFile } from 'fs/promises';
 import { commands, Uri, window } from 'vscode';
@@ -9,9 +9,9 @@ import UserMission from './model/userMission';
 import { REGISTRY_MISSION_URL } from '../../config';
 import { getReviewedStudentWorkdirPath } from '../utils/mission.util';
 import { homedir } from 'os';
-import { extensionError } from '../../recorder/utils/log';
 import { createDirectories } from '../../recorder/utils/workdir';
 import Controller from '../controller';
+import { error } from '../utils/log';
 
 const remoteUserHomeDir = '/home/deadlock';
 const remoteMissionDir = `${remoteUserHomeDir}/mission/`;
@@ -21,10 +21,7 @@ const defaultSettings = {
   'terminal.integrated.profiles.linux': {
     bash: {
       path: '/bin/bash',
-      "args": [
-        "--init-file",
-        "/deadlock/init_bash_env.sh"
-      ]
+      args: ['--init-file', '/deadlock/init_bash_env.sh'],
     },
   },
 };
@@ -92,7 +89,7 @@ export class MissionDevContainer {
     try {
       await UserMission.writeFile(this.missionId, this.missionVersion, this.revieweeId, this.storyId);
     } catch (e) {
-      extensionError(e);
+      error(e);
       window.showErrorMessage(`Une erreur est survenue lors de la création du fichier userChallenge.json`);
     }
   }
@@ -112,7 +109,7 @@ export class MissionDevContainer {
   private async setupMounts() {
     this.mounts.splice(0, this.mounts.length);
     this.mounts.push(
-      `source=${userSshKeyFolderPath},target=/deadlock/.ssh,type=bind,consistency=cached,readonly`,
+      `source=${getSshFolderPath()},target=/deadlock/.ssh,type=bind,consistency=cached,readonly`,
       `source=${UserMission.getMissionUserFolder(
         this.missionId,
         this.revieweeId,
diff --git a/deadlock-plugins/deadlock-extension/src/core/sshKeyManager.ts b/deadlock-plugins/deadlock-extension/src/core/sshKeyManager.ts
index 7526d29da5f70472c7620e1d9038ad7fca97f645..ba3f54c5ac341f70e81d5068888637f9ed441229 100644
--- a/deadlock-plugins/deadlock-extension/src/core/sshKeyManager.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/sshKeyManager.ts
@@ -1,23 +1,23 @@
 import { existsSync, promises } from 'fs';
-import { userSshKeyFolderPath } from './config';
+import { getSshFolderPath } from './config';
 
 export function isSshKeyPairExist(): boolean {
   return isPrivateKeyExist() && isPublicKeyExist();
 }
 
 function isPublicKeyExist(): boolean {
-  return existsSync(`${userSshKeyFolderPath}/id_rsa.pub`);
+  return existsSync(`${getSshFolderPath()}/id_rsa.pub`);
 }
 
 function isPrivateKeyExist(): boolean {
-  return existsSync(`${userSshKeyFolderPath}/id_rsa`);
+  return existsSync(`${getSshFolderPath()}/id_rsa`);
 }
 
 export async function createSshKeyFiles(publicKey: string, privateKey: string) {
-  await createSshKeyFolderIfNotExist(userSshKeyFolderPath);
-  await promises.writeFile(`${userSshKeyFolderPath}/id_rsa.pub`, publicKey);
+  await createSshKeyFolderIfNotExist(getSshFolderPath());
+  await promises.writeFile(`${getSshFolderPath()}/id_rsa.pub`, publicKey);
 
-  await promises.writeFile(`${userSshKeyFolderPath}/id_rsa`, privateKey, { mode: 0o600 });
+  await promises.writeFile(`${getSshFolderPath()}/id_rsa`, privateKey, { mode: 0o600 });
 }
 
 async function createSshKeyFolderIfNotExist(sshKeyFolderPath) {
diff --git a/deadlock-plugins/deadlock-extension/src/core/utils/log.ts b/deadlock-plugins/deadlock-extension/src/core/utils/log.ts
new file mode 100644
index 0000000000000000000000000000000000000000..233ed0cfd64c275dba059288407b70ca545a4303
--- /dev/null
+++ b/deadlock-plugins/deadlock-extension/src/core/utils/log.ts
@@ -0,0 +1,15 @@
+const logTemplate = (logFunction: (_: any) => void, prefix: string, message: any, ...args: any[]) => {
+  console.log(`[${prefix}] ${message}`, ...args);
+};
+
+export function error(message: any, ...args: any[]) {
+  logTemplate(console.error, 'DEADLOCK-EXTENSION', message, ...args);
+}
+
+export function log(message: any, ...args: any[]) {
+  logTemplate(console.log, 'DEADLOCK-EXTENSION', message, ...args);
+}
+
+export function warn(message: any, ...args: any[]) {
+  logTemplate(console.warn, 'DEADLOCK-EXTENSION', message, ...args);
+}
diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts
index 8d4d648061eb980326ca07b43eef360d58e4a13f..f9399e576f8624af095087167272b68da3e989a2 100644
--- a/deadlock-plugins/deadlock-extension/src/extension.ts
+++ b/deadlock-plugins/deadlock-extension/src/extension.ts
@@ -1,12 +1,12 @@
 import { window, ExtensionContext, workspace, commands } from 'vscode';
 import Recorder from './recorder/recorder';
-import { extensionError as error } from './recorder/utils/log';
 import { DepNodeProvider } from './view/deadlockPanel';
 import { CommandTreeProvider } from './view/CommandTree';
 import Controller from './core/controller';
 import isMissionStarted from './core/utils/mission.util';
 import AuthenticationView from './view/authenticationView';
 import KeycloakOAuth2DeviceFlowConnection from './core/keycloakOAuth2DeviceFlowConnection';
+import { error } from './core/utils/log';
 
 export async function activate(context: ExtensionContext) {
   new Controller(context);
@@ -25,8 +25,7 @@ export async function activate(context: ExtensionContext) {
     try {
       Recorder.instance.run();
     } catch (e) {
-      error('Could not run recorder');
-      error(JSON.stringify(e));
+      error('Could not run recorder', e);
       window.showErrorMessage("Le recorder n'a pas pu être lancé");
     }
   } else {
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
index 20b1cd8b1b9fbf7ff8987b117bfac00b198fc9e0..20337527dcd7529b458b9780f3f63278ef7dbdbf 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
@@ -1,14 +1,14 @@
 import { ENABLE_AUTOMATIC_SAVE } from '../config';
 import GitMission from '../core/gitMission';
 import { MISSION_PATH_IC, GITEA_PATH_IC } from '../core/config';
-import { recorderError as error } from './utils/log';
 import AutomaticSave from './services/automatic-save';
 import { clearFilesExceptGit, copyProjectSources, renameTempToUserGitFiles } from './utils/workdir';
-import aquirePermissions from './utils/permission';
+import acquirePermissions from './utils/permission';
 import UserMission from '../core/mission/model/userMission';
 import ApiService from '../core/api.service';
 import { window } from 'vscode';
 import { pushOnCommitQueueIfNotReviewing } from './utils/gitea';
+import { error } from '../core/utils/log';
 
 export default class Recorder {
   private static _instance?: Recorder;
@@ -58,30 +58,28 @@ export default class Recorder {
 
   async run() {
     try {
-      await aquirePermissions();
+      await acquirePermissions();
       await GitMission.instance.init();
       const isStarted = await GitMission.instance.isRemoteRepoExist();
       await this.setupFromRemoteRepo(GitMission.instance);
       await this.setupProject(GitMission.instance);
       if (!isStarted) {
-        pushOnCommitQueueIfNotReviewing(GitMission.instance, 'Auto');
+        await pushOnCommitQueueIfNotReviewing(GitMission.instance, 'Auto');
       }
       if (!this.userMission.isReviewing()) {
         if (ENABLE_AUTOMATIC_SAVE) {
           new AutomaticSave(MISSION_PATH_IC, GitMission.instance);
         }
         try {
-          runTimer();
+          await runTimer();
         } catch (e) {
-          error('Error while setup automatic save');
-          error(e);
+          error('Error while setup automatic save', e);
         }
       } else {
         await GitMission.instance.forgetSshKeys();
       }
     } catch (e) {
-      error('Cannot setup user repo.');
-      error(e);
+      error('Cannot setup user repo.', e);
     }
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/gitea.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/gitea.ts
index d3aaa558cfd410a4a87e8ff132c1c38b590b3cf6..be3cdb5162bb615d5960e3b41ff2683d0df9df1e 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/utils/gitea.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/gitea.ts
@@ -6,10 +6,10 @@ import { existsSync, promises } from 'fs';
 import { join } from 'path';
 import { CommitResult, GitError } from 'simple-git';
 import { queue } from 'async';
-import { extensionWarn, recorderError as error, recorderLog as log } from './log';
 import { clearFilesExceptGit, copyGitUserFiles } from './workdir';
 import { copyFile } from 'fs/promises';
 import UserMission from '../../core/mission/model/userMission';
+import { error, log, warn } from '../../core/utils/log';
 
 const { readFile } = promises;
 
@@ -101,7 +101,7 @@ async function mergeMaster(gitMission: GitMission): Promise<CommitResult> {
 
 export async function getIgnorePatternFromIgnoreFile(ignoreFile: string): Promise<string[]> {
   if (!existsSync(ignoreFile)) {
-    extensionWarn(`${ignoreFile} not found`);
+    warn(`${ignoreFile} not found`);
     return ['.git'];
   }
 
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/log.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/log.ts
deleted file mode 100644
index e231a4d4999f462ac688208ef92393196b95fc9f..0000000000000000000000000000000000000000
--- a/deadlock-plugins/deadlock-extension/src/recorder/utils/log.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-export const log = (prefix: string, message: any, ...args: any[]) => {
-  if (args) {
-    console.log(`[${prefix}] ${message}`, ...args);
-  } else {
-    console.log(`[${prefix}] ${message}`);
-  }
-};
-
-export const warn = (prefix: string, message: any, ...args: any[]) => {
-  if (args) {
-    console.warn(`[${prefix}] ${message}`, ...args);
-  } else {
-    console.warn(`[${prefix}] ${message}`);
-  }
-};
-
-export const error = (prefix: string, message: any, ...args: any[]) => {
-  if (args) {
-    console.error(`[${prefix}] ${message}`, ...args);
-  } else {
-    console.error(`[${prefix}] ${message}`);
-  }
-};
-
-export function recorderError(message: any, ...args: any[]) {
-  error('DEADLOCK-RECORDER', message, ...args);
-}
-
-export function recorderLog(message: any, ...args: any[]) {
-  log('DEADLOCK-RECORDER', message, ...args);
-}
-
-export function extensionError(message: any, ...args: any[]) {
-  error('DEADLOCK-EXTENSION', message, ...args);
-}
-
-export function extensionLog(message: any, ...args: any[]) {
-  log('DEADLOCK-EXTENSION', message, ...args);
-}
-
-export function extensionWarn(message: any, ...args: any[]) {
-  warn('DEADLOCK-EXTENSION', message, ...args);
-}
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/permission.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/permission.ts
index 6ad541f556114e89549dda294079b4c6dbaa7dbd..cce9f6a7d6a9b96d2f76d00c344dad6cca26cb43 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/utils/permission.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/permission.ts
@@ -5,6 +5,6 @@ import { GITEA_PATH_IC } from '../../core/config';
 
 const exec = promisify(execCallback);
 
-export default async function aquirePermissions() {
+export default async function acquirePermissions() {
   await exec(`sudo chown -R ${userInfo().username} ${GITEA_PATH_IC}`);
 }
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
index 5bac1dfbe438f148dea7907a3a70c5417f7607fa..d8e228f542b79aeadb97d67854ecd14c1e426acd 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
@@ -1,10 +1,10 @@
 import { exec as execCallback, execSync } from 'child_process';
 import { copyFileSync, existsSync, PathLike, readdirSync, renameSync } from 'fs';
 import { join } from 'path';
-import { log } from './log';
 import { promisify } from 'util';
 import { mkdir, rm } from 'fs/promises';
 import Controller from '../../core/controller';
+import { log } from '../../core/utils/log';
 
 const exec = promisify(execCallback);
 const PREFIX = '[DEADLOCK-RECORDER]';
diff --git a/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts b/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
index 3277b2cbac8e4ce1ecfc402934a687af2361ee09..fafea1b6f84d5614ffeadc222de18d2a107d1600 100644
--- a/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
+++ b/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
@@ -3,12 +3,12 @@ import { existsSync, readdirSync, readFileSync } from 'fs';
 import { join } from 'path';
 import { Webview, WebviewView, WebviewViewProvider } from 'vscode';
 import Controller from '../core/controller';
-import { extensionWarn } from '../recorder/utils/log';
 import { getUri } from './webViewBase';
 import { missionWorkdir } from '../core/config';
 import { watch } from 'chokidar';
 import UserMission from '../core/mission/model/userMission';
 import { getExtensionUri } from '../recorder/utils/workdir';
+import { warn } from '../core/utils/log';
 
 export default class StartedMissionsView implements WebviewViewProvider {
   constructor() {
@@ -77,10 +77,10 @@ export default class StartedMissionsView implements WebviewViewProvider {
             );
             missionsHtml += `<vscode-button onclick="openMission('${userChallenge.missionId}')" class="item" appearance="primary">${userChallenge.missionId}</vscode-button>`;
           } catch (e) {
-            extensionWarn(`Failed to read user-challenge.json for mission ${mission}`);
+            warn(`Failed to read user-challenge.json for mission ${mission}`);
           }
         } else {
-          extensionWarn(`Folder '${mission}' has no user-challenge.json file so it is ignored.`);
+          warn(`Folder '${mission}' has no user-challenge.json file so it is ignored.`);
         }
       });