Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 30 additions & 11 deletions .claude/skills/generate-changelog/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ description: Generate changelog entries from merged PRs since the last release.
Generate changelog entries by analyzing merged PRs since the last release.

Execute these phases in order:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The CHANGELOG entry formatting changed from - (dash + 3 spaces) to - (dash + 1 space), which contradicts the style guide in SKILL.md line 84 that specifies "Entry prefix: - (dash + exactly 3 spaces)". If this is an intentional style migration,
the SKILL.md should be updated to match. If not, the CHANGELOG entry should retain the original format.

This might be related to the underlying version of prettier/eslint/markdown-lint that is used. I also experienced similar issues in other glsp projects.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The prettier actually enforces the 1 space when we do yarn format. I updated the skill for this as it proposes 3 spaces

1. **Data Gathering** — find last release, fetch PRs, classify, generate entries
2. **Changelog Update** — write entries into CHANGELOG.md
3. **Review & Approval** — present the actual diff to the user for review
Expand All @@ -20,11 +21,13 @@ Execute these phases in order:
### Step 1.1: Find the latest release tag

Run:

```bash
git tag --sort=-creatordate | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1
```

Record as `LAST_TAG`. Get the tag's date:

```bash
git log -1 --format=%aI $LAST_TAG
```
Expand All @@ -46,12 +49,13 @@ Use the date portion only from `TAG_DATE` (e.g. `2026-02-09`).
### Step 1.4: Filter PRs

**Skip rules** (in order):

1. PR has the `changelog` label → skip (already tracked in a previous changelog update)
2. Author login is `dependabot` or `dependabot[bot]` → skip
3. Title matches version bump patterns → skip:
- Starts with `Switch to` and contains `-next`
- Title is a bare version like `vX.Y.Z`
- Title starts with `Release v`
- Starts with `Switch to` and contains `-next`
- Title is a bare version like `vX.Y.Z`
- Title starts with `Release v`
4. Title contains `update changelog` (case insensitive) → skip
5. Title is purely CI/metadata (readme badges, workflow config) AND body does NOT contain `[x] This PR should be mentioned in the changelog` → skip

Expand All @@ -62,9 +66,9 @@ Use the date portion only from `TAG_DATE` (e.g. `2026-02-09`).
1. If body contains `[x] This PR introduces a breaking change` → **breaking**
2. If body contains `[ ] This PR introduces a breaking change` → **normal**
3. If no checkbox info, analyze title and body:
- Breaking keywords: "refactor", "rename", "remove", "replace", "migrate", "breaking", "deprecate"
- Clearly non-breaking (bug fix, docs, minor enhancement) → **normal**
- Uncertain → flag for user review
- Breaking keywords: "refactor", "rename", "remove", "replace", "migrate", "breaking", "deprecate"
- Clearly non-breaking (bug fix, docs, minor enhancement) → **normal**
- Uncertain → flag for user review

### Step 1.6: Assign category tags

Expand All @@ -75,25 +79,29 @@ Pick the most fitting tag from the vocabulary (Step 1.2) based on PR title and b
#### Entry Format

**Normal changes:**

```
- [tag] Description [#N](https://github.com/OWNER/REPO/pull/N)
```

**Breaking changes** with migration sub-items:

```
- [tag] Description [#N](https://github.com/OWNER/REPO/pull/N)
- Migration detail 1
- Migration detail 2
```

**Multiple PRs for the same change:**

```
- [tag] Description [#N](url) [#M](url)
```

#### Style Guide

**Formatting:**

- Entry prefix: `- ` (dash + exactly 3 spaces)
- Sub-item indent: 4 spaces + `- ` (4 spaces from parent dash)
- Sub-sub-item indent: 8 spaces + `- `
Expand All @@ -102,6 +110,7 @@ Pick the most fitting tag from the vocabulary (Step 1.2) based on PR title and b
- PR links are mandatory, full URLs: `[#123](https://github.com/OWNER/REPO/pull/123)`

**Wording:**

- Always start with a **present tense imperative verb** (not past tense)
- Common verbs: Fix, Improve, Add, Update, Extend, Ensure, Introduce, Remove, Refactor, Rename, Provide, Allow, Support
- **Bug fixes**: "Fix a bug that caused/prevented...", "Fix X behavior"
Expand All @@ -111,19 +120,22 @@ Pick the most fitting tag from the vocabulary (Step 1.2) based on PR title and b
- Be specific — never "Fix various issues"

**Capitalization:**

