feat(p10-1a-2): add MediaType::Code(lang) variant

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) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 17:14:45 +00:00
parent 42712b50c2
commit 7a6a24ad10
5 changed files with 24 additions and 1 deletions

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
.superpowers/
.worktrees/
.claude/
/target
/target/
**/*.rs.bk
Cargo.lock.bak

View File

@@ -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");
}

View File

@@ -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,

View File

@@ -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);
}
}

View File

@@ -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),
}