chore: initialize safe Javis project scaffold
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
name = "architect"
|
||||
description = "Read-only architecture reviewer for bounded design decisions."
|
||||
sandbox_mode = "read-only"
|
||||
developer_instructions = """
|
||||
Evaluate the requested architecture question without editing production files.
|
||||
Offer at most three realistic options, label assumptions, and make one clear recommendation with tradeoffs.
|
||||
"""
|
||||
@@ -0,0 +1,8 @@
|
||||
name = "builder"
|
||||
description = "The only custom agent allowed to make scoped production-file changes."
|
||||
sandbox_mode = "workspace-write"
|
||||
developer_instructions = """
|
||||
Implement only explicitly approved, narrowly scoped changes.
|
||||
Preserve existing work, avoid architecture drift, run relevant tests, and summarize changed files.
|
||||
Never edit Obsidian, servers, system configuration, or secrets.
|
||||
"""
|
||||
@@ -0,0 +1,7 @@
|
||||
name = "scout"
|
||||
description = "Read-only repository scout for locating relevant files and relationships."
|
||||
sandbox_mode = "read-only"
|
||||
developer_instructions = """
|
||||
Work read-only. Find only the files and relationships needed for the assigned question.
|
||||
Return at most ten concise points with file references. Do not dump full logs or propose unrelated work.
|
||||
"""
|
||||
@@ -0,0 +1,8 @@
|
||||
name = "security_reviewer"
|
||||
description = "Read-only reviewer for actual security-sensitive changes."
|
||||
sandbox_mode = "read-only"
|
||||
developer_instructions = """
|
||||
Review only the security-relevant scope requested.
|
||||
Prioritize authentication, permissions, paths, secrets, tools, APIs, networking, and deployment.
|
||||
Return findings ordered by severity with evidence and do not modify files.
|
||||
"""
|
||||
@@ -0,0 +1,7 @@
|
||||
name = "verifier"
|
||||
description = "Read-only verifier for tests, structure, and behavior claims."
|
||||
sandbox_mode = "read-only"
|
||||
developer_instructions = """
|
||||
Run or inspect the requested verification without changing production files.
|
||||
Report commands, pass/fail results, and concise evidence. Do not hide failures or silently repair them.
|
||||
"""
|
||||
@@ -0,0 +1,2 @@
|
||||
[agents]
|
||||
max_concurrent_threads_per_session = 2
|
||||
@@ -0,0 +1,4 @@
|
||||
# Non-secret process overrides only.
|
||||
JAVIS_DISPLAY_NAME=Javis
|
||||
JAVIS_CONFIG_PATH=config/javis.toml
|
||||
JAVIS_SECRETS_PROVIDER=none
|
||||
@@ -0,0 +1,11 @@
|
||||
* text=auto eol=lf
|
||||
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
*.ps1 text eol=crlf
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.gif binary
|
||||
*.webp binary
|
||||
*.pdf binary
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
# Local environments and caches
|
||||
.venv/
|
||||
venv/
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
.pytest_cache/
|
||||
.mypy_cache/
|
||||
.ruff_cache/
|
||||
|
||||
# Local configuration and secrets
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
key-pw.xml
|
||||
secrets.local.xml
|
||||
*.local.xml
|
||||
config/javis.toml
|
||||
config/*secret*.xml
|
||||
!config/*.example.xml
|
||||
|
||||
# Runtime data
|
||||
runtime/*
|
||||
!runtime/README.md
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
logs/
|
||||
models/
|
||||
indexes/
|
||||
|
||||
# Private knowledge and editor state
|
||||
.obsidian/
|
||||
Obsidian Vault/
|
||||
.vscode/
|
||||
|
||||
# Build and operating-system artifacts
|
||||
build/
|
||||
dist/
|
||||
*.egg-info/
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
@@ -0,0 +1,13 @@
|
||||
# Javis – dauerhafte Codex-Regeln
|
||||
|
||||
- Erkläre Pascal Änderungen und Ergebnisse auf Deutsch; Code und technische Bezeichner dürfen Englisch sein.
|
||||
- Prüfe vor Änderungen Pfad, Branch, Arbeitsbaum und betroffene Dateien.
|
||||
- Bevorzuge kleine, nachvollziehbare Änderungen und führe passende Tests ehrlich aus.
|
||||
- Lies oder veröffentliche keine Geheimwerte. Maskiere Secrets in Ausgaben und Logs.
|
||||
- Lösche oder verschiebe nichts außerhalb dieses Repositorys.
|
||||
- Kein Force-Push und kein Umschreiben bestehender Git-Historie.
|
||||
- Höchstens zwei Unteragenten gleichzeitig; nur ein Agent darf Produktionsdateien schreiben.
|
||||
- Bestehende Obsidian-Notizen nur nach ausdrücklicher Anweisung ändern. `.obsidian` nie verändern.
|
||||
- Rootserver und Ubuntu-Laptop nur nach gesonderter Freigabe verändern.
|
||||
- Aktualisiere nach wesentlichen Sitzungen `docs/PROJECT_STATUS.md`, `docs/DECISIONS.md`, `docs/NEXT_SESSION.md`, `docs/CHATGPT_HANDOFF.md` und `CHANGELOG.md`.
|
||||
- Behaupte keine fertige Funktion und keinen erfolgreichen Test ohne Nachweis.
|
||||
@@ -0,0 +1,22 @@
|
||||
# Changelog
|
||||
|
||||
Alle wesentlichen Projektänderungen werden hier in verständlicher Form dokumentiert.
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Added
|
||||
|
||||
- Sicheres, plattformunabhängiges Projektgrundgerüst.
|
||||
- Architektur-, Sicherheits-, Berechtigungs- und Statusdokumentation.
|
||||
- Inaktiver Living-Mind-Bereich ohne Demo- oder Fantasiedaten.
|
||||
- Eng begrenzte projektinterne Codex-Agentenrollen.
|
||||
- Abhängigkeitsfreier Strukturprüfer.
|
||||
|
||||
### Changed
|
||||
|
||||
- Der historische Verbindungstest aus `READ.ME` wurde in `README.md` übernommen.
|
||||
|
||||
### Security
|
||||
|
||||
- Lokale Secret-Dateien, Laufzeitdaten, Modelle, Datenbanken und Logs werden von Git ausgeschlossen.
|
||||
- Das Sprachmodell darf keine Secret-Werte erhalten.
|
||||
@@ -0,0 +1,21 @@
|
||||
# Arbeitsplan
|
||||
|
||||
## Phase 0 – Grundgerüst
|
||||
|
||||
- [x] Projekt- und Vault-Pfade lesend prüfen
|
||||
- [x] Architektur- und Sicherheitsgrenzen dokumentieren
|
||||
- [x] Schlankes Repository-Grundgerüst vorbereiten
|
||||
- [ ] Strukturtests im Ziel-Repository ausführen
|
||||
- [ ] Grundgerüst committen und pushen
|
||||
|
||||
## Phase 1 – Textkern
|
||||
|
||||
Erst nach Pascals Abnahme:
|
||||
|
||||
1. Branch `feat/core-chat` erstellen.
|
||||
2. lokale Python-Toolchain auswählen und nach Freigabe installieren.
|
||||
3. Konfigurations- und Provider-Schnittstellen implementieren.
|
||||
4. einfache lokale CLI mit echtem Provider, Sitzungsverlauf und klaren Fehlern bauen.
|
||||
5. Unit- und Integrationstests ergänzen.
|
||||
|
||||
Spätere Phasen stehen in [docs/ROADMAP.md](docs/ROADMAP.md).
|
||||
@@ -0,0 +1,40 @@
|
||||
# Javis
|
||||
|
||||
Javis ist ein langfristiges, lokal-first ausgerichtetes Projekt für einen persönlichen, modularen KI-Assistenten. Das Ziel umfasst später Textchat, Gedächtnis, Aufgaben und Notizen, kontrollierte Werkzeuge, technische Statusabfragen, Sprache und eine beobachtende Living-Mind-Oberfläche.
|
||||
|
||||
## Aktueller Stand
|
||||
|
||||
Dieses Repository enthält ausschließlich das sichere Projektgrundgerüst und die Architektur-Dokumentation der Phase 0. Es gibt noch:
|
||||
|
||||
- keinen KI-Chat,
|
||||
- keine Modellanbindung,
|
||||
- keinen Obsidian-Schreibzugriff,
|
||||
- keinen Serverzugriff,
|
||||
- keine Sprachpipeline,
|
||||
- keine Living-Mind-Implementierung.
|
||||
|
||||
Der nächste Entwicklungsschritt beginnt erst nach Pascals Prüfung auf einem eigenen Feature-Branch.
|
||||
|
||||
## Grundregeln
|
||||
|
||||
- Plattformunabhängiger modularer Monolith, voraussichtlich in Python.
|
||||
- Lokal-first; Cloudanbieter sind optionale und standardmäßig deaktivierte Adapter.
|
||||
- Keine Secrets im Code, in Git, in Prompts oder Logs.
|
||||
- Keine freie Shell für ein Sprachmodell.
|
||||
- Obsidian-Verknüpfungen bilden nur echte inhaltliche Beziehungen ab. Eine gehirnartige Graphansicht soll aus sinnvoller Struktur entstehen, nicht aus Dekorationslinks.
|
||||
- Kritische oder schreibende Aktionen benötigen klar definierte Berechtigungen und Freigaben.
|
||||
|
||||
## Orientierung
|
||||
|
||||
- [Projektstatus](docs/PROJECT_STATUS.md)
|
||||
- [Roadmap](docs/ROADMAP.md)
|
||||
- [Architektur](docs/ARCHITECTURE.md)
|
||||
- [Sicherheit](docs/SECURITY.md)
|
||||
- [Nächste Sitzung](docs/NEXT_SESSION.md)
|
||||
- [Vollständiger Handoff](docs/CHATGPT_HANDOFF.md)
|
||||
|
||||
## Historischer Verbindungstest
|
||||
|
||||
Der bisherige Inhalt von `READ.ME` wird hier unverändert erhalten:
|
||||
|
||||
> Hi. Test Commit f?r verkn?pfung
|
||||
@@ -0,0 +1,5 @@
|
||||
# Konfiguration
|
||||
|
||||
`javis.example.toml` dokumentiert ausschließlich nicht geheime Einstellungen. Für den lokalen Betrieb wird später eine ignorierte `javis.toml` erzeugt.
|
||||
|
||||
Secret-Werte gehören nicht in TOML, Code oder Git. Die bevorzugte Zielarchitektur verwendet einen Secret-Provider, beispielsweise Betriebssystem-Keyring, geschützte Umgebungsvariablen oder später Docker Secrets. Falls Pascal XML nutzt, liegt die echte Datei nur lokal, mit restriktiven Rechten und Git-Ausschluss. Das Modell erhält niemals ihren Inhalt.
|
||||
@@ -0,0 +1,19 @@
|
||||
[app]
|
||||
display_name = "Javis"
|
||||
language = "de"
|
||||
|
||||
[paths]
|
||||
runtime_dir = "runtime"
|
||||
|
||||
[providers]
|
||||
model = "disabled"
|
||||
cloud_fallback = false
|
||||
|
||||
[obsidian]
|
||||
enabled = false
|
||||
vault_path = ""
|
||||
write_areas = []
|
||||
|
||||
[security]
|
||||
secrets_provider = "none"
|
||||
require_approval_for_writes = true
|
||||
@@ -0,0 +1,27 @@
|
||||
# Architektur
|
||||
|
||||
## Ziel
|
||||
|
||||
Javis beginnt als modularer Monolith. Module besitzen klare Zuständigkeiten und kommunizieren über kleine, typisierte Schnittstellen. Erst reale Betriebsgründe rechtfertigen später separate Dienste.
|
||||
|
||||
## Vorgesehene Ebenen
|
||||
|
||||
1. Interface: CLI, später Sprache, Mobilzugriff und Living Mind.
|
||||
2. Core: Gesprächsablauf, Sitzungszustand und Orchestrierung.
|
||||
3. Providers: austauschbare lokale und optionale Cloud-Modellanbindungen.
|
||||
4. Memory: strukturierte Laufzeitdaten und regenerierbarer semantischer Index.
|
||||
5. Obsidian: zunächst lesender Adapter, später eng begrenzte Entwürfe.
|
||||
6. Tools und Status: feste Schemas, Allowlists, Timeouts und bereinigte Ausgaben.
|
||||
7. Security: Freigaben, Secret-Provider und Berechtigungsprüfung.
|
||||
8. Audit: nachvollziehbare Aktionen ohne geheime Inhalte.
|
||||
|
||||
## Plattformgrenzen
|
||||
|
||||
- Pfade werden später per Konfiguration und `pathlib` aufgelöst.
|
||||
- Betriebssystemspezifische Funktionen liegen hinter Adaptern.
|
||||
- Produktname, Datenpfade und Provider werden zentral konfiguriert.
|
||||
- Laufzeitdaten liegen außerhalb von Git.
|
||||
|
||||
## Noch nicht implementiert
|
||||
|
||||
Es existieren nur Paketgrenzen und Dokumentation. Es gibt keinen Chat, Provider, Speicher, Toolaufruf oder Netzwerkdienst.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
# Datenmodell – Entwurf
|
||||
|
||||
## Laufzeitdaten
|
||||
|
||||
Eine spätere strukturierte Datenbank kann mindestens enthalten:
|
||||
|
||||
- `sessions`: Beginn, Ende und aktiver Kontext
|
||||
- `messages`: Rolle, Inhalt, Zeit und Providerreferenz
|
||||
- `tasks`: Status, Projekt, Fälligkeit und Quelle
|
||||
- `approvals`: angefragte Aktion, Entscheidung und Zeitpunkt
|
||||
- `tool_calls`: Toolname, bereinigte Parameter, Ergebnisstatus und Dauer
|
||||
- `memories`: Aussage, Quelle, Gültigkeit und Bestätigung
|
||||
- `source_documents`: Pfad, Änderungszeit und Indexstatus
|
||||
|
||||
SQLite ist der bevorzugte erste Kandidat, aber noch nicht implementiert.
|
||||
|
||||
## Obsidian
|
||||
|
||||
Obsidian bleibt die menschlich lesbare Wissensschicht. Ein Link wird nur erzeugt, wenn die Zielnotiz für das Verständnis, die Herkunft, eine Entscheidung oder eine echte Projektbeziehung relevant ist. Graphästhetik allein ist kein Linkgrund.
|
||||
|
||||
## Semantischer Index
|
||||
|
||||
Der Index ist jederzeit aus Quellen regenerierbar. Er speichert Quellpfad und Änderungszeit, ist nie die einzige Wissenskopie und gehört nicht in Git.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Entscheidungen
|
||||
|
||||
| ID | Entscheidung | Status |
|
||||
|---|---|---|
|
||||
| ADR-0001 | Modularer Monolith statt früher Microservices | angenommen |
|
||||
| ADR-0002 | Secrets bleiben außerhalb von Modellkontext und Git | angenommen |
|
||||
| ADR-0003 | Obsidian-Links benötigen echte inhaltliche Beziehungen | angenommen |
|
||||
|
||||
Offen bleiben insbesondere die konkrete lokale Modelllaufzeit, das endgültige Runtime-Secret-System, der genaue Obsidian-Schreibbereich und der Produktname.
|
||||
|
||||
Ausführliche Begründungen stehen unter [`docs/adr`](adr/README.md).
|
||||
@@ -0,0 +1,39 @@
|
||||
# Environment Verification
|
||||
|
||||
Prüfzeitpunkt: 30.07.2026, Europe/Berlin.
|
||||
|
||||
## Projekt
|
||||
|
||||
- Erwarteter und bestätigter Pfad: `D:\Javis-Projekt`
|
||||
- Git-Toplevel: `D:/Javis-Projekt`
|
||||
- Branch: `main`
|
||||
- Ausgangsstand: `main` entsprach `origin/main` bei `49a1dd3`
|
||||
- Nachvollziehbare unversionierte Datei vor dem Grundgerüst: `CHATGPT_HANDOFF.md`
|
||||
- Bestehende versionierte Datei: `READ.ME`
|
||||
- Remote: `origin` zeigt per HTTPS auf das Gitea-Repository `Jarvis-Ai.git`
|
||||
- Der aktuelle Codex-Thread läuft in einem generierten Sitzungsordner. Dieser ist kein zweites Repository und nicht der Projektpfad.
|
||||
|
||||
Es wurden keine eingebetteten Zugangsdaten ausgegeben.
|
||||
|
||||
## Obsidian
|
||||
|
||||
- Aktiver und bestätigter Vault: `D:\Obsidian Vault`
|
||||
- `.obsidian` vorhanden
|
||||
- `Test.md` vorhanden
|
||||
- genau eine Markdown-Datei zum Prüfzeitpunkt
|
||||
- Pluginverzeichnis `obsidian-livesync` vorhanden
|
||||
- globale Obsidian-Konfiguration markiert ausschließlich `D:\Obsidian Vault` als geöffnet
|
||||
- alte Kopie `C:\Users\pasca\OneDrive\Dokumente\Obsidian Vault` am genannten Pfad nicht vorhanden
|
||||
|
||||
Der Vault und `.obsidian` wurden ausschließlich gelesen und nicht verändert.
|
||||
|
||||
## Lokale Toolchain
|
||||
|
||||
- Git: `2.55.0.windows.2`
|
||||
- Visual Studio Code: `1.131.0`
|
||||
- Python, `py`, Node.js, npm und Docker: im normalen Benutzer-`PATH` nicht verfügbar
|
||||
- Ein mit Codex gebündelter Python-Interpreter darf für die Strukturprüfung genutzt werden; er ersetzt keine bewusst installierte Projekt-Toolchain.
|
||||
|
||||
## Ergebnis
|
||||
|
||||
Die Abbruchbedingungen der Phase 0 trafen nicht zu. Das Grundgerüst durfte im bestätigten Repository vorbereitet werden.
|
||||
@@ -0,0 +1,38 @@
|
||||
# Mögliche spätere Linux-Migration
|
||||
|
||||
Ein Wechsel des Gaming-PCs von Windows 11 zu Linux ist nicht beschlossen und nicht Teil der aktuellen Entwicklung.
|
||||
|
||||
## Plattformunabhängig vorgesehen
|
||||
|
||||
- Python-Kern und standardisierte Projektkonfiguration
|
||||
- relative Pfade und `pathlib`
|
||||
- UTF-8 und definierte Zeilenenden
|
||||
- SQLite und dateibasierte Laufzeitdaten
|
||||
- austauschbare Modell-, Status- und Tooladapter
|
||||
|
||||
## Später betriebssystemspezifisch zu prüfen
|
||||
|
||||
- GPU-Treiber, CUDA und lokale Modelllaufzeit
|
||||
- Spiele, Anti-Cheat, VR und Windows-spezifische Programme
|
||||
- Audio-, Mikrofon- und Wake-Word-Geräte
|
||||
- Autostart und Dienstverwaltung
|
||||
- Dateirechte, Keyring und Hardwaremonitoring
|
||||
|
||||
## Vor einem Wechsel zu sichern
|
||||
|
||||
- vollständige Benutzerdateien und Projekt-Repositories
|
||||
- aktiver Obsidian-Vault einschließlich geprüftem LiveSync-Zustand
|
||||
- lokale Datenbanken und Laufzeitdaten
|
||||
- Browser- und Anwendungsprofile nach bewusster Auswahl
|
||||
- SSH-Schlüssel und andere Secrets verschlüsselt, getrennt und mit Restore-Test
|
||||
- Lizenzinformationen und Installationslisten
|
||||
|
||||
## Sicheres Vorgehen
|
||||
|
||||
1. vollständige Bestands- und Kompatibilitätsliste
|
||||
2. mindestens zwei unabhängige Backups
|
||||
3. stichprobenartiger Wiederherstellungstest
|
||||
4. bevorzugt Test auf separatem Datenträger oder Dual-Boot
|
||||
5. erst danach eine gesondert freigegebene Migration
|
||||
|
||||
Codex darf keine Partition, keinen Bootloader und kein Betriebssystem ohne konkrete Freigabe verändern.
|
||||
@@ -0,0 +1,24 @@
|
||||
# Nächste Sitzung
|
||||
|
||||
## Ziel
|
||||
|
||||
Pascal prüft zuerst das Grundgerüst. Danach kann Phase 1 auf `feat/core-chat` beginnen.
|
||||
|
||||
## Vor Änderungen erneut prüfen
|
||||
|
||||
1. `git status --short --branch`
|
||||
2. `git log -1 --oneline`
|
||||
3. `docs/PROJECT_STATUS.md`
|
||||
4. offene Entscheidungen in `docs/DECISIONS.md`
|
||||
|
||||
## Vorgeschlagener Umfang
|
||||
|
||||
- zwei bis drei geeignete lokale Python-Installationswege vergleichen
|
||||
- Installation nur nach Pascals Freigabe
|
||||
- echte Konfigurationsladefunktion mit Tests
|
||||
- Provider-Protokoll ohne Cloudaufruf
|
||||
- minimale CLI-Struktur ohne fest programmierte KI-Antworten
|
||||
|
||||
## Nicht beginnen
|
||||
|
||||
Noch keine Modellinstallation, kein Obsidian-Schreiben, kein SSH-/Serverzugriff, keine Sprache und kein Living-Mind-Frontend.
|
||||
@@ -0,0 +1,14 @@
|
||||
# Berechtigungen
|
||||
|
||||
| Bereich | Anfangszustand | Spätere Erweiterung |
|
||||
|---|---|---|
|
||||
| Projektdateien | Codex darf im freigegebenen Auftrag schreiben | weiterhin Git- und Testpflicht |
|
||||
| Obsidian | gesamter Vault lesend | neue Dateien nur in einzeln freigegebenen Ordnern |
|
||||
| Bestehende Notizen | keine Änderung | nur konkrete ausdrückliche Freigabe |
|
||||
| Lokaler PC | definierte lesende Statusabfragen | schreibende Tools einzeln freigeben |
|
||||
| Ubuntu-Laptop | kein Zugriff | eigener Schlüssel, Benutzer und begrenzte Verzeichnisse |
|
||||
| Rootserver | kein Zugriff | eigener rein lesender Adapter oder Benutzer |
|
||||
| Secrets | Modell sieht keine Werte | Tool-Schicht nutzt einzelne Werte intern |
|
||||
| Externe Nachrichten | verboten | nur mit konkreter Freigabe und Empfängerprüfung |
|
||||
|
||||
Jede Tooldefinition benötigt Eingabeschema, Ausgabegrenze, Timeout, Fehlerverhalten, Berechtigungsstufe und Auditregel.
|
||||
@@ -0,0 +1,26 @@
|
||||
# Projektstatus
|
||||
|
||||
Stand: Grundgerüstphase am 30.07.2026.
|
||||
|
||||
## Erreicht
|
||||
|
||||
- Projekt- und Vault-Pfade lesend bestätigt
|
||||
- Sicherheits- und Architekturgrenzen dokumentiert
|
||||
- plattformunabhängige Paketstruktur vorbereitet
|
||||
- Obsidian-Linkregel als verbindliche Entscheidung dokumentiert
|
||||
- Living-Mind-Bereich als inaktiver Vertrag vorbereitet
|
||||
- projektinterne Codex-Agentensyntax anhand der aktuellen offiziellen Codex-Dokumentation geprüft
|
||||
|
||||
## Nicht implementiert
|
||||
|
||||
KI, Chat, Provider, Gedächtnis, Obsidian-Adapter, Tools, Serverzugriff, Sprache, Mobile Client und Living-Mind-Frontend.
|
||||
|
||||
## Git
|
||||
|
||||
- Branch: `main`
|
||||
- Ausgangscommit: `49a1dd3`
|
||||
- Der Commit, der dieses Dokument enthält, ist der Grundgerüstcommit; die konkrete ID ist mit `git log -1` zu ermitteln.
|
||||
|
||||
## Bekannte Einschränkung
|
||||
|
||||
Im normalen Windows-`PATH` ist noch keine nutzbare Python-Installation verfügbar. Es wurde nichts installiert.
|
||||
@@ -0,0 +1,15 @@
|
||||
# Roadmap
|
||||
|
||||
Jede Phase beginnt erst nach Abnahme der vorherigen Phase.
|
||||
|
||||
1. **Grundgerüst:** Pfade, Regeln, Architektur, Sicherheit und Strukturtests.
|
||||
2. **Core Chat:** echte lokale Texteingabe, Provider-Abstraktion, Sitzung und klare Fehler.
|
||||
3. **Memory:** SQLite-Entscheidung, Auditmodell und nachvollziehbare Speicherung.
|
||||
4. **Obsidian:** lesender Index, Quellenangaben und später freigegebene Entwurfsordner.
|
||||
5. **Status Tools:** zuerst lokaler PC und Git, später eingeschränkte Remoteadapter.
|
||||
6. **Lokales Modell:** Benchmarks auf RTX 3060 und ASUS-Laptop; Installation nur nach Freigabe.
|
||||
7. **Sprache:** Push-to-Talk vor Wake Word.
|
||||
8. **Living Mind:** echte Datenverträge, Herkunfts-/Lizenzprüfung und danach Implementierung.
|
||||
9. **Mobil:** authentifizierter, verschlüsselter Client ohne öffentliche ungeschützte Oberfläche.
|
||||
|
||||
Der mögliche Windows-zu-Linux-Wechsel ist kein Roadmap-Schritt, sondern gegebenenfalls ein eigenes späteres Migrationsprojekt.
|
||||
@@ -0,0 +1,32 @@
|
||||
# Sicherheit
|
||||
|
||||
## Grundsätze
|
||||
|
||||
- geringste Rechte und lesende Funktionen zuerst
|
||||
- keine freie Shell für das Modell
|
||||
- feste Tool-Schemas, Befehls-Allowlist, Timeouts und Ausgabelimits
|
||||
- menschliche Freigabe vor schreibenden oder destruktiven Aktionen
|
||||
- keine Root- oder normalen Administratorkonten für Javis
|
||||
- keine öffentliche Schnittstelle ohne Authentifizierung und TLS
|
||||
- Backups müssen wiederherstellbar getestet werden
|
||||
|
||||
## Secrets
|
||||
|
||||
Secrets dürfen nie in Code, Git, Prompts, Chatverläufe oder Logs gelangen. Das Modell erfährt nur den Namen, die Verfügbarkeit und ein bereinigtes Aktionsergebnis.
|
||||
|
||||
Bevorzugt wird eine Secret-Provider-Abstraktion. Eine optionale lokale XML-Datei wie `key-pw.xml` oder `secrets.local.xml` ist nur als restriktiv geschützte, Git-ignorierte Klartextdatei zulässig. Ins Repository darf höchstens eine leere Beispielstruktur.
|
||||
|
||||
Eine vorhandene SSH-Schlüsseldatei aus früherer LS25-/Gitea-Arbeit bleibt lokal. Pfad, privater Inhalt und Gerätekennung werden nicht dokumentiert.
|
||||
|
||||
## Obsidian
|
||||
|
||||
- gesamter Vault zunächst nur lesend
|
||||
- `.obsidian` niemals verändern
|
||||
- bestehende Notizen nicht automatisch bearbeiten oder löschen
|
||||
- spätere Schreibbereiche einzeln freigeben
|
||||
- Wikilinks nur bei echter semantischer Beziehung
|
||||
- keine künstlichen Links zur bloßen Verdichtung der Graphansicht
|
||||
|
||||
## Meldung eines Problems
|
||||
|
||||
Bei möglichem Secret-Leak, unerwartetem Schreibzugriff oder falschem Zielpfad sofort stoppen, betroffene Aktion benennen und keine automatische Bereinigung durchführen.
|
||||
@@ -0,0 +1,26 @@
|
||||
# Bedrohungsmodell
|
||||
|
||||
## Schutzwerte
|
||||
|
||||
- persönliche Notizen und Erinnerungen
|
||||
- API-Keys, Tokens, Passwörter und SSH-Schlüssel
|
||||
- Projekt- und Git-Historie
|
||||
- lokale und entfernte Systeme
|
||||
- Auditdaten und Freigabeentscheidungen
|
||||
|
||||
## Wesentliche Bedrohungen
|
||||
|
||||
| Bedrohung | Beispiel | Gegenmaßnahme |
|
||||
|---|---|---|
|
||||
| Prompt Injection | Notiz oder Webseite fordert einen Toolaufruf | Inhalte sind Daten, keine Berechtigung; Tool-Allowlist und Freigabe |
|
||||
| Secret-Abfluss | Token erscheint in Prompt oder Log | Secret-Provider, Maskierung, keine Modellrückgabe |
|
||||
| Zu breite Rechte | Modell erhält Shell oder Rootzugriff | eng definierte Adapter und eigene eingeschränkte Konten |
|
||||
| Falscher Pfad | OneDrive-Vault statt aktivem Vault | kanonische Pfadprüfung und Abbruch |
|
||||
| Datenverlust | Notiz, Partition oder Datenbank wird überschrieben | Backups, Dry-Run, konkrete Freigabe, Restore-Test |
|
||||
| Falsche Erinnerung | semantischer Treffer wird als Fakt gespeichert | Quellenpfad, Zeitstempel, Korrektur und menschliche Bestätigung |
|
||||
| Öffentliche Exposition | ungeschützte mobile Oberfläche | Authentifizierung, TLS und Sicherheitsreview |
|
||||
| Lieferkette | ungeprüftes Plugin oder Referenzprojekt | Herkunft, Version und Lizenz prüfen; nichts blind ausführen |
|
||||
|
||||
## Vertrauensgrenzen
|
||||
|
||||
Modell, eingelesene Inhalte und externe Dienste sind nicht vertrauenswürdig. Tool-Schicht, Freigabesystem und Secret-Provider erzwingen die Grenze unabhängig vom Modelltext.
|
||||
@@ -0,0 +1,5 @@
|
||||
# ADR-0001: Modularer Monolith
|
||||
|
||||
Status: angenommen.
|
||||
|
||||
Javis beginnt als ein deploybarer Kern mit klar getrennten internen Modulen. Das reduziert Betriebsaufwand, Ressourcenverbrauch und verteilte Fehlerbilder auf der vorhandenen Hardware. Einzelne Dienste werden erst ausgelagert, wenn Messwerte oder Sicherheitsgrenzen dies rechtfertigen.
|
||||
@@ -0,0 +1,5 @@
|
||||
# ADR-0002: Secret-Isolation
|
||||
|
||||
Status: angenommen.
|
||||
|
||||
Secret-Werte werden ausschließlich von einer begrenzten Runtime-Schicht geladen und intern für genehmigte Aktionen eingesetzt. Weder Modellkontext noch Audit-Log erhalten die Werte. Echte Secret-Dateien sind lokal, restriktiv geschützt und Git-ignoriert; Beispielkonfigurationen enthalten nur leere Platzhalter.
|
||||
@@ -0,0 +1,7 @@
|
||||
# ADR-0003: Sinnvolle Obsidian-Verknüpfungen
|
||||
|
||||
Status: angenommen.
|
||||
|
||||
Die Obsidian-Graphansicht soll langfristig eine organische, gehirnartige Wissensstruktur zeigen. Javis erzeugt einen Wikilink jedoch nur, wenn eine nachvollziehbare fachliche Beziehung besteht, etwa gemeinsame Projekte, Herkunft, Abhängigkeit oder Entscheidung.
|
||||
|
||||
Links, die ausschließlich die Optik verdichten, sind verboten. Qualität und Erklärbarkeit der Wissensbeziehungen haben Vorrang vor der Anzahl sichtbarer Kanten.
|
||||
@@ -0,0 +1,5 @@
|
||||
# Architecture Decision Records
|
||||
|
||||
- [ADR-0001: Modularer Monolith](0001-modular-monolith.md)
|
||||
- [ADR-0002: Secret-Isolation](0002-secret-isolation.md)
|
||||
- [ADR-0003: Sinnvolle Obsidian-Verknüpfungen](0003-meaningful-obsidian-links.md)
|
||||
@@ -0,0 +1,14 @@
|
||||
# Datenvertrag – unverbindlicher Entwurf
|
||||
|
||||
Eine spätere Oberfläche könnte bereinigte, authentifizierte Beobachtungsereignisse erhalten:
|
||||
|
||||
- `core`: Betriebszustand des Kerns
|
||||
- `working_memory`: Größe und Aktivität, nicht vertraulicher Inhalt
|
||||
- `memory`: Index- und Abrufstatus
|
||||
- `agents`: freigegebene Rollen und Aktivitätsstatus
|
||||
- `knowledge`: echte, quellengestützte Beziehungen
|
||||
- `tools`: Toolname, Status und Freigabezustand
|
||||
- `events`: bereinigte zeitliche Ereignisse
|
||||
- `system_status`: freigegebene technische Messwerte
|
||||
|
||||
Noch sind weder Schema, Transport noch Authentifizierung festgelegt. Secret-Werte, private Notizinhalte und rohe Prompts dürfen nicht Teil des Vertrages werden.
|
||||
@@ -0,0 +1,7 @@
|
||||
# Living Mind
|
||||
|
||||
Dieser Bereich reserviert ausschließlich die spätere beobachtende Oberfläche. Er enthält aktuell kein Frontend, kein Backend, keine Animation und keine Datenquelle.
|
||||
|
||||
Vor einer Implementierung müssen die offizielle Trillion-Quelle, konkrete Herkunft und Lizenz geprüft werden. Ohne klare Lizenz wird kein fremder Quellcode übernommen.
|
||||
|
||||
Die spätere „Gehirnoptik“ muss echte Zustände und nachvollziehbare Beziehungen darstellen. Weder im Interface noch in Obsidian werden Fantasiedaten oder künstliche Verbindungen nur für die Optik erzeugt.
|
||||
@@ -0,0 +1,9 @@
|
||||
# Status
|
||||
|
||||
- Backend: nicht implementiert
|
||||
- Frontend: nicht implementiert
|
||||
- Live-Ereignisse: nicht implementiert
|
||||
- Authentifizierung: nicht implementiert
|
||||
- echte Datenquellen: nicht angeschlossen
|
||||
- Trillion-Quelle und Lizenz: nicht geprüft
|
||||
- Demo- und Fantasiedaten: verboten
|
||||
@@ -0,0 +1,3 @@
|
||||
# Reference placeholder
|
||||
|
||||
Hier darf später ausschließlich eine eindeutig identifizierte, lizenzgeprüfte Referenz oder eine Dokumentation ihrer Herkunft liegen. In Phase 0 wurde nichts heruntergeladen oder kopiert.
|
||||
@@ -0,0 +1,17 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=68"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "javis-ai"
|
||||
version = "0.0.0"
|
||||
description = "Safe, local-first personal assistant project scaffold"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.11"
|
||||
dependencies = []
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
testpaths = ["tests"]
|
||||
@@ -0,0 +1,3 @@
|
||||
# Runtime
|
||||
|
||||
Dieses Verzeichnis enthält im Repository nur diese Erklärung. Lokale Datenbanken, Sitzungen, Indizes, Modelle, Logs und temporäre Dateien werden ignoriert und niemals als produktive Daten committet.
|
||||
@@ -0,0 +1,63 @@
|
||||
"""Verify the dependency-free phase-0 repository structure."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
REQUIRED = (
|
||||
"README.md",
|
||||
"AGENTS.md",
|
||||
"CHANGELOG.md",
|
||||
"PLANS.md",
|
||||
"pyproject.toml",
|
||||
".gitignore",
|
||||
".gitattributes",
|
||||
"config/javis.example.toml",
|
||||
"docs/ARCHITECTURE.md",
|
||||
"docs/ENVIRONMENT_VERIFICATION.md",
|
||||
"docs/SECURITY.md",
|
||||
"docs/THREAT_MODEL.md",
|
||||
"docs/PROJECT_STATUS.md",
|
||||
"docs/NEXT_SESSION.md",
|
||||
"docs/CHATGPT_HANDOFF.md",
|
||||
"src/javis/__init__.py",
|
||||
"interface/living-mind/STATUS.md",
|
||||
)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
missing = [relative for relative in REQUIRED if not (ROOT / relative).is_file()]
|
||||
if missing:
|
||||
print("Missing required files:")
|
||||
for relative in missing:
|
||||
print(f"- {relative}")
|
||||
return 1
|
||||
|
||||
with (ROOT / "pyproject.toml").open("rb") as handle:
|
||||
project = tomllib.load(handle)["project"]
|
||||
if project["name"] != "javis-ai":
|
||||
print("Unexpected project name in pyproject.toml")
|
||||
return 1
|
||||
|
||||
forbidden = [
|
||||
path
|
||||
for path in ROOT.rglob("*")
|
||||
if path.is_file()
|
||||
and path.name.lower() in {"key-pw.xml", "secrets.local.xml", ".env"}
|
||||
]
|
||||
if forbidden:
|
||||
print("Forbidden local secret files are present:")
|
||||
for path in forbidden:
|
||||
print(f"- {path.relative_to(ROOT)}")
|
||||
return 1
|
||||
|
||||
print(f"Structure verified: {len(REQUIRED)} required files present.")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,6 @@
|
||||
"""Javis package scaffold.
|
||||
|
||||
No assistant runtime is implemented in phase 0.
|
||||
"""
|
||||
|
||||
__version__ = "0.0.0"
|
||||
@@ -0,0 +1 @@
|
||||
"""Audit boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Configuration boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Conversation orchestration boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""User-interface boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Memory boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Obsidian adapter boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Model-provider boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Security and approval boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Technical status-adapter boundary for Javis."""
|
||||
@@ -0,0 +1 @@
|
||||
"""Controlled tool-registry boundary for Javis."""
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
# Test fixtures
|
||||
|
||||
Only synthetic, non-secret fixtures may be stored here. Personal Obsidian notes, tokens, logs and production exports are forbidden.
|
||||
@@ -0,0 +1,3 @@
|
||||
# Integration tests
|
||||
|
||||
Integration tests will be added with the first real provider, persistence, or adapter. Phase 0 performs no network or service integration.
|
||||
@@ -0,0 +1,14 @@
|
||||
"""Dependency-free smoke tests for the phase-0 package."""
|
||||
|
||||
import unittest
|
||||
|
||||
import javis
|
||||
|
||||
|
||||
class PackageMetadataTests(unittest.TestCase):
|
||||
def test_scaffold_version_is_explicit(self) -> None:
|
||||
self.assertEqual(javis.__version__, "0.0.0")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user