robisie 0.0.0-stage → 0.1.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.
Files changed (90) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +91 -2
  3. package/dist/active-recovery.d.ts +58 -0
  4. package/dist/active-recovery.js +143 -0
  5. package/dist/agents.d.ts +34 -0
  6. package/dist/agents.js +246 -0
  7. package/dist/attempt-identity.d.ts +21 -0
  8. package/dist/attempt-identity.js +39 -0
  9. package/dist/ci-failure-result.d.ts +23 -0
  10. package/dist/ci-failure-result.js +90 -0
  11. package/dist/claude-headless.d.ts +7 -0
  12. package/dist/claude-headless.js +28 -0
  13. package/dist/cli.d.ts +17 -0
  14. package/dist/cli.js +177 -0
  15. package/dist/commands.d.ts +18 -0
  16. package/dist/commands.js +423 -0
  17. package/dist/constants.d.ts +32 -0
  18. package/dist/constants.js +34 -0
  19. package/dist/context.d.ts +24 -0
  20. package/dist/context.js +81 -0
  21. package/dist/dependency-readiness.d.ts +13 -0
  22. package/dist/dependency-readiness.js +80 -0
  23. package/dist/dispatch-scope.d.ts +18 -0
  24. package/dist/dispatch-scope.js +46 -0
  25. package/dist/done-evidence.d.ts +31 -0
  26. package/dist/done-evidence.js +216 -0
  27. package/dist/engine-config.d.ts +65 -0
  28. package/dist/engine-config.js +139 -0
  29. package/dist/fsops.d.ts +87 -0
  30. package/dist/fsops.js +531 -0
  31. package/dist/helpers.d.ts +15 -0
  32. package/dist/helpers.js +312 -0
  33. package/dist/intent-rules/admission.d.ts +10 -0
  34. package/dist/intent-rules/admission.js +35 -0
  35. package/dist/intent-rules/done-when-roles.d.ts +21 -0
  36. package/dist/intent-rules/done-when-roles.js +101 -0
  37. package/dist/intent-rules/hooks.d.ts +29 -0
  38. package/dist/intent-rules/hooks.js +23 -0
  39. package/dist/k3-codex-role.d.ts +20 -0
  40. package/dist/k3-codex-role.js +68 -0
  41. package/dist/manifest.d.ts +41 -0
  42. package/dist/manifest.js +201 -0
  43. package/dist/mcp.d.ts +18 -0
  44. package/dist/mcp.js +177 -0
  45. package/dist/opencode-result.d.ts +19 -0
  46. package/dist/opencode-result.js +136 -0
  47. package/dist/opencode-review-guard.d.ts +1 -0
  48. package/dist/opencode-review-guard.js +19 -0
  49. package/dist/opencode-session-export.d.ts +5 -0
  50. package/dist/opencode-session-export.js +28 -0
  51. package/dist/outcome-moves.d.ts +15 -0
  52. package/dist/outcome-moves.js +39 -0
  53. package/dist/planer-client.d.ts +214 -0
  54. package/dist/planer-client.js +351 -0
  55. package/dist/restart-recovery.d.ts +47 -0
  56. package/dist/restart-recovery.js +70 -0
  57. package/dist/review-source-packet.d.ts +17 -0
  58. package/dist/review-source-packet.js +44 -0
  59. package/dist/role-registry.d.ts +19 -0
  60. package/dist/role-registry.js +83 -0
  61. package/dist/role-results.d.ts +15 -0
  62. package/dist/role-results.js +42 -0
  63. package/dist/roles.d.ts +30 -0
  64. package/dist/roles.js +123 -0
  65. package/dist/seed-validation.d.ts +28 -0
  66. package/dist/seed-validation.js +294 -0
  67. package/dist/selection-result.d.ts +44 -0
  68. package/dist/selection-result.js +144 -0
  69. package/dist/sparse-policy.d.ts +8 -0
  70. package/dist/sparse-policy.js +49 -0
  71. package/dist/tester-identity.d.ts +11 -0
  72. package/dist/tester-identity.js +53 -0
  73. package/dist/worker-env.d.ts +5 -0
  74. package/dist/worker-env.js +34 -0
  75. package/docs/ENGINE-API.md +78 -0
  76. package/docs/ENGINE-CONFIG.md +115 -0
  77. package/docs/README.en.md +183 -0
  78. package/docs/README.md +185 -0
  79. package/docs/RELEASE-0.1.0.md +102 -0
  80. package/docs/RELEASE-0.1.1.md +110 -0
  81. package/helpers/ceo-client-launcher-mcp.mjs +607 -0
  82. package/helpers/client-launch-context-mcp.mjs +538 -0
  83. package/helpers/client-spawn-session.sh +181 -0
  84. package/helpers/client-spawn.sh +825 -0
  85. package/helpers/lib/client-review-receipt.mjs +705 -0
  86. package/helpers/lib/client-spawn-failure.mjs +129 -0
  87. package/package.json +35 -4
  88. package/roles/ceo-client.md +193 -0
  89. package/roles/manager-builder-client.md +120 -0
  90. package/roles/quality-officer-client.md +205 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,87 @@
