diff --git a/.husky/pre-commit b/.husky/pre-commit
index 0cd5fd7..553f74e 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,8 +1,17 @@
#!/bin/sh
set -e
-npx prettier --write "src/**/*.ts" "webviews/viewer/src/**/*.{ts,svelte}" "webviews/export/**/*.{js,css,html}"
-git add -u
+# Only format files staged for this commit, and re-stage only those files.
+# A blanket `git add -u` would otherwise sweep unrelated tracked
+# modifications into the commit.
+staged_files=$(git diff --cached --name-only --diff-filter=ACMR | \
+ grep -E '^(src/.*\.ts|webviews/viewer/src/.*\.(ts|svelte)|webviews/export/.*\.(js|css|html))$' || true)
+
+if [ -n "$staged_files" ]; then
+ echo "$staged_files" | tr '\n' '\0' | xargs -0 npx prettier --write
+ echo "$staged_files" | tr '\n' '\0' | xargs -0 git add
+fi
+
npx eslint --max-warnings=0 src/ webviews/export/
npx svelte-check --tsconfig webviews/viewer/tsconfig.json --fail-on-warnings
python3 -m ruff check python/lsp/ python/med2obj.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6662ce..add871c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,15 @@ All notable changes to the **VS Code Aster** extension will be documented in thi
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [1.5.4] - 2026-04-15
+
+File icon improvements and language support for `.export` and MED files.
+
+### Added
+- Dedicated file icons for `.export` files (blue rocket) and `.med` / `.mmed` / `.rmed` files (orange cube)
+- Refreshed code_aster logo, now bundled with its SVG source
+- `vs-code-aster.medFileExtensions` setting to register arbitrary extensions (e.g. `.21`, `.71`) as MED files, which code_aster writes under the I/O unit number
+
## [1.5.3] - 2026-03-26
Comment toggle support and Windows debugging improvements.
diff --git a/CITATION.cff b/CITATION.cff
index e4e2a92..a3dffb4 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -1,4 +1,4 @@
-cff-version: 1.5.3
+cff-version: 1.5.4
title: VS Code Aster
message: >-
If you use this software, please cite it using the
diff --git a/README.md b/README.md
index 710c4b6..e072e84 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-
+
diff --git a/ROADMAP.md b/ROADMAP.md
index 27711ee..949c6b7 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -4,7 +4,7 @@
The extension aims to reduce friction between modeling, validation, execution, and analysis by bringing **code_aster** native workflows into the editor.
-## Current Capabilities (v1.5.3)
+## Current Capabilities (v1.5.4)
- `.export` file generator
- 3D mesh viewer
diff --git a/media/images/icone-code-aster.png b/media/images/icone-code-aster.png
index a30eb7a..e676fde 100644
Binary files a/media/images/icone-code-aster.png and b/media/images/icone-code-aster.png differ
diff --git a/media/images/icone-code-aster.svg b/media/images/icone-code-aster.svg
new file mode 100755
index 0000000..baf0ec0
--- /dev/null
+++ b/media/images/icone-code-aster.svg
@@ -0,0 +1,40 @@
+
+
\ No newline at end of file
diff --git a/media/images/icone-export-dark.svg b/media/images/icone-export-dark.svg
new file mode 100644
index 0000000..a66c0e3
--- /dev/null
+++ b/media/images/icone-export-dark.svg
@@ -0,0 +1,8 @@
+
diff --git a/media/images/icone-export-light.svg b/media/images/icone-export-light.svg
new file mode 100644
index 0000000..a66c0e3
--- /dev/null
+++ b/media/images/icone-export-light.svg
@@ -0,0 +1,8 @@
+
diff --git a/media/images/icone-med-dark.svg b/media/images/icone-med-dark.svg
new file mode 100644
index 0000000..e113e74
--- /dev/null
+++ b/media/images/icone-med-dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/media/images/icone-med-light.svg b/media/images/icone-med-light.svg
new file mode 100644
index 0000000..e113e74
--- /dev/null
+++ b/media/images/icone-med-light.svg
@@ -0,0 +1,6 @@
+
diff --git a/package-lock.json b/package-lock.json
index 8a8c731..f255755 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "vs-code-aster",
- "version": "1.5.3",
+ "version": "1.5.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "vs-code-aster",
- "version": "1.5.3",
+ "version": "1.5.4",
"license": "GPL-3.0",
"dependencies": {
"@tailwindcss/cli": "^4.1.17",
diff --git a/package.json b/package.json
index 35f3e17..457bc47 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "vs-code-aster",
"displayName": "VS Code Aster",
- "version": "1.5.3",
+ "version": "1.5.4",
"description": "VS Code extension for code_aster",
"publisher": "simvia",
"license": "GPL-3.0",
@@ -78,10 +78,38 @@
".com9"
],
"icon": {
- "light": "./media/images/icone-code-aster.png",
- "dark": "./media/images/icone-code-aster.png"
+ "light": "./media/images/icone-code-aster.svg",
+ "dark": "./media/images/icone-code-aster.svg"
},
"configuration": "./language-configuration.json"
+ },
+ {
+ "id": "export",
+ "aliases": [
+ "Aster Export"
+ ],
+ "extensions": [
+ ".export"
+ ],
+ "icon": {
+ "light": "./media/images/icone-export-light.svg",
+ "dark": "./media/images/icone-export-dark.svg"
+ }
+ },
+ {
+ "id": "med",
+ "aliases": [
+ "MED"
+ ],
+ "extensions": [
+ ".med",
+ ".mmed",
+ ".rmed"
+ ],
+ "icon": {
+ "light": "./media/images/icone-med-light.svg",
+ "dark": "./media/images/icone-med-dark.svg"
+ }
}
],
"grammars": [
@@ -143,6 +171,19 @@
],
"markdownDescription": "Specifies the file extensions to be recognized as Code Aster command files. Default includes `.comm`, `.com`, and `.com0`-`.com9`. You can customize this list as needed."
},
+ "vs-code-aster.medFileExtensions": {
+ "order": 0,
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "default": [
+ ".med",
+ ".mmed",
+ ".rmed"
+ ],
+ "markdownDescription": "Specifies the file extensions to be recognized as MED mesh/result files. code_aster may also write MED data under numeric extensions matching the I/O unit (e.g. `.21`, `.71`). Add such extensions here to apply the MED icon and language association. Extensions listed here are automatically written to `files.associations`."
+ },
"vs-code-aster.aliasForRun": {
"order": 1,
"type": "string",
diff --git a/src/MedLanguageSync.ts b/src/MedLanguageSync.ts
new file mode 100644
index 0000000..fc786d7
--- /dev/null
+++ b/src/MedLanguageSync.ts
@@ -0,0 +1,71 @@
+/**
+ * Keeps `files.associations` in sync with the `vs-code-aster.medFileExtensions` setting.
+ *
+ * VS Code's `contributes.languages[].extensions` is static (read once from package.json at
+ * load time). To let users dynamically map arbitrary extensions (e.g. `.71`, `.72`) to the
+ * `med` language — which gives them the MED icon and language ID — we programmatically
+ * write `files.associations` entries on activation and whenever the setting changes.
+ *
+ * Ownership tracking: we only ever touch `files.associations` entries whose value is `med`.
+ * Other entries (added by the user or other extensions) are left untouched.
+ */
+import * as vscode from 'vscode';
+
+const MED_LANGUAGE_ID = 'med';
+const SETTING_KEY = 'medFileExtensions';
+
+function normalizeExtension(ext: string): string | null {
+ const trimmed = ext.trim();
+ if (!trimmed) {
+ return null;
+ }
+ const withDot = trimmed.startsWith('.') ? trimmed : `.${trimmed}`;
+ return withDot.toLowerCase();
+}
+
+async function syncAssociations(): Promise {
+ const asterConfig = vscode.workspace.getConfiguration('vs-code-aster');
+ const raw = asterConfig.get(SETTING_KEY, ['.med', '.mmed', '.rmed']);
+
+ const desiredPatterns = new Set(
+ raw
+ .map(normalizeExtension)
+ .filter((e): e is string => e !== null)
+ .map((ext) => `*${ext}`)
+ );
+
+ const filesConfig = vscode.workspace.getConfiguration('files');
+ const current = filesConfig.get>('associations') ?? {};
+ const next: Record = {};
+
+ for (const [pattern, language] of Object.entries(current)) {
+ if (language === MED_LANGUAGE_ID) {
+ continue;
+ }
+ next[pattern] = language;
+ }
+
+ for (const pattern of desiredPatterns) {
+ next[pattern] = MED_LANGUAGE_ID;
+ }
+
+ const before = JSON.stringify(current);
+ const after = JSON.stringify(next);
+ if (before === after) {
+ return;
+ }
+
+ await filesConfig.update('associations', next, vscode.ConfigurationTarget.Global);
+}
+
+export function activateMedLanguageSync(context: vscode.ExtensionContext): void {
+ void syncAssociations();
+
+ const listener = vscode.workspace.onDidChangeConfiguration((event) => {
+ if (event.affectsConfiguration(`vs-code-aster.${SETTING_KEY}`)) {
+ void syncAssociations();
+ }
+ });
+
+ context.subscriptions.push(listener);
+}
diff --git a/src/extension.ts b/src/extension.ts
index 15f77bd..0d63061 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -9,6 +9,7 @@ import { ExportEditor } from './ExportEditor';
import { RunAster } from './RunAster';
import { LspServer } from './LspServer';
import { StatusBar } from './StatusBar';
+import { activateMedLanguageSync } from './MedLanguageSync';
import { setTelemetryContext } from './telemetry';
/**
@@ -39,6 +40,8 @@ export async function activate(context: vscode.ExtensionContext) {
StatusBar.instance.activate(context);
+ activateMedLanguageSync(context);
+
context.subscriptions.push(runaster);
context.subscriptions.push(createExportDoc);
context.subscriptions.push(createMesh);