Skip to content
Merged
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
27 changes: 25 additions & 2 deletions Makefile

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🚩 Makefile gen-build-clean target still uses invalid --clean flag despite docs update

The PR updates documentation in multiple languages (e.g., docs/src/content/docs/development/codegen.md:24-28) to recommend dart run build_runner clean followed by dart run build_runner build --delete-conflicting-outputs as two separate commands. However, the Makefile gen-build-clean target at Makefile:94-95 still uses the old single-command form dart run build_runner build --delete-conflicting-outputs --clean. The --clean flag is not a valid option for build_runner build; the correct approach is build_runner clean as a separate subcommand. This is a pre-existing issue, but the PR's doc changes explicitly corrected the guidance without updating the Makefile target to match.

(Refers to lines 94-95)

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ PLATFORM ?=
ENV_FILE ?=
XCARCHIVE_PATH ?=
APP_PATH ?=
DMG_PATH ?=
TAP_REPO_PATH ?=

.PHONY: help deps pub-get run run-device analyze test test-one coverage \
gen gen-build gen-build-clean gen-l10n build build-android build-ios \
build-macos build-linux build-windows clean release-macos-dmg package-dmg
build-macos build-linux build-windows clean release-macos-dmg package-dmg \
sync-homebrew-cask

help:
@printf '%s\n' \
Expand Down Expand Up @@ -48,7 +51,11 @@ help:
' Optional: make release-macos-dmg ENV_FILE=.env.release' \
' package-dmg Run scripts/release/package-dmg-from-xcarchive.sh' \
' Example: make package-dmg APP_PATH="/path/Server Box.app"' \
' Example: make package-dmg XCARCHIVE_PATH=/path/Runner.xcarchive'
' Example: make package-dmg XCARCHIVE_PATH=/path/Runner.xcarchive' \
' sync-homebrew-cask Generate ~/proj/homebrew-taps/Casks/server-box.rb from a built DMG' \
' Example: make sync-homebrew-cask APP_PATH="/path/Server Box.app"' \
' Example: make sync-homebrew-cask XCARCHIVE_PATH=/path/Runner.xcarchive' \
' Example: make sync-homebrew-cask DMG_PATH=build/artifacts/ServerBox-1.0.1.dmg'

deps pub-get:
$(FLUTTER) pub get
Expand Down Expand Up @@ -134,3 +141,19 @@ package-dmg:
else \
XCARCHIVE_PATH="$(XCARCHIVE_PATH)" bash scripts/release/package-dmg-from-xcarchive.sh; \
fi

sync-homebrew-cask:
@if [ -z "$(APP_PATH)" ] && [ -z "$(XCARCHIVE_PATH)" ] && [ -z "$(DMG_PATH)" ]; then \
echo 'APP_PATH, XCARCHIVE_PATH, or DMG_PATH is required.'; \
echo 'Example: make sync-homebrew-cask APP_PATH="/path/Server Box.app"'; \
echo 'Example: make sync-homebrew-cask XCARCHIVE_PATH=/path/Runner.xcarchive'; \
echo 'Example: make sync-homebrew-cask DMG_PATH=build/artifacts/ServerBox-1.0.1.dmg'; \
exit 1; \
fi
@if [ -n "$(APP_PATH)" ]; then \
APP_PATH="$(APP_PATH)" DMG_PATH="$(DMG_PATH)" TAP_REPO_PATH="$(TAP_REPO_PATH)" bash scripts/release/sync-homebrew-cask.sh; \
elif [ -n "$(XCARCHIVE_PATH)" ]; then \
XCARCHIVE_PATH="$(XCARCHIVE_PATH)" DMG_PATH="$(DMG_PATH)" TAP_REPO_PATH="$(TAP_REPO_PATH)" bash scripts/release/sync-homebrew-cask.sh; \
else \
DMG_PATH="$(DMG_PATH)" TAP_REPO_PATH="$(TAP_REPO_PATH)" bash scripts/release/sync-homebrew-cask.sh; \
fi
18 changes: 4 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartss

|Platform| From|
|--|--|
| iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703) |
| Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/) |
| Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) |
| iOS | [AppStore](https://apps.apple.com/app/id1586449703) |
| macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box |
| Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/) |
| Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) |
Comment on lines +33 to +36

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.

⚠️ Potential issue | 🟡 Minor

Fix markdownlint MD055 table pipe style on installation rows.

Line 33 and Line 34 currently violate the configured table pipe style; this can cause lint noise/failures.

🔧 Proposed markdownlint-compliant table format
-|Platform| From|
-|--|--|
-| iOS | [AppStore](https://apps.apple.com/app/id1586449703) |
-| macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box |
-| Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/) |
-| Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) |
+Platform | From
+-- | --
+iOS | [AppStore](https://apps.apple.com/app/id1586449703)
+macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box
+Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
+Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 33-33: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected leading pipe

(MD055, table-pipe-style)


[warning] 33-33: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 34-34: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected leading pipe

(MD055, table-pipe-style)


[warning] 34-34: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 33 - 36, The iOS and macOS installation rows in the
README table violate markdownlint MD055 pipe style; update those two table rows
(the iOS row with "AppStore" link and the macOS row with "AppStore / brew
install --cask server-box") to use the same pipe style as the other rows by
adding the leading and trailing pipe characters and matching column separators
(e.g., change " | iOS | [AppStore](...)" to "| iOS | [AppStore](...) |" and
similarly ensure the macOS row ends with a trailing pipe).


Please only download pkgs from the source that **you trust**!

Expand Down Expand Up @@ -73,17 +74,6 @@ If I forgot to add your name to the contributors list, please add a comment in t
2. Clone this repo, run `flutter run` to start the app.
3. Run `dart run fl_build -p PLATFORM` to build the app.

### Release macOS notarized DMG

1. Copy `.env.release.example` to `.env.release`.
2. Fill in `APPLE_TEAM_ID` and `APPLE_NOTARY_KEYCHAIN_PROFILE`.
3. Make sure the `Developer ID Application` certificate is already installed in Keychain.
4. Make sure notarization credentials are already stored via `xcrun notarytool store-credentials`.
5. Install the provisioning profile used for DMG packaging. The script defaults to `ServerBox DMG Profile`, and you can override it with `APP_PROFILE_NAME`.
6. Run `bash scripts/release/release-macos-dmg.sh`.

This flow does not modify the default Xcode Release signing config. It injects a temporary `xcconfig` only for archive/export, builds a signed `.app`, packages a DMG, submits it to notarization, staples the result, and optionally uploads the DMG to the GitHub Release for `v<version>`.

### Translation

- [Guide](https://blog.lpkt.cn/posts/faq/) can be found in my blog.
Expand Down
16 changes: 3 additions & 13 deletions README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@

平台|下载
--|--
iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703)
Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
| iOS | [AppStore](https://apps.apple.com/app/id1586449703) |
| macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box |
Comment on lines +33 to +34

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.

⚠️ Potential issue | 🟡 Minor

Fix table row pipe style to satisfy markdownlint MD055.

Line 33 and Line 34 use leading/trailing pipes, but this table is otherwise in compact style. This will keep lint warnings active.

💡 Suggested diff
-| iOS | [AppStore](https://apps.apple.com/app/id1586449703) |
-| macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box |
+iOS | [AppStore](https://apps.apple.com/app/id1586449703)
+macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 33-33: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected leading pipe

(MD055, table-pipe-style)


[warning] 33-33: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 34-34: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected leading pipe

(MD055, table-pipe-style)


[warning] 34-34: Table pipe style
Expected: no_leading_or_trailing; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README_zh.md` around lines 33 - 34, Two table rows ("iOS" and "macOS"
entries) use leading/trailing pipe characters while the rest of the table uses
compact style, triggering markdownlint MD055; remove the leading and trailing
pipe characters from those two rows so they match the compact table format
(i.e., make the "iOS" and "macOS" rows omit the starting and ending |
characters) to satisfy the linter.

Comment on lines +33 to +34

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 README_zh.md table rows have inconsistent pipe formatting causing broken table

The installation table in README_zh.md mixes two markdown table row styles. Lines 33–34 (iOS, macOS) use | col | col | syntax with leading/trailing pipes, but the header row (平台|下载 / --|--) and lines 35–36 (Android, Linux/Windows) omit leading pipes. This inconsistency causes the iOS and macOS rows to be parsed as having extra columns (the leading | creates an implicit empty first column), while Android/Linux rows parse correctly as 2 columns. Compare with README.md:31-36 which uses consistent | formatting throughout.

Suggested change
| iOS | [AppStore](https://apps.apple.com/app/id1586449703) |
| macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box |
iOS | [AppStore](https://apps.apple.com/app/id1586449703)
macOS | [AppStore](https://apps.apple.com/app/id1586449703) / brew install --cask server-box
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)

请从 **信任** 的来源下载!
Expand Down Expand Up @@ -75,17 +76,6 @@ Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/rel
2. 克隆这个仓库, 运行 `flutter run` 启动应用
3. 运行 `dart run fl_build -p PLATFORM` 构建应用

### 发布 macOS 公证 DMG

1. 复制 `.env.release.example` 为 `.env.release`
2. 填入 `APPLE_TEAM_ID` 和 `APPLE_NOTARY_KEYCHAIN_PROFILE`
3. 确保 `Developer ID Application` 证书已经安装到 Keychain
4. 确保已经通过 `xcrun notarytool store-credentials` 存好了公证凭据
5. 安装用于 DMG 打包的 provisioning profile。脚本默认使用 `ServerBox DMG Profile`,也可以通过 `APP_PROFILE_NAME` 覆盖
6. 运行 `bash scripts/release/release-macos-dmg.sh`

这套流程不会修改工程默认的 Xcode Release 签名配置。脚本只会在归档和导出时注入临时 `xcconfig`,生成已签名 `.app`、打包 DMG、提交公证、回填 stapler,并可选把 DMG 上传到 `v<version>` 对应的 GitHub Release。

### 翻译

[指南](https://blog.lpkt.cn/faq/) 可在我的博客中找到。
Expand Down
1 change: 1 addition & 0 deletions docs/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import starlight from '@astrojs/starlight';

// https://astro.build/config
export default defineConfig({
base: '/docs',
integrations: [
starlight({
title: 'Server Box',
Expand Down
11 changes: 6 additions & 5 deletions docs/src/content/docs/advanced/bulk-import.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Import multiple server configurations at once using a JSON file.
:::danger[Security Warning]
**Never store plaintext passwords in files!** This JSON example shows a password field for demonstration only, but you should:

- **Prefer SSH keys** (`keyId`) instead of `pwd` - they're more secure
- **Prefer SSH keys** (`pubKeyId`) instead of `pwd` - they're more secure
- **Use secret managers** or environment variables if you must use passwords
- **Delete the file immediately** after import - don't leave credentials lying around
- **Add to .gitignore** - never commit credential files to version control
Expand All @@ -24,7 +24,7 @@ Import multiple server configurations at once using a JSON file.
"port": 22,
"user": "root",
"pwd": "password",
"keyId": "",
"pubKeyId": "",
"tags": ["production"],
"autoConnect": false
}
Expand All @@ -40,9 +40,10 @@ Import multiple server configurations at once using a JSON file.
| `port` | Yes | SSH port (usually 22) |
| `user` | Yes | SSH username |
| `pwd` | No | Password (avoid - use SSH keys instead) |
| `keyId` | No | SSH key name (from Private Keys - recommended) |
| `pubKeyId` | No | Private key id (from Private Keys - recommended) |
| `tags` | No | Organization tags |
| `autoConnect` | No | Auto-connect on startup |
| `id` | No | Stable server id; omitted or empty values are generated on import |

## Import Steps

Expand All @@ -60,15 +61,15 @@ Import multiple server configurations at once using a JSON file.
"ip": "prod.example.com",
"port": 22,
"user": "admin",
"keyId": "my-key",
"pubKeyId": "my-key",
"tags": ["production", "web"]
},
{
"name": "Development",
"ip": "dev.example.com",
"port": 2222,
"user": "dev",
"keyId": "dev-key",
"pubKeyId": "dev-key",
"tags": ["development"]
}
]
Expand Down
10 changes: 5 additions & 5 deletions docs/src/content/docs/de/advanced/bulk-import.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Importieren Sie mehrere Serverkonfigurationen gleichzeitig mithilfe einer JSON-D
:::danger[Sicherheitswarnung]
**Speichern Sie niemals Klartext-Passwörter in Dateien!** Dieses JSON-Beispiel zeigt ein Passwort-Feld nur zur Demonstration, aber Sie sollten:

- **SSH-Schlüssel bevorzugen** (`keyId`) anstelle von `pwd` - diese sind sicherer
- **SSH-Schlüssel bevorzugen** (`pubKeyId`) anstelle von `pwd` - diese sind sicherer
- **Passwort-Manager** oder Umgebungsvariablen verwenden, wenn Sie Passwörter verwenden müssen
- **Löschen Sie die Datei sofort** nach dem Import - lassen Sie keine Anmeldedaten herumliegen
- **Fügen Sie sie zur .gitignore hinzu** - checken Sie niemals Anmeldedatendateien in die Versionsverwaltung ein
Expand All @@ -24,7 +24,7 @@ Importieren Sie mehrere Serverkonfigurationen gleichzeitig mithilfe einer JSON-D
"port": 22,
"user": "root",
"pwd": "password",
"keyId": "",
"pubKeyId": "",
"tags": ["production"],
"autoConnect": false
}
Expand All @@ -40,7 +40,7 @@ Importieren Sie mehrere Serverkonfigurationen gleichzeitig mithilfe einer JSON-D
| `port` | Ja | SSH-Port (normalerweise 22) |
| `user` | Ja | SSH-Benutzername |
| `pwd` | Nein | Passwort (vermeiden - stattdessen SSH-Schlüssel verwenden) |
| `keyId` | Nein | SSH-Schlüsselname (aus Private Keys - empfohlen) |
| `pubKeyId` | Nein | Private-Key-ID (aus Private Keys - empfohlen) |
| `tags` | Nein | Organisations-Tags |
| `autoConnect` | Nein | Automatische Verbindung beim Start |

Expand All @@ -60,15 +60,15 @@ Importieren Sie mehrere Serverkonfigurationen gleichzeitig mithilfe einer JSON-D
"ip": "prod.example.com",
"port": 22,
"user": "admin",
"keyId": "my-key",
"pubKeyId": "my-key",
"tags": ["production", "web"]
},
{
"name": "Entwicklung",
"ip": "dev.example.com",
"port": 2222,
"user": "dev",
"keyId": "dev-key",
"pubKeyId": "dev-key",
"tags": ["development"]
}
]
Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/de/development/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Server Box folgt den Prinzipien der Clean Architecture mit einer klaren Trennung
### Lokale Speicherung: Hive

- **hive_ce**: Community-Edition von Hive
- Keine manuellen `@HiveField` oder `@HiveType` erforderlich
- Folgen Sie dem bestehenden Modellmuster: Die meisten Stores verwenden `hive_ce`, einige verfolgte Modelle deklarieren weiterhin explizit `@HiveType` und `@HiveField`
- Typ-Adapter werden automatisch generiert
- Persistenter Key-Value-Speicher

Expand Down
9 changes: 6 additions & 3 deletions docs/src/content/docs/de/development/codegen.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@ Führen Sie sie aus nach der Änderung von:
# Gesamten Code generieren
dart run build_runner build --delete-conflicting-outputs

# Bereinigen und neu generieren
dart run build_runner build --delete-conflicting-outputs --clean
# Generierten Build-Cache bereinigen
dart run build_runner clean

# Dann neu generieren
dart run build_runner build --delete-conflicting-outputs
```

## Generierte Dateien
Expand Down Expand Up @@ -94,5 +97,5 @@ Generiert `lib/generated/l10n/` aus `lib/l10n/*.arb` Dateien.
## Tipps

- Verwenden Sie `--delete-conflicting-outputs`, um Konflikte zu vermeiden.
- Fügen Sie generierte Dateien zur `.gitignore` hinzu.
- Behalten Sie generierte Dateien in der Versionsverwaltung, wenn dieses Repository sie bereits verfolgt.
- Bearbeiten Sie generierte Dateien niemals manuell.
31 changes: 4 additions & 27 deletions docs/src/content/docs/de/development/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,7 @@ flutter test --coverage

## Teststruktur

Tests befinden sich im Verzeichnis `test/` und spiegeln die Struktur von `lib/` wider:

```
test/
├── data/
│ ├── model/
│ └── provider/
├── view/
│ └── widget/
└── test_helpers.dart
```
Tests befinden sich im Verzeichnis `test/`. Die aktuelle Suite ist überwiegend flach und nach Parser-, Modell- und Utility-Verhalten gruppiert, zum Beispiel `cpu_test.dart`, `container_test.dart` und `ssh_config_test.dart`.

## Unit-Tests

Expand Down Expand Up @@ -71,26 +61,13 @@ test('serverStatusProvider gibt Status zurück', () async {
});
```

## Mocking

Mocks für externe Abhängigkeiten verwenden:

```dart
class MockSshService extends Mock implements SshService {}
## Externe Abhängigkeiten

test('verbindet zum Server', () async {
final mockSsh = MockSshService();
when(mockSsh.connect(any)).thenAnswer((_) async => true);

// Test mit Mock
});
```
Vermeiden Sie Tests, die von echten SSH-Servern abhängen. Parser-, Modell- und Command-Builder-Tests sollten deterministisch bleiben; fügen Sie gezielte Fakes oder Fixtures hinzu, wenn eine Funktion eine Service-Grenze einführt.

## Integrationstests

Komplette Benutzerabläufe testen (in `integration_test/`):

```dart
Im aktuellen Repository gibt es keine `integration_test/`-Suite. Fügen Sie Integrationstests nur hinzu, wenn eine Funktion End-to-End-Geräte- oder App-Flow-Abdeckung benötigt.dart

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Missing code fence opener in localized testing docs renders Dart code as plain paragraph text

In the German (and identically in es, fr, ja, zh) testing docs, the ```dart code fence opening was accidentally concatenated to the preceding paragraph text. Line 70 reads ...benötigt.dart where .dart is actually the language hint from a code fence that lost its triple-backtick delimiter. The closing ``` remains orphaned on line 82. This causes the Dart code example (lines 71–81) to render as raw inline text instead of a formatted code block.

Same bug in other locale files
  • docs/src/content/docs/es/development/testing.md:70
  • docs/src/content/docs/fr/development/testing.md:70
  • docs/src/content/docs/ja/development/testing.md:70
  • docs/src/content/docs/zh/development/testing.md:70

The English version (docs/src/content/docs/development/testing.md) correctly removed the code block entirely, so it's unaffected.

Prompt for agents
In five localized testing docs (de, es, fr, ja, zh), the code-fence opening triple-backtick-dart got concatenated to the end of the preceding paragraph line. For example, in docs/src/content/docs/de/development/testing.md line 70, the text ends with 'benötigt.dart' instead of 'benötigt.' followed by a blank line and then a proper code fence. The same pattern appears on line 70 of es, fr, ja, and zh equivalents. Either add a proper code fence opening (blank line then triple-backtick-dart) before the testWidgets code, or remove the orphaned code block entirely to match the English version which just says there is no integration_test suite.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

testWidgets('Server hinzufügen Ablauf', (tester) async {
await tester.pumpWidget(MyApp());

Expand Down
4 changes: 2 additions & 2 deletions docs/src/content/docs/de/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ hero:
tagline: Verwalten Sie Ihre Linux-Server von überall aus
actions:
- text: Loslegen
link: /de/introduction/
link: /docs/de/introduction/
icon: right-arrow
variant: primary
- text: Auf GitHub ansehen
Expand Down Expand Up @@ -41,6 +41,6 @@ import { Card, CardGrid } from '@astrojs/starlight/components';

## Quick-Links

- **Download**: Verfügbar im [App Store](https://apps.apple.com/app/id1586449703), auf [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) und bei [F-Droid](https://f-droid.org/)
- **Download**: Verfügbar im [App Store](https://apps.apple.com/app/id1586449703), auf [GitHub](https://github.com/lollipopkit/flutter_server_box/releases), bei [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox), im [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) und bei [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
- **Dokumentation**: Entdecken Sie die Anleitungen für den Einstieg in die Server Box
- **Support**: Treten Sie unserer Community auf GitHub für Diskussionen und Probleme bei
20 changes: 14 additions & 6 deletions docs/src/content/docs/de/installation.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,44 @@ Laden Sie es aus dem **[App Store](https://apps.apple.com/app/id1586449703)** he

Wählen Sie Ihre bevorzugte Quelle:

- **[F-Droid](https://f-droid.org/)** – Für Benutzer, die reine FOSS-Quellen bevorzugen
- **[GitHub Releases](https://github.com/lollipopkit/flutter_server_box/releases)** – Für die neueste Version direkt von der Quelle
- **[CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)** – Spiegel für Release-Pakete
- **[F-Droid](https://f-droid.org/packages/tech.lolli.toolbox)** – Für Benutzer, die reine FOSS-Quellen bevorzugen
- **[OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)** – Drittanbieter-Android-App-Store

## Desktop Apps

### macOS

Herunterladen von den **[GitHub Releases](https://github.com/lollipopkit/flutter_server_box/releases)**.
Aus dem **[App Store](https://apps.apple.com/app/id1586449703)** herunterladen oder mit Homebrew Cask installieren:

```sh
brew install --cask server-box
```

Funktionen:
- Native Menüleisten-Integration
- Unterstützung für sowohl Intel als auch Apple Silicon

### Linux

Herunterladen von den **[GitHub Releases](https://github.com/lollipopkit/flutter_server_box/releases)**.
Herunterladen von den **[GitHub Releases](https://github.com/lollipopkit/flutter_server_box/releases)** oder dem **[CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)**.

Verfügbar als AppImage, deb oder tar.gz Pakete.
GitHub Releases und CDN stellen Linux-AppImage-Pakete bereit.

### Windows

Herunterladen von den **[GitHub Releases](https://github.com/lollipopkit/flutter_server_box/releases)**.
Herunterladen von den **[GitHub Releases](https://github.com/lollipopkit/flutter_server_box/releases)** oder dem **[CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)**.

GitHub Releases und CDN stellen Windows-zip-Pakete bereit.

## watchOS

Verfügbar im **[App Store](https://apps.apple.com/app/id1586449703)** als Teil der iOS-App.

## Aus dem Quellcode bauen

Um Server Box aus dem Quellcode zu bauen, lesen Sie den Abschnitt [Bauen](/de/development/building/) in der Entwicklungsdokumentation.
Um Server Box aus dem Quellcode zu bauen, lesen Sie den Abschnitt [Bauen](/docs/de/development/building/) in der Entwicklungsdokumentation.

## Versionsinformationen

Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/de/principles/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ void main() {
- Keine Abhängigkeiten von nativem Code
- Schneller Key-Value-Speicher
- Typsicher durch Codegenerierung
- Keine manuellen Feld-Annotationen erforderlich
- Folgen Sie dem bestehenden Modellmuster; einige verfolgte Modelle verwenden weiterhin explizite Feld-Annotationen

**Stores:**
- `SettingStore`: App-Einstellungen
Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/development/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Server Box follows clean architecture principles with clear separation between d
### Local Storage: Hive

- **hive_ce**: Community edition of Hive
- No manual `@HiveField` or `@HiveType` needed
- Follow the existing model pattern: most stores use `hive_ce`, while some tracked models still declare `@HiveType` and `@HiveField` explicitly
- Type adapters auto-generated
- Persistent key-value storage

Expand Down
9 changes: 6 additions & 3 deletions docs/src/content/docs/development/codegen.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@ Run after modifying:
# Generate all code
dart run build_runner build --delete-conflicting-outputs

# Clean and regenerate
dart run build_runner build --delete-conflicting-outputs --clean
# Clean generated build cache
dart run build_runner clean

# Then regenerate
dart run build_runner build --delete-conflicting-outputs
```

## Generated Files
Expand Down Expand Up @@ -94,5 +97,5 @@ Generates `lib/generated/l10n/` from `lib/l10n/*.arb` files.
## Tips

- Use `--delete-conflicting-outputs` to avoid conflicts
- Add generated files to `.gitignore`
- Keep generated files in version control when they are already tracked by this repository
- Never manually edit generated files
Loading