Compare commits

...

3 commits

Author SHA1 Message Date
flemming-it
dfc24d3c58 fix(l10n): plain approvals hint, real plurals, de-jargoned chain pill
Some checks failed
Security / Security check (push) Failing after 1s
- approvals inbox hint explains human approval in plain words
  instead of citing system.approval@^0
- doctor summary counts use ICU plurals (1 module / n modules)
- audit chain pill says 'Integrity chain verified' instead of 'v1'

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
79e08c8d17 test(shots): seed demo flows so the flows page proves module logic both ways
hello.yaml needs debug.echo (not installed on the fixture hub) and
must carry the missing-module note; genehmigung-demo.yaml only uses
the hub builtin system.approval and must show a plain play button.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
dd0737b8b1 chore: complete the flow editor 0.24.0 pin (lockfile)
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
7 changed files with 93 additions and 21 deletions

View file

@ -187,6 +187,42 @@ void main() {
]);
}
// Seed two demo flows so the Flows page shows the real list
// instead of its empty state (and proves the missing-module
// logic both ways): hello needs debug.echo not installed on
// the fixture hub, so it must carry the "1 module missing"
// note; the approval flow only uses the hub builtin
// system.approval and must show a plain play button.
final flowsDir = Directory(
'${Platform.environment['HOME']}/.chain/data/flows',
)..createSync(recursive: true);
File('${flowsDir.path}/hello.yaml').writeAsStringSync(
'# F∆I sample flow\n'
'inputs:\n'
' name:\n'
' type: string\n'
'steps:\n'
' - id: echo\n'
' use: debug.echo@^0\n'
' with:\n'
' text: "Hello, {{ inputs.name }}!"\n'
'outputs:\n'
' greeting: "{{ steps.echo.text }}"\n',
);
File('${flowsDir.path}/genehmigung-demo.yaml').writeAsStringSync(
'# F∆I sample flow\n'
'inputs:\n'
' antrag:\n'
' type: string\n'
'steps:\n'
' - id: freigabe\n'
' use: system.approval@^0\n'
' with:\n'
' show: "{{ inputs.antrag }}"\n'
'outputs:\n'
' entscheidung: "{{ steps.freigabe.decision }}"\n',
);
// Hermetic prefs: never read or write the operator's real ones.
SharedPreferences.setMockInitialValues({});

View file

