Repository: stateful/vscode-runme
Pull request #977 (2023-11-22 18:22:13)

Redisqueryrunbook


Patch:
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 53e6174b..cf810461 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -21,6 +21,5 @@
   },
   "[javascriptreact]": {
     "editor.defaultFormatter": "esbenp.prettier-vscode"
-  },
-  "runme.server.lifecycleIdentity": 0
+  }
 }
diff --git a/examples/identity/empty-file.md b/examples/identity/empty-file.md
deleted file mode 100644
index e69de29b..00000000
diff --git a/examples/identity/existent-cell-id.md b/examples/identity/existent-cell-id.md
deleted file mode 100644
index 90642d89..00000000
--- a/examples/identity/existent-cell-id.md
+++ /dev/null
@@ -1,9 +0,0 @@
-## Existent ID
-
-Example file used as part of the end to end suite
-
-## Scenario
-
-```js { id=01HER3GA0RQKJETKK5X5PPRTB4 }
-console.log("Hello from JS")
-```
diff --git a/examples/identity/existent-doc-id.md b/examples/identity/existent-doc-id.md
deleted file mode 100644
index be3fff37..00000000
--- a/examples/identity/existent-doc-id.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-foo:
-  bar: baz
-runme:
-  id: 01HEJKW175Z0SYY4SJCA86J0TF
----
-
-## Document with id
-
-Example file used as part of the end to end suite
-
-## Scenario
-
-```js { name=foo }
-console.log("Always bet on JS!")
-```
diff --git a/examples/identity/shebang.md b/examples/identity/shebang.md
deleted file mode 100644
index 7f72168b..00000000
--- a/examples/identity/shebang.md
+++ /dev/null
@@ -1,10 +0,0 @@
-## Shebang
-
-Example file used as part of the end to end suite
-
-## Scenario
-
-```js { name=foo }
-console.log("Always bet on JS!")
-
-```
diff --git a/examples/redis/query.md b/examples/redis/query.md
new file mode 100644
index 00000000..abc4fbcd
--- /dev/null
+++ b/examples/redis/query.md
@@ -0,0 +1,161 @@
+---
+runme:
+  id: 01HFBZHZ5QQQXP99SE2TD4SC6G
+  version: v2.0
+---
+
+# Redis Query Runbook for Runme Cloud
+
+### Prerequisites:
+
+1. Access to GCP and the bastion host.
+2. SSH keys set up.
+3. Redis CLI installed on local machine and bastion host.
+
+This commands describes your redis instance
+
+```sh {"id":"01HFS20KP4P56TJR8SJ1R5E0RA","terminalRows":"26"}
+export REDIS_NAME="runme-redis"
+gcloud redis instances describe --region=us-central1 $REDIS_NAME
+```
+
+`runme-redis` change it to the name of your redis instance.
+
+### Setting Up SSH Tunnel:
+
+An SSH tunnel is a secure method of forwarding network traffic over an encrypted SSH connection. It's essential for connecting to Redis in cloud environments like GCP for several reasons: it encrypts data transmitted to the unsecured Redis service, ensures secure access without exposing Redis directly to the internet, and allows connection to Redis instances within private networks. This method is particularly useful for bypassing firewalls and NATs, making it easier and safer to manage Redis databases remotely.
+
+```sh
+# what's my jumphost?
+gcloud compute instances list
+```
+
+```sh {"background":"true","id":"01HFS20KP4P56TJR8SJ527NA6G"}
+export JUMP_HOST="eddie@34.172.87.12"
+export REDIS_HOST="10.161.121.6"
+ssh -L 16379:$REDIS_HOST:6379 $JUMP_HOST
+```
+
+Command: `ssh -L 16379:[REDIS_HOST]:6379 [USER]@[BASTION_HOST_IP]`
+
+### Connecting to Redis via SSH Tunnel:
+
+Note: Ensure the SSH tunnel is active. keep the terminal with the SSH tunnel open while using the Redis CLI.
+
+```sh {"background":"true","id":"01HFS20KP4P56TJR8SJ7KQE1C4"}
+redis-cli -p 16379
+```
+
+# Use Cases:
+
+## Checking Rate-Limiting Status
+
+checking the rate-limiting status typically involves querying a specific key to monitor how many requests a user has made within a set timeframe. This is crucial for implementing API rate limits, ensuring users don't exceed the number of allowed requests, thereby preventing abuse and maintaining server performance. Redis efficiently tracks and updates these counts due to its high-performance nature.
+
+```sh {"id":"01HFS20KP4P56TJR8SJ9ZFTSE8"}
+redis-cli -p 16379 GET rate_limit:12345
+```
+
+Command: `GET rate_limit:[user_id]`
+
+## Listing All Keys
+
+Get all the keys
+
+```sh {"id":"01HFS20KP4P56TJR8SJARQZD38"}
+redis-cli -p 16379 KEYS "*"
+```
+
+sidenote: The use of KEYS "*" can be resource-intensive on large databases and should be used cautiously in production environments.
+
+## Monitoring Redis Performance
+
+To get detailed statistics and information about the Redis server's performance and various metrics, use:
+
+```sh {"id":"01HFS20KP4P56TJR8SJDEWWDKS"}
+redis-cli -p 16379 INFO
+```
+
+sidenote: This command provides a lot of output, and users can specify sections like `INFO memory` for more targeted information
+
+## Managing Data
+
+### Setting a Key-Value Pair:
+
+```sh {"id":"01HFS20KP4P56TJR8SJDY9E68W"}
+redis-cli -p 16379 SET session_id abc123
+```
+
+Command: `SET [key] [value]`
+
+### Retrieving a Value by Key:
+
+To retrieve the value of key, use:
+
+```sh {"id":"01HFS20KP4P56TJR8SJHG8E60E"}
+redis-cli -p 16379 GET session_id
+```
+
+Command: `GET [key]`
+
+## Working with Lists
+
+### Adding Elements to a List:
+
+To add a value message1 to a list named messages, use:
+
+Command: `LPUSH [list] [value]`
+
+```sh {"id":"01HFS20KP4P56TJR8SJMHZTDQ5"}
+redis-cli -p 16379 LPUSH messages message1
+```
+
+## Managing Sets
+
+Adding Members to a Set
+
+Example Usage: To add a member user1 to a set named online_users, use:
+
+```sh {"id":"01HFS20KP4P56TJR8SJR26MWFW"}
+redis-cli -p 16379 SADD online_users user1
+```
+
+Command: `SADD [set] [member]`
+
+## Advanced Data Structures
+
+### HSET:
+
+To set a field age with value 30 in a hash user:1001, use:
+
+```sh {"id":"01HFS20KP4P56TJR8SJS8J1Y5V"}
+redis-cli -p 16379 HSET user:1001 age 30
+```
+
+### HGET:
+
+To get the value of age from user:1001, use
+
+```sh {"id":"01HFS20KP4P56TJR8SJWAGGHHG"}
+redis-cli -p 16379 HGET user:1001 age
+```
+
+## Administrative Commands
+
+### Flushing:
+
+To remove all data from all databases in the Redis server (use with caution)
+
+```sh {"id":"01HFS20KP4P56TJR8SJXWE6T1Z"}
+# uncomment if you're really sure
+# redis-cli -p 16379 FLUSHALL
+FLUSHALL
+```
+
+BGSAVE:
+
+To asynchronously save the dataset to disk, use:
+
+```sh {"id":"01HFS20KP4P56TJR8SJYYWEPN5"}
+redis-cli -p 16379 BGSAVE
+```
diff --git a/package-lock.json b/package-lock.json
index c99138f4..6f11c9b3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "runme",
-  "version": "2.1.0",
+  "version": "2.0.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "runme",
-      "version": "2.1.0",
+      "version": "2.0.0",
       "hasInstallScript": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -59,7 +59,6 @@
         "@wdio/local-runner": "^8.16.5",
         "@wdio/mocha-framework": "^8.16.3",
         "@wdio/spec-reporter": "^8.16.3",
-        "comment-json": "^4.2.3",
         "eslint": "^8.48.0",
         "eslint-config-prettier": "^9.0.0",
         "eslint-import-resolver-typescript": "^3.6.0",
@@ -8525,12 +8524,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/array-timsort": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
-      "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==",
-      "dev": true
-    },
     "node_modules/array-union": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -9910,22 +9903,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/comment-json": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz",
-      "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==",
-      "dev": true,
-      "dependencies": {
-        "array-timsort": "^1.0.3",
-        "core-util-is": "^1.0.3",
-        "esprima": "^4.0.1",
-        "has-own-prop": "^2.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/common-tags": {
       "version": "1.8.2",
       "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
@@ -13446,15 +13423,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/has-own-prop": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
-      "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/has-property-descriptors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
@@ -18203,15 +18171,6 @@
       "integrity": "sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==",
       "dev": true
     },
-    "node_modules/repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
diff --git a/package.json b/package.json
index d30167fe..d1b8f938 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "runme",
-  "version": "2.1.0",
+  "version": "2.0.0",
   "publisher": "stateful",
   "displayName": "Runme runs Markdown",
   "description": "Execute your runbooks, docs, and READMEs.",
@@ -187,20 +187,6 @@
         "command": "runme.addToRecommendedExtensions",
         "title": "Add Runme to recommended extensions",
         "category": "Runme"
-      },
-      {
-        "command": "runme.notebookAutoSaveOn",
-        "category": "Runme",
-        "title": "Click to disable saving terminal output automatically",
-        "icon": "$(stop-circle)",
-        "shortTitle": "Auto-Save (on)"
-      },
-      {
-        "command": "runme.notebookAutoSaveOff",
-        "category": "Runme",
-        "title": "Click to enable saving terminal output automatically",
-        "icon": "$(play-circle)",
-        "shortTitle": "Auto-Save (off)"
       }
     ],
     "menus": {
@@ -301,16 +287,6 @@
           "command": "runme.runCategory",
           "when": "notebookType == runme && notebookHasCategories",
           "group": "navigation"
-        },
-        {
-          "command": "runme.notebookAutoSaveOn",
-          "when": "notebookType == runme && notebookAutoSaveOn",
-          "group": "navigation"
-        },
-        {
-          "command": "runme.notebookAutoSaveOff",
-          "when": "notebookType == runme && !notebookAutoSaveOn",
-          "group": "navigation"
         }
       ],
       "notebook/cell/execute": [
@@ -603,15 +579,6 @@
             "default": true,
             "scope": "window",
             "markdownDescription": "Whether to open the folder/workspace in a new window or the same"
-          },
-          "runme.app.notebookAutoSave": {
-            "type": "string",
-            "enum": [
-              "yes",
-              "no"
-            ],
-            "default": "no",
-            "markdownDescription": "Automatically save cell execution output"
           }
         }
       }
@@ -852,7 +819,6 @@
     "@wdio/local-runner": "^8.16.5",
     "@wdio/mocha-framework": "^8.16.3",
     "@wdio/spec-reporter": "^8.16.3",
-    "comment-json": "^4.2.3",
     "eslint": "^8.48.0",
     "eslint-config-prettier": "^9.0.0",
     "eslint-import-resolver-typescript": "^3.6.0",
diff --git a/src/client/components/terminal/index.ts b/src/client/components/terminal/index.ts
index 113ac1c6..e175385d 100644
--- a/src/client/components/terminal/index.ts
+++ b/src/client/components/terminal/index.ts
@@ -41,7 +41,6 @@ const LISTEN_TO_EVENTS = [
   ClientMessages.onOptionsMessage,
   ClientMessages.optionsMessage,
   ClientMessages.onCopyTextToClipboard,
-  ClientMessages.onProgramClose,
 ]
 
 const ANSI_COLORS = [
@@ -68,7 +67,6 @@ const ANSI_COLORS = [
 export class TerminalView extends LitElement {
   protected copyText = 'Copy'
   protected shareText = 'Save'
-  protected saveText = 'Save'
   protected shareEnabledText = 'Share'
 
   static styles = css`
@@ -342,7 +340,7 @@ export class TerminalView extends LitElement {
   @property({ type: Number })
   lastLine?: number // TODO: Get the last line of the terminal and store it.
 
-  @property({ type: Boolean })
+  @property()
   isCloudApiLoading: boolean = false
 
   @property()
@@ -354,15 +352,12 @@ export class TerminalView extends LitElement {
   @property({ type: Boolean })
   enableShareButton: boolean = false
 
-  @property({ type: Boolean })
+  @property()
   isShareReady: boolean = false
 
-  @property({ type: Boolean })
+  @property()
   isUpdatedReady: boolean = false
 
-  @property({ type: Boolean })
-  isAutoSaveEnabled: boolean = false
-
   constructor() {
     super()
     this.windowSize = {
@@ -441,6 +436,7 @@ export class TerminalView extends LitElement {
                 return
               }
               if (e.type === ClientMessages.terminalStdout) {
+                this.shareText = 'Save'
                 this.isShareReady = false
                 this.terminal!.write(data)
                 this.requestUpdate()
@@ -509,14 +505,6 @@ export class TerminalView extends LitElement {
             }
             return postClientMessage(ctx, ClientMessages.infoMessage, 'Link copied!')
           }
-          case ClientMessages.onProgramClose: {
-            const { 'runme.dev/uuid': uuid } = e.output
-            if (uuid !== this.uuid || !this.isAutoSaveEnabled) {
-              return
-            }
-            this.shareText = this.isAutoSaveEnabled ? this.shareEnabledText : this.saveText
-            return this.#shareCellOutput()
-          }
         }
       }),
       this.terminal.onData((data) =>
diff --git a/src/client/index.ts b/src/client/index.ts
index 2a4d2d2b..036d5f19 100644
--- a/src/client/index.ts
+++ b/src/client/index.ts
@@ -110,13 +110,6 @@ export const activate: ActivationFunction = (context: RendererContext<void>) =>
             terminalElement.setAttribute('initialContent', payload.output.content)
           }
 
-          if (payload.output.isAutoSaveEnabled) {
-            terminalElement.setAttribute(
-              'isAutoSaveEnabled',
-              payload.output.isAutoSaveEnabled.toString(),
-            )
-          }
-
           element.appendChild(terminalElement)
           break
         case OutputType.error:
diff --git a/src/constants.ts b/src/constants.ts
index 0e048fcf..029f502c 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -30,7 +30,6 @@ export enum ClientMessages {
   onOptionsMessage = 'common:onOptionsMessage',
   copyTextToClipboard = 'common:copyTextToClipboard',
   onCopyTextToClipboard = 'common:onCopyTextToClipboard',
-  onProgramClose = 'common:onProgramClose',
   denoUpdate = 'deno:deploymentUpdate',
   denoPromote = 'deno:promoteDeployment',
   vercelProd = 'vercel:promotePreview',
@@ -143,7 +142,6 @@ export enum AuthenticationProviders {
 }
 export const NOTEBOOK_AVAILABLE_CATEGORIES = 'notebookAvailableCategories'
 export const NOTEBOOK_HAS_CATEGORIES = 'notebookHasCategories'
-export const NOTEBOOK_AUTOSAVE_ON = 'notebookAutoSaveOn'
 
 /**
  * https://gist.github.com/ppisarczyk/43962d06686722d26d176fad46879d41?permalink_comment_id=3949999#gistcomment-3949999
diff --git a/src/extension/__generated__/graphql.ts b/src/extension/__generated__/graphql.ts
index 6f012874..d99aadb6 100644
--- a/src/extension/__generated__/graphql.ts
+++ b/src/extension/__generated__/graphql.ts
@@ -53,8 +53,6 @@ export type AssistantSearchArgs = {
 
 export type CellExecution = {
   __typename?: 'CellExecution';
-  archivedTime?: Maybe<Scalars['DateTime']['output']>;
-  autoSave: Scalars['Boolean']['output'];
   createTime: Scalars['DateTime']['output'];
   exitCode: Scalars['Int']['output'];
   htmlUrl: Scalars['String']['output'];
@@ -74,7 +72,6 @@ export type CellExecution = {
 };
 
 export type CellExecutionInput = {
-  autoSave?: InputMaybe<Scalars['Boolean']['input']>;
   exitCode: Scalars['Int']['input'];
   input: Scalars['String']['input'];
   isPrivate?: InputMaybe<Scalars['Boolean']['input']>;
@@ -161,7 +158,6 @@ export type MetadataInput = {
 
 export type Mutation = {
   __typename?: 'Mutation';
-  archiveCellExecution?: Maybe<CellExecution>;
   createCellExecution?: Maybe<CellExecution>;
   deleteCellExecution?: Maybe<CellExecution>;
   deleteSlackInstallation?: Maybe<SlackInstallation>;
@@ -170,11 +166,6 @@ export type Mutation = {
 };
 
 
-export type MutationArchiveCellExecutionArgs = {
-  id: Scalars['String']['input'];
-};
-
-
 export type MutationCreateCellExecutionArgs = {
   data: CellExecutionInput;
 };
@@ -296,12 +287,6 @@ export type User = {
   update_time: Scalars['DateTime']['output'];
 };
 
-
-export type UserCellExecutionsArgs = {
-  archived?: InputMaybe<Scalars['Boolean']['input']>;
-  autoSave?: InputMaybe<Scalars['Boolean']['input']>;
-};
-
 export type CreateCellExecutionMutationVariables = Exact<{
   data: CellExecutionInput;
 }>;
diff --git a/src/extension/cell.ts b/src/extension/cell.ts
index 928975f8..40f57b54 100644
--- a/src/extension/cell.ts
+++ b/src/extension/cell.ts
@@ -14,7 +14,7 @@ import {
   WorkspaceEdit,
 } from 'vscode'
 
-import { NOTEBOOK_AUTOSAVE_ON, OutputType } from '../constants'
+import { OutputType } from '../constants'
 import { CellOutputPayload, DenoState, GitHubState, Serializer, VercelState } from '../types'
 import { Mutex } from '../utils/sync'
 import { getNotebookTerminalConfigurations, isRunmeAppButtonsEnabled } from '../utils/configuration'
@@ -26,7 +26,6 @@ import {
   NotebookTerminalType,
   XTermState,
 } from './terminal/terminalState'
-import ContextState from './contextState'
 
 const NOTEBOOK_SELECTION_COMMAND = '_notebook.selectKernel'
 
@@ -164,7 +163,6 @@ export class NotebookCellOutputManager {
               content: terminalState.serialize(),
               initialRows: terminalRows || terminalConfigurations.rows,
               enableShareButton: isRunmeAppButtonsEnabled(),
-              isAutoSaveEnabled: ContextState.getKey(NOTEBOOK_AUTOSAVE_ON),
               ...terminalConfigurations,
             },
           }
diff --git a/src/extension/commands/index.ts b/src/extension/commands/index.ts
index 52588d22..a8e13043 100644
--- a/src/extension/commands/index.ts
+++ b/src/extension/commands/index.ts
@@ -38,8 +38,6 @@ import RunmeServer from '../server/runmeServer'
 import { NotebookToolbarCommand } from '../../types'
 import getLogger from '../logger'
 import { RecommendExtensionMessage } from '../messaging'
-import { NOTEBOOK_AUTOSAVE_ON } from '../../constants'
-import ContextState from '../contextState'
 
 const log = getLogger('Commands')
 
@@ -307,7 +305,3 @@ export async function addToRecommendedExtensions(context: ExtensionContext) {
     'runme.recommendExtension': true,
   }).display()
 }
-
-export async function toggleAutosave(context: ExtensionContext, autoSaveIsOn: boolean) {
-  return ContextState.addKey(NOTEBOOK_AUTOSAVE_ON, autoSaveIsOn)
-}
diff --git a/src/extension/contextState.ts b/src/extension/contextState.ts
deleted file mode 100644
index cc74e84c..00000000
--- a/src/extension/contextState.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { commands } from 'vscode'
-
-type AllowedValueTypes = string | boolean | number
-
-export default class ContextState {
-  static keys: Map<string, AllowedValueTypes> = new Map<string, AllowedValueTypes>()
-
-  static async addKey(key: string, value: AllowedValueTypes) {
-    ContextState.keys.set(key, value)
-    return commands.executeCommand('setContext', key, value)
-  }
-
-  static getKey<T extends AllowedValueTypes>(key: string) {
-    return ContextState.keys.get(key) as T
-  }
-}
diff --git a/src/extension/executors/runner.ts b/src/extension/executors/runner.ts
index 185fad0f..b99e16c6 100644
--- a/src/extension/executors/runner.ts
+++ b/src/extension/executors/runner.ts
@@ -203,9 +203,6 @@ export async function executeRunner(
   })
 
   program.onDidClose((code) => {
-    postClientMessage(messaging, ClientMessages.onProgramClose, {
-      'runme.dev/uuid': cellUUID,
-    })
     if (!background) {
       return
     }
diff --git a/src/extension/extension.ts b/src/extension/extension.ts
index c473a412..aad8a446 100644
--- a/src/extension/extension.ts
+++ b/src/extension/extension.ts
@@ -38,7 +38,6 @@ import {
   runCellsByCategory,
   addToRecommendedExtensions,
   openRunmeSettings,
-  toggleAutosave,
 } from './commands'
 import { WasmSerializer, GrpcSerializer } from './serializer'
 import { RunmeLauncherProvider } from './provider/launcher'
@@ -235,12 +234,6 @@ export class RunmeExtension {
       ),
       createDemoFileRunnerForActiveNotebook(context, kernel),
       createDemoFileRunnerWatcher(context, kernel),
-      RunmeExtension.registerCommand('runme.notebookAutoSaveOn', () =>
-        toggleAutosave(context, false),
-      ),
-      RunmeExtension.registerCommand('runme.notebookAutoSaveOff', () =>
-        toggleAutosave(context, true),
-      ),
     )
     await await bootFile(context)
   }
diff --git a/src/extension/kernel.ts b/src/extension/kernel.ts
index d15c394b..5437f25e 100644
--- a/src/extension/kernel.ts
+++ b/src/extension/kernel.ts
@@ -43,7 +43,6 @@ import {
   setNotebookCategories,
   getTerminalRunmeId,
   suggestCategories,
-  handleNotebookAutosaveSettings,
 } from './utils'
 import { isShellLanguage } from './executors/utils'
 import './wasm/wasm_exec.js'
@@ -219,7 +218,6 @@ export class Kernel implements Disposable {
     const { uri } = notebookDocument
     const categories = await getNotebookCategories(this.context, uri)
     await commands.executeCommand('setContext', NOTEBOOK_HAS_CATEGORIES, !!categories.length)
-    await handleNotebookAutosaveSettings()
   }
 
   // eslint-disable-next-line max-len
diff --git a/src/extension/messages/cloudApiRequest/saveCellExecution.ts b/src/extension/messages/cloudApiRequest/saveCellExecution.ts
index 888a0b7c..bd4fea06 100644
--- a/src/extension/messages/cloudApiRequest/saveCellExecution.ts
+++ b/src/extension/messages/cloudApiRequest/saveCellExecution.ts
@@ -1,6 +1,6 @@
 import { TelemetryReporter } from 'vscode-telemetry'
 
-import { ClientMessages, NOTEBOOK_AUTOSAVE_ON } from '../../../constants'
+import { ClientMessages } from '../../../constants'
 import { ClientMessage, IApiMessage } from '../../../types'
 import { InitializeClient } from '../../api/client'
 import { getCellByUuId } from '../../cell'
@@ -9,7 +9,6 @@ import { postClientMessage } from '../../../utils/messaging'
 import { RunmeService } from '../../services/runme'
 import { CreateCellExecutionDocument } from '../../__generated__/graphql'
 import { Kernel } from '../../kernel'
-import ContextState from '../../contextState'
 
 type APIRequestMessage = IApiMessage<ClientMessage<ClientMessages.cloudApiRequest>>
 
@@ -62,7 +61,6 @@ export default async function saveCellExecution(
           pid,
           input: encodeURIComponent(cell.document.getText()),
           languageId: cell.document.languageId,
-          autoSave: ContextState.getKey<boolean>(NOTEBOOK_AUTOSAVE_ON),
           metadata: {
             mimeType: annotations.mimeType,
             name: annotations.name,
diff --git a/src/extension/utils.ts b/src/extension/utils.ts
index 0a4d283b..14e60a60 100644
--- a/src/extension/utils.ts
+++ b/src/extension/utils.ts
@@ -23,25 +23,17 @@ import { v5 as uuidv5 } from 'uuid'
 import getPort from 'get-port'
 import dotenv from 'dotenv'
 
-import {
-  CellAnnotations,
-  CellAnnotationsErrorResult,
-  NotebookAutoSaveSetting,
-  RunmeTerminal,
-  Serializer,
-} from '../types'
+import { CellAnnotations, CellAnnotationsErrorResult, RunmeTerminal, Serializer } from '../types'
 import { SafeCellAnnotationsSchema, CellAnnotationsSchema } from '../schema'
 import {
   AuthenticationProviders,
   NOTEBOOK_AVAILABLE_CATEGORIES,
   SERVER_ADDRESS,
   CATEGORY_SEPARATOR,
-  NOTEBOOK_AUTOSAVE_ON,
 } from '../constants'
 import {
   getEnvLoadWorkspaceFiles,
   getEnvWorkspaceFileOrder,
-  getNotebookAutoSave,
   getPortNumber,
   getTLSDir,
   getTLSEnabled,
@@ -54,7 +46,6 @@ import { ENV_STORE, DEFAULT_ENV, BOOTFILE, BOOTFILE_DEMO } from './constants'
 import { GrpcRunnerEnvironment } from './runner'
 import RunmeServer from './server/runmeServer'
 import { setCurrentCellExecutionDemo } from './handler/utils'
-import ContextState from './contextState'
 
 declare var globalThis: any
 
@@ -582,10 +573,3 @@ export function suggestCategories(categories: string[], title: string, placehold
     )
   })
 }
-
-export async function handleNotebookAutosaveSettings() {
-  const configAutoSaveSetting = getNotebookAutoSave()
-  const autoSaveIsOn = configAutoSaveSetting === NotebookAutoSaveSetting.Yes ? true : false
-  ContextState.addKey(NOTEBOOK_AUTOSAVE_ON, autoSaveIsOn)
-  await commands.executeCommand('setContext', NOTEBOOK_AUTOSAVE_ON, autoSaveIsOn)
-}
diff --git a/src/types.ts b/src/types.ts
index 08c7cb2a..06798c9c 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -122,7 +122,6 @@ interface Payload {
     content?: string
     initialRows?: number
     enableShareButton: boolean
-    isAutoSaveEnabled: boolean
   }
   [OutputType.github]?: GitHubState
 }
@@ -168,9 +167,6 @@ export interface ClientMessagePayload {
     ['runme.dev/uuid']: string
     terminalDimensions?: TerminalDimensions
   }
-  [ClientMessages.onProgramClose]: {
-    ['runme.dev/uuid']: string
-  }
   [ClientMessages.activeThemeChanged]: string
   [ClientMessages.openLink]: string
   [ClientMessages.closeCellOutput]: {
@@ -321,8 +317,3 @@ export interface IApiMessage<T extends ClientMessage<ClientMessages>> {
 export type ShellType = 'sh' | 'powershell' | 'cmd' | 'fish'
 
 export type ActiveTerminal = RunmeTerminal & { executionId: number; runmeId: string }
-
-export enum NotebookAutoSaveSetting {
-  Yes = 'yes',
-  No = 'no',
-}
diff --git a/src/utils/configuration.ts b/src/utils/configuration.ts
index 68c2ba3d..abb077e2 100644
--- a/src/utils/configuration.ts
+++ b/src/utils/configuration.ts
@@ -7,7 +7,6 @@ import { z } from 'zod'
 import { getAnnotations, isWindows } from '../extension/utils'
 import { SERVER_PORT } from '../constants'
 import { RunmeIdentity } from '../extension/grpc/serializerTypes'
-import { NotebookAutoSaveSetting } from '../types'
 
 const ACTIONS_SECTION_NAME = 'runme.actions'
 const SERVER_SECTION_NAME = 'runme.server'
@@ -76,9 +75,6 @@ const configurationSchema = {
     baseDomain: z.string().default(DEFAULT_RUNME_BASE_DOMAIN),
     enableShare: z.boolean().default(true),
     forceNewWindow: z.boolean().default(true),
-    notebookAutoSave: z
-      .enum([NotebookAutoSaveSetting.Yes, NotebookAutoSaveSetting.No])
-      .default(NotebookAutoSaveSetting.No),
   },
 }
 
@@ -342,10 +338,6 @@ const getForceNewWindowConfig = (): boolean => {
   return getCloudConfigurationValue('forceNewWindow', true)
 }
 
-const getNotebookAutoSave = (): NotebookAutoSaveSetting => {
-  return getCloudConfigurationValue('notebookAutoSave', NotebookAutoSaveSetting.No)
-}
-
 export {
   getPortNumber,
   getBinaryPath,
@@ -367,5 +359,4 @@ export {
   getRunmePanelIdentifier,
   isRunmeAppButtonsEnabled,
   getForceNewWindowConfig,
-  getNotebookAutoSave,
 }
diff --git a/walkthroughs/0-intro.md b/walkthroughs/0-intro.md
index 80b45ceb..d5130a1d 100644
--- a/walkthroughs/0-intro.md
+++ b/walkthroughs/0-intro.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJH9FJZR3CM4FABSH01
+  version: v2.0
+---
+
 # Why Runme?
 
 Thank you for interest in Runme 💟!
diff --git a/walkthroughs/1-features.md b/walkthroughs/1-features.md
index df0367ea..eb2a2391 100644
--- a/walkthroughs/1-features.md
+++ b/walkthroughs/1-features.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJH9FJZR3CM4C3VE08B
+  version: v2.0
+---
+
 # Key features
 
 Read all about Runme's features in the [official documentation](https://docs.runme.dev/features).
diff --git a/walkthroughs/2-annotations.md b/walkthroughs/2-annotations.md
index b005dde8..ed0b136d 100644
--- a/walkthroughs/2-annotations.md
+++ b/walkthroughs/2-annotations.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJG2DZZV3VX42KA0NW5
+  version: v2.0
+---
+
 # Cell configuration
 
 To provide the best possible README (interactive markdown) experience to your users, be sure to configure your document's cells.
diff --git a/walkthroughs/3-learn-more.md b/walkthroughs/3-learn-more.md
index 8a005bbf..8bbacf9f 100644
--- a/walkthroughs/3-learn-more.md
+++ b/walkthroughs/3-learn-more.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJEBFYW9W1CP7CX7W1C
+  version: v2.0
+---
+
 # Learn more
 
 Learn more about Runme by visiting the [official docs](https://docs.runme.dev) and subscribe to the official Runme [newsletter](https://runme.dev/list) to not miss any updates.
diff --git a/walkthroughs/welcome.md b/walkthroughs/welcome.md
index 8d91deb7..8928c479 100644
--- a/walkthroughs/welcome.md
+++ b/walkthroughs/welcome.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJDG9R0YG2H9C136NEC
+  version: v2.0
+---
+
 # ![Runme](https://runme.dev/runme_logo.svg "Runme") Welcome to Runme
 
 Runme is primary a VS Code extension that provides developers with the ability to navigate workflows center around code repositories by making Readme markdown files interactive and smart.


Test patch:
diff --git a/examples/test.md b/examples/test.md
index 18b3c09a..7bed5f73 100644
--- a/examples/test.md
+++ b/examples/test.md
@@ -15,7 +15,7 @@ This markdown file contains some custom examples to test the execution within a
 
 ## Shell Executions
 
-```sh {"background":"false","id":"01HF7B0KJM3HHFDVSX9YFTZ8PE","interactive":"false","name":"HelloWorld"}
+```sh {"background":"false","id":"01HF7B0KJM3HHFDVSX9YFTZ8PE","interactive":"false"}
 echo "Hello World!"
 ```
 
diff --git a/tests/e2e/helpers/index.ts b/tests/e2e/helpers/index.ts
index cd5599a8..e1563a5c 100644
--- a/tests/e2e/helpers/index.ts
+++ b/tests/e2e/helpers/index.ts
@@ -1,12 +1,5 @@
-import fs from 'node:fs/promises'
-import path from 'node:path'
-import cp from 'node:child_process'
-import url from 'node:url'
-
-import * as jsonc from 'comment-json'
 import clipboard from 'clipboardy'
 import type { Workbench } from 'wdio-vscode-service'
-import { Key } from 'webdriverio'
 
 /**
  * TODO: cannot get text, this is a bug in wdio integration...
@@ -64,64 +57,3 @@ export async function clearAllOutputs(workbench: Workbench) {
   await tryExecuteCommand(workbench, 'Notebook: Clear All Outputs')
   await tryExecuteCommand(workbench, 'Notebook: Clear Cell Outputs')
 }
-
-export async function updateSettings({
-  setting,
-  value,
-}: {
-  setting: string
-  value: string | boolean | number
-}) {
-  const documentPath = '/.vscode/settings.json'
-  const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-    return `${vscode.workspace.rootPath}${documentPath}`
-  }, documentPath)
-  const source = await fs.readFile(absDocPath, 'utf-8')
-  const settings = jsonc.parse(source) as any
-  settings[setting] = value
-  await fs.writeFile(absDocPath, jsonc.stringify(settings, null, 2))
-}
-
-export async function updateLifecycleIdentitySetting(value: number) {
-  return updateSettings({ setting: 'runme.server.lifecycleIdentity', value: value })
-}
-
-function sanitizeOutput(output: string) {
-  return output.trim().replace(/^\s+/gm, '')
-}
-
-export async function assertDocumentContains(absDocPath: string, matcher: string) {
-  const source = await fs.readFile(absDocPath, 'utf-8')
-  const savedContent = sanitizeOutput(source.toString()).split('\n')
-  const matcherParts = sanitizeOutput(matcher).split('\n')
-  for (let index = 0; index < savedContent.length; index++) {
-    if (savedContent[index].includes('"id":')) {
-      await expect(savedContent[index]).toMatch(JSON_ULID)
-    } else if (savedContent[index].includes('id:')) {
-      await expect(savedContent[index]).toMatch(FRONT_MATTER_ULID)
-    } else {
-      await expect(savedContent[index]).toMatch(matcherParts[index])
-    }
-  }
-}
-
-export function revertChanges(fileName: string) {
-  //revert changes we made during the test
-  const __dirname = path.dirname(url.fileURLToPath(import.meta.url))
-  const mdPath = path.resolve(__dirname, '..', '..', '..', 'examples', 'identity', fileName)
-  const settingsPath = path.resolve(__dirname, '..', '..', '..', '.vscode', 'settings.json')
-  cp.execSync(`git checkout -- ${mdPath} ${settingsPath}`)
-}
-
-const osPlatform = process.platform.toString()
-
-export function saveFile(browser: WebdriverIO.Browser): Promise<void> {
-  if (osPlatform.indexOf('darwin') > -1) {
-    browser.keys([Key.Command, 's'])
-  } else {
-  }
-  return browser.keys([Key.Control, 's'])
-}
-
-export const FRONT_MATTER_ULID = /id[:=] ([0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26})\s*/
-export const JSON_ULID = /\"id\":\"([0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26})\"/
diff --git a/tests/e2e/package-lock.json b/tests/e2e/package-lock.json
index e31c9ef8..c509d478 100644
--- a/tests/e2e/package-lock.json
+++ b/tests/e2e/package-lock.json
@@ -9,7 +9,6 @@
         "@wdio/local-runner": "^8.15.4",
         "@wdio/mocha-framework": "^8.15.4",
         "@wdio/spec-reporter": "^8.15.0",
-        "comment-json": "^4.2.3",
         "expect-webdriverio": "^4.2.7",
         "runme": "^3.0.1",
         "ts-node": "^10.9.1",
@@ -1311,11 +1310,6 @@
         "dequal": "^2.0.3"
       }
     },
-    "node_modules/array-timsort": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
-      "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="
-    },
     "node_modules/ast-types": {
       "version": "0.13.4",
       "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
@@ -2134,21 +2128,6 @@
         "node": "^12.20.0 || >=14"
       }
     },
