Commit graph

5 commits

Author SHA1 Message Date
abae256c1d feat(install): opt-in hook packs + stack profiles (public posture)
A fresh install now activates only the safety pack; discipline hooks and
agents are opt-in via an onboarding step (step 6) or `kei configure`.
"People don't need Rust-only" — they pick their own stack.

- _primitives/hook-packs.toml: SSoT mapping pack -> hooks, stack -> packs +
  agent groups. safety always on; evidence/observability/epistemic/
  orchestration/git-guard/stack-rust opt-in. rust-first/no-python only under
  the systems stack; git-guard (no-github-push) opt-in only, pulled by no stack.
- lib-profile: extract generic _toml_array (reused by lib-packs); profile_members
  becomes a thin wrapper (no behavior change).
- lib-packs: pack/stack/agent resolvers + selection loader.
- lib-hooks: filter_snippet_by_packs (install-time allowlist) + prune_kit_hooks
  (reconfigure removes deselected kit hooks, keeps foreign ones); activate_hooks
  rewired to prune + filter + merge. No custom settings.json fields (/doctor safe).
- lib-agents: install_manifests filters by stack agent set (empty = install all).
- onboarding: pick_stack step (reuse _onb_read_choice), persists stack_profile +
  enabled_packs to onboarding.toml; i18n STR_* added.
- bin/kei configure -> scripts/kei-configure.sh (re-pick without reinstall);
  install stamps ~/.claude/.kei-kit-dir.
- numeric-claims-guard: money regex no longer matches shell positionals ($1..$9);
  requires decimal / unit / 2+ digits / tilde. Real money + time still caught.
- gate one-liner added to 8 discipline hooks (runtime toggle via hooks-control).

Verified end-to-end (scratch HOME): fresh=safety only; evidence pack adds
numeric+citation; systems stack wires rust-first + 14 base/systems agents (no
data-science/swift); reconfigure-shrink prunes kit hooks but keeps a foreign
hook; settings schema clean; assembler golden 3/3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 17:27:14 +08:00
6d68a3f1ad fix(onboarding): no crash on text input, Claude Code default, explanations
Some checks are pending
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / preflight (push) Waiting to run
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / vps-smoke (push) Waiting to run
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:frustration-matrix,kei-frustration-loop,kei-skill-importer,kei-projects-index,kei-projects-watcher,kei-gdrive-import,kei-leak-matrix,kei-skills,kei-gateway,kei-cron-scheduler,kei-export-trajectories,kei-backend-daytona,kei-d… (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:kei-compute-baremetal,kei-compute-vultr,kei-compute-linode,kei-compute-digitalocean,kei-svc-systemd,kei-llm-bridge-mlx name:hosted-sleep-compute]) (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:kei-diff,kei-scheduler,kei-watch,kei-prune,kei-discover,kei-brain-view,kei-hibernate,kei-ledger-sign,kei-fork name:wave13-15]) (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:kei-git-gitea,kei-git-forgejo,kei-git-gitlab,kei-git-bitbucket,kei-memory-sled,kei-memory-redis,kei-memory-postgres,kei-memory-sqlite,kei-auth-google,kei-auth-apple,kei-auth-magiclink,kei-auth-webauthn,kei-notify-slack,kei-n… (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:kei-ledger,kei-migrate,kei-changelog,kei-memory,kei-store,kei-conflict-scan,kei-refactor-engine,kei-graph-check,kei-shared,kei-dna-index,kei-pet name:core]) (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:kei-machine-probe,kei-llm-ollama,kei-llm-llamacpp,kei-llm-mlx,kei-llm-router,kei-model name:llm-stack]) (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:kei-router,kei-sage,kei-task,kei-chat-store,kei-crossdomain,kei-search-core,kei-content-store,kei-social-store,kei-curator,kei-auth,kei-artifact name:mcp-lbm]) (push) Blocked by required conditions
CI (Forgejo Actions — self-hosted runner on Mac, host mode) / rust-primitives (map[crates:keisei,kei-forge,kei-runtime,kei-runtime-core,kei-atom-discovery,kei-agent-runtime,kei-capability,kei-provision,kei-entity-store,kei-pipe,kei-cache,kei-spawn,kei-replay name:atom-substrate]) (push) Blocked by required conditions
Three issues a real curl|bash user hit:

1. CRASH: typing a word (e.g. "claude") at any menu → $((ans-1)) treats it as a
   variable in bash arithmetic → "unbound variable" under set -u → install dies.
   Added _onb_read_choice (numeric+range validation, re-prompt) for all 4 menus.

2. No Claude under subscription: the kit installs into Claude Code yet the wizard
   offered only OpenAI Codex under subscription. Added claude-code provider
   (bumped kei-registries submodule c559065→b904993) + made subscription the
   default transport and claude-code the default provider — Enter,Enter,Enter
   lands on Claude Code (no API key).

3. install died at line 178 for any no-key provider (claude-code/codex/local):
   onboarding_run ended on a `&&` that is false when there are no auth keys →
   returned 1 → set -e aborted. Added explicit `return 0`.

Plus per-step explanations (en+ru) and auto-select when a step has one option.
Verified piped-under-pty: Enter-defaults → Claude Code, junk input → re-prompt
(0 crashes), full install completes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:42:50 +08:00
Parfii-bot
33f1376ee1 feat(i18n): расширил язык-набор с 2 до 16
Новые словари:
  uk    Українська
  de    Deutsch
  fr    Français
  es    Español
  pt    Português
  it    Italiano
  tr    Türkçe
  ar    العربية
  hi    हिन्दी
  zh    简体中文
  ja    日本語
  ko    한국어
  id    Bahasa Indonesia
  vi    Tiếng Việt

Каждый файл — 17 STR_* ключей (тот же контракт что en.sh + ru.sh).
lib-i18n.sh::i18n_available_languages — единый список (en + 15)
для меню выбора в мастере. i18n_load_lang упрощён: всегда грузит
английский как fallback, потом поверх — словарь языка (отсутствующий
ключ остаётся английским).

onboarding_pick_language теперь генерирует whiptail/bash select из
i18n_available_languages динамически — добавление нового языка =
один файл `install/i18n/<код>.sh` + одна строка в available_languages,
дальше всё подхватится автоматически.

Перевод формальный, без излишеств. Welcome баннер всегда EN (юзер
ещё не выбрал на момент показа).

Проверено: bash -n всех 16 словарей чисто, roundtrip всех языков
работает (i18n_load_lang en/ru/uk/de/fr/es/pt/it/tr/ar/hi/zh/ja/ko/id/vi
выдают локализованные STR_DONE_TITLE + STR_TR_DIRECT_API), non-TTY
smoke install --no-execute проходит.
2026-05-17 16:51:44 +08:00
Parfii-bot
305140f20b fix(install): close MEDIUM/LOW from RULE 0.26 audit
- preflight failure handling: вместо `|| true` (молчаливое продолжение
  при упавшем preflight) — явный prompt «продолжить? [y/N]» с return 1
  при отказе. Без TTY печатает warning и продолжает. Это закрывает
  HIGH bug-9: «.onboarded флаг выставляется при нерабочей конфигурации».

- lib-preflight.sh::preflight_check_cli — общий helper (command -v +
  offer-install + version echo). Убирает 6-file boilerplate (хотя сами
  per-provider файлы пока не переписаны под него — это отдельный шаг).

- onboarding_fallback_providers: расширен с 3 до 14 провайдеров,
  покрывает все 7 транспортов. Был дрейф vs providers.toml (14 vs 3),
  юзер без submodule видел только anthropic+openai+ollama.

- STR_PICK_PROVIDER plural mismatch: whiptail и plain ветки теперь
  используют один fallback "Provider within" (раньше plain имел
  "Providers within", whiptail — "Provider within").

- STR_DONE_NEXT удалён из en.sh + ru.sh (мёртвый ключ).

- Новые ключи: STR_MENU_* (для lib-menu.sh) + STR_PREFLIGHT_FAILED +
  STR_PREFLIGHT_CONTINUE. lib-menu.sh начал использовать
  STR_MENU_TITLE / STR_MENU_SUBSTRATE (частичная локализация, остальное
  меню — отдельной задачей).

Тесты: bash -n чисто, i18n round-trip EN/RU работает, non-TTY smoke
install --no-execute проходит.
2026-05-17 16:37:28 +08:00
Parfii-bot
ab260f429e feat(install): i18n модуль + welcome banner
Структура локализации:
  install/i18n/en.sh    — английский словарь (дефолт, fallback)
  install/i18n/ru.sh    — русский словарь
  install/lib-i18n.sh   — лоадер + welcome banner

Поток:
  1. install.sh source'ит lib-i18n.sh и зовёт i18n_load_default →
     все строки на английском.
  2. Если onboarding нужен — печатается welcome banner ASCII-рамка
     на английском (язык ещё не выбран).
  3. onboarding_pick_language — единственный двуязычный шаг
     ("Choose language / Выберите язык"). По выбору вызывает
     i18n_load_lang ru|en — перегружает словарь.
  4. Все последующие шаги (transport / provider / model / auth /
     completion) идут на выбранном языке.

Fallback: если ru-словарь не имеет ключа — используется английское
значение (load_default вызывается до загрузки ru.sh, переменные
перезаписываются поверх).

lib-onboarding.sh переведён со смешанных hardcoded строк на
${STR_*} placeholders.

Тесты: bash -n всех 5 файлов чисто, i18n loader unit-тест показывает
EN/RU перегрузку, non-TTY smoke install --no-execute проходит.
2026-05-17 15:35:10 +08:00