feat(fb-26,fb-28): ingest log consistency + --readonly/--quiet flags + schema sync #113
Reference in New Issue
Block a user
Delete Branch "feat/p9-fb-26-fb-28-agent-ux"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
요약
세 독립 변경을 한 PR로 묶었습니다.
§1 CLAUDE.md wire schema 목록 정리
eval_run.v1,eval_compare.v1,list_docs.v1제거chunk_inspection.v1,citation.v1,doc_summary.v1추가§2 fb-26: ingest 로그 출력 일관성 (
progress.rs)Abortedarm의writeln!이 TTY 모드에서도 무조건 발사 →if !tty && !quiet가드 추가CompletedTTY path에서bar.finish_and_clear()후 summary 없음 →!quiet시 항상 summary writeln 추가ProgressMode::Human { tty, quiet }—quiet필드 추가from_flags(json, quiet, plain_env)—KEBAB_PROGRESS=plainenv override (CI pty wrapper 대응)§3 fb-28: agent invocation flags (
main.rs)--readonly글로벌 플래그 (KEBAB_READONLY=1env 동치):ingest,ingest-file,ingest-stdin,reset차단 → exit 1 + plain error /error.v1(json 모드)--quiet글로벌 플래그: 모든 human-readable stderr progress/hint 억제. error는 여전히 stderr.--json은 auto-quiet (기존 동작 명시화)is_mutating()헬퍼 + readonly guard block inmain()parse_bool_envvalue parser (1/true/yes/ontruthy 지원)테스트 계획
cli_readonly_quiet.rs— 8개 통합 테스트 (readonly flag/env, json error.v1, quiet suppression)ingest_progress_cli.rs—KEBAB_PROGRESS=plain동작 확인관련 태스크
tasks/p9/p9-fb-26-ingest-log-consistency.md→status: mergedtasks/p9/p9-fb-28-agent-invocation-flags.md→status: merged회차 1 — spec 전체 항목 충족, 37개 테스트 통과, Clippy 경고 없음. APPROVE.
@@ -299,1 +319,4 @@let _log_guard = kebab_app::logging::init(level).ok();if cli.readonly && is_mutating(&cli.command) {let msg = "kebab: readonly mode — mutating commands are disabled";if cli.json {[nit — pre-existing]
proceed without a guard rather than crashing — \kb` is still usable.에kb잔존. 모듈 doc comment 는 이번 PR 에서 수정됐는데 이 인라인 주석은 놓침. 다음kbsweep 때kebab` 로 정정 권장.kb→kebabin main.rs comments 0e762e6374회차 2 — 회차 1 지적 (잔여
kb참조 3건: session ID 예시, logging init 코멘트, init hint 출력) 모두 반영. 추가 actionable 지적 없음. 37개 테스트 통과, Clippy 경고 없음. APPROVE.@@ -287,1 +297,4 @@/// Parse boolean env var accepting "1", "true", "yes", "on" (case-insensitive)/// as truthy; "0", "false", "no", "off" as falsy. Used for `KEBAB_READONLY`.fn parse_bool_env(s: &str) -> Result<bool, String> {[칭찬]
parse_bool_envcustom value parser — clap 기본 bool env 처리는"true"/"false"만 허용하지만,KEBAB_READONLY=1관용을 지원하려면 이 커스텀 파서가 필요하다. 선택이 맞다.@@ -857,6 +904,13 @@ fn print_schema_text(s: &kebab_app::SchemaV1) {println!(" last_ingest_at {last}");}fn is_mutating(cmd: &Cmd) -> bool {[칭찬]
is_mutating의matches!패턴에_폴백이 없다 — 새 mutating subcommand 추가 시 컴파일 에러로 guard 업데이트를 강제한다. 안전한 설계.@@ -155,3 +161,3 @@bar.finish_and_clear();}if !tty {// Always emit summary in both TTY and non-TTY (unless quiet).[칭찬]
Completedfix —!tty제거하고!quiet로 교체한 것이 맞다. TTY/non-TTY 양쪽에서 summary 한 줄이 항상 나와야 하고, quiet 만이 억제 조건이어야 한다.[칭찬]
from_flags_quiet_sets_quiet_field+from_flags_plain_env_forces_tty_false— 두 신규 파라미터마다 각각 전용 단위 테스트를 추가한 것이 깔끔하다.@@ -0,0 +108,4 @@assert!(stderr.contains("readonly mode"), "stderr: {stderr}");}#[test][칭찬]
readonly_json_mode_emits_error_v1가schema_version과code를 분리해서 assertion 한다 — exit code 만 확인하는 것보다 wire contract 를 훨씬 단단하게 잡는다.