kimal3 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/coach/de/kimal3-coach.md +2 -2
- package/coach/en/kimal3-coach.md +2 -2
- package/dist/befehle/einrichten.js +1 -1
- package/dist/befehle/login.js +6 -2
- package/dist/befehle/skill-install.js +4 -1
- package/dist/befehle/zeigen-einrichten.js +104 -0
- package/dist/befehle/zeigen-start.js +143 -0
- package/dist/befehle/zeigen.js +288 -0
- package/dist/befehle-katalog-en.js +27 -0
- package/dist/befehle-katalog.js +27 -0
- package/dist/befehlswoerter.js +11 -0
- package/dist/kimal3.js +10 -0
- package/dist/logo-ablegen.js +26 -6
- package/dist/slash-befehle.js +1 -0
- package/dist/texte/einrichten.js +10 -3
- package/dist/texte/zeigen.js +189 -0
- package/dist/zeigen-rechnung.js +226 -0
- package/dist/zeigen-umgebung.js +190 -0
- package/package.json +2 -1
- package/skill/SKILL.md +3 -2
- package/skill/commands/k3.md +4 -3
- package/skill/commands/k3kurs.md +41 -41
- package/skill/commands/k3start.md +1 -1
- package/skill/commands/k3zeigen.md +303 -0
- package/skill/en/SKILL.md +3 -2
- package/skill/en/commands/k3.md +4 -3
- package/skill/en/commands/k3course.md +41 -41
- package/skill/en/commands/k3show.md +302 -0
- package/skill/en/commands/k3start.md +1 -1
- package/zeigen/gemeinsam.py +82 -0
- package/zeigen/starter.py +163 -0
- package/zeigen/werkzeug.py +250 -0
- package/zeigen/zeitleiste.py +393 -0
|
@@ -143,6 +143,33 @@ export const BEFEHLE_EN = {
|
|
|
143
143
|
"⚠️ This is personal data about your colleagues. For use in a real company you need a commercial Claude account with a data processing agreement. If employees' performance is analysed, in Germany this requires the works council's agreement (co-determination).",
|
|
144
144
|
],
|
|
145
145
|
},
|
|
146
|
+
"kimal3 zeigen start": {
|
|
147
|
+
stempel: "35a185f9",
|
|
148
|
+
befehl: "kimal3 show start",
|
|
149
|
+
tippen: "/k3show",
|
|
150
|
+
terminal: 'kimal3 show start "Send the open quotes to my boss every Monday"',
|
|
151
|
+
beschreibung: "Start a recording while you show a task",
|
|
152
|
+
rhythmusOderSatz: "I want to show you a task",
|
|
153
|
+
details: [
|
|
154
|
+
"You do a task once on screen and say out loud what you are doing and why. Claude guides you through it: first the briefing on what gets recorded, then the recording, then the evaluation on your computer.",
|
|
155
|
+
"All screens, sound, clicks and keys are recorded — so don't type a password. The recording lies in the project under material/aufnahmen/ and never ends up in Git; it stops by itself after 15 minutes at the latest.",
|
|
156
|
+
"Claude asks you before reading any of it: only after your yes does the timeline go to Anthropic. At the end the task is written down in the project's plan folder, and Claude suggests deleting the recording.",
|
|
157
|
+
"Windows-only for now.",
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
"kimal3 zeigen status": {
|
|
161
|
+
stempel: "7ebd2b8f",
|
|
162
|
+
befehl: "kimal3 show status",
|
|
163
|
+
tippen: "! kimal3 show status",
|
|
164
|
+
terminal: "kimal3 show status",
|
|
165
|
+
beschreibung: "Check whether a recording is running and whether the recorder is set up",
|
|
166
|
+
rhythmusOderSatz: "when you want to know whether something is being recorded",
|
|
167
|
+
details: [
|
|
168
|
+
"Shows two blocks: what is set up (uv, recorder, FFmpeg, speech model) and whether a recording of your screen is running — with start time, folder and the time at which it stops by itself at the latest.",
|
|
169
|
+
"If it can't tell whether something is being recorded, it says exactly that, with exit code 1 — it then never claims that nothing is running.",
|
|
170
|
+
"It only reads and changes nothing. Windows-only for now.",
|
|
171
|
+
],
|
|
172
|
+
},
|
|
146
173
|
"kimal3 wache": {
|
|
147
174
|
stempel: "2daae4e2",
|
|
148
175
|
befehl: "kimal3 watch",
|
package/dist/befehle-katalog.js
CHANGED
|
@@ -192,6 +192,33 @@ export const BEFEHLE = [
|
|
|
192
192
|
"⚠️ Es sind personenbezogene Daten von Kolleginnen und Kollegen. Für den Einsatz in einer echten Firma braucht es ein kommerzielles Claude-Konto mit Auftragsverarbeitungsvertrag; werden Leistungen von Beschäftigten ausgewertet, ist das in Deutschland mitbestimmungspflichtig.",
|
|
193
193
|
],
|
|
194
194
|
},
|
|
195
|
+
{
|
|
196
|
+
befehl: "kimal3 zeigen start",
|
|
197
|
+
beschreibung: "Eine Aufnahme starten, während du eine Aufgabe vormachst",
|
|
198
|
+
wer: "claude",
|
|
199
|
+
ausloeser: "ich will dir eine Aufgabe vormachen",
|
|
200
|
+
tippen: "/k3zeigen",
|
|
201
|
+
terminal: 'kimal3 zeigen start "Offene Angebote jeden Montag an die Chefin schicken"',
|
|
202
|
+
details: [
|
|
203
|
+
"Du machst eine Aufgabe einmal am Bildschirm vor und sagst dabei laut, was du tust und warum. Claude führt dich durch: vorher die Ansage, was aufgenommen wird, dann die Aufnahme, danach das Auswerten auf deinem Rechner.",
|
|
204
|
+
"Aufgenommen werden alle Bildschirme, Ton, Klicks und Tasten — tippe deshalb kein Passwort. Die Aufnahme liegt im Projekt unter material/aufnahmen/ und landet nie in Git; spätestens nach 15 Minuten stoppt sie von selbst.",
|
|
205
|
+
"Bevor Claude etwas davon liest, fragt er dich: Erst nach deinem Ja geht die Zeitleiste an Anthropic. Am Ende steht die Aufgabe in plan/aufgabe-vorgefuehrt.md, und Claude schlägt vor, die Aufnahme zu löschen.",
|
|
206
|
+
"Gibt es bisher nur unter Windows.",
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
befehl: "kimal3 zeigen status",
|
|
211
|
+
beschreibung: "Nachsehen, ob gerade aufgenommen wird und ob der Aufnehmer eingerichtet ist",
|
|
212
|
+
wer: "du",
|
|
213
|
+
rhythmus: "wenn du wissen willst, ob gerade aufgenommen wird",
|
|
214
|
+
tippen: "! kimal3 zeigen status",
|
|
215
|
+
terminal: "kimal3 zeigen status",
|
|
216
|
+
details: [
|
|
217
|
+
"Zeigt zwei Blöcke: was eingerichtet ist (uv, Aufnehmer, FFmpeg, Sprachmodell) und ob gerade eine Aufnahme von deinem Bildschirm läuft — mit Startzeit, Ordner und der Uhrzeit, zu der sie spätestens von selbst stoppt.",
|
|
218
|
+
"Kann es nicht feststellen, ob aufgenommen wird, sagt es genau das, mit Rückgabewert 1 — es behauptet dann nie, dass nichts läuft.",
|
|
219
|
+
"Es liest nur und ändert nichts. Gibt es bisher nur unter Windows.",
|
|
220
|
+
],
|
|
221
|
+
},
|
|
195
222
|
/*
|
|
196
223
|
🔴 Dieser Eintrag steht bewusst NICHT im "Weg, den ein Mensch geht" --
|
|
197
224
|
niemand muss ihn selbst tippen. Er wird bei jedem Start von Claude Code
|
package/dist/befehlswoerter.js
CHANGED
|
@@ -15,6 +15,13 @@ export const BEFEHLSWOERTER = {
|
|
|
15
15
|
wache: { de: "wache", en: "watch" },
|
|
16
16
|
"wache an": { de: "wache an", en: "watch on" }, // kein-anzeigetext: Befehlswörter (Spec Abschnitt 6)
|
|
17
17
|
"wache aus": { de: "wache aus", en: "watch off" }, // kein-anzeigetext: Befehlswörter (Spec Abschnitt 6)
|
|
18
|
+
// `kimal3 zeigen` / `show` (Spec 2026-10-18-k3zeigen-design.md, Abschnitt 1)
|
|
19
|
+
"zeigen einrichten": { de: "zeigen einrichten", en: "show setup" }, // kein-anzeigetext: Befehlswörter (Spec k3zeigen)
|
|
20
|
+
"zeigen start": { de: "zeigen start", en: "show start" }, // kein-anzeigetext: Befehlswörter (Spec k3zeigen)
|
|
21
|
+
"zeigen stopp": { de: "zeigen stopp", en: "show stop" }, // kein-anzeigetext: Befehlswörter (Spec k3zeigen)
|
|
22
|
+
"zeigen auswerten": { de: "zeigen auswerten", en: "show evaluate" }, // kein-anzeigetext: Befehlswörter (Spec k3zeigen)
|
|
23
|
+
"zeigen bild": { de: "zeigen bild", en: "show picture" }, // kein-anzeigetext: Befehlswörter (Spec k3zeigen)
|
|
24
|
+
"zeigen status": { de: "zeigen status", en: "show status" }, // kein-anzeigetext: Befehlswörter (Spec k3zeigen)
|
|
18
25
|
};
|
|
19
26
|
/**
|
|
20
27
|
* Welcher Befehl steht vorne in `argv` -- und was bleibt dahinter?
|
|
@@ -60,6 +67,10 @@ export const SCHALTER_EN = {
|
|
|
60
67
|
// `kimal3 einrichten` / `setup` (Spec 2026-10-16, Bauform 6)
|
|
61
68
|
workplace: "arbeitsplatz",
|
|
62
69
|
workbench: "werkbank",
|
|
70
|
+
// `kimal3 show …` (Spec 2026-10-18-k3zeigen-design.md)
|
|
71
|
+
"at-most": "hoechstens",
|
|
72
|
+
language: "sprache",
|
|
73
|
+
"without-typed": "ohne-getipptes",
|
|
63
74
|
};
|
|
64
75
|
/** `company` -> `firma`; ein deutscher (oder unbekannter) Name bleibt, wie er ist. */
|
|
65
76
|
export function deutscherSchalter(getippt) {
|
package/dist/kimal3.js
CHANGED
|
@@ -38,6 +38,9 @@ import { projektListe } from "./befehle/projekt-liste.js";
|
|
|
38
38
|
import { projektNeu } from "./befehle/projekt-neu.js";
|
|
39
39
|
import { skillDatei, skillInstallBefehl } from "./befehle/skill-install.js";
|
|
40
40
|
import { wache, wacheSchalten } from "./befehle/wache.js";
|
|
41
|
+
import { zeigenAuswerten, zeigenBild, zeigenStatus, zeigenStopp } from "./befehle/zeigen.js";
|
|
42
|
+
import { zeigenStart } from "./befehle/zeigen-start.js";
|
|
43
|
+
import { zeigenEinrichten } from "./befehle/zeigen-einrichten.js";
|
|
41
44
|
/** Eine Meldung pro Programmlauf -- s. "Einmal-Riegel" im Block darunter. */
|
|
42
45
|
let schonGemeldet = false;
|
|
43
46
|
/**
|
|
@@ -493,6 +496,13 @@ async function fuehreAus(name, rest) {
|
|
|
493
496
|
case "kontext runter": return kontextRunter(rest);
|
|
494
497
|
case "kontext hoch": return kontextHoch(rest);
|
|
495
498
|
case "kontext fragen": return kontextFragen(rest);
|
|
499
|
+
// `kimal3 zeigen` (Spec 2026-10-18-k3zeigen-design.md).
|
|
500
|
+
case "zeigen einrichten": return zeigenEinrichten(rest);
|
|
501
|
+
case "zeigen start": return zeigenStart(rest);
|
|
502
|
+
case "zeigen stopp": return zeigenStopp(rest);
|
|
503
|
+
case "zeigen auswerten": return zeigenAuswerten(rest);
|
|
504
|
+
case "zeigen bild": return zeigenBild(rest);
|
|
505
|
+
case "zeigen status": return zeigenStatus(rest);
|
|
496
506
|
case "wache an": return allein ? wacheSchalten(true) : null;
|
|
497
507
|
case "wache aus": return allein ? wacheSchalten(false) : null;
|
|
498
508
|
case "wache":
|
package/dist/logo-ablegen.js
CHANGED
|
@@ -2,6 +2,7 @@ import { cpSync, existsSync, readdirSync, readFileSync, renameSync, rmSync, writ
|
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { basename, dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { EINRICHTEN_TEXTE } from "./texte/einrichten.js";
|
|
5
6
|
/**
|
|
6
7
|
* Legt den Plugin-Katalog mit dem Logo-Mod in `~/.kimal3/claude-plugins` ab und setzt dort die
|
|
7
8
|
* Sprache des Kontos. Claude Code liest den Mod aus genau diesem Ordner (Katalog `kimal3`,
|
|
@@ -34,8 +35,9 @@ export function mitSprache(quelltext, sprache) {
|
|
|
34
35
|
* 🔑 Der weggeschobene Ordner bekommt bei JEDEM Lauf einen frischen Namen (Durchsicht 2, Funde 2 und 4):
|
|
35
36
|
* Ein Rest, den Windows festhält, blockiert so keinen späteren Lauf, und zurückgeholt wird nur, was
|
|
36
37
|
* DIESER Lauf weggeschoben hat -- nie ein veralteter Rest von früher.
|
|
37
|
-
* Lässt sich der alte nicht wegschieben
|
|
38
|
-
*
|
|
38
|
+
* Lässt sich der alte nicht wegschieben, bleibt er unversehrt stehen und gilt weiter: ein Erfolg mit `stand: "alt"`,
|
|
39
|
+
* den der Aufrufer in einer Zeile nennt. Unter Windows hält ihn ein Programm fest, dessen Arbeitsordner darin liegt;
|
|
40
|
+
* Claude selbst tut es nicht (gemessen 18.10. bei acht laufenden Claude-Prozessen, Spec 2026-10-18, Abschnitt 1.2).
|
|
39
41
|
*/
|
|
40
42
|
export function logoAblegen(sprache) {
|
|
41
43
|
// `dist/logo-ablegen.js` -> `../claude-plugins` im installierten Paket (`files` in package.json).
|
|
@@ -51,14 +53,14 @@ export function logoAblegen(sprache) {
|
|
|
51
53
|
// Auch im Normalfall aufräumen, samt einem halb gebauten `….neu`: sonst blieben Reste für immer (Durchsicht 3/4).
|
|
52
54
|
rmSync(neu, { recursive: true, force: true });
|
|
53
55
|
resteWegraeumen(ziel);
|
|
54
|
-
return { ok: true, ordner: ziel };
|
|
56
|
+
return { ok: true, ordner: ziel, stand: "gleich" };
|
|
55
57
|
}
|
|
56
58
|
rmSync(neu, { recursive: true, force: true });
|
|
57
59
|
cpSync(quelle, neu, { recursive: true });
|
|
58
60
|
writeFileSync(modDatei(neu), text, "utf8");
|
|
59
61
|
if (!existsSync(ziel)) {
|
|
60
62
|
renameSync(neu, ziel);
|
|
61
|
-
return { ok: true, ordner: ziel };
|
|
63
|
+
return { ok: true, ordner: ziel, stand: "neu" };
|
|
62
64
|
}
|
|
63
65
|
const alt = `${ziel}.alt-${Date.now()}`; // kein-anzeigetext: Ordnername
|
|
64
66
|
try {
|
|
@@ -66,7 +68,7 @@ export function logoAblegen(sprache) {
|
|
|
66
68
|
}
|
|
67
69
|
catch {
|
|
68
70
|
rmSync(neu, { recursive: true, force: true });
|
|
69
|
-
return { ok: true, ordner: ziel,
|
|
71
|
+
return { ok: true, ordner: ziel, stand: "alt" };
|
|
70
72
|
}
|
|
71
73
|
try {
|
|
72
74
|
renameSync(neu, ziel);
|
|
@@ -76,12 +78,30 @@ export function logoAblegen(sprache) {
|
|
|
76
78
|
return { ok: false, detail: e.message };
|
|
77
79
|
}
|
|
78
80
|
resteWegraeumen(ziel);
|
|
79
|
-
return { ok: true, ordner: ziel };
|
|
81
|
+
return { ok: true, ordner: ziel, stand: "neu" };
|
|
80
82
|
}
|
|
81
83
|
catch (e) {
|
|
82
84
|
return { ok: false, detail: e.message };
|
|
83
85
|
}
|
|
84
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Für `login` und `skill install` (Spec 2026-10-18, Abschnitt 1.2): ein VORHANDENES Logo auffrischen (Update,
|
|
89
|
+
* Sprachwechsel), nie eines anlegen -- das darf nur `einrichten`, wie beim Coach (`frischeCoachAuf`). Wer das Logo nie
|
|
90
|
+
* eingerichtet hat, hört nichts und bekommt keinen Ordner (L-2). Eine Zeile nur, wenn getauscht wurde, das alte bleiben
|
|
91
|
+
* musste oder etwas scheiterte; sonst Stille. Wirft nie und ändert den Rückgabewert des Befehls nicht (L-6).
|
|
92
|
+
*/
|
|
93
|
+
export function frischeLogoAuf(s) {
|
|
94
|
+
if (!existsSync(katalogOrdner()))
|
|
95
|
+
return;
|
|
96
|
+
const ablage = logoAblegen(s);
|
|
97
|
+
const t = EINRICHTEN_TEXTE[s];
|
|
98
|
+
if (!ablage.ok)
|
|
99
|
+
console.log(t.logoNotWritten(ablage.detail));
|
|
100
|
+
else if (ablage.stand === "neu")
|
|
101
|
+
console.log(t.logoRefreshed);
|
|
102
|
+
else if (ablage.stand === "alt")
|
|
103
|
+
console.log(t.logoNotRefreshed);
|
|
104
|
+
}
|
|
85
105
|
/** Gleiche Dateien, gleicher Inhalt -- der Mod mit der Sprache des Kontos, alles andere wie im Paket. */
|
|
86
106
|
function stehtSchonDa(quelle, ziel, modText) {
|
|
87
107
|
if (!existsSync(ziel))
|
package/dist/slash-befehle.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const SLASH_PAARE = [
|
|
2
2
|
{ de: "k3", en: "k3" },
|
|
3
3
|
{ de: "k3start", en: "k3start" },
|
|
4
|
+
{ de: "k3zeigen", en: "k3show" }, // kein-anzeigetext: Befehlsname (Spec 2026-10-18-k3zeigen-design.md)
|
|
4
5
|
{ de: "k3feierabend", en: "k3wrapup" }, // kein-anzeigetext: Befehlsname (Spec Teil 4, Abschnitt 6)
|
|
5
6
|
{ de: "k3kontext", en: "k3context" }, // kein-anzeigetext: Befehlsname
|
|
6
7
|
{ de: "k3projekt", en: "k3project" }, // kein-anzeigetext: Befehlsname
|
package/dist/texte/einrichten.js
CHANGED
|
@@ -50,11 +50,16 @@ const de = {
|
|
|
50
50
|
settingsInvalid: "deine Claude-Einstellungen (~/.claude/settings.json) sind kein gültiges JSON. Ich habe sie nicht angefasst.",
|
|
51
51
|
settingsForeign: "in deinen Claude-Einstellungen (~/.claude/settings.json) steht etwas in einer Form, die ich nicht kenne. Ich habe sie nicht angefasst.",
|
|
52
52
|
settingsFailed: (ursache) => `deine Claude-Einstellungen (~/.claude/settings.json): ${ursache}.`,
|
|
53
|
-
// Logo (Durchsicht 2, Funde 1 und 3): Scheitert der Ordner, kommt superpowers trotzdem; hält
|
|
53
|
+
// Logo (Durchsicht 2, Funde 1 und 3): Scheitert der Ordner, kommt superpowers trotzdem; hält ein anderes Programm ihn fest, bleibt die alte Fassung (`logoOldVersion`).
|
|
54
54
|
logoNotWritten: (detail) => ` Den Ordner für das KImal3-Logo konnte ich nicht anlegen oder erneuern (${detail}).`,
|
|
55
55
|
// Ohne Git kein superpowers (Durchsicht 3, Fund 5); die Anleitung zitiert den Anfang dieser Zeile.
|
|
56
56
|
superpowersNeedsGit: " superpowers braucht Git — es kommt mit dem nächsten `kimal3 einrichten`, sobald Git da ist.",
|
|
57
|
-
|
|
57
|
+
// Die Sperre setzt ein anderes Programm mit Arbeitsordner im Logo-Ordner, nicht Claude -- deshalb kein Rat, Claude zu
|
|
58
|
+
// beenden (für App-Nutzer ein Kreis; Spec 2026-10-18, Abschnitt 1.2).
|
|
59
|
+
logoOldVersion: " Das Logo konnte gerade nicht aufgefrischt werden, weil ein anderes Programm seinen Ordner benutzt. Es kommt beim nächsten `kimal3 einrichten`.",
|
|
60
|
+
// Auffrischen bei `login` und `skill install` (`frischeLogoAuf`); scheitert es, sagt es `logoNotWritten`.
|
|
61
|
+
logoRefreshed: " Das Logo über dem Eingabefeld ist aufgefrischt. Ist es eingeschaltet, siehst du es nach dem nächsten Neustart von Claude.",
|
|
62
|
+
logoNotRefreshed: " Das Logo konnte gerade nicht aufgefrischt werden, weil ein anderes Programm seinen Ordner benutzt. Es kommt beim nächsten `kimal3 skill install`.",
|
|
58
63
|
};
|
|
59
64
|
const en = {
|
|
60
65
|
codeLine: (code) => `\n ${M.en.code} ${code}`,
|
|
@@ -101,6 +106,8 @@ const en = {
|
|
|
101
106
|
settingsFailed: (ursache) => `your Claude settings (~/.claude/settings.json): ${ursache}.`,
|
|
102
107
|
logoNotWritten: (detail) => ` I couldn't create or renew the folder for the KImal3 logo (${detail}).`,
|
|
103
108
|
superpowersNeedsGit: " superpowers needs Git — it comes with the next `kimal3 setup` once Git is there.",
|
|
104
|
-
logoOldVersion: " The
|
|
109
|
+
logoOldVersion: " The logo couldn't be refreshed just now, because another program is using its folder. It comes with the next `kimal3 setup`.",
|
|
110
|
+
logoRefreshed: " The logo above the prompt is refreshed. If it is switched on, you'll see it after the next restart of Claude.",
|
|
111
|
+
logoNotRefreshed: " The logo couldn't be refreshed just now, because another program is using its folder. It comes with the next `kimal3 skill install`.",
|
|
105
112
|
};
|
|
106
113
|
export const EINRICHTEN_TEXTE = { de, en };
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const TEIL_DE = { aufnehmer: "Aufnehmer", ffmpeg: "FFmpeg", modell: "Sprachmodell" };
|
|
2
|
+
const TEIL_EN = { aufnehmer: "Recorder", ffmpeg: "FFmpeg", modell: "Speech model" };
|
|
3
|
+
const SCHRITT_DE = { uv: "uv", ...TEIL_DE };
|
|
4
|
+
const SCHRITT_EN = { uv: "uv", aufnehmer: "recorder", ffmpeg: "FFmpeg", modell: "speech model" };
|
|
5
|
+
const mehrzahl = (n, eins, viele) => `${n} ${n === 1 ? eins : viele}`;
|
|
6
|
+
const de = {
|
|
7
|
+
nurWindows: "`kimal3 zeigen` gibt es bisher nur unter Windows; der Mac folgt.",
|
|
8
|
+
helpStatus: "\n kimal3 zeigen status\n\n Zeigt, ob der Aufnehmer eingerichtet ist und ob gerade aufgenommen wird.\n Liest nur, ändert nichts.\n",
|
|
9
|
+
helpStart: "\n kimal3 zeigen start \"<deine Aufgabe in einem Satz>\" [--hoechstens <minuten>]\n\n Startet eine Aufnahme von Bildschirm, Ton, Klicks und Tasten im Ordner\n material/aufnahmen/ deines Projekts. Sie stoppt spätestens nach 15 Minuten\n von selbst (--hoechstens: weniger, 1 bis 15).\n",
|
|
10
|
+
helpStopp: "\n kimal3 zeigen stopp\n\n Stoppt die laufende Aufnahme und nennt nur Zahlen: Dauer, Klicks, Tasten, Ton.\n",
|
|
11
|
+
helpAuswerten: "\n kimal3 zeigen auswerten [<ordner>] [--sprache de|en] [--ohne-getipptes]\n\n Macht aus der Aufnahme auf diesem Rechner eine Zeitleiste (zeitleiste.md):\n was gesagt, geklickt und getippt wurde. Ohne Ordner: die jüngste Aufnahme\n des Projekts. --ohne-getipptes lässt alles Getippte aus.\n",
|
|
12
|
+
helpBild: "\n kimal3 zeigen bild <m:ss> [<ordner>]\n\n Legt ein Bildschirmfoto der Aufnahme zu diesem Zeitpunkt in bilder/ ab\n (höchstens 1600 Pixel breit). Ohne Ordner: die jüngste Aufnahme des Projekts.\n",
|
|
13
|
+
helpEinrichten: "\n kimal3 zeigen einrichten\n\n Richtet einmal ein, was für Aufnahmen fehlt: uv, den Aufnehmer, FFmpeg und das\n Sprachmodell (zusammen etwa 2,1 GB). Nur in deinem Benutzerordner, ohne\n Adminrechte. Was schon da ist, wird nicht noch einmal geladen.\n",
|
|
14
|
+
schrittUv: "uv wird eingerichtet …",
|
|
15
|
+
schrittAufnehmer: (fassung) => `Aufnehmer ${fassung} wird eingerichtet …`,
|
|
16
|
+
schrittFfmpeg: "FFmpeg wird eingerichtet …",
|
|
17
|
+
schrittModell: "Sprachmodell (1,6 GB) wird geladen — das dauert einige Minuten …",
|
|
18
|
+
nichtGeklappt: (schritt) => `Schritt ${SCHRITT_DE[schritt]} hat nicht geklappt.`,
|
|
19
|
+
allesDa: (fassung) => `Alles schon da: uv, Aufnehmer ${fassung}, FFmpeg, Sprachmodell.`,
|
|
20
|
+
fertigEingerichtet: (fassung) => `Eingerichtet — jetzt ist alles da: uv, Aufnehmer ${fassung}, FFmpeg, Sprachmodell.`,
|
|
21
|
+
eingerichtet: "Eingerichtet:",
|
|
22
|
+
uvDa: (fassung) => ` uv ${fassung}`,
|
|
23
|
+
uvFehlt: " uv fehlt",
|
|
24
|
+
aufnehmerDa: (fassung) => ` Aufnehmer ${fassung}`,
|
|
25
|
+
aufnehmerAlt: (fassung, soll) => ` Aufnehmer ${fassung} (gebraucht wird ${soll})`,
|
|
26
|
+
aufnehmerFehlt: " Aufnehmer fehlt",
|
|
27
|
+
ffmpeg: (da) => ` FFmpeg ${da ? "da" : "fehlt"}`,
|
|
28
|
+
modell: (da) => ` Sprachmodell ${da ? "da" : "fehlt"}`,
|
|
29
|
+
teilUngeprueft: (teil) => ` ${TEIL_DE[teil]}: ohne Aufnehmer nicht prüfbar`,
|
|
30
|
+
teilUnbekannt: (teil) => ` ${TEIL_DE[teil]}: kann ich nicht feststellen`,
|
|
31
|
+
aufnahme: "Aufnahme:",
|
|
32
|
+
laeuftSeit: (uhr, minuten, ordner, ende) => ` Läuft seit ${uhr} (${mehrzahl(minuten, "Minute", "Minuten")}), Ordner \`${ordner}\`, stoppt spätestens ${ende}.`,
|
|
33
|
+
laeuftFremd: " Läuft (in einer anderen Sitzung gestartet).",
|
|
34
|
+
keineLaeuft: " Keine Aufnahme läuft.",
|
|
35
|
+
letzteSelbst: (ordner, minuten) => ` Die letzte (\`${ordner}\`) hat nach ${mehrzahl(minuten, "Minute", "Minuten")} von selbst gestoppt.`,
|
|
36
|
+
letzteAbgebrochen: (ordner) => ` Die letzte (\`${ordner}\`) ist abgebrochen.`,
|
|
37
|
+
unbekannt: "Ob gerade aufgenommen wird, kann ich nicht feststellen.",
|
|
38
|
+
ortHier: (aufnahmen) => `Aufnahmen landen hier in: ${aufnahmen}`,
|
|
39
|
+
ortWerkbank: "Wechsle zuerst in ein Projekt (`projekte/<name>`) — Claude kann eins anlegen.",
|
|
40
|
+
ortZuLang: (laenge, hoechstens) => `Der Projektordner liegt zu tief für den Aufnehmer (${laenge} Zeichen, höchstens ${hoechstens}). Ein Projekt näher am Laufwerk hilft.`,
|
|
41
|
+
satzFehlt: "Sag in einem Satz, welche Aufgabe du vormachst:",
|
|
42
|
+
hoechstensFalsch: (wert) => `„--hoechstens ${wert}" verstehe ich nicht — bitte eine ganze Zahl von 1 bis 15 (Minuten).`,
|
|
43
|
+
schonLaeuft: (uhr, ordner) => `Es läuft schon eine Aufnahme (seit ${uhr}, Ordner \`${ordner}\`).`,
|
|
44
|
+
schonLaeuftFremd: "Es läuft schon eine Aufnahme (in einer anderen Sitzung gestartet).",
|
|
45
|
+
startetGerade: (ordner) => `Gerade startet schon eine Aufnahme (Ordner \`${ordner}\`).`,
|
|
46
|
+
unbekanntKeinStart: "Ob gerade aufgenommen wird, kann ich nicht feststellen — deshalb starte ich keine zweite.",
|
|
47
|
+
nichtEingerichtet: "Der Aufnehmer ist noch nicht eingerichtet: `kimal3 zeigen einrichten`.",
|
|
48
|
+
ordnerNichtAnlegbar: (ordner) => `Den Aufnahmeordner kann ich nicht anlegen: ${ordner}`,
|
|
49
|
+
laeuftJetzt: (ordner, ende) => `Die Aufnahme läuft (Ordner \`${ordner}\`), stoppt spätestens um ${ende}.`,
|
|
50
|
+
nichtGestartet: (grund, protokoll) => `Die Aufnahme ist nicht gestartet: ${grund}. Protokoll: ${protokoll}`,
|
|
51
|
+
endeUnbestaetigt: "Ob der Aufnehmer noch läuft, sagt `kimal3 zeigen status`.",
|
|
52
|
+
keineAufnahmeLaeuft: "Es läuft keine Aufnahme.",
|
|
53
|
+
zahlen: (dauer, klicks, tasten, ton) => `${dauer} Minuten, ${mehrzahl(klicks, "Klick", "Klicks")}, ${mehrzahl(tasten, "Taste", "Tasten")}, ${ton ? "Ton ist da" : "kein Ton"}.`,
|
|
54
|
+
gestoppt: (zahlen) => `Aufnahme gestoppt: ${zahlen}`,
|
|
55
|
+
selbstGestoppt: (minuten, zahlen) => `Die Aufnahme hat nach ${mehrzahl(minuten, "Minute", "Minuten")} von selbst gestoppt: ${zahlen}`,
|
|
56
|
+
nichtSauber: (grund) => `Die Aufnahme ist nicht sauber abgeschlossen: ${grund}.`,
|
|
57
|
+
// Ob der Ton da ist, sagen die Zahlen; bis 21.10. stand hier fest „der Ton ist verloren“ — auch wenn er da war.
|
|
58
|
+
abgebrochen: (grund, zahlen) => `Die Aufnahme ist abgebrochen: ${grund}.${zahlen === null ? "" : ` ${zahlen}`}`,
|
|
59
|
+
stoppUnklar: "Die Aufnahme ließ sich nicht stoppen — ob sie noch läuft, sagt `kimal3 zeigen status`.",
|
|
60
|
+
wirdAbgeschlossen: "Die Aufnahme wird noch abgeschlossen — gleich noch einmal `kimal3 zeigen stopp`.",
|
|
61
|
+
fremdLaeuft: "Es läuft eine Aufnahme, die ich hier nicht zuordnen kann. Sieh mit `kimal3 zeigen status` nach.",
|
|
62
|
+
keineAufnahmeHier: "In diesem Projekt finde ich keine Aufnahme (`material/aufnahmen/`).",
|
|
63
|
+
ordnerFehlt: (ordner) => `Den Aufnahmeordner gibt es nicht: ${ordner}`,
|
|
64
|
+
laeuftNoch: "Die Aufnahme läuft noch — erst `kimal3 zeigen stopp`.",
|
|
65
|
+
spracheFalsch: (wert) => `„--sprache ${wert}" kenne ich nicht — de oder en.`,
|
|
66
|
+
werteAus: "Werte aus (das dauert etwa so lange wie die Aufnahme) …",
|
|
67
|
+
zeitleisteFertig: (dauer, saetze, klicks, tippstellen, passwortfelder, datei) => `Zeitleiste fertig: ${dauer} Minuten, ${mehrzahl(saetze, "Satz", "Sätze")}, ${mehrzahl(klicks, "Klick", "Klicks")}, ` +
|
|
68
|
+
`${mehrzahl(tippstellen, "Stelle", "Stellen")} mit getipptem Text` +
|
|
69
|
+
(passwortfelder > 0 ? `, ${mehrzahl(passwortfelder, "Passwortfeld", "Passwortfelder")} ausgeblendet` : "") +
|
|
70
|
+
`. Datei: \`${datei}\`.`,
|
|
71
|
+
keineSprache: "Ich habe keine Sprache erkannt — war das Mikrofon stumm oder das falsche gewählt?",
|
|
72
|
+
keinTon: "Die Aufnahme hat keine Tonspur — ohne Ton entsteht keine Zeitleiste. Eine neue Aufnahme hilft.",
|
|
73
|
+
zeitleisteFehler: (grund) => `Die Zeitleiste ist nicht entstanden: ${grund}.`,
|
|
74
|
+
zeitFalsch: (wert) => `„${wert}" verstehe ich nicht als Zeitpunkt — bitte so: 0:26 oder 1:02:05.`,
|
|
75
|
+
bildFertig: (datei) => `Bild: ${datei}`,
|
|
76
|
+
bildFehler: (grund) => `Das Bild ist nicht entstanden: ${grund}.`,
|
|
77
|
+
gruende: {
|
|
78
|
+
"ffmpeg-fehlt": "FFmpeg fehlt — `kimal3 zeigen einrichten` holt es",
|
|
79
|
+
"kein-mikrofon": "ich finde kein Mikrofon",
|
|
80
|
+
"bildschirm-gesperrt": "der Bildschirm ist gesperrt oder nicht lesbar",
|
|
81
|
+
"pfad-zu-lang": "der Ordnerpfad ist zu lang für den Aufnehmer",
|
|
82
|
+
"startet-nicht": "der Aufnehmer ist nicht angelaufen",
|
|
83
|
+
"modell-fehlt": "das Sprachmodell fehlt — `kimal3 zeigen einrichten` holt es",
|
|
84
|
+
"nicht-beendet": "der Aufnehmer ließ sich nicht beenden",
|
|
85
|
+
"keine-aufnahme": "in dem Ordner liegt keine Aufnahme",
|
|
86
|
+
"aufnahme-unlesbar": "die Aufnahme ist nicht lesbar",
|
|
87
|
+
erkennung: "die Spracherkennung ist gescheitert",
|
|
88
|
+
"zeit-ungueltig": "der Zeitpunkt ist ungültig",
|
|
89
|
+
"kein-video": "die Aufnahme hat kein Video",
|
|
90
|
+
"kein-bild": "an dieser Stelle gibt es kein Bild — vielleicht liegt der Zeitpunkt nach dem Ende der Aufnahme",
|
|
91
|
+
"laden-gescheitert": "das Herunterladen ist gescheitert",
|
|
92
|
+
unvollstaendig: "das Sprachmodell ist nicht vollständig angekommen",
|
|
93
|
+
"ordner-fehlt": "der Aufnahmeordner fehlt",
|
|
94
|
+
"schreiben-gescheitert": "die Zeitleiste ließ sich nicht schreiben",
|
|
95
|
+
unbekannt: "den Grund kenne ich nicht",
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
const en = {
|
|
99
|
+
nurWindows: "`kimal3 show` is Windows-only for now; the Mac follows.",
|
|
100
|
+
helpStatus: "\n kimal3 show status\n\n Shows whether the recorder is set up and whether a recording is running.\n Only reads, changes nothing.\n",
|
|
101
|
+
helpStart: "\n kimal3 show start \"<your task in one sentence>\" [--at-most <minutes>]\n\n Starts a recording of screen, sound, clicks and keys in your project's\n material/aufnahmen/ folder. It stops by itself after 15 minutes at the latest\n (--at-most: less, 1 to 15).\n",
|
|
102
|
+
helpStopp: "\n kimal3 show stop\n\n Stops the running recording and reports numbers only: length, clicks, keys, sound.\n",
|
|
103
|
+
helpAuswerten: "\n kimal3 show evaluate [<folder>] [--language de|en] [--without-typed]\n\n Turns the recording into a timeline on this computer (zeitleiste.md):\n what was said, clicked and typed. Without a folder: the project's latest\n recording. --without-typed leaves out everything typed.\n",
|
|
104
|
+
helpBild: "\n kimal3 show picture <m:ss> [<folder>]\n\n Saves a screenshot of the recording at that moment in bilder/\n (at most 1600 pixels wide). Without a folder: the project's latest recording.\n",
|
|
105
|
+
helpEinrichten: "\n kimal3 show setup\n\n Sets up once what recordings still need: uv, the recorder, FFmpeg and the\n speech model (about 2.1 GB together). Only in your user folder, no admin\n rights. Whatever is already there isn't downloaded again.\n",
|
|
106
|
+
schrittUv: "Setting up uv …",
|
|
107
|
+
schrittAufnehmer: (fassung) => `Setting up recorder ${fassung} …`,
|
|
108
|
+
schrittFfmpeg: "Setting up FFmpeg …",
|
|
109
|
+
schrittModell: "Loading the speech model (1.6 GB) — this takes a few minutes …",
|
|
110
|
+
nichtGeklappt: (schritt) => `Step ${SCHRITT_EN[schritt]} didn't work.`,
|
|
111
|
+
allesDa: (fassung) => `Everything is already there: uv, recorder ${fassung}, FFmpeg, speech model.`,
|
|
112
|
+
fertigEingerichtet: (fassung) => `Set up — now everything is there: uv, recorder ${fassung}, FFmpeg, speech model.`,
|
|
113
|
+
eingerichtet: "Set up:",
|
|
114
|
+
uvDa: (fassung) => ` uv ${fassung}`,
|
|
115
|
+
uvFehlt: " uv missing",
|
|
116
|
+
aufnehmerDa: (fassung) => ` Recorder ${fassung}`,
|
|
117
|
+
aufnehmerAlt: (fassung, soll) => ` Recorder ${fassung} (${soll} is needed)`,
|
|
118
|
+
aufnehmerFehlt: " Recorder missing",
|
|
119
|
+
ffmpeg: (da) => ` FFmpeg ${da ? "present" : "missing"}`,
|
|
120
|
+
modell: (da) => ` Speech model ${da ? "present" : "missing"}`,
|
|
121
|
+
teilUngeprueft: (teil) => ` ${TEIL_EN[teil]}: can't be checked without the recorder`,
|
|
122
|
+
teilUnbekannt: (teil) => ` ${TEIL_EN[teil]}: I can't tell`,
|
|
123
|
+
aufnahme: "Recording:",
|
|
124
|
+
laeuftSeit: (uhr, minuten, ordner, ende) => ` Running since ${uhr} (${minuten} ${minuten === 1 ? "minute" : "minutes"}), folder \`${ordner}\`, stops at ${ende} at the latest.`,
|
|
125
|
+
laeuftFremd: " Running (started in another session).",
|
|
126
|
+
keineLaeuft: " No recording is running.",
|
|
127
|
+
letzteSelbst: (ordner, minuten) => ` The last one (\`${ordner}\`) stopped by itself after ${minuten} ${minuten === 1 ? "minute" : "minutes"}.`,
|
|
128
|
+
letzteAbgebrochen: (ordner) => ` The last one (\`${ordner}\`) broke off.`,
|
|
129
|
+
unbekannt: "I can't tell whether a recording is running.",
|
|
130
|
+
ortHier: (aufnahmen) => `Recordings go here: ${aufnahmen}`,
|
|
131
|
+
ortWerkbank: "Switch into a project first (`projects/<name>`) — Claude can create one.",
|
|
132
|
+
ortZuLang: (laenge, hoechstens) => `The project folder is nested too deeply for the recorder (${laenge} characters, at most ${hoechstens}). A project closer to the drive helps.`,
|
|
133
|
+
satzFehlt: "Say in one sentence which task you're showing:",
|
|
134
|
+
hoechstensFalsch: (wert) => `I don't understand “--at-most ${wert}” — please a whole number from 1 to 15 (minutes).`,
|
|
135
|
+
schonLaeuft: (uhr, ordner) => `A recording is already running (since ${uhr}, folder \`${ordner}\`).`,
|
|
136
|
+
schonLaeuftFremd: "A recording is already running (started in another session).",
|
|
137
|
+
startetGerade: (ordner) => `A recording is already starting (folder \`${ordner}\`).`,
|
|
138
|
+
unbekanntKeinStart: "I can't tell whether a recording is running — so I won't start a second one.",
|
|
139
|
+
nichtEingerichtet: "The recorder isn't set up yet: `kimal3 show setup`.",
|
|
140
|
+
ordnerNichtAnlegbar: (ordner) => `I can't create the recording folder: ${ordner}`,
|
|
141
|
+
laeuftJetzt: (ordner, ende) => `The recording is running (folder \`${ordner}\`), stops at ${ende} at the latest.`,
|
|
142
|
+
nichtGestartet: (grund, protokoll) => `The recording didn't start: ${grund}. Log: ${protokoll}`,
|
|
143
|
+
endeUnbestaetigt: "Whether the recorder is still running: `kimal3 show status`.",
|
|
144
|
+
keineAufnahmeLaeuft: "No recording is running.",
|
|
145
|
+
zahlen: (dauer, klicks, tasten, ton) => `${dauer} minutes, ${klicks} ${klicks === 1 ? "click" : "clicks"}, ${tasten} ${tasten === 1 ? "key" : "keys"}, ${ton ? "audio present" : "no audio"}.`,
|
|
146
|
+
gestoppt: (zahlen) => `Recording stopped: ${zahlen}`,
|
|
147
|
+
selbstGestoppt: (minuten, zahlen) => `The recording stopped by itself after ${minuten} ${minuten === 1 ? "minute" : "minutes"}: ${zahlen}`,
|
|
148
|
+
nichtSauber: (grund) => `The recording wasn't closed cleanly: ${grund}.`,
|
|
149
|
+
abgebrochen: (grund, zahlen) => `The recording broke off: ${grund}.${zahlen === null ? "" : ` ${zahlen}`}`,
|
|
150
|
+
stoppUnklar: "The recording couldn't be stopped — whether it's still running: `kimal3 show status`.",
|
|
151
|
+
wirdAbgeschlossen: "The recording is still being finished — run `kimal3 show stop` again in a moment.",
|
|
152
|
+
fremdLaeuft: "A recording is running that I can't match here. Check with `kimal3 show status`.",
|
|
153
|
+
keineAufnahmeHier: "I can't find a recording in this project (`material/aufnahmen/`).",
|
|
154
|
+
ordnerFehlt: (ordner) => `The recording folder doesn't exist: ${ordner}`,
|
|
155
|
+
laeuftNoch: "The recording is still running — first `kimal3 show stop`.",
|
|
156
|
+
spracheFalsch: (wert) => `I don't know “--language ${wert}” — de or en.`,
|
|
157
|
+
werteAus: "Evaluating (this takes about as long as the recording) …",
|
|
158
|
+
zeitleisteFertig: (dauer, saetze, klicks, tippstellen, passwortfelder, datei) => `Timeline ready: ${dauer} minutes, ${saetze} ${saetze === 1 ? "sentence" : "sentences"}, ${klicks} ${klicks === 1 ? "click" : "clicks"}, ` +
|
|
159
|
+
`${tippstellen} ${tippstellen === 1 ? "place" : "places"} with typed text` +
|
|
160
|
+
(passwortfelder > 0 ? `, ${passwortfelder} ${passwortfelder === 1 ? "password field" : "password fields"} hidden` : "") +
|
|
161
|
+
`. File: \`${datei}\`.`,
|
|
162
|
+
keineSprache: "I didn't recognise any speech — was the microphone muted or the wrong one selected?",
|
|
163
|
+
keinTon: "The recording has no audio track — without sound there's no timeline. A new recording helps.",
|
|
164
|
+
zeitleisteFehler: (grund) => `The timeline wasn't created: ${grund}.`,
|
|
165
|
+
zeitFalsch: (wert) => `I don't understand “${wert}” as a point in time — please like this: 0:26 or 1:02:05.`,
|
|
166
|
+
bildFertig: (datei) => `Picture: ${datei}`,
|
|
167
|
+
bildFehler: (grund) => `The picture wasn't created: ${grund}.`,
|
|
168
|
+
gruende: {
|
|
169
|
+
"ffmpeg-fehlt": "FFmpeg is missing — `kimal3 show setup` gets it",
|
|
170
|
+
"kein-mikrofon": "I can't find a microphone",
|
|
171
|
+
"bildschirm-gesperrt": "the screen is locked or can't be read",
|
|
172
|
+
"pfad-zu-lang": "the folder path is too long for the recorder",
|
|
173
|
+
"startet-nicht": "the recorder didn't get going",
|
|
174
|
+
"modell-fehlt": "the speech model is missing — `kimal3 show setup` gets it",
|
|
175
|
+
"nicht-beendet": "the recorder couldn't be stopped",
|
|
176
|
+
"keine-aufnahme": "there's no recording in that folder",
|
|
177
|
+
"aufnahme-unlesbar": "the recording can't be read",
|
|
178
|
+
erkennung: "speech recognition failed",
|
|
179
|
+
"zeit-ungueltig": "the point in time isn't valid",
|
|
180
|
+
"kein-video": "the recording has no video",
|
|
181
|
+
"kein-bild": "there's no picture at that point — perhaps the moment is after the end of the recording",
|
|
182
|
+
"laden-gescheitert": "the download failed",
|
|
183
|
+
unvollstaendig: "the speech model didn't arrive completely",
|
|
184
|
+
"ordner-fehlt": "the recording folder is missing",
|
|
185
|
+
"schreiben-gescheitert": "the timeline could not be written",
|
|
186
|
+
unbekannt: "I don't know the reason",
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
export const ZEIGEN_TEXTE = { de, en };
|