From 7a6a24ad1026d61107ddbfc4aba94e76b34e7e5c Mon Sep 17 00:00:00 2001 From: altair823 Date: Tue, 19 May 2026 17:14:45 +0000 Subject: [PATCH] feat(p10-1a-2): add MediaType::Code(lang) variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TDD: red → green cycle confirmed. New `Code(String)` variant serializes as `{"code":"rust"}` via serde `rename_all = "lowercase"`. All exhaustive `match` sites updated (`media_label`, `ingest_one_asset` catch-all → explicit or-pattern). Design §3.5 enum listing synced. Also fix `/target` symlink gitignore pattern so integration-test binary lookup via workspace-relative path works with CARGO_TARGET_DIR redirect. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 1 + crates/kebab-app/src/ingest_progress.rs | 2 ++ crates/kebab-app/src/lib.rs | 3 ++- crates/kebab-core/src/media.rs | 18 ++++++++++++++++++ .../2026-04-27-kebab-final-form-design.md | 1 + 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 76a3d1e..8c015e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .superpowers/ .worktrees/ .claude/ +/target /target/ **/*.rs.bk Cargo.lock.bak diff --git a/crates/kebab-app/src/ingest_progress.rs b/crates/kebab-app/src/ingest_progress.rs index ef1df15..b3255f6 100644 --- a/crates/kebab-app/src/ingest_progress.rs +++ b/crates/kebab-app/src/ingest_progress.rs @@ -96,6 +96,7 @@ pub fn media_label(media: &kebab_core::MediaType) -> &'static str { kebab_core::MediaType::Pdf => "pdf", kebab_core::MediaType::Image(_) => "image", kebab_core::MediaType::Audio(_) => "audio", + kebab_core::MediaType::Code(_) => "code", kebab_core::MediaType::Other(_) => "other", } } @@ -148,6 +149,7 @@ mod tests { media_label(&MediaType::Audio(kebab_core::AudioType::Wav)), "audio" ); + assert_eq!(media_label(&MediaType::Code("rust".into())), "code"); assert_eq!(media_label(&MediaType::Other("x".into())), "other"); } diff --git a/crates/kebab-app/src/lib.rs b/crates/kebab-app/src/lib.rs index e0a0375..850672d 100644 --- a/crates/kebab-app/src/lib.rs +++ b/crates/kebab-app/src/lib.rs @@ -917,7 +917,8 @@ fn ingest_one_asset( force_reingest, ); } - _ => { + // p10-1A-2: Code dispatch wired in Task 8; skip until then. + MediaType::Code(_) | MediaType::Audio(_) | MediaType::Other(_) => { return Ok(kebab_core::IngestItem { kind: kebab_core::IngestItemKind::Skipped, doc_id: None, diff --git a/crates/kebab-core/src/media.rs b/crates/kebab-core/src/media.rs index 263e5cf..557bf0c 100644 --- a/crates/kebab-core/src/media.rs +++ b/crates/kebab-core/src/media.rs @@ -40,5 +40,23 @@ pub enum MediaType { Pdf, Image(ImageType), Audio(AudioType), + /// p10-1A-2: a source-code file. Inner string is the canonical + /// code_lang (design §3.5). 1A activates `"rust"` only; other + /// recognized code langs are still routed `Other` until their phase. + Code(String), Other(String), } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn media_type_code_serializes_lowercase_tagged() { + let m = MediaType::Code("rust".to_string()); + let v = serde_json::to_value(&m).unwrap(); + assert_eq!(v, serde_json::json!({ "code": "rust" })); + let back: MediaType = serde_json::from_value(v).unwrap(); + assert_eq!(back, m); + } +} diff --git a/docs/superpowers/specs/2026-04-27-kebab-final-form-design.md b/docs/superpowers/specs/2026-04-27-kebab-final-form-design.md index baa349b..8d970b9 100644 --- a/docs/superpowers/specs/2026-04-27-kebab-final-form-design.md +++ b/docs/superpowers/specs/2026-04-27-kebab-final-form-design.md @@ -488,6 +488,7 @@ pub enum MediaType { Pdf, Image(ImageType), Audio(AudioType), + Code(String), // p10-1A-2: source-code file; inner = canonical code_lang (e.g. "rust") Other(String), }