-    "node_modules/comment-json": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz",
-      "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==",
-      "dependencies": {
-        "array-timsort": "^1.0.3",
-        "core-util-is": "^1.0.3",
-        "esprima": "^4.0.1",
-        "has-own-prop": "^2.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/compare-versions": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz",
@@ -3910,14 +3889,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/has-own-prop": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
-      "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/has-symbol-support-x": {
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
@@ -6783,14 +6754,6 @@
         "node": "*"
       }
     },
-    "node_modules/repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
diff --git a/tests/e2e/package.json b/tests/e2e/package.json
index 85998606..14176089 100644
--- a/tests/e2e/package.json
+++ b/tests/e2e/package.json
@@ -7,11 +7,10 @@
     "@wdio/local-runner": "^8.15.4",
     "@wdio/mocha-framework": "^8.15.4",
     "@wdio/spec-reporter": "^8.15.0",
-    "comment-json": "^4.2.3",
     "expect-webdriverio": "^4.2.7",
     "runme": "^3.0.1",
     "ts-node": "^10.9.1",
     "wdio-vscode-service": "^5.2.1",
     "webdriverio": "^8.15.4"
   }
-}
+}
\ No newline at end of file
diff --git a/tests/e2e/specs/identity/identity.empty-file.all.e2e.ts b/tests/e2e/specs/identity/identity.empty-file.all.e2e.ts
deleted file mode 100644
index 8d27bbf6..00000000
--- a/tests/e2e/specs/identity/identity.empty-file.all.e2e.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { Key } from 'webdriverio'
-
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Empty file with setting All (1)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/empty-file.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/empty-file.md')
-
-    await updateLifecycleIdentitySetting(1)
-    await reloadWindow()
-    await saveFile(browser)
-    await assertDocumentContains(absDocPath, '')
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('empty-file.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.empty-file.cell.e2e.ts b/tests/e2e/specs/identity/identity.empty-file.cell.e2e.ts
deleted file mode 100644
index 7d149987..00000000
--- a/tests/e2e/specs/identity/identity.empty-file.cell.e2e.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Key } from 'webdriverio'
-
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Empty file with setting Cell (3)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/empty-file.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/empty-file.md')
-
-    await updateLifecycleIdentitySetting(3)
-    await reloadWindow()
-    await saveFile(browser)
-    await assertDocumentContains(absDocPath, '')
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('empty-file.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.empty-file.document.e2e.ts b/tests/e2e/specs/identity/identity.empty-file.document.e2e.ts
deleted file mode 100644
index 6177c108..00000000
--- a/tests/e2e/specs/identity/identity.empty-file.document.e2e.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { Key } from 'webdriverio'
-
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Empty file with setting Document (2)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/empty-file.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/empty-file.md')
-
-    await updateLifecycleIdentitySetting(2)
-    await reloadWindow()
-    await saveFile(browser)
-    await assertDocumentContains(absDocPath, '')
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('empty-file.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.empty-file.none.e2e.ts b/tests/e2e/specs/identity/identity.empty-file.none.e2e.ts
deleted file mode 100644
index cae98029..00000000
--- a/tests/e2e/specs/identity/identity.empty-file.none.e2e.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Key } from 'webdriverio'
-
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Empty file with setting None (0)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/empty-file.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/empty-file.md')
-
-    await updateLifecycleIdentitySetting(0)
-    await reloadWindow()
-    await saveFile(browser)
-    await assertDocumentContains(absDocPath, '')
-  })
-
-  after(() => {
-    revertChanges('empty-file.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-cell.all.e2e.ts b/tests/e2e/specs/identity/identity.existent-cell.all.e2e.ts
deleted file mode 100644
index 26f4130c..00000000
--- a/tests/e2e/specs/identity/identity.existent-cell.all.e2e.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Cell with existent identity and setting All (1)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-cell-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-cell-id.md')
-
-    await updateLifecycleIdentitySetting(1)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Hello from JS")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `
-      ---
-      runme:
-        id: 01HEXJ9KWG7BYSFYCNKSRE4JZR
-        version: v2.0
-      ---
-
-      ## Existent ID
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"id":"01HER3GA0RQKJETKK5X5PPRTB4"}
-      console.log("Hello from JS")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-cell-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-cell.cell.e2e.ts b/tests/e2e/specs/identity/identity.existent-cell.cell.e2e.ts
deleted file mode 100644
index 8c72cff5..00000000
--- a/tests/e2e/specs/identity/identity.existent-cell.cell.e2e.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Cell with existent identity and setting cell only (3)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-cell-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-cell-id.md')
-
-    await updateLifecycleIdentitySetting(3)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Hello from JS")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `
-      ## Existent ID
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"id":"01HER3GA0RQKJETKK5X5PPRTB4"}
-      console.log("Hello from JS")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-cell-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-cell.document.e2e.ts b/tests/e2e/specs/identity/identity.existent-cell.document.e2e.ts
deleted file mode 100644
index 14836f70..00000000
--- a/tests/e2e/specs/identity/identity.existent-cell.document.e2e.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Cell with existent identity and setting document only (2)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-cell-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-cell-id.md')
-
-    await updateLifecycleIdentitySetting(2)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Hello from JS")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `
-      ---
-      runme:
-        id: 01HEXJ9KWG7BYSFYCNKSRE4JZR
-        version: v2.0
-      ---
-
-      ## Existent ID
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"id":"01HER3GA0RQKJETKK5X5PPRTB4"}
-      console.log("Hello from JS")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-cell-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-cell.none.e2e.ts b/tests/e2e/specs/identity/identity.existent-cell.none.e2e.ts
deleted file mode 100644
index f3adca08..00000000
--- a/tests/e2e/specs/identity/identity.existent-cell.none.e2e.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Cell with existent identity and setting None (0)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-cell-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-cell-id.md')
-
-    await updateLifecycleIdentitySetting(0)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Hello from JS")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `
-      ## Existent ID
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"id":"01HER3GA0RQKJETKK5X5PPRTB4"}
-      console.log("Hello from JS")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-cell-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-doc.all.e2e.ts b/tests/e2e/specs/identity/identity.existent-doc.all.e2e.ts
deleted file mode 100644
index 9986866a..00000000
--- a/tests/e2e/specs/identity/identity.existent-doc.all.e2e.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Document with existent identity and setting All (1)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-doc-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-doc-id.md')
-
-    await updateLifecycleIdentitySetting(1)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `---
-      foo:
-        bar: baz
-      runme:
-        id: 01HEJKW175Z0SYY4SJCA86J0TF
-        version: v2.0
-      ---
-
-      ## Document with id
-
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"id":"01HFA08N6F66WSG09RR9XEP0T6","name":"foo"}
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-doc-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-doc.cell.e2e.ts b/tests/e2e/specs/identity/identity.existent-doc.cell.e2e.ts
deleted file mode 100644
index 1c0d6ddc..00000000
--- a/tests/e2e/specs/identity/identity.existent-doc.cell.e2e.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Document with existent identity and setting Cell only (3)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-doc-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-doc-id.md')
-
-    await updateLifecycleIdentitySetting(3)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `---
-      foo:
-        bar: baz
-      runme:
-        id: 01HEJKW175Z0SYY4SJCA86J0TF
-      ---
-
-      ## Document with id
-
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"name":"foo"}
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-doc-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-doc.document.e2e.ts b/tests/e2e/specs/identity/identity.existent-doc.document.e2e.ts
deleted file mode 100644
index af4f2ef7..00000000
--- a/tests/e2e/specs/identity/identity.existent-doc.document.e2e.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import url from 'node:url'
-import path from 'node:path'
-import cp from 'node:child_process'
-
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import { assertDocumentContains, saveFile, updateSettings } from '../../helpers/index.js'
-
-const __dirname = path.dirname(url.fileURLToPath(import.meta.url))
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Document with existent identity and setting Document only (2)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-doc-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-doc-id.md')
-
-    await updateSettings({ setting: 'runme.server.lifecycleIdentity', value: 2 })
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `---
-      foo:
-        bar: baz
-      runme:
-        id: 01HEJKW175Z0SYY4SJCA86J0TF
-        version: v2.0
-      ---
-
-      ## Document with id
-
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"name":"foo"}
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    const mdPath = path.resolve(
-      __dirname,
-      '..',
-      '..',
-      '..',
-      '..',
-      'examples',
-      'identity',
-      'existent-doc-id.md',
-    )
-    cp.execSync(`git checkout -- ${mdPath}`)
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.existent-doc.none.e2e.ts b/tests/e2e/specs/identity/identity.existent-doc.none.e2e.ts
deleted file mode 100644
index c0faf519..00000000
--- a/tests/e2e/specs/identity/identity.existent-doc.none.e2e.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Document with existent identity and setting None (0)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/existent-doc-id.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not remove the front matter with the identity', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/existent-doc-id.md')
-
-    await updateLifecycleIdentitySetting(0)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `---
-      foo:
-        bar: baz
-      runme:
-        id: 01HEJKW175Z0SYY4SJCA86J0TF
-      ---
-
-      ## Document with id
-
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"name":"foo"}
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('existent-doc-id.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.shebang.all.e2e.ts b/tests/e2e/specs/identity/identity.shebang.all.e2e.ts
deleted file mode 100644
index 22083384..00000000
--- a/tests/e2e/specs/identity/identity.shebang.all.e2e.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Shebang with setting All (1)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/shebang.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should add identity to front matter and cell', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/shebang.md')
-
-    await updateLifecycleIdentitySetting(1)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `---
-      runme:
-        id: 01HEXJ9KWG7BYSFYCNKSRE4JZR
-        version: v2.0
-      ---
-
-      ## Shebang
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js { name=foo id=01HEXJ9KWG7BYSFYCNKVF0VWR6 }
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('shebang.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.shebang.cell.e2e.ts b/tests/e2e/specs/identity/identity.shebang.cell.e2e.ts
deleted file mode 100644
index c29a5b27..00000000
--- a/tests/e2e/specs/identity/identity.shebang.cell.e2e.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Shebang with setting Cell only (3)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/shebang.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should add identity to cell only', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/shebang.md')
-
-    await updateLifecycleIdentitySetting(3)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `
-      ## Shebang
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js { name=foo id=01HEXJ9KWG7BYSFYCNKVF0VWR6 }
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('shebang.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.shebang.document.e2e.ts b/tests/e2e/specs/identity/identity.shebang.document.e2e.ts
deleted file mode 100644
index 911cd862..00000000
--- a/tests/e2e/specs/identity/identity.shebang.document.e2e.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Shebang with setting Document only (2)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/shebang.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should add identity to front matter only', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/shebang.md')
-
-    await updateLifecycleIdentitySetting(2)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `---
-      runme:
-        id: 01HEXJ9KWG7BYSFYCNKSRE4JZR
-        version: v2.0
-      ---
-
-      ## Shebang
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"name":"foo"}
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('shebang.md')
-  })
-})
diff --git a/tests/e2e/specs/identity/identity.shebang.none.e2e.ts b/tests/e2e/specs/identity/identity.shebang.none.e2e.ts
deleted file mode 100644
index ddc04622..00000000
--- a/tests/e2e/specs/identity/identity.shebang.none.e2e.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { Key } from 'webdriverio'
-
-import { RunmeNotebook } from '../../pageobjects/notebook.page.js'
-import {
-  assertDocumentContains,
-  revertChanges,
-  saveFile,
-  updateLifecycleIdentitySetting,
-} from '../../helpers/index.js'
-
-async function reloadWindow() {
-  const workbench = await browser.getWorkbench()
-  await workbench.executeCommand('Developer: Reload Window')
-}
-async function removeAllNotifications() {
-  const workbench = await browser.getWorkbench()
-  const notifications = await workbench.getNotifications()
-  await Promise.all(notifications.map((notification) => notification.dismiss()))
-}
-
-describe('Test suite: Shebang with setting None (0)', async () => {
-  before(async () => {
-    await removeAllNotifications()
-  })
-
-  const notebook = new RunmeNotebook()
-  it('open identity markdown file', async () => {
-    await browser.executeWorkbench(async (vscode) => {
-      const doc = await vscode.workspace.openTextDocument(
-        vscode.Uri.file(`${vscode.workspace.rootPath}/examples/identity/shebang.md`),
-      )
-      return vscode.window.showNotebookDocument(doc, {
-        viewColumn: vscode.ViewColumn.Active,
-      })
-    })
-  })
-
-  it('selects Runme kernel', async () => {
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Select Notebook Kernel')
-    await browser.keys([Key.Enter])
-  })
-
-  it('should not add identity to front matter and cell', async () => {
-    const absDocPath = await browser.executeWorkbench(async (vscode, documentPath) => {
-      return `${vscode.workspace.rootPath}${documentPath}`
-    }, '/examples/identity/shebang.md')
-
-    await updateLifecycleIdentitySetting(0)
-    await reloadWindow()
-    await notebook.focusDocument()
-    const workbench = await browser.getWorkbench()
-    await workbench.executeCommand('Notebook: Focus First Cell')
-    await browser.keys([Key.Enter])
-    const cell = await notebook.getCell('console.log("Always bet on JS!")')
-    await cell.focus()
-    await saveFile(browser)
-
-    await assertDocumentContains(
-      absDocPath,
-      `
-      ## Shebang
-      Example file used as part of the end to end suite
-
-      ## Scenario
-
-      \`\`\`js {"name":"foo"}
-      console.log("Always bet on JS!")
-
-      \`\`\`
-
-      `,
-    )
-  })
-
-  after(() => {
-    //revert changes we made during the test
-    revertChanges('shebang.md')
-  })
-})
diff --git a/tests/e2e/wdio.conf.ts b/tests/e2e/wdio.conf.ts
index 6a45a63f..29e9cebe 100644
--- a/tests/e2e/wdio.conf.ts
+++ b/tests/e2e/wdio.conf.ts
@@ -57,7 +57,7 @@ export const config: Options.Testrunner = {
   // then the current working directory is where your `package.json` resides, so `wdio`
   // will be called from there.
   //
-  specs: ['./specs/**/*.e2e.ts'],
+  specs: ['./specs/*.e2e.ts'],
   // Patterns to exclude.
   exclude: [
     // 'path/to/excluded/files'
diff --git a/tests/extension/extension.test.ts b/tests/extension/extension.test.ts
index 15125459..1de80ffb 100644
--- a/tests/extension/extension.test.ts
+++ b/tests/extension/extension.test.ts
@@ -81,7 +81,7 @@ test('initializes all providers', async () => {
   await ext.initialize(context)
   expect(notebooks.registerNotebookCellStatusBarItemProvider).toBeCalledTimes(6)
   expect(workspace.registerNotebookSerializer).toBeCalledTimes(1)
-  expect(commands.registerCommand).toBeCalledTimes(29)
+  expect(commands.registerCommand).toBeCalledTimes(27)
   expect(window.registerTreeDataProvider).toBeCalledTimes(1)
   expect(window.registerUriHandler).toBeCalledTimes(1)
   expect(bootFile).toBeCalledTimes(1)