Repository: stateful/vscode-runme
Pull request #965 (2023-11-14 16:34:39)

Enable document and cell lifecycle identity
Switch default for v2 release.

PS: leave out `CONTRIBUTING.md` because it requires a runmejs release and fails CI/CD otherwise.


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cec85fbe..4a0c1f71 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KK9VT9C160A2WHEHERY
+  version: v2.0
+---
+
 # Change Log
 
 All notable changes to the "vscode-runme" extension can be gleaned from the project's [release page](https://github.com/stateful/vscode-runme/releases).
diff --git a/README.md b/README.md
index a869fdea..46b3beef 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KK8DED9E3ZYTZEFB4WF
+  version: v2.0
+---
+
 # [Runme](http://runme.dev) for [Visual Studio Code](https://code.visualstudio.com/) [![Tests](https://github.com/stateful/vscode-runme/actions/workflows/test.yml/badge.svg)](https://github.com/stateful/vscode-runme/actions/workflows/test.yml)
 
 This VS Code extension transparently opens markdown files (i.e. README.md) as runnable VS Code notebooks (with the click of a `play` button). Annotating markdown code blocks repo maintainers can enhance the interactive runbook-like experience of their markdown notebooks while they will continue to render properly in markdown viewers. Runme is [open source](https://docs.runme.dev/open-source) and licensed under APL2.0.
@@ -40,9 +46,10 @@ For instance, the following annotation will run the command in the background, g
     ```
 
 ## Configure Document-level Execution
+
 RUNME does not just retain frontmatter, it supports top-level settings that will affect all cells in the document.
 
-```
+``` {"id":"01HF7B0KK8DED9E3ZYTXMMAQFJ"}
 ---
 shell: bash
 # or
@@ -55,6 +62,7 @@ shell: /bin/ksh
 Check the complete list of configuration options at https://docs.runme.dev/configuration or take a look at the [examples](https://github.com/stateful/vscode-runme/tree/main/examples) which are also illustrated in [Runme's integration docs](https://docs.runme.dev/integrations).
 
 ## Frequently Asked Questions
+
 Chances are, you're not the first trailblazer to wander through here – someone might have already asked that burning question of yours, and we've got it covered. But hey, you might just be the pioneer with a fresh perspective! So feel free to ask away – your question could be the start of something new, and we're all ears! [Checkout out our official FAQ](https://docs.runme.dev/faq)
 
 ## Maturing Software
diff --git a/examples/CATEGORIES.md b/examples/CATEGORIES.md
index 9dd5c2ee..af709e44 100644
--- a/examples/CATEGORIES.md
+++ b/examples/CATEGORIES.md
@@ -1,4 +1,7 @@
 ---
+runme:
+  id: 01HF7B0KK745EFJMMTRV4WKYVK
+  version: v2.0
 sidebar_position: 1
 title: Examples
 ---
@@ -13,20 +16,20 @@ This markdown file contains some custom examples to test the execution within a
 
 ## Exclude from run all with Category
 
-```sh { background=false category=category-one excludeFromRunAll=false interactive=true }
+```sh {"background":"false","category":"category-one","excludeFromRunAll":"false","id":"01HF7B0KK745EFJMMTREDE931Y","interactive":"true"}
 echo "Hello I am excluded I won't show up with Run All!"
 ```
 
 ## Excluded from run all forced to false
 
-```sh { excludeFromRunAll=false interactive=false }
+```sh {"excludeFromRunAll":"false","id":"01HF7B0KK745EFJMMTRFHK2NYT","interactive":"false"}
 echo "Block line one not excluded 👀"
 echo "Block line two not excluded ether 🚀"
 ```
 
 ## Default no excluded from run all
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KK745EFJMMTRHAND3H3"}
 echo  "By default I am not excluded from run all"
 ```
 
@@ -36,19 +39,19 @@ This markdown file contains some custom examples to test the categories executio
 
 ## Without Category
 
-```sh
+```sh {"id":"01HF7B0KK745EFJMMTRMNVQQ8H"}
 echo "Hello, I don't have a category"
 ```
 
 ## Category one with multiple lines
 
-```sh { category=category-one }
+```sh {"category":"category-one","id":"01HF7B0KK745EFJMMTRQZ8MN1T"}
 echo "Block line one with category one 👀"
 echo "Block line two with category one as well 🚀"
 ```
 
 ## Category two
 
-```sh { category=category-two }
+```sh {"category":"category-two","id":"01HF7B0KK745EFJMMTRRKA8NG3"}
 echo "Category two single line"
 ```
diff --git a/examples/README.md b/examples/README.md
index 992a9e9d..7618b7dc 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -1,4 +1,7 @@
 ---
+runme:
+  id: 01HF7B0KK32HBQ9X4AC2GPMZG5
+  version: v2.0
 sidebar_position: 1
 title: Examples
 ---
@@ -13,13 +16,13 @@ This markdown file contains some custom examples to test the execution within a
 
 ## Shell Executions
 
-```sh { background=false interactive=true }
+```sh {"background":"false","id":"01HF7B0KK32HBQ9X4AAD3Z5V14","interactive":"true"}
 echo "Hello World!"
 ```
 
 ## More Shell
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4AAGXB2CT2","interactive":"false"}
 echo "Foo 👀"
 sleep 2
 echo "Bar 🕺"
@@ -29,19 +32,19 @@ echo "Loo 🚀"
 
 ## Background Task Example
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KK32HBQ9X4AAKVEJ745"}
 sleep 100000
 ```
 
 ## Complex Output
 
-```sh
+```sh {"id":"01HF7B0KK32HBQ9X4AAP28F8EB"}
 $ npm i -g webdriverio
 ```
 
 ## Stdin Example
 
-```sh
+```sh {"id":"01HF7B0KK32HBQ9X4AAT0019KB"}
 node ./scripts/stdin.js
 ```
 
@@ -49,7 +52,7 @@ node ./scripts/stdin.js
 
 You can also execute JavaScript inline:
 
-```js
+```js {"id":"01HF7B0KK32HBQ9X4AAW385HPB"}
 (function({ message }) {
     console.log(message)
 })({ message: 'Running javascript that outputs this message' })
@@ -57,7 +60,7 @@ You can also execute JavaScript inline:
 
 Or typescript:
 
-```typescript
+```typescript {"id":"01HF7B0KK32HBQ9X4AAXEVS9QR"}
 function unnest({ message }: { message: string }): void {
     console.log(message)
 }
@@ -71,19 +74,19 @@ Please see more examples, including configuration languages further down.
 
 Within single lines:
 
-```sh
+```sh {"id":"01HF7B0KK32HBQ9X4AAXYPNV60"}
 $ export DENO_ACCESS_TOKEN="<insert-token-here>"
 ```
 
 verify:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4AAYPPBDG4","interactive":"false"}
 echo "DENO_ACCESS_TOKEN: $DENO_ACCESS_TOKEN"
 ```
 
 Supports multiple lines where the export is just somewhere in between:
 
-```sh
+```sh {"id":"01HF7B0KK32HBQ9X4AAZWE9DQG"}
 echo "Auth token for service foo"
 export SERVICE_FOO_TOKEN="foobar"
 echo "Auth token for service bar"
@@ -92,33 +95,33 @@ export SERVICE_BAR_TOKEN="barfoo"
 
 verify:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4AB010AS08","interactive":"false"}
 echo "SERVICE_FOO_TOKEN: $SERVICE_FOO_TOKEN"
 echo "SERVICE_BAR_TOKEN: $SERVICE_BAR_TOKEN"
 ```
 
 Supports changes to `$PATH`:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4AB34NRQHK","interactive":"false"}
 export PATH="/some/path:$PATH"
 echo $PATH
 ```
 
 Supports piping content into an environment variable:
 
-```sh
+```sh {"id":"01HF7B0KK32HBQ9X4AB6WCR4PH"}
 export LICENSE=$(cat ../LICENSE)
 ```
 
 verify:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4AB7ZE5BAY","interactive":"false"}
 echo "LICENSE: $LICENSE"
 ```
 
 Support multiline exports:
 
-```sh
+```sh {"id":"01HF7B0KK32HBQ9X4ABBD8E6GF"}
 export PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
 MIIEpAIBAAKCAQEA04up8hoqzS1+
 ...
@@ -128,7 +131,7 @@ l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy==
 
 verify:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4ABDRDHXVN","interactive":"false"}
 echo "PRIVATE_KEY: $PRIVATE_KEY"
 ```
 
@@ -136,7 +139,7 @@ echo "PRIVATE_KEY: $PRIVATE_KEY"
 
 You can copy also results from the inline executed shell:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4ABF4VNRVT","interactive":"false"}
 openssl rand -base64 32
 ```
 
@@ -144,13 +147,13 @@ openssl rand -base64 32
 
 These are sometimes executable by default, like for python:
 
-```py
+```py {"id":"01HF7B0KK32HBQ9X4ABK1BJH8Z"}
 print("Hello World")
 ```
 
 Otherwise, execution can be set with the `interpreter` annotation, like so:
 
-```yaml { interpreter=cat }
+```yaml {"id":"01HF7B0KK32HBQ9X4ABPX5WTJ7","interpreter":"cat"}
 config:
   nested:
     para: true
@@ -158,23 +161,23 @@ config:
 
 Non-shell scripts can also access environment variables, and are run from the current working directory:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KK32HBQ9X4ABQF4TSTW","interactive":"false"}
 export YOUR_NAME=enter your name
 ```
 
-```javascript { name=echo-hello-js }
+```javascript {"id":"01HF7B0KK32HBQ9X4ABV1X0EHY","name":"echo-hello-js"}
 console.log(`Hello, ${process.env.YOUR_NAME}, from ${__dirname}!`)
 ```
 
 ## Curl an image
 
-```sh { interactive=false, mimeType=image/png }
+```sh {"id":"01HF7B0KK32HBQ9X4ABWJPGK6P","interactive":"false,","mimeType":"image/png"}
 curl -s https://lever-client-logos.s3.us-west-2.amazonaws.com/a8ff9b1f-f313-4632-b90f-1f7ae7ee807f-1638388150933.png
 ```
 
 ## Terminal Dimensions
 
-```sh { background=true closeTerminalOnSuccess=false }
+```sh {"background":"true","closeTerminalOnSuccess":"false","id":"01HF7B0KK32HBQ9X4ABZ04Z7V1"}
 watch -n 0.1 "
 echo Rows: \$(tput lines)
 echo Columns: \$(tput cols)
@@ -185,6 +188,6 @@ echo Columns: \$(tput cols)
 
 With [`antonmedv/fx`](https://github.com/antonmedv/fx) you can inspect JSON files interactively in Runme notebooks, e.g.:
 
-```sh { terminalRows=20 }
+```sh {"id":"01HF7B0KK32HBQ9X4ABZXDH898","terminalRows":"20"}
 curl -s "https://api.marquee.activecove.com/getWeather?lat=52&lon=10" | fx
 ```
diff --git a/examples/branchGPT.md b/examples/branchGPT.md
index dfbf1d3a..7ad8a3e4 100644
--- a/examples/branchGPT.md
+++ b/examples/branchGPT.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KK19BHGNZ0X1W17ZEYB
+  version: v2.0
+---
+
 # Enter BranchGPT
 
 [![](https://badgen.net/badge/Run%20this%20/Demo/5B3ADF?icon=https://runme.dev/runme_logo.svg)](https://runme.dev/api/runme?repository=https://github.com/stateful/vscode-runme.git&fileToOpen=examples/branchGPT.md)
@@ -10,14 +16,14 @@ Check out [this blog post](https://stateful.com/blog/branchgpt-ai-powered-branch
 
 On Windows, install via scoop (https://scoop.sh):
 
-```sh
+```sh {"id":"01HF7B0KK19BHGNZ0X1R6DYC4Q"}
 $ scoop bucket add stateful https://github.com/stateful/scoop-bucket.git
 $ scoop install stateful/runme
 ```
 
 On macOS, install via Homebrew (https://brew.sh):
 
-```sh
+```sh {"id":"01HF7B0KK19BHGNZ0X1RHE5KZF"}
 $ brew install stateful/tap/runme
 ```
 
@@ -27,7 +33,7 @@ Binaries are also available at https://github.com/stateful/runme/releases/latest
 
 Just enter some free-flow description and voilà, get some branch suggestions:
 
-```sh
+```sh {"id":"01HF7B0KK19BHGNZ0X1RZ0VZW3"}
 $ runme branchGPT
 ```
 
diff --git a/examples/enhance/README.md b/examples/enhance/README.md
index c70b9972..7faf6be8 100644
--- a/examples/enhance/README.md
+++ b/examples/enhance/README.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJZGJFJ7P0G9MAQCSM4
+  version: v2.0
+---
+
 # Enhance
 
 This project is a showcase for deploying apps with [Begin](https://begin.com/) and [Runme Extension](https://marketplace.visualstudio.com/items?itemName=stateful.runme).
@@ -10,7 +16,7 @@ Enhance is an HTML-first full-stack web framework that gives you everything you
 
 Before you start make sure to install the dependencies of the project:
 
-```sh
+```sh {"id":"01HF7B0KJZGJFJ7P0G8S5RSEM7"}
 npm install
 ```
 
@@ -18,13 +24,13 @@ npm install
 
 Start the project:
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJZGJFJ7P0G8VDRF7HP"}
 npm start
 ```
 
 Open the project in your browser:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJZGJFJ7P0G8Y5KNFZ1","interactive":"false"}
 open http://localhost:3333/
 ```
 
@@ -35,43 +41,43 @@ This will watch the project directory and restart as necessary.
 To deploy the `begin` project example you need to have `begin` CLI installed on your system. To
 install, please run:
 
-```sh { closeTerminalOnSuccess=false interactive=false }
+```sh {"closeTerminalOnSuccess":"false","id":"01HF7B0KJZGJFJ7P0G91HRZB7V","interactive":"false"}
 curl -sS https://dl.begin.com/install.sh | sh
 ```
 
 To check you have `begin` CLI installed, you can run the following command:
 
-```sh
+```sh {"id":"01HF7B0KJZGJFJ7P0G93127C4D"}
 begin version
 ```
 
 If you have `begin` CLI installed, but still not working, ensure that the CLI was added your `$PATH`:
 
-```sh
+```sh {"id":"01HF7B0KJZGJFJ7P0G95FKSDNC"}
 export BEGIN_INSTALL="$HOME/.begin"
 export PATH="$BEGIN_INSTALL:$PATH"
 ```
 
 To get started with Begin, once you have `begin` CLI installed and configured, you can log into your Begin account via:
 
-```sh
+```sh {"id":"01HF7B0KJZGJFJ7P0G98XACPWA"}
 begin login
 ```
 
 If you haven't deployed the application before, create one first via:
 
-```sh
+```sh {"id":"01HF7B0KJZGJFJ7P0G9BBD4J4K"}
 begin create
 ```
 
 The Begin CLI will store a new `appId` in your `.arc` file. Then you can run a deployment via:
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJZGJFJ7P0G9F2E6QD1"}
 begin deploy
 ```
 
 In order to review the status of the deployment you can run:
 
-```sh
+```sh {"id":"01HF7B0KJZGJFJ7P0G9GE4N06S"}
 begin deploy --status
 ```
diff --git a/examples/fresh/README.md b/examples/fresh/README.md
index 172fa413..d9ef9709 100644
--- a/examples/fresh/README.md
+++ b/examples/fresh/README.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJX64XJR1HW3PDMFPZ0
+  version: v2.0
+---
+
 # Fresh
 
 This project is a showcase for deploying apps with Deno and [Runme Extension](https://marketplace.visualstudio.com/items?itemName=stateful.runme).
@@ -9,33 +15,33 @@ run.
 
 You can test if you already have deno installed by running the following command:
 
-```sh { closeTerminalOnSuccess=false interactive=false }
+```sh {"closeTerminalOnSuccess":"false","id":"01HF7B0KJX64XJR1HW31ZWFYMK","interactive":"false"}
 deno --version
 ```
 
 To update a previously installed version of Deno, run:
 
-```sh
+```sh {"id":"01HF7B0KJX64XJR1HW323R0KBD"}
 deno upgrade
 ```
 
 To install Deno via homebrew on macOS:
 
-```sh
+```sh {"id":"01HF7B0KJX64XJR1HW3516T0RA"}
 # macOS
 brew bundle --no-lock
 ```
 
 Or the installer which also works on Linux:
 
-```sh
+```sh {"id":"01HF7B0KJX64XJR1HW38G7MJXA"}
 # macOS or Linux
 curl -fsSL https://deno.land/x/install/install.sh | sh
 ```
 
 Once Deno is installed, ensure is added to your path:
 
-```sh
+```sh {"id":"01HF7B0KJX64XJR1HW3AM7VV7D"}
 export DENO_INSTALL="$HOME/.deno"
 export PATH="$DENO_INSTALL/bin:$PATH"
 ```
@@ -44,13 +50,13 @@ export PATH="$DENO_INSTALL/bin:$PATH"
 
 Start the project:
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJX64XJR1HW3BYK8SZE"}
 deno task start
 ```
 
 Open the project in your browser:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJX64XJR1HW3F9FC7H0","interactive":"false"}
 open http://localhost:8000/
 ```
 
@@ -63,7 +69,7 @@ We will be using [Deno deploy](https://deno.com/deploy) a serverless edge first
 To deploy this project you need to have `deployctl` (the command line tool for Deno Deploy) installed on your system. To
 install, please run:
 
-```sh { closeTerminalOnSuccess=false interactive=false }
+```sh {"closeTerminalOnSuccess":"false","id":"01HF7B0KJX64XJR1HW3HHTQDS9","interactive":"false"}
 deno install \
   --allow-read --allow-write \
   --allow-env --allow-net --allow-run \
@@ -75,7 +81,7 @@ Once installed successfully, create a
 [new access token](https://dash.deno.com/account#access-tokens) and export it
 into your environment:
 
-```sh
+```sh {"id":"01HF7B0KJX64XJR1HW3KQ95EFN"}
 echo "Set up your deno environment"
 export DENO_PROJECT_NAME="<insert-project-name>"
 export DENO_ACCESS_TOKEN="<insert-token-here>"
@@ -83,7 +89,7 @@ export DENO_ACCESS_TOKEN="<insert-token-here>"
 
 then you can run a preview deployment and subsequently promote it to production via:
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJX64XJR1HW3MG37X12"}
 deployctl deploy \
     --project=$DENO_PROJECT_NAME \
     --exclude=node_modules \
diff --git a/examples/frontmatter/skipPrompts/DISABLED.md b/examples/frontmatter/skipPrompts/DISABLED.md
index 56672e10..b06ac4ff 100644
--- a/examples/frontmatter/skipPrompts/DISABLED.md
+++ b/examples/frontmatter/skipPrompts/DISABLED.md
@@ -1,12 +1,16 @@
 ---
+runme:
+  id: 01HF7B0KJWYTVQEAZ3GD0P4E91
+  version: v2.0
 skipPrompts: false
 ---
 
 ## Runme frontmatter example
+
 This markdown file contains some custom examples to test the execution within a VS Code Notebook.
 
 ## Using skipPrompts = false
 
-```sh
+```sh {"id":"01HF7B0KJWYTVQEAZ3GCQP5DPS"}
 export ENV="<insert-env-here>"
 ```
diff --git a/examples/frontmatter/skipPrompts/ENABLED.md b/examples/frontmatter/skipPrompts/ENABLED.md
index 4bd151af..1025678d 100644
--- a/examples/frontmatter/skipPrompts/ENABLED.md
+++ b/examples/frontmatter/skipPrompts/ENABLED.md
@@ -1,4 +1,7 @@
 ---
+runme:
+  id: 01HF7B0KJWYTVQEAZ3GA7C3H8H
+  version: v2.0
 skipPrompts: true
 ---
 
@@ -8,10 +11,10 @@ This markdown file contains some custom examples to test the execution within a
 
 ## Using skipPrompts = true
 
-```sh
+```sh {"id":"01HF7B0KJWYTVQEAZ3G67T0MBD"}
 export ENV="dev"
 ```
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJWYTVQEAZ3G91BTEHW","interactive":"false"}
 echo $ENV
 ```
diff --git a/examples/hardening/server.md b/examples/hardening/server.md
index ea6aa89b..6f7adbf5 100644
--- a/examples/hardening/server.md
+++ b/examples/hardening/server.md
@@ -1,10 +1,16 @@
+---
+runme:
+  id: 01HF7B0KJV2FA10WJP6RHKEJTE
+  version: v2.0
+---
+
 [![](https://badgen.net/badge/Open%20with/Runme/5B3ADF?icon=https://runme.dev/img/logo.svg)](https%3A%2F%2Fgithub.com%2Fstateful%2Fhardening-ubuntu-server%2Fblob%2Fmain%2FREADME.md)
 
 ### Update and Upgrade the System
 
 Ensure that all the packages and the system are up to date.
 
-```sh
+```sh {"id":"01HF7B0KJV2FA10WJP6E14WW7T"}
 sudo apt update && sudo apt upgrade -y
 sudo apt dist-upgrade
 sudo reboot
@@ -14,7 +20,7 @@ sudo reboot
 
 Enable and configure UFW (Uncomplicated Firewall) to only allow necessary services.
 
-```sh
+```sh {"id":"01HF7B0KJV2FA10WJP6GCGST72"}
 sudo apt install -y ufw
 sudo ufw default deny incoming
 sudo ufw default allow outgoing
@@ -26,7 +32,7 @@ sudo ufw enable
 
 Fail2Ban protects against brute-force attacks.
 
-```sh
+```sh {"id":"01HF7B0KJV2FA10WJP6J6QKFQV"}
 sudo apt install -y fail2ban
 sudo systemctl enable fail2ban
 sudo systemctl start fail2ban
@@ -36,7 +42,7 @@ sudo systemctl start fail2ban
 
 Install unattended-upgrades to automate security updates.
 
-```sh
+```sh {"id":"01HF7B0KJV2FA10WJP6NMPQ2DB"}
 sudo apt install -y unattended-upgrades
 sudo dpkg-reconfigure --priority=low unattended-upgrades
 ```
@@ -45,7 +51,7 @@ sudo dpkg-reconfigure --priority=low unattended-upgrades
 
 Auditd helps in maintaining a record of system events.
 
-```sh
+```sh {"id":"01HF7B0KJV2FA10WJP6NQEF7ET"}
 sudo apt install -y auditd
 sudo systemctl enable auditd
 sudo systemctl start auditd
@@ -56,6 +62,6 @@ sudo systemctl start auditd
 
 Shared memory can be used in an attack against a running service, so it’s important to secure it.
 
-```sh
+```sh {"id":"01HF7B0KJV2FA10WJP6QG9S9HJ"}
 echo "tmpfs     /run/shm     tmpfs     defaults,noexec,nosuid     0     0" | sudo tee -a /etc/fstab
 ```
\ No newline at end of file
diff --git a/examples/k8s/README.md b/examples/k8s/README.md
index b7f90afb..91a4813e 100644
--- a/examples/k8s/README.md
+++ b/examples/k8s/README.md
@@ -1,4 +1,11 @@
+---
+runme:
+  id: 01HF7B0KJS30GAG33WMDGDMN4Z
+  version: v2.0
+---
+
 # Deploying a Dockerized React App to Kubernetes Cluster
+
 Learn how to dockerize a React App and deploy it to a Kubernetes cluster with Linkerd.
 Using the Linkerd CLI, you’ll install the control plane onto your Kubernetes cluster. Finally, you’ll “mesh” a application by adding Linkerd’s data plane to it.
 
@@ -12,13 +19,13 @@ Using the Linkerd CLI, you’ll install the control plane onto your Kubernetes c
 
 ### Build Docker image
 
-```sh { name=docker-build }
+```sh {"id":"01HF7B0KJS30GAG33WK5CH9YVB","name":"docker-build"}
 $ docker build -t runme/demo .
 ```
 
 ### Run image locally to make sure it works
 
-```sh { name=docker-run interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WK740D96X","interactive":"false","name":"docker-run"}
 $ export RUNME_CID=$(docker run -d -p 3000:3000 runme/demo:latest)
 $ echo "Container running with ID $RUNME_CID"
 ```
@@ -27,19 +34,19 @@ $ echo "Container running with ID $RUNME_CID"
 
 And see it running:
 
-```sh { name=open-app interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WKA42240S","interactive":"false","name":"open-app"}
 open http://localhost:3000
 ```
 
 then stop the container:
 
-```sh { name=docker-inspect interactive=false mimeType=text/x-json promptEnv=false }
+```sh {"id":"01HF7B0KJS30GAG33WKDTT0MTT","interactive":"false","mimeType":"text/x-json","name":"docker-inspect","promptEnv":"false"}
 $ docker inspect $RUNME_CID | jq ".[0].State"
 ```
 
 Stop the container via:
 
-```sh { name=docker-stop interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WKDYQZJDZ","interactive":"false","name":"docker-stop"}
 $ docker stop $RUNME_CID > /dev/null && echo "Stopped container with ID $RUNME_CID"
 ```
 
@@ -47,49 +54,49 @@ $ docker stop $RUNME_CID > /dev/null && echo "Stopped container with ID $RUNME_C
 
 ### Install Linkerd
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WKDZ3D48Z"}
 brew install linkerd
 ```
 
 Setup Linkerd in the cluster, via:
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WKEH2TKW9"}
 linkerd install --crds | kubectl apply -f -
 ```
 
 and
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WKFPJ4R3E"}
 linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
 ```
 
 ### Build a config file for the deployment of the image onto the cluster
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WKKE9JGGM","interactive":"false"}
 kubectl create -f k8deployment.yaml --save-config
 ```
 
 ### View Kubernetes deployments to see if the app was deployed to your cluster and see status
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WKKS1B6JP","interactive":"false"}
 $ kubectl get deployments
 ```
 
 ### View Kubernetes pods to verify pods/replicas are running
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WKPBYB8NW","interactive":"false"}
 $ kubectl get pods
 ```
 
 ### Verify logs in pod to see if the server for React app started
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJS30GAG33WKSZSW573","interactive":"false"}
 $ kubectl logs $(kubectl get pods -o=jsonpath='{.items[0].metadata.name}')
 ```
 
 ### Port forward service
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJS30GAG33WKT03EY1X"}
 $ export SERVICE_NAME="runme-demo"
 $ kubectl port-forward services/$SERVICE_NAME 3000:3000 -n default
 ```
@@ -98,13 +105,13 @@ $ kubectl port-forward services/$SERVICE_NAME 3000:3000 -n default
 
 You can view what the final web app looks like here:
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WKT3S5SDY"}
 open http://localhost:3000/
 ```
 
 ### Inject Linkerd
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WKTXPXZN2"}
 kubectl get -n default deploy -o yaml \
   | linkerd inject - \
   | kubectl apply -f -
@@ -112,32 +119,32 @@ kubectl get -n default deploy -o yaml \
 
 Install viz extension:
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WKXW15WTM"}
 linkerd viz install | kubectl apply -f - # install the on-cluster metrics stack
 ```
 
 Start Dashboard:
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJS30GAG33WM1NJY7YR"}
 linkerd viz dashboard --verbose
 ```
 
 ### Cleanup everything:
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WM5310TSF"}
 $ kubectl get -n default deploy -o yaml \
   | linkerd uninject - \
   | kubectl delete -f -
 ```
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WM5JFSSVB"}
 $ kubectl delete -f k8deployment.yaml
 ```
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WM7VKEQHM"}
 $ linkerd viz uninstall | kubectl delete -f -
 ```
 
-```sh
+```sh {"id":"01HF7B0KJS30GAG33WMB774NNA"}
 $ linkerd uninstall | kubectl delete -f -
 ```
diff --git a/examples/shebang.md b/examples/shebang.md
index bd0b5970..5da0bb86 100644
--- a/examples/shebang.md
+++ b/examples/shebang.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJQ8625WYMCRVJADMQF
+  version: v2.0
+---
+
 # Runme Language Support
 
 By default Runme can run everything that is also installed on your machine.
@@ -5,13 +11,13 @@ Read more in our [docs](https://docs.runme.dev/features#interpreter)
 
 ## Like Python:
 
-```py
+```py {"id":"01HF7B0KJQ8625WYMCRHW1XHEG"}
 print("Hello Pythonista 🐍")
 ```
 
 ## maybe Ruby?
 
-```rb
+```rb {"id":"01HF7B0KJQ8625WYMCRHW9YEKE"}
 # Open up the String class to add a new method
 class String
   # Define a new method to reverse the words in a string
@@ -28,7 +34,7 @@ puts "Reversed words: #{sentence.reverse_words}"
 
 ## or JavaScript:
 
-```js
+```js {"id":"01HF7B0KJQ8625WYMCRNP9C0RE"}
 console.log("Always bet on JS!")
 ```
 
@@ -36,13 +42,13 @@ console.log("Always bet on JS!")
 
 Make sure you have `ts-node` installed globally:
 
-```sh
+```sh {"id":"01HF7B0KJQ8625WYMCRQCT1F71"}
 npm i -g ts-node
 ```
 
 then run:
 
-```ts
+```ts {"id":"01HF7B0KJQ8625WYMCRRMQ8MVX"}
 const myVar: string = 'I am a typed string!'
 console.log(myVar)
 ```
@@ -51,7 +57,7 @@ console.log(myVar)
 
 Be sure to have the `php` interpreter in your `$PATH`:
 
-```php { interpreter=php }
+```php {"id":"01HF7B0KJQ8625WYMCRVAXDNGJ","interpreter":"php"}
 <?php
 $greeting = "Hello, World!";
 $currentDateTime = date('Y-m-d H:i:s');
diff --git a/examples/vercel/README.md b/examples/vercel/README.md
index 20c7bb01..d5d0bdd8 100644
--- a/examples/vercel/README.md
+++ b/examples/vercel/README.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJKPC0FGMY181R7Q7GE
+  version: v2.0
+---
+
 # Deploy Next.js with Runme
 
 This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
@@ -7,19 +13,19 @@ Next.js enables you to create full-stack Web applications by extending the lates
 
 First, install all dependencies:
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY170T17SAS"}
 npm install
 ```
 
 then, run the development server:
 
-```sh { background=true }
+```sh {"background":"true","id":"01HF7B0KJKPC0FGMY1732863Z1"}
 npx next dev
 ```
 
 Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY173Y6SSJE"}
 open http://localhost:3000
 ```
 
@@ -27,7 +33,7 @@ You can start editing the page by modifying `pages/index.tsx`. The page auto-upd
 
 [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY174SYPE1A"}
 open http://localhost:3000/api/hello
 ```
 
@@ -48,31 +54,31 @@ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https
 
 To deploy this application, first install Vercel CLI:
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY177TXQDTV"}
 npm i -g vercel
 ```
 
 Then, log into Vercel:
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY17AH7BK3D"}
 vercel login
 ```
 
 select your team, let's list them first:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJKPC0FGMY17BAH4ZGF","interactive":"false"}
 vercel teams ls 2>/dev/null
 ```
 
 then select team (skip if no change required):
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY17E94BMTG"}
 vercel team switch
 ```
 
 go on to list projects:
 
-```sh { interactive=true }
+```sh {"id":"01HF7B0KJKPC0FGMY17HVGMKC2","interactive":"true"}
 vercel projects list 2>&1 | tail -n +5
 ```
 
@@ -80,31 +86,31 @@ Great! Let's attempt a preview deploy.
 
 Set up your project name
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY17MKD6NNF"}
 export PROJECT_NAME=Name of your project
 echo "Your project name is set to: $PROJECT_NAME"
 ```
 
 Link your local directory to a project
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY17QP3RC7E"}
 vercel link -p $PROJECT_NAME
 ```
 
 then kick off a preview deploy and optionally promote to prod
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJKPC0FGMY17VBV7VHQ","interactive":"false"}
 vercel
 ```
 
 afterwards, you can optionally log out:
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY17YBTN7B6"}
 vercel logout
 ```
 
 or call another command:
 
-```sh
+```sh {"id":"01HF7B0KJKPC0FGMY17ZZF04GE"}
 vercel domain
 ```
diff --git a/package.json b/package.json
index ba08a441..17ee1252 100644
--- a/package.json
+++ b/package.json
@@ -437,7 +437,7 @@
           "runme.server.lifecycleIdentity": {
             "type": "number",
             "scope": "window",
-            "default": 0,
+            "default": 1,
             "enum": [
               0,
               1,
diff --git a/src/extension/serializer.ts b/src/extension/serializer.ts
index ea09c93f..f57f900c 100644
--- a/src/extension/serializer.ts
+++ b/src/extension/serializer.ts
@@ -308,10 +308,7 @@ export class GrpcSerializer extends SerializerBase {
   private client?: ParserServiceClient
   protected ready: ReadyPromise
   protected readonly lifecycleIdentity: ServerLifecycleIdentity =
-    getServerConfigurationValue<ServerLifecycleIdentity>(
-      'lifecycleIdentity',
-      RunmeIdentity.UNSPECIFIED,
-    )
+    getServerConfigurationValue<ServerLifecycleIdentity>('lifecycleIdentity', RunmeIdentity.ALL)
 
   private serverReadyListener: Disposable | undefined
 
diff --git a/src/utils/configuration.ts b/src/utils/configuration.ts
index c63ede05..abb077e2 100644
--- a/src/utils/configuration.ts
+++ b/src/utils/configuration.ts
@@ -58,7 +58,7 @@ const configurationSchema = {
     enableTLS: z.boolean().default(true),
     tlsDir: z.string().optional(),
     transportType: z.enum(['TCP', 'UDS']).default('TCP'),
-    lifecycleIdentity: z.nativeEnum(RunmeIdentity).default(RunmeIdentity.UNSPECIFIED),
+    lifecycleIdentity: z.nativeEnum(RunmeIdentity).default(RunmeIdentity.ALL),
   },
   codelens: {
     enable: z.boolean().default(true),
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 b81278e0..8928c479 100644
--- a/walkthroughs/welcome.md
+++ b/walkthroughs/welcome.md
@@ -1,10 +1,16 @@
+---
+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.
 
 It allows you to run Shell scripts within a Notebook interface, give it a try:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJDG9R0YG2H980BAF6P","interactive":"false"}
 echo "Hello Runme!"
 ```
 
@@ -12,13 +18,13 @@ Awesome! 🎉
 
 It also persist your session state, so all environment variables stay around, e.g.:
 
-```sh
+```sh {"id":"01HF7B0KJDG9R0YG2H9A8M9B3D"}
 export RUNME_MESSAGE="<input message here>"
 ```
 
 now run:
 
-```sh { interactive=false }
+```sh {"id":"01HF7B0KJDG9R0YG2H9B675FB7","interactive":"false"}
 echo $RUNME_MESSAGE
 ```
 


Test patch:
diff --git a/examples/test.md b/examples/test.md
index 7a6fe247..7bed5f73 100644
--- a/examples/test.md
+++ b/examples/test.md
@@ -1,3 +1,9 @@
+---
+runme:
+  id: 01HF7B0KJM3HHFDVSXA6E12JM3
+  version: v2.0
+---
+
 # Runme Examples
 
 This `README.md` contains some examples for executing e2e tests for the extension.
@@ -9,16 +15,16 @@ This markdown file contains some custom examples to test the execution within a
 
 ## Shell Executions
 
-```sh { background=false interactive=false }
+```sh {"background":"false","id":"01HF7B0KJM3HHFDVSX9YFTZ8PE","interactive":"false"}
 echo "Hello World!"
 ```
 
-```sh { promptEnv=false }
+```sh {"id":"01HF7B0KJM3HHFDVSXA100Y04X","promptEnv":"false"}
 export FOO="don't prompt me"
 ```
 
 # GitHub Action Integration
 
-```yaml
+```yaml {"id":"01HF7B0KJM3HHFDVSXA44VPZSC"}
 https://github.com/stateful/runme-canary/actions/workflows/test-inputs.yml
 ```
diff --git a/tests/e2e/specs/cell.e2e.ts b/tests/e2e/specs/cell.e2e.ts
index 35dcd96c..04169bc6 100644
--- a/tests/e2e/specs/cell.e2e.ts
+++ b/tests/e2e/specs/cell.e2e.ts
@@ -54,7 +54,7 @@ describe('Runme Cell Annotations', async () => {
 
     it('propagates changes to markdown document', async () => {
       await browser.keys([Key.Ctrl, 's'])
-      await assertDocumentContains('/examples/test.md', 'name=HelloWorld')
+      await assertDocumentContains('/examples/test.md', '"name":"HelloWorld"')
     })
 
     after(() => {
diff --git a/tests/extension/configuration.test.ts b/tests/extension/configuration.test.ts
index a07fbf93..1e120a22 100644
--- a/tests/extension/configuration.test.ts
+++ b/tests/extension/configuration.test.ts
@@ -134,8 +134,8 @@ suite('Configuration', () => {
 
   test('getServerConfigurationValue should give default persist identity', () => {
     expect(
-      getServerConfigurationValue<number>('lifecycleIdentity', RunmeIdentity.ALL),
-    ).toStrictEqual(RunmeIdentity.UNSPECIFIED)
+      getServerConfigurationValue<number>('lifecycleIdentity', RunmeIdentity.UNSPECIFIED),
+    ).toStrictEqual(RunmeIdentity.ALL)
   })
 
   test('getCodeLensEnabled should return true by default', () => {