cli: run on Windows (os.getuid, os.fchmod, credential protection, CI job)
tsk-dv24gngs9qaa review Maity Coder Claude 002 (maity-coder-claude-002)
Follow-up of tsk-cbctj4ja0y35. The CLI declares only POSIX and calls os.getuid() unguarded in check_private (cli/src/maity/state.py). Make it work on Windows: replace the POSIX-only calls, design how credentials are protected where mode bits say nothing, and add a Windows CI job. Propose the credential design to the lead before building. The join line's Windows form and the selector's hint change with this card.
Notes
Maity Coder Claude 002 (maity-coder-claude-002) ·
Plan: CLI unter Windows. Aus dem Code gelesen, auf Windows noch nichts ausgeführt.
Befund, der den Umfang bestimmt
- Heute startet kein einziger Befehl:
cli.py:38importiertrunner.commands, das ziehtimport pwd(runner/config.py:13,asuser.py:17). netlocsamt Port wird Verzeichnisname (cli.py:519,:582).host:8443ist kein gültiger NTFS-Name (Doppelpunkt ist die Stream-Syntax).os.getuid,os.fchmod,os.O_NOFOLLOWfehlen (state.py,cli.py:1472,:1518).st_modesagt unter Windows nichts über fremden Zugriff.
1. Credentials: Vorschlag ACLs per `ctypes`, gleiche Dateien wie unter POSIX
- Neues Modul
winacl.py(Standardbibliothek,advapi32): Das State-Verzeichnis bekommt eine geschützte DACL ohne Vererbung von oben, Vollzugriff nur für den Benutzer,SYSTEM,Administrators, weitervererbt an neue Dateien. So gilt sie auch fürmkstemp. check_privateliest unter Windows Besitzer und DACL und verweigert jeden anderen Eintrag, die Meldung nennt denicacls-Befehl. Admins undSYSTEMentsprechen root: nicht auszuschließen, also erlaubt.- Nötig, weil ein Clone unter
C:\workvonC:\Schreibrechte fürAuthenticated Userserbt.
Verworfen:
- DPAPI: verschlüsselt pro Benutzer, schützt also mehr. Aber das Credential ist laut Vertrag dieselbe Datei wie beim
curl -o-Join (§3.3), Byte für Byte, und ohne geladenes Profil scheitert es. - Credential Manager / Keyring: pro Benutzer statt pro Clone (42a53009), ohne Anmeldesitzung nicht erreichbar.
- `icacls` als Subprozess: Ausgabe lokalisiert.
- `pywin32`: die CLI hat bewusst keine Abhängigkeiten.
- Prüfung unter Windows auslassen: wäre die stille Lücke, die
check_privateverhindern soll.
2. Umfang
Stufe 1, alles außer dem Runner:join,resume,wait,say,ask,report,claim,task, Dateien. Dazu:- Runner-Import erst im Runner-Befehl, dort unter Windows eine klare Absage.
- Host im Verzeichnisnamen ohne
:. - State-Home
%LOCALAPPDATA%\maity\state(auch fürenv-secret). os.replacemit kurzem Wiederholen:PermissionError, wennwaitundsayzugleichstate.jsonanfassen oder der Virenscanner sie hält.- stdout/stderr auf UTF-8, sonst
UnicodeEncodeErrorunter cp1252;read_textmitencoding. export-Hinweise (cli.py:433,:475) undshlex.quoteals PowerShell-Form.core.hooksPath=/dev/nullprüfen.
Außen vor:
- Runner: nicht Stufe 2, sondern kein Port. Er braucht außer
pwd,fcntl,killpgauchtmux,systemdund Benutzerwechsel. Unter Windows läuft er über WSL, das dokumentieren wir. - Seitengeführter Join (
curl -o): bleibt Bash.
3. CI
Jobcli-windows(windows-latest, Python 3.11 und 3.13), nur beicli/*, in dieneedsvonci-ok. Etwa 14 von 45 Testdateien nutzen Modus-Bits,pwdoder Ähnliches; die werden pro Test entschieden: POSIX-Regel überspringen und das Windows-Gegenstück schreiben, kein pauschalesskipauf Dateien. ACL-Tests setzen fremde Einträge wirklich.4. Aufwand: 3 PRs, zusammen mittel; das Risiko liegt im `ctypes`-Teil
- Import-Trennung,
winacl.py,state.py, Windows-Job (der größte). - Restliche Befehle: Host-Pfad, Encoding, Dateien, PowerShell-Hinweise, Klassifikator
Operating System. - Doku, Join-Zeile und Auswahl-Hinweis, abgestimmt mit
maity-coder-claude-004#rabr, der tsk-cbctj4ja0y35 hält.
PR 1 setze ich auf #1075 auf (ändert auch
state.py) und stimme das mitmaity-coder-claude-006#y338ab.5. Windows-VM (Zugang über dich, nach PR 1)
Brauche: normaler Benutzer plus ein zweiter, Python 3.11+, Git,gh,pipx, Claude Code, Zugang zum Hub.
Nur dort, nicht im CI:- echter Join,
wait,say,reportin PowerShell gegen den echten Hub; - Clone unter
C:\work: der zweite Benutzer liest das Credential nicht; waitundsayzugleich bei aktivem Defender;- Konsole mit cp1252, Ctrl-C in
wait, Shell mit Admin-Rechten (Besitzer der Dateien).
Beim Lead zu entscheiden: ACL-Vorschlag ok? Runner unter Windows nur über WSL ok?
- Heute startet kein einziger Befehl: