kimal3 0.2.10 → 0.3.1
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 +137 -2
- package/dist/api.js +16 -7
- package/dist/arbeitsplatz-dateien.js +23 -19
- package/dist/argumente.js +25 -97
- package/dist/befehle/arbeitsplatz.js +50 -68
- package/dist/befehle/firma-daten.js +24 -26
- package/dist/befehle/kontext-fragen.js +57 -47
- package/dist/befehle/kontext-gemeinsam.js +84 -40
- package/dist/befehle/kontext-hoch.js +40 -46
- package/dist/befehle/kontext-runter.js +70 -51
- package/dist/befehle/login.js +23 -9
- package/dist/befehle/logout.js +9 -4
- package/dist/befehle/projekt-liste.js +24 -29
- package/dist/befehle/projekt-neu.js +25 -31
- package/dist/befehle/skill-install.js +78 -49
- package/dist/befehle/skill-tausch.js +28 -0
- package/dist/befehle/wache.js +12 -6
- package/dist/befehle/werkbank.js +143 -104
- package/dist/befehle-katalog-en.js +185 -0
- package/dist/befehle-katalog.js +11 -50
- package/dist/befehlswoerter.js +69 -0
- package/dist/einstellungen-mischen.js +2 -2
- package/dist/einstellungen-schreiben.js +8 -5
- package/dist/fehler.js +5 -5
- package/dist/firmen-liste.js +8 -5
- package/dist/format.js +41 -0
- package/dist/fragen-lesen.js +3 -3
- package/dist/hilfe.js +24 -0
- package/dist/kimal3.js +77 -71
- package/dist/kontext-dateien.js +30 -23
- package/dist/kontext-hoch-zeile.js +5 -3
- package/dist/kontext-rat.js +151 -0
- package/dist/kontext-stand.js +79 -210
- package/dist/nachricht.js +39 -15
- package/dist/projekt-neu-firma.js +9 -9
- package/dist/projekt-zeilen.js +40 -54
- package/dist/slash-befehle.js +36 -0
- package/dist/sprache.js +114 -0
- package/dist/texte/allgemein.js +99 -0
- package/dist/texte/arbeitsplatz.js +135 -0
- package/dist/texte/kontext-hoch.js +128 -0
- package/dist/texte/kontext.js +171 -0
- package/dist/texte/projekte.js +126 -0
- package/dist/texte/skill.js +87 -0
- package/dist/texte/wache.js +36 -0
- package/dist/texte/werkbank.js +161 -0
- package/dist/wache-rechnung.js +27 -40
- package/dist/werkbank-name.js +28 -10
- package/dist/wort.js +98 -0
- package/package.json +3 -3
- package/skill/SKILL.md +9 -9
- package/skill/commands/k3.md +7 -4
- package/skill/commands/k3feierabend.md +99 -97
- package/skill/commands/k3kontext.md +1 -1
- package/skill/commands/k3kurs.md +6 -5
- package/skill/commands/k3start.md +2 -1
- package/skill/en/SKILL.md +451 -0
- package/skill/en/commands/k3.md +106 -0
- package/skill/en/commands/k3analyse.md +59 -0
- package/skill/en/commands/k3context.md +92 -0
- package/skill/en/commands/k3course.md +54 -0
- package/skill/en/commands/k3list.md +26 -0
- package/skill/en/commands/k3project.md +50 -0
- package/skill/en/commands/k3start.md +47 -0
- package/skill/en/commands/k3wrapup.md +99 -0
- package/dist/zz-kaputt.js +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { skillTauschNoetig } from "../nachricht.js";
|
|
4
|
+
import { skillQuelle } from "../slash-befehle.js";
|
|
5
|
+
import { mitStempel, skillDatei, slashBefehleInstallieren } from "./skill-install.js";
|
|
6
|
+
export function stelleSkillUm(s) {
|
|
7
|
+
let vorhanden = null;
|
|
8
|
+
try {
|
|
9
|
+
vorhanden = readFileSync(skillDatei(), "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
/* keine (lesbare) Datei: nichts umzustellen */
|
|
13
|
+
}
|
|
14
|
+
if (!skillTauschNoetig(vorhanden, s))
|
|
15
|
+
return "nichts";
|
|
16
|
+
try {
|
|
17
|
+
const quelle = fileURLToPath(new URL(`../../${skillQuelle(s).skill}`, import.meta.url)); // kein-anzeigetext: Paketpfad
|
|
18
|
+
writeFileSync(skillDatei(), mitStempel(readFileSync(quelle, "utf8"), s), "utf8");
|
|
19
|
+
const namen = slashBefehleInstallieren(s, true);
|
|
20
|
+
if (namen === "kaputt")
|
|
21
|
+
return "unvollstaendig";
|
|
22
|
+
const komplett = !namen.gestoert && namen.uebersprungen.length === 0 && namen.unlesbar.length === 0;
|
|
23
|
+
return komplett ? "umgestellt" : "unvollstaendig";
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return "unvollstaendig";
|
|
27
|
+
}
|
|
28
|
+
}
|
package/dist/befehle/wache.js
CHANGED
|
@@ -4,6 +4,8 @@ import { lokalerKontextStandJetzt } from "../api.js";
|
|
|
4
4
|
import { leseGesehen, merkeGesehen } from "../gesehen.js";
|
|
5
5
|
import { heuteAus, sollZeigen, skillZustand } from "../nachricht.js";
|
|
6
6
|
import { eigeneVersion } from "../version.js";
|
|
7
|
+
import { WACHE_TEXTE } from "../texte/wache.js";
|
|
8
|
+
import { KONTO_KOPF, SPRACH_KOPF, sprache, uebernimmKontosprache } from "../sprache.js";
|
|
7
9
|
import { leseWacheDatei, merkeLauf, merkeSitzung, schonFuerDieseSitzung, setzeWache, sitzungJetzt, sollHeuteLaufen, } from "../wache-schalter.js";
|
|
8
10
|
import { alsHookAusgabe, laufErledigt, wacheAntwortAusHttp, wacheBefunde, wacheBlock, } from "../wache-rechnung.js";
|
|
9
11
|
import { skillDatei } from "./skill-install.js";
|
|
@@ -84,7 +86,7 @@ function skillIstVeraltet() {
|
|
|
84
86
|
return false;
|
|
85
87
|
const datei = skillDatei();
|
|
86
88
|
const inhalt = existsSync(datei) ? readFileSync(datei, "utf8") : null;
|
|
87
|
-
return skillZustand(inhalt, eigene) === "veraltet";
|
|
89
|
+
return skillZustand(inhalt, eigene, sprache()) === "veraltet";
|
|
88
90
|
}
|
|
89
91
|
/**
|
|
90
92
|
* Der eine Anruf beim eigenen Server -- Zugang pruefen, Nachricht abholen.
|
|
@@ -114,10 +116,12 @@ async function frageServer(schluessel, heute) {
|
|
|
114
116
|
// (live gemessen 17.09.). Faellt die Version aus, geht der Kopf nicht mit.
|
|
115
117
|
const version = eigeneVersion();
|
|
116
118
|
const antwort = await fetch(`${BASIS_URL}/api/cli/wache`, {
|
|
117
|
-
method: "POST",
|
|
118
|
-
headers: { Authorization: `Bearer ${schluessel}`, ...(version ? { "X-Kimal3-Version": version } : {}) },
|
|
119
|
+
method: "POST", // kein-anzeigetext: HTTP-Methode
|
|
120
|
+
headers: { Authorization: `Bearer ${schluessel}`, [SPRACH_KOPF]: sprache(), ...(version ? { "X-Kimal3-Version": version } : {}) }, // kein-anzeigetext: HTTP-Kopf
|
|
119
121
|
signal: AbortSignal.timeout(ZEITGRENZE_MS),
|
|
120
122
|
});
|
|
123
|
+
// 🌐 Die Wache baut ihre Zeilen NACH dieser Antwort -- eine neue Kontosprache gilt schon dafuer (L-5).
|
|
124
|
+
uebernimmKontosprache(antwort.headers.get(KONTO_KOPF));
|
|
121
125
|
const koerper = await antwort.json().catch(() => null);
|
|
122
126
|
const { zugangGilt, hinweis, bekannt } = wacheAntwortAusHttp(antwort.status, koerper);
|
|
123
127
|
if (!hinweis)
|
|
@@ -205,13 +209,15 @@ export async function wache(alsHook) {
|
|
|
205
209
|
frageServer(anmeldung.schluessel, heute),
|
|
206
210
|
neuesteVonNpm(ZEITGRENZE_MS),
|
|
207
211
|
]);
|
|
212
|
+
// 🌐 Erst jetzt gelesen: eine Kontosprache aus der Antwort gilt schon (L-5); bei 401 und ohne
|
|
213
|
+
// Netz traegt der Merkzettel sie (L-7, L-8).
|
|
208
214
|
const befunde = wacheBefunde({
|
|
209
215
|
zugangGilt: vomServer.zugangGilt,
|
|
210
216
|
nachricht: vomServer.hinweis?.text ?? null,
|
|
211
217
|
eigeneVersion: eigeneVersion(),
|
|
212
218
|
neuesteVersion: vonNpm,
|
|
213
219
|
skillVeraltet: skillIstVeraltet(),
|
|
214
|
-
});
|
|
220
|
+
}, sprache());
|
|
215
221
|
const zeilen = befunde.map((b) => b.zeile);
|
|
216
222
|
// 🔴 VOR der Ausgabe -- sonst spricht die Wache bei einem Fehler in der
|
|
217
223
|
// Ausgabe morgen wieder und uebermorgen wieder.
|
|
@@ -231,7 +237,7 @@ export async function wache(alsHook) {
|
|
|
231
237
|
merkeLauf(heute);
|
|
232
238
|
if (zeilen.length === 0)
|
|
233
239
|
return 0;
|
|
234
|
-
console.log(alsHook ? alsHookAusgabe(zeilen) : wacheBlock(zeilen));
|
|
240
|
+
console.log(alsHook ? alsHookAusgabe(zeilen, sprache()) : wacheBlock(zeilen));
|
|
235
241
|
// Erst NACH dem Drucken vermerken, dass die Nachricht heute schon lief --
|
|
236
242
|
// dieselbe Reihenfolge wie beim Update-Kanal in kimal3.ts. Daran haengt
|
|
237
243
|
// ihr Einmal-am-Tag, NICHT am Lauf-Stempel: Beim wiederholten Lauf kommt
|
|
@@ -253,6 +259,6 @@ export async function wache(alsHook) {
|
|
|
253
259
|
*/
|
|
254
260
|
export function wacheSchalten(an) {
|
|
255
261
|
setzeWache(an);
|
|
256
|
-
console.log(an ?
|
|
262
|
+
console.log(an ? WACHE_TEXTE[sprache()].watchOn : WACHE_TEXTE[sprache()].watchOff);
|
|
257
263
|
return 0;
|
|
258
264
|
}
|
package/dist/befehle/werkbank.js
CHANGED
|
@@ -2,8 +2,12 @@ import { existsSync, statSync } from "node:fs";
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { FIRMEN_OPTIONEN, dateienSchreiben, istUnsichererOrdnername, vorlageHolen, werkbankOrdner, } from "../arbeitsplatz-dateien.js";
|
|
4
4
|
import { alsBefehlszeile, alsWort, trenneNamenUndOptionen, zerlege } from "../argumente.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { befehlIn, schalterIn } from "../befehlswoerter.js";
|
|
6
|
+
import { sprache } from "../sprache.js";
|
|
7
|
+
import { ARBEITSPLATZ_TEXTE } from "../texte/arbeitsplatz.js";
|
|
8
|
+
import { WERKBANK_TEXTE } from "../texte/werkbank.js";
|
|
9
|
+
import { werkbankOrdnerAus, werkbankSpracheAus, werkbankUmbenennen } from "../werkbank-name.js";
|
|
10
|
+
import { FIRMEN_CLAUDE_MD, MERKZETTEL_PFAD, ORDNER_NAMEN, firmenAbgleich, firmennameAusClaudeMd, leseMerkzettel, } from "../kontext-stand.js";
|
|
7
11
|
import { leseEineDatei, leseMerkzettelDatei } from "../kontext-dateien.js";
|
|
8
12
|
/**
|
|
9
13
|
* Legt **nur eine Werkbank** an — in einem Firmen-Ordner, der schon steht.
|
|
@@ -56,29 +60,10 @@ import { leseEineDatei, leseMerkzettelDatei } from "../kontext-dateien.js";
|
|
|
56
60
|
* verwalten (s. `WEITER-HIER.md`, Entscheidungen). Was dann von außen kommt,
|
|
57
61
|
* darf ein lokaler Befehl nicht überschreiben.
|
|
58
62
|
*/
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
Die Firmenebene (kontext/, CLAUDE.md, README.md) wird NICHT angefasst.
|
|
64
|
-
|
|
65
|
-
dein-vorname Optional. Der Ordner traegt deinen Namen -- aus "sabine"
|
|
66
|
-
wird "werkbank-sabine". Ohne Angabe steht dort der Name,
|
|
67
|
-
den der Server aus deiner Anmelde-Adresse gebildet hat.
|
|
68
|
-
|
|
69
|
-
--firma "Name" Nur noetig, wenn du zu mehreren Firmen gehoerst UND dieser
|
|
70
|
-
Ordner seine Firma nicht eindeutig nennt -- sonst nehme
|
|
71
|
-
ich die Firma des Ordners und sage dir das.
|
|
72
|
-
Die Absage nennt dir die Namen als fertige Befehle.
|
|
73
|
-
|
|
74
|
-
--firma-id "…" Fuer den Fall, dass zwei deiner Firmen GLEICH heissen.
|
|
75
|
-
Auch diese Absage nennt dir fertige Befehle.
|
|
76
|
-
|
|
77
|
-
🔴 Bricht ab, wenn der Zielordner schon existiert und NICHT leer ist.
|
|
78
|
-
|
|
79
|
-
Du hast noch gar keinen Firmen-Ordner?
|
|
80
|
-
kimal3 arbeitsplatz neu <dein-vorname>
|
|
81
|
-
`;
|
|
63
|
+
/** Die Hilfe von `werkbank neu` / `workbench new` in der Sprache des Menschen. */
|
|
64
|
+
export function hilfe(s) {
|
|
65
|
+
return WERKBANK_TEXTE[s].help;
|
|
66
|
+
}
|
|
82
67
|
/**
|
|
83
68
|
* 🔴 **Review-Runde 2 zu PR #25 — und es ist DERSELBE Fehler wie in Runde 1,
|
|
84
69
|
* nur eine Datei weiter.** Hier stand:
|
|
@@ -104,16 +89,14 @@ const HILFE = `
|
|
|
104
89
|
* fuellen muss, obwohl die Antwort danebensteht. *Ein Platzhalter ist ein
|
|
105
90
|
* Eingestaendnis, dass man es nicht weiss -- hier weiss man es.*
|
|
106
91
|
*/
|
|
107
|
-
function hinweisFuer(ordnerName) {
|
|
108
|
-
|
|
109
|
-
return (" Ist das DEINE Werkbank? Dann steht sie schon -- geh einfach hinein:\n" +
|
|
110
|
-
` cd ${ziel}\n` +
|
|
111
|
-
" Bist du es nicht, nimm deinen eigenen Vornamen:\n" +
|
|
112
|
-
" kimal3 werkbank neu <dein-vorname>");
|
|
92
|
+
function hinweisFuer(ordnerName, s) {
|
|
93
|
+
return WERKBANK_TEXTE[s].adviceOwnWorkbench(alsWort(ordnerName), befehlIn("werkbank neu", s)); // kein-anzeigetext: Befehlsschlüssel
|
|
113
94
|
}
|
|
114
95
|
export async function werkbankNeu(argv) {
|
|
96
|
+
let s = sprache();
|
|
97
|
+
let t = WERKBANK_TEXTE[s];
|
|
115
98
|
if (argv.includes("--help") || argv.includes("-h")) {
|
|
116
|
-
console.log(
|
|
99
|
+
console.log(hilfe(s));
|
|
117
100
|
return 0;
|
|
118
101
|
}
|
|
119
102
|
/*
|
|
@@ -135,7 +118,7 @@ export async function werkbankNeu(argv) {
|
|
|
135
118
|
const { woerter, optionen: optionsArgv } = trenneNamenUndOptionen(argv);
|
|
136
119
|
const nameArg = woerter[0];
|
|
137
120
|
if (nameArg !== undefined && nameArg.trim() === "") {
|
|
138
|
-
console.error(
|
|
121
|
+
console.error(t.emptyName + hilfe(s));
|
|
139
122
|
return 1;
|
|
140
123
|
}
|
|
141
124
|
if (woerter.length > 1) {
|
|
@@ -162,17 +145,15 @@ export async function werkbankNeu(argv) {
|
|
|
162
145
|
*/
|
|
163
146
|
const optionsAnhang = optionsArgv.length === 0 ? "" : ` ${alsBefehlszeile(optionsArgv)}`;
|
|
164
147
|
const vorschlag = einfacheWoerter.length === woerter.length
|
|
165
|
-
?
|
|
166
|
-
` kimal3 werkbank neu ${einfacheWoerter.join("-")}${optionsAnhang}\n`
|
|
148
|
+
? t.nameSuggestion(befehlIn("werkbank neu", s), einfacheWoerter.join("-"), optionsAnhang) // kein-anzeigetext: Befehlsschlüssel
|
|
167
149
|
: "";
|
|
168
|
-
console.error(
|
|
169
|
-
`${vorschlag}${HILFE}`);
|
|
150
|
+
console.error(t.onlyOneName(woerter[1]) + vorschlag + hilfe(s));
|
|
170
151
|
return 1;
|
|
171
152
|
}
|
|
172
153
|
// 🔑 Erst NACH den Namens-Absagen -- s. Zwilling in `arbeitsplatz.ts`.
|
|
173
|
-
const zerlegt = zerlege(optionsArgv, FIRMEN_OPTIONEN);
|
|
154
|
+
const zerlegt = zerlege(optionsArgv, FIRMEN_OPTIONEN, s);
|
|
174
155
|
if (!zerlegt.ok) {
|
|
175
|
-
console.error(`${zerlegt.meldung}\n${
|
|
156
|
+
console.error(`${zerlegt.meldung}\n${hilfe(s)}`);
|
|
176
157
|
return 1;
|
|
177
158
|
}
|
|
178
159
|
const wunsch = {
|
|
@@ -182,14 +163,13 @@ export async function werkbankNeu(argv) {
|
|
|
182
163
|
// `null` heisst: nach dem Umschreiben blieb kein Zeichen uebrig, das in einem
|
|
183
164
|
// Ordnernamen stehen darf. Ein Mensch hat hier getippt und verdient eine
|
|
184
165
|
// Antwort -- der Server schweigt im selben Fall und bleibt beim Vordruck.
|
|
185
|
-
|
|
166
|
+
// 🌐 Teil 2: nur „bleibt etwas uebrig?" -- das Praefix kommt erst aus der Lieferung, s. unten.
|
|
186
167
|
if (nameArg !== undefined) {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
console.error(
|
|
190
|
-
console.error("Zeichen uebrig, die in keinem Ordnernamen stehen duerfen.");
|
|
168
|
+
if (werkbankOrdnerAus(nameArg, "de") === null) {
|
|
169
|
+
console.error(t.unusableName1(nameArg));
|
|
170
|
+
console.error(t.unusableName2);
|
|
191
171
|
console.error("");
|
|
192
|
-
console.error("
|
|
172
|
+
console.error(t.unusableName3(befehlIn("werkbank neu", s))); // kein-anzeigetext: Befehlsschlüssel
|
|
193
173
|
return 1;
|
|
194
174
|
}
|
|
195
175
|
}
|
|
@@ -200,9 +180,6 @@ export async function werkbankNeu(argv) {
|
|
|
200
180
|
wird nie erreicht.
|
|
201
181
|
*/
|
|
202
182
|
// 🔑 Der getippte Vorname reist in der Absage mit -- s. Zwilling.
|
|
203
|
-
const befehlsname = nameArg === undefined
|
|
204
|
-
? "werkbank neu"
|
|
205
|
-
: `werkbank neu ${alsWort(nameArg)}`;
|
|
206
183
|
/*
|
|
207
184
|
🔑 **Die Firma dieses Ordners** -- Kennung aus dem Merkzettel, Name aus der
|
|
208
185
|
Firmen-`CLAUDE.md`. `vorlageHolen` nimmt sie nur, wenn der Server wegen
|
|
@@ -214,9 +191,13 @@ export async function werkbankNeu(argv) {
|
|
|
214
191
|
id: leseMerkzettelDatei(process.cwd()).firma_id,
|
|
215
192
|
name: firmennameAusClaudeMd(hierGelesen.ok ? hierGelesen.inhalt : null),
|
|
216
193
|
};
|
|
217
|
-
const holen = await vorlageHolen(
|
|
194
|
+
const holen = await vorlageHolen("werkbank neu", // kein-anzeigetext: Befehlsschlüssel
|
|
195
|
+
nameArg === undefined ? "" : ` ${alsWort(nameArg)}`, wunsch, ordnerFirma);
|
|
218
196
|
if (!holen.ok)
|
|
219
197
|
return holen.wert;
|
|
198
|
+
// 🌐 Die Antwort kann die Kontosprache umgestellt haben (Spec 3.2, Schritt 3): Was ab hier gedruckt wird, in der neuen.
|
|
199
|
+
s = sprache();
|
|
200
|
+
t = WERKBANK_TEXTE[s];
|
|
220
201
|
const daten = holen.daten;
|
|
221
202
|
const werkbank = werkbankOrdner(daten.dateien);
|
|
222
203
|
/*
|
|
@@ -263,14 +244,17 @@ export async function werkbankNeu(argv) {
|
|
|
263
244
|
ist kein Grund, sie hier falsch zu benennen.
|
|
264
245
|
*/
|
|
265
246
|
if (werkbank !== null && istUnsichererOrdnername(werkbank)) {
|
|
266
|
-
console.error(
|
|
247
|
+
console.error(t.unsafeFolderName(werkbank));
|
|
267
248
|
return 3;
|
|
268
249
|
}
|
|
269
250
|
if (werkbank === null) {
|
|
270
|
-
console.error(
|
|
271
|
-
console.error(
|
|
251
|
+
console.error(t.noWorkbank1);
|
|
252
|
+
console.error(t.noWorkbank2);
|
|
272
253
|
return 3;
|
|
273
254
|
}
|
|
255
|
+
// 🌐 Teil 2: Das Praefix der gelieferten Werkbank ist die Kontosprache; ein getipptes fremdes
|
|
256
|
+
// Praefix wird ersetzt, nie verdoppelt (`workbench-jens` bei deutschem Konto -> `werkbank-jens`).
|
|
257
|
+
const gewuenschteWerkbank = nameArg === undefined ? null : werkbankOrdnerAus(nameArg, werkbankSpracheAus(werkbank) ?? "de");
|
|
274
258
|
/*
|
|
275
259
|
🔑 **Die Prüfung, ob wir überhaupt in einer Firma stehen** -- und sie ist
|
|
276
260
|
keine Förmlichkeit: In `<werkbank>/.claude/settings.json` steht
|
|
@@ -317,17 +301,32 @@ export async function werkbankNeu(argv) {
|
|
|
317
301
|
Eine kaputte Lieferung ist keine falsche Eingabe.
|
|
318
302
|
*/
|
|
319
303
|
if (firmenOrdner.length === 0) {
|
|
320
|
-
console.error(
|
|
321
|
-
console.error(
|
|
322
|
-
console.error(
|
|
304
|
+
console.error(t.noCompanyLevel1);
|
|
305
|
+
console.error(t.noCompanyLevel2);
|
|
306
|
+
console.error(t.noCompanyLevel3);
|
|
323
307
|
return 3;
|
|
324
308
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
309
|
+
/*
|
|
310
|
+
🔴 **Teil-2-Rest Minor 7: Der Firmen-Ordner steht da, nur in der Sprache von frueher.** Alter
|
|
311
|
+
deutscher Ordner (`kontext/`), Firma inzwischen englisch: Der Server liefert die englische
|
|
312
|
+
Vorlage, `fehlend` nennt `context` -- und der Mensch las "Hier steht kein Firmen-Ordner" samt
|
|
313
|
+
"Bist du der ERSTE in deiner Firma?". Beides falsch. Diese Absage kommt VOR dem Zweig darunter.
|
|
314
|
+
*/
|
|
315
|
+
const ordnerSprache = andereOrdnerSprache(fehlend, istOrdner);
|
|
316
|
+
// Die Firma der Lieferung gegen die Firma dieses Ordners -- Begruendung unten bei "andere-firma".
|
|
317
|
+
const inhaltAus = (pfad) => daten.dateien.find((d) => d.pfad === pfad)?.inhalt ?? null;
|
|
318
|
+
const abgleich = firmenAbgleich(ordnerFirma, {
|
|
319
|
+
id: leseMerkzettel(inhaltAus(MERKZETTEL_PFAD)).firma_id,
|
|
320
|
+
name: firmennameAusClaudeMd(inhaltAus(FIRMEN_CLAUDE_MD)),
|
|
321
|
+
});
|
|
322
|
+
// 🔑 Welche Absage zuerst -- reine Rechnung, `check:cli` (Runde C, C2-4, s. `ortsAbsage`).
|
|
323
|
+
const absage = ortsAbsage(fehlend, ordnerSprache, abgleich);
|
|
324
|
+
if (absage === "kein-firmenordner") {
|
|
325
|
+
console.error(t.noCompanyFolder1(fehlend.join(", ")));
|
|
326
|
+
console.error(t.noCompanyFolder2);
|
|
327
|
+
console.error(t.noCompanyFolder3);
|
|
329
328
|
console.error("");
|
|
330
|
-
console.error(
|
|
329
|
+
console.error(t.noCompanyFolder4);
|
|
331
330
|
console.error("");
|
|
332
331
|
/*
|
|
333
332
|
🔴 **Hier stand „Du hast noch keinen? kimal3 arbeitsplatz neu"**
|
|
@@ -350,12 +349,12 @@ export async function werkbankNeu(argv) {
|
|
|
350
349
|
das so ist, ist die ehrliche Auskunft „frag, wo er liegt" -- und nicht
|
|
351
350
|
ein Befehl, der etwas Falsches anlegt.
|
|
352
351
|
*/
|
|
353
|
-
console.error(
|
|
354
|
-
console.error("
|
|
352
|
+
console.error(t.noCompanyFolder5);
|
|
353
|
+
console.error(t.noCompanyFolder6(befehlIn("arbeitsplatz neu", s))); // kein-anzeigetext: Befehlsschlüssel
|
|
355
354
|
console.error("");
|
|
356
|
-
console.error(
|
|
357
|
-
console.error(
|
|
358
|
-
console.error(
|
|
355
|
+
console.error(t.noCompanyFolder7);
|
|
356
|
+
console.error(t.noCompanyFolder8);
|
|
357
|
+
console.error(t.noCompanyFolder9);
|
|
359
358
|
return 1;
|
|
360
359
|
}
|
|
361
360
|
/*
|
|
@@ -376,27 +375,11 @@ export async function werkbankNeu(argv) {
|
|
|
376
375
|
🔴 **UND ER STEHT VOR `dateienSchreiben`.** Ein Abbruch hier hinterlaesst
|
|
377
376
|
keine halbe Werkbank -- dieselbe Haltung wie in `kontextHoch`
|
|
378
377
|
(„ich schicke nichts Halbes hoch“).
|
|
378
|
+
|
|
379
|
+
🔑 Gerechnet wird der Abgleich schon oben, vor „kein Firmen-Ordner“: Seit
|
|
380
|
+
Runde C (C2-4) schlaegt „andere Firma“ die Sprachwechsel-Absage (`ortsAbsage`).
|
|
379
381
|
*/
|
|
380
|
-
|
|
381
|
-
const abgleich = firmenAbgleich(ordnerFirma, {
|
|
382
|
-
id: leseMerkzettel(inhaltAus(MERKZETTEL_PFAD)).firma_id,
|
|
383
|
-
name: firmennameAusClaudeMd(inhaltAus(FIRMEN_CLAUDE_MD)),
|
|
384
|
-
});
|
|
385
|
-
/*
|
|
386
|
-
🔴 **DER VERDACHT WARNT, ER SPERRT NICHT** (Befund 1 der vierten
|
|
387
|
-
Review-Runde). Steht der Name nur deshalb anders da, weil jemand die
|
|
388
|
-
`CLAUDE.md` seiner Firma bearbeitet hat -- was er ausdruecklich darf --,
|
|
389
|
-
waere eine Absage falsch UND ausweglos. Die Zeile hier sagt, was sie
|
|
390
|
-
sieht, und laesst den Menschen entscheiden.
|
|
391
|
-
*/
|
|
392
|
-
if (abgleich.art === "zweifel") {
|
|
393
|
-
console.error(`Achtung: Dieser Ordner nennt als Firma „${abgleich.hier}",`);
|
|
394
|
-
console.error(`du hast aber „${abgleich.gewaehlt}" gewaehlt.`);
|
|
395
|
-
console.error("Ich lege die Werkbank trotzdem an -- vielleicht heisst die Firma bei euch");
|
|
396
|
-
console.error("nur anders geschrieben. Stimmt es nicht, loesch den neuen Ordner wieder.");
|
|
397
|
-
console.error("");
|
|
398
|
-
}
|
|
399
|
-
if (abgleich.art === "andere-firma") {
|
|
382
|
+
if (absage === "andere-firma") {
|
|
400
383
|
/*
|
|
401
384
|
🔴 **ZWEI LAGEN, ZWEI SAETZE** (Befund 3 der dritten Review-Runde). Hier
|
|
402
385
|
stand ein Rueckfall `?? "die genannte Firma"`, und der war erreichbar:
|
|
@@ -409,22 +392,42 @@ export async function werkbankNeu(argv) {
|
|
|
409
392
|
*/
|
|
410
393
|
const genannt = wunsch.firma ?? wunsch.firmaId;
|
|
411
394
|
if (genannt === undefined) {
|
|
412
|
-
console.error(
|
|
413
|
-
console.error(
|
|
414
|
-
console.error(
|
|
395
|
+
console.error(t.otherCompany1);
|
|
396
|
+
console.error(t.otherCompany2);
|
|
397
|
+
console.error(t.otherCompany3);
|
|
415
398
|
console.error("");
|
|
416
|
-
console.error(
|
|
417
|
-
console.error(
|
|
399
|
+
console.error(t.otherCompany4);
|
|
400
|
+
console.error(t.otherCompany5);
|
|
418
401
|
return 1;
|
|
419
402
|
}
|
|
420
|
-
console.error(
|
|
421
|
-
console.error(
|
|
422
|
-
console.error(
|
|
403
|
+
console.error(t.otherNamedCompany1(genannt));
|
|
404
|
+
console.error(t.otherNamedCompany2);
|
|
405
|
+
console.error(t.otherNamedCompany3);
|
|
423
406
|
console.error("");
|
|
424
|
-
console.error(
|
|
425
|
-
console.error(
|
|
407
|
+
console.error(t.otherNamedCompany4(genannt));
|
|
408
|
+
console.error(t.otherNamedCompany5);
|
|
426
409
|
return 1;
|
|
427
410
|
}
|
|
411
|
+
if (absage === "andere-sprache" && ordnerSprache !== null) {
|
|
412
|
+
console.error(t.folderInOtherLanguage(ordnerSprache, `kimal3 ${befehlIn("arbeitsplatz neu", s)}`)); // kein-anzeigetext: Befehlsschlüssel
|
|
413
|
+
return 1;
|
|
414
|
+
}
|
|
415
|
+
/*
|
|
416
|
+
🔴 **DER VERDACHT WARNT, ER SPERRT NICHT** (Befund 1 der vierten
|
|
417
|
+
Review-Runde). Steht der Name nur deshalb anders da, weil jemand die
|
|
418
|
+
`CLAUDE.md` seiner Firma bearbeitet hat -- was er ausdruecklich darf --,
|
|
419
|
+
waere eine Absage falsch UND ausweglos. Die Zeile hier sagt, was sie
|
|
420
|
+
sieht, und laesst den Menschen entscheiden. Sie steht HINTER allen
|
|
421
|
+
Absagen: Ihr Satz „ich lege die Werkbank trotzdem an“ darf nie vor einer
|
|
422
|
+
Absage stehen (so war es auch vorher, nur ueber die Reihenfolge der Zweige).
|
|
423
|
+
*/
|
|
424
|
+
if (abgleich.art === "zweifel") {
|
|
425
|
+
console.error(t.doubt1(abgleich.hier));
|
|
426
|
+
console.error(t.doubt2(abgleich.gewaehlt));
|
|
427
|
+
console.error(t.doubt3);
|
|
428
|
+
console.error(t.doubt4);
|
|
429
|
+
console.error("");
|
|
430
|
+
}
|
|
428
431
|
/*
|
|
429
432
|
🔑 Der Zielordner ist der Werkbank-Name -- entweder der, den der Server
|
|
430
433
|
schon gesetzt hat (`werkbank`, aus der Anmelde-Adresse gebildet), oder der
|
|
@@ -462,13 +465,13 @@ export async function werkbankNeu(argv) {
|
|
|
462
465
|
const meine = umbenannt
|
|
463
466
|
.filter((d) => d.pfad.startsWith(praefix))
|
|
464
467
|
.map((d) => ({ pfad: d.pfad.slice(praefix.length), inhalt: d.inhalt }));
|
|
465
|
-
const wert = dateienSchreiben(meine, ordnerName, hinweisFuer(ordnerName));
|
|
468
|
+
const wert = dateienSchreiben(meine, ordnerName, hinweisFuer(ordnerName, s));
|
|
466
469
|
if (wert !== 0)
|
|
467
470
|
return wert;
|
|
468
|
-
console.log(
|
|
471
|
+
console.log(ARBEITSPLATZ_TEXTE[s].filesCreated(meine.length));
|
|
469
472
|
console.log(` ${resolve(ordnerName)}`);
|
|
470
473
|
console.log("");
|
|
471
|
-
console.log(
|
|
474
|
+
console.log(t.companyUntouched);
|
|
472
475
|
console.log("");
|
|
473
476
|
/*
|
|
474
477
|
Erst NACH dem Anlegen (Lage L2): Vorher koennte noch eine Absage folgen, und
|
|
@@ -476,16 +479,52 @@ export async function werkbankNeu(argv) {
|
|
|
476
479
|
*/
|
|
477
480
|
if (holen.uebernommen) {
|
|
478
481
|
const gewaehlt = firmennameAusClaudeMd(inhaltAus(FIRMEN_CLAUDE_MD));
|
|
479
|
-
console.log(
|
|
480
|
-
console.log("
|
|
482
|
+
console.log(t.companyFromFolder(gewaehlt));
|
|
483
|
+
console.log(t.companyFromFolderHint(schalterIn("firma", s))); // kein-anzeigetext: Schalterschlüssel
|
|
481
484
|
console.log("");
|
|
482
485
|
}
|
|
483
|
-
|
|
484
|
-
console.log(
|
|
485
|
-
console.log(
|
|
486
|
-
console.log(
|
|
486
|
+
// 🔑 Derselbe Rat wie nach `arbeitsplatz neu`: eine Fassung des Ausloesesatzes, nicht zwei.
|
|
487
|
+
console.log(ARBEITSPLATZ_TEXTE[s].nextStepsHeader);
|
|
488
|
+
console.log(` cd ${alsWort(ordnerName)}`); // kein-anzeigetext: Befehlszeile zum Kopieren
|
|
489
|
+
console.log(" claude"); // kein-anzeigetext: Befehlszeile zum Kopieren
|
|
490
|
+
console.log(ARBEITSPLATZ_TEXTE[s].nextStepsSay);
|
|
487
491
|
return 0;
|
|
488
492
|
}
|
|
493
|
+
/**
|
|
494
|
+
* Fehlt NUR der Kontextordner der Lieferung, weil hier der der ANDEREN Sprache steht? (Teil-2-Rest
|
|
495
|
+
* Minor 7: alter deutscher Ordner, Firma inzwischen englisch.) Dann ist das kein "hier steht kein
|
|
496
|
+
* Firmen-Ordner", sondern ein Sprachwechsel der Firma -- die Sprache des VORHANDENEN Ordners, sonst null.
|
|
497
|
+
* Rein (check:cli): `gibtEs` ist im Befehl `istOrdner`.
|
|
498
|
+
*/
|
|
499
|
+
export function andereOrdnerSprache(fehlend, gibtEs) {
|
|
500
|
+
if (fehlend.length !== 1)
|
|
501
|
+
return null;
|
|
502
|
+
if (fehlend[0] === ORDNER_NAMEN.en.kontext && gibtEs(ORDNER_NAMEN.de.kontext))
|
|
503
|
+
return "de";
|
|
504
|
+
if (fehlend[0] === ORDNER_NAMEN.de.kontext && gibtEs(ORDNER_NAMEN.en.kontext))
|
|
505
|
+
return "en";
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Welche Absage gilt, bevor eine Werkbank entsteht -- und welche zuerst? (Runde C, C2-4)
|
|
510
|
+
*
|
|
511
|
+
* 🔴 **„andere Firma“ schlaegt „Sprache des Ordners passt nicht“.** Bis 0.3.0 kam die
|
|
512
|
+
* Sprachwechsel-Absage zuerst: Wer im deutschen Ordner einer FREMDEN Firma stand, waehrend seine
|
|
513
|
+
* eigene Englisch spricht, las „dieser Ordner ist noch deutsch“ und den Rat `arbeitsplatz neu` --
|
|
514
|
+
* als waere es seine Firma nach einem Sprachwechsel. Die Kennung im Merkzettel weiss es aber
|
|
515
|
+
* sicher (`firmenAbgleich`), und ein Sprachwechsel ist nur dann die Erklaerung, wenn es dieselbe
|
|
516
|
+
* Firma ist. „Kein Firmen-Ordner“ bleibt vorn: Fehlt die Firmenebene ganz, gibt es keinen Ordner,
|
|
517
|
+
* dessen Firma man vergleichen koennte.
|
|
518
|
+
*/
|
|
519
|
+
export function ortsAbsage(fehlend, ordnerSprache, abgleich) {
|
|
520
|
+
if (fehlend.length > 0 && ordnerSprache === null)
|
|
521
|
+
return "kein-firmenordner";
|
|
522
|
+
if (abgleich.art === "andere-firma")
|
|
523
|
+
return "andere-firma";
|
|
524
|
+
if (ordnerSprache !== null)
|
|
525
|
+
return "andere-sprache";
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
489
528
|
/**
|
|
490
529
|
* Die Ordner der Firmenebene, aus der Lieferung abgeleitet: jeder erste
|
|
491
530
|
* Pfad-Teil, der einen Unterordner benennt und nicht die Werkbank ist.
|