@ -1067,7 +1067,7 @@
"approvalsTabPending": "Offen",
"approvalsTabHistory": "Verlauf",
"approvalsInboxZero": "Posteingang leer",
"approvalsInboxHint": "Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.",
"approvalsInboxHint": "Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.",
"approvalsReloadTooltip": "Aktualisieren",
"approvalsPillPending": "offen",
"approvalsPillApproved": "freigegeben",
@ -1149,7 +1149,7 @@
"doctorSummaryApprovals": "Freigaben",
"doctorSummaryAudit": "Protokoll",
"doctorSummaryServices": "Dienste",
"doctorSummaryCapabilities": "{n} Fähigkeiten",
"doctorSummaryCapabilities": "{n, plural, =1{1 Fähigkeit} other{{n} Fähigkeiten}}",
"@doctorSummaryCapabilities": {
"placeholders": {
"n": {
@ -1170,7 +1170,7 @@
}
},
"doctorSummaryDeclared": "deklariert",
"doctorModulesPanelSummary": "{n} Module · {m} Fähigkeiten",
"doctorModulesPanelSummary": "{n, plural, =1{1 Modul} other{{n} Module}} · {m, plural, =1{1 Fähigkeit} other{{m} Fähigkeiten}}",
"@doctorModulesPanelSummary": {
"placeholders": {
"n": {
@ -1225,7 +1225,7 @@
}
}
},
"doctorChainPillOk": "Integritätskette v1",
"doctorChainPillOk": "Integritätskette geprüft",
"doctorChainPillTamper": "MANIPULIERT",
"doctorVerifyNow": "Jetzt prüfen",
"doctorRestart": "Neustart",

View file

@ -1085,7 +1085,7 @@
"approvalsTabPending": "Pending",
"approvalsTabHistory": "History",
"approvalsInboxZero": "Inbox zero",
"approvalsInboxHint": "All caught up. New `system.approval@^0` steps land here automatically.",
"approvalsInboxHint": "All caught up. When a flow asks for a human approval, the request appears here automatically.",
"approvalsReloadTooltip": "Reload",
"approvalsPillPending": "pending",
"approvalsPillApproved": "approved",
@ -1173,7 +1173,7 @@
"doctorSummaryApprovals": "Approvals",
"doctorSummaryAudit": "Audit",
"doctorSummaryServices": "Services",
"doctorSummaryCapabilities": "{n} capabilities",
"doctorSummaryCapabilities": "{n, plural, =1{1 capability} other{{n} capabilities}}",
"@doctorSummaryCapabilities": {
"placeholders": {
"n": {
@ -1194,7 +1194,7 @@
}
},
"doctorSummaryDeclared": "declared",
"doctorModulesPanelSummary": "{n} modules · {m} capabilities",
"doctorModulesPanelSummary": "{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}",
"@doctorModulesPanelSummary": {
"placeholders": {
"n": {
@ -1249,7 +1249,7 @@
}
}
},
"doctorChainPillOk": "Integrity chain v1",
"doctorChainPillOk": "Integrity chain verified",
"doctorChainPillTamper": "TAMPER",
"doctorVerifyNow": "Verify now",
"doctorRestart": "Restart",

View file

@ -3359,7 +3359,7 @@ abstract class AppLocalizations {
/// No description provided for @approvalsInboxHint.
///
/// In en, this message translates to:
/// **'All caught up. New `system.approval@^0` steps land here automatically.'**
/// **'All caught up. When a flow asks for a human approval, the request appears here automatically.'**
String get approvalsInboxHint;
/// No description provided for @approvalsReloadTooltip.
@ -3563,7 +3563,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorSummaryCapabilities.
///
/// In en, this message translates to:
/// **'{n} capabilities'**
/// **'{n, plural, =1{1 capability} other{{n} capabilities}}'**
String doctorSummaryCapabilities(int n);
/// No description provided for @doctorSummaryPending.
@ -3587,7 +3587,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorModulesPanelSummary.
///
/// In en, this message translates to:
/// **'{n} modules · {m} capabilities'**
/// **'{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}'**
String doctorModulesPanelSummary(int n, int m);
/// No description provided for @doctorApprovalsNone.
@ -3695,7 +3695,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorChainPillOk.
///
/// In en, this message translates to:
/// **'Integrity chain v1'**
/// **'Integrity chain verified'**
String get doctorChainPillOk;
/// No description provided for @doctorChainPillTamper.

View file

@ -1941,7 +1941,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get approvalsInboxHint =>
'Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.';
'Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.';
@override
String get approvalsReloadTooltip => 'Aktualisieren';
@ -2063,7 +2063,13 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String doctorSummaryCapabilities(int n) {
return '$n Fähigkeiten';
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n Fähigkeiten',
one: '1 Fähigkeit',
);
return '$_temp0';
}
@override
@ -2079,7 +2085,19 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String doctorModulesPanelSummary(int n, int m) {
return '$n Module · $m Fähigkeiten';
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n Module',
one: '1 Modul',
);
String _temp1 = intl.Intl.pluralLogic(
m,
locale: localeName,
other: '$m Fähigkeiten',
one: '1 Fähigkeit',
);
return '$_temp0 · $_temp1';
}
@override
@ -2153,7 +2171,7 @@ class AppLocalizationsDe extends AppLocalizations {
}
@override
String get doctorChainPillOk => 'Integritätskette v1';
String get doctorChainPillOk => 'Integritätskette geprüft';
@override
String get doctorChainPillTamper => 'MANIPULIERT';

View file

@ -1950,7 +1950,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get approvalsInboxHint =>
'All caught up. New `system.approval@^0` steps land here automatically.';
'All caught up. When a flow asks for a human approval, the request appears here automatically.';
@override
String get approvalsReloadTooltip => 'Reload';
@ -2070,7 +2070,13 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String doctorSummaryCapabilities(int n) {
return '$n capabilities';
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n capabilities',
one: '1 capability',
);
return '$_temp0';
}
@override
@ -2086,7 +2092,19 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String doctorModulesPanelSummary(int n, int m) {
return '$n modules · $m capabilities';
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n modules',
one: '1 module',
);
String _temp1 = intl.Intl.pluralLogic(
m,
locale: localeName,
other: '$m capabilities',
one: '1 capability',
);
return '$_temp0 · $_temp1';
}
@override
@ -2160,7 +2178,7 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get doctorChainPillOk => 'Integrity chain v1';
String get doctorChainPillOk => 'Integrity chain verified';
@override
String get doctorChainPillTamper => 'TAMPER';

View file

@ -46,7 +46,7 @@ packages:
path: "../fai_chain_studio_flow_editor"
relative: true
source: path
version: "0.23.0"
version: "0.24.0"
characters:
dependency: transitive
description: