7v9HjMuzX`ydj&i>xd9g)SxmV*~`0`%U2S~dT{1A{D
z#@FE23}5iLHmhBE!IuF;$jBQ0b%5k`Blr;$-UnV3vUFB~UzRZPg4J~vU+~!`d>**f
zgxkQk0HU)Cyvy((10OMA`GDIafY>bGag)!uiM-&$Cj18Y+IGf)f2UkvZi2N;65Iz!
zTKVYPh6r_w%x&O50xJj~0Y7mA<0|14Sbo>Gi?HBkpp$SC{4^l>rofjZE#Fpw1Az2F
z!JZE43i)#IRe;Ec!F_=4*Wfoycoy1OEUJ{f~iv25A3)Up3*^!0!VhFId(HNm%fUz}x7QZ{OA5jP2Od
z2;KmQOdojCEtY-{xEK)qGr<>{uq-lOXu?(C=K&vjUIM=d=zPK7>_QLxZQ!2*qDSz*
zn(z?#=&kqw8Tky~Re;DefI}u62A_MI)xXXICjgO2g1=(Iz2GgkTmI|;-*pG&ev9iO
zc-bbd3vW~R;IlW={|KK4p8X~2op335=3TtEB`nx~H#U+s0RGnhqMs1%2UmRs-ys@t5Cgh2?94d+sM6WU9W-$E*SI$pP>YKzcK|Zh4TDSjthx~V858z_H=1w{_?IRu
zYgZlwr0)8_SvwiS|46$5?*S$dmi0&eUB>_5-`N0(KD=EUN&w5f&_q07XWytN|1m!Lkle!h&UO-BTh1mbG&euwSsOE2|+aSg#wS
zEP`cCQzK!)vR3LT+KFIUCnfTNWv!OT2$pqPGm#NoX~MErM?PFB@`Ag814Fc7@X3$U
z1_;aNEH?sDNAf|-!XH^-`L5+g6UHn5!w#3;t5Znzr5D`V%U60FKFiwmJ}ucpvpy?5
zl~DiogCAY`sm}H=-@}O~_}s>VV!nn@>`%1MSu?lT
z%j{^Vm8tb>oVi_gX&}fe!T_1B8x1EbjrPk%@~K568A`76%9G-PV&O^10>ZEiJ8c1Fgm0us_20YgTLV%Pu|N_JwUDEW1>Wl8o@AqVj*6VLr^k
zc|oy1!TTBt6fgF6geqI)ZQp|8R)07VMD_V28q*UyW1M-NKWfYQBSoRIVlh0YUk&~h
z<&v3wzR-6
z&){O5+}63RYul!6J==P>^>5p^ZD8AhZG+nmZcA+&+BUrH$TrV|g%4J2ui4(PeZ_X)
z_O|U^+c$0R*?#Z#-tB$c2eu#BKDhnh_SE*F?ZeymJv8vpfrkbk;;Px_>GSrL_Eq#X
z^!fT?eO-M$eZ77CeFJ@ieW||TKDEQM!@Hw&N5zhY9ljm09bG$mcJ%J(-!ZUba7Sv#
z@D8=pv(vk?bZ5oRhMm5hv7KEzdv^Bj?B6-Cb8u&B=kQLo%d^Y7t8`bzu7+K{U9nwV
zyLxu@?&{w)uxoHvYS-{CwcE4XySsFE#qNgPzTL6iUAudB_wMfBJ+OOlcWU?WZnej=
z$GfL=PsN^wJ-$7$JzaZx_Vn)Q-!rgha8GK_@E*0-v)8+~bZ^DphP}SMvAtb;d-nG3
z?cY1FcW`fN@9
Date: Mon, 17 Nov 2025 00:28:42 +0900
Subject: [PATCH 39/50] add linux samply section
---
Runtime-debugging.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Runtime-debugging.md b/Runtime-debugging.md
index f21e676d47..02119efdf3 100644
--- a/Runtime-debugging.md
+++ b/Runtime-debugging.md
@@ -2,6 +2,7 @@
- [CPU profiling unresponsive window via tracing](#tracing-cpu-profiler)
- [Using samply on macOS](#samply-sampling-profiler)
- [Using samply on windows](#samply-sampling-profiler)
+- [Using samply on linux](#samply-sampling-profiler)
- [Using etw on windows](#etw-windows-profiler)
@@ -44,6 +45,15 @@ If you want to capture only application related cpu profile with both JIT and na
You can inspect the profile with `samply.exe load --breakpad-symbol-dir profile.json.gz`
+## Using samply on linux
+
+* Download the latest release of https://github.com/mstange/samply/releases
+* Start from the command line with following `samply.exe record -s -o profile.json.gz --browsers -- /code --js-flags="--perf-basic-prof --perf-prof-unwinding-info --interpreted-frames-native-stack"`
+* Perform the steps for unresponsiveness or slow startups etc
+* Exit the application and the profile will be saved to `profile.json.gz`
+
+You can inspect the profile with `samply.exe load --breakpad-symbol-dir profile.json.gz`
+
## Using etw on windows
From d28681639638e9fa39c402f074eac7dc592f4f57 Mon Sep 17 00:00:00 2001
From: Kai Maetzel <4674940+kieferrm@users.noreply.github.com>
Date: Mon, 17 Nov 2025 14:10:34 -0800
Subject: [PATCH 40/50] Updated Iteration Plans (markdown)
---
Iteration-Plans.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Iteration-Plans.md b/Iteration-Plans.md
index 20da87b11d..7961a7f819 100644
--- a/Iteration-Plans.md
+++ b/Iteration-Plans.md
@@ -1,3 +1,9 @@
+### November 2025
+
+* [Iteration Plan](https://github.com/microsoft/vscode/issues/277757)
+* [Endgame](https://github.com/microsoft/vscode/issues?q=is%3Aissue+label%3Aendgame-plan+milestone%3A%22November+2025%22)
+
+
### October 2025
* [Iteration Plan](https://github.com/microsoft/vscode/issues/271045)
From e175ad898b75a1fa9bfc8a8b17678b2523bcd500 Mon Sep 17 00:00:00 2001
From: Robo
Date: Wed, 26 Nov 2025 11:18:53 +0900
Subject: [PATCH 41/50] Updated Runtime debugging (markdown)
---
Runtime-debugging.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/Runtime-debugging.md b/Runtime-debugging.md
index 02119efdf3..47019dce81 100644
--- a/Runtime-debugging.md
+++ b/Runtime-debugging.md
@@ -65,6 +65,7 @@ You can inspect the profile with `samply.exe load --breakpad-symbol-dir p
3) Registry I/O activity
4) Pool usage
5) VirtualAlloc usage
+ 6) GPU activity
* Set `Performance Scenario` to `General`, `Detail level` to `verbose` and `Logging mode` to `file`
* Start the recorder
* Start the VSCode application from the terminal with the following additional flags `--js-flags="--enable-etw-stack-walking --interpreted-frames-native-stack"`
From a68ff6c913be82be76e5dc837cde90e342ed786d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20A=2E=20L=2E=20Souza?=
Date: Tue, 2 Dec 2025 19:35:36 -0300
Subject: [PATCH 42/50] Fix typos and improve text consistency of Extension api
guidelines page (#316)
* Fixes typos
* Improve text consistency by fixing punctuation at end of stand-alone sentences
* Improve text consistency by fixing punctuation at end of list sentences
* Fix quotation for rule of thumb
---
Extension-API-guidelines.md | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/Extension-API-guidelines.md b/Extension-API-guidelines.md
index 4461eca214..9752372e87 100644
--- a/Extension-API-guidelines.md
+++ b/Extension-API-guidelines.md
@@ -23,7 +23,7 @@ Events aren’t defined on the types they occur on but in the best matching name
Private Events
-
-Private or instance events aren't accessible via globals but exist on objects, e.g., `FileSystemWatcher#onDidCreate`. *Don't* use private events unless the sender of the event is private. The rule of thumb is: 'Objects that can be accessed globally (editors, tasks, terminals, documents, etc)' should not have private events, objects that are private (only known by its creators, like tree views, web views) can send private events'
+Private or instance events aren't accessible via globals but exist on objects, e.g., `FileSystemWatcher#onDidCreate`. *Don't* use private events unless the sender of the event is private. The rule of thumb is: 'Objects that can be accessed globally (editors, tasks, terminals, documents, etc) should not have private events, objects that are private (only known by its creators, like tree views, web views) can send private events'.
Event naming
-
@@ -100,7 +100,7 @@ We define the API with strictNull-checks in mind. That means we use the optional
Undefined is False
-
-The default value of an optional, boolean property is `false`. This is for consistency with JS where undefined never evaluates to `true`
+The default value of an optional, boolean property is `false`. This is for consistency with JS where undefined never evaluates to `true`.
JSDOC
-
@@ -108,19 +108,19 @@ We add JSDoc for all parts of the API. The doc is supported by markdown syntax.
# Optional parameters (`?` vs `| undefined`)
- For implementation, treat omitting a parameter with `?` the same as explicitly passing in `undefined`
-- Use `| undefined` when you want to callers to always have to consider the parameter.
-- Use `?` when you want to allow callers to omit the parameter.
-- Never use `?` and `| undefined` on a parameter. Instead follow the two rules above to decide which version to use .
-- If adding a new parameter to an existing function, use `?` as this allows the new signature to be backwards compatible with the old version.
-- Do not add an overload to add an optional parameter to the end of the function. Instead use `?`.
+- Use `| undefined` when you want callers to always have to consider the parameter
+- Use `?` when you want to allow callers to omit the parameter
+- Never use `?` and `| undefined` on a parameter. Instead follow the two rules above to decide which version to use
+- If adding a new parameter to an existing function, use `?` as this allows the new signature to be backwards compatible with the old version
+- Do not add an overload to add an optional parameter to the end of the function. Instead use `?`
# Optional properties (`?` vs `| undefined`)
- Do not write code that treats the absence of a property differently than a property being present but set to `undefined`
- This can sometimes hit you on spreads or iterating through objects, so just something to be aware of
-- For readonly properties on interfaces that VS Code exposes to extensions (this include managed objects, as well as the objects passed to events):
- - Use `| undefined` as this makes it clear the property exists but has the value `undefined`.
+- For readonly properties on interfaces that VS Code exposes to extensions (this includes managed objects, as well as the objects passed to events):
+ - Use `| undefined` as this makes it clear the property exists but has the value `undefined`
- For readonly properties on options bag type objects passed from extensions to VS Code:
- Use `?` when it is ok to omit the property
From 122cc3c7b244d89975063f604eff93881f552a44 Mon Sep 17 00:00:00 2001
From: Hawk Ticehurst <39639992+hawkticehurst@users.noreply.github.com>
Date: Thu, 4 Dec 2025 16:05:11 -0500
Subject: [PATCH 43/50] Updated How to Contribute (markdown)
---
How-to-Contribute.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/How-to-Contribute.md b/How-to-Contribute.md
index 869238d2f9..73063c6675 100644
--- a/How-to-Contribute.md
+++ b/How-to-Contribute.md
@@ -144,6 +144,21 @@ Manage any merge conflicts, commit them, and then push them to your fork.
> [!NOTE]
> The `microsoft/vscode` repository contains a collection of GitHub Actions that help us with triaging issues. As you probably don't want these running on your fork, you can disable Actions for your fork via `https://github.com/<>/vscode/settings/actions`.
+### Use the correct version of Node
+
+Before installing and building, ensure you are using the correct version of Node.
+
+It's recommended you install [`fnm`](https://github.com/Schniz/fnm) and run the following command in your `vscode` folder:
+
+```
+fnm use
+```
+
+> [!TIP]
+> When [configuring fnm](https://github.com/Schniz/fnm#shell-setup) you can add the `--use-on-cd` flag and then `fnm use` will be automatically run whenever you navigate to a new directory.
+
+Otherwise, check the `.nvmrc` file in the `vscode` folder to see the current version of Node being used and then update Node however you see fit.
+
### Build
Install and build all of the dependencies using `npm`:
From e5ea71869f53ace77cbe8ef6109505f8dca26280 Mon Sep 17 00:00:00 2001
From: Alexandru Dima
Date: Fri, 12 Dec 2025 09:27:52 +0100
Subject: [PATCH 44/50] Updated Copilot Issues (markdown)
---
Copilot-Issues.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Copilot-Issues.md b/Copilot-Issues.md
index 9808474002..150fc8f71b 100644
--- a/Copilot-Issues.md
+++ b/Copilot-Issues.md
@@ -44,6 +44,11 @@ To look at the information that was send to and received from the Language Model
+### Chat Replay Viewer
+
+The .chatreplay.json file can be viewed here: https://digitarald.github.io/vscode-chat-logs/
+
+
## Custom Instructions Logs
To debug why your [custom instructions](https://code.visualstudio.com/docs/copilot/copilot-customization#_custom-instructions) are not used by the language model test the following.
From 265d9095fcf97447f59868c7718f43425ea58b67 Mon Sep 17 00:00:00 2001
From: Harald Kirschner
Date: Fri, 12 Dec 2025 11:37:21 -0800
Subject: [PATCH 45/50] Refined chat viewer
---
Copilot-Issues.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/Copilot-Issues.md b/Copilot-Issues.md
index 150fc8f71b..d9e9779804 100644
--- a/Copilot-Issues.md
+++ b/Copilot-Issues.md
@@ -44,9 +44,10 @@ To look at the information that was send to and received from the Language Model
-### Chat Replay Viewer
+### Chat Replay/Log Viewer
+
+The `.chatreplay.json` file can be viewed here: https://digitarald.github.io/vscode-chat-logs/ , either local-only va drag & drop or linked from an uploaded gist. The viewer also supports markdown logs (right-click `Copy All` in a conversation) and Chat Exports (command: `Chat: Export Chat…`.
-The .chatreplay.json file can be viewed here: https://digitarald.github.io/vscode-chat-logs/
## Custom Instructions Logs
From 9388cc4382bd4cbd6754f43dde37a9892fa3a536 Mon Sep 17 00:00:00 2001
From: Daniel Imms <2193314+Tyriar@users.noreply.github.com>
Date: Thu, 18 Dec 2025 03:50:05 -0800
Subject: [PATCH 46/50] Updated Terminal Issues (markdown)
---
Terminal-Issues.md | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/Terminal-Issues.md b/Terminal-Issues.md
index ffb7fc76e9..4ed4f13392 100644
--- a/Terminal-Issues.md
+++ b/Terminal-Issues.md
@@ -48,6 +48,36 @@ For some terminal issues it's useful to get trace logs, this can reveal at what
If for some reason you're unable to restart VS Code like you're running in a remote, you can change the log level via the command palette (F1 `Developer: Set Log Level...`).
+### Why was a terminal command auto approved in chat?
+
+The terminal tool in chat has a [powerful auto approve feature](https://code.visualstudio.com/docs/copilot/chat/chat-tools#_automatically-approve-terminal-commands) that you can enable in the allow dropdown. Once enabled, this will enable a set of default auto approval rules (unless `"chat.tools.terminal.ignoreDefaultAutoApproveRules": true` is set), you can see this set inside VS Code by auto completing the `chat.tools.terminal.autoApprove` setting in your settings.json file. For example this includes the following rules:
+
+```json
+{
+ "find": true,
+ "/^find\\b.*-(delete|exec|execdir|fprint|fprintf|fls|ok|okdir)\\b/": false,
+}
+```
+
+This allows the `find` command in general, but not a set of arguments that can either write to arbitrary files or execute arbitrary commands.
+
+In addition to the default rules, enabling auto approve will also enable auto approval rules in your [settings](https://code.visualstudio.com/docs/configure/settings) (user, profile, remote and workspace scopes).
+
+In order to be approved a _command line_ must:
+
+1. Achieve one of the following:
+ - All sub-commands are auto approved by a rule. For example, `foo && bar` would need a `foo` and a `bar` rule.
+ - The command line was auto approve by a rule. For example, `foo && bar` would match `"/^foo/": { "approve": true, "matchCommandLine": true }`.
+2. No sub-commands or command lines are _denied_ by a false auto auto approve rule. For example, `"foo": false` will always block the `foo` command regardless of arguments.
+3. For any detected file writes (only redirection at the time of writing), the command passes the rules defined by the `chat.tools.terminal.blockDetectedFileWrites` setting. By default this allows writing to workspace files as typically you will have an SCM protecting the content, and the [timeline view](https://code.visualstudio.com/docs/getstarted/userinterface#_timeline-view) may also allow accessing file history. So `cat README.md > README2.md` will intentionally allow writing to README2.md, or something like `cat /dev/null > README.md` can delete the content of a file.
+
+If you see a command unexpectedly auto approved, you can follow these steps to diagnose why it was auto approve:
+
+1. Hovering the tool call's check icon should tell you which rule(s) were used to approve it which can be clicked to go directly to them in your settings file.
+2. Opening the Output panel and selecting the Terminal channel will show detailed logging on the reasoning of how the command was approved.
+
+Note also that we use tree-sitter to parse the commands and extract sub-commands, we use [this PowerShell grammar](https://github.com/airbus-cert/tree-sitter-powershell) for pwsh and [the official bash grammar](https://github.com/tree-sitter/tree-sitter-bash) for everything else. This does mean that using auto approve on zsh may approve something unexpected when there is a conflict with bashes syntax, this is one of the "best effort" things that's talked about in the modal opt-in warning. You can read more about this and other related concerns in the caution section in [the docs](https://code.visualstudio.com/docs/copilot/chat/chat-tools#_automatically-approve-terminal-commands).
+
### Using showkey to investigate keybinding issues
There is a utility called `showkey` which will print the character codes as received by the application, this is similar to escape sequence logging above but's evaluated on the process side. Install `showkey` by installing the `kbd` package on Linux or `showkey` on homebrew, for example:
From e8f0facfd61cb102c741827c3f5361ce4afd7773 Mon Sep 17 00:00:00 2001
From: MD ABDULLAH AL AMIN KHAN
Date: Wed, 28 Jan 2026 19:43:10 +0600
Subject: [PATCH 47/50] docs: fix Node.js spelling and 64-bit formatting (#340)
- Correct official spelling of Node.js
- Normalize 64-bit formatting for consistency
---
How-to-Contribute.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/How-to-Contribute.md b/How-to-Contribute.md
index 869238d2f9..9d17f7db6a 100644
--- a/How-to-Contribute.md
+++ b/How-to-Contribute.md
@@ -13,7 +13,7 @@ In order to download necessary tools, clone the repository, and install dependen
You'll need the following tools:
- [Git](https://git-scm.com)
-- [Node.JS](https://nodejs.org/en/download/prebuilt-binaries), **x64** or **ARM64**, version `>=20.x` (also see [`.nvmrc`](https://github.com/microsoft/vscode/blob/main/.nvmrc), which may provide a more precise version to install)
+- [Node.js](https://nodejs.org/en/download/prebuilt-binaries), **x64** or **ARM64**, version `>=20.x` (also see [`.nvmrc`](https://github.com/microsoft/vscode/blob/main/.nvmrc), which may provide a more precise version to install)
- If using `nvm`, consider updating your default node installation with `nvm alias default `
- Windows:
- Do not pick the option to install Windows Build Tools, see the step below for instructions
@@ -71,7 +71,7 @@ Make sure you cloned `vscode` into a folder without any spaces in the path hiera
In case of issues, try deleting the contents of `~/.node-gyp` (alternatively `~/.cache/node-gyp` for Linux, `~/Library/Caches/node-gyp/` for macOS, or `%USERPROFILE%\AppData\Local\node-gyp` for Windows) first and then run `git clean -xfd` and then try again.
-> If you are on Windows or Linux 64 bit systems and would like to compile to 32 bit, you'll need to set the `npm_config_arch` environment variable to `ia32` before running `npm`. This will compile all native node modules for a 32 bit architecture. Similarly, when cross-compiling for ARM, set `npm_config_arch` to `arm`.
+> If you are on Windows or Linux 64-bit systems and would like to compile to 32 bit, you'll need to set the `npm_config_arch` environment variable to `ia32` before running `npm`. This will compile all native node modules for a 32 bit architecture. Similarly, when cross-compiling for ARM, set `npm_config_arch` to `arm`.
> [!NOTE]
> For more information on how to install NPM modules globally on UNIX systems without resorting to `sudo`, refer to [this guide](http://www.johnpapa.net/how-to-use-npm-global-without-sudo-on-osx/).
@@ -326,4 +326,4 @@ We accept feedback on translations in language packs via GitHub issues in our [l
## Discussion Etiquette
-In order to keep the conversation clear and transparent, please limit discussion to English and keep things on topic with the issue. Be considerate to others and try to be courteous and professional at all times.
\ No newline at end of file
+In order to keep the conversation clear and transparent, please limit discussion to English and keep things on topic with the issue. Be considerate to others and try to be courteous and professional at all times.
From 0c3908ae716a4b3d9e23972a923727d36b18cb3e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joaqu=C3=ADn=20Ruales?=
<1588988+jruales@users.noreply.github.com>
Date: Tue, 3 Feb 2026 17:24:34 -0800
Subject: [PATCH 48/50] Mention fnm in prerequisites section too
---
How-to-Contribute.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/How-to-Contribute.md b/How-to-Contribute.md
index 3d7606a8af..5c9fef1e2d 100644
--- a/How-to-Contribute.md
+++ b/How-to-Contribute.md
@@ -14,6 +14,7 @@ You'll need the following tools:
- [Git](https://git-scm.com)
- [Node.js](https://nodejs.org/en/download/prebuilt-binaries), **x64** or **ARM64**, version `>=20.x` (also see [`.nvmrc`](https://github.com/microsoft/vscode/blob/main/.nvmrc), which may provide a more precise version to install)
+ - Consider using `fnm` instead of `nvm`. See the section [Use the correct version of Node](https://github.com/microsoft/vscode/wiki/How-to-Contribute#use-the-correct-version-of-node) below for more details on how to set that up.
- If using `nvm`, consider updating your default node installation with `nvm alias default `
- Windows:
- Do not pick the option to install Windows Build Tools, see the step below for instructions
From 388e7958730a6dec8b0142c56f48dbcbabe3de67 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Wed, 4 Feb 2026 15:12:27 -0800
Subject: [PATCH 49/50] docs: update reviewer aliases (#341)
---
Publish-vscode-types.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Publish-vscode-types.md b/Publish-vscode-types.md
index 4f96a9aba1..d9c1f346eb 100644
--- a/Publish-vscode-types.md
+++ b/Publish-vscode-types.md
@@ -18,7 +18,7 @@ Example of PR when releasing 1.84 - https://github.com/DefinitelyTyped/Definitel
4. Update the minor version in `"version"` property in `types/vscode/package.json`, e.g., `1.83.9999` to `1.84.9999` (`9999` is not just an example)
5. Submit the PR
- If there are any lint failures in the CI job for the PR, you can disable tests in either the `tslint.json` or `.eslintrc.json` files. But first check to make sure that the lint failure isn't pointing out a real issue in our `vscode.d.ts` or with the copy/paste job.
-6. Ask either @jrieken or @kieferrm to merge the PR.
+6. Ask either @mjbvz, @jrieken, or @kieferrm to merge the PR.
7. `@types/vscode` will be published in ~10 minutes.
8. Make sure a correct version of `@types/vscode` was published, e.g., if you're releasing VS Code 1.84, you should see `@types/vscode` version 1.84.0 [here](https://www.npmjs.com/package/@types/vscode)
From c10225df002e0c62811314aed7f717bd7b35d2d5 Mon Sep 17 00:00:00 2001
From: android323
Date: Sat, 16 May 2026 17:11:16 -0400
Subject: [PATCH 50/50] Create php.yml
---
.github/workflows/php.yml | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
create mode 100644 .github/workflows/php.yml
diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml
new file mode 100644
index 0000000000..6fc6efb10b
--- /dev/null
+++ b/.github/workflows/php.yml
@@ -0,0 +1,38 @@
+name: PHP Composer
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ branches: [ "main" ]
+
+permissions: write
+ contents:
+
+jobs:
+ build: latest
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Validate composer.json and composer.lock
+ run: composer validate --strict
+
+ - name: Cache Composer packages
+ id: composer-cache
+ uses: actions/cache@v3
+ with:
+ path: vendor
+ key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-php-
+
+ - name: Install dependencies
+ run: composer install --prefer-dist --no-progress
+
+ # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit"
+ # Docs: https://getcomposer.org/doc/articles/scripts.md
+
+ # - name: Run test suite
+ # run: composer run-script test