1
+ # Historia zmian klienta / Client changelog
2
+
3
+ ## 0.1.1 (2026-10-30)
4
+
5
+ Wydanie utrzymaniowe: bezpieczniejsza instalacja, odzyskiwanie i diagnostyka oraz biblioteki klienta. Poniższe 45 kart ma odbiór **TAK lokalnie**; sprawdzenie wersji z rejestru npm pozostaje osobną bramką. / Maintenance release: safer installation, recovery and diagnostics, plus client libraries. The following 45 cards have **local acceptance**; verification of the npm registry release remains a separate gate.
6
+
7
+ ### E3
8
+
9
+ - `10393507` — init i doctor uwzględniają wersję kontraktu każdej odpowiedzi.
10
+ - `13bafb12` — odbiorca klienta ustala dokładny kandydat do sprawdzenia.
11
+ - `18235645` — paczka wybiera rozłączne zakresy równoległych kart.
12
+ - `2e9242da` — klient rozróżnia awarię CI i błąd kodu z dostarczonych wyników.
13
+ - `4316e68e` — recenzent klienta czyta raport związany z kartą i kandydatem.
14
+ - `5084ba5e` — uninstall zachowuje rolę, gdy brakuje jej oryginału w kopii.
15
+ - `59255cbe` — doctor wykrywa brak instrukcji uruchomienia zainstalowanych ról.
16
+ - `695e6eed` — klient sprawdza komplet lokalnego pakietu bez skryptu hosta.
17
+ - `737bbf62` — reguły intencji klienta używają ról jego instancji.
18
+ - `78225362` — uninstall zachowuje manifest do zakończenia sprzątania.
19
+ - `79f7e41f` — doctor sprawdza kontekst projektu używany przez pomocnik klienta.
20
+ - `80931e36` — init zachowuje działający profil logowania Bash.
21
+ - `8d297c6f` — niepełny ostatni werdykt nie odziedzicza wcześniejszego PASS.
22
+ - `945c44b9` — init sprawdza odczyt wszystkich docelowych plików przed pierwszym zapisem.
23
+ - `9d10bca2` — paczka odtwarza aktywne zadania z zachowanej tożsamości.
24
+ - `a6e291b6` — instalacja odmawia względnych katalogów konfiguracji.
25
+ - `af3a5bc3` — init odrzuca znane konflikty konfiguracji przed zapisaniem instalacji.
26
+ - `b9402172` — klient rozpoznaje rzeczywiście odebrane zależności karty.
27
+ - `bb29afd9` — klient API tworzy pierwszy tor i szkic karty.
28
+ - `da4ddc8e` — konsument TypeScript korzysta z typów zainstalowanej paczki.
29
+ - `dcf3218b` — doctor potwierdza pełny start pomocnika przed uznaniem go za sprawnego.
30
+ - `dd86b397` — paczka wiąże dowód startu z właściwą próbą zadania.
31
+ - `e65b667c` — uszkodzona ewidencja instalacji odmawia przed zmianą plików.
32
+ - `fb07c02f` — klient zachowuje decyzję odzyskania pracy po restarcie.
33
+ - `ff361096` — odczyt karty z API paczki zachowuje indeks jej pełnych danych.
34
+ - `ff998946` — klient odczytuje pełną odpowiedź selektora bez importu hosta.
35
+
36
+ ### E4
37
+
38
+ - `b231a265` — obcy agent uruchamia przykład konfiguracji silnika z paczki.
39
+ - `c781f9f0` — agent korzysta z API paczki bez zgadywania odczytu i ponowienia.
40
+ - `deb1e7d2` — doctor odróżnia niedostępny plik instalacji od braku klucza.
41
+ - `805aad70` — Operator B podłącza paczkę bez klucza w argumentach i bez kasowania cudzego MCP.
42
+
43
+ ### E5
44
+
45
+ - `0b0940cc` — powrót klienta przechodzi przez dwa rzeczywiste archiwa paczki.
46
+ - `5e579f94` — ponowne pakowanie usuwa wycofane artefakty klienta.
47
+ - `6964272e` — notatka wydania odpowiada faktycznej zawartości klienta.
48
+
49
+ ### E6
50
+
51
+ - `1bd3a86d` — niepełny zagnieżdżony blok nie usuwa cudzych instrukcji.
52
+ - `31a377ef` — init przywraca prywatność własnego katalogu instalacji.
53
+ - `3b250acb` — kopie konfiguracji klienta pozostają w prywatnym katalogu.
54
+ - `58a45de0` — eksport sesji klienta nie interpretuje identyfikatora jako polecenia.
55
+ - `5b8dd7f5` — ponowny init przywraca ochronę prywatnej konfiguracji bez zmiany jej treści.
56
+ - `6fddbaec` — init nie przekazuje poświadczenia pod adres z przekierowania.
57
+ - `8b9882ba` — błąd połączenia klienta nie kopiuje sekretu do diagnostyki.
58
+ - `ac688abb` — role planowania i recenzji OpenCode nie dostają powłoki ani edycji.
59
+ - `ad251014` — nieudany proces Codex nie przenosi stderr ani cause do wyjątku klienta.
60
+ - `af5c973c` — odmowa pomocnika nie przenosi jego sekretów do doctor.
61
+ - `ccf5a385` — parser konfiguracji paczki nie powiela obcej wartości w błędzie.
62
+ - `e5413393` — instalator nie zamienia cudzych bajtów konfiguracji na znaki zastępcze.
63
+
64
+ Ograniczenia odbioru: `805aad70` — krok 5 z rolami i pomocnikami w prawdziwej sesji Claude Code pozostaje niesprawdzony; `80931e36` — profil Bash sprawdzono z symulacją macOS na Linuksie, rzeczywisty przebieg na Macu pozostaje otwarty. `9d10bca2` i `13bafb12` potwierdzają konsumenta paczki; integracja z usługą klienta wymaga osobnego odbioru. / Acceptance limits: the real Claude Code session for step 5 of `805aad70` and the real Mac Bash run for `80931e36` remain unverified. `9d10bca2` and `13bafb12` establish package consumer behavior; customer service integration needs separate acceptance.
65
+
66
+ Pełny opis, wymagania i granice: [notatka PL/EN 0.1.1](docs/RELEASE-0.1.1.md). / Requirements, behavior and limits: [0.1.1 PL/EN release note](docs/RELEASE-0.1.1.md).
67
+
68
+ ## 0.1.0
69
+
70
+ Kandydat pierwszego wydania, bez daty publikacji. / First release candidate, no publication date.
71
+
72
+ - `init`, `doctor`, `uninstall` dla Claude Code, Codex CLI i OpenCode; role CEO, Builder i Quality Officer.
73
+ - Pomocniki `client-launch-context` i `ceo-client-launcher` dostarczane w paczce, polecenia przypięte do wersji klienta.
74
+ - Po zgodzie na kartę `ready`: CEO → `ceo-client-launcher` → `spawn_builder`; ręczny start wyłącznie z wyboru operatora. / After approval of a `ready` card, the CEO starts the Builder through the launcher; manual startup is the operator's explicit choice.
75
+ - Biblioteki ESM: `engine-config`, `role-results`, `planer-client`, rejestr ról, walidacja zasiewu/reguły intencji, wybór/zakres, ruchy/odzyskiwanie, tożsamość prób/testera, środowisko Workera, źródła recenzji, wyniki CI i adaptery Claude/Codex/OpenCode z eksportem sesji. Konfiguracja instancji w `robisie.config.json`; wykaz i przykład w [notatce PL/EN](docs/RELEASE-0.1.0.md), SDK w [API silnika](docs/ENGINE-API.md). / ESM configuration, role outcomes, board SDK and engine support libraries are shipped; imports and helpers do not prove a running engine or an autonomous loop.
76
+ - Instalator nie startuje tła/Buildera; doctor nie dowodzi dostępności narzędzi u dostawcy. Claude Code wymaga niezależnej recenzji, verified receipt i odbioru; OpenCode zostaje w `in_review`, Codex wymaga integracji Agent. / Installation and doctor do not establish provider capabilities or acceptance: independent review, verified receipt and operator acceptance remain required; OpenCode stops at `in_review`, Codex needs Agent integration.
77
+ - Wymagania 0.1: macOS/Linux, Node >=20; wsparcie Windows/WSL niezweryfikowane. / Requirements: macOS/Linux, Node >=20; Windows/WSL support is unverified.
78
+ - Kontrakt serwera 1.x (obecnie 1.0.0); odmowa innego major przed zapisem konfiguracji.
79
+ - Ochrona obcych ustawień i instrukcji, pierwsze kopie zapasowe oraz przywracanie własnych plików po uninstall; zmienione role pozostają z ostrzeżeniem.
80
+ - Zapisywanie dostawcy dla każdej roli i diagnoza ograniczeń; bieżąca pętla wymaga jednego dostawcy dla wszystkich trzech ról.
81
+ - Notatka PL/EN i lokalna próba reinstalacji 0.1.0 → syntetyczne 0.1.1 → 0.1.0; to nie rollback opublikowanych wydań.
82
+
83
+ Pochodzenie klienta: [PR #209](https://github.com/chuppa12/robisie-app/pull/209),
84
+ [merge a41b04ee7961f16e74dbf3a88b5a8199c5339f41](https://github.com/chuppa12/robisie-app/commit/a41b04ee7961f16e74dbf3a88b5a8199c5339f41),
85
+ [ochrona kopii 5ec7cde32a926c593f46e5fb2c86c79fe31bf332](https://github.com/chuppa12/robisie-app/commit/5ec7cde32a926c593f46e5fb2c86c79fe31bf332),
86
+ [bezpieczny zapis b15d73ff2f9f1f1b26de7041ec0623d69d37d347](https://github.com/chuppa12/robisie-app/commit/b15d73ff2f9f1f1b26de7041ec0623d69d37d347),
87
+ [pomocniki i uninstall 36e7e39ed22339a29f851f08c9307d452554981f](https://github.com/chuppa12/robisie-app/commit/36e7e39ed22339a29f851f08c9307d452554981f).
package/README.md CHANGED
@@ -1,3 +1,92 @@
1
- # Temporary Holding Version
1
+ # robisie 0.1.0
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Przewodniki: [PL — konto → odbiór → odinstalowanie](https://unpkg.com/robisie/docs/README.md) · [EN — account → acceptance → uninstall](https://unpkg.com/robisie/docs/README.en.md). Przygotuj Node.js 20+, npm, program jednego dostawcy AI oraz pusty katalog; strona i package.json nie są potrzebne. Zacznij od konta i projektu w panelu. Projekt w panelu i katalog na dysku to osobne rzeczy; CEO wymaga dokładnie jednego projektu z discovery.
4
+
5
+ ## Przed init — konto i pierwszy projekt
6
+
7
+ Załóż konto i zaloguj się w https://robisie.app. Ekran „Zakładamy Twój projekt…” oznacza przygotowywanie projektu; poczekaj na „Twój projekt jest gotowy”. Ten ekran nie dowodzi dokładnie jednego projektu. Nie ma gwarantowanego czasu oczekiwania. Jeśli widzisz „To się przeciąga…”, wybierz „Sprawdź tablicę”: https://robisie.app/dashboard/plugins/planer.
8
+
9
+ Na liście projektów, tylko gdy nie masz przygotowanego projektu, wpisz nazwę w „Nazwa projektu (np. robisie)” i wybierz „Załóż projekt”. Nie twórz drugiego projektu, jeśli pierwszy już jest przygotowany.
10
+
11
+ Jeśli trasa przekierowała na /dashboard bez Planera, znajdź „Zacznij od pierwszego projektu”, wpisz „Nazwa projektu” i wybierz „Stwórz projekt”. Również tutaj twórz projekt tylko wtedy, gdy nie masz jeszcze przygotowanego projektu. Potem przejdź do Connect.
12
+
13
+ ## Init — połącz agenta
14
+
15
+ Człowiek generuje klucz worker z etykietą w https://robisie.app/dashboard/connect i podaje go poza rozmową do ukrytego pytania init, nigdy do czatu, argumentu polecenia ani historii powłoki. W zsh/bash usuń stary ENV, a po udanym init wczytaj zapisany klucz do bieżącej powłoki bez wyświetlania go — init nie ustawia jej środowiska. Dla nowej instalacji z Claude:
16
+
17
+ ```sh
18
+ npm i robisie
19
+ unset ROBISIE_KEY
20
+ npx robisie init --agent claude
21
+ [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/robisie/key" ] && export ROBISIE_KEY="$(cat "${XDG_CONFIG_HOME:-$HOME/.config}/robisie/key")"
22
+ npx robisie doctor
23
+ ```
24
+
25
+ Dla Codex lub OpenCode zastąp `claude` przez `codex` lub `opencode`. Sam `--agent` nie usuwa wcześniejszej mapy ról: przy wcześniejszej konfiguracji użyj pełnej mapy z sekcji init w przewodniku. Nowy terminal wymaga obsługi profilu zsh/bash bez `--no-shell`; w innych sesjach wczytaj środowisko zgodnie z przewodnikiem. Agenta uruchom z katalogu instalacji; szczegóły startu ról, pomocników i diagnozy są w przewodnikach PL/EN powyżej.
26
+
27
+ ## Po init — sprawdź gotowość CEO
28
+
29
+ Po Connect, init i wczytaniu klucza według bloku powyżej uruchom `npx robisie doctor`. Discovery to odczyt aktywnych projektów przez `list_projects`. Nie wymaga wpisywania UUID. Sam `init` z exit 0 ani „połączono” nie wystarczają do potwierdzenia gotowości CEO.
30
+
31
+ - **0 projektów, exit 1:** `CEO wymaga dokładnie 1 projektu (projektów: 0).` Następny krok: `Sprawdź gotowość projektu na https://robisie.app/dashboard/plugins/planer.` Wróć do przygotowania projektu opisanego przed init.
32
+ - **Więcej niż 1 projekt, exit 1** (np. `CEO wymaga dokładnie 1 projektu (projektów: 2).`): `Uporządkuj widoczność projektów w discovery do 1; sam wybór projektu w panelu nie zmienia discovery.` Człowiek sam decyduje, który projekt zachować aktywny; przy pozostałych na liście wybiera „Archiwizuj”. „Archiwum” → „Przywróć” cofa archiwizację. Nie usuwaj projektów. Kliknięcie projektu nie zawęża discovery.
33
+ - **1 projekt:** oczekuj dokładnie `✓ Połączenie działa: klucz otwiera tablicę (projektów: 1).` oraz końcowego `Wszystko działa. Uruchom swojego agenta i poproś o rolę robisie CEO.` i exit 0.
34
+
35
+ Po zmianie ponów `npx robisie doctor`. Rozwiąż też inne błędy doctor: sam licznik 1 nie wystarcza bez końcowego komunikatu sukcesu i exit 0.
36
+
37
+ Po sukcesie człowiek potwierdza nazwę i cel projektu oraz katalog instalacji, bez klucza i UUID. Przejdź do startu CEO poniżej; to nie jest odbiór karty.
38
+
39
+ ## Start CEO
40
+
41
+ Człowiek uruchamia CEO w katalogu instalacji.
42
+
43
+ Po zgodzie człowieka CEO domyślnie wywołuje `spawn_builder` z ID karty potwierdzonej w `ready`.
44
+
45
+ Przy błędzie `spawn_builder` CEO zgłasza błąd i naprawia przyczynę przed ponowieniem; nie przełącza automatycznie na ręczny start.
46
+
47
+ Ręczny start to wyłącznie jawny wybór operatora: wtedy CEO podaje polecenie do uruchomienia w nowym terminalu w katalogu instalacji.
48
+
49
+ W Claude Code CEO uruchamia niezależnego Quality Officera przez `Agent(quality-officer-client)`. Quality Officer sprawdza wynik i zapisuje recenzję oraz dowody; Builder nie recenzuje własnej pracy. CEO weryfikuje potwierdzenie recenzji (verified receipt) i wykonuje świeże odczyty karty przed przejściem do `delivered`; następnie jawny odbiór operatora w panelu pozwala przejść do `done`. Worker nie ustawia `done`. Sam `init`/`doctor` nie daje `done`.
50
+
51
+ OpenCode: karta pozostaje w `in_review` niezależnie od dostępności narzędzia Agent; brak wspieranego przejścia do `delivered`. Pełny odbiór wymaga opisanej w przewodnikach drogi Claude Code.
52
+
53
+ Codex: przejście do delivered wymaga niezależnej recenzji oraz zweryfikowanego potwierdzenia (verified receipt). Jeśli w sesji CEO brakuje narzędzia Agent, karta pozostaje w `in_review` i wymaga naprawy integracji przez CEO/CR.
54
+
55
+ Wszystkie trzy role muszą używać jednego dostawcy; mieszana mapa daje kod 1 doctor. Paczka nie uruchamia usług w tle ani nie zapewnia konta lub dostępu do AI.
56
+
57
+ Aktualizuj w katalogu instalacji: `npm i robisie@latest` → `npx robisie init` → `npx robisie doctor`. Doctor sprawdza zgodność MAJOR kontraktu serwera; przy niezgodności wybierz zgodne wydanie. Awaryjnie otrzymany plik zainstaluj przez `npm i ./robisie-0.1.0.tgz`; lokalny powrót wymaga poprzedniego zgodnego tgz i kopii konfiguracji. Pełne instrukcje aktualizacji, powrotu i odinstalowania są w przewodnikach.
58
+
59
+ ## Lokalna walidacja rejestru wykonania K7
60
+
61
+ Zapisz pełną konfigurację K2 i osobny rejestr wykonania w `robisie.config.json`:
62
+
63
+ ```json
64
+ {
65
+ "project": "uuid-projektu",
66
+ "tracks": [{"id": "uuid-toru", "name": "Tor główny"}],
67
+ "stateDir": "./stan",
68
+ "engine": {
69
+ "repo": "./repo",
70
+ "branch": "main",
71
+ "commands": {
72
+ "test": ["npm", "test"],
73
+ "lint": ["npm", "run", "lint"],
74
+ "build": ["npm", "run", "build:check"]
75
+ },
76
+ "requiredChecks": ["test", "lint"],
77
+ "delivery": "pr"
78
+ },
79
+ "roleRegistry": {
80
+ "worker-client": {"name":"Ola","provider":"codex","model":"gpt-6.1-sol","effort":"high"},
81
+ "lead-client": {"name":"Leon","provider":"claude","model":"opus","effort":"medium"},
82
+ "reviewer-client": {"name":"Iga","provider":"opencode","model":"opencode-go/gpt-6-luna","effort":"low"},
83
+ "tester-client": {"name":"Jan","provider":"grok","model":"grok-cli","effort":"none"}
84
+ }
85
+ }
86
+ ```
87
+
88
+ Uruchom `npx robisie doctor --engine-config ./robisie.config.json` (także `--engine-config=./robisie.config.json`). Ścieżka pliku jest względem bieżącego katalogu, a `repo` i `stateDir` względem pliku konfiguracji. Role K2 `coordinator/owner/planner/advisor` zachowują domyślne nazwy; opcjonalne pole `roles` służy ich nazwom i odmianie, osobno od `roleRegistry`.
89
+
90
+ Kod 0 oznacza poprawną konfigurację K2 i dokładnie cztery kompletne przypisania K7; raport pokazuje rolę → imię / dostawcę / model / wysiłek. Kod 1 wskazuje plik, błędne pole (jeśli dotyczy) i następny krok. Ten tryb działa offline, bez klucza, uruchamiania dostawców, wykonywania komend silnika ani zapisu plików. Raport jawnie stwierdza: „sprawdzono konfigurację; nie sprawdzono uruchomienia dostawców”. Zwykły `doctor` zachowuje dotychczasową diagnozę instalacji.
91
+
92
+ Modele i wysiłki to przykładowe, dosłowne etykiety, bez gwarancji dostępności lub obsługi przez CLI. `grok-cli`/`none` opisują obecny review-job; nie dowodzą sterowania modelem ani wysiłkiem Groka. Imię jest metadanymi rejestru; Execution v1 zachowuje `{contractVersion:1,provider,model,effort}`. Walidacja nie jest odbiorem wykonania karty, dostawców ani całego P-18/K3.
@@ -0,0 +1,58 @@
1
+ export type CardLike = {
2
+ detailsReadError?: string | null;
3
+ id: string;
4
+ title: string;
5
+ trackId?: string | null;
6
+ status?: string | null;
7
+ assignee?: string | null;
8
+ details?: Record<string, unknown> | null;
9
+ };
10
+ export declare const ACTIVE_RECOVERY_DETAILS_KEYS: readonly ["maszynista", "review", "reksio_withheld"];
11
+ export type Active = {
12
+ taskId: string;
13
+ title: string;
14
+ trackId: string | null;
15
+ jobId: string;
16
+ worktree: string;
17
+ branch: string;
18
+ startedAt: string;
19
+ attempts: number;
20
+ backend?: "claude" | "codex" | "grok-cli" | "opencode";
21
+ model?: string;
22
+ opencode?: Readonly<{
23
+ pid: number;
24
+ pidPath: string;
25
+ promptPath: string;
26
+ stdoutPath: string;
27
+ stderrPath: string;
28
+ exitPath: string;
29
+ startedAt: string;
30
+ jobId: string;
31
+ model: string;
32
+ provider: "opencode-go";
33
+ sessionId: string | null;
34
+ messageId: string | null;
35
+ }>;
36
+ };
37
+ export declare function reconcileActive(input: {
38
+ stateActives: Active[];
39
+ boardCards: CardLike[];
40
+ assignee: string;
41
+ nowIso: string;
42
+ }): {
43
+ actives: Active[];
44
+ releases: Array<{
45
+ taskId: string;
46
+ status: "ready";
47
+ assignee: null;
48
+ }>;
49
+ adopted: Array<{
50
+ active: Active;
51
+ stamp: Record<string, unknown>;
52
+ orphan?: CardLike;
53
+ }>;
54
+ skipped?: Array<{
55
+ card: CardLike;
56
+ reason: string;
57
+ }>;
58
+ };
@@ -0,0 +1,143 @@
1
+ export const ACTIVE_RECOVERY_DETAILS_KEYS = ["maszynista", "review", "reksio_withheld"];
2
+ function record(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ function asRecord(value) {
6
+ return record(value) ? value : {};
7
+ }
8
+ function positiveInteger(value) {
9
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
10
+ }
11
+ function nonempty(value) {
12
+ return typeof value === "string" && value.trim().length > 0;
13
+ }
14
+ function timestamp(value) {
15
+ return nonempty(value) && Number.isFinite(Date.parse(value));
16
+ }
17
+ export function reconcileActive(input) {
18
+ const previous = new Map(input.stateActives.map((active) => [active.taskId, active]));
19
+ const actives = [];
20
+ const releases = [];
21
+ const adopted = [];
22
+ const skipped = [];
23
+ const takeState = (card, fromState, worker) => {
24
+ const active = {
25
+ ...fromState,
26
+ title: card.title,
27
+ trackId: nonempty(card.trackId) ? card.trackId : null,
28
+ };
29
+ const meta = record(worker) ? worker : {};
30
+ const stamp = {
31
+ branchLease: meta.branchLease ?? null,
32
+ at: fromState.startedAt,
33
+ jobId: fromState.jobId,
34
+ worktree: fromState.worktree,
35
+ branch: fromState.branch,
36
+ attempts: fromState.attempts,
37
+ outcome: "dispatched",
38
+ };
39
+ if ("engine" in meta)
40
+ stamp.engine = meta.engine;
41
+ if (fromState.backend)
42
+ stamp.backend = fromState.backend;
43
+ if (fromState.model)
44
+ stamp.model = fromState.model;
45
+ if (fromState.opencode)
46
+ stamp.opencode = fromState.opencode;
47
+ actives.push(active);
48
+ adopted.push({ active, stamp });
49
+ };
50
+ for (const card of input.boardCards) {
51
+ const orphan = card.status === "in_review" && card.assignee == null && !previous.has(card.id);
52
+ if (card.assignee !== input.assignee && !orphan)
53
+ continue;
54
+ if (orphan) {
55
+ const worker = asRecord(card.details?.maszynista);
56
+ if (card.detailsReadError || card.details?.reksio_withheld === true
57
+ || worker.processStart != null)
58
+ continue;
59
+ if (worker.outcome === "ACTIONABLE_BLOCKER") {
60
+ skipped.push({ card, reason: "outcome=ACTIONABLE_BLOCKER — powrót przez blocked/ready" });
61
+ continue;
62
+ }
63
+ if (!["review", "landing"].includes(String(worker.phase))
64
+ || (worker.outcome !== "WORKER_FINISHED" && asRecord(card.details?.review).verdict !== "PASS"))
65
+ continue;
66
+ if (![worker.jobId, worker.worktree, worker.branch].every(nonempty) || !positiveInteger(worker.attempts)) {
67
+ skipped.push({ card, reason: "niepełne dane Workera (jobId, worktree, branch, attempts)" });
68
+ continue;
69
+ }
70
+ }
71
+ if (card.detailsReadError) {
72
+ const known = previous.get(card.id);
73
+ if (known)
74
+ actives.push(known);
75
+ continue; // No release/restamp can be justified without readable process identity.
76
+ }
77
+ const details = card.details ?? {};
78
+ const worker = details.maszynista;
79
+ const activeStatus = card.status === "in_progress"
80
+ || (card.status === "in_review" && record(worker) && ["review", "landing"].includes(String(worker.phase)));
81
+ if (!activeStatus)
82
+ continue;
83
+ const fromState = previous.get(card.id);
84
+ const cardJobId = record(worker) && nonempty(worker.jobId) ? worker.jobId : null;
85
+ // State wins: no jobId; different jobId without valid `at`; different jobId with older/equal `at`.
86
+ // Same jobId → card wins. Different jobId with strictly newer valid `at` → card wins. Attempts unused.
87
+ if (fromState && !cardJobId) {
88
+ takeState(card, fromState, worker);
89
+ continue;
90
+ }
91
+ if (fromState && cardJobId && cardJobId !== fromState.jobId) {
92
+ const cardAt = record(worker) ? worker.at : undefined;
93
+ const cardNewer = timestamp(cardAt) && Date.parse(cardAt) > Date.parse(fromState.startedAt);
94
+ if (!cardNewer) {
95
+ takeState(card, fromState, worker);
96
+ continue;
97
+ }
98
+ }
99
+ if (!record(worker) || !cardJobId) {
100
+ releases.push({ taskId: card.id, status: "ready", assignee: null });
101
+ continue;
102
+ }
103
+ const attempts = worker.attempts ?? worker.attempt;
104
+ // A known job must not be released and dispatched twice just because metadata is incomplete.
105
+ if (!nonempty(worker.worktree) || !nonempty(worker.branch) || !positiveInteger(attempts)) {
106
+ throw new Error(`Niepełne dane workera na karcie ${card.id}`);
107
+ }
108
+ if (worker.backend !== undefined && worker.backend !== "codex" && worker.backend !== "opencode") {
109
+ if (orphan) {
110
+ skipped.push({ card, reason: "nieobsługiwany backend Workera" });
111
+ continue;
112
+ }
113
+ throw new Error(`Nieobsługiwany backend workera na karcie ${card.id}`);
114
+ }
115
+ if ((worker.opencode !== undefined && worker.backend !== "opencode")
116
+ || (worker.backend === "opencode" && (!record(worker.opencode)
117
+ || !positiveInteger(worker.opencode.pid) || !nonempty(worker.model)
118
+ || ![worker.opencode.pidPath, worker.opencode.promptPath, worker.opencode.stdoutPath,
119
+ worker.opencode.stderrPath, worker.opencode.exitPath,
120
+ worker.opencode.jobId, worker.opencode.model].every(nonempty)
121
+ || worker.opencode.jobId !== cardJobId || worker.opencode.model !== worker.model
122
+ || worker.opencode.provider !== "opencode-go"))) {
123
+ if (orphan) {
124
+ skipped.push({ card, reason: "niepełna tożsamość OpenCode" });
125
+ continue;
126
+ }
127
+ throw new Error(`Niepełna tożsamość OpenCode na karcie ${card.id}`);
128
+ }
129
+ const old = previous.get(card.id);
130
+ const active = {
131
+ taskId: card.id, title: card.title, trackId: nonempty(card.trackId) ? card.trackId : null,
132
+ jobId: cardJobId, worktree: worker.worktree, branch: worker.branch, attempts,
133
+ startedAt: timestamp(worker.at) ? worker.at : old?.startedAt ?? input.nowIso,
134
+ ...(worker.backend === "opencode" || worker.backend === "codex" ? { backend: worker.backend } : {}),
135
+ ...(nonempty(worker.model) ? { model: worker.model } : {}),
136
+ ...(record(worker.opencode) ? { opencode: worker.opencode } : {}),
137
+ };
138
+ actives.push(active);
139
+ if (orphan)
140
+ adopted.push({ active, stamp: worker, orphan: card });
141
+ }
142
+ return { actives, releases, adopted, ...(skipped.length ? { skipped } : {}) };
143
+ }
@@ -0,0 +1,34 @@
1
+ import { type Ctx } from "./context.js";
2
+ import { type Op } from "./fsops.js";
3
+ import { type Role } from "./roles.js";
4
+ export declare const AGENT_IDS: readonly ["claude", "codex", "opencode"];
5
+ export type AgentId = (typeof AGENT_IDS)[number];
6
+ export declare const AGENT_LABELS: Record<AgentId, string>;
7
+ export declare function isAgentId(value: string): value is AgentId;
8
+ /** Where each agent keeps its user-level configuration (the same places the agents themselves read). */
9
+ export declare function agentPaths(ctx: Ctx): {
10
+ clientDir: string;
11
+ claudeDir: string;
12
+ claudeJson: string;
13
+ codexHome: string;
14
+ codexConfig: string;
15
+ codexAgentsMd: string;
16
+ opencodeDir: string;
17
+ opencodeJson: string;
18
+ opencodeJsonc: string;
19
+ };
20
+ export declare function agentOnPath(ctx: Ctx, id: AgentId): boolean;
21
+ /** Detection reads only the filesystem (config dir present, or binary on PATH) — nothing is executed. */
22
+ export declare function detectAgents(ctx: Ctx): AgentId[];
23
+ /** Keep a multiline string or array in its assignment, so its contents cannot look like server headers. */
24
+ export declare function tomlStatements(text: string): string[];
25
+ /**
26
+ * Take over an `[mcp_servers.robisie]` table written earlier by hand or by `codex mcp add` (otherwise
27
+ * Codex would see the table twice and refuse the whole config). Backups retain the old configuration.
28
+ */
29
+ export declare function removeCodexTables(text: string, removeInline?: boolean, codexHome?: string): string;
30
+ /** Every file change `init` makes for one agent. */
31
+ export declare function planAgent(ctx: Ctx, id: AgentId, roles: readonly Role[], key: string): Op[];
32
+ /** Shell profile line that exports ROBISIE_KEY from the package's key file (roles and Codex/OpenCode read it). */
33
+ export declare function shellProfile(ctx: Ctx): string | null;
34
+ export declare const SHELL_EXPORT = "[ -r \"${XDG_CONFIG_HOME:-$HOME/.config}/robisie/key\" ] && export ROBISIE_KEY=\"$(cat \"${XDG_CONFIG_HOME:-$HOME/.config}/robisie/key\")\"";