- Tags are always lowercase: `[diagram]`, not `[Diagram]`
- Description starts lowercase after the tag (unless proper noun or code element)
- Section headers: Title Case (`### Potentially Breaking Changes`)

**Description cleanup from PR title:**

- Remove issue tracker prefixes (e.g. `GLSP-1234:`, `GH-123:`, `ISSUE-456:`)
- Remove conventional commit prefixes: `fix:`, `feat:`, `chore:`
- Rephrase bug-report style to changelog style:
- BAD: "Edit label UI does not resize on graph zoom"
- GOOD: "Fix edit label UI not resizing on graph zoom"
- BAD: "Edit label UI does not resize on graph zoom"
- GOOD: "Fix edit label UI not resizing on graph zoom"
- Keep concise — one line

**Breaking changes:**

- Describe what changed, why it's breaking, and how to migrate
- Extract migration sub-items from the PR body's "What it does" section

Expand All @@ -136,11 +148,13 @@ Pick the most fitting tag from the vocabulary (Step 1.2) based on PR title and b
Read `CHANGELOG.md` in the repository root.

**Active section detection:**

- An active section has the `- active` suffix (e.g. `## v2.7.0 - active`)
- If an active section exists → merge new entries into it
- If the topmost section is a released version (no `- active` suffix) → create a new active section above it

**Creating a new section:**

- Bump the minor version of `LAST_TAG` (e.g. `v2.6.0` → `v2.7.0`)
- Insert after the title line, before the first `## ` heading:

Expand All @@ -149,17 +163,18 @@ Read `CHANGELOG.md` in the repository root.

### Changes

- [tag] Entry [#N](url)
- [tag] Entry [#N](url)

### Potentially Breaking Changes

- [tag] Entry [#N](url)
- Sub-item detail
- [tag] Entry [#N](url)
- Sub-item detail
```

Only include "Potentially Breaking Changes" if there are breaking entries.

**Merging into existing active section:**

- Check PR numbers against existing entries to avoid duplicates
- Append new entries to the appropriate subsection
- Create missing subsections as needed
Expand All @@ -185,6 +200,7 @@ Present the diff to the user.
List any entries flagged as uncertain (category or breaking status) and ask the user to resolve them.

Even if nothing is uncertain, ask:

> "Does everything look correct, or would you like to adjust any entries?"

### Step 3.3: Collect user feedback
Expand All @@ -200,11 +216,13 @@ Even if nothing is uncertain, ask:
## Phase 4: PR Creation (Optional)

Only execute this phase if the user explicitly requests a PR (either in their initial prompt or after reviewing the changelog). If the user hasn't mentioned a PR, ask after approval:

> "Would you like me to create a PR for this changelog update, or are you done?"

### Step 4.1: Determine the branch name

Check if `changelog-update` exists on remote:

```bash
git ls-remote --heads origin changelog-update
```
Expand All @@ -229,6 +247,7 @@ Report the PR URL.
### Step 4.4: Label referenced PRs

Add the `changelog` label to every PR mentioned in the new entries:

```bash
gh pr edit PR_NUMBER --add-label "changelog"
```
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
env:
STANDALONE_URL: 'file://${{ github.workspace }}/glsp-client/examples/workflow-standalone/app/diagram.html'
GLSP_SERVER_PORT: '8081'
GLSP_MCP_SERVER_PORT: '64577'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was this added?
Do we currently even have e2e tests for the mcp feature?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not, so I removed it again.

GLSP_SERVER_PLAYWRIGHT_MANAGED: 'false'
GLSP_WEBSOCKET_PATH: 'workflow'
THEIA_URL: 'http://localhost:3000'
Expand Down
16 changes: 11 additions & 5 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
"--app-project-path=${workspaceRoot}/examples/browser-app"
],
"env": {
"NODE_ENV": "development"
"NODE_ENV": "development",
"GLSP_MCP_SERVER_PORT": "64577"
},
"sourceMaps": true,
"outFiles": [
Expand Down Expand Up @@ -85,12 +86,14 @@
"--integratedNode"
],
"env": {
"NODE_ENV": "development"
"NODE_ENV": "development",
"GLSP_MCP_SERVER_PORT": "64577"
},
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/node_modules/@theia/*/lib/**/*.js",
"${workspaceRoot}/node_modules/@eclipse-glsp/server/*/lib/**/*.js",
"${workspaceRoot}/node_modules/@eclipse-glsp/server-mcp/*/lib/**/*.js",
"${workspaceRoot}/node_modules/@eclipse-glsp/graph/*/lib/**/*.js",
"${workspaceRoot}/node_modules/@eclipse-glsp/layout-elk/*/lib/**/*.js",
"${workspaceRoot}/node_modules/@eclipse-glsp-examples/workflow-server/*/lib/**/*.js",
Expand Down Expand Up @@ -123,7 +126,8 @@
"--logLevel=debug"
],
"env": {
"NODE_ENV": "development"
"NODE_ENV": "development",
"GLSP_MCP_SERVER_PORT": "64577"
},
"sourceMaps": true,
"outFiles": [
Expand Down Expand Up @@ -158,7 +162,8 @@
"--logLevel=debug"
],
"env": {
"NODE_ENV": "development"
"NODE_ENV": "development",
"GLSP_MCP_SERVER_PORT": "64577"
},
"sourceMaps": true,
"outFiles": [
Expand Down Expand Up @@ -192,7 +197,8 @@
],
"env": {
"NODE_ENV": "development",
"WEBSOCKET_PORT": "8081"
"WEBSOCKET_PORT": "8081",
"GLSP_MCP_SERVER_PORT": "64577"
},
"sourceMaps": true,
"outFiles": [
Expand Down
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

### Potentially Breaking Changes

- [build] Update to Node 22 and Theia 1.70.0 example projects [#290](https://github.com/eclipse-glsp/glsp-theia-integration/pull/290)
- Theia >= 1.70.0 requires Node `22` and electron `39.7.0`
- [build] Update to Node 22 and Theia 1.70.0 example projects [#290](https://github.com/eclipse-glsp/glsp-theia-integration/pull/290)
- Theia >= 1.70.0 requires Node `22` and electron `39.7.0`

## [v2.6.0 - 10/02/2026](https://github.com/eclipse-glsp/glsp-theia-integration/releases/tag/v2.6.0)

Expand Down
11 changes: 9 additions & 2 deletions configs/local-linking.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
function linkClient() {
echo "--- Link Client packages ---"
cd $2/glsp-client || exit
# Defensive: stale nested @eclipse-glsp copies from prior installs shadow the workspace
# symlinks via Node's nearest-node_modules-wins resolution → bundle fails.
# Remove them before re-linking.
find packages examples -path '*/node_modules/@eclipse-glsp' -type d -exec rm -rf {} + 2>/dev/null || true
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if it's worth maintaining this script any longer.
We now have linking functionality built in the glsp cli tool.

We should probably update our repos accordingly.
But that's a thing for a follow-up

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, I think so too, should be done in a proper cleanup.


cd examples/workflow-glsp || exit
yarn $1
Expand Down Expand Up @@ -42,6 +46,9 @@ function linkClient() {
linkNodeServer() {
echo $2/glsp-server-node
if [ -d $2/glsp-server-node ]; then
cd $2/glsp-server-node || exit
# Same defensive cleanup as linkClient — stale nested @eclipse-glsp copies shadow workspace links.
find packages examples -path '*/node_modules/@eclipse-glsp' -type d -exec rm -rf {} + 2>/dev/null || true
cd $2/glsp-server-node/packages/graph || exit
yarn $1
cd ../layout-elk || exit
Expand Down Expand Up @@ -84,13 +91,13 @@ if [[ "$2" != "--unlink" ]]; then
cd $baseDir/glsp-theia-integration || exit
yarn link sprotty sprotty-protocol @eclipse-glsp/client @eclipse-glsp/protocol @eclipse-glsp/sprotty @eclipse-glsp-examples/workflow-glsp vscode-jsonrpc inversify
if [ -d $baseDir/glsp-server-node ]; then
yarn link @eclipse-glsp/server @eclipse-glsp/graph @eclipse-glsp/layout-elk @eclipse-glsp-examples/workflow-server @eclipse-glsp-examples/workflow-server-bundled
yarn link @eclipse-glsp/server @eclipse-glsp/server-mcp @eclipse-glsp/graph @eclipse-glsp/layout-elk @eclipse-glsp-examples/workflow-server @eclipse-glsp-examples/workflow-server-bundled
fi
yarn install --force
else
yarn unlink sprotty sprotty-protocol @eclipse-glsp/client @eclipse-glsp/protocol @eclipse-glsp/sprotty @eclipse-glsp-examples/workflow-glsp vscode-jsonrpc inversify
if [ -d $baseDir/glsp-server-node ]; then
yarn unlink @eclipse-glsp/server @eclipse-glsp/graph @eclipse-glsp/layout-elk @eclipse-glsp-examples/workflow-server @eclipse-glsp-examples/workflow-server-bundled
yarn unlink @eclipse-glsp/server @eclipse-glsp/server-mcp @eclipse-glsp/graph @eclipse-glsp/layout-elk @eclipse-glsp-examples/workflow-server @eclipse-glsp-examples/workflow-server-bundled
fi
yarn
yarn install --force
Expand Down
5 changes: 4 additions & 1 deletion examples/browser-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
},
"dependencies": {
"@eclipse-glsp-examples/workflow-theia": "2.7.0-next",
"@theia/ai-anthropic": "~1.70.0",
"@theia/ai-ide": "~1.70.0",
"@theia/ai-openai": "~1.70.0",
"@theia/core": "~1.70.0",
"@theia/editor": "~1.70.0",
"@theia/filesystem": "~1.70.0",
Expand Down Expand Up @@ -48,4 +51,4 @@
}
}
}
}
}
3 changes: 2 additions & 1 deletion examples/workflow-theia/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"@eclipse-glsp-examples/workflow-glsp": "next",
"@eclipse-glsp-examples/workflow-server": "next",
"@eclipse-glsp-examples/workflow-server-bundled": "next",
"@eclipse-glsp/theia-integration": "2.7.0-next"
"@eclipse-glsp/theia-integration": "2.7.0-next",
"@eclipse-glsp/theia-mcp-integration": "2.7.0-next"
},
"publishConfig": {
"access": "public"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/********************************************************************************
* Copyright (c) 2019-2023 EclipseSource and others.
* Copyright (c) 2019-2026 EclipseSource and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
Expand All @@ -14,6 +14,7 @@
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
import { Args, MaybePromise } from '@eclipse-glsp/client';
import { McpInitializeParameters } from '@eclipse-glsp/protocol';

Check failure on line 17 in examples/workflow-theia/src/browser/workflow-glsp-client-contribution.ts

View workflow job for this annotation

GitHub Actions / Lint

'"@eclipse-glsp/protocol"' has no exported member named 'McpInitializeParameters'. Did you mean 'InitializeParameters'?

Check failure on line 17 in examples/workflow-theia/src/browser/workflow-glsp-client-contribution.ts

View workflow job for this annotation

GitHub Actions / Build & Test

'"@eclipse-glsp/protocol"' has no exported member named 'McpInitializeParameters'. Did you mean 'InitializeParameters'?
import { BaseGLSPClientContribution, WebSocketConnectionOptions } from '@eclipse-glsp/theia-integration/lib/browser';
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
import { inject, injectable } from '@theia/core/shared/inversify';
Expand All @@ -32,6 +33,14 @@
readonly id = WorkflowLanguage.contributionId;
readonly fileExtensions = WorkflowLanguage.fileExtensions;

protected override async createInitializeParameters(): Promise<McpInitializeParameters> {
const mcpPort = await this.getMcpServerPortFromEnv();
return {
...(await super.createInitializeParameters()),
mcpServer: { name: 'glsp-workflow', ...(mcpPort !== undefined && { port: mcpPort }) }
};
}
Comment thread
martin-fleck-at marked this conversation as resolved.

protected override createInitializeOptions(): MaybePromise<Args | undefined> {
return {
['timestamp']: new Date().toString(),
Expand Down Expand Up @@ -61,4 +70,16 @@
}
return undefined;
}

protected async getMcpServerPortFromEnv(): Promise<number | undefined> {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could probably align this into one getPortFromEnv() method that just takes the env var as parameter
Instead of three more or less identical methods

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good idea!

const envVar = await this.envVariablesServer.getValue('GLSP_MCP_SERVER_PORT');
if (envVar && envVar.value) {
const mcpServerPort = Number.parseInt(envVar.value, 10);
if (isNaN(mcpServerPort) || mcpServerPort < 0 || mcpServerPort > 65535) {
throw new Error('Value of environment variable GLSP_MCP_SERVER_PORT is not a valid port');
}
return mcpServerPort;
}
return undefined;
}
}
3 changes: 3 additions & 0 deletions examples/workflow-theia/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
"references": [
{
"path": "../../packages/theia-integration"
},
{
"path": "../../packages/theia-mcp-integration"
}
]
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "2.7.0-next",
"private": true,
"workspaces": [
"packages/theia-integration",
"packages/*",
"examples/*"
],
"scripts": {
Expand Down
Loading